<?xml version="1.0" encoding="UTF-8"?>
<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>2010-03-11T14:18:10-08:00</updated>
    <id>http://blog.superfeedr.com/</id>
    
    
    <entry>
        <title>Chasing Real-Time Raindrops in an Ocean of Content</title>
        
        <category term="realtime" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="search" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="web" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/realtime/search/web/chasing-real-time-raindrops-in-an-ocean-of-content"/>
        <published>2010-03-11T00:00:00-08:00</published>
        <updated>2010-03-11T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/realtime/search/web/chasing-real-time-raindrops-in-an-ocean-of-content</id>
        <content type="html">&lt;p&gt;&lt;em&gt;The web is huge. And growing. Faster everyday&lt;/em&gt;. It&amp;#8217;s almost like an ocean where there would be no evaporation (the data on the web stays there virtually forever), but yet, it&amp;#8217;s always raining in it. The rain is the new content that&amp;#8217;s added into the ocean. &lt;strong&gt;Every tweet is a drop&lt;/strong&gt;, every blog post is a drop, every checkin is a drop &lt;strong&gt;that falls into the Ocean&lt;/strong&gt;. This ocean is almost constantly under a tropical storm in some places, like &lt;a href=&quot;http://twitter.com/&quot;&gt;Twitter&lt;/a&gt; or &lt;a href=&quot;http://www.facebook.com/&quot;&gt;Facebook&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://rww.superfeedr.com/images/hubs/rww.png&quot; style=&quot;width: 40%; float:left; ;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I&amp;#8217;ve been invited by &lt;a href=&quot;http://marshallk.com/&quot;&gt;Marshall Kirkpatrick&lt;/a&gt; to write a guest post on &lt;a href=&quot;http://www.readwriteweb.com/&quot;&gt;ReadWriteWeb&lt;/a&gt; about the fact that Google will soon include PubSubHubbub data in its search engine. I hope you can &lt;a href=&quot;http://www.readwriteweb.com/archives/chasing_real-time_raindrops_in_an_ocean_of_content.php&quot;&gt;read it and leave some comments there&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Ping me I'm famous</title>
        
        <category term="ping" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="api" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="infrastructure" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="realtime" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/api/infrastructure/ping/realtime/ping-me-i-m-famous"/>
        <published>2010-03-05T00:00:00-08:00</published>
        <updated>2010-03-05T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/api/infrastructure/ping/realtime/ping-me-i-m-famous</id>
        <content type="html">&lt;p&gt;Ping is both the &lt;strong&gt;ancestor&lt;/strong&gt; and the &lt;em&gt;root&lt;/em&gt; of any realtime feed protocol. A ping is a way to say : &amp;#8220;&lt;em&gt;hey this content was updated&lt;/em&gt;&amp;#8221;. It can be light, which means the this gives a link to the content, or &lt;a href=&quot;http://techcrunch.com/2009/09/09/rsscloud-vs-pubsubhubbub-why-the-fat-pings-win/&quot;&gt;fat&lt;/a&gt;, when the ping actually contains the content.&lt;/p&gt;
&lt;p&gt;As always with the internets, there are many ways to do that same thing. A pretty famous one is &lt;a href=&quot;http://www.xmlrpc.com/weblogsCom&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;RPC&lt;/span&gt;&lt;/a&gt;. &lt;a href=&quot;http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.3.html#anchor9&quot;&gt;PubsubHubbub&lt;/a&gt; has its own way of taking them into account too, RSSCloud as well&amp;#8230; etc. &lt;strong&gt;They all work with Superfeedr&lt;/strong&gt;, as we have implemented them all :).&lt;br /&gt;
By the way, if you want to start pinging us when you update your content, and if you already ping services like &lt;a href=&quot;http://pingomatic.com/&quot;&gt;Pingomatic&lt;/a&gt;, &lt;a href=&quot;http://technorati.com/&quot;&gt;Technorati&lt;/a&gt; or &lt;a href=&quot;http://blogsearch.google.com/&quot;&gt;Google Blog search&lt;/a&gt;, you can also add &lt;strong&gt;&lt;a href=&quot;http://ping.superfeedr.com/rpc&quot;&gt;http://ping.superfeedr.com/rpc&lt;/a&gt;&lt;/strong&gt; to the list of services to ping.&lt;/p&gt;
&lt;h3&gt;Building a Ping Cache.&lt;/h3&gt;
&lt;p&gt;Most of ping protocols are actually &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; Post requests&lt;/strong&gt; sent to a url. That&amp;#8217;s pretty easy to implement. Once we get a ping, we either &lt;em&gt;extract the right params, or parse the &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt; body&lt;/em&gt;. That&amp;#8217;s what&amp;#8217;s after which is interesting!&lt;/p&gt;
&lt;p&gt;Remember, pings can sometimes concern a feed url, but they can also concern a &lt;strong&gt;regular web page&lt;/strong&gt;. Lucky for us, these pages often hold a feed, so we can consider that if we get a ping for a given page, we can consider that the feed itself as been updated. As a matter of fact, we use &lt;a href=&quot;http://code.google.com/p/redis/&quot;&gt;Redis&lt;/a&gt; (&lt;a href=&quot;http://blog.superfeedr.com/datastore/memcache/mysql/performance/redis/redis-at-superfeedr/&quot;&gt;again&lt;/a&gt;!) to store a massive dictionary like this :&lt;/p&gt;
&lt;p&gt;&lt;code&gt;url1 =&amp;gt; [feed_id1, feed_id2], url2 =&amp;gt; [feed_id3], url3 =&amp;gt; [feed_id1, feed_id2]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Each url might have &lt;strong&gt;several feeds associated&lt;/strong&gt;, so we use an &lt;strong&gt;set&lt;/strong&gt;. So far this is quite common. To be even more efficient, for each feed that we monitor, we fetch all the related &amp;#8220;alternate&amp;#8221; urls, and their &amp;#8220;alternate&amp;#8221; urls. What&amp;#8217;s the purpose of that? &lt;strong&gt;Identifying clusters of urls that are updated at the same time.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s take an example :&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s say a user is monitoring this feed &lt;a href=&quot;http://superfeedr.typepad.com/blog/atom.xml&quot;&gt;http://superfeedr.typepad.com/blog/atom.xml&lt;/a&gt;. In our system it has an unique id of &lt;code&gt;123&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When we fetch this feed, to build the Redis-based ping cache, we see that it links (with &lt;code&gt;rel=&quot;alternate&quot;&lt;/code&gt;) to &lt;a href=&quot;http://superfeedr.typepad.com/&quot;&gt;http://superfeedr.typepad.com/&lt;/a&gt;. Hence, we&amp;#8217;ll map both &lt;code&gt;.../atom.xml&lt;/code&gt; and &lt;code&gt;http://superfeedr.typepad.com/&lt;/code&gt; to the &lt;code&gt;123&lt;/code&gt; in our cache, so that if we receive a ping for &lt;code&gt;http://superfeedr.typepad.com/&lt;/code&gt; we&amp;#8217;ll assume that the feed&amp;#8217;s content has been updated. We also fetch &lt;code&gt;http://superfeedr.typepad.com/&lt;/code&gt;, and this time, we see that it contains links (again, with &lt;code&gt;rel=&quot;alternate&quot;&lt;/code&gt;) to :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;http://superfeedr.typepad.com/blog/atom.xml&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;http://superfeedr.typepad.com/blog/index.rdf&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;http://superfeedr.typepad.com/blog/rss.xml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Similarly, we can now add to our cache the 2 extra feeds. As soon as we get a ping for any url, we will then assume that all of them have been updated!&lt;/p&gt;
&lt;h3&gt;Fetching the feed.&lt;/h3&gt;
&lt;p&gt;We have a &lt;strong&gt;complex scheduling mechanism&lt;/strong&gt;. Contrary to the &lt;a href=&quot;http://pubsubhubbub.appspot.com/&quot;&gt;Google Demo hub&lt;/a&gt;, &lt;a href=&quot;http://superfeedr.com/&quot;&gt;Superfeedr&lt;/a&gt; has an &lt;em&gt;aggressive polling strategy&lt;/em&gt; for which we roughly poll any feed we have under 15 minutes. This amount of feed does that &lt;em&gt;at every single second we have several thousands of feeds to fetch&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Our scheduling algorithm works in a &lt;strong&gt;non-deterministic way&lt;/strong&gt; : it picks feeds that &lt;del&gt;will soon&lt;/del&gt; need to be fetched, but on a random order. Obviously we can&amp;#8217;t treat pings (for which the chance of update is hight) the same way as feeds that are just scheduled to be fetched (for which the chance of new entry is low).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.rabbitmq.com/img/rabbitmqlogonostrap.png&quot; style=&quot;float:right; margin: 10px;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;For the pings, we use a &lt;strong&gt;deterministic system&lt;/strong&gt;: a queue system where &lt;em&gt;what goes in first, goes out first&lt;/em&gt;. Each of our dispatcher, are subscribed to the queue, and as soon as they get a message from it, they push it to some parsers. For the queue, we use &lt;a href=&quot;http://www.rabbitmq.com/&quot;&gt;RabbitMQ&lt;/a&gt;, and the excellent &lt;a href=&quot;http://github.com/tmm1/amqp&quot;&gt;&lt;span class=&quot;caps&quot;&gt;AMQP&lt;/span&gt; EventMachine&lt;/a&gt; library does an awesome job :)&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s funny to see that our dispatchers are now &lt;strong&gt;multi-modal components&lt;/strong&gt;: they are &lt;a href=&quot;http://xmpp.org/extensions/xep-0114.html&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; Components&lt;/a&gt;, send all of our &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; notifications, and get messages from an &lt;span class=&quot;caps&quot;&gt;AMQP&lt;/span&gt; queue. Each protocol is used at what it is best :)&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>A Hub for Twitter</title>
        
        <category term="PubSubHubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Twitter" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="API" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="feeds" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="streaming" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/API/PubSubHubbub/Twitter/feeds/streaming/a-hub-for-twitter"/>
        <published>2010-03-03T00:00:00-08:00</published>
        <updated>2010-03-03T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/API/PubSubHubbub/Twitter/feeds/streaming/a-hub-for-twitter</id>
        <content type="html">&lt;p&gt;If you claim to be some kind of social app but don&amp;#8217;t use &lt;strong&gt;PubSubHubbub&lt;/strong&gt;, I think you&amp;#8217;re missing out the opportunity to support a &lt;strong&gt;de-facto standard for service to service communication&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;On the other hand, if you&amp;#8217;re a &lt;strong&gt;realtime feed standard&lt;/strong&gt; that is not used by &lt;a href=&quot;http://twitter.com/&quot;&gt;Twitter&lt;/a&gt;, &lt;em&gt;you&amp;#8217;re also missing something&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Based on these simple facts, I think Twitter needs to have a &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;PubSubHubbub&lt;/a&gt; hub. They recently announced that more and more apps are &lt;a href=&quot;http://blog.twitter.com/2010/03/enabling-rush-of-innovation.html&quot;&gt;getting their firehose&lt;/a&gt;, this is great and shows us that &lt;strong&gt;they want their data out&lt;/strong&gt; (hey, &lt;a href=&quot;http://facebook.com/&quot;&gt;Facebook&lt;/a&gt;, did you hear that?). However, a few conversations with both &lt;a href=&quot;http://twitter.com/jkalucki&quot;&gt;John&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/Rsarver&quot;&gt;Ryan&lt;/a&gt; showed me that they weren&amp;#8217;t so keen of doing so. &lt;strong&gt;Sad&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To prove them wrong, we started a &lt;a href=&quot;http://bit.ly/hub4twitter&quot;&gt;little poll 2 days ago&lt;/a&gt;. The goal was to show Twitter that people would use this hub, and that, with it, the consumption of Twitter data will eventually grow over time.&lt;/p&gt;
&lt;p&gt;Here are the results (obviously, it&amp;#8217;s never too late to answer) :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://chart.apis.google.com/chart?cht=p&amp;amp;chs=230x100&amp;amp;chco=ff9900&amp;amp;chl=Yes%20%5B45%5D%7CNo%20%5B2%5D&amp;amp;chd=e%3A9QCu&quot; style=&quot;float:right;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Would you use a Twitter PubSubHubbub hub if it was available?&lt;br /&gt;
Yes		45	96%&lt;br /&gt;
No		2	4%&lt;/h4&gt;
&lt;p&gt;I think this is the most important question here :) One could argue that the people who responded are also more tempted to say they would use it, than not. A legit question that somebody raised is that it would probably not work behind the firewall. I agree with that, but &lt;em&gt;I also think that most apps who are behind firewalls use the regular &lt;span class=&quot;caps&quot;&gt;REST&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://chart.apis.google.com/chart?cht=p&amp;amp;chs=230x100&amp;amp;chco=0000e0&amp;amp;chl=Yes%20%5B21%5D%7CNo%20%5B26%5D&amp;amp;chd=e%3AcljZ&quot; style=&quot;float:right;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Do you currently use the Twitter Streaming &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;?&lt;br /&gt;
Yes		21	45%&lt;br /&gt;
No		26	55%&lt;/h4&gt;
&lt;p&gt;This is interesting to compare with the previous question. &lt;strong&gt;Almost everybody said they would use a PubSubHubbub hub, but less than half currently use the streaming &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/strong&gt;. This means that the streaming &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; is not fulfilling their needs, while a hub would.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://chart.apis.google.com/chart?cht=p&amp;amp;chs=230x100&amp;amp;chco=dcca02&amp;amp;chl=Yes%20%5B45%5D%7CNo%20%5B2%5D&amp;amp;chd=e%3A9QCu&quot; style=&quot;float:right;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Do you think a hub would increase your Twitter data consumption?&lt;br /&gt;
Yes		45	96%&lt;br /&gt;
No		2	4%&lt;/h4&gt;
&lt;p&gt;Again, that, I think, proves that a hub would be better suited for the data consumption for many applications. Also, I think that Twitter genuinely wants the data to &amp;#8220;get out&amp;#8221;. This proves that &lt;em&gt;this goal would be achieved&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://chart.apis.google.com/chart?cht=p&amp;amp;chs=230x100&amp;amp;chco=00d000&amp;amp;chl=Yes%20%5B30%5D%7CNo%20%5B17%5D&amp;amp;chd=e%3Ao1XJ&quot; style=&quot;float:right;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Have you already implemented PubSubHubbub?&lt;br /&gt;
Yes		30	64%&lt;br /&gt;
No		17	36%&lt;/h4&gt;
&lt;p&gt;A key concern when &lt;em&gt;implementing an &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; is the speed of adoption&lt;/em&gt;. The streaming &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; has been out for a few months, but is still not so widely used, if Twitter had a hub, a lot of people would be able to start using it from day 1, because they already implemented the protocol on their ends.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://chart.apis.google.com/chart?cht=bhs&amp;amp;chs=345x90&amp;amp;chbh=24%2C6&amp;amp;chco=df5353%7Cd00000&amp;amp;chxt=x%2Cy&amp;amp;chxl=0%3A%7C0%7C8%7C16%7C24%7C32%7C40%7C48%7C1%3A%7CTrack%20(search%20feeds)%7CFollow%20(user%20feeds)&amp;amp;chxs=0%2C000000%2C12%2C0%2Clt%7C1%2C000000%2C12%2C1%2Clt&amp;amp;chds=0%2C48&amp;amp;chd=t%3A42%2C39&quot; style=&quot;float:right;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I &lt;strong&gt;will send the detail results to both John and Ryan&lt;/strong&gt;, as well as the list of people who responded (in a &lt;span class=&quot;caps&quot;&gt;BCC&lt;/span&gt; email), so anybody can start the conversation from there.&lt;/p&gt;
&lt;p&gt;Twitter will make the decision on whether they want to support that or not. It&amp;#8217;s obvious that if they do, I&amp;#8217;d rather see that happen via a &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;Superfeedr hub&lt;/a&gt;. However, I think it&amp;#8217;s still great for &lt;strong&gt;PubSubHubbub&lt;/strong&gt; and the internets in general if Twitter decides to go down this route, but without us.&lt;/p&gt;
&lt;p&gt;Like always, I&amp;#8217;m here to help anyway.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Do You Prefer Buffet or Sit-Down?</title>
        
        <category term="kaleidico" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="PuSH" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="RSSCloud" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="social-media" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="zend-framework" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="contribution" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/PuSH/RSSCloud/contribution/kaleidico/pubsubhubbub/social-media/zend-framework/Do-You-Prefer-Buffet-or-Sit-down"/>
        <published>2010-02-24T00:00:00-08:00</published>
        <updated>2010-02-24T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/PuSH/RSSCloud/contribution/kaleidico/pubsubhubbub/social-media/zend-framework/Do-You-Prefer-Buffet-or-Sit-down</id>
        <content type="html">&lt;p&gt;&lt;em&gt;&lt;strong&gt;Editor’s note&lt;/strong&gt;: As we &lt;a href=&quot;/blog/ecosystem/meta/superfeedr/be-my-guest/&quot;&gt;mentioned a few weeks ago&lt;/a&gt; we want to offer our readers the ability to also write on that blog. This post by &lt;a href=&quot;http://kaleidico.com&quot;&gt;Doug Van De Motter&lt;/a&gt; explains why they chose PubSubHubbub and Superfeedr for &lt;a href=&quot;http://kaleidico.com/eavesdropper&quot;&gt;Eavesdropper&lt;/a&gt; .&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/maciejdakowicz/3952937924/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2425/3952937924_7662a771b3.jpg&quot; style=&quot;height:200px; float:right; padding:10px;&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the real time web world, currently there are two main choices for feed consumers &amp;#8211; &lt;a href=&quot;http://grack.com/blog/2009/09/07/pubsubhubbub-vs-rsscloud/&quot;&gt;&lt;b&gt;RSSCloud and Pubsubhubbub&lt;/b&gt;&lt;/a&gt; (PuSH). You can liken RSSCloud to a buffet for feeds and PuSH to a sit-down dinner. The hubs processing the feeds are the waiters taking your order &amp;#8211; &amp;#8220;Do you prefer buffet or sit-down?&amp;#8221;&lt;/p&gt;
&lt;p&gt;At the RSSCloud buffet, the waiter will take your feed subscription order, and when the cook (the feed publisher) has an update ready the waiter will be notified. The waiter in turn will send you a simple ping alerting you of the update so you can go to the cook&amp;#8217;s buffet table and grab it. The waiter will also send a notice to all the other subscribers who will rush to the buffet table to get their updates, possibly crowding you out and making you wait. It&amp;#8217;s also possible that the publisher may not  anticipate the demand for the update and the table is overwhelmed with impatient buffet patrons who overturn the table.&lt;/p&gt;
&lt;p&gt;If you prefer the PuSH sit-down dinner, the waiter will take your feed subscription order, just like at the buffet, but when the cook&amp;#8217;s update is ready the complete order is delivered directly to you by the waiter using a fat ping, and you&amp;#8217;re ready to consume as you like.&lt;/p&gt;
&lt;p&gt;Being basically lazy and preferring our pings with a lot of fat, we opted for the PuSH sit-down protocol which we integrated into our &lt;a href=&quot;http://kaleidico.com/eavesdropper&quot;&gt;&lt;b&gt;Eavesdropper&lt;/b&gt;&lt;/a&gt; product using &lt;a href=&quot;http://zendframework.com/manual/en/zend.feed.pubsubhubbub.introduction.html&quot;&gt;&lt;b&gt;Zend Feed Pubsubhubbub&lt;/b&gt;&lt;/a&gt; and &lt;a href=&quot;http://superfeedr.com/subscriber&quot;&gt;&lt;b&gt;Superfeedr&lt;/b&gt;&lt;/a&gt; . The  Zend Feed Pubsuhubbub component is new to Zend Framework 1.10 and makes integrating the PuSH protocol into an app very easy. We chose the Superfeedr hub for it&amp;#8217;s standardization into Atom of any feed to which we want to subscribe, and because they handle the complexity of the alphabet soup of feed standards so we can just relax and enjoy our meal.&lt;/p&gt;
&lt;p&gt;Eavesdropper is our &lt;em&gt;real-time monitoring tool&lt;/em&gt; that can be used for reputation management, competitive intelligence, lead generation and crisis management, or many other uses depending on your needs. With the addition of PuSH, you can monitor any feed of interest en &amp;#8211; dash for example, you may come across a blog post through Eavesdropper where users are actively discussing your product or service, and if the comments are feed-enabled you can subscribe to them directly within Eavesdropper to follow the discussion as it happens.&lt;/p&gt;
&lt;p&gt;So, as a hungry feed consumer, do you prefer buffet or sit-down?&lt;/p&gt;</content>
        <author>
            <name>Doug Van De Motter</name>
            <uri>http://kaleidico.com</uri>
        </author>
    </entry>
    
    <entry>
        <title>On Outsourcing</title>
        
        <category term="outsourcing" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="startups" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="validation" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/outsourcing/startups/validation/on-outsourcing"/>
        <published>2010-02-23T00:00:00-08:00</published>
        <updated>2010-02-23T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/outsourcing/startups/validation/on-outsourcing</id>
        <content type="html">&lt;p&gt;I catch a small conversation between &lt;a href=&quot;http://al3x.net/&quot;&gt;Alex Payne&lt;/a&gt; and &lt;a href=&quot;http://mgalligan.com/&quot;&gt;Matt Galligan&lt;/a&gt; today :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://twitter.com/al3x/status/9547000653&quot;&gt;Al3x&lt;/a&gt; : Something you hear over and over again from people running startups that made it: &amp;#8220;[some capability] matters too much to outsource&amp;#8221;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;http://twitter.com/mg/status/9547557255&quot;&gt;Mg&lt;/a&gt; : @al3x I generally like to call bullshit on that statement&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Needless to say that I fully agree with Matt. As a matter of fact, this is something that &lt;em&gt;we hear a lot from people we go after&lt;/em&gt;. And I think this is terribly wrong, specially when you&amp;#8217;re a small startup.&lt;/p&gt;
&lt;p&gt;I think most people agree that the &lt;strong&gt;biggest hurdle&lt;/strong&gt; for most startups out there is not proving the technology anymore, but &lt;strong&gt;proving the market&lt;/strong&gt;. If you don&amp;#8217;t agree with that, just read &lt;a href=&quot;http://500hats.typepad.com/&quot;&gt;Dave McClure&amp;#8217;s blog&lt;/a&gt; and &lt;a href=&quot;http://www.slideshare.net/dmc500hats&quot;&gt;presentations&lt;/a&gt; : &lt;em&gt;doing tech stuff is the simple/easy part of doing a startup&lt;/em&gt;. &lt;strong&gt;Proving the market, getting users and eventually customers, milking their needs to make your own profit is the hard part&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you have that in mind, when you start a company, the first thing you want to take out of the way is the technical stuff, &lt;em&gt;you don&amp;#8217;t want to spend even minutes building stuff that somebody else already built&lt;/em&gt;. As a matter of fact, if you start building stuff yourself, there is no chance that what you built in the early days is even going to last as much for a few months : &lt;strong&gt;why doing and re-doing something that somebody did already&lt;/strong&gt;?&lt;/p&gt;
&lt;p&gt;Also, what matters too much, when you have nothing? When I hear people building small apps saying &lt;em&gt;&amp;#8220;this feature matters too much&amp;#8221;&lt;/em&gt;, I can&amp;#8217;t help but think &amp;#8220;matters to much to what?&amp;#8221;. The only think you should preserve at all cost is your &lt;strong&gt;time&lt;/strong&gt;! Luckily you can&amp;#8217;t outsource that anyway.&lt;/p&gt;
&lt;p&gt;When your startup grows, when you&amp;#8217;ve proven the whole market thing, then, yes, you can start to decide what matters most, what you can do better (then the others), and what you want to take internally, rather than leave outside.&lt;/p&gt;
&lt;p&gt;Also, the internet is now the &lt;strong&gt;biggest toolbox in the world&lt;/strong&gt;, you can find services that do &lt;a href=&quot;http://www.google.com/analytics/&quot;&gt;analytics&lt;/a&gt;, &lt;a href=&quot;http://www.linode.com/index.cfm&quot;&gt;hosting&lt;/a&gt;, &lt;a href=&quot;http://simplegeo.com/&quot;&gt;geolocation&lt;/a&gt;, &lt;a href=&quot;http://superfeedr.com/&quot;&gt;realtime feeds&lt;/a&gt;, image hosting&amp;#8230; and software for everything else : building a startup is all about picking up the right bricks, and stacking up with a good mortar. &lt;strong&gt;It&amp;#8217;s not about making the bricks!&lt;/strong&gt;&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>UrbanAirship</title>
        
        <category term="Use-Case" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Python" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="PubSubHubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/PubSubHubbub/Python/Use-Case/urbain-airship"/>
        <published>2010-02-22T00:00:00-08:00</published>
        <updated>2010-02-22T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/PubSubHubbub/Python/Use-Case/urbain-airship</id>
        <content type="html">&lt;p&gt;We&amp;#8217;ve had a few customer feedback and use-cases in the past. This week, I&amp;#8217;d like to write about &lt;a href=&quot;http://urbanairship.com/&quot;&gt;UrbanAirship&lt;/a&gt;. We&amp;#8217;ve been in touch with &lt;a href=&quot;http://kveton.com/blog/&quot;&gt;Scott&lt;/a&gt; and &lt;a href=&quot;http://mtrichardson.com/&quot;&gt;Michael&lt;/a&gt; for a while now, and they &lt;a href=&quot;http://blog.urbanairship.com/2010/02/16/urban-airship-secures-1-1-million-in-venture-capital-funding/&quot;&gt;recently announced&lt;/a&gt; a Series A round.&lt;/p&gt;
&lt;p&gt;For this time, I have sent 5 questions over to Mike&amp;#8230; here they are!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/urbanairship.jpg&quot; style=&quot;float:right; margin:10px;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;What&amp;#8217;s your product/service?&lt;/h3&gt;
&lt;p&gt;Urban Airship provides an &lt;em&gt;easy way to deliver in app content and send messages to mobile customers&lt;/em&gt;.  We&amp;#8217;ve delivered over 130 million messages and talk to over 11 million phones.  Our key strategy is to make it incredibly easy and cheap to get going with &lt;strong&gt;in-app purchase or push notifications&lt;/strong&gt;.  Our simple RESTful &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; makes it a breeze to integrate into an existing system and we support a lot of advanced features, such as arbitrary tags, aliased users, or broadcast messages.&lt;/p&gt;
&lt;h3&gt;How do you use Superfeedr for?&lt;/h3&gt;
&lt;p&gt;We want to make it &lt;strong&gt;really easy to integrate push notifications to existing services&lt;/strong&gt;.  One easy way to integrate messages into an existing flow is to hook up an &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;/Atom feed.  When that feeds gets updated, we wanted our customers to be able to send a broadcast message to all their users with those updates.  This makes some applications very easy to build.  So, now, developers can just hook up an &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed to their Urban Airship application and broadcast messages are delivered &amp;#8211; no fuss required.&lt;/p&gt;
&lt;h3&gt;Why do you use Superfeedr? (vs building your own!)&lt;/h3&gt;
&lt;p&gt;We&amp;#8217;re constantly adding features and working on improving our service.  We&amp;#8217;re also a very small team.  We didn&amp;#8217;t want to bother with building out yet another component of our infrastructure dedicated to this feature, especially when we know how tricky parsing a large number of potentially unsafe and poorly formatted feeds can be.  That&amp;#8217;s why &lt;strong&gt;Superfeedr was an obvious choice&lt;/strong&gt;.  It was a &lt;em&gt;very easy integration&lt;/em&gt; and we can &lt;em&gt;rest easily at night knowing that that&amp;#8217;s one less thing that we have to worry about&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;What&amp;#8217;s your stack? Language? Superfeedr &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; you use?&lt;/h3&gt;
&lt;p&gt;We&amp;#8217;re a &lt;strong&gt;Python&lt;/strong&gt; shop &amp;#8211; our front end is written in &lt;strong&gt;Django&lt;/strong&gt; with custom back-end services for message delivery.  We choose the &lt;strong&gt;PubSubHubbub&lt;/strong&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; since it was the easiest to get up and running.  It&amp;#8217;s also much easier to maintain a Django application dedicated to it than another infrastructure component.&lt;/p&gt;
&lt;h3&gt;What would you change if you were in charge of Superfeedr for 1 day?&lt;/h3&gt;
&lt;p&gt;I think I&amp;#8217;d give Julien a vacation &amp;#8211; he&amp;#8217;s constantly available for help and seems to be everywhere he can be lending a helping hand.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Redis at Superfeedr</title>
        
        <category term="redis" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="mysql" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="memcache" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="datastore" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="performance" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/datastore/memcache/mysql/performance/redis/redis-at-superfeedr"/>
        <published>2010-02-20T00:00:00-08:00</published>
        <updated>2010-02-20T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/datastore/memcache/mysql/performance/redis/redis-at-superfeedr</id>
        <content type="html">&lt;p&gt;A lot of the problems we had to tackle in the last months were directly related to the &lt;em&gt;data stores&lt;/em&gt; we used, as well as the &lt;em&gt;schema&lt;/em&gt; of the objects we stored.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve been using &lt;a href=&quot;http://www.mysql.com/&quot;&gt;MySQL&lt;/a&gt; and &lt;a href=&quot;http://memcached.org/&quot;&gt;Memcached&lt;/a&gt; from day one, because it&amp;#8217;s always good when you have 50 different problems to tackle to &lt;a href=&quot;http://blogmaverick.com/2008/03/09/my-rules-for-startups/&quot;&gt;use tools that you know&lt;/a&gt; (read this article by &lt;a href=&quot;http://twitter.com/mcuban&quot;&gt;@mcuban&lt;/a&gt; if you&amp;#8217;re about to take the red pill).&lt;/p&gt;
&lt;p&gt;However, given our growth, we reached a step where the complexity of scaling horizontally involves sharding and other stuff that we weren&amp;#8217;t convinced MySQL would do well (at least, because we need to have Memcached in front too). Rather than heading too far into &lt;a href=&quot;http://code.flickr.com/blog/2010/02/08/using-abusing-and-scaling-mysql-at-flickr/&quot;&gt;bending MySQL&lt;/a&gt;, we thought we should give a chance to &lt;a href=&quot;http://code.google.com/p/redis/&quot;&gt;Redis&lt;/a&gt;. And here the story.&lt;/p&gt;
&lt;h2&gt;How it is/was&lt;/h2&gt;
&lt;p&gt;Let me start first to say that &lt;em&gt;we&amp;#8217;re not dumping MySQL + Memcache altogether&lt;/em&gt;. We identified one type of data for which it wasn&amp;#8217;t appropriate anymore : the feed entries.&lt;/p&gt;
&lt;p&gt;One of the key things &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;the hub&lt;/a&gt; does is diff-ing : identify new entries from old entries in the feed.&lt;/p&gt;
&lt;p&gt;We do this by storing some kind of data when for each entry, in each feed. We use a &lt;em&gt;hash of the entry id&lt;/em&gt; in our schema. The problem is that a feed can have several dozen of entries, and we obviously need to keep track of them all, plus some older ones, because you don&amp;#8217;t want entries to &amp;#8220;re-appear&amp;#8221; in a feed (if a more recent entry has been deleted).  When you have say &lt;strong&gt;1M feeds, and you need to store 50 entries per feed on average, that&amp;#8217;s 50M entries&lt;/strong&gt;. And every time we fetched a feed, we need to compare the existing entries to see if we&amp;#8217;ve seen them already&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. And we fetched all our feeds &lt;em&gt;at most&lt;/em&gt; every 15 minutes : that&amp;#8217;s a lot of queries.&lt;/p&gt;
&lt;p&gt;Also, some feeds have new entries every few seconds, if we leave that for a while, say, 2 days, that&amp;#8217;s a lot of entries stored that we&amp;#8217;ll never see again. So, as soon as we see a new entry in a feed, &lt;strong&gt;we have to clean older entries&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Needless to say that this whole traffic is too much for our &amp;#8220;simple&amp;#8221; MySQL setting on a 8GB of &lt;span class=&quot;caps&quot;&gt;RAM&lt;/span&gt; server. We had to put a Memcached in front of that to store the most recent entries. We obviously can&amp;#8217;t use Memcached alone, because if the server goes down (or if we just need to reboot, update the configuration it), all the traffic will end up on MySQL which will obviously die in hell in seconds.&lt;/p&gt;
&lt;h3&gt;Requirements&lt;/h3&gt;
&lt;p&gt;As a matter of fact, &lt;em&gt;we have the same exact information in Memcache and MySQL&lt;/em&gt;. We can&amp;#8217;t use either of them alone. &lt;strong&gt;MySQL is just too slow&lt;/strong&gt; to deal with that much traffic (even with all the InnoDB indices in &lt;span class=&quot;caps&quot;&gt;RAM&lt;/span&gt;), and &lt;strong&gt;Memcache isn&amp;#8217;t persistent&lt;/strong&gt;, so we can&amp;#8217;t accept to use it alone. Also, we actually store our very own datastructure into Memcached, because it only deals with key/value that are strings. In our case, we have a key which is our internal feed id and the value is a string of all the entries&amp;#8217; id joined together. &lt;br /&gt;
Also, we do some sharding on Memcached (on the client side), based on the superfeedr-wide feed id, and we&amp;#8217;d love to keep that.&lt;/p&gt;
&lt;p&gt;We wanted to find a tool that has the &lt;em&gt;&amp;#8220;speed&amp;#8221; of Memcached&lt;/em&gt;, &lt;em&gt;some persistence&lt;/em&gt;, and which should be &lt;em&gt;easy to shard on the client side&lt;/em&gt;. Also, we want to use a store that could just &lt;em&gt;silently fail&lt;/em&gt;, to avoid any bottleneck (at the risk of having duplicate entries). Also, this tool should ideally have some kind of &lt;em&gt;data-structures&lt;/em&gt; so we don&amp;#8217;t have to hack one that can be mapped in strings at a low extra-size cost.&lt;/p&gt;
&lt;p&gt;A few months ago, I heard about and played with &lt;a href=&quot;http://code.google.com/p/redis/&quot;&gt;Redis&lt;/a&gt;. I was quite impressed by it and thought I should keep that in mind. A few weeks ago, &lt;a href=&quot;http://antirez.com/&quot;&gt;Antirez&lt;/a&gt; added 2 awesome features that made Redis an excellent candidate : &lt;a href=&quot;http://code.google.com/p/redis/wiki/AppendOnlyFileHowto&quot;&gt;Append-On-File&lt;/a&gt; persistence (instead of periodic snapshots) and &lt;a href=&quot;http://code.google.com/p/redis/wiki/IntroductionToRedisDataTypes&quot;&gt;Sorted Sets&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Implementation&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/images/redis.png&quot; style=&quot;float:right; margin:10px;&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
&lt;strong&gt;We use &lt;span class=&quot;caps&quot;&gt;ZSETS&lt;/span&gt;&lt;/strong&gt; (sorted sets). Each feed has it&amp;#8217;s own sorted set. The &lt;em&gt;key is the global feed id&lt;/em&gt;, the &lt;em&gt;members are the entries ids&lt;/em&gt;, and the scores are &lt;em&gt;feed entries timestamps_. When fetching a feed, *we compare the unique&lt;/em&gt;ids* in the set very efficiently (in parallel). Then, when the size of the sorted sets goes beyond an arbitrary limit, &lt;strong&gt;we use the score to delete the oldest entries&lt;/strong&gt;. Easy!&lt;/p&gt;
&lt;p&gt;For the client, since all of &lt;a href=&quot;http://superfeedr.com/technology&quot;&gt;our components are evented&lt;/a&gt;, we use &lt;a href=&quot;http://github.com/madsimian/em-redis&quot;&gt;em-redis&lt;/a&gt;. It allows us to run the comparisons of new entries in parallel. However, we had to &lt;a href=&quot;http://gist.github.com/310288&quot;&gt;hack it a little bit&lt;/a&gt; to allow &lt;strong&gt;silent fail&lt;/strong&gt; when/if the server is not present.&lt;/p&gt;
&lt;p&gt;Obviously, we use &lt;a href=&quot;http://code.google.com/p/redis/wiki/AppendOnlyFileHowto&quot;&gt;&lt;span class=&quot;caps&quot;&gt;AOF&lt;/span&gt;&lt;/a&gt; for persistence, so even if Redis goes down abruptly, &lt;strong&gt;we shouldn&amp;#8217;t lose any data&lt;/strong&gt;. We keep the regular snapshot (&lt;a href=&quot;http://code.google.com/p/redis/wiki/BgsaveCommand&quot;&gt;&lt;span class=&quot;caps&quot;&gt;BGSAVE&lt;/span&gt;&lt;/a&gt;) every 15 minutes or so, just to make sure we have the data twice (and we copy it somewhere else).&lt;/p&gt;
&lt;p&gt;We &lt;strong&gt;shard based on the feed id&lt;/strong&gt;. We do not use a hash key, because (even if we used consistent hashing), we would have duplicate entry for each new redis server we add to our farm. We based that on the fact our ids are consecutive and we store 250k feeds per server. &lt;code&gt;id &amp;lt; 150000, redis = server1; if id &amp;lt; 300000, redis = server2 ...&lt;/code&gt;. that&amp;#8217;s not the cleanest thing but that works :)&lt;/p&gt;
&lt;p&gt;We use 2GB slices at &lt;a href=&quot;http://www.slicehost.com/&quot;&gt;slicehost&lt;/a&gt; and all the entries should fit in there, which is good. If not, we&amp;#8217;ll keep less entries per feed (we currently keep between twice and 3 times as much entries that there are currently in the feed.)&lt;/p&gt;
&lt;p&gt;When getting into prod, we had a few issues with Redis and the &lt;a href=&quot;http://groups.google.com/group/redis-db/browse_thread/thread/9dc579d4afab6dfa&quot;&gt;performance was very disappointing&lt;/a&gt;, specifically at the time of the snapshots. It appeared that it was degraded by some changes &lt;a href=&quot;http://twitter.com/antirez&quot;&gt;antirez&lt;/a&gt; introduced in the last version. We were delighted that he acknowledged the issue very fast and even used one of our boxes to debug. A few hours later &lt;a href=&quot;http://code.google.com/p/redis/downloads/detail?name=redis-1.2.2.tar.gz&amp;amp;can=2&amp;amp;q=#makechanges&quot;&gt;1.2.2 was out&lt;/a&gt;, fixing all the issues! Who said customer service sucked with Open Source Software?&lt;/p&gt;
&lt;h4&gt;Tip&lt;/h4&gt;
&lt;p&gt;If you can run redis servers with less than 4GB of &lt;span class=&quot;caps&quot;&gt;RAM&lt;/span&gt;, &lt;strong&gt;compile&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; and run it in 32bits&lt;/strong&gt; : redis is very greedy in terms of pointers and 64bits pointers are twice as long as 32bits pointers (suprising!). On one of our servers, we gained 40% (from 1602428 to 1002124). Pretty big! Also, you &lt;em&gt;want&lt;/em&gt; to have servers with less than 4GB : it&amp;#8217;s probably &lt;strong&gt;safer to have many small redis instances than just a few big ones&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;It&amp;#8217;s been now in production a few days, each of our redis servers process on average &lt;strong&gt;3500 queries per second&lt;/strong&gt;. They store on average slightly less than 1GB for 200k sorted sets (with about 4k per key/value), which should give enough space for more entries. The load is consistently below 0.1 on a quad-core. This will probably not grow much, so &lt;strong&gt;we&amp;#8217;re more &lt;span class=&quot;caps&quot;&gt;RAM&lt;/span&gt; bound than &lt;span class=&quot;caps&quot;&gt;CPU&lt;/span&gt; bound&lt;/strong&gt; here, so you want to implement the trick above :)&lt;/p&gt;
&lt;p&gt;It feels good to not have an &amp;#8220;horizon&amp;#8221; anymore in terms of scale for the entries. Our only concern is to find the best way to provision and deploy more redis servers when we need them :D&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt; I&amp;#8217;m oversimplifying, we use &lt;code&gt;Etag&lt;/code&gt;, &lt;code&gt;If-Mofidied-Since&lt;/code&gt; and a global feed hash, to avoid comparing that every times, but that&amp;#8217;s still pretty high!&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn2&quot;&gt;&lt;sup&gt;2&lt;/sup&gt; Change the 32bit target: to &lt;code&gt;make ARCH=&quot;-m32&quot;&lt;/code&gt;. Then, &lt;code&gt;make 32bit&lt;/code&gt;&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Google's Buzz is PubSubHubbub in, and out</title>
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="use-case" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="google" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/google/pubsubhubbub/use-case/google-buzz"/>
        <published>2010-02-09T00:00:00-08:00</published>
        <updated>2010-02-09T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/google/pubsubhubbub/use-case/google-buzz</id>
        <content type="html">&lt;p&gt;Today, Google launched &lt;a href=&quot;http://www.google.com/buzz&quot;&gt;Buzz&lt;/a&gt;. Aside from the great &lt;strong&gt;social features&lt;/strong&gt; that it brings, I want to emphasize how PubSubHubbub is at the core of it. As Brad (who is clearly behind that in some way) &lt;a href=&quot;http://twitter.com/bradfitz/status/8866417834&quot;&gt;said&lt;/a&gt;, Buzz is PubSubHubbub both &lt;a href=&quot;http://code.google.com/apis/buzz/documentation/#connect&quot;&gt;in&lt;/a&gt;, and &lt;a href=&quot;http://code.google.com/apis/buzz/documentation/#syndication&quot;&gt;out&lt;/a&gt;. This means that Buzz gets its data via PubSubHubbub, but also publishes it in realtime, via PubSubHubbub as well.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.google.com/s2/static/images/1444417344-GoogleBuzzLogo68.png&quot; style=&quot;float:left; margin: 10px;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;From day 1, &lt;em&gt;Google actively promoted the PubSubHubbub protocol on the publisher side&lt;/em&gt;, but they took a while to &lt;strong&gt;integrate the subscriber side&lt;/strong&gt; that in existing products, like Google Reader, iGoogle, Feedburner&amp;#8230; etc. Today not only they did that, but they also put it at the core of a brand new product.&lt;/p&gt;
&lt;p&gt;In the past few weeks, we started to see a ton of subscriptions from Google to a lot of feeds for which we host the hub. I&amp;#8217;m pretty sure that soon all Google properties will use PubSubHubbub for the feeds!&lt;/p&gt;
&lt;h3&gt;Huh, and the rest of us?&lt;/h3&gt;
&lt;p&gt;It simply means that if you have a &lt;a href=&quot;http://posterous.com/&quot;&gt;Posterous&lt;/a&gt; Blog, a &lt;a href=&quot;http://www.tumblr.com/&quot;&gt;Tumblr&lt;/a&gt; Blog, or if you have a feed for which &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;superfeedr host the hub&lt;/a&gt;, you can (and should!) add that to your &lt;a href=&quot;http://www.google.com/profiles&quot;&gt;Google Profile&lt;/a&gt; so that the next story you publish is available into Buzz almost instantly and your friends can see, comment and like it :)&lt;/p&gt;
&lt;p&gt;Obviously, PubSubHubbub (between services) and &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; (behind the firewall) will be the base layers for the realtime and social web. Whatever your app is, you need to make it realtime by &lt;a href=&quot;http://superfeedr.com/publisher&quot;&gt;supporting PubSubHubbub&lt;/a&gt; in your feeds!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>PubSubHubbub : security</title>
        
        <category term="PubSubHubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="API" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="secure" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/API/PubSubHubbub/secure/secure-pubsubhubbub"/>
        <published>2010-02-08T00:00:00-08:00</published>
        <updated>2010-02-08T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/API/PubSubHubbub/secure/secure-pubsubhubbub</id>
        <content type="html">&lt;p&gt;One of the great advantages of our &lt;a href=&quot;http://superfeedr.com/documentation#xmpp_pubsub&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt; is that there is no need for the subscriber to know whether the content he gets is actually from Superfeedr. &lt;a href=&quot;http://superfeedr.com/documentation#pubsubhubbub&quot;&gt;PubSubHubbub&lt;/a&gt; doesn&amp;#8217;t benefit from that, since it relies on &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; callbacks which makes it hard to know where a notification comes from. A subscriber could obviously check the &lt;acronym title=&quot;s&quot;&gt;&lt;span class=&quot;caps&quot;&gt;IP&lt;/span&gt;&lt;/acronym&gt; as well as the UserAgent, but the first one will break when we add servers and the second one is pretty easy to spoof.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.2.html&quot;&gt;protocol&lt;/a&gt; defines a strategy for that and we implement it at Superfeedr. Here is how it works :&lt;/p&gt;
&lt;p&gt;1. The user subscribes to the hub url and provides a &lt;code&gt;hub.secret&lt;/code&gt; value. To make that secure, the subscriber should use the http*s* url to the hub. (All &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;our hubs&lt;/a&gt; have an http and https url).&lt;/p&gt;
&lt;p&gt;2. Upon notification, the hub will &lt;strong&gt;compute an &lt;span class=&quot;caps&quot;&gt;HMAC&lt;/span&gt; signature&lt;/strong&gt; with the supplied &lt;code&gt;hub.secret&lt;/code&gt;, as well as will the body of the notification, and will include this signature in the headers of its notification.&lt;/p&gt;
&lt;p&gt;3. When notified, the subscriber will &lt;strong&gt;compute the same signature&lt;/strong&gt; (he should have kept track of the secret!), and will &lt;strong&gt;compare&lt;/strong&gt; with the http header received from the hub.&lt;/p&gt;
&lt;p&gt;If the 2 &lt;span class=&quot;caps&quot;&gt;HMAC&lt;/span&gt; signature are the same, then, the subscriber knows for sure that the notification comes from the hub. If not, it should silently ignore it.&lt;/p&gt;
</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Gawker Media and ReadWriteWeb have hubs</title>
        
        <category term="PubSubHubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="readwriteweb" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="gawker" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Lifehacker" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Gizmodo" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Gizmodo/Lifehacker/PubSubHubbub/gawker/readwriteweb/rww-gawker-media-have-hubs"/>
        <published>2010-01-29T00:00:00-08:00</published>
        <updated>2010-01-29T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Gizmodo/Lifehacker/PubSubHubbub/gawker/readwriteweb/rww-gawker-media-have-hubs</id>
        <content type="html">&lt;p&gt;&lt;a href=&quot;http://www.readwriteweb.com/&quot;&gt;ReadWriteWeb&lt;/a&gt; is one of the &lt;em&gt;most respected&lt;/em&gt; tech blogs in the Valley. &lt;a href=&quot;http://marshallk.com/&quot;&gt;Marshall&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/Fredericl&quot;&gt;Frederic&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/jaredwsmith&quot;&gt;Jared Smith&lt;/a&gt;, along with &lt;a href=&quot;http://twitter.com/Erickschonfeld&quot;&gt;Erick&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/SteveGillmor&quot;&gt;Steve&lt;/a&gt; at Techcrunch, have been early realtime supporters. ReadWriteWeb also wrote a &lt;a href=&quot;http://bit.ly/rtwreport&quot;&gt;very insightful report&lt;/a&gt; on this trend and you should read it.&lt;/p&gt;
&lt;p&gt;Gawker Media is one of the biggest and most successful blog-oriented media companies. Their publications include the following names : &lt;a href=&quot;http://gawker.com&quot;&gt;Gawker.com&lt;/a&gt;, &lt;a href=&quot;http://www.defamer.com.au&quot;&gt;Defamer&lt;/a&gt;, &lt;a href=&quot;http://fleshbot.com/&quot;&gt;Fleshbot&lt;/a&gt;, &lt;a href=&quot;http://deadspin.com/&quot;&gt;Deadspin&lt;/a&gt;, &lt;a href=&quot;http://lifehacker.com/&quot;&gt;Lifehacker&lt;/a&gt;, &lt;a href=&quot;http://gizmodo.com/&quot;&gt;Gizmodo&lt;/a&gt;, &lt;a href=&quot;http://io9.com/&quot;&gt;io9&lt;/a&gt;, &lt;a href=&quot;http://kotaku.com/&quot;&gt;Kotaku&lt;/a&gt;, &lt;a href=&quot;http://jalopnik.com/&quot;&gt;Jalopnik&lt;/a&gt; and &lt;a href=&quot;http://jezebel.com/&quot;&gt;Jezebel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Today, we&amp;#8217;re quite proud to say, that they now push their content in realtime : they have their hubs : &lt;a href=&quot;http://rww.superfeedr.com&quot;&gt;http://rww.superfeedr.com&lt;/a&gt;, &lt;a href=&quot;http://gawker.superfeedr.com&quot;&gt;http://gawker.superfeedr.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re very happy to have gawker and rww using Superfeedr. In the past we announced &lt;strong&gt;hubs for blog platforms&lt;/strong&gt;, and we&amp;#8217;re excited to see what will happen for another kind of publisher : media companies.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s been amazing to see how some implementers of the PubSubHubbub protocol already found their hubs and subscribed to several feeds&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; :)&lt;/p&gt;
&lt;p&gt;You (and your app) could also &lt;a href=&quot;http://superfeedr.com/publisher&quot;&gt;benefit from a superfeedr hosted hub&lt;/a&gt; if you do publish content on the web. &lt;em&gt;Reach out!&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt; To be fair&amp;#8230; they almost forced us to write about these hubs!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>10 Feed Publishing Best Practices</title>
        
        <category term="Feeds" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="RSS" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Atom" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Best Practice" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Atom/Best Practice/Feeds/RSS/feed-publishing-best-practices"/>
        <published>2010-01-27T00:00:00-08:00</published>
        <updated>2010-01-27T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Atom/Best Practice/Feeds/RSS/feed-publishing-best-practices</id>
        <content type="html">&lt;p&gt;Working with publishers and polling hundreds of thousands of feed has taught us a few lessons and best practices for people who publish &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; or Atom feeds. You might disagree with some of them, so please, let us know in the comments.&lt;/p&gt;
&lt;p&gt;I want to emphasize that these best practices are &lt;em&gt;technical&lt;/em&gt;, not business related.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Don&amp;#8217;t use &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; and &lt;span class=&quot;caps&quot;&gt;ATOM&lt;/span&gt;&lt;/strong&gt;. There is no good feed parser that doesn&amp;#8217;t accept both. Providing one will make subscribers life much easier :)&lt;/li&gt;
	&lt;li&gt;Make sure your feeds are &lt;strong&gt;valid&lt;/strong&gt;.&lt;/li&gt;
	&lt;li&gt;Use &lt;strong&gt;unique identifiers&lt;/strong&gt; for entries : &lt;code&gt;&amp;lt;guid&amp;gt;&lt;/code&gt; in &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; and &lt;code&gt;&amp;lt;id&amp;gt;&lt;/code&gt; in &lt;span class=&quot;caps&quot;&gt;ATOM&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Don&amp;#8217;t use feed caching&lt;/strong&gt; if you can&amp;#8217;t explicitly expire the cache. In other words, don&amp;#8217;t use time based caches. &lt;em&gt;Corollary : use Feedburner only if you use pingshot&lt;/em&gt;.&lt;/li&gt;
	&lt;li&gt;Make sure your &lt;strong&gt;date format is valid&lt;/strong&gt; : &lt;code&gt;ISO8601&lt;/code&gt; is the one you should choose.&lt;/li&gt;
	&lt;li&gt;Add the feeds &lt;strong&gt;discovery&lt;/strong&gt; in your &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; pages. Most modern browsers (Chrome : &lt;span class=&quot;caps&quot;&gt;WTF&lt;/span&gt;?!) will be able to detect that and show your visitors that the page references a feed. It will also help feed readers to auto-extract feeds.&lt;/li&gt;
	&lt;li&gt;Make sure you&amp;#8217;re &lt;strong&gt;RESTful&lt;/strong&gt; in your feeds discovery. If you&amp;#8217;re in a resource page, show feeds that relate to that resource. Make sure a given feed is accessible at a given url only.&lt;/li&gt;
	&lt;li&gt;Use the &amp;#8220;de-facto&amp;#8221; standard in terms of &lt;strong&gt;calendar : Roman&lt;/strong&gt;. The subscribing app may convert to other calendar, based on the user&amp;#8217;s settings.&lt;/li&gt;
	&lt;li&gt;Keep the &lt;strong&gt;feed urls simple&lt;/strong&gt;. Do some &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; rewriting.&lt;/li&gt;
	&lt;li&gt;It&amp;#8217;s ok to have only &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; instead of the full &lt;code&gt;&amp;lt;content&amp;gt;&lt;/code&gt; (it&amp;#8217;s a business decision) : but don&amp;#8217;t show it as full content if it&amp;#8217;s just a summary.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Special Bonus&lt;/strong&gt; : publish feeds in realtime. &lt;a href=&quot;http://superfeedr.com/publisher&quot;&gt;We can help&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Thoughts?&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>State of Real-Time feeds</title>
        
        <category term="Real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="statistics" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="market" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Real-time/market/statistics/state-fo-realtime-feeds-01-01"/>
        <published>2010-01-26T00:00:00-08:00</published>
        <updated>2010-01-26T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Real-time/market/statistics/state-fo-realtime-feeds-01-01</id>
        <content type="html">&lt;p&gt;It&amp;#8217;s this time again : the time for the &lt;em&gt;very&lt;/em&gt; controversial numbers about realtime feeds. Before anything else, I&amp;#8217;d like to indicate that it would be great for other services to publish similar numbers. We know &lt;a href=&quot;http://blog.superfeedr.com/Feeds/PubSubHubbub/real-time/stats/who-implemented-pubsubhubbub/&quot;&gt;who&lt;/a&gt; &lt;a href=&quot;http://blog.superfeedr.com/Feeds/PubSubHubbub/real-time/stats/who-pubsubhubbub/:http://blog.superfeedr.com/Feeds/PubSubHubbub/real-time/stats/who-pubsubhubbub/&quot;&gt;implemented&lt;/a&gt; &lt;strong&gt;PubSubHubbub&lt;/strong&gt;, I guess some of them implemented &lt;strong&gt;RSSCloud&lt;/strong&gt; and &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;SUP&lt;/span&gt;&lt;/strong&gt; too.&lt;/p&gt;
&lt;p&gt;Since we have so much debate in the past about the methodology:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Superfeedr has many feeds in management. Some of them are for the &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;hubs we host&lt;/a&gt;. &lt;strong&gt;We don&amp;#8217;t count the feeds from the hubs we host&lt;/strong&gt;, because they would obviously inflate the PubSubHubbub number a lot.&lt;/li&gt;
	&lt;li&gt;For each feed, since we try to avoid polling it too, we use any available technique to get in realtime, se we&amp;#8217;re able to tell whether it&amp;#8217;s PubSubHubbub, RSSCloud, or &lt;span class=&quot;caps&quot;&gt;SUP&lt;/span&gt;. We just counted these.&lt;/li&gt;
	&lt;li&gt;Some feeds implemented 2 or more protocols (the best example would be wordpress.com blog that have a feedburner feed), we counted them in both categories.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A few notes on the result set before. We have &lt;strong&gt;multiplied by 6 the number of feeds we managed&lt;/strong&gt; since the last time we count, which should make our set a little more representative. As a matter of fact we gained a lot of feeds that are not blogs.&lt;/p&gt;
&lt;table style=&quot;text-align:center;&quot;&gt;
&lt;tr&gt;
        &lt;th&gt;&lt;/th&gt;
        &lt;th style=&quot;width: 20%;&quot;&gt;Polling&lt;/th&gt;
        &lt;th style=&quot;width: 20%;&quot;&gt;RSSCloud&lt;/th&gt;
        &lt;th style=&quot;width: 20%;&quot;&gt;PubSubHubbub&lt;/th&gt;
        &lt;th style=&quot;width: 20%;&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SUP&lt;/span&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
        &lt;td&gt;Oct 1,  2009&lt;/td&gt;
        &lt;td&gt;92.7%&lt;/td&gt;
        &lt;td&gt;0.3%&lt;/td&gt;
        &lt;td&gt;7.1%&lt;/td&gt;
        &lt;td&gt;0.0%&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
        &lt;td&gt;Nov 1,  2009&lt;/td&gt;
        &lt;td&gt;73.3%&lt;/td&gt;
        &lt;td&gt;0.8%&lt;/td&gt;
        &lt;td&gt;25.8%&lt;/td&gt;
        &lt;td&gt;0.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;font-weight:bold&quot;&gt;
        &lt;td&gt;Jan 26, 2010&lt;/td&gt;
        &lt;td&gt;87.4%&lt;/td&gt;
        &lt;td&gt;0.9%&lt;/td&gt;
        &lt;td&gt;11.5%&lt;/td&gt;
        &lt;td&gt;0.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&quot;/images/push-rsscloud-sup-01-10.png&quot; style=&quot;float:left; display:block;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can immediately see that the &lt;strong&gt;proportion of feeds we&amp;#8217;re polling increased&lt;/strong&gt; compared to the last measure. This is the &lt;em&gt;consequence of less PubSubHubbub feeds&lt;/em&gt;. Back in november, &lt;a href=&quot;http://blog.superfeedr.com/Real-time/market/statistics/state-of-real-time-feeds/&quot;&gt;we counted the PubSubHubbub feeds&lt;/a&gt; we were hosting. &lt;strong&gt;That was a mistake&lt;/strong&gt;, we changed that this time and &lt;em&gt;will not count them in the future either&lt;/em&gt;. The RSSCloud proportion grew in comparison, since PubSubHubbub numbers were inflated.&lt;/p&gt;
&lt;p&gt;We are now &lt;strong&gt;continuously measuring&lt;/strong&gt; the proportions, which should make these posts way more regular. I look forward to the next month!&lt;/p&gt;
&lt;p&gt;In conclusion, I&amp;#8217;d like to remind you that &lt;a href=&quot;http://superfeedr.com/technology&quot;&gt;we implemented many other ways&lt;/a&gt; of getting feed updates, including some specific APIs, &lt;a href=&quot;http://blog.superfeedr.com/Ping/PubSubHubbub/Real-time/XML-RPC/XMPP/XMLRPC-Ping-to-PubSubHubbub/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;RPC&lt;/span&gt; Ping&lt;/a&gt; and other techniques. If you use Superfeedr, you will benefit from these and get feeds in realtime!&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt; At that time we had not implemented &lt;span class=&quot;caps&quot;&gt;SUP&lt;/span&gt;.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Why realtime matters for publishers</title>
        
        <category term="realtime" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="publisher" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/publisher/realtime/why-realtime-matters-for-publishers"/>
        <published>2010-01-25T00:00:00-08:00</published>
        <updated>2010-01-25T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/publisher/realtime/why-realtime-matters-for-publishers</id>
        <content type="html">&lt;p&gt;Several people wonder if &lt;strong&gt;realtime feeds&lt;/strong&gt; is something they &lt;em&gt;need&lt;/em&gt;, since they have regular &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; and Atom feeds.&lt;/p&gt;
&lt;h3&gt;Now&lt;/h3&gt;
&lt;p&gt;The web now is organized in such a way that every service or person needs to go fetch any information, or have to &amp;#8220;accidentally&amp;#8221; find it again. No matter how great your content is, you&amp;#8217;ll have to &lt;em&gt;wait for visitors to come&lt;/em&gt;, and once they&amp;#8217;re gone, you have &lt;em&gt;very little way of telling them about new content&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I was surprised to find out last week, during the &lt;a href=&quot;http://startup2startup.com/&quot;&gt;S2S diner&lt;/a&gt; in Palo Alto that the &lt;a href=&quot;http://twitter.com/cmccann7/statuses/8056229661&quot;&gt;biggest email sender were social networks&lt;/a&gt; (except for spammers, obviously). They send you an email for a &lt;span class=&quot;caps&quot;&gt;LOT&lt;/span&gt; of things : a new friend request, somebody tagged you, somebody mentioned you&amp;#8230; etc. This is &lt;em&gt;their&lt;/em&gt; way of pulling you back to the site.&lt;/p&gt;
&lt;p&gt;When you look around, the sites which generate the &lt;strong&gt;more engagement are the sites who send the best emails&lt;/strong&gt;, because email alerts is almost the only product that can get you back to a site regularly.&lt;/p&gt;
&lt;p&gt;Unfortunately &lt;strong&gt;not all services can rely on email&lt;/strong&gt;. As much as giving personal information (like your email) to a social network is ok, it doesn&amp;#8217;t make sense to subscribe to any mailing list out there. Also, when a social network sends an email, it&amp;#8217;s &lt;em&gt;always&lt;/em&gt; &lt;strong&gt;accurate and personalized&lt;/strong&gt;! If I subscribe to the NYT&amp;#8217;s mailing lists, there is actually little chances that the emails I am going to get will be relevant.&lt;/p&gt;
&lt;p&gt;This situation is also giving a &lt;strong&gt;huge importance to search engines&lt;/strong&gt;. If you have no way of reclaiming your visitors, you want to always be in their way when they search for content. Yet, there is no guarantee that your rankings in &lt;a href=&quot;http://www.google.com/&quot;&gt;Google&lt;/a&gt; or &lt;a href=&quot;http://www.bing.com/&quot;&gt;Bing&lt;/a&gt; will stay identical forever. On top of that &lt;em&gt;search engines are not the best way to work on your branding&lt;/em&gt;: from a google search result page, can you tell the different between a &lt;span class=&quot;caps&quot;&gt;NYT&lt;/span&gt; article and a page from somebody that can&amp;#8217;t really be trusted? No.&lt;/p&gt;
&lt;h3&gt;In realtime&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;&lt;em&gt;realtime web&lt;/em&gt; is synonymous with &lt;em&gt;pushed web&lt;/em&gt;&lt;/strong&gt;. I even said it in the past : the time factor doesn&amp;#8217;t matter much. What &lt;strong&gt;truly matters is that the information is pushed, that it will eventually reach&lt;/strong&gt; services/people away even if they do not come to check it out.&lt;/p&gt;
&lt;p&gt;In the process, when a publisher pushes its content, he is the &amp;#8220;initiator&amp;#8221;, &lt;strong&gt;he is active&lt;/strong&gt;. When a publishers waits for others to come check its content, &lt;strong&gt;he is passive&lt;/strong&gt; and relies on the capacity (and willing!) of others to come by themselves.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Becoming a realtime publisher means being in control, rather than relying on others&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Eventually, when your service will build its traffic, both approaches will exist :&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;Passive&lt;/strong&gt;: you update your content and leave it as is, ready for people to randomly find it (through search engines, link sharing&amp;#8230; etc)&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Active&lt;/strong&gt; : you push it to subscribing application : feed readers, content aggregators, feed to email gateways, feed to &lt;span class=&quot;caps&quot;&gt;SMS&lt;/span&gt; gateways, realtime search engines&amp;#8230; etc&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;By &lt;a href=&quot;http://superfeedr.com/publisher&quot;&gt;building hubs&lt;/a&gt;, we make it very easy for &lt;strong&gt;any publisher to publish in realtime&lt;/strong&gt;. You &lt;em&gt;need&lt;/em&gt; one, get one now!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>A hub for Dotspots</title>
        
        <category term="hub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="usecase" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/hub/pubsubhubbub/usecase/a-hub-for-dotspots"/>
        <published>2010-01-24T00:00:00-08:00</published>
        <updated>2010-01-24T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/hub/pubsubhubbub/usecase/a-hub-for-dotspots</id>
        <content type="html">&lt;p&gt;As &lt;a href=&quot;http://twitter.com/mmastrac&quot;&gt;Matt&lt;/a&gt; &lt;a href=&quot;http://blog.dotspots.com/2010/01/21/dotspots-goes-real-time/&quot;&gt;announced earlier&lt;/a&gt; this week, &lt;a href=&quot;http://dotspots.com/&quot;&gt;Dotspots&lt;/a&gt; now as a &lt;a href=&quot;http://dotspots.superfeedr.com/&quot;&gt;PubSubHubbub hub&lt;/a&gt;, hosted by Superfeedr.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://dotspots.superfeedr.com/images/hubs/dotspots.gif&quot; style=&quot;width:20%;float:left;padding:10px;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;DotSpots enables anyone to update the news in real-time with dots: mini-blog posts, including videos, pictures, documents and links, that appear in context on all relevant news articles.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Using superfeedr&amp;#8217;s hub is quite easy and involves 2 steps :&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Adding the &lt;strong&gt;discovery&lt;/strong&gt; to the &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;/atom feeds. This is just a small &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt; snippet to indicate that a given feed has a hub and its location.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Pinging&lt;/strong&gt; superfeedr. Even though we &lt;em&gt;always failover to polling&lt;/em&gt;, it&amp;#8217;s also always better if you can ping us when a feed has been updated.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I asked Matt some feedback on the process of using Superfeedr&amp;#8217;s hub, and he kindly sent me the following :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Turning on real-time updates with &lt;strong&gt;PubSubHubbub was really easy&lt;/strong&gt;. We use the &lt;a href=&quot;(https://rome.dev.java.net/&quot;&gt;Rome library&lt;/a&gt; to output &lt;strong&gt;Atom&lt;/strong&gt; feeds for a number of different views on the data. We added a simple hub link to each feed to do this:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;script src=&quot;http://gist.github.com/285503.js?file=add_link.java&quot;&gt;&lt;/script&gt;&lt;blockquote&gt;
&lt;p&gt;Our architecture already includes an asynchronous queue of events for mutation of different objects. We just needed to add another listener on the events for dot creation and modification that &lt;strong&gt;notifies the Superfeedr hub of changes&lt;/strong&gt;. When a dot is modified, the event queue notifies the PubSubHubbub notifier, which then pushes out the updates to any of the feeds modified by the action. Notifications use the built-in Java support for &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;script src=&quot;http://gist.github.com/285504.js?file=ping.java&quot;&gt;&lt;/script&gt;&lt;p&gt;As you can see, it&amp;#8217;s quite straightforward&amp;#8230; You can start today : &lt;a href=&quot;http://superfeedr.com/publisher&quot;&gt;Setup a PubSubHubbub hub&lt;/a&gt;&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Compliance for Superfeedr's Hubs</title>
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="testing" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="compliance" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/compliance/pubsubhubbub/testing/compliance-for-superfeedrs-hubs"/>
        <published>2010-01-23T00:00:00-08:00</published>
        <updated>2010-01-23T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/compliance/pubsubhubbub/testing/compliance-for-superfeedrs-hubs</id>
        <content type="html">&lt;p&gt;We &lt;a href=&quot;http://blog.superfeedr.com/OSS/gospel/kind-of-open-source/&quot;&gt;said it in the past&lt;/a&gt;, &lt;strong&gt;abiding by standards makes the web better&lt;/strong&gt;. Yet, sometimes, standards have a tendency to diverge from an implementation to another. You know, the &lt;em&gt;theory vs. practice&lt;/em&gt; thing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/robocop.jpg&quot; style=&quot;width:20%;float:left;margin:5px;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;PubSubHubbub is a standard. Since it&amp;#8217;s relies on &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;, it makes it quite easy to test and specify, and that&amp;#8217;s what &lt;a href=&quot;http://progrium.com/&quot;&gt;progrium&lt;/a&gt; &lt;a href=&quot;http://code.google.com/p/pubsubhubbub/source/browse/trunk/testsuite/README&quot;&gt;did a while ago&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Today I checked and cleaned a little bit the test suite, and I uploaded it to &lt;a href=&quot;http://github.com/superfeedr/pubsubhubbub_hub_testsuite&quot;&gt;Superfeedr&amp;#8217;s github repo&lt;/a&gt;. I tested it with the hubs we host and, good news : we&amp;#8217;re fully compliant on the subscriber part :)&lt;/p&gt;
&lt;p&gt;The publisher part is a &lt;em&gt;little bit trickier&lt;/em&gt;, because it expects the hub to fetch a url after a ping. However, in Superfeedr&amp;#8217;s case, the scheduling algorithm is a slightly more complex, and it makes it &amp;#8220;non-deterministic&amp;#8221; from the outside world : quite hard to specify.&lt;/p&gt;
&lt;p&gt;Obviously, you can run that code by yourself to make sure we&amp;#8217;re doing good! We will also try to update both the hub and the test suite when the specification evolves! (Also, I need to find a way to push that back to Google&amp;#8217;s svn, but my svn is probably not better than my ancient greek&amp;#8230;)&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Who Implemented PubSubHubbub</title>
        
        <category term="PubSubHubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Feeds" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="stats" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Feeds/PubSubHubbub/real-time/stats/who-implemented-pubsubhubbub"/>
        <published>2010-01-21T00:00:00-08:00</published>
        <updated>2010-01-21T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Feeds/PubSubHubbub/real-time/stats/who-implemented-pubsubhubbub</id>
        <content type="html">&lt;p&gt;Exactly like &lt;a href=&quot;http://blog.superfeedr.com/Feeds/PubSubHubbub/real-time/stats/who-pubsubhubbub/&quot;&gt;last month&lt;/a&gt;, here is a &lt;em&gt;list of domains for which we have callback urls&lt;/em&gt; : &lt;strong&gt;they implemented PubSubHubbub&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s start with the new kids in the room, who were not in the list last month, again, in absolutely no particular order: &lt;br /&gt;
- &lt;a href=&quot;http://www.netvibes.com/&quot;&gt;netvibes&lt;/a&gt;&lt;br /&gt;
- &lt;a href=&quot;http://www.tailsweep.com/&quot;&gt;tailsweep.com&lt;/a&gt;&lt;br /&gt;
- &lt;a href=&quot;http://rss2twitter.com/&quot;&gt;rss2twitter&lt;/a&gt;&lt;br /&gt;
- &lt;a href=&quot;http://fliptop-inc.com/&quot;&gt;fliptop-inc.com&lt;/a&gt;&lt;br /&gt;
- &lt;a href=&quot;http://geowhy.org/&quot;&gt;geowhy.org&lt;/a&gt;&lt;br /&gt;
- &lt;a href=&quot;http://sfr.fr&quot;&gt;sfr.fr&lt;/a&gt;&lt;br /&gt;
- &lt;a href=&quot;http://viewsflow.com&quot;&gt;viewsflow.com&lt;/a&gt;&lt;br /&gt;
- &lt;a href=&quot;http://chitthajagat.in&quot;&gt;chitthajagat.in&lt;/a&gt;&lt;br /&gt;
- &lt;a href=&quot;http://tbablogs.com&quot;&gt;tbablogs.com&lt;/a&gt;&lt;br /&gt;
- &lt;a href=&quot;http://www.webwag.com/startup/&quot;&gt;webwag.com&lt;/a&gt;&lt;br /&gt;
- &lt;a href=&quot;http://nababu.org&quot;&gt;nababu.org&lt;/a&gt;&lt;br /&gt;
- &lt;a href=&quot;http://pitchfork.com/&quot;&gt;pitchfork.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Obviously, all the &lt;a href=&quot;http://blog.superfeedr.com/Feeds/PubSubHubbub/real-time/stats/who-pubsubhubbub/&quot;&gt;big guys from last time&lt;/a&gt; are still here :)&lt;/p&gt;
&lt;p&gt;In total, we now have 177 different domains with callback urls. This is very exciting!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Publisher Callback Extension to PubSubHubbub</title>
        
        <category term="PubSubHubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Spec" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Extension" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Extension/PubSubHubbub/Spec/publisher-callback-extension"/>
        <published>2010-01-20T00:00:00-08:00</published>
        <updated>2010-01-20T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Extension/PubSubHubbub/Spec/publisher-callback-extension</id>
        <content type="html">&lt;p&gt;Superfeedr now hosts &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;several hubs&lt;/a&gt;. We had discussion with a lot of data publishers, including blog platforms, but also social network and regular &amp;#8220;media&amp;#8221; sites.&lt;/p&gt;
&lt;p&gt;All of the people with whom we talked were &lt;strong&gt;excited by real-time feeds&lt;/strong&gt; and most of them see &lt;strong&gt;PubSubHubbub&lt;/strong&gt; as a good way for them to rely less on polling and actively push their data toward subscribers. However, a lot of them &lt;em&gt;raised the concern that the protocol was a little too blind&lt;/em&gt; for them. They want to have a certain visibility on who (the callback urls) subscribed to what (the feed urls).&lt;/p&gt;
&lt;p&gt;The concern goes from regular logging and backup of the subscriptions, to spam control or even paid-subscription.&lt;/p&gt;
&lt;p&gt;The following scenario scared a lot of the media sites we talked to: we all know that a lot of spam sites crawl and &amp;#8216;steal&amp;#8217; content from them. They put &lt;del&gt;a lot of&lt;/del&gt; ads and usually use black hat &lt;span class=&quot;caps&quot;&gt;SEO&lt;/span&gt; to obtain better rankings in the search engines. PubSubHubbub makes the spammer&amp;#8217;s life easier because they don&amp;#8217;t even have to poll for the data anymore. There are several techniques for publishers to filter spammers when they poll (IP filtering&amp;#8230; etc), but they don&amp;#8217;t apply to PubSubHubbub since the publisher is &lt;em&gt;blind&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Obviously &lt;strong&gt;this is a legal matter more than a technical matter&lt;/strong&gt;, but there is no reason either to provide spammers with a tool which would make that easier for them (specially since it&amp;#8217;s not always easy to enforce copyright internationally).&lt;/p&gt;
&lt;p&gt;Another use case is to allow subscriptions from certain feeds only. Take our &lt;a href=&quot;http://tumblr.com&quot;&gt;Tumblr hub&lt;/a&gt; as an example. We can only allow subscriptions for feeds that are on Tumblr. The callback mechanism can help us query Tumblr to make sure they actually host a given blog (when the blog uses a custom domain, it&amp;#8217;s not always easy to tell).&lt;/p&gt;
&lt;p&gt;We &lt;a href=&quot;http://code.google.com/p/pubsubhubbub/wiki/AcceptingSubscriptionForPublishers&quot;&gt;published the proposal&lt;/a&gt; for this (optional!) extension, we&amp;#8217;d love to have feedback from the community. Obviously this is a draft, which means that it &lt;span class=&quot;caps&quot;&gt;NEEDS&lt;/span&gt; more work :)&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>XML-RPC Ping to PubSubHubbub</title>
        
        <category term="XML-RPC" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Ping" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="PubSubHubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="XMPP" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Ping/PubSubHubbub/Real-time/XML-RPC/XMPP/XMLRPC-Ping-to-PubSubHubbub"/>
        <published>2010-01-13T00:00:00-08:00</published>
        <updated>2010-01-13T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Ping/PubSubHubbub/Real-time/XML-RPC/XMPP/XMLRPC-Ping-to-PubSubHubbub</id>
        <content type="html">&lt;p&gt;Slow blogging these days, but we&amp;#8217;re still (more than ever!) crushing it :) &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;RPC&lt;/span&gt; ping&lt;/strong&gt; is the grand father of all ping mechanisms for feeds and blogs. There are a few famous ping servers, including &lt;a href=&quot;http://www.google.com/help/blogsearch/pinging_API.html&amp;#39;s&quot;&gt;Google&lt;/a&gt; or &lt;a href=&quot;http://pingomatic.com/&quot;&gt;Ping-o-matic&lt;/a&gt; from &lt;a href=&quot;http://automattic.com/&quot;&gt;Automattic&lt;/a&gt;. Unfortunately, the lack of &amp;#8220;subscription&amp;#8221; have made this ping servers &lt;strong&gt;a nest for spammers&lt;/strong&gt;. Check the &lt;a href=&quot;http://rpc.weblogs.com/changes.xml&quot;&gt;changes.xml&lt;/a&gt; files to see how many notifications are spam vs. legit. Sad :(.&lt;/p&gt;
&lt;p&gt;Yet, &lt;strong&gt;many publishers have implemented this protocol&lt;/strong&gt;, and we decided that there was no reason to leave this people on side, so we mapped this protocol into &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;PubSubHubbub&lt;/a&gt; so if people subscribe to your feed and you ping us, we will take that ping into account and send them the update in real-time!&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re a &lt;a href=&quot;http://superfeedr.com/publisher&quot;&gt;publisher&lt;/a&gt; and if you have implemented the ping protocol, then, the next step for you have a PubSubHubbub hub is just to &lt;a href=&quot;http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.2.html#discovery&quot;&gt;add the discovery xml&lt;/a&gt; into your feeds and let me know so I can plug your feeds to our hub :) It shouldn&amp;#8217;t take more than a few minutes on either side!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Scaling Superfeedr</title>
        
        <category term="Superfeedr" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="lateness" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="scaling" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Superfeedr/lateness/scaling/scaling-superfeedr"/>
        <published>2010-01-06T00:00:00-08:00</published>
        <updated>2010-01-06T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Superfeedr/lateness/scaling/scaling-superfeedr</id>
        <content type="html">&lt;p&gt;I&amp;#8217;d like to start this post by &lt;strong&gt;wishing everybody a wonderful 2010 year, and a great 2nd decade of this millennium&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We will remember these early days are pretty hectic, here at Superfeedr. As a matter of facts &lt;em&gt;our users keep feeding us with more and more feeds&lt;/em&gt; (+20% in a week!). It&amp;#8217;s great, except that it &lt;strong&gt;makes little issues much bigger&lt;/strong&gt;. And we&amp;#8217;re currently fighting hard (like 16hours a day) to improve our scheduling algorithm.&lt;/p&gt;
&lt;p&gt;The difficulty that we have is that we need to deal with a lot of pings, telling us that a given feed has been updated. Technically, at the moment when we receive a ping, we need to fetch the feed and push that to our subscribers, which means that &lt;em&gt;we&amp;#8217;re already late to deal with this feed&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So, at any time, we know &lt;em&gt;how many feeds are late&lt;/em&gt;. Also, we need to fetch all of our feeds at least every 15 minutes, which roughly tells us &lt;em&gt;how late we are on average for each feed&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Right now, we&amp;#8217;re at about 10% of late feeds, which means that, on average, we&amp;#8217;re 1.5 minutes late on pings. Yes, it&amp;#8217;s much higher than acceptable and we&amp;#8217;re working on that &amp;#8211; but it reached 50% earlier today :( -&lt;/p&gt;
&lt;p&gt;Contrary to many services out there, Superfeedr has to scale &amp;#8220;internally&amp;#8221;. Most of web apps and web services usually work like this :&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;A user sends a query&lt;/li&gt;
	&lt;li&gt;the application processes that query&lt;/li&gt;
	&lt;li&gt;the application returns the response.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&amp;#8217;s not always easy to scale all the time, but at least &lt;strong&gt;it&amp;#8217;s a fairly known science&lt;/strong&gt;. Adding cache to skip the 2nd step is the most obvious thing and it can do miracles :)&lt;/p&gt;
&lt;p&gt;Unfortunately for us, that is not how Superfeedr works. Of course, like I mentioned we deal with incoming pings, but we also have to deal with polling for a lot of feeds (even the pinged feeds, as a failover), which means that as opposed to almost every web service out there, &lt;strong&gt;we do not act upon user input&lt;/strong&gt;. The good news is that we can probably have a bigger query &amp;#8594; response time. The bad news is that caching&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; is useless!&lt;/p&gt;
&lt;p&gt;As a matter of fact, our biggest problem is to &lt;strong&gt;distribute all our data-processing smoothly and evenly across our whole infrastructure&lt;/strong&gt; so that we always have a capacity utilization of 100%. And that&amp;#8217;s what I&amp;#8217;ll be spending the next hours and days on :)&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt; And caching is evil for real-time stuff :)&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Feedoor and Superfeedr</title>
        
        <category term="PubSubHubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="use-case" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="feedoor" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="API" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/API/Perl/PubSubHubbub/feedoor/use-case/feedoor-and-superfeedr"/>
        <published>2009-12-29T00:00:00-08:00</published>
        <updated>2009-12-29T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/API/Perl/PubSubHubbub/feedoor/use-case/feedoor-and-superfeedr</id>
        <content type="html">&lt;p&gt;Earlier this month &lt;a href=&quot;http://twitter.com/Mamod&quot;&gt;Mamod&lt;/a&gt; sent me a notice saying that they enabled real-time feeds management to any website or blog (See &lt;a href=&quot;http://arabcrunch.com/2009/12/feedoor-enables-real-time-feeds-management-to-any-website-or-blog.html&quot;&gt;Arabcrunch&lt;/a&gt;) used through &lt;a href=&quot;http://www.feedoor.com/&quot;&gt;Feedoor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mamod was kind enough to create this great presentation on how he integrated &lt;a href=&quot;http://superfeedr.com/&quot;&gt;Superfeedr&lt;/a&gt; into Feedoor :&lt;/p&gt;
&lt;div style=&quot;width:425px;text-align:left&quot; id=&quot;__ss_2705362&quot;&gt;&lt;a style=&quot;font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/mamod/superfeedr-integration-with-feedoor2&quot; title=&quot;Superfeedr Integration With Feedoor&quot;&gt;Superfeedr Integration With Feedoor&lt;/a&gt;&lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=superfeedrintegrationwithfeedoor2-091212111230-phpapp02&amp;stripped_title=superfeedr-integration-with-feedoor2&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=superfeedrintegrationwithfeedoor2-091212111230-phpapp02&amp;stripped_title=superfeedr-integration-with-feedoor2&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style=&quot;font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;&quot;&gt;View more &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;http://www.slideshare.net/mamod&quot;&gt;mamod&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;He also sent me the following :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Our major concern was to make all bloggers able to &lt;strong&gt;enable real-time support for their feeds&lt;/strong&gt;, and Superfeedr helped us to achieve that.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;In the beginning we supported &lt;a href=&quot;http://rsscloud.org/&quot;&gt;RssCloud&lt;/a&gt; protocol and then &lt;a href=&quot;http://code.google.com/p/pubsubhubbub/&quot;&gt;Pubsubhubbub&lt;/a&gt;, these protocols are the most well known protocols in the world of real-time, however, &lt;strong&gt;the problem lies in the lack of real-time protocols in most feeds&lt;/strong&gt;, which means that we need to find a smart solution to overcome this problem. The solution is to poll feeds with no real-time protocol periodically and intelligently, and then match with the previous content, if there is new content we ping feed services and subscribers, this is the only way we can achieve as close as possible to real-time for feeds with no real-time protocols. For those who do not know how difficult this process is,* the process of polling thousands of feeds several times a day needs lots of resources and planning, it&amp;#8217;s simply a very crazy task*. Luckily we found a crazy service which already do that exact thing we needed and surprisingly they do it right and efficiently, &lt;strong&gt;Superfeedr, they&amp;#8217;re so crazy&lt;/strong&gt; but glad we found them. Now when ever we manage a feed with no real-time protocol we send it to Superfeedr and &lt;strong&gt;they do the polling and the checking on our behalf&lt;/strong&gt;, and all we need to do is waiting for their pings :)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;As for how to integrate Superfeedr in our service, we used &lt;a href=&quot;http://superfeedr.com/documentation#pubsubhubbub&quot;&gt;their &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;, it was &lt;strong&gt;very easy&lt;/strong&gt; and just like dealing with Pubsubhubbub real-time protocol as &lt;strong&gt;they use the same specifications&lt;/strong&gt;, they are a big hub that supports all real-time protocols and smartly poll feeds frequently.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here is what Feedoor used to integrate with Superfeedr :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Superfeedr &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;: &lt;a href=&quot;http://superfeedr.com/documentation#pubsubhubbub&quot;&gt;&lt;em&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Programming Language Used: &lt;em&gt;Perl&lt;/em&gt;&lt;/li&gt;
	&lt;li&gt;Modules and Libraries: &lt;em&gt;In house&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Who Implemented PubSubHubbub</title>
        
        <category term="PubSubHubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Feeds" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="stats" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Feeds/PubSubHubbub/real-time/stats/who-pubsubhubbub"/>
        <published>2009-12-28T00:00:00-08:00</published>
        <updated>2009-12-28T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Feeds/PubSubHubbub/real-time/stats/who-pubsubhubbub</id>
        <content type="html">&lt;p&gt;&lt;a href=&quot;http://code.google.com/p/pubsubhubbub/&quot;&gt;PubSubHubbub&lt;/a&gt; is now more or less &lt;em&gt;6 months old&lt;/em&gt;. We have daily talks with people who wonder whether they should implement it in their feeds. &lt;br /&gt;
Obviously, it matters for publishers to know who will subscribe to their feeds if &lt;a href=&quot;http://superfeedr.com/publisher&quot;&gt;they use a hub&lt;/a&gt; for their feeds.&lt;/p&gt;
&lt;p&gt;Our monthly list market numbers show a pretty interesting image in terms of how many feeds are PubSubHubub enabled. Here is some more &amp;#8220;qualitative&amp;#8221; data to assess who implemented the &amp;#8220;subscriber&amp;#8221; side of the protocol (&lt;a href=&quot;http://blog.superfeedr.com/API/pubsubhubbub/getting-started-with-pubsubhubbub/&quot;&gt;get started with PubSubHubbub&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Since we now host several official (&lt;a href=&quot;http://posterous.superfeedr.com/&quot;&gt;Posterous&lt;/a&gt;, &lt;a href=&quot;http://tumblr.superfeedr.com/&quot;&gt;Tumblr&lt;/a&gt;, &lt;a href=&quot;http://backtype.superfeedr.com/&quot;&gt;Backtype&lt;/a&gt;, &lt;a href=&quot;http://enjoysthings.superfeedr.com/&quot;&gt;enjoysthings&lt;/a&gt;&amp;#8230; more to come!) hubs and a few unofficial (&lt;a href=&quot;http://identica.superfeedr.com/&quot;&gt;identica&lt;/a&gt;, &lt;a href=&quot;http://wordpress.superfeedr.com/&quot;&gt;wordpress&lt;/a&gt;)&amp;#8230; We can then know quite easily which services have subscribed to these hubs for some feeds published by these guys.&lt;/p&gt;
&lt;p&gt;In no particular order, here are the main services for which we have callbacks :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.dailyradar.com/&quot;&gt;DailyRadar&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://twitterfeed.com/&quot;&gt;Twitterfeed&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://interspring.com/enter&quot;&gt;Interspring&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://push-bot.appspot.com/&quot;&gt;PushBot&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://kingofeed.com.br/&quot;&gt;Kingofeed&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://friendfeed.com/&quot;&gt;Friendfeed&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://rssforward.com/&quot;&gt;RSSForward&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://cliqset.com/&quot;&gt;Cliqset&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://showhype.com/&quot;&gt;Showhype&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.rssinclude.com/&quot;&gt;RSSInclude&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://favit.com/&quot;&gt;Favit&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.rssmicro.com/&quot;&gt;RSSMicro&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.livedoor.com/&quot;&gt;Livedoor&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://ballhype.com/&quot;&gt;Ballhype&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.lazyfeed.com/&quot;&gt;Lazyfeed&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://superfeedr.com/&quot;&gt;Superfeedr&lt;/a&gt; (obviously :))&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have &lt;strong&gt;about 200 different domains with registered callbacks&lt;/strong&gt;, but we couldn&amp;#8217;t really identify the service to which they relate. Also, these numbers do not take the subscriptions to &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;Superfeedr&amp;#8217;s hub&lt;/a&gt; into account. Just the hubs we&amp;#8217;re hosting.&lt;/p&gt;
&lt;p&gt;There may be a few other (please tell us in the comments), but we can&amp;#8217;t confirm that they subscribed to any of the hubs we host though.&lt;/p&gt;
&lt;p&gt;I tend to think that the &lt;strong&gt;number of services who subscribes matters more than the number of publishers&lt;/strong&gt; from now on. Let me know your thoughts on that.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Distributed and Federated Social Networks</title>
        
        <category term="social-networks" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="federation" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="XMPP" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/XMPP/federation/pubsubhubbub/social-networks/distributed-social-networks"/>
        <published>2009-12-21T00:00:00-08:00</published>
        <updated>2009-12-21T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/XMPP/federation/pubsubhubbub/social-networks/distributed-social-networks</id>
        <content type="html">&lt;p&gt;There &lt;a href=&quot;http://staynalive.com/articles/2009/12/19/developers-its-time-to-open-up-twitters-api/&quot;&gt;is&lt;/a&gt; &lt;a href=&quot;http://code-bear.com/bearlog/2009/12/20/responding-to-jesses-call-to-open-twitters-api/&quot;&gt;a lot&lt;/a&gt; of debate around on &lt;a href=&quot;http://groups.google.com/group/opentwitter&quot;&gt;OpenTwitter&lt;/a&gt;, &lt;a href=&quot;http://bit.ly/4voQKK&quot;&gt;OpenFriendFeed&lt;/a&gt; &lt;a href=&quot;http://bit.ly/8J9SIv&quot;&gt;OpenFacebook&lt;/a&gt;.  these days. The &lt;a href=&quot;http://www.avc.com/a_vc/2009/12/open-apis-and-open-standards.html&quot;&gt;de-facto standard&lt;/a&gt; which is now Twitter&amp;#8217;s &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; is a good news. Yet, social Networks have 2 big features : &lt;strong&gt;publish content&lt;/strong&gt; (it seems that Twitter&amp;#8217;s &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; is the reference now), and &lt;strong&gt;consume content&lt;/strong&gt; from your friends. This second part seems much harder and I think &lt;strong&gt;PubSubHubbub&lt;/strong&gt; and &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt;&lt;/strong&gt; can provide this &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Whatever the social network, user profiles usually have a link (Atom or &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;) which represents a user&amp;#8217;s stream of activities. Whether it&amp;#8217;s &lt;a href=&quot;http://www.flickr.com/photos/juliengenestoux&quot;&gt;Flickr&lt;/a&gt;, &lt;a href=&quot;http://delicious.com/julien51&quot;&gt;Delicious&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/julien51&quot;&gt;Twitter&lt;/a&gt;, or even your blog (yes, it&amp;#8217;s a social network in a way), &lt;em&gt;all our online activities are represented as feeds&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The next step is to make these feeds &amp;#8220;real-time&amp;#8221; so that the consuming applications shouldn&amp;#8217;t need to poll thousands of feeds or services. &lt;em&gt;To consume my friends information, I shouldn&amp;#8217;t even need to be part of the network on which they publish&lt;/em&gt;. &lt;strong&gt;PubSubHubbub enables that&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I like consuming my friend&amp;#8217;s feed via Facebook. Yet, a lot of my friend&amp;#8217;s content is not there : their tweets, the pictures they post on Flickr, etc&amp;#8230; and some of my friends are not even on Facebook.&lt;/p&gt;
&lt;p&gt;I wish somebody (&lt;a href=&quot;http://tweetdeck.com/&quot;&gt;Tweetdeck&lt;/a&gt;, &lt;a href=&quot;http://seesmic.com/&quot;&gt;Seesmic&lt;/a&gt;, &lt;a href=&quot;http://brizzly.com/&quot;&gt;Brizzly&lt;/a&gt;&amp;#8230; can you hear me?) would have a &lt;strong&gt;built-in PubSubHubbub subscriber&lt;/strong&gt;. Then they would allow me to paste one of my friend&amp;#8217;s profile page on &lt;a href=&quot;http://www.last.fm/user/julien51&quot;&gt;Last.fm&lt;/a&gt; or Foursquare (or allow me to select directly pages on specific services). From that page, they would &lt;em&gt;auto-discover the feed&lt;/em&gt;, and &lt;em&gt;then its hub and subscribe to it&lt;/em&gt;. Finally, when my friends update their social network (provided that this one uses PubSubHubbub to make its feeds real-time, but &lt;a href=&quot;http://superfeedr.com/publisher&quot;&gt;we can help&lt;/a&gt;), I would receive instantly the update into my &lt;strong&gt;Social Network consuming app&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;When publishing my content, I shouldn&amp;#8217;t have to publish it on 36 different services just to make sure all my friends will get it. It should go wherever my friends will consume it!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Be my guest</title>
        
        <category term="blog" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="meta" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="superfeedr" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="ecosystem" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/blog/ecosystem/meta/superfeedr/be-my-guest"/>
        <published>2009-12-19T00:00:00-08:00</published>
        <updated>2009-12-19T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/blog/ecosystem/meta/superfeedr/be-my-guest</id>
        <content type="html">&lt;p&gt;We use &lt;a href=&quot;http://github.com/mojombo/jekyll&quot;&gt;Jekyll&lt;/a&gt; as our blog engine, and we use &lt;a href=&quot;http://github.com&quot;&gt;github&lt;/a&gt; to host said blog. As a matter of fact, our blog is a &lt;strong&gt;regular git repository&lt;/strong&gt;. This as several consequences, including the fact that it&amp;#8217;s quite easy for us to add &amp;#8220;remote&amp;#8221; contributions. If you want to write about Superfeedr related stuff : your experience with Superfeedr, but also the technologies that we use (&lt;a href=&quot;http://www.google.com/search?q=xmpp+site:blog.superfeedr.com&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;http://www.google.com/search?q=PubSubHubbub+site:blog.superfeedr.com&quot;&gt;PubSubHubbub&lt;/a&gt;, &lt;a href=&quot;http://www.google.com/search?q=chef+site:blog.superfeedr.com&quot;&gt;Chef&lt;/a&gt;, &lt;a href=&quot;http://www.google.com/search?q=collectd+site:blog.superfeedr.com&quot;&gt;Collectd&lt;/a&gt;&amp;#8230;), or even your &lt;em&gt;thoughts on the real-time web&lt;/em&gt;; this space is yours.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s actually quite easy, you just have to &lt;a href=&quot;http://github.com/superfeedr/superfeedr.github.com&quot;&gt;fork our blog&amp;#8217;s&lt;/a&gt; repository, write your own blog post in the &lt;code&gt;_post&lt;/code&gt; directory.&lt;/p&gt;
&lt;p&gt;The syntax is fairly simple : name a file &lt;code&gt;yyyy-mm-dd-title-of-your-post.textile&lt;/code&gt;, then, add your post content. Make sure you follow the &amp;#8220;Textile syntax&amp;#8221;: if you want to make your text &lt;strong&gt;bold&lt;/strong&gt;, &lt;em&gt;italic&lt;/em&gt;, add &lt;a href=&quot;http://&quot;&gt;links&lt;/a&gt; or even titles&amp;#8230; Finally, add a top part to the file like that:&lt;/p&gt;
&lt;script src=&quot;http://gist.github.com/313462.js?file=gistfile1.txt&quot;&gt;&lt;/script&gt;&lt;p&gt;When you&amp;#8217;re done, you should test the layout, by using the &lt;a href=&quot;http://github.com/mojombo/jekyll&quot;&gt;Jekyll&lt;/a&gt; :&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;a href=&quot;http://wiki.github.com/mojombo/jekyll/install&quot;&gt;Install the gem&lt;/a&gt; (if you have ruby installed)&lt;/li&gt;
	&lt;li&gt;Type &lt;code&gt;jekyll --server&lt;/code&gt; in your fork of the &lt;a href=&quot;http://github.com/superfeedr/superfeedr.github.com&quot;&gt;blog&amp;#8217;s source&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Finally, do a pull-request. If we like it (we will try to keep our censorship to a minimum level, but we need to make sure your posts aren&amp;#8217;t too &lt;em&gt;self-advertising&lt;/em&gt; and are &lt;em&gt;still related&lt;/em&gt; to Superfeedr), we&amp;#8217;ll publish it!.&lt;/p&gt;
&lt;p&gt;Done! This place is now yours too :)&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Feediscovery</title>
        
        <category term="api" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="feeds" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="discovery" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="feediscovery" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/api/discovery/feediscovery/feeds/feediscovery"/>
        <published>2009-12-16T00:00:00-08:00</published>
        <updated>2009-12-16T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/api/discovery/feediscovery/feeds/feediscovery</id>
        <content type="html">&lt;p&gt;At &lt;a href=&quot;http://superfeedr.com&quot;&gt;Superfeedr&lt;/a&gt;, we believe &lt;em&gt;we have to do one thing only in the best way it can be done&lt;/em&gt;: &lt;strong&gt;make feeds real-time&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;There are a ton of small feature requests that our users ask for and that aren&amp;#8217;t part of this grand scheme. One of the most common ones is &lt;strong&gt;feed discovery&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A lot of apps that are built using Superfeedr allow their users to type in any site url. Since Superfeedr only deals with feeds, it means that these apps have to&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Download this specific page,&lt;/li&gt;
	&lt;li&gt;Parse the &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;Extract the &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; tags to get the corresponding feed(s) urls.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&amp;#8217;s definitely &lt;strong&gt;not a very hard thing to do&lt;/strong&gt;, yet, there is* absolutely no reason that everybody should write the same code over and over* for that basic purpose. Obviously, you could use great libraries such as &lt;a href=&quot;http://axiombox.com/feedbag&quot;&gt;feedbag&lt;/a&gt;, yet, these libraries are language-centric (Ruby in this case).&lt;/p&gt;
&lt;p&gt;We built &lt;a href=&quot;http://feediscovery.appspot.com/&quot;&gt;feediscovery&lt;/a&gt; : a simple &amp;#8211; in the cloud! &amp;#8211; &lt;strong&gt;feed discovery &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/strong&gt;. To use it, send a &lt;code&gt;GET&lt;/code&gt; request to http://feediscovery.appspot.com/ with the &lt;code&gt;url&lt;/code&gt; parameter from which you&amp;#8217;d like to extract feeds from. The app should return a small json string of the feed(s) information (href, title, rel, type).&lt;/p&gt;
&lt;h4&gt;Example:&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;GET http://feediscovery.appspot.com/?url=http://blog.superfeedr.com&lt;/code&gt;&lt;br /&gt;
&amp;#8594; &lt;code&gt;{&quot;href&quot;:&quot;http://blog.superfeedr.com/atom.xml&quot;,&quot;title&quot;:&quot;Superfeedr' thoughts&quot;,&quot;rel&quot;:&quot;alternate&quot;,&quot;type&quot;:&quot;application/atom+xml&quot;}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;We truly believe &lt;strong&gt;web apps are soon to become the next base-component&lt;/strong&gt;, and will, in many cases, replace libraries, gems, packages, modules.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>How we built Analytics</title>
        
        <category term="analytics" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="publisher" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="tutorial" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="mongodb" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/analytics/mongodb/publisher/pubsubhubbub/tutorial/how-we-built-analytics"/>
        <published>2009-12-15T00:00:00-08:00</published>
        <updated>2009-12-15T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/analytics/mongodb/publisher/pubsubhubbub/tutorial/how-we-built-analytics</id>
        <content type="html">&lt;p&gt;We weren&amp;#8217;t quite sure how to build &lt;a href=&quot;http://blog.superfeedr.com/Real-time/analytics/pubsubhubbub/analytics-launched&quot;&gt;these analytics&lt;/a&gt;. We slowly established a set of requirements and constraints&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Zero performance impact&lt;/li&gt;
	&lt;li&gt;Fully decoupled from the current infrastructure&lt;/li&gt;
	&lt;li&gt;Results at most hourly&lt;/li&gt;
	&lt;li&gt;Data is more important than graphs&lt;/li&gt;
	&lt;li&gt;Easily-extensible, in case we want to measure more things&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Collecting&lt;/h3&gt;
&lt;p&gt;There are 2 ways to collect data : on the fly, when things happen, or by just collecting stuff in the database. Since the top requirement was to have 0 performance impact, the most obvious way was to have a &lt;strong&gt;&amp;#8220;maintenance&amp;#8221; script&lt;/strong&gt; that runs forever and measures what needs to be &lt;strong&gt;measured in a loop&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We &lt;strong&gt;added a slave server to our main MySQL&lt;/strong&gt; server(s). We use this server for the analytics. It&amp;#8217;s a regular slave because, obviously doing analytics is about &lt;em&gt;reads&lt;/em&gt;, not &lt;em&gt;writes&lt;/em&gt;. With that, we can guarantee that the performance impact on the current is zero. If the analytics dies, nothing else will be impacted.&lt;/p&gt;
&lt;p&gt;The scripts runs at &lt;strong&gt;regular intervals so that it takes several set of measures&lt;/strong&gt; by doing queries on the slave database.&lt;/p&gt;
&lt;h3&gt;Storage&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;http://mongo-db.appspot.com/static/images/logo-mongodb-onwhite.png&quot; style=&quot;margin: 20px;width: 40%; float:right;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Since we need to have an &lt;strong&gt;extensible schema&lt;/strong&gt;, we &lt;strong&gt;eliminated anything with a &amp;#8220;fixed&amp;#8221; schema&lt;/strong&gt;, like MySQL. Additionally, analytics can really be &lt;strong&gt;regarded as documents&lt;/strong&gt;, which naively lead us look at Document stores. We chose &lt;a href=&quot;http://www.mongodb.org/&quot;&gt;MongoDB&lt;/a&gt;. It&amp;#8217;s probably the most actively maintained of its category and Ruby has a pretty neat library: &lt;a href=&quot;http://mongomapper.com/&quot;&gt;MongoMapper&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It also has some &lt;em&gt;MapReduce functionalities&lt;/em&gt;, which will probably be useful when start having a lot of data and we want to make complex analysis of it. Unfortunately, there is no event-machine driver for it, but &lt;strong&gt;it seems that inserts return immediately&lt;/strong&gt;, which shouldn&amp;#8217;t be too bad in terms of performance.&lt;/p&gt;
&lt;h3&gt;Querying&lt;/h3&gt;
&lt;p&gt;Right now we don&amp;#8217;t have a lot of data, so the regular MongoMapper interface does a pretty good job. Typically, here is how we process results : &lt;strong&gt;we get all the data for a given time query in a given time-frame&lt;/strong&gt;, like a day. We &lt;strong&gt;then so some kind of Map-Reduce&lt;/strong&gt; to get results on an hourly basis : we split the result set by hours (map), compute averages/max/min (reduce) and then return the final result set.&lt;/p&gt;
&lt;p&gt;When we&amp;#8217;ll start computing more complex stuff, we&amp;#8217;ll probably need to use Mongo&amp;#8217;s capabilities for MapReduce, but right now we&amp;#8217;re &amp;#8220;emulating&amp;#8221; that behavior from within a Ruby script.&lt;/p&gt;
&lt;p&gt;Since the data is not expected to be updated more than hourly, &lt;strong&gt;we also cache the results in our Memcache server&lt;/strong&gt;. Another option that we&amp;#8217;re evaluating is storing this as actual documents, so we have the raw data (collected from MySQL), as well as the computed results.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;All the results are returned in a Json format&lt;/strong&gt;, which is pretty convenient for direct export!&lt;/p&gt;
&lt;h3&gt;Displaying&lt;/h3&gt;
&lt;p&gt;We did some research on various solutions to display the data. The first choice we had to make was :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;query some service that would build the graphs for us (like &lt;a href=&quot;http://code.google.com/apis/chart/&quot;&gt;Google Graph&lt;/a&gt;)&lt;/li&gt;
	&lt;li&gt;or build the graphs by ourselves.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;http://a3.twimg.com/profile_background_images/3310603/Raphaël-white-bg.png&quot; style=&quot;margin: 20px;width: 20%; float:left;&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
The first solution initially looked sexier, but then we couldn&amp;#8217;t find the flexibility we wanted, and since we export results as Json, we thought* that anyone could actually plug the data we generate for them into the 3rd party* app they wanted.&lt;/p&gt;
&lt;p&gt;The second decision was for the &amp;#8220;type&amp;#8221; of graphs : flash? images? Usually the first one are more interactive, but they require the use of flash :/ Lucklily we found &lt;a href=&quot;http://raphaeljs.com/&quot;&gt;Rapheal.js&lt;/a&gt; and its &lt;a href=&quot;http://g.raphaeljs.com/&quot;&gt;charting library&lt;/a&gt; which allows us to generate nice looking interactive graphs by using the browser&amp;#8217;s capabilities to deal with &lt;span class=&quot;caps&quot;&gt;SVG&lt;/span&gt; and other open formats! We got our winner :) Feel free to look at the source code of the graphs page to see more&amp;#8230; Hopefully I can find the time soon to &amp;#8220;bundle&amp;#8221; that in something nice on github.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Tumblr has a hub</title>
        
        <category term="Tumblr" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="publisher" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Tumblr/publisher/pubsubhubbub/tumblr-has-a-hub"/>
        <published>2009-12-12T00:00:00-08:00</published>
        <updated>2009-12-12T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Tumblr/publisher/pubsubhubbub/tumblr-has-a-hub</id>
        <content type="html">&lt;p&gt;&lt;img src=&quot;/images/tumblr.png&quot; style=&quot;float:left; margin: 10px;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There is &lt;em&gt;not a day where the real-time web isn&amp;#8217;t growing&lt;/em&gt;. It&amp;#8217;s &lt;strong&gt;now time to change how our web services consume information from each other&lt;/strong&gt; and we&amp;#8217;re quite proud to say that Superfeedr is helping services like Tumblr pave the way.&lt;/p&gt;
&lt;p&gt;Today, we&amp;#8217;re announcing a &lt;a href=&quot;http://tumblr.superfeedr.com/&quot;&gt;hub for Tumblr&lt;/a&gt;, one of your favorite blogging platform is publishing their feeds as &lt;a href=&quot;http://code.google.com/p/pubsubhubbub/&quot;&gt;PubSubHubbub&lt;/a&gt; via &lt;a href=&quot;http://superfeedr.com/&quot;&gt;Superfeedr&lt;/a&gt;. I was very impressed when I met &lt;a href=&quot;http://www.davidslog.com/&quot;&gt;David&lt;/a&gt; and &lt;a href=&quot;http://john.tumblr.com/&quot;&gt;John&lt;/a&gt; (the &lt;a href=&quot;http://betaworks.com/&quot;&gt;Betaworks&lt;/a&gt; gang is awesome!) : they were both aware and excited about publishing their content in real-time. We&amp;#8217;ve been able to setup their hub in a very short timeframe, and it shows how that matters to them.&lt;/p&gt;
&lt;p&gt;They&amp;#8217;re joining our hub family with &lt;a href=&quot;http://posterous.superfeedr.com/&quot;&gt;Posterous&lt;/a&gt;, &lt;a href=&quot;http://backtype.superfeedr.com/&quot;&gt;Backtype&lt;/a&gt;, &lt;a href=&quot;http://wordpress.superfeedr.com/&quot;&gt;Wordpress&lt;/a&gt; (unofficial), &lt;a href=&quot;http://identica.superfeedr.com/&quot;&gt;Identica&lt;/a&gt; (unofficial) and a few other ones on which we&amp;#8217;re working. If you want one of your app : &lt;a href=&quot;http://superfeedr.com/publisher&quot;&gt;get in touch&lt;/a&gt;!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Feedburner stats for real-time web</title>
        
        <category term="Real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="analytics" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Real-time/analytics/pubsubhubbub/analytics-launched"/>
        <published>2009-12-09T00:00:00-08:00</published>
        <updated>2009-12-09T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Real-time/analytics/pubsubhubbub/analytics-launched</id>
        <content type="html">&lt;p&gt;It&amp;#8217;s been a feature request since day one (almost!), and we&amp;#8217;re rolling it out today : analytics. &lt;a href=&quot;Subscribers&quot;&gt;Subscribers&lt;/a&gt; wanted to know &lt;em&gt;how many feeds they susbcribed&lt;/em&gt; to with Superfeedr, while &lt;a href=&quot;http://superfeedr.com/publisher&quot;&gt;publishers&lt;/a&gt; wanted to &lt;em&gt;know how many feeds from them are used in real-time, as well as how many subscriptions they generated&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/feedburner-stats-for-realtime.png&quot; style=&quot;width:95%;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It is very important for publishers to know how many apps are subscribed to feeds they produce. &lt;em&gt;When you&amp;#8217;re a big media company, it matters a lot to know what content is being consumed and by who&lt;/em&gt;. That is exactly what these analytics allow them to do.&lt;/p&gt;
&lt;p&gt;Of course, &lt;del&gt;as with any decent analytics solution&lt;/del&gt; you can &lt;strong&gt;export the data&lt;/strong&gt; from these analytics, and you&amp;#8217;ll soon (when we have the data!) be able to have a &lt;strong&gt;weekly view&lt;/strong&gt;, a &lt;strong&gt;monthly view&lt;/strong&gt; and a &lt;strong&gt;yearly view&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Once more, any feedback is appreciated, &lt;strong&gt;superfeedr is your app&lt;/strong&gt;: help us make it better!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>LeWeb's Official Bloggers in RealTime</title>
        
        <category term="Real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="leweb" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="use-case" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Real-time/leweb/use-case/LeWeb-blog-posts-in-realtime"/>
        <published>2009-12-08T00:00:00-08:00</published>
        <updated>2009-12-08T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Real-time/leweb/use-case/LeWeb-blog-posts-in-realtime</id>
        <content type="html">&lt;p&gt;&lt;img src=&quot;http://www.leweb.net/sites/all/themes/leweb-leweb/logo.png&quot; style=&quot;float:left;margin:0px 10px 10px 0px;&quot; alt=&quot;&quot; /&gt;When we&amp;#8217;ve been selected to be part of &lt;a href=&quot;http://www.leweb.net/&quot;&gt;LeWeb&amp;#8217;s competition&lt;/a&gt; this year, we thought it was a great opportunity for us to &lt;strong&gt;demo Superfeedr with a simple use case&lt;/strong&gt; : &lt;em&gt;how can we agregate all the content published by the Official Bloggers in real-time on the main LeWeb&amp;#8217;s site?&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;How-to&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;http://blog.cirtex.com/wp-content/uploads/2009/01/drupal.jpg&quot; style=&quot;float:right;margin:0px 10px 10px 0px;width:20%;&quot; alt=&quot;&quot; /&gt;LeWeb&amp;#8217;s site uses Drupal. The idea was to automatically push notifications from Superfeedr to Drupal so that whenever one of the official bloggers published an article, it is immediately linked (with a small excerpt) on the main &lt;a href=&quot;http://www.leweb.net/blogs/&quot;&gt;LeWeb site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://drupal.org/&quot;&gt;Drupal&lt;/a&gt; doesn&amp;#8217;t seem to have a PubSubHubbub subscriber library (yet?&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;). However it has an &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;RPC&lt;/span&gt; interface. The goal was then to translate PubSubHubbub notifications into &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;RPC&lt;/span&gt;. For that I created a very simple &lt;a href=&quot;http://code.google.com/appengine/&quot;&gt;Google App Engine&lt;/a&gt; application. It basically handles notifications and turn them into &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt;-&lt;span class=&quot;caps&quot;&gt;RPC&lt;/span&gt; calls. &lt;em&gt;20 lines of code.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To make it a little nicer, I &lt;strong&gt;extracted&lt;/strong&gt; a few information from the &lt;a href=&quot;http://superfeedr.com/documentation#entry_schema&quot;&gt;standard entry schema&lt;/a&gt; : author name and link, as well as categories. With the &lt;strong&gt;categories&lt;/strong&gt;, I did some filtering to make sure we only publish stories that either mention LeWeb or explictly declare that as a tag.&lt;/p&gt;
&lt;h3&gt;Result&lt;/h3&gt;
&lt;p&gt;In &lt;em&gt;less than 2 hours&lt;/em&gt; (litteraly), I was able to create a &lt;em&gt;&lt;a href=&quot;http://www.leweb.net/blogs/&quot;&gt;pretty good republishing platform&lt;/a&gt;&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;No polling at all&lt;/strong&gt; by drupal&lt;/li&gt;
	&lt;li&gt;Guarantee to have &lt;strong&gt;real-time content&lt;/strong&gt;&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Standard schema&lt;/strong&gt; that allows content &lt;strong&gt;filtering&lt;/strong&gt; and extraction of specific fields&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;LeWeb starts tomorow&lt;/strong&gt; and I can&amp;#8217;t wait to see you there! &lt;strong&gt;Stop by our booth&lt;/strong&gt; : we have stickers and a few new features to show you!&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt; If you&amp;#8217;re a Drupal/&lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt; developer, get in touch : I&amp;#8217;m sure such a module is much needed and should replace the aging &amp;#8220;feeds&amp;#8221; module.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Results of the contest</title>
        
        <category term="Real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="contest" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="rivers" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Leweb" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Leweb/Real-time/contest/rivers/results-of-the-contest"/>
        <published>2009-12-07T00:00:00-08:00</published>
        <updated>2009-12-07T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Leweb/Real-time/contest/rivers/results-of-the-contest</id>
        <content type="html">&lt;p&gt;A little over 3 weeks ago we announced &lt;a href=&quot;http://blog.superfeedr.com/API/Leweb/compp/rivers/win-a-ticket-for-leweb/&quot;&gt;a contest&lt;/a&gt; to win a free ticket for &lt;a href=&quot;http://www.leweb.net/&quot;&gt;LeWeb&lt;/a&gt;. The goal was to &lt;strong&gt;create an application that uses our &lt;a href=&quot;http://rivers.superfeedr.com:8001/&quot;&gt;Rivers&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A few apps were submitted and &lt;strong&gt;I want to thank all participants for their efforts&lt;/strong&gt;. Several hackers spent days to work on that and we&amp;#8217;re quite happy with the outcome : &lt;em&gt;several platforms, multiple languages, different technologies&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;And the winners are (in reverse order) :&lt;/p&gt;
&lt;h4&gt;#3 Superfeedrfall&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://www.rssfall.com/superfeedr/&quot;&gt;Superfeedrfall&lt;/a&gt; is a simple web interface, built with a long polling webserver written in Erlang called &lt;a href=&quot;http://github.com/jalada/Hydrometeor&quot;&gt;Hydrometeor&lt;/a&gt;. The interface shows the messages as they come as well as their source and publication date! Pretty fun and fascinating to watch :)&lt;/p&gt;
&lt;h4&gt;#1 (ex-aequo) Rss.im&amp;#8217;s stream&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://rss.im/stream/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;.im&amp;#8217;s stream&lt;/a&gt; is another app with the same purpose, but they added a few little features, like the favicon loading. This time, it&amp;#8217;s built with &lt;a href=&quot;http://gevent.org/&quot;&gt;gevent&lt;/a&gt; and &lt;a href=&quot;http://www.djangoproject.com/&quot;&gt;django&lt;/a&gt;. &lt;a href=&quot;http://bitbucket.org/denis/stream-web/&quot;&gt;It&amp;#8217;s open-source&lt;/a&gt;, so if you want to learn about the real-time web technologies, you should definitely check it out!&lt;/p&gt;
&lt;h4&gt;#1 (ex-aequo) AppNotification&amp;#8217;s iPhone app&lt;/h4&gt;
&lt;p&gt;This is a version where you can receive the rivers notifications directly on your iPhone! They use the infrastructure they built for &lt;a href=&quot;http://www.appnotifications.com/&quot;&gt;AppNotifications&lt;/a&gt; and just added a Ruby listener to the stream that converts the stream into notifications they can deal with.&lt;/p&gt;
&lt;p&gt;Luckily for us, Denis, from &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;.im is in Russia, which means that he can&amp;#8217;t really fly to Paris. As a consequence, I&amp;#8217;m quite happy to grant Fabien from AppNotifications with the free ticket to come with us at LeWeb!&lt;/p&gt;
&lt;p&gt;Again, I want to thank everyone who participated, I believe I sent an email or chatted to each of you. You did a great job : &lt;span class=&quot;caps&quot;&gt;THANK&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;YOU&lt;/span&gt;! Pleas stop by the Superfeedr booth and come see me for my demo at &lt;a href=&quot;http://www.leweb.net/startupcompetition/schedule&quot;&gt;4PM, in the demo room&lt;/a&gt;. Wish me luck!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>The Real-time Web and it's future</title>
        
        <category term="Real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="statistics" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="market" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Real-time/market/statistics/the-realtime-web-and-its-future"/>
        <published>2009-12-04T00:00:00-08:00</published>
        <updated>2009-12-04T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Real-time/market/statistics/the-realtime-web-and-its-future</id>
        <content type="html">&lt;p&gt;&lt;img src=&quot;http://www.readwriteweb.com/images/real_time_web.png&quot; style=&quot;float:left; margin:10px;&quot; alt=&quot;&quot; /&gt;Marshall have been kind enough, when he wrote the &lt;a href=&quot;http://www.readwriteweb.com/&quot;&gt;ReadWriteWeb&lt;/a&gt; &lt;a href=&quot;http://bit.ly/rtwreport&quot;&gt;report on the Real-time&lt;/a&gt; to ask for my opinion. I want to complete my thoughts as well as give a few hint on this report.&lt;br /&gt;
First : go buy the report. If you&amp;#8217;re vaguely interested in the &lt;em&gt;web-economy&lt;/em&gt; you should have done that already.&lt;/p&gt;
&lt;h3&gt;On the report itself&lt;/h3&gt;
&lt;p&gt;Newspapers are dying because of the internet. They&amp;#8217;re not fast enough to write about things. Even though blog are less affected, they have exactly the same issue. The fight between &lt;a href=&quot;http://www.readwriteweb.com/&quot;&gt;ReadWriteWeb&lt;/a&gt;, &lt;a href=&quot;http://www.techcrunch.com/&quot;&gt;Techcrunch&lt;/a&gt;, &lt;a href=&quot;http://gigaom.com/&quot;&gt;GigaOM&lt;/a&gt; or &lt;a href=&quot;http://mashable.com/&quot;&gt;Mashable&lt;/a&gt; to get exclusivity is just a proof that they can&amp;#8217;t spend a lot of time writing articles and they also need to write a lot.&lt;br /&gt;
There clearly seem to be a &lt;a href=&quot;http://trends.google.com/websites?q=techcrunch.com%2C+readwriteweb.com%2C+mashable.com%2C+gigaom.com&amp;amp;geo=all&amp;amp;date=2009&amp;amp;sort=1&quot;&gt;premium for the most frequent publisher&lt;/a&gt; (less deep though :/)&lt;/p&gt;
&lt;p&gt;On top of that, people like me (and probably you, too) have a lot of trouble catching up with all that. That is why &lt;strong&gt;reports like this really matter&lt;/strong&gt;. They bring back &lt;strong&gt;&amp;#8220;investigation&amp;#8221; journalism&lt;/strong&gt; to blog and that&amp;#8217;s great.&lt;/p&gt;
&lt;h3&gt;Real-time : the peer-to-peer architecture.&lt;/h3&gt;
&lt;p&gt;For once, I agree with &lt;a href=&quot;http://twitter.com/davewiner&quot;&gt;Dave&lt;/a&gt; : &lt;strong&gt;the Real-Time web happens without waiting&lt;/strong&gt;. However, I&amp;#8217;d complete that by saying that &lt;em&gt;without waiting applies to anything&lt;/em&gt; : people (us), but also (and more importantly) : &lt;strong&gt;machines&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We &lt;strong&gt;used to have clients talking to servers&lt;/strong&gt;, whether they were browsers talking to websites or web applications talking to other applications via their APIs. &lt;br /&gt;
I think the &lt;strong&gt;real-time web is taking us to a world where we have a more &amp;#8220;peer-to-peer&amp;#8221; approach&lt;/strong&gt; : &lt;em&gt;everybody is a client and a server to everybody else&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;In a way, when you blog, you&amp;#8217;re a server, and your readers are your client. When you tweet, you&amp;#8217;re both a server and client.&lt;/li&gt;
	&lt;li&gt;When you poll &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feeds, you&amp;#8217;re a client to the website that hosts these feeds, when you use Superfeedr, you become a server because you respond to our notifications (and we&amp;#8217;re a client because we send out these requests).&lt;/li&gt;
	&lt;li&gt;When you use Wikipedia, you&amp;#8217;re a client to whoever wrote the article you&amp;#8217;re reading. When you use Aardvark, you&amp;#8217;re both a client and a server (because you ask and answer equally).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;#8217;m quite happy with this quote from &lt;a href=&quot;http://www.borthwick.com/weblog/about/&quot;&gt;John Borthwick&lt;/a&gt;, one of our investors, at &lt;a href=&quot;http://betaworks.com/&quot;&gt;Betaworks&lt;/a&gt; :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We believe things are becoming more connected. In the future, everything will consume APIs and publish APIs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In a nutshell, this report is probably what&amp;#8217;s best today to catch-up with all the real-time web. It also contains a great list of people you should follow (not only on Twitter) and who are making the real-time web happen.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>State of Real-Time feeds</title>
        
        <category term="Real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="statistics" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="market" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Real-time/market/statistics/state-of-real-time-feeds"/>
        <published>2009-11-27T00:00:00-08:00</published>
        <updated>2009-11-27T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Real-time/market/statistics/state-of-real-time-feeds</id>
        <content type="html">&lt;p&gt;As &lt;a href=&quot;http://blog.superfeedr.com/Real-time/market/statistics/state-of-realtime-feeds/&quot;&gt;promised last month&lt;/a&gt;, here is a small update on the &lt;strong&gt;real-time feeds market&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;First, I&amp;#8217;d like to insist on the method we use to collect these statistics. For each feed, we always &lt;em&gt;try to determine what is the best way&lt;/em&gt; to get its content and push it to our users in the &lt;em&gt;timeliest manner&lt;/em&gt;. &lt;br /&gt;
If you were building a similar infrastructure to ours, assuming you&amp;#8217;d support &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;PubSubHubbub&lt;/a&gt;, &lt;a href=&quot;http://blog.superfeedr.com/PubSubHubbub/api/rsscloud/RSSCloud/&quot;&gt;RSSCloud&lt;/a&gt; and &lt;a href=&quot;http://blog.superfeedr.com/PubSubHubbub/Real-time/SUP/XMPP/SUP-over-pubsubhubb-and-xmpp/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SUP&lt;/span&gt;&lt;/a&gt; &lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, here is the breakdown that you would get.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/nov-09.png&quot; style=&quot;display:block; margin-left:auto; margin-right:auto;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Compared to last month, we &lt;strong&gt;have three times more feeds&lt;/strong&gt; and the proportions evolved significantly.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/oct-nov-09.png&quot; style=&quot;display:block; margin-left:auto; margin-right:auto;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;As you can see, it&amp;#8217;s pretty obvious that there are &lt;strong&gt;less and less feeds that you&amp;#8217;ll be actively polling&lt;/strong&gt; (still about 75% though).&lt;/p&gt;
&lt;p&gt;This is mainly due to the fact that we added &lt;a href=&quot;http://superfeedr.com/publisher&quot;&gt;white-label hubs&lt;/a&gt; to our service offering.&lt;/p&gt;
&lt;p&gt;For example, since we have our &lt;a href=&quot;http://wordpress.superfeedr.com/&quot;&gt;unofficial hub for wordpress&lt;/a&gt;, we subscribe to a lot of &lt;a href=&quot;http://wordpress.superfeedr.com/&quot;&gt;RSSCloud feeds on behalf of our users&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Similarly, we now host official the &lt;a href=&quot;http://posterous.superfeedr.com/&quot;&gt;Posterous hub&lt;/a&gt; and &lt;a href=&quot;http://backtype.superfeedr.com/&quot;&gt;Backtype hub&lt;/a&gt; (among others), which means that if you poll their feeds, you&amp;#8217;ll use Superfeedr :) As a matter of fact, &lt;strong&gt;we host the hub for 48% of the hubbub-enabled feeds that our users subscribed to&lt;/strong&gt;.&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt; We implemented many other ways of getting feed updates, including some specific APIs and other techniques.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Thanks</title>
        
        <category term="meta" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/meta/thanks"/>
        <published>2009-11-26T00:00:00-08:00</published>
        <updated>2009-11-26T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/meta/thanks</id>
        <content type="html">&lt;p&gt;Today is the probably the most symbolic holiday here in the US. It&amp;#8217;s about saying : Thank You!&lt;/p&gt;
&lt;p&gt;Thank you &lt;a href=&quot;http://identi.ca/astro&quot;&gt;Stephan&lt;/a&gt;, thank you to each and everyone of our users, thank you to our &lt;a href=&quot;http://blog.superfeedr.com/betaworks/cuban/investors/seed/seed-round/&quot;&gt;advisors and investors&lt;/a&gt;, and thank you to all my friends and family who supported me and my unbearable schedule over the past months.&lt;/p&gt;
&lt;p&gt;Thanks, and happy holiday to you and everyone in your heart.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Added Title to Feed Info</title>
        
        <category term="title" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="feed" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="schema" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/feed/schema/title/added-title-to-feed-info"/>
        <published>2009-11-24T00:00:00-08:00</published>
        <updated>2009-11-24T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/feed/schema/title/added-title-to-feed-info</id>
        <content type="html">&lt;p&gt;We just pushed a small code update (it should be fully deployed within minutes) to our schema. Of course, this is fully downward compatible.&lt;/p&gt;
&lt;p&gt;This has been one of the &lt;em&gt;earliest feature requests&lt;/em&gt; that we had : &lt;strong&gt;feed titles in the notifications&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In many apps it&amp;#8217;s crucial to show the user with the feed title. Up until now you needed to poll the feeds once in while to get that information. &lt;br /&gt;
From now on, you&amp;#8217;ll get the title in your notifications :)&lt;/p&gt;
&lt;p&gt;With &lt;a href=&quot;http://superfeedr.com/documentation#pubsubhubbub&quot;&gt;PubSubHubbub&lt;/a&gt;, it&amp;#8217;s part of the &lt;feed&gt; element. With our &lt;a href=&quot;http://superfeedr.com/documentation#xmpp_api&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;, it&amp;#8217;s included in the &lt;status&gt; element. Check &lt;a href=&quot;http://superfeedr.com/documentation#schema&quot;&gt;our schema&lt;/a&gt; for a refresher :)&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Seed Round</title>
        
        <category term="seed" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="investors" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="cuban" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="betaworks" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/betaworks/cuban/investors/seed/seed-round"/>
        <published>2009-11-17T00:00:00-08:00</published>
        <updated>2009-11-17T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/betaworks/cuban/investors/seed/seed-round</id>
        <content type="html">&lt;p&gt;That&amp;#8217;s true. We&amp;#8217;ve finalized our &lt;strong&gt;seed investment round&lt;/strong&gt;. It took us a little more time than expected, but we&amp;#8217;re very happy to join &lt;a href=&quot;http://betaworks.com/&quot;&gt;Betawork&amp;#8217;s&lt;/a&gt; and &lt;a href=&quot;http://blogmaverick.com/&quot;&gt;Mark Cuban&amp;#8217;s&lt;/a&gt; portfolios. Both of them have shown a &lt;strong&gt;genuine interest and vision in what appears to be the &lt;em&gt;real-time web&lt;/em&gt;&lt;/strong&gt;. We&amp;#8217;re also pretty excited to announce that both &lt;a href=&quot;http://aa.typepad.com/&quot;&gt;Andrew Anker&lt;/a&gt; and &lt;a href=&quot;http://www.davidrecordon.com/&quot;&gt;David Recordon&lt;/a&gt; have joined our &lt;strong&gt;advisory board&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re following, even remotely, the world of start-up or the one of basketball, you can&amp;#8217;t ignore Mark Cuban&amp;#8217;s name. Mark founded Broadcast.com a few years ago and sold it to Yahoo!. I am thrilled to have him on board. There aren&amp;#8217;t many experienced entrepreneurs our there who have invested in start-ups like Mark did. He knows how to grow a business and &lt;strong&gt;we will learn a lot from him&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Betaworks is probably the &lt;strong&gt;most active investor in the real-time web&lt;/strong&gt;. &lt;a href=&quot;http://static.betaworks.com/work/index.html&quot;&gt;Their portfolio&lt;/a&gt; includes names like &lt;a href=&quot;http://twitter.com&quot;&gt;Twitter&lt;/a&gt;, &lt;a href=&quot;http://www.tumblr.com/&quot;&gt;Tumblr&lt;/a&gt;, &lt;a href=&quot;http://bit.ly/&quot;&gt;Bit.ly&lt;/a&gt;, &lt;a href=&quot;http://www.tweetdeck.com/&quot;&gt;Tweetdeck&lt;/a&gt;, &lt;a href=&quot;http://twitterfeed.com/&quot;&gt;Twitterfeed&lt;/a&gt; as well as many others. They&amp;#8217;ve proven quite successful at building a network of loosely joined pieces where all members interacts together. I am very excited to be on stage later today at Betaday to chat with &lt;a href=&quot;http://iain.posterous.com/&quot;&gt;Iain&lt;/a&gt; and &lt;a href=&quot;http://www.tonyhaile.com/&quot;&gt;Tony&lt;/a&gt; about the &lt;em&gt;death of the web page&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re very happy and proud about this seed round, and I want to thank personally &lt;a href=&quot;http://twitter.com/MCuban&quot;&gt;Mark&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/johnBorthwick&quot;&gt;John&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/aweissman&quot;&gt;Andy&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/artictony&quot;&gt;Tony&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/AA&quot;&gt;Andrew&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/DaveMan692&quot;&gt;David&lt;/a&gt; for their trust.&lt;/p&gt;
&lt;p&gt;And now : &lt;strong&gt;back to work&lt;/strong&gt;! (not that we didn&amp;#8217;t work a lot lately :D)&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Win a ticket for LeWeb!</title>
        
        <category term="API" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="compp" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="rivers" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Leweb" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/API/Leweb/compp/rivers/win-a-ticket-for-leweb"/>
        <published>2009-11-16T00:00:00-08:00</published>
        <updated>2009-11-16T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/API/Leweb/compp/rivers/win-a-ticket-for-leweb</id>
        <content type="html">&lt;p&gt;We&amp;#8217;re very excited to be part of &lt;a href=&quot;http://www.leweb.net/&quot;&gt;LeWeb&amp;#8217;s&lt;/a&gt;  &lt;a href=&quot;http://eu.techcrunch.com/2009/11/10/le-web-announces-the-list-for-the-startup-competition/&quot;&gt;startup competition&lt;/a&gt;. We will have a few minutes only to demo in front of the jury how cool superfeedr is. Needless to say that it&amp;#8217;s pretty hard for an &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;-based service, and we want to show-case cool stuff created with Superfeedr!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.leweb.net/sites/all/themes/leweb-leweb/logo.png&quot; style=&quot;float:left;margin:0px 10px 10px 0px;&quot; alt=&quot;&quot; /&gt;As any other candidate, &lt;em&gt;we got 2 tickets&lt;/em&gt;. One for &lt;a href=&quot;http://twitter.com/julien51&quot;&gt;me&lt;/a&gt;, and one for&amp;#8230; &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;YOU&lt;/span&gt;&lt;/strong&gt;! Well, not all of you, but just the one of you who &lt;strong&gt;creates a coolest app&lt;/strong&gt; out of a new small feature we&amp;#8217;re launching today : &lt;strong&gt;our rivers&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The rivers will be &lt;em&gt;freely accessible streams of data&lt;/em&gt; out of Superfeedr. The first one (and the one that&amp;#8217;s in competition), is a &lt;strong&gt;sample of our global stream, with at most 1 message every 3 seconds&lt;/strong&gt; : &lt;a href=&quot;http://rivers.superfeedr.com:8001&quot;&gt;http://rivers.superfeedr.com:8001&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We built this river with the newly released &lt;a href=&quot;http://github.com/superfeedr/compp&quot;&gt;Compp&lt;/a&gt; : a &lt;strong&gt;small &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; server&lt;/strong&gt; that allows you to do &lt;a href=&quot;http://en.wikipedia.org/wiki/Comet_(programming)&quot;&gt;Comet Streams&lt;/a&gt; out of &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; traffic&lt;/strong&gt;. It&amp;#8217;s an &lt;em&gt;AtomStream&lt;/em&gt; : a never ending &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; connection that contains &lt;span class=&quot;caps&quot;&gt;ATOM&lt;/span&gt; entries&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;There will be several judges for your apps, including &lt;a href=&quot;http://identi.ca/astro&quot;&gt;Astro&lt;/a&gt;, me and a few other people. &lt;strong&gt;The rule is : no rule&lt;/strong&gt;! Make something, &lt;em&gt;fun, useful, profitable, open-source, downloadable, web-based, or any combination of that&lt;/em&gt;! You can use any platform, any other &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; (you&amp;#8217;re even encouraged to), any language (heard of &lt;a href=&quot;http://golang.org/&quot;&gt;Go&lt;/a&gt;?).&lt;/p&gt;
&lt;p&gt;The only constraints are :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;it &lt;strong&gt;must use the river&lt;/strong&gt; that is accessible at http://rivers.superfeedr.com:8001&lt;/li&gt;
	&lt;li&gt;your app &lt;strong&gt;must be visible&lt;/strong&gt; (dowloadable or web accessible) on December 4th at midnight &lt;span class=&quot;caps&quot;&gt;PST&lt;/span&gt;.&lt;/li&gt;
	&lt;li&gt;you &lt;strong&gt;must write a blog post or a doc page&lt;/strong&gt; explaining what it is, how it works and how to use it!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We will let you know who is the winner on December 5th and hopefully, &lt;strong&gt;you&amp;#8217;ll join me on the 9th&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;Let the best win!&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt; It&amp;#8217;s a very first release, make sure your code is robust enough to deal with errors and disconnections.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>SUP over PubSubHubbub and XMPP</title>
        
        <category term="SUP" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="PubSubHubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="XMPP" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/PubSubHubbub/Real-time/SUP/XMPP/SUP-over-pubsubhubb-and-xmpp"/>
        <published>2009-11-12T00:00:00-08:00</published>
        <updated>2009-11-12T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/PubSubHubbub/Real-time/SUP/XMPP/SUP-over-pubsubhubb-and-xmpp</id>
        <content type="html">&lt;p&gt;The &lt;a href=&quot;http://code.google.com/p/simpleupdateprotocol/&quot;&gt;Simple Update Protocol&lt;/a&gt; is one of the &lt;em&gt;very first protocols that was built to help feed polling&lt;/em&gt;. It makes it easy to find the &lt;strong&gt;most appropriate time to fetch a feed&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://i.friendfeed.com/p-5d0e55aafb6a4caebe266f733dd84772-large-1&quot; style=&quot;float:left; padding-right:20px;&quot; alt=&quot;&quot; /&gt;Created by the &lt;a href=&quot;http://friendfeed.com/&quot;&gt;FriendFeed&lt;/a&gt; team, the idea is, for a publisher, to keep track of all the feeds that have been updated in a &lt;a href=&quot;http://friendfeed.com/api/sup.json?pretty=1&quot;&gt;sup file&lt;/a&gt;. Then, a subscriber instead of querying the feed over and over again, just have to query this sup file. If a poller is just polling one feed, that&amp;#8217;s not better, but if you&amp;#8217;re tracking 1000 feeds, instead of polling them all, you just need to poll that specific &lt;span class=&quot;caps&quot;&gt;SUP&lt;/span&gt; file.&lt;/p&gt;
&lt;p&gt;One of the issues is that &lt;strong&gt;it&amp;#8217;s not immediate&lt;/strong&gt;, these &lt;span class=&quot;caps&quot;&gt;SUP&lt;/span&gt; feed have a &amp;#8220;period&amp;#8221; and contain all the feeds that have been updated in that given period. The standard is 60sec though, so it shouldn&amp;#8217;t be too &amp;#8220;late&amp;#8221;! Another issue is that these &lt;span class=&quot;caps&quot;&gt;SUP&lt;/span&gt; &lt;strong&gt;can contain a &lt;span class=&quot;caps&quot;&gt;LOT&lt;/span&gt; of feeds&lt;/strong&gt;, so if you don&amp;#8217;t have an very fast and efficient way to compare all the entries in this file to see if you&amp;#8217;re actually tracking a specific feed, &lt;em&gt;it may be quite &amp;#8220;complex&amp;#8221; to be sure to get all the updates&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, I have no idea why I&amp;#8217;m telling you this, because, as a matter of fact, &lt;strong&gt;you don&amp;#8217;t need to implement &lt;span class=&quot;caps&quot;&gt;SUP&lt;/span&gt;&lt;/strong&gt;, because Superfeedr does it for you. Give us a &lt;span class=&quot;caps&quot;&gt;SUP&lt;/span&gt; enabled feed (from &lt;a href=&quot;http://www.backtype.com/&quot;&gt;BackType&lt;/a&gt;, &lt;a href=&quot;http://disqus.com/overview/&quot;&gt;Disqus&lt;/a&gt;, &lt;a href=&quot;http://friendfeed.com/&quot;&gt;Friendfeed&lt;/a&gt;, &lt;a href=&quot;http://12seconds.tv/&quot;&gt;12seconds.tv&lt;/a&gt;&amp;#8230; etc), and &lt;strong&gt;we&amp;#8217;ll fetch the right &lt;span class=&quot;caps&quot;&gt;SUP&lt;/span&gt; file and you&amp;#8217;ll get your content in a &amp;#8220;close to real-time&amp;#8221; fashion, via PubSubHubbub or &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt;&lt;/strong&gt;, exactly like we did for &lt;a href=&quot;http://blog.superfeedr.com/PubSubHubbub/api/rsscloud/RSSCloud/&quot;&gt;RSSCloud&lt;/a&gt;!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>The Non-Decision makers</title>
        
        <category term="Entrepreneurship" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Entrepreneurship/the-non-decision-makers"/>
        <published>2009-11-11T00:00:00-08:00</published>
        <updated>2009-11-11T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Entrepreneurship/the-non-decision-makers</id>
        <content type="html">&lt;p&gt;Superfeedr is a very exciting venture. Yet, I am &lt;strong&gt;incredibly frustrated when I am waiting for someone else to make a decision&lt;/strong&gt;, answer an email or write some code. You know who they are : &lt;em&gt;these partners, customers, providers, lawyers, venture capitalists&lt;/em&gt;, etc&amp;#8230; all these people you deal with and who take forever to make a decision. I claim &lt;strong&gt;they are the worst ennemies for entrepreneurs&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;They don&amp;#8217;t want to make decisions&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;And they&amp;#8217;re right&lt;/strong&gt;. They&amp;#8217;re not the ones taking risks. VCs don&amp;#8217;t want to be wrong, so they&amp;#8217;d rather say &lt;em&gt;maybe, later, not sure yet, I need to chat with my partners, when you have revenues&lt;/em&gt;&amp;#8230; than anything that would look like a commitment. Customers also don&amp;#8217;t want to make a decision, because they don&amp;#8217;t want to show you that you have a bargaining power, so they will keep you waiting. Even journalists don&amp;#8217;t want to make a decision : they want to talk about what everybody else will talk. The problem is : they sometime have a hard time predicting that, so they&amp;#8217;d rather wait for a few hints before going out with your story.&lt;/p&gt;
&lt;h3&gt;Why no is better than maybe&lt;/h3&gt;
&lt;p&gt;In France, there is a saying that states that &amp;#8220;as long as there is life, there is hope&amp;#8221;. I&amp;#8217;d claim that &lt;strong&gt;more than hope, I want certitudes&lt;/strong&gt;. &lt;em&gt;Entreprendre&lt;/em&gt; is all about &lt;em&gt;making an assumption and test-proving it&lt;/em&gt;, making another one and test-proving it, making a third one and test-proving it. I say &amp;#8220;test-proof&amp;#8221; and not &amp;#8220;proof&amp;#8221;, because in the end, &lt;strong&gt;it doesn&amp;#8217;t matter whether you&amp;#8217;re right or wrong&lt;/strong&gt;. What matters is that, after the process, you &lt;em&gt;know&lt;/em&gt; and you have less and less assumptions to make.&lt;/p&gt;
&lt;p&gt;When somebody says &amp;#8220;&lt;em&gt;maybe&lt;/em&gt;&amp;#8221;, &amp;#8220;&lt;em&gt;later&lt;/em&gt;&amp;#8221;, &amp;#8220;&lt;em&gt;we&amp;#8217;ll do it&lt;/em&gt;&amp;#8221;&amp;#8230; you don&amp;#8217;t learn anything, because that &lt;em&gt;doesn&amp;#8217;t prove anything&lt;/em&gt;. When &lt;strong&gt;they say &amp;#8220;No&amp;#8221;, you know something&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;A few tips&lt;/h3&gt;
&lt;p&gt;As an entrepreneur, you should always &lt;strong&gt;make decisions&lt;/strong&gt;. The &lt;a href=&quot;http://en.wikipedia.org/wiki/Dalai_Lama&quot;&gt;Dalaï Lama&lt;/a&gt; said : &amp;#8220;&lt;em&gt;&lt;strong&gt;When you lose, don&amp;#8217;t loose the lesson&lt;/strong&gt;&lt;/em&gt;&amp;#8221;. The only thing an entrepreneur can lose, is actually the lesson. &lt;strong&gt;Make as many decisions as you want, and keep proving them right or wrong&lt;/strong&gt;. If you wonder if A or B is better, don&amp;#8217;t think too much : try, you&amp;#8217;ll know.&lt;/p&gt;
&lt;p&gt;You &lt;strong&gt;can spot non-decision makers pretty easily&lt;/strong&gt; : they don&amp;#8217;t answer your emails (or at least, not right away), they never commit to anything (even the smallest things), they keep using the future when they speak/write. &lt;strong&gt;One you spotted one, avoid him at any cost&lt;/strong&gt;. It &lt;em&gt;doesn&amp;#8217;t matter how hard you will try&lt;/em&gt;, they will not help you. I wrote code, prepared scripts, documentation, how-tos&amp;#8230; etc. If somebody isn&amp;#8217;t making the decision to use your app, all this is useless.&lt;/p&gt;
&lt;p&gt;On the other hand, every-time you meet &lt;strong&gt;anyone who is making even the slightest decisions about your product&lt;/strong&gt; (like tweeting about it, registering, sending you an email&amp;#8230; anything), you have to &lt;strong&gt;be very very responsive&lt;/strong&gt;. Not only they will be great &lt;em&gt;advocates&lt;/em&gt;, but since they make decisions, they will &lt;em&gt;help you learn much faster and understand things&lt;/em&gt; that would have taken years for you to grasp. You almost have to scare them with your dedication!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Posterous supports PubSubHubbub</title>
        
        <category term="PubSubHubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="posterous" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="publisher" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/PubSubHubbub/posterous/publisher/posterous-supports-pubsubhubbub-with-superfeedr"/>
        <published>2009-11-09T00:00:00-08:00</published>
        <updated>2009-11-09T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/PubSubHubbub/posterous/publisher/posterous-supports-pubsubhubbub-with-superfeedr</id>
        <content type="html">&lt;p&gt;&lt;img src=&quot;http://posterous.com/images/homepage2/posterous_logo1.png&quot; style=&quot;float:left; margin: 10px;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re very excited to say that &lt;a href=&quot;http://posterous.com/&quot;&gt;Posterous&lt;/a&gt; now &lt;strong&gt;supports PubSubHubbub&lt;/strong&gt; and became &lt;strong&gt;real-time&lt;/strong&gt;! If you&amp;#8217;ve got a posterous blog (and you should!), your posts will now show up in real-time in any feed reader that supports PubSubHubbub on the subscriber side.&lt;/p&gt;
&lt;p&gt;What&amp;#8217;s even better (for us), is that the Posterous chose to use our &lt;a href=&quot;http://superfeedr.com/publisher&quot;&gt;publisher services&lt;/a&gt; for that, and &lt;strong&gt;their hub is hosted at Superfeedr&lt;/strong&gt; at the following address : &lt;a href=&quot;http://posterous.superfeedr.com/&quot;&gt;http://posterous.superfeedr.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re working hard to have more and more publishers support this awesome protocol and it&amp;#8217;s great that the Posterous team (which I met recently) is paving the way.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re a &lt;a href=&quot;http://superfeedr.com/subscriber&quot;&gt;Superfeedr subscriber&lt;/a&gt; user, &lt;em&gt;there is nothing you need to do, you&amp;#8217;ll receive Posterous feeds in real-time too&lt;/em&gt; :)&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Sunday Package</title>
        
        <category term="PubSubHubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Facebook" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Sunday" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="wrapper" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="ruby" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Facebook/PubSubHubbub/Sunday/ruby/wrapper/sunday-package"/>
        <published>2009-11-08T00:00:00-08:00</published>
        <updated>2009-11-08T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Facebook/PubSubHubbub/Sunday/ruby/wrapper/sunday-package</id>
        <content type="html">&lt;p&gt;A few little news on this glorious sunday.&lt;/p&gt;
&lt;h3&gt;Async Subscription supported with PubSubHubbub&lt;/h3&gt;
&lt;p&gt;Several of our users wanted that, we did it. Up until now, we only supported the &lt;a href=&quot;http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.2.html#verifysub&quot;&gt;&lt;em&gt;sync&lt;/em&gt; verification&lt;/a&gt; for the subscriber&amp;#8217;s intent in PubSubHubbub. That was an issue for several people who were debugging with a server that could only accept a single &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; request at a time, or with hosts like &lt;a href=&quot;http://heroku.com&quot;&gt;Heroku&lt;/a&gt;, which allows a limited (starting at 1) number of simultaneous &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; requests. &lt;strong&gt;You can now use &lt;code&gt;async&lt;/code&gt; for the &lt;code&gt;hub.verify&lt;/code&gt; param&lt;/strong&gt;. Please note however, that the dashboard currently uses the sync mode.&lt;/p&gt;
&lt;h3&gt;A Facebook fan page&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Keeping in touch&lt;/strong&gt; with our friends is very important to us. There is a pretty strong chance that you&amp;#8217;re already on Facebook. &lt;a href=&quot;http://www.facebook.com/pages/Superfeedr/205234549391&quot;&gt;Become a Superfeedr fan&lt;/a&gt;, we&amp;#8217;ll give you &lt;em&gt;exclusive content&lt;/em&gt; very soon :)&lt;/p&gt;
&lt;h3&gt;Another Ruby wrapper&lt;/h3&gt;
&lt;p&gt;The topic of the last &lt;a href=&quot;http://technology.meetup.com/11/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; meetup&lt;/a&gt; was hacking. I investigated &lt;a href=&quot;http://code.google.com/appengine/&quot;&gt;Google App Engine&amp;#8217;s &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt;&lt;/a&gt; support (and used that to build &lt;a href=&quot;http://blog.superfeedr.com/2009/11/07/notifixlite.html&quot;&gt;notifixlite&lt;/a&gt;), and I know some friends worked on some other cool stuff. Our friend &lt;a href=&quot;http://twitter.com/sprsquish&quot;&gt;Jeff&lt;/a&gt;, who created Blather, a pretty awesome &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; library worked on &lt;strong&gt;another Ruby wrapper for the &lt;a href=&quot;http://superfeedr.com/documentation#xmpp&quot;&gt;Superfeedr &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;. &lt;a href=&quot;http://github.com/sprsquish/superfeedr-rb&quot;&gt;Check it out&lt;/a&gt;, it&amp;#8217;s awesomely simple!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Notifixlite</title>
        
        <category term="Superfeedr" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="XMPP" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Google App Engine" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Google App Engine/Superfeedr/XMPP/notifixlite"/>
        <published>2009-11-07T00:00:00-08:00</published>
        <updated>2009-11-07T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Google App Engine/Superfeedr/XMPP/notifixlite</id>
        <content type="html">&lt;p&gt;Superfeedr &lt;a href=&quot;http://blog.superfeedr.com/meta/reality-checked/&quot;&gt;comes from&lt;/a&gt; &lt;a href=&quot;http://notifixio.us/&quot;&gt;Notifixious&lt;/a&gt;. We followed &lt;a href=&quot;http://500hats.typepad.com/&quot;&gt;Dave&amp;#8217;s&lt;/a&gt; advice and removed many features, so much that we found a market! :) However, I am still using Notifixious on a daily basis and I know many other people do. Yet, &lt;strong&gt;I am not fully satisfied with it&lt;/strong&gt; and there are many things that deserve to be changed and improved. One of it&amp;#8217;s biggest &amp;#8220;disadvantages&amp;#8221; is its code-base : it &lt;em&gt;lacks documentation, tests&lt;/em&gt; and I am scared to even change a tiny thing because I&amp;#8217;m afraid it may break a lot of stuff.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://cache0.techcrunch.com/wp-content/google_appengine.png&quot; style=&quot;float:right; margin: 10px;width: 35%;&quot; alt=&quot;&quot; /&gt; When Google announced that &lt;a href=&quot;http://code.google.com/appengine/&quot;&gt;AppEngine&lt;/a&gt; was supporting &lt;a href=&quot;http://xmpp.org/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt;&lt;/a&gt;, I felt it was a great occasion to see if I could give it a shot and I created &lt;a href=&quot;http://notifixlite.appspot.com/&quot;&gt;Notifixlite&lt;/a&gt;. It&amp;#8217;s a &lt;strong&gt;simple &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; bot&lt;/strong&gt; that you can use to &lt;em&gt;subscribe to your favorite blogs&lt;/em&gt; and receive entries via Jabber/Gtalk. It&amp;#8217;s powered by Superfeedr and uses the &lt;a href=&quot;http://superfeedr.com/documentation#pubsubhubbub&quot;&gt;PubSubHubbub &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;. Why not the &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt;? because &lt;strong&gt;Google&amp;#8217;s implementation of &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; is very very light&lt;/strong&gt; and doesn&amp;#8217;t support IQs. As a matter of fact the implementation is only geared to build bots that can interact with &amp;#8220;humans&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Anyway, I learnt a little bit about &lt;strong&gt;Google AppEngine and I kind of felt in love&lt;/strong&gt; with that, it&amp;#8217;s a wonderful feeling to just &amp;#8220;write code&amp;#8221;, the rest (configuartion, deployement, datastores&amp;#8230; etc) being dealt with by Google. I can&amp;#8217;t recommend more to look into it for anyone with a project that can fit there. I also &lt;del&gt;learnt&lt;/del&gt; played with Python, and I am sure &lt;em&gt;my code needs a lot of improvements&lt;/em&gt;!&lt;/p&gt;
&lt;p&gt;Please &lt;a href=&quot;http://github.com/superfeedr/notifixlight&quot;&gt;fork Notifixlite&lt;/a&gt;, and, as would the Beatles say : make it better!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Funny Feeds</title>
        
        <category term="feeds" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="RSS" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="ATOM" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/ATOM/RSS/feeds/funny-feeds"/>
        <published>2009-11-06T00:00:00-08:00</published>
        <updated>2009-11-06T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/ATOM/RSS/feeds/funny-feeds</id>
        <content type="html">&lt;p&gt;Our business cards say : &amp;#8220;&lt;em&gt;We make something stupid so that nobody else has to do it&lt;/em&gt;&amp;#8221;. And it&amp;#8217;s true : we do a lot of things so that nobody else has to. While debugging some code last weekend, I checked at some feeds that we had trouble dealing with. If you use &lt;a href=&quot;http://superfeedr.com&quot;&gt;Superfeedr&lt;/a&gt;, you won&amp;#8217;t have to deal with that, and that&amp;#8217;s good, because these things can break your feed parsing module.&lt;/p&gt;
&lt;h3&gt;Never Ending &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; responses&lt;/h3&gt;
&lt;p&gt;This was actually one of the very first things our parsers encountered. Want to see an example : check out the &lt;a href=&quot;http://updates.sixapart.com/atom-stream.xml&quot;&gt;six-apart Atom stream&lt;/a&gt;. Technically, &lt;em&gt;this is perfectly legit&lt;/em&gt;, except that if our parser starts to get content from there, well, it will eat more and more content, and will eventually die of indigestion. When we had only a handful of servers, we had the problem with some hacker implementing a similar thing on his servers (with no content, just an un-endind &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; connection). This ended-up &lt;strong&gt;keeping our parsers busy&lt;/strong&gt; to such an extent that they wouldn&amp;#8217;t parse anything else.&lt;/p&gt;
&lt;p&gt;It was an easy fix : &lt;strong&gt;timeout on active &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; connections&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;6847 entries feed.&lt;/h3&gt;
&lt;p&gt;You read that correctly. That is &lt;em&gt;6847 entries&lt;/em&gt;, in one &lt;a href=&quot;http://www.kocosports.com/absolutenm/rss.asp?z=3&quot;&gt;feed&lt;/a&gt; (that&amp;#8217;s fluctuating though), and it &lt;em&gt;weights about 2MB&lt;/em&gt;. As such that&amp;#8217;s not really a problem. We fetch this feed in more or less 5 seconds. However, to identify new entries, we need to &lt;strong&gt;compare each of them&lt;/strong&gt; with a &amp;#8220;cached&amp;#8221; version. Comparing 5, 10 or even 100 entries is not a big deal. Comparing several thousands can actually take up to a few seconds (we store these entries into Memcache). Eventually, this feed was taking forever (20, 30 seconds or even a few minutes) to be fetched and parsed. We built our parsers such as if a feed takes &lt;strong&gt;too long to be processed, it&amp;#8217;s dropped&lt;/strong&gt;. This feed was eventually never fully processed.&lt;/p&gt;
&lt;p&gt;We increased the allowance on the feed processing. That was not enough : many feeds could not be fetched anyway, we were just spending more time on them. We finally decided to &lt;strong&gt;limit the number of legit new entries in a given feed to 500&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Permanent redirections&lt;/h3&gt;
&lt;p&gt;That is a much harder one. The &lt;a href=&quot;http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; protocol&lt;/a&gt; has stuff like redirections. A redirection is just a way for a server to say &amp;#8220;what was here is now there&amp;#8221;. There are 2 types of redirections : Temporary and Permanent. When it&amp;#8217;s temporary, we don&amp;#8217;t even keep track of it : our parser follows the redirection and gets the content where it is. When it&amp;#8217;s permanent, it&amp;#8217;s different. We follow the redirection, but we also &lt;strong&gt;save the new feed url and assign it to the subscribers of the initial feed&lt;/strong&gt;. We still keep the &amp;#8216;old&amp;#8217; feed, just in case the &lt;em&gt;permanent is not really permanent&lt;/em&gt; (and because we hate deleting stuff), but we reduce the polling frequency to a minimum. Some feeds, however make our life hard in this case. This &lt;a href=&quot;http://vmware.simplefeed.net/rss&quot;&gt;feed from VMWare&lt;/a&gt; is an example. If you open it, you&amp;#8217;ll see that it permanently redirects to a url &lt;a href=&quot;http://feeds.vmware.com/rss?f=8b93e6a0-01de-11de-2fb2-0030486070c6&quot;&gt;like this one&lt;/a&gt;  and if you load it again, you&amp;#8217;ll see that it permanently redirects to another feed&amp;#8230; and so on. In other word, this &lt;strong&gt;feed permanently redirects to different urls&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We &lt;strong&gt;haven&amp;#8217;t found a good solution for that yet&lt;/strong&gt;. We hate to do it, but we basically clean these redirections once in a while to avoid having thousands of them.&lt;/p&gt;
&lt;p&gt;As you can see, building a polling infrastructure is full of traps. There is not a day where we don&amp;#8217;t find new challenges. It is very interesting and we like that. However, there is absolutely &lt;strong&gt;no valid reason for another person to spend time and money solving the same problem&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That doesn&amp;#8217;t mean either that the solution we come up with are the best; and that is why we&amp;#8217;re sharing them here! &lt;em&gt;Your ideas are our food&lt;/em&gt;&amp;#8230;&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Information Superhighway</title>
        
        <category term="OSS" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="XMPP" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="http" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="web-apps" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/JavaScript/OSS/XMPP/http/web-apps/information-superhighway"/>
        <published>2009-11-05T00:00:00-08:00</published>
        <updated>2009-11-05T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/JavaScript/OSS/XMPP/http/web-apps/information-superhighway</id>
        <content type="html">&lt;p&gt;&lt;img src=&quot;../../../../../../images/superhighway.png&quot; style=&quot;float:right; margin: 10px;width: 35%;&quot; alt=&quot;&quot; /&gt; Because we provide a service to developers and businesses &lt;strong&gt;it is quite difficult to &amp;#8220;show off&amp;#8221;&lt;/strong&gt; to people without prior knowledge of the technology. &lt;a href=&quot;http://twitter.com/julien51&quot;&gt;Julien&lt;/a&gt; built our website with quite some interactivity, but it is still rather hard to understand because you&amp;#8217;re going to see the gory protocol in detail.&lt;/p&gt;
&lt;p&gt;The well-standardized &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; with its many implementations has always made it easy for developers to use us. There&amp;#8217;s a &lt;strong&gt;vast amount of tools and libraries&lt;/strong&gt; out there. That makes it easy to put together a demo consumer of Superfeedr notifications in very short time.&lt;/p&gt;
&lt;p&gt;So we want a graphical app but not restrict ourselves to one platform. The web browser, where you don&amp;#8217;t even need to install anything, just click and everything&amp;#8217;s in a sandbox is the solution. That&amp;#8217;s why it has to be a webapp.&lt;/p&gt;
&lt;h3&gt;How it&amp;#8217;s built&lt;/h3&gt;
&lt;p&gt;The nature of our service is very dynamic and content must be delivered quickly. That requires &lt;strong&gt;JavaScript&lt;/strong&gt;. Despite not being affine to that language, I&amp;#8217;ve always been intrigued how &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;AJAX&lt;/span&gt;&lt;/strong&gt;, nowadays a common web technology, can be used with a tiny glue of &lt;a href=&quot;http://xmpp.org/extensions/xep-0124.html&quot;&gt;&lt;span class=&quot;caps&quot;&gt;BOSH&lt;/span&gt;&lt;/a&gt; to &lt;strong&gt;run an &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; client&lt;/strong&gt; in just your browser.&lt;/p&gt;
&lt;p&gt;I took &lt;a href=&quot;http://code.stanziq.com/strophe/&quot;&gt;StropheJS&lt;/a&gt;, easened &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt; and &lt;span class=&quot;caps&quot;&gt;DOM&lt;/span&gt; handling a bit with &lt;a href=&quot;http://jquery.com/&quot;&gt;JQuery&lt;/a&gt;, and made a really tiny webapp: &lt;a href=&quot;http://github.com/astro/superhighway&quot;&gt;Notification Superhighway&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Log in, subscribe to feeds (or even Twitter searches), and get amazed by that millions of content producers on the &lt;a href=&quot;http://en.wikipedia.org/wiki/Information_Superhighway&quot;&gt;Information Superhighway&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Running it yourself&lt;/h3&gt;
&lt;ol&gt;
	&lt;li&gt;Pull the code :&lt;br /&gt;
&lt;code&gt;git clone git://github.com/astro/superhighway.git&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;code&gt;cd superhighway&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ol&gt;
	&lt;li&gt;Get the StropheJs code:&lt;br /&gt;
&lt;code&gt;git submodule init&lt;/code&gt;&lt;br /&gt;
&lt;code&gt;git submodule update&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ol&gt;
	&lt;li&gt;Proxy the &lt;code&gt;http://localhost/http-bind/&lt;/code&gt; to use &lt;code&gt;http://superfeedr.com/http-bind/&lt;/code&gt;.  The browser&amp;#8217;s &lt;strong&gt;Same Origin Policy&lt;/strong&gt; will allow script access only to the local domain for good reason. To proxy the &lt;span class=&quot;caps&quot;&gt;BOSH&lt;/span&gt; entry point I included a configuration file for &lt;a href=&quot;http://nginx.net/&quot;&gt;nginx&lt;/a&gt;. &lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;code&gt;./start.sh&lt;/code&gt; (you may need to use &lt;code&gt;sudo&lt;/code&gt;) &lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt; should do it :). The Interface clearly needs a little work! Please &lt;a href=&quot;http://github.com/astro/superhighway&quot;&gt;fork Notification SuperHighway&lt;/a&gt; :)&lt;/li&gt;
&lt;/ol&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt; On a Mac, I suggest installing Nginx with &lt;code&gt;sudo port install nginx&lt;/code&gt;.&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn2&quot;&gt;&lt;sup&gt;2&lt;/sup&gt; On a Mac, you will need to comment the &lt;code&gt;use epoll;&lt;/code&gt; line of the nginx configuration.&lt;/p&gt;</content>
        <author>
            <name>Astro</name>
            <uri>http://identi.ca/astro</uri>
        </author>
    </entry>
    
    <entry>
        <title>Post Mortem 02/11</title>
        
        <category term="post-mortem" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="MySQL" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Memcache" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Memcache/MySQL/post-mortem/post-mortem-02-11"/>
        <published>2009-11-03T00:00:00-08:00</published>
        <updated>2009-11-03T00:00:00-08:00</updated>
        <id>blog.superfeedr.com:/Memcache/MySQL/post-mortem/post-mortem-02-11</id>
        <content type="html">&lt;p&gt;Superfeedr went down yesterday evening. We immediately saw that it was a &lt;strong&gt;database performance issue&lt;/strong&gt; (MySQL), given that the load on our &lt;em&gt;MySQL host was about 30+&lt;/em&gt;. Since we have 2 MySQL hosts (Master &amp;#8211; Master replication), we switched to the second one, hoping that was just a problem on the host. No luck.&lt;/p&gt;
&lt;h3&gt;Finding the issue&lt;/h3&gt;
&lt;p&gt;Up until yesterday, our entry detection was was done by &lt;strong&gt;storing in Memcached and MySQL an unique identifier by entry&lt;/strong&gt;. If the item was not present in Memcached, it would be inserted into MySQL, which has a unique index on these unique ids. The goal of that is that a check on Memcached is much cheaper than a check on MySQL. We had then a maintenance script that would clean up the entries that are old enough to not be considered new again.&lt;/p&gt;
&lt;p&gt;When we investigated a little further yesterday, we found that the it was actually &lt;strong&gt;these &lt;span class=&quot;caps&quot;&gt;INSERT&lt;/span&gt; queries on MySQL that were taking much longer than they should, and, worse, much more often than they should&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Logically, we checked our Memcached and found out that our caching mechanism didn&amp;#8217;t work as expected: &lt;em&gt;whether the unique entry was present in the cache or not, we would send the entry to be saved in MySQL&lt;/em&gt;. We fixed that. But the problem was still the same : way too many INSERTs in MySQL.&lt;/p&gt;
&lt;p&gt;After checking Memcached into more details, we figured out that our keys were &amp;#8220;disappearing&amp;#8221;. Looking at &lt;a href=&quot;http://code.google.com/p/memcached/wiki/FAQ#My_cache_items_always_expire_early!_My_cache_never_fills_all_the&quot;&gt;Memcached&amp;#8217;s &lt;span class=&quot;caps&quot;&gt;FAQ&lt;/span&gt;&lt;/a&gt; was helpful. &lt;em&gt;We indeed had a flush somewhere, that we had forgotten about&lt;/em&gt;. Removing the flush was good. The load on MySQL started to decrease, but not enough.&lt;/p&gt;
&lt;p&gt;There was a problem with MySQL. Another proof of that is that the 2 issues we had in our cache system had been here for weeks.&lt;/p&gt;
&lt;p&gt;After checking the entries table, it had about &lt;strong&gt;65 Million rows, 12GB Data and a 15GB Index&lt;/strong&gt;. Every time we insert a row, it has to check the keys. And since we&amp;#8217;re inserting about &lt;strong&gt;100 new rows per seconds&lt;/strong&gt;, even small operations start to become too heavy, specially if they involve disk access (we don&amp;#8217;t have 15GB &lt;span class=&quot;caps&quot;&gt;RAM&lt;/span&gt; on the MySQL host).&lt;/p&gt;
&lt;p&gt;We had to clean this table. It was easy to see that some feeds had more than 1M entries in MySQL. We started some queries to clean them up. It took 7hours and didn&amp;#8217;t complete. We needed to be back up faster than that.&lt;/p&gt;
&lt;h3&gt;Fixing the problem&lt;/h3&gt;
&lt;p&gt;Here is what we did : we changed the way we store entries in MySQL. Instead of cleaning them only once they&amp;#8217;re too old, &lt;strong&gt;we only keep in the cache a handful of entries : twice the size of the feed&lt;/strong&gt; actually, so that we don&amp;#8217;t store millions of useless entries, and we clean these entries each time we add some.&lt;/p&gt;
&lt;p&gt;The &amp;#8220;reboot&amp;#8221; process comes next :&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;We then truncated the entries table,&lt;/li&gt;
	&lt;li&gt;We stopped the notifications,&lt;/li&gt;
	&lt;li&gt;We restarted Memcached to clean any cached entries,&lt;/li&gt;
	&lt;li&gt;We forced all the feeds to be ran through our parser once to populate the entries table again.&lt;/li&gt;
	&lt;li&gt;When that was done, we restarted the notifications, and Superfeedr was back up.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There is a small risk for you to see duplicate entries (if the feed couldn&amp;#8217;t be parsed/fetched during the populating phase), but that should stay minimal.&lt;/p&gt;
&lt;h3&gt;What did we lean?&lt;/h3&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;MySQL is not the right tool for what we do&lt;/strong&gt;. Unfortunately, we haven&amp;#8217;t found any tool that really complies by all of our requirements. We studied several of the NoSQL alternative. We&amp;#8217;ll do that again in the coming days.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;A problem can have several causes&lt;/strong&gt;. The first one you find might not be the good one.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;You have to take drastic steps earlier&lt;/strong&gt; : trying the &amp;#8220;soft&amp;#8221; methods may sometimes just be a time loss. We should have not even tried to clean only parts of the entries table and that lost us about 7 hours.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We know we may pay a price for these lessons in terms of customer and conversion rate. We also know how valuable these lessons are and this also validates our biggest assumption that nobody else should build a similar infrastructure. Of course, not everybody would have fallen into those traps, but at least, if you use us, &lt;a href=&quot;http://blog.superfeedr.com/gospel/something-stupid/&quot;&gt;we did that for you, too&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please, let us know what we can improve and how to be better. We also learn from you.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>EventVue's Chatter</title>
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="API" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="eventvue" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="use-case" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/API/PHP/eventvue/pubsubhubbub/use-case/eventvue-s-chatter"/>
        <published>2009-10-23T00:00:00-07:00</published>
        <updated>2009-10-23T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/API/PHP/eventvue/pubsubhubbub/use-case/eventvue-s-chatter</id>
        <content type="html">&lt;p&gt;Meeting the right people at conferences is &lt;strong&gt;always very difficult&lt;/strong&gt;. Even if you&amp;#8217;re the most extraverted person in the room, most of the time, you just don&amp;#8217;t have enough time. &lt;a href=&quot;http://www.eventvue.com/&quot;&gt;EventVue&lt;/a&gt; is providing a very elegant way for that by helping you prepare your conferences in advance.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.eventvue.com/&quot;&gt;&lt;img src=&quot;http://cache0.techcrunch.com/wp-content/uploads/2009/08/eventvue_logo-630x315.png&quot; style=&quot;display:block;margin-left:auto;margin-right:auto;width:50%;&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When we started Superfeedr, &lt;a href=&quot;http://twitter.com/joshfraser&quot;&gt;Josh&lt;/a&gt; helped us a lot by providing a good use-case. We said it in the past, but Superfeedr is yours, and you can thank him for his feedback. We&amp;#8217;re now thrilled that EventVue uses Superfeedr for its &amp;#8220;chatter&amp;#8221; functionality.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;chatter&lt;/em&gt; is a stream that contains any message that was posted by people at a given conference : they write on their &lt;em&gt;blogs&lt;/em&gt;, they &lt;em&gt;tweet&lt;/em&gt;, they post to &lt;em&gt;Youtube&lt;/em&gt;, &lt;em&gt;Flickr&lt;/em&gt;&amp;#8230; it all ends up there. It&amp;#8217;s like &lt;strong&gt;Twitter Lists on steroids&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;EventVue uses &lt;a href=&quot;http://php.net/index.php&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;&lt;/a&gt; and the &lt;a href=&quot;http://superfeedr.com/documentation#pubsubhubbub&quot;&gt;PubSubHubbub &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;. I&amp;#8217;ll just let Josh saying what he likes about Superfeedr :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We&amp;#8217;re really grateful to Superfeedr for the service they provide. Polling thousands of feeds was beginning to be a huge distraction from working on our core product. Superfeedr allowed us to stay focused on the features that matter while still being confident that our feeds will arrive in a timely and reliable manner.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=DfyeXrdZZ1o&quot;&gt;What else&lt;/a&gt;&amp;#8230;&lt;/em&gt;&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Smacksale</title>
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="API" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="heroku" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="smacksale" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="use-case" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/API/heroku/pubsubhubbub/smacksale/use-case/smacksale"/>
        <published>2009-10-21T00:00:00-07:00</published>
        <updated>2009-10-21T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/API/heroku/pubsubhubbub/smacksale/use-case/smacksale</id>
        <content type="html">&lt;p&gt;There is not a day where people don&amp;#8217;t ask us about applications that use Superfeedr. We have been truly &lt;strong&gt;amazed by the quality&lt;/strong&gt; of some of these apps and we thought we should share them with you. Today&amp;#8217;s example is &lt;a href=&quot;http://www.smacksale.com/&quot;&gt;Smacksale&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://smacksale.com/images/logo.png&quot; style=&quot;display:block;margin-left:auto;margin-right:auto;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Smacksale is a &lt;em&gt;simple aggregator&lt;/em&gt; of the &lt;em&gt;best e-commerce deals&lt;/em&gt; out on the web. You can vote up, down or comment these deals : simple, efficient and useful (I just found a &lt;a href=&quot;http://www.smacksale.com/sales/18037-GoGo-in-flight-WiFi-coupon-Free-trial-for-new-users-flying-AirTran-or-Delta/view&quot;&gt;great deal for Gogo Inflight&lt;/a&gt; ; can&amp;#8217;t wait to try it).&lt;/p&gt;
&lt;p&gt;Built for the &lt;a href=&quot;http://r09.railsrumble.com/entries&quot;&gt;2009 Rails Rumble&lt;/a&gt;, Smacksale was created by &lt;a href=&quot;http://twitter.com/adambair&quot;&gt;Adam&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/pradeep24&quot;&gt;Pradeep&lt;/a&gt;, &lt;a href=&quot;http://twitter.com/brendanlim&quot;&gt;Brendan&lt;/a&gt; and &lt;a href=&quot;http://www.intridea.com/about/people/paul&quot;&gt;Paul&lt;/a&gt;. It&amp;#8217;s a &lt;a href=&quot;http://rubyonrails.org/&quot;&gt;RubyOnRails&lt;/a&gt; application, hosted at &lt;a href=&quot;http://heroku.com/&quot;&gt;Heroku&lt;/a&gt; and they use our &lt;a href=&quot;http://superfeedr.com/documentation#pubsubhubbub&quot;&gt;PubSubHubbub &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt; to receive the new deals from other services. They extract the information they need from these notifications and build their own tag-cloud out of them.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>PubSubHubbub for Everybody</title>
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="API" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="publishers" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/API/publishers/pubsubhubbub/white-label-hubs"/>
        <published>2009-10-11T00:00:00-07:00</published>
        <updated>2009-10-11T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/API/publishers/pubsubhubbub/white-label-hubs</id>
        <content type="html">&lt;p&gt;Today is an exciting day! We&amp;#8217;re are at the &lt;a href=&quot;http://www.readwriteweb.com/summit/&quot;&gt;ReadWriteWeb Real-time summit&lt;/a&gt;. If you&amp;#8217;re here, come and ping us, &lt;a href=&quot;http://twitter.com/julien51&quot;&gt;I&lt;/a&gt; wear a yellow sweatshirt.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s also exciting because we&amp;#8217;re launching a &lt;a href=&quot;http://superfeedr.com&quot;&gt;new version of our website&lt;/a&gt; with many many improvements over the previous iteration. I&amp;#8217;d like to thank my friend &lt;a href=&quot;http://beausmith.com/&quot;&gt;Beau&lt;/a&gt; for his great help, as well as &lt;a href=&quot;http://www.davidrecordon.com/&quot;&gt;David&lt;/a&gt;. We&amp;#8217;re perfectly aware that &lt;em&gt;we have a long way to go&lt;/em&gt;, but we&amp;#8217;re &lt;em&gt;moving toward the destination&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If you go check this new iteration, you&amp;#8217;ll immediately notice the shiny orange buttons. The &lt;a href=&quot;http://superfeedr.com/subscriber&quot;&gt;subscriber&lt;/a&gt; part is nothing new, however, the &lt;a href=&quot;http://superfeedr.com/publisher&quot;&gt;publisher&lt;/a&gt; part is brand new!&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re announcing today that Superfeedr now offers &lt;strong&gt;white-label hubs&lt;/strong&gt;. What is that? If you read this blog, you know how crucial it is to &lt;strong&gt;engage your content consumers with real-time data&lt;/strong&gt;, but building a hub is not the most easy thing to do. &lt;a href=&quot;http://blog.superfeedr.com/gospel/something-stupid&quot;&gt;Again&lt;/a&gt;, we&amp;#8217;ve done that for you, so that you don&amp;#8217;t have too.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;re introducing to options :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;A free version&lt;/strong&gt;, where your app&amp;#8217;s hub is accessible at http://appname.superfeedr.com and where you basically just need to add the &amp;#8216;discovery&amp;#8217; tag to your feeds. Check out our &lt;a href=&quot;http://wordpress.superfeedr.com/&quot;&gt;Wordpress&lt;/a&gt; and &lt;a href=&quot;http://identica.superfeedr.com/&quot;&gt;Identica&lt;/a&gt; hubs.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;A &lt;em&gt;for profit&lt;/em&gt; version&lt;/strong&gt;, where you can use your own domain, where the subscribers will not even know that this service is provided by superfeedr.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;#8217;re very excited about that, and we already started working with several great teams to integrate hubs into their apps. What do you think?&lt;/p&gt;
&lt;p&gt;PS: As I write this, I see that our blog&amp;#8217;s layout is not as shinny as I&amp;#8217;d wanted :/ I am working on that&amp;#8230;&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>State of Real-Time feeds</title>
        
        <category term="Real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="statistics" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="market" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Real-time/market/statistics/state-of-realtime-feeds"/>
        <published>2009-10-10T00:00:00-07:00</published>
        <updated>2009-10-10T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/Real-time/market/statistics/state-of-realtime-feeds</id>
        <content type="html">&lt;p&gt;&lt;strong&gt;Real-time is the new hotness&lt;/strong&gt;. At Superfeedr, we&amp;#8217;re lucky enough to have many feeds we&amp;#8217;re fetching, some of them being &lt;a href=&quot;http://code.google.com/p/pubsubhubbub/&quot;&gt;PubSubHubbub&lt;/a&gt; enabled, some of them being &lt;a href=&quot;http://rsscloud.org/&quot;&gt;RSSCloud&lt;/a&gt; and other being none of that. &lt;strong&gt;We&amp;#8217;re in a good position to assess how many feeds are using which technology&lt;/strong&gt;. Being french, I appreciate showing you this &lt;del&gt;pie&lt;/del&gt; camembert chart, which shows how we get the data for the feeds in our database.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/feeds_by_technique-10-09.png&quot; style=&quot;float:left;margin:10px; width:50%;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Please, &lt;em&gt;assume that we have a bias&lt;/em&gt;: we&amp;#8217;re still pretty young, and our bigger users give a &amp;#8220;taste&amp;#8221; to the type of feeds that we have.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re building your own feed polling infrastructure, &amp;#8211; &lt;em&gt;but &lt;a href=&quot;http://blog.superfeedr.com/gospel/something-stupid/&quot;&gt;you obviously shouldn&amp;#8217;t&lt;/a&gt;&lt;/em&gt; -, you can save:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;7.1% of your work by implementing PubSubHubbub subscriber,&lt;/li&gt;
	&lt;li&gt;0.3% if you&amp;#8217;re an RSSCloud subscriber.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you&amp;#8217;ve built that, you can easily do some math and see how much it costs you. Then, &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;use our hub&lt;/a&gt; (it should be trivial since you have implemented PubSubHubbub) for all your feeds, &lt;a href=&quot;http://superfeedr.com/cost&quot;&gt;and start saving&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;We &lt;a href=&quot;http://blog.superfeedr.com/lie/real-time/the-little-lie-about-real-time/&quot;&gt;said a few weeks ago&lt;/a&gt; that we believe that the amount of real-time available feeds is pretty much stable. &lt;em&gt;What is RSSCloud or PubSubHubbub now was either &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; or AtomStream weeks ago&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ll see in the future how these ratios evolve.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Real-Time web browsers</title>
        
        <category term="Real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="gospel" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Seesmic" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Tweetdeck" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Real-time/Seesmic/Tweetdeck/gospel/Real-time-web-browser"/>
        <published>2009-10-08T00:00:00-07:00</published>
        <updated>2009-10-08T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/Real-time/Seesmic/Tweetdeck/gospel/Real-time-web-browser</id>
        <content type="html">&lt;p&gt;&lt;img src=&quot;http://www.devx.com/assets/articlefigs/6939.gif&quot; style=&quot;float:right;margin:3px;&quot; alt=&quot;&quot; /&gt;&lt;br /&gt;
The &lt;a href=&quot;http://blog.superfeedr.com/gospel/real-time/time-vs-space/&quot;&gt;web was geographical&lt;/a&gt; (&lt;a href=&quot;http://www.arcticstartup.com/2009/09/11/the-web-at-a-new-crossroads/&quot;&gt;document-based&lt;/a&gt;) until very recently and it is now evolving faster and faster to add a &amp;#8220;time&amp;#8221; dimension. Back in the days, &lt;a href=&quot;http://en.wikipedia.org/wiki/Mosaic_(web_browser)&quot;&gt;Mosaic&lt;/a&gt; was the very first tool to actually browse these sites from a site to another. Unfortunately, &lt;strong&gt;all these browsers were built to deal with documents, not with a stream&lt;/strong&gt;. The best proof of that is the presence of a &amp;#8220;reload&amp;#8221; button!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://twitter.com&quot;&gt;Twitter&lt;/a&gt; and &lt;a href=&quot;http://facebook.com&quot;&gt;facebook&lt;/a&gt; are definitely making real-time web mainstream, but they are just &amp;#8220;content&amp;#8221; producers, &lt;strong&gt;we need the browsers to consume that content&lt;/strong&gt;. And before the browsers, &lt;em&gt;we need the protocols&lt;/em&gt; (I&amp;#8217;ll talk about that later!).&lt;/p&gt;
&lt;p&gt;There are many tools that start to look like this &lt;strong&gt;real-time browser&lt;/strong&gt; : &lt;a href=&quot;http://seesmic.com&quot;&gt;Seesmic&lt;/a&gt; is paving the way, &lt;a href=&quot;http://tweetdeck.com/beta/&quot;&gt;Tweetdeck&lt;/a&gt; is another example, but &lt;a href=&quot;http://growl.info/&quot;&gt;Growl&lt;/a&gt; also presents some very interesting features. iPhone applications like &lt;a href=&quot;http://appnotifications.com/&quot;&gt;AppNotifications&lt;/a&gt; can also be considered as real-time web browsers.&lt;/p&gt;
&lt;p&gt;Here is the set of functionalities that I&amp;#8217;d like this stream-browser to implement :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;Stream-agnostic&lt;/strong&gt; : Mosaic could display &lt;em&gt;any&lt;/em&gt; web site&amp;#8230; not just and handful of them. Seesmic should be able to receive content from &lt;em&gt;any&lt;/em&gt; stream, not just Twitter or Facebook. &lt;em&gt;I want my &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feeds&lt;/em&gt;, I want my emails, I even want Google news&amp;#8230; etc.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Context-Aware&lt;/strong&gt; : I want the stream to follow me on the desktop, on my phone, or even by fax (yeah!). If I am on the laptop, it should show the message there, if I am watching TV, it should show it there, and if it&amp;#8217;s 3AM, please, do not notify me.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;History&lt;/strong&gt; : I want to be able to travel back in time.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Re-Stream (share)&lt;/strong&gt; : exactly like the Re-Tweet functionality on Twitter. The Real-time browser must not be the &amp;#8216;end&amp;#8217; of the stream : data must flow from there to my friends, to other services that I use&amp;#8230; etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I know all that sounds quite ambitious, but we&amp;#8217;re really not too far from there. All the bricks are ready actually, we just need some glue between them.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>RSSCloud and PubSubHubbub</title>
        
        <category term="rsscloud" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="api" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="PubSubHubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/PubSubHubbub/api/rsscloud/RSSCloud"/>
        <published>2009-10-06T00:00:00-07:00</published>
        <updated>2009-10-06T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/PubSubHubbub/api/rsscloud/RSSCloud</id>
        <content type="html">&lt;p&gt;&amp;#8220;Why make things simple when you can make them complex?&amp;#8221;. It was probably just too easy to have a common &lt;strong&gt;open&lt;/strong&gt; protocol that everyone would share and use for push notifications of feed changes. At Superfeedr, we chose &lt;a href=&quot;http://blog.superfeedr.com/api/http/pubsubhubbub/pubsubhubbub/&quot;&gt;PubSubHubbub&lt;/a&gt;, for &lt;a href=&quot;http://www.techcrunch.com/2009/09/09/rsscloud-vs-pubsubhubbub-why-the-fat-pings-win/&quot;&gt;obvious reasons&lt;/a&gt;, and we&amp;#8217;re quite happy with it.&lt;/p&gt;
&lt;p&gt;Yet, &lt;a href=&quot;http://en.blog.wordpress.com/2009/09/07/rss-in-the-clouds/&quot;&gt;some publishers&lt;/a&gt; have made a different choice and since &lt;em&gt;it always eventually comes down to the customer&amp;#8217;s experience&lt;/em&gt;, we had to implement RSSCloud. Superfeedr is now an &lt;a href=&quot;http://rsscloud.org/walkthrough.html&quot;&gt;aggregator&lt;/a&gt;. As a user, if you give us a feed that is RSSCloud enabled, then, we will subscribe to the right &lt;em&gt;cloud&lt;/em&gt; and you should get updates from this feed in a few seconds as well (exactly like with PubSubHubbub).&lt;/p&gt;
&lt;p&gt;The awesome part of that news: since we use &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;PubSubHubbub as our &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt; (we&amp;#8217;re one of the few independent hubs), this means that if you use us, &lt;em&gt;you don&amp;#8217;t even have to care about RSSCloud&lt;/em&gt;. &lt;a href=&quot;http://blog.superfeedr.com/gospel/something-stupid/&quot;&gt;Once again&lt;/a&gt;, we do all the &amp;#8220;hard&amp;#8221; work for you :) &lt;strong&gt;Just implement the PubSubHubbub subscriber part, and you&amp;#8217;ll get the RSSCloud feeds through that as well&lt;/strong&gt;.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Time vs. Space : how do we apprehend information?</title>
        
        <category term="real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="gospel" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/gospel/real-time/time-vs-space"/>
        <published>2009-09-19T00:00:00-07:00</published>
        <updated>2009-09-19T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/gospel/real-time/time-vs-space</id>
        <content type="html">&lt;p&gt;There are several ways information comes to us, but they are either mostly either &lt;strong&gt;geographical&lt;/strong&gt; or &lt;strong&gt;temporal&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.informationarchitects.jp/slash/iA_WebTrends_2007_2_1600x1024.gif&quot; style=&quot;float:right;margin:3px; width: 50%;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;By geographical, I mean that we basically &lt;strong&gt;lay-out information and draw connections&lt;/strong&gt; between them : a &lt;em&gt;map&lt;/em&gt; can help us understand how a city is organized, how a product is conceived, but also a conference speech is usually &lt;em&gt;logically organized with bullet-points, transitions&lt;/em&gt;, etc&amp;#8230;. &lt;strong&gt;Most of the web information is currently available on a geographical basis&lt;/strong&gt; : a web-site is a collection of pages linked together, and even pages are &amp;#8220;flat&amp;#8221; : related information are usually displayed together. Comments are show under a main story, images are included in the body, etc&amp;#8230; I fully agree to that extend with &lt;a href=&quot;http://factoryjoe.com/&quot;&gt;Chris&lt;/a&gt; and &lt;a href=&quot;http://zengestrom.com/&quot;&gt;Jyri&amp;#8217;s&lt;/a&gt; &lt;a href=&quot;http://www.arcticstartup.com/2009/09/11/the-web-at-a-new-crossroads/&quot;&gt;article&lt;/a&gt; about the web being document-oriented.&lt;/p&gt;
&lt;p&gt;We mostly use the this geographical approach because the &lt;strong&gt;human brain also uses location to relate things&lt;/strong&gt; together : our thoughts are linked and that is how we end-up remember things. Of course, we still have some sort of &amp;#8220;index&amp;#8221; which are the main things from which others are linked, like our name, the place we live in&amp;#8230; but all that started to be connections from stuff we perceived and these connection became so obvious (our brain kept taking them), that we forgot how they happened&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. Everybody started with a mnemonic to remember his phone number, but nobody needs it anymore after some time.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/limowreck666/129125140/&quot;&gt;&lt;img src=&quot;http://farm1.static.flickr.com/52/129125140_e110fd46c1_m.jpg&quot; style=&quot;float:right;margin:3px;&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;real-time web is all about using time, instead of links&lt;/strong&gt;. The connections between elements don&amp;#8217;t matter so much anymore. &lt;a href=&quot;http://twitter.com/public_timeline&quot;&gt;Unrelated tweets stack up&lt;/a&gt;. &lt;strong&gt;Our brain is not so good at stacking things&lt;/strong&gt;. It&amp;#8217;s even pretty bad at that, because in a stack &lt;em&gt;it&amp;#8217;s hard to find links between things&lt;/em&gt;. One of the most common examples is names. How often have you been introduced to some people in a group, just to figure out 10 seconds later that you don&amp;#8217;t even remember anyone&amp;#8217;s name?&lt;/p&gt;
&lt;p&gt;Do you remember the &lt;em&gt;sequence memory game&lt;/em&gt; we used to play when we were kids? You hear a random number between 0 and 10, and must repeat it, then you hear a second number and must repeat both the first and the second&amp;#8230; etc. It is usually very hard past 8 to 10 numbers. &lt;em&gt;It&amp;#8217;s modern counterpart is just remembering a phone number&lt;/em&gt;.&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The fact that our short memory is very bad (or at &lt;a href=&quot;http://www.youtube.com/watch?v=zJAH4ZJBiN8&quot;&gt;least worse than chimpanzee&lt;/a&gt;) can also be related to that as well : we have trouble dealing with short unrelated messages coming at a high frequency, or at the same time (like numbers on a grid).&lt;/p&gt;
&lt;p&gt;As humans, we can deal pretty easily with complex information as long as we can tie things together and lay down this information in a geographical manner. Dealing with a river of news, with a tweet timeline is, on the end, quite stressful, because this information is time-organized.&lt;/p&gt;
&lt;p&gt;I am not sure it&amp;#8217;s &lt;a href=&quot;http://blog.superfeedr.com/meta/reality-checked&quot;&gt;one of the problems&lt;/a&gt; we faced with &lt;a href=&quot;http://notifixio.us/&quot;&gt;Notifixious&lt;/a&gt; (as there are many others), but I know for sure that we will either have to accept to lose parts of this stream of information or train computers to help us relate things in the real-time stream.&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt; I really wish I could remember how I initially linked my name to me; this must have been a huge breakthrough!&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn2&quot;&gt;&lt;sup&gt;2&lt;/sup&gt; The most common technique to split the number in 2 or 3 and ask people to remember a part each is a way to actually transform a stacked-information into something more logical, where we can draw connection between numbers.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>The New Atom Schema is up!</title>
        
        <category term="API" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Atom" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="schema" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/API/Atom/schema/atom-schema"/>
        <published>2009-09-18T00:00:00-07:00</published>
        <updated>2009-09-18T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/API/Atom/schema/atom-schema</id>
        <content type="html">&lt;p&gt;We deployed yesterday a new code for our parsers, and it now includes a more &lt;a href=&quot;http://superfeedr.com/documentation#schema&quot;&gt;complete schema&lt;/a&gt; that will allow you to do a lot more things with superfeedr!&lt;/p&gt;
&lt;h3&gt;Content or summary?&lt;/h3&gt;
&lt;p&gt;Up until now we were considering that anything was a summary, which wasn&amp;#8217;t really accurate since some feeds actually &lt;strong&gt;offer the whole content&lt;/strong&gt;. We fixed that. If the entry contains the full content, you&amp;#8217;ll have a &lt;code&gt;&amp;lt;content&amp;gt;&lt;/code&gt; tag, if not, then, it will have a &lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt; tag.&lt;/p&gt;
&lt;h3&gt;Links&lt;/h3&gt;
&lt;p&gt;The biggest addition is the fact that &lt;code&gt;&amp;lt;entry&amp;gt;&lt;/code&gt; elements now include all the &lt;code&gt;&amp;lt;links&amp;gt;&lt;/code&gt; of the original entry, including attachments. Of course, to differentiate between them you can use the &lt;em&gt;&lt;code&gt;&quot;rel&quot;&lt;/code&gt; value&lt;/em&gt;, as well as &lt;code&gt;&quot;type&quot;&lt;/code&gt; which gives you the &lt;em&gt;mime type&lt;/em&gt;. For example, here is what you&amp;#8217;d receive for this flick &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed :&lt;br /&gt;
&lt;script src=&quot;http://gist.github.com/189179.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;As you can see, there are 2 &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; elements, &lt;strong&gt;one for the entry&lt;/strong&gt; (the page that contains the image), and &lt;strong&gt;one for the image itself&lt;/strong&gt;. These links are various and may include links to the &lt;em&gt;comments section, to the &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feed of comments, to any attachment, to related articles&lt;/em&gt;&amp;#8230; etc.&lt;/p&gt;
&lt;h3&gt;Categories&lt;/h3&gt;
&lt;p&gt;The Web2.0 era has long be associated with the presence of &lt;strong&gt;tags&lt;/strong&gt;, implemented by &lt;a href=&quot;http://delicious.com&quot;&gt;Delicious&lt;/a&gt;, &lt;a href=&quot;http://flickr.com&quot;&gt;Flickr&lt;/a&gt;, &lt;a href=&quot;http://youtube.com&quot;&gt;Youtube&lt;/a&gt; and by bloggers. They are very useful to group things and can do a better job than search engines to find &amp;#8220;binary&amp;#8221; content. &lt;strong&gt;Superfeedr will now provide the tags&lt;/strong&gt; (or categories from the original entries).&lt;br /&gt;
In the above example, you can see that the tags used are &lt;em&gt;sergio, expo, lyon, western and prefecture&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;Authors&lt;/h3&gt;
&lt;p&gt;Last, but not least, we now support &lt;strong&gt;author informations&lt;/strong&gt;. There can be several authors in one entry. For each author, we provide (when available) a &lt;em&gt;name, an email address and a profile &lt;span class=&quot;caps&quot;&gt;URI&lt;/span&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;d like anything else to be added, please let us know in the comments. With the current information, we estimate we cover 80-90% of the original entry content. Also, if you&amp;#8217;re not satisfied with our mapping, please do not hesitate to &lt;a href=&quot;http://blog.superfeedr.com/Atom/schema/a-better-schema/&quot;&gt;suggest fixes&lt;/a&gt; as well.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Real-time RSS notifications on your iPhone</title>
        
        <category term="real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="notification" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="RSS" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="iPhone" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/RSS/iPhone/notification/real-time/real-time-rss-notification-on-iphone"/>
        <published>2009-09-11T00:00:00-07:00</published>
        <updated>2009-09-11T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/RSS/iPhone/notification/real-time/real-time-rss-notification-on-iphone</id>
        <content type="html">&lt;p&gt;I have always been a great fan of the iPhone (I had mine on June 29th 2007 : iPhone D-day), but I haven&amp;#8217;t found many applications that were making good use of the &amp;#8220;notification&amp;#8221; feature that Apple added in its last iPhone OS, until today.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://appnotifications.com/system/app_icons/0000/0001/appnotifications-icos-twitt_large.png?1252050483&quot; style=&quot;float:right;margin:10px;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.appnotifications.com/&quot;&gt;AppNotification&lt;/a&gt; is an app that allows you to receive any notification. Its creator, Fabien just spent the last day interfacing his app with &lt;a href=&quot;http://superfeedr.com&quot;&gt;Superfeedr&lt;/a&gt; and the result is here today : you can get &lt;strong&gt;real-time &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; notifications on your iPhone&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s quite easy :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;First, &lt;a href=&quot;http://bit.ly/19T8V7&quot;&gt;buy the app from the iTunes store&lt;/a&gt; : $1.99.&lt;/li&gt;
	&lt;li&gt;Then, &lt;a href=&quot;http://appnotifications.com/account/new&quot;&gt;create an account&lt;/a&gt; and enter your credentials into the App.&lt;/li&gt;
	&lt;li&gt;Add the &lt;a href=&quot;http://www.appnotifications.com/account/apps/22/authorize&quot;&gt;Superfeedr application&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://appnotifications.com/account/app_user_connections/2619/edit&quot;&gt;Enter a list of &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; feeds&lt;/a&gt; which will be pushed to your iPhone&lt;/li&gt;
	&lt;li&gt;&amp;#8230; &lt;em&gt;wait for notifications to come&lt;/em&gt;!&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;#8217;ve added a few &lt;a href=&quot;http://spy.appspot.com/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; from Spy&lt;/a&gt;, as well as the &lt;a href=&quot;http://weather.yahooapis.com/forecastrss?p=94123&quot;&gt;weather in San Francisco&lt;/a&gt; or the &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; for &lt;a href=&quot;http://feeds.delicious.com/v2/rss/url/00f1b15f8f356e11da3dc20f28a915a8?count=15&quot;&gt;Superfeedr&amp;#8217;s delicious page&lt;/a&gt;, but you could also add any &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; that you&amp;#8217;d like.&lt;/p&gt;
&lt;p&gt;How cool is that?&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt; If you have a superfeedr account, you can generate notifications to the &lt;a href=&quot;http://superfeedr.com/dummy.xml&quot;&gt;dummy feed&lt;/a&gt;, in the console, as long as you add it to your feeds into AppNotifications.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>The little lie about Real-time Data</title>
        
        <category term="real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="lie" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/lie/real-time/the-little-lie-about-real-time"/>
        <published>2009-09-10T00:00:00-07:00</published>
        <updated>2009-09-10T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/lie/real-time/the-little-lie-about-real-time</id>
        <content type="html">&lt;p&gt;It is very exciting to see all the jazz about &lt;strong&gt;real-time data&lt;/strong&gt; being available. It is however a little disappointing that the &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; vs. Atom war is starting again through the &lt;em&gt;PubSubHubbub vs. RssCloud conflict&lt;/em&gt; (read &lt;a href=&quot;http://www.techcrunch.com/2009/09/09/rsscloud-vs-pubsubhubbub-why-the-fat-pings-win/&quot;&gt;Techcrunch&amp;#8217;s post&lt;/a&gt; about that). &lt;a href=&quot;http://en.blog.wordpress.com/2009/09/07/rss-in-the-clouds/&quot;&gt;Wordpress said they will adopt RssCloud&lt;/a&gt;, while &lt;a href=&quot;http://googlecode.blogspot.com/2009/08/towards-programmable-web-pubsubhubbub.html&quot;&gt;Google massively adopted PubSubHubbub&lt;/a&gt; and &lt;a href=&quot;http://sixapart.com&quot;&gt;SixApart&lt;/a&gt; showed strong interest for the latter.&lt;/p&gt;
&lt;p&gt;The only little lie about that is that &lt;em&gt;almost all of the data that you can access through these hubs or clouds, was actually already available through other Real-time&lt;/em&gt; (or close to real-time) means. SixApart has had an &lt;strong&gt;AtomStream&lt;/strong&gt; for years, Google implemented the &lt;strong&gt;changes.xml syntax&lt;/strong&gt; a few years ago and Wordpress announced last year that they had an &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; stream&lt;/strong&gt; with all the blog posts and comments.&lt;/p&gt;
&lt;p&gt;Again, don&amp;#8217;t get me wrong : this is really exciting that from having 1 technology for each provider we now have &lt;del&gt;almost&lt;/del&gt; the same protocols across the board, but I think that proves also why we need services like Superfeedr : a huge part of the content that is published daily is not being pushed to anywhere.&lt;/p&gt;
&lt;p&gt;Again, pushing your content to reduce the &amp;#8220;polling&amp;#8221; load makes sense, but we strongly believe that &lt;strong&gt;the vast majority of the data out there will probably never be pushed&lt;/strong&gt; to any hub of cloud, and that&amp;#8217;s precisely where Superfeedr is so useful!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>What API to choose</title>
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="xmpp" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="API" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/API/pubsubhubbub/xmpp/what-api-to-choose"/>
        <published>2009-09-08T00:00:00-07:00</published>
        <updated>2009-09-08T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/API/pubsubhubbub/xmpp/what-api-to-choose</id>
        <content type="html">&lt;p&gt;Superfeedr is &lt;em&gt;technology-agnostic&lt;/em&gt;, which means that we don&amp;#8217;t force you into any &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;. &lt;a href=&quot;http://blog.superfeedr.com/OSS/gospel/kind-of-open-source/&quot;&gt;We use standards&lt;/a&gt; so that our users aren&amp;#8217;t locked in any way to our service. However, being agnostic doesn&amp;#8217;t mean that a solution is not better than another one in your specific case.&lt;/p&gt;
&lt;p&gt;Actually, we even believe that in some cases, it is better to use &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; and in some it is better to use PubSubHubbub. We creates this small &amp;#8220;decision-chart&amp;#8221; to help you decide with yes/no questions. Of course, this would apply to 99% of cases and there will always be times that this chart is wrong, but I am pretty confident that it should work for you.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/api-decision-chart.png&quot; style=&quot;margin: 10px; width:80%;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;What do you think?&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Getting Started with PubSubHubbub</title>
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="API" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/API/pubsubhubbub/getting-started-with-pubsubhubbub"/>
        <published>2009-09-02T00:00:00-07:00</published>
        <updated>2009-09-02T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/API/pubsubhubbub/getting-started-with-pubsubhubbub</id>
        <content type="html">&lt;p&gt;To my knowledge, Superfeedr is the only non-google PubSubHubbub out there. Let&amp;#8217;s see why and how to use it.&lt;/p&gt;
&lt;h3&gt;Why using PubSubHubbub?&lt;/h3&gt;
&lt;p&gt;Superfeedr &lt;a href=&quot;http://superfeedr.com/documentation&quot;&gt;provides 2 &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;. Here are some reasons why you&amp;#8217;d be better off &lt;strong&gt;using the PubSubHubbub &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;You don&amp;#8217;t want to run a background job&lt;/li&gt;
	&lt;li&gt;You have an existing Web application&lt;/li&gt;
	&lt;li&gt;You already use PubSubHubbub with another hub.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And here are a few reasons why you may want to &lt;strong&gt;avoid the PubSubHubbub &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Your endpoint (where you will receive notifications) is *behind a firewall&lt;/li&gt;
	&lt;li&gt;You want to receive a notification each time Superfeedr fetches and parses a feed for you&lt;/li&gt;
	&lt;li&gt;Your endpoint(s) are either desktop applications or embedded applications&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What do I need to do?&lt;/h3&gt;
&lt;p&gt;The PubSubHubbub &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; will allow you to receive notifications from us when we identify new entries in feeds to which you subscribed. Thus, there are 2 things that you need to do : &lt;em&gt;subscribe&lt;/em&gt; and &lt;em&gt;implement a &amp;#8220;receiver&amp;#8221; to deal with notifications&lt;/em&gt;.&lt;/p&gt;
&lt;h4&gt;Subscription&lt;/h4&gt;
&lt;p&gt;The subscription process is not obvious, because the hub needs to verify your intent. Here is how it works.&lt;br /&gt;
Our hub is located at &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;http://superfeedr.com/hubbub&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Send an &lt;strong&gt;authenticated&lt;/strong&gt; (with your superfeedr login/password) &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;POST&lt;/span&gt; request&lt;/strong&gt; to our &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; with the following parameters : &lt;br /&gt;
    &amp;#8211; &lt;em&gt;hub.mode&lt;/em&gt; = subscribe|unsubscribe&lt;br /&gt;
    &amp;#8211; &lt;em&gt;hub.verify&lt;/em&gt; = sync&lt;br /&gt;
    &amp;#8211; &lt;em&gt;hub.callback&lt;/em&gt; = http://domain.tld/your/callback&lt;br /&gt;
    &amp;#8211; &lt;em&gt;hub.topic&lt;/em&gt; = http//feeds.you.want.to/subscribe&lt;/li&gt;
	&lt;li&gt;When our server receives this &lt;span class=&quot;caps&quot;&gt;POST&lt;/span&gt; request, it will &lt;strong&gt;send back a &lt;span class=&quot;caps&quot;&gt;GET&lt;/span&gt; request to your callback &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt;&lt;/strong&gt;, with the following :&lt;br /&gt;
    &amp;#8211; &lt;em&gt;hub.mode&lt;/em&gt; = subscribe|unsubscribe&lt;br /&gt;
    &amp;#8211; &lt;em&gt;hub.topic&lt;/em&gt; = http//feeds.you.want.to/subscribe&lt;br /&gt;
    &amp;#8211; &lt;em&gt;hub.challenge&lt;/em&gt; = a-random-string&lt;/li&gt;
	&lt;li&gt;If your server &lt;strong&gt;echoes the hub.challenge&lt;/strong&gt; parameter (along with a 200 response), the &lt;strong&gt;subscription will be accepted&lt;/strong&gt;. It will be refused in any other case.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To debug the process, you can use &lt;a href=&quot;http://hurl.r09.railsrumble.com/hurls/ea7a8a4fbc75d92497f6e1ce4f904cb5b4c04609/59aa8bca27078865519ded6c7c8d01023789348f&quot;&gt;this hurl to send subscriptions requests&lt;/a&gt; (don&amp;#8217;t forget to adjust the values of the params, though). &lt;a href=&quot;http://curl.haxx.se/&quot;&gt;Curl&lt;/a&gt; is another great option.&lt;/p&gt;
&lt;h4&gt;Receive Notifications&lt;/h4&gt;
&lt;p&gt;Your application must &amp;#8220;deal&amp;#8221; with the notifications. Notifications are &lt;span class=&quot;caps&quot;&gt;POST&lt;/span&gt; requests sent to you callback &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt;, the new entries are in the request body. You then have to use an &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt; parser to fetch that body. Since we use standard &lt;span class=&quot;caps&quot;&gt;ATOM&lt;/span&gt;, any parser that can deal with &lt;span class=&quot;caps&quot;&gt;ATOM&lt;/span&gt; will be great.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re using a web application framework like Rails, Django, Merb or Symfony, it should be quite easy to register a &amp;#8220;route&amp;#8221; connected to the right Controller, in charge of parsing this body.&lt;/p&gt;
&lt;h3&gt;Existing libraries and plugins&lt;/h3&gt;
&lt;p&gt;The great advantage about using a standard protocol, is that you can re-use any &amp;#8220;code&amp;#8221; that&amp;#8217;s been written for other hubs. Here is a small list of existing libraries that can help you deal with the subscriptions and handling notification from your web app. That should all be fairly easy to implement.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;http://github.com/empika/Superfeedr-PubSubHubbub-Rails-Plugin/tree/master&quot;&gt;Empika&amp;#8217;s Rails plugin&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://git.participatoryculture.org/djpubsubhubbub/&quot;&gt;Django App&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://github.com/igrigorik/PubSubHubbub/tree/master&quot;&gt;Ilya&amp;#8217;s EventMachine Ruby daemon&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/pubsubhubbub/source/browse/trunk/subscriber_clients/php/subscriber.php&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt; subscriber Client&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://framework.zend.com/code/browse/Standard_Incubator/library/Zend/Feed/Pubsubhubbub&quot;&gt;Zend Subscriber&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://hackage.haskell.org/package/pubsub-0.10&quot;&gt;Haskell Client&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/pubsubhubbub/source/browse/#svn/trunk/subscriber&quot;&gt;Python Subscriber&lt;/a&gt;&lt;br /&gt;
&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also find several &lt;a href=&quot;http://github.com/search?langOverride=&amp;amp;q=pubsubhubbub&quot;&gt;PubSubHubbub repositories on github&lt;/a&gt;, some of them claim to implement the subscriber part of the protocol.&lt;/p&gt;
&lt;p&gt;Finally, please take the time to read our &lt;a href=&quot;http://superfeedr.com/documentation#pubsubhubbub&quot;&gt;PubSubHubbub documentation&lt;/a&gt; as this blog post is just a &amp;#8220;getting started&amp;#8221; guide.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Real-time search</title>
        
        <category term="meta" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="search" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="foo" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/foo/meta/real-time/search/real-time-search"/>
        <published>2009-08-29T00:00:00-07:00</published>
        <updated>2009-08-29T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/foo/meta/real-time/search/real-time-search</id>
        <content type="html">&lt;p&gt;Yes, I am pissed off I am not at &lt;a href=&quot;http://en.wikipedia.org/wiki/Foo_Camp&quot;&gt;Foo Camp&lt;/a&gt;, but I am working to be there next year, bear with me. I really wish I could be there because I think we&amp;#8217;re making the term &amp;#8220;real-time web&amp;#8221; as the new &amp;#8220;web 2.0&amp;#8221; : a &lt;a href=&quot;http://twitter.com/plasticbagUK/status/3638809764&quot;&gt;brand as Tom calls it&lt;/a&gt;. &lt;em&gt;&amp;#8220;Blahblah is doing real-time&amp;#8221;&lt;/em&gt;, &lt;em&gt;&amp;#8220;Blihblih has a real-time approach&amp;#8221;&lt;/em&gt;&amp;#8230; And this is bad : when words lose their meaning, concepts get over-looked. &lt;strong&gt;This is not just playing on words&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Real-time_computing&quot;&gt;Real-time is not instantaneity&lt;/a&gt;. &lt;strong&gt;Real-time means time-constrained&lt;/strong&gt;. That&amp;#8217;s it. That constraint can of course be low (up to the second if you want, even).&lt;/p&gt;
&lt;p&gt;Based on that, a real-time search engine would be a search engine that would be able to &lt;strong&gt;guarantee that the results of your query happened within an X seconds/minutes/hours/days&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If I search for &lt;a href=&quot;http://search.twitter.com/search?q=foo&quot;&gt;&amp;#8216;Foo&amp;#8217; on twitter&lt;/a&gt;, Twitter tells me that the constraint is &amp;#8216;now&amp;#8217; (&lt;em&gt;See what&amp;#8217;s happening — right now.&lt;/em&gt;), I am guaranteed that the results have been posted &amp;#8216;now&amp;#8217; : I&amp;#8217;ll leave the now definition to Twitter :D.&lt;/p&gt;
&lt;p&gt;By studying a query over different time-constraints (within 1 year, 1 month, 1 day, 1 hour), we can probably get very interesting results : maybe something like the log of Google&amp;#8217;s &lt;a href=&quot;http://battellemedia.com/archives/000063.php&quot;&gt;Database of Intentions&lt;/a&gt;. Applied to Twitter, that would allow us to &lt;em&gt;learn a lot on how we communicate, react to &amp;#8220;information&amp;#8221; and propagate it, or even correlation between things people are talking about&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Remember when Google &lt;a href=&quot;http://www.google.org/flutrends/&quot;&gt;announced they could predict&lt;/a&gt; the &amp;#8220;flu trend&amp;#8221; better than the &lt;span class=&quot;caps&quot;&gt;CDC&lt;/span&gt;? Well, my bet is that &lt;strong&gt;Twitter can do that even better than Google&lt;/strong&gt;, and for maybe less &amp;#8220;common&amp;#8221; things. A real-time search on &lt;a href=&quot;http://search.twitter.com/search?q=heading&quot;&gt;heading&lt;/a&gt; into Twitter, coupled with a hint of geo-localisation and a pinch of semantic analysis would probably be quite powerful to know (and predict) what the traffic looked like at a given place, on a given time.&lt;/p&gt;
&lt;p&gt;Want to predict the &amp;#8220;economy&amp;#8221;? Track down keywords like &amp;#8220;laid off/let go&amp;#8221;, &amp;#8220;hired&amp;#8221;, &amp;#8220;profit&amp;#8221;, &amp;#8220;loss&amp;#8221;, &amp;#8220;chapter 11&amp;#8221;&amp;#8230;&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>A new Architecture</title>
        
        <category term="api" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="xmpp" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="architecture" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/api/architecture/pubsubhubbub/xmpp/simpler-architecture"/>
        <published>2009-08-25T00:00:00-07:00</published>
        <updated>2009-08-25T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/api/architecture/pubsubhubbub/xmpp/simpler-architecture</id>
        <content type="html">&lt;p&gt;No post for almost 2 weeks : we&amp;#8217;ve been incredibly busy. We had a lot of instability in the past 10 days, in conjonction (but not related) to significant &lt;a href=&quot;/api/pubsubhubbub/xmpp/API-changes/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; changes&lt;/a&gt;. We&amp;#8217;d like to apologize for the few times when you had problems accessing our service. We&amp;#8217;ve done our best to limit these downtime periods and most of the time they only affected subscription/unsubscriptions : &lt;strong&gt;notifications were still going on, as usual&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In that period, the number of feeds in our system increased by 50%, most of them through the &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;PubSubHubbub &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt;. This significant growth in the &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; traffic made light on the weaknesses of our &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; architecture. The &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; had a direct access to the MySQL database. &lt;em&gt;This was quite bad design from us, as both the &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; and &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; were accessing this database and basically doing the same thing : subscribing and unsubscribing users to feeds&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;As I am a true &lt;a href=&quot;http://bit.ly/3lJOzV&quot;&gt;&lt;span class=&quot;caps&quot;&gt;DRY&lt;/span&gt;&lt;/a&gt; lover, I just hated the fact that we had to create and maintain 2 components doing exactly the same thing and I&amp;#8217;ve been looking for ways to change that.&lt;/p&gt;
&lt;p&gt;Here is how our architecture looked like until this morning:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/before.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;The &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; App would deal with all subscriptions and unsubscriptions, as well as notifications from users using the &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;. Nothing changed there.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;The Web app would do the same with both the website (you can add/remove feeds through our website) and the PubSubHubbub &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;. It was a plain vanilla Rails application.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;It was simple to understand, but not so clean and probably not very easy to maintain, since we have so much duplicate information. I was also &amp;#8220;scared&amp;#8221; by the scaling issues we might have had to face on both sides, but I knew that our &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; app can scale pretty easily as &lt;a href=&quot;http://xmpp.org/extensions/xep-0114.html&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; components&lt;/a&gt; are load balanced by default by &lt;a href=&quot;http://www.ejabberd.im/&quot;&gt;EJabberd&lt;/a&gt;, which means that we can scale horizontally in a mater of minutes (&lt;a href=&quot;http://blog.superfeedr.com/chef/configuration/deployment/infrastructure/scale-with-chef/&quot;&gt;Chef is great&lt;/a&gt;!).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is how it looks like now:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/after.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;At first sight it looks more complex, and you&amp;#8217;re probably right, but it&amp;#8217;s also more coherent and much much much dryer. What changed? Basically, &lt;strong&gt;both the web app and the PubSubHubbub &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; became &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; clients&lt;/strong&gt;, as they now both access the &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; App to add/remove/list subscriptions. In both cases, this is &lt;a href=&quot;http://xmpp.org/extensions/xep-0206.html&quot;&gt;&lt;span class=&quot;caps&quot;&gt;BOSH&lt;/span&gt;&lt;/a&gt; magic.&lt;/p&gt;
&lt;p&gt;Bosh is and &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; extension that allows bi-directional streams &amp;#8211; very much like &lt;a href=&quot;http://blog.leahculver.com/2009/07/a-is-for-ajax-and-c-is-for-comet.html&quot;&gt;comet&lt;/a&gt; -. &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; has a &lt;span class=&quot;caps&quot;&gt;BOSH&lt;/span&gt; extension, that has been implemented in eJabberd. Once you&amp;#8217;ve got this stream, &lt;em&gt;it&amp;#8217;s pretty easy to transmit &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; traffic over &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;&lt;/em&gt;. A key feature is that these connection are &amp;#8220;stored&amp;#8221; on the &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; side of the &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; server. It means that as long as your client remembers the session id of this stream, you can re-connect to the &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; server and take the connection where it was left.&lt;/p&gt;
&lt;h4&gt;The web app : Strophe&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://code.stanziq.com/strophe/&quot;&gt;Strophe&lt;/a&gt; is a very well done Javascript library for &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt;. My friend &lt;a href=&quot;http://metajack.im/&quot;&gt;Jack&lt;/a&gt; wrote it and it&amp;#8217;s awesome. Among its key advantages : a simple syntax, very close to &lt;a href=&quot;http://jquery.com/&quot;&gt;Jquery&lt;/a&gt;, and an &amp;#8220;attach&amp;#8221; feature that allows the application server (Rails in our case), to start the &lt;span class=&quot;caps&quot;&gt;BOSH&lt;/span&gt; stream and then hand it over to Javascript so that user credentials are never sent back to the client. That is exactly what we used for the web application. You can now list, unsubscribe, and subscribe to feeds through a simple interface that uses our &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;. How cool is that?&lt;/p&gt;
&lt;h4&gt;PubSubHubbub : Proxying&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;http://code.google.com/p/pubsubhubbub/&quot;&gt;PubSubHubbub&lt;/a&gt; is an &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;. That was a little trickier, because obviously, running javascript on the server side doesn&amp;#8217;t make much sense. However, like any &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;, we can of course &amp;#8220;proxy&amp;#8221; it from Rails. That is what we did. &lt;br /&gt;
Here is what happens when you subscribe or unsubscribe with the PubSubHubbub &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; :&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;on the server&lt;/strong&gt;, it starts an &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; Bosh session with your credentials&lt;/li&gt;
	&lt;li&gt;it sends the corresponding &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; query,&lt;/li&gt;
	&lt;li&gt;it translate the &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; response&lt;/li&gt;
	&lt;li&gt;it returns it to you as an &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; response.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Of course, there is a performance cost to that, but it&amp;#8217;s not that big, as our &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; server is &amp;quot;geographically&amp;quot;&amp;quot; very close to the &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; app. Also, at the first PubSubHubbub query that you make, we store the connection into a &lt;a href=&quot;http://www.danga.com/memcached/&quot;&gt;Memcached&lt;/a&gt; server, which allows faster processing on the following requests. In terms of results, we can server any PubSubHubbub query in something like 200ms to 500ms. It is slow, but don&amp;#8217;t forget that we also &lt;a href=&quot;http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.1.html#verifysub&quot;&gt;check acceptance of the subscription/unsusbcription&lt;/a&gt; (by sending an &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;GET&lt;/span&gt; request) on your side, and that accounts for the biggest part of that time, actually.&lt;/p&gt;
&lt;p&gt;We &lt;a href=&quot;http://blog.superfeedr.com/dev/gospel/web-apps/the-future-of-web-apps/&quot;&gt;wrote it earlier&lt;/a&gt;, but we&amp;#8217;re true believers in the fact that web apps are about to see a massive shift in their architecture, and we think that &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; based apps, where the browser is just an &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; client are going to be a significant part of that trend. We hope &lt;a href=&quot;http://superfeedr.com&quot;&gt;Superfeedr&lt;/a&gt; will be an example that parents will show their kids, when they teach them about web apps ;) (Other cool examples include &lt;a href=&quot;http://collecta.com/&quot;&gt;Collecta&lt;/a&gt; or &lt;a href=&quot;https://presentlyapp.com/&quot;&gt;Present.ly&lt;/a&gt; &amp;#8230;)&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>API changes</title>
        
        <category term="api" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="xmpp" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/api/pubsubhubbub/xmpp/API-changes"/>
        <published>2009-08-08T00:00:00-07:00</published>
        <updated>2009-08-08T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/api/pubsubhubbub/xmpp/API-changes</id>
        <content type="html">&lt;p&gt;With more and more users, we get more and more feedback and we&amp;#8217;re slowly but surely improving our service to take into account all that feedback. As a consequence, every once in a while we need to push a new codebase with slight changes in the &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;. Hopefully these changes should be &lt;a href=&quot;http://en.wikipedia.org/wiki/Backward_compatibility&quot;&gt;backward compatible&lt;/a&gt;, which means &lt;strong&gt;they shouldn&amp;#8217;t affect any of the existing applications&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This changes will be &lt;strong&gt;released on, or after August 15&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;Subscription &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; changes&lt;/h3&gt;
&lt;p&gt;Up until now, subscription &lt;em&gt;end-points where &amp;#8220;user-centric&amp;#8221;&lt;/em&gt; which means that you could only have one &lt;span class=&quot;caps&quot;&gt;JID&lt;/span&gt; or one web-hook for all the user&amp;#8217;s subscriptions. &lt;strong&gt;From now on, you will be able to have a specific endpoint for each subscription&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;A different &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; for each of your PubSubHubbub subscriptions&lt;/strong&gt;. Technically, this means that Superfeedr will implement the full specification, including the &lt;a href=&quot;http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.1.html#anchor5&quot;&gt;subscription verification&lt;/a&gt;. That requires a little bit more work on the subscriber side, but it also gives you more flexibility with different &lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt; for different &amp;#8220;types&amp;#8221; of feeds, or even a simple load-balancing on the subscriber side.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;A different &lt;span class=&quot;caps&quot;&gt;JID&lt;/span&gt; for each of your &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; subscriptions&lt;/strong&gt;, as long as the subscription &lt;span class=&quot;caps&quot;&gt;JID&lt;/span&gt; matches the IQ jid. If the IQ jid (in the &amp;#8220;from&amp;#8221; attribute) is:
	&lt;ul&gt;
		&lt;li&gt;a regular &lt;span class=&quot;caps&quot;&gt;JID&lt;/span&gt;, like &lt;em&gt;user@server.tld&lt;/em&gt;, you will only be able to subscribe with &lt;em&gt;user@server.tld&lt;/em&gt;&lt;/li&gt;
		&lt;li&gt;a &amp;#8220;component jid&amp;#8221; like &lt;em&gt;component.server.tld&lt;/em&gt;, you will be able to subscribe with &lt;em&gt;any-user@component.server.tld&lt;/em&gt;.&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a consequence you&amp;#8217;ll be able to have both PubSubHubbub and &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt;/PubSub notifications, even for the same feeds. But, don&amp;#8217;t forget : we charge by the notification : 2 subscriptions to the same feed with different endpoints means you will be charged twice for the 2 notifications.&lt;/p&gt;
&lt;p&gt;By default, for all the subscriptions prior to this change, we will use by default your user-defined endpoint.&lt;/p&gt;
&lt;h3&gt;Subscriptions listing changes&lt;/h3&gt;
&lt;p&gt;This is only valid for the &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; since the PubSubHubbub doesn&amp;#8217;t define any subscription listing &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;.&lt;br /&gt;
We will send status information along with the feeds, like in this example :&lt;br /&gt;
&lt;script src=&quot;http://gist.github.com/164251.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;Similarly, you will receive the feed information upon subscription with the &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Please, note that, contrary to notifications, the &amp;lt;status&amp;gt; will not include a feed attribute, as the feed url is already included in the &amp;lt;subscription&amp;gt; node attribute.&lt;/p&gt;
&lt;p&gt;We appreciate your feedback and are committed to implement as much as we can in a non-destructive way to avoid any compatibility issue. Please, if you see problem in any of your apps, do not hesitate to get in touch with us and we will shortly find a solution.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Performance monitoring with collectd</title>
        
        <category term="OSS" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="open-source" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="infrastructure" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="collectd" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/OSS/collectd/infrastructure/open-source/performance-monitoring-with-collectd"/>
        <published>2009-08-07T00:00:00-07:00</published>
        <updated>2009-08-07T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/OSS/collectd/infrastructure/open-source/performance-monitoring-with-collectd</id>
        <content type="html">&lt;p&gt;One challenge we face when working in the Cloud is knowing &lt;strong&gt;when to &lt;a href=&quot;http://blog.superfeedr.com/chef/configuration/deployment/infrastructure/scale-with-chef/&quot;&gt;scale up&lt;/a&gt;.&lt;/strong&gt; That means we need some obvious figures telling us we need more resources.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/collectd.png&quot; style=&quot;float: right; margin: 5px;&quot; alt=&quot;&quot; /&gt; This requires performance monitoring. From the many tools around we chose &lt;a href=&quot;http://collectd.org/&quot;&gt;collectd&lt;/a&gt;. This daemon is built on a very sleek plugin infrastructure, allowing it to run with only the functionality you actually need. If you want to know how clean C looks the collectd source code is worth a look.&lt;/p&gt;
&lt;p&gt;Contrary to a lot of other monitoring software, the watched hosts don&amp;#8217;t have listening network sockets but &lt;strong&gt;only send &lt;span class=&quot;caps&quot;&gt;UDP&lt;/span&gt; packets&lt;/strong&gt; to a central server. It&amp;#8217;s not necessary to control any data gathering from the outside, thus it avoids potential remote security holes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/collectd-mem.png&quot; style=&quot;float:left; margin: 10px;&quot; alt=&quot;&quot; /&gt; The primary use of collectd is &lt;strong&gt;monitoring of operating system resources&lt;/strong&gt; and this is done very efficiently by its native plugins. There&amp;#8217;s no expensive &lt;code&gt;fork()&lt;/code&gt; for calling other programs. If you still need that, there&amp;#8217;s a &lt;a href=&quot;http://collectd.org/documentation/manpages/collectd-exec.5.shtml&quot;&gt;exec&lt;/a&gt; plugin for that.&lt;/p&gt;
&lt;p&gt;Once you figured out which host is responsible for gathering all the data, you can configure collectd&amp;#8217;s &lt;a href=&quot;http://collectd.org/documentation/manpages/collectd.conf.5.shtml#plugin_network&quot;&gt;network plugin&lt;/a&gt; to open a listening socket for receiving other hosts&amp;#8217; statistics.&lt;/p&gt;
&lt;p&gt;To make use of the collected data you&amp;#8217;ve got the &lt;a href=&quot;http://collectd.org/documentation/manpages/collectd.conf.5.shtml#plugin_rrdtool&quot;&gt;rrdtool plugin&lt;/a&gt; which writes locally-generated or remotely-received values into the round-robin database files of the popular and proven &lt;a href=&quot;http://oss.oetiker.ch/rrdtool/&quot;&gt;rrdtool&lt;/a&gt;. Pay attention to the configuration of that plugin: once you start monitoring dozens of hosts with hundreds of plugins, rrdtool will randomly write to the many &lt;span class=&quot;caps&quot;&gt;RRD&lt;/span&gt; files. There are some tunable parameters and the &lt;a href=&quot;http://collectd.org/documentation/manpages/collectd.conf.5.shtml#plugin_rrdcached&quot;&gt;rrdcached&lt;/a&gt; solution.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/collectd-superparsr.png&quot; style=&quot;float:right; margin: 10px;&quot; alt=&quot;&quot; /&gt; You can generate your pretty graphs with the &lt;strong&gt;rrdgraph&lt;/strong&gt; utility. This is being done by the included &lt;strong&gt;collection3&lt;/strong&gt; &lt;span class=&quot;caps&quot;&gt;CGI&lt;/span&gt; scripts. Unfortunately, this web interface is rather Web 1.0 and allows basic browsing of your graphs only. We hope for the advent of some alternative projects to allow more convenient viewing of statistics.&lt;/p&gt;
&lt;p&gt;Because we do not only want to watch host resources but also the quality of our processes we have developed the &lt;a href=&quot;http://github.com/astro/ruby-collectd/&quot;&gt;ruby-collectd&lt;/a&gt; library. Basically, you just define a collectd server on application startup and sprinkle your code with statements like &lt;code&gt;Stats.counter(:job_done).count! 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;ruby-collectd does not require collectd, so you don&amp;#8217;t need to install it locally just for watching your own application.&lt;/p&gt;</content>
        <author>
            <name>Astro</name>
            <uri>http://identi.ca/astro</uri>
        </author>
    </entry>
    
    <entry>
        <title>Harper's friends</title>
        
        <category term="use-case" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="friends" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="harper" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/friends/harper/use-case/harper-s-friends"/>
        <published>2009-08-05T00:00:00-07:00</published>
        <updated>2009-08-05T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/friends/harper/use-case/harper-s-friends</id>
        <content type="html">&lt;p&gt;There is &lt;strong&gt;already a lot of fun stuff&lt;/strong&gt; that people are doing with &lt;a href=&quot;http://superfeedr.com&quot;&gt;Superfeedr&lt;/a&gt; and we thought it would be interesting to share them here. Of course, if you have any story, you can either write it on your blog and we&amp;#8217;ll link to it (on &lt;a href=&quot;http://twitter.com/superfeedr&quot;&gt;twitter&lt;/a&gt; or here), or you can send it by email and we will be more than happy to post it on this &lt;a href=&quot;http://blog.superfeedr.com&quot;&gt;blog&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://twitter.com/harper&quot;&gt;Harper&lt;/a&gt; was among our very first users, and even though he told be he was interested by &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt;, it seems that he fell in love with &lt;a href=&quot;http://blog.superfeedr.com/api/http/pubsubhubbub/pubsubhubbub/&quot;&gt;PubSubHubbub&lt;/a&gt;. Over the course of last week end he created a small app called &lt;a href=&quot;http://www.harpersfriends.com/&quot;&gt;Harper&amp;#8217;s friends&lt;/a&gt; (Oh Yeah!) which basically aggregates the content of his friends &lt;a href=&quot;http://www.harpersfriends.com/tweets/&quot;&gt;twits&lt;/a&gt;, &lt;a href=&quot;http://www.harpersfriends.com/photos/&quot;&gt;pictures&lt;/a&gt; and &lt;a href=&quot;http://www.harpersfriends.com/blogs/&quot;&gt;blog posts&lt;/a&gt; on a page. You can also show items by users or by type, like a standalone &lt;a href=&quot;http://friendfeed.com&quot;&gt;friendfeed&lt;/a&gt; if you want.&lt;/p&gt;
&lt;p&gt;All the polling content is done via Superfeedr and he uses the &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;PubSubHubbub &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt; to notify an &lt;a href=&quot;http://code.google.com/appengine/&quot;&gt;AppEngine&lt;/a&gt; app. I guess the fact that you can&amp;#8217;t run &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; apps on appengine (&lt;a href=&quot;http://googleappengine.blogspot.com/2009/02/roadmap-update.html&quot;&gt;yet&lt;/a&gt;) was one of the reasons he chose the web based &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;One of the key reasons to use Superfeedr is that you don&amp;#8217;t have to deal with (or even care about) &lt;em&gt;building a polling infrastructure&lt;/em&gt;. Believe it or not, but I can bet Harper would have spent easily 2 or 3 times the time he spent if he had to implement that, and he would probably not have had the same kind of results that we have (probably because that would be overkill).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Focus on what you do best and we will focus on what we do best&lt;/strong&gt;. This way, the world will be awesome.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Scale with Chef</title>
        
        <category term="chef" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="deployment" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="infrastructure" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="configuration" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/chef/configuration/deployment/infrastructure/scale-with-chef"/>
        <published>2009-08-02T00:00:00-07:00</published>
        <updated>2009-08-02T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/chef/configuration/deployment/infrastructure/scale-with-chef</id>
        <content type="html">&lt;p&gt;This will be a long post, but it deserves some time. Go get a glass of water, breathe deeply and let&amp;#8217;s dive!&lt;/p&gt;
&lt;h3&gt;The why?&lt;/h3&gt;
&lt;p&gt;Even though we use &amp;#8220;smart&amp;#8221; techniques to get content from the feeds in real-time (or close), we still need to do some polling (remember, &lt;a href=&quot;http://blog.superfeedr.com/gospel/something-stupid/&quot;&gt;we&amp;#8217;re doing something stupid, so that you don&amp;#8217;t have to&lt;/a&gt;). To achieve that, we have a distributed architecture where workers can ask dispatchers for feeds to parse.&lt;/p&gt;
&lt;p&gt;From there it is somehow easy to scale : &lt;strong&gt;more feeds to fetch? add more workers&lt;/strong&gt;. We&amp;#8217;re building a system that, at any given time knows how many workers are (and will be) needed. Once we know that, we just have to fire off some new workers (or kill unneeded ones), and we need this to happen in something like 5 minutes.&lt;/p&gt;
&lt;h3&gt;Theory&lt;/h3&gt;
&lt;p&gt;You should really check out this &lt;del&gt;long&lt;/del&gt; presentation from &lt;a href=&quot;http://brainspl.at&quot;&gt;Ezra&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/adamhjk&quot;&gt;Adam&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;embed src=&quot;http://blip.tv/play/AYGMpxGLqzQ&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;480&quot; height=&quot;290&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/embed&gt;&lt;/p&gt;
&lt;p&gt;They say that &lt;em&gt;scaling usually has 3 steps&lt;/em&gt; :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;bootstrapping&lt;/strong&gt; : it is the act of &amp;#8216;acquiring&amp;#8217; resources. Basically starting servers at a given IP, with a base (naked OS), and hopefully a way to connect (ssh).&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;configuration&lt;/strong&gt; : the goal here is to change a &amp;#8220;vanilla&amp;#8221; server into something operational.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;command and control&lt;/strong&gt; : once the server is configured and running, you still need to send him specific instructions and have feedback on how it performs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are several options for the configuration. The most basic one is to &lt;em&gt;do everything by hand&lt;/em&gt; (and try to repeat for as many servers you need to deploy). Another one is to &lt;em&gt;deal with an &amp;#8220;image&amp;#8221;&lt;/em&gt; (a ghost if you want), but then it&amp;#8217;s quite hard to improve it and evolve it. At &lt;a href=&quot;http://superfeedr.com&quot;&gt;superfeedr&lt;/a&gt;, the option we chose is to use &lt;a href=&quot;http://wiki.opscode.com/display/chef/Home&quot;&gt;Chef&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Chef&lt;/h3&gt;
&lt;p&gt;Chef allows you to define a set of &lt;strong&gt;specifications&lt;/strong&gt; (packages to be installed, files to de deployed, options to be configured&amp;#8230;) of what our server should like when it&amp;#8217;s ready. There are a few advantages to that : it&amp;#8217;s &lt;em&gt;stateless&lt;/em&gt;, it is &lt;em&gt;idempotent&lt;/em&gt;, it is &lt;em&gt;repeatable&lt;/em&gt;&amp;#8230; etc.&lt;/p&gt;
&lt;p&gt;There are a lot of ways to use Chef. Here is &lt;strong&gt;ours&lt;/strong&gt;. It&amp;#8217;s probably &lt;em&gt;not the best for everyone&lt;/em&gt; (and maybe not even for us), but playing with it gave us some experience and we&amp;#8217;re sharing it with you.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/en/thumb/8/82/Chef.svg/350px-Chef.svg.png&quot; style=&quot;width: 30%; float:left; margin: 5px;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Chef is a &lt;strong&gt;client-server architecture&lt;/strong&gt;, where the client is the node to be configured, which implies several things. The first one (and most impacting) is that &lt;strong&gt;everything happens from the client&lt;/strong&gt; (called node). If you used to do your configurations by hand (or using scripts), you were not doing it from the client. Another consequence is that you need to have your clients to be &amp;#8216;chef-ready&amp;#8217;. This might (and will) sound weird, but &lt;em&gt;you need to have some basic configuration on your servers before you can start to do the actual configuration&lt;/em&gt;. Luckily this configuration is rather basic and can be automated by using a script &lt;a href=&quot;http://gist.github.com/160263&quot;&gt;like this one&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;Cookbooks&lt;/h4&gt;
&lt;p&gt;On the chef server, you would define a set of &lt;strong&gt;cookbooks&lt;/strong&gt;. Cookbooks are &lt;strong&gt;collections of related recipes&lt;/strong&gt;. For example, a cookbook can deal with installing the &amp;#8220;build-essentials&amp;#8221; packages, the apache server or git&amp;#8230; etc. For each cookbook, you would have a set of recipes. For example, the git cookbook, may have recipes such as : install client and install server.&lt;/p&gt;
&lt;p&gt;Technically the cookbooks can be used by different users and/or for different machines in your architecture. Actually, you &lt;strong&gt;want&lt;/strong&gt; them to be as generic as they can.&lt;/p&gt;
&lt;h4&gt;Roles&lt;/h4&gt;
&lt;p&gt;Once you have your cookbooks, you should define &lt;strong&gt;roles&lt;/strong&gt;. A role is a &amp;#8220;type&amp;#8221; of node you&amp;#8217;d like to configure. Technically, roles are just sets of cookbooks. A role for a blog application would include recipes for Apache, MySQL, and Wordpress for example. A Rails application may have an &amp;#8220;MySQL server&amp;#8221; role, a &amp;#8220;Memcached server&amp;#8221; role, and a Web application role.&lt;/p&gt;
&lt;h4&gt;Attributes&lt;/h4&gt;
&lt;p&gt;To differentiate a cookbook for 2 nodes, Chef has &lt;strong&gt;attributes&lt;/strong&gt;. An attribute would be for example the name of your server, or the port used by apache, the names of the gems you want to install, the user who runs your apache server&amp;#8230; etc. Of course, you can define attributes at several levels : inside a cookbook, they would be the default values, or at the &amp;#8220;role&amp;#8221; level and even, at the node level. For example, a node IP is clearly at the node level, but the login/password to an external MySQL database can be set at the role level, while the apache cookbook should probably set the default http port to 80.&lt;/p&gt;
&lt;p&gt;Got it? Of course, this clearly a &amp;#8220;crash-course&amp;#8221;, you can find a lot more information in the &lt;a href=&quot;http://wiki.opscode.com/display/chef/Home&quot;&gt;Opscode wiki&lt;/a&gt;, as well as in the &lt;a href=&quot;irc://irc.freenode.net/chef&quot;&gt;#chef room at irc.freenode.net&lt;/a&gt;. Ezra also wrote a &lt;a href=&quot;http://brainspl.at/articles/2009/01/31/cooking-with-chef-101&quot;&gt;great blog post&lt;/a&gt; that you should read as well.&lt;/p&gt;
&lt;h3&gt;Where to start?&lt;/h3&gt;
&lt;ol&gt;
	&lt;li&gt;I&amp;#8217;d start &lt;strong&gt;first with setting up a Chef Server&lt;/strong&gt;. The Chef server will provide you with a few things, including a web application that can be used to see all your cookbooks, roles, and nodes at a glance.&lt;/li&gt;
	&lt;li&gt;Once that&amp;#8217;s done, &lt;strong&gt;setup a chef repository&lt;/strong&gt;, that would basically contain the code of your cookbooks. Then, add a few cookbooks, define a first role and assign it some recipes, as well as attributes. Writing cookbooks shouldn&amp;#8217;t be too hard, but you should first try to see if someone has written one. Check &lt;a href=&quot;http://github.com/opscode/chef/tree/master&quot;&gt;opscode repository&lt;/a&gt; and all the &lt;a href=&quot;http://github.com/opscode/chef/network&quot;&gt;associated branches&lt;/a&gt;. With a little luck, &lt;strong&gt;you won&amp;#8217;t have to write anything but define attributes&lt;/strong&gt;. &lt;br /&gt;
When you have a few cookbooks, clone that chef repo on your chef server and run &lt;code&gt;rake deploy&lt;/code&gt; anytime you want to update the configuration.&lt;/li&gt;
	&lt;li&gt;Then, create a bootstrap script, &lt;a href=&quot;http://gist.github.com/160263&quot;&gt;like this one&lt;/a&gt;, which installs the bricks for a chef client on your node.&lt;/li&gt;
	&lt;li&gt;Finally, start a new node on your favorite cloud provider (Slicehost:&amp;#8220;http://slicehost.com&amp;#8221;, &lt;a href=&quot;http://linode.com&quot;&gt;Linode&lt;/a&gt;, &lt;a href=&quot;http://aws.amazon.com/ec2/&quot;&gt;EC2&lt;/a&gt;), copy the boostrap (&lt;code&gt;scp&lt;/code&gt; should make it) script and run it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The great thing with this &amp;#8220;spec&amp;#8221; approach is that you can (and should) kill instances all the time and re-configure clean ones in minutes.&lt;/p&gt;
&lt;p&gt;Hosting in the cloud really means that &lt;strong&gt;you don&amp;#8217;t know (or at least shouldn&amp;#8217;t care) about the nodes&lt;/strong&gt; on which your app is running.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve heard people like &lt;a href=&quot;http://37signals.com/&quot;&gt;37signals&lt;/a&gt;, &lt;a href=&quot;http://www.engineyard.com/&quot;&gt;EngineYard&lt;/a&gt; or even &lt;a href=&quot;http://twitter.com&quot;&gt;Twitter&lt;/a&gt; are using Chef to scale and deploy their architectures, that can only be a good sign ;)&lt;/p&gt;
&lt;p&gt;Again, this was a very light intro, but, when we started to play with Chef, we found that resources (and feedback) were missing.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Superfeedr Java Wrapper</title>
        
        <category term="API" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Java" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="XMPP" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="wrappers" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="OSS" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/API/Java/OSS/XMPP/wrappers/java-wrapper"/>
        <published>2009-07-28T00:00:00-07:00</published>
        <updated>2009-07-28T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/API/Java/OSS/XMPP/wrappers/java-wrapper</id>
        <content type="html">&lt;p&gt;This seems to be the wrapper week! Our friend &lt;a href=&quot;http://twitter.com/mastooo&quot;&gt;Thomas&lt;/a&gt; just pushed a first version of a &lt;a href=&quot;http://github.com/superfeedr/superfeedr-java/tree/master&quot;&gt;Java wrapper&lt;/a&gt; to our &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt; (&lt;a href=&quot;http://github.com/mastooo/java-superfeedr/tree/master&quot;&gt;his branch&lt;/a&gt;). I&amp;#8217;d like to take this as an occasion to explain how we see these wrappers.&lt;/p&gt;
&lt;p&gt;We &lt;strong&gt;know our limits&lt;/strong&gt; and we know we can&amp;#8217;t actively support wrappers in all languages. Like everybody, we have our favorite languages and platform, and there is little chance that we ever get a deep enough knownledge in all that languages that you guys use to offer great services. So, for us, &lt;em&gt;the limit of what we can provide and support is our &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/em&gt; (both &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; and PubSubHubbub).&lt;/p&gt;
&lt;p&gt;However, we&amp;#8217;re not blind either and we know how &lt;strong&gt;these parsers are important&lt;/strong&gt; for everybody to get started and integrate Superfeedr into their existing apps, so we take great care of them and try to help people use them or fix problems. &lt;a href=&quot;http://twitter.com/aneilbaboo&quot;&gt;Aneil&lt;/a&gt; helped us a lot on the &lt;a href=&quot;http://github.com/superfeedr/supeefeedr-python/tree/master&quot;&gt;Python lib&lt;/a&gt;, &lt;a href=&quot;http://nathan.fritzclan.com/&quot;&gt;Nathan&lt;/a&gt;, &lt;a href=&quot;http://blog.cyberion.net/&quot;&gt;Yann&lt;/a&gt; or &lt;a href=&quot;http://twitter.com/mastooo&quot;&gt;Thomas&lt;/a&gt; did an awesome job with the &lt;a href=&quot;http://github.com/superfeedr/supeefeedr-php/tree&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PHP&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;http://github.com/superfeedr/superfeedr-perl/tree&quot;&gt;Perl&lt;/a&gt; and &lt;a href=&quot;http://github.com/superfeedr/superfeedr-java/tree&quot;&gt;Java&lt;/a&gt; libs; all of which we would have been unable to make.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;These libs are not ours&lt;/strong&gt;, &lt;em&gt;they wait for your input_, y_our documentation, your testing&lt;/em&gt;, as well as your &lt;em&gt;suggestions for new features&lt;/em&gt;. We will just help &amp;#8220;gathering&amp;#8221; them and keeping track by &amp;#8220;connecting&amp;#8221; the people who made them with the people who use them.&lt;/p&gt;
&lt;p&gt;Again, &lt;strong&gt;thank you Nathan, Yann, Thomas, Aneil&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;PS: anybody for the C# one? ;) (find &lt;a href=&quot;http://github.com/superfeedr&quot;&gt;them all here&lt;/a&gt;)&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>A Perl Wrapper</title>
        
        <category term="API" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Perl" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="XMPP" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/API/Perl/XMPP/a-perl-wrapper"/>
        <published>2009-07-26T00:00:00-07:00</published>
        <updated>2009-07-26T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/API/Perl/XMPP/a-perl-wrapper</id>
        <content type="html">&lt;p&gt;Thanks to our friend &lt;a href=&quot;http://blog.cyberion.net/&quot;&gt;Yann&lt;/a&gt;, we now have a &lt;a href=&quot;http://github.com/superfeedr/superfeedr-perl/tree/master&quot;&gt;Perl wrapper for the Superfeedr &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt; (here is &lt;a href=&quot;http://github.com/yannk/perl-anyevent-superfeedr/tree/master&quot;&gt;yann&amp;#8217;s repo&lt;/a&gt; if you want faster updates).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://http.cdnlayer.com/itke/blogs.dir/8/files/2008/02/perl.jpg&quot; style=&quot;float:left; width: 30%; margin: 10px;&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;What I like with Yann&amp;#8217;s wrapper is that it has a &lt;em&gt;callback&lt;/em&gt; that users can implement to return the new feeds to &lt;em&gt;subscribe to in a asynchronous fashion&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So, for example, when you need to add a feed to superfeedr, you can save it in your database, and then, implement the callback so that it returns that feed. Any feed that will be returned will be subscribed to. One of the great advantages is that it shouldn&amp;#8217;t affect your service performance, since the subscription is then asynchronous.&lt;/p&gt;
&lt;p&gt;Yann will soon put that &lt;a href=&quot;http://search.cpan.org/perldoc?AnyEvent::Superfeedr&quot;&gt;wrapper on &lt;span class=&quot;caps&quot;&gt;CPAN&lt;/span&gt;&lt;/a&gt; (not yet there, though), but as with any of our other wrappers, &lt;strong&gt;you can of course fork it and improve it (or add doc, tests, examples)&lt;/strong&gt; ;)&lt;/p&gt;
&lt;p&gt;PS: You need to use &lt;a href=&quot;http://github.com/yannk/perl-anyevent-xmpp/&quot;&gt;his version of AnyEvent::&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt;&lt;/a&gt; to fix a &lt;a href=&quot;http://github.com/yannk/perl-anyevent-xmpp/commit/dff1b3a3addf0cf44eb0c023990c4ef9fec3ddbd&quot;&gt;weird defect&lt;/a&gt; in the way this lib handles xmpp-urls.&lt;/p&gt;
&lt;p&gt;Thank you &lt;a href=&quot;http://blog.cyberion.net/&quot;&gt;Yann&lt;/a&gt; ! We owe you dinner!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Make Our Logo!</title>
        
        <category term="logo" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="meta" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="open-source" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/logo/meta/open-source/make-our-logo"/>
        <published>2009-07-25T00:00:00-07:00</published>
        <updated>2009-07-25T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/logo/meta/open-source/make-our-logo</id>
        <content type="html">&lt;p&gt;A lot of &lt;a href=&quot;http://twitter.com/lauragatning/status/2181168813&quot;&gt;our friends complained&lt;/a&gt; about the fact that we didn&amp;#8217;t have a logo. That&amp;#8217;s a valid concern, but I really didn&amp;#8217;t have the skills (even far from it) that it takes. So what I basically asked a very &lt;a href=&quot;http://www.lafraise.com/User/profile/id/660804&quot;&gt;talented friend&lt;/a&gt; to make a concept. He did a great job and you can see it right below, with several different colors.&lt;/p&gt;
&lt;p&gt;I am releasing it here because I know some of you might have great ideas to actually make it even nicer, and well, I&amp;#8217;d love to be able to have feedback and improvements from our actual users.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/images/logos/logos.jpg&quot;&gt;&lt;img src=&quot;/images/logos/logos.jpg&quot; style=&quot;width:90%;&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here a few words that represent what the logo should convey : &lt;em&gt;superhero, &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;, speed, cloud, reliability, strength, seriousness&lt;/em&gt;&amp;#8230; Do you see others?&lt;/p&gt;
&lt;p&gt;Here are 3 versions of the same logo : &lt;a href=&quot;/images/logos/superfeedr.ai&quot;&gt;AI&lt;/a&gt;, &lt;a href=&quot;/images/logos/superfeedr.eps&quot;&gt;&lt;span class=&quot;caps&quot;&gt;EPS&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;/images/logos/superfeedr.pdf&quot;&gt;&lt;span class=&quot;caps&quot;&gt;PDF&lt;/span&gt;&lt;/a&gt; and you can see on our &lt;a href=&quot;http://twitter.com/account/profile_image/superfeedr?hreflang=en&quot;&gt;twitter account&lt;/a&gt; my own version! What do you think? You can download them and remix them as much as you want!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>The Console</title>
        
        <category term="console" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="debugging" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="xmpp" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/console/debugging/xmpp/the-console"/>
        <published>2009-07-24T00:00:00-07:00</published>
        <updated>2009-07-24T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/console/debugging/xmpp/the-console</id>
        <content type="html">&lt;p&gt;It is quite hard to debug notification based systems, because &lt;em&gt;developers usually have to wait&lt;/em&gt; for a notification to happen. It&amp;#8217;s been a &lt;a href=&quot;http://groups.google.com/group/superfeedr/browse_thread/thread/b237d690372050b2&quot;&gt;common request from several&lt;/a&gt; of our users over the past month and we&amp;#8217;re happy to say that we released today a solution to this problem : &lt;strong&gt;the console&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Basically, when logged in, you should see &amp;#8216;Your feeds&amp;#8217; in the top bar. Click there, and then, at the bottom of the page, click on &amp;#8220;Console&amp;#8221;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/console.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The console is a tool that will enable you to see notifications directly pushed to your browser, exactly as they would be pushed to your &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; client (technically, the console IS an &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; client).&lt;/p&gt;
&lt;p&gt;To see actual notifications happening, we&amp;#8217;ve also created a &lt;a href=&quot;http://superfeedr.com/dummy.xml&quot;&gt;dummy atom feeds&lt;/a&gt;. In the console interface, you should see a link that, when clicks, publishes a new entry in this dummy feed. A few seconds (or less) later, you should see the new notification in your console. Of course, &lt;em&gt;that works with any feed&lt;/em&gt;, so you can as well add others.&lt;/p&gt;
&lt;p&gt;Here a a few tips to make that console even more useful :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;The console only works if your using using your default jid : user@superfeedr.com  (no webhooks, no &amp;#8216;private&amp;#8217; jid)&lt;/li&gt;
	&lt;li&gt;Add http://superfeedr.com/dummy.xml to your feeds (and more feeds)&lt;/li&gt;
	&lt;li&gt;Change your notification mode (See &amp;#8216;settings&amp;#8217;) to &amp;#8220;Each time we pull and parse one of your feeds&amp;#8221;&lt;/li&gt;
	&lt;li&gt;Leave the console open for a few hours : notifications will stack up (most recent at the top)&lt;/li&gt;
&lt;/ul&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Kind of Open Source</title>
        
        <category term="OSS" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="gospel" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/OSS/gospel/kind-of-open-source"/>
        <published>2009-07-22T00:00:00-07:00</published>
        <updated>2009-07-22T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/OSS/gospel/kind-of-open-source</id>
        <content type="html">&lt;p&gt;When &lt;a href=&quot;http://twitter.com/superfeedr/status/2762315579&quot;&gt;I tweeted about sharing&lt;/a&gt; our Investor Deck yesterday, I received immediately a few IM and email of friends who wanted to make sure I was doing the right decision. They were scared that I would make some private things public. I &lt;strong&gt;fully understand their concern&lt;/strong&gt;, but I really want &lt;strong&gt;Superfeedr to be an Open Service&lt;/strong&gt;, where we are guided by our users more than our wallet. &lt;em&gt;We value their opinion more than ours because in the end, they are going to pay for our service, not us&lt;/em&gt;.&lt;/p&gt;
&lt;h3&gt;Why not release our software as Open Source, then?&lt;/h3&gt;
&lt;p style=&quot;float:right;&quot;&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/commons/4/42/Opensource.svg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Because that wouldn&amp;#8217;t work.&lt;/strong&gt; The idea with Superfeedr is to &lt;a href=&quot;http://blog.superfeedr.com/gospel/something-stupid/&quot;&gt;do something stupid so that nobody else has to do it&lt;/a&gt;. If we release our software, then, everybody would run their standalone superfeedr and people will keep doing this inefficient polling that wastes our resources.&lt;br /&gt;
&lt;em&gt;Superfeedr will work only with massive economies of scale&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We will eventually release huge parts (and &lt;a href=&quot;http://github.com/superfeedr&quot;&gt;we already started&lt;/a&gt;) of our software as open source, as we will probably communicate and ask advices on as much as we can that relates to Superfeedr. If you&amp;#8217;d like to give a look at our deck, send us your email as a &lt;a href=&quot;http://twitter.com/direct_messages/create/superfeedr&quot;&gt;direct message&lt;/a&gt;. Also, follow us on Twitter, because I will (&lt;a href=&quot;http://twitter.com/jineshmehta/statuses/2777183409&quot;&gt;thanks to @jineshmehta&lt;/a&gt;) release there the master file of our logo. I hope you can then make it even nicer. (&lt;span class=&quot;caps&quot;&gt;BTW&lt;/span&gt;, &lt;a href=&quot;http://twitter.com/superfeedr/status/2772907149&quot;&gt;red, or green?&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;You are the brains of our service, giving the ideas, suggesting the directions. We are just the &lt;del&gt;small&lt;/del&gt; hands selecting, organizing and implementing ideas.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Reality checked</title>
        
        <category term="meta" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/meta/reality-checked"/>
        <published>2009-07-21T00:00:00-07:00</published>
        <updated>2009-07-21T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/meta/reality-checked</id>
        <content type="html">&lt;p&gt;A lot of people have asked us why we built &lt;a href=&quot;http://superfeedr.com&quot;&gt;Superfeedr&lt;/a&gt; or what is the relationship to &lt;a href=&quot;http://notifixio.us&quot;&gt;Notifixious&lt;/a&gt;. Here are a few hints.&lt;/p&gt;
&lt;p&gt;A little over a year we launched Notifixious. The idea behind it was to allow any internet user to &lt;em&gt;receive real-time updates from his favorite websites&lt;/em&gt;. We would send these updates either by email, &lt;span class=&quot;caps&quot;&gt;SMS&lt;/span&gt; or Instant Messaging. For example, a user might subscribe to a blog to receive the last updates, or to a newspaper site. A user could also subscribe to a &lt;a href=&quot;http://sfbay.craigslist.org/apa/&quot;&gt;Craigslist search&lt;/a&gt; to be the first to know about a new place to move in, or to &lt;a href=&quot;http://notifixio.us/simplyhired&quot;&gt;Simply Hired&lt;/a&gt; to get the last jobs in his field of expertise.&lt;/p&gt;
&lt;p&gt;Earlier this year, we did &lt;strong&gt;an extensive analysis of our user base&lt;/strong&gt; and found out 2 patterns.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;About &lt;strong&gt;60% of our users would select email&lt;/strong&gt; to receive their notifications. On average they would subscribe to &lt;strong&gt;1 single website&lt;/strong&gt; and most of the time it was a blog. These users have clearly been acquired through our &lt;a href=&quot;http://notifixio.us/sources/widgets&quot;&gt;widget&lt;/a&gt;. We were very disappointed : email is not real-time and the email user-experience is usually bad : spam, phishing&amp;#8230; etc. We asked those people why they chose email and the answer was clear : they are &lt;strong&gt;scared by information overload&lt;/strong&gt; and have &lt;strong&gt;no idea how to deal with an incoming stream&lt;/strong&gt; of notifications which is very &lt;em&gt;stressful&lt;/em&gt;, because they &lt;strong&gt;know&lt;/strong&gt; they wanted to receive these notifications.&lt;/li&gt;
	&lt;li&gt;A &lt;strong&gt;dozen of our users&lt;/strong&gt; had, on the other hand, subscribed to more than 500 feeds. Oddly enough they were &lt;strong&gt;all using our &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; api or a jabber account&lt;/strong&gt; to receive these notifications. This behavior was very interesting compared to the first group. We contacted most of them and understood that they were actually using &lt;strong&gt;notifixious as a middleware&lt;/strong&gt; for their own application or service. In a nutshell, they were using Notifixious as an on-demand feed parsing service. That was a very insightful discovery since &lt;strong&gt;some of them even said they would pay&lt;/strong&gt; for our service. The idea to extract &lt;a href=&quot;http://superfeedr.com&quot;&gt;Superfeedr&lt;/a&gt; out of Notifixious was born.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We still haven&amp;#8217;t identified how to deal with the first group, except that &lt;strong&gt;real-time services will need to find a way to avoid that information overload&lt;/strong&gt; (or at least the sensation of it). However, by observing and understanding the behavior of a &lt;del&gt;very&lt;/del&gt; small set of users, we&amp;#8217;ve been able to identify some of the value of our service.&lt;/p&gt;
&lt;p&gt;We even believe that this very small subset of our user base carried the biggest of the value our service provided. By continuously looping the feedback with this small user base, we think we can provide a great service!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Federating PubSubHubbub</title>
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="api" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="federation" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/api/federation/pubsubhubbub/federating-pubsubhubbub"/>
        <published>2009-07-12T00:00:00-07:00</published>
        <updated>2009-07-12T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/api/federation/pubsubhubbub/federating-pubsubhubbub</id>
        <content type="html">&lt;p&gt;PubSubHubbub has been the &lt;a href=&quot;http://search.twitter.com/search?q=PubSubhubbub&quot;&gt;RealTime web celebrity&lt;/a&gt; in the past few days. &lt;a href=&quot;http://adsenseforfeeds.blogspot.com/2009/07/whats-all-hubbub-about-pubsubhubbub.html&quot;&gt;Google announced&lt;/a&gt; their support for Feedburner and Blogger, and that&amp;#8217;s great to see the interest growing.&lt;/p&gt;
&lt;p&gt;We decided a few weeks ago that &lt;a href=&quot;http://blog.superfeedr.com/api/http/pubsubhubbub/pubsubhubbub/&quot;&gt;PubSubHubbub would be our &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; &lt;span class=&quot;caps&quot;&gt;API&lt;/span&gt;&lt;/a&gt; and it&amp;#8217;s been a great choice for us as many developers have started to work on language specific libraries to interact with hubs.&lt;/p&gt;
&lt;p&gt;Today, we&amp;#8217;re announcing that &lt;strong&gt;not only we&amp;#8217;re a hub, but we&amp;#8217;re also a subscriber&lt;/strong&gt;. In other terms, it means that whenever a feed indicates a hub, Superfeedr will subscribe to this hub to get updates from it in real-time. That is a great addition to &lt;a href=&quot;http://superfeedr.com/technology&quot;&gt;our set of helpers&lt;/a&gt; and it will hopefully help us &lt;em&gt;improve yet again our detection time&lt;/em&gt; of new entries.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://docs.google.com/present/view?id=ajd8t6gk4mh2_34dvbpchfs&quot;&gt;&lt;img src=&quot;/images/federated_pubsubhubbub.png&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;At a broader level, it is &lt;a href=&quot;http://www.scripting.com/stories/2009/07/11/morePubsubhubbubFeedback.html&quot;&gt;interesting to compare&lt;/a&gt; PubSubHubbub with previous initiatives, and, as far as I know, PubSubHubbub is the first one to actually enable easily this &amp;#8220;federation&amp;#8221; structure (similar to what &lt;a href=&quot;http://xmpp.org/rfcs/rfc3920.html&quot;&gt;&lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; offers&lt;/a&gt;), where &lt;em&gt;subscribers can select their favorite hubs&lt;/em&gt; and &lt;em&gt;hubs can communicate together&lt;/em&gt; to provide updates to all their users.&lt;/p&gt;
&lt;p&gt;It makes the PubSubHubbub &amp;#8220;network&amp;#8221; even more decentralized and scalable/fault-resistant. For those into &lt;a href=&quot;http://en.wikipedia.org/wiki/Graph_%28mathematics%29&quot;&gt;graph theory&lt;/a&gt;, you will immediately see the benefit of such an architecture : virtually ubiquitous new data publication, as long as there is a (not too long) path from any node to any other node!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Customer Care Lesson</title>
        
        <category term="meta" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/meta/customer-care-lesson"/>
        <published>2009-07-10T00:00:00-07:00</published>
        <updated>2009-07-10T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/meta/customer-care-lesson</id>
        <content type="html">&lt;p&gt;Yesterday, the Carsonified team relaunched their website and it&amp;#8217;s looking great. The &lt;a href=&quot;http://carsonified.com/mission/&quot;&gt;Mission page&lt;/a&gt; should be a lesson for everybody:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;At Carsonified we believe in treating other people like we want to be treated: with &lt;strong&gt;friendliness, patience and respect&lt;/strong&gt;. We believe that the web industry is one of the most exciting places in the world, and that &lt;strong&gt;it&amp;#8217;s an honor for us to connect, encourage and train that community through our events&lt;/strong&gt;. We believe in being more creative than we need to be and having fun while we&amp;#8217;re at it.&lt;/p&gt;
&lt;/blockquote&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>There is no such thing as Real Time Search</title>
        
        <category term="real-time" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/real-time/there-is-such-thing-as-real-time-web-search"/>
        <published>2009-07-09T00:00:00-07:00</published>
        <updated>2009-07-09T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/real-time/there-is-such-thing-as-real-time-web-search</id>
        <content type="html">&lt;p&gt;&lt;em&gt;Real-time search&lt;/em&gt; seems to be the most common tagline these days. Real-time is the new hotness (&lt;a href=&quot;http://blog.superfeedr.com/gospel/infrastructure/realtime/building-realtime/&quot;&gt;we agree&lt;/a&gt;!) and Google almost made &amp;#8216;Revenue&amp;#8217; and &amp;#8216;Search&amp;#8217; synonyms. I guess it was tempting to mix both ;)&lt;/p&gt;
&lt;p&gt;When I am doing a &amp;#8220;search&amp;#8221; on &lt;a href=&quot;http://google.com&quot;&gt;Google&lt;/a&gt; or &lt;a href=&quot;http://bing.com&quot;&gt;Bing&lt;/a&gt; (try it!), I technically don&amp;#8217;t know what I will find. To be more precise, I don&amp;#8217;t know where I will find the information, and I even don&amp;#8217;t know if what I am looking for exists.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://search.twitter.com&quot;&gt;Twitter Search&lt;/a&gt; (ex-summize) is clearly the best known example of Real-time Search and &lt;a href=&quot;http://collecta.com&quot;&gt;Collecta&lt;/a&gt; is a good &amp;#8220;cross-services&amp;#8221; examples. I wouldn&amp;#8217;t call any of them search engines, but rather &amp;#8220;&lt;strong&gt;filters&lt;/strong&gt;&amp;#8221;.&lt;/p&gt;
&lt;p&gt;In both cases, I do searches about things that are happening (Jackson&amp;#8217;s death, Palin&amp;#8217;s resignation&amp;#8230;), which proves they exist. I also tend to know what I&amp;#8217;ll find : images, links to more in-depth articles&amp;#8230; etc. I am just trying to &amp;#8220;filter&amp;#8221; the stream of information, not searching for an answer.&lt;/p&gt;
&lt;p&gt;In the end, both traditional search-engines and real-time filters have to deal with &lt;strong&gt;relevance&lt;/strong&gt;, but I think the &lt;strong&gt;user&amp;#8217;s expectations are very different in both cases&lt;/strong&gt;. What do you think?&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Speeding Up RSS : what for?</title>
        
        <category term="RSS" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Atom" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Feeds" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Push" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Techcrunch" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Atom/Feeds/Push/RSS/Techcrunch/speeding-up-rss"/>
        <published>2009-07-09T00:00:00-07:00</published>
        <updated>2009-07-09T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/Atom/Feeds/Push/RSS/Techcrunch/speeding-up-rss</id>
        <content type="html">&lt;p&gt;&lt;a href=&quot;http://twitter.com/Erickschonfeld&quot;&gt;Erick Schonfeld&lt;/a&gt; published the &lt;a href=&quot;http://www.techcrunch.com/2009/07/09/speeding-up-rss/&quot;&gt;blog post of the &lt;del&gt;day&lt;/del&gt; week&lt;/a&gt;. Despite the fact that he should have talked about &lt;a href=&quot;http://superfeedr.com&quot;&gt;Superfeedr&lt;/a&gt;, I think this is an awesome article. I am really looking forward to &lt;a href=&quot;http://www.techcrunch.com/2009/07/08/win-a-ticket-to-the-real-time-stream-crunchup-this-friday/&quot;&gt;tomorrow&amp;#8217;s panel&lt;/a&gt; and see what &amp;#8220;Brett&amp;#8221;, Brad, Freddy and Andy have to talk about.&lt;/p&gt;
&lt;p&gt;The comments, though are very interesting and they show what we&amp;#8217;ve observed with &amp;quot;Notifixious&amp;quot;http://notifixio.us over the last year : Real-time notification (or faster &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;) scares people a lot. There is at least 4 or 5 comments saying that &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; is fast enough for them. The problem here, is that there is a misconception :* making &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; faster is not for individuals, but for the web itself*.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.superfeedr.com/api/http/pubsubhubbub/pubsubhubbub/&quot;&gt;PubSubHubbub&lt;/a&gt; has the potential to bring Push to the &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt; and Atom technologies. So not only it will be faster, but it will be instantaneous, and when Feed updates will be instantaneous, nobody will pull anymore (&lt;a href=&quot;http://blog.superfeedr.com/gospel/something-stupid/&quot;&gt;not even us&lt;/a&gt;) and the web will be better.&lt;/p&gt;
&lt;p&gt;Better? Publishers will not have to &lt;em&gt;handle massive loads anymore&lt;/em&gt; (like Twitter had to), and Subscribers (services) will &lt;em&gt;not have to poll over and over to get updates&lt;/em&gt;.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>The future of Web apps?</title>
        
        <category term="dev" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="gospel" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="web-apps" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/dev/gospel/web-apps/the-future-of-web-apps"/>
        <published>2009-07-05T00:00:00-07:00</published>
        <updated>2009-07-05T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/dev/gospel/web-apps/the-future-of-web-apps</id>
        <content type="html">&lt;p&gt;A lot of people have shown interest in &lt;a href=&quot;http://github.com/superfeedr/aristochat/tree/master&quot;&gt;Aristochat&lt;/a&gt; and the &lt;a href=&quot;http://superfeedr.com/chat&quot;&gt;Superfeedr chat&lt;/a&gt; last week. However, I haven&amp;#8217;t talked about what is &amp;#8211; according to me &amp;#8211; the greatest thing about it : &lt;strong&gt;it&amp;#8217;s hosted on Github&lt;/strong&gt;. Not only the source code, &lt;a href=&quot;http://github.com/superfeedr/Superfeedr-Chat/tree/gh-pages&quot;&gt;but the app itself&lt;/a&gt;, and since it&amp;#8217;s a &lt;a href=&quot;http://github.com/superfeedr/Superfeedr-Chat/blob/9d01a452c0f5e21b3deda1221e3d47e84e6c34c5/index.html&quot;&gt;basic &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; file&lt;/a&gt; with a &lt;a href=&quot;http://github.com/superfeedr/Superfeedr-Chat/blob/9d01a452c0f5e21b3deda1221e3d47e84e6c34c5/chat.js&quot;&gt;little bit of Javascript&lt;/a&gt;, it could have very been hosted on EC2 as well, or on any type server that can server &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; file.&lt;/p&gt;
&lt;p&gt;This blog is also a great example : technically, it&amp;#8217;s an app, and yet, it&amp;#8217;s made of static &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; files, &lt;a href=&quot;http://github.com/superfeedr/superfeedr.github.com/tree/master&quot;&gt;hosted on Github&lt;/a&gt; as well. I think these 2 examples can give us a &amp;#8220;hint&amp;#8221; on what Web apps will look like in a not so distant future :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;A bunch of static &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt; files with &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;, served by clusters&lt;/li&gt;
	&lt;li&gt;A lot of Javascript inside these pages to enhance the user experience with effects, drag and drops&amp;#8230; etc&lt;/li&gt;
	&lt;li&gt;Some &lt;span class=&quot;caps&quot;&gt;AJAX&lt;/span&gt; to send and receive data from one (or more) application servers, through &lt;span class=&quot;caps&quot;&gt;APIS&lt;/span&gt; (&lt;span class=&quot;caps&quot;&gt;JSON&lt;/span&gt;, or &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The great thing about that is that web services (and developers) can focus on a single &amp;#8220;job&amp;#8221;, while designers, UX engineers can &amp;#8216;pick&amp;#8217; up whatever tool they want to integrate into an app and make it richer.&lt;/p&gt;
&lt;p&gt;With this approach, you can really decouple more and more the data and the processing from the views. The APIs can very well be consumed by a webservice, but also by, say, an iPhone App, an Adobe Air App, or even external web services and we sites.&lt;/p&gt;
&lt;p&gt;This should sound familiar, doesn&amp;#8217;t it? It&amp;#8217;s very close from the &lt;span class=&quot;caps&quot;&gt;MVC&lt;/span&gt; model that we all learnt to create desktop apps.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Aristochat</title>
        
        <category term="OSS" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="Chat" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="XMPP" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="MUC" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Chat/MUC/OSS/XMPP/aristochat"/>
        <published>2009-07-03T00:00:00-07:00</published>
        <updated>2009-07-03T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/Chat/MUC/OSS/XMPP/aristochat</id>
        <content type="html">&lt;p&gt;It all started when we used &lt;a href=&quot;http://chat.slicehost.com/&quot;&gt;Slicehost&amp;#8217;s chat-room&lt;/a&gt; for their support : not only it&amp;#8217;s awesome to have 24/7 support, but it&amp;#8217;s also great to have a short-message interface that allows real-time discussion and interaction.&lt;/p&gt;
&lt;p&gt;Unfortunately, &lt;a href=&quot;http://campfirenow.com/&quot;&gt;Campfire&lt;/a&gt; is &amp;#8220;proprietary&amp;#8221; software and it doesn&amp;#8217;t seem to be &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; based. &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; is known as &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;THE&lt;/span&gt;&lt;/strong&gt; instant messaging protocol, and it has the fairly well defined and complete &lt;a href=&quot;http://xmpp.org/extensions/xep-0045.html&quot;&gt;Multi User Chat Extension&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Also, &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; has &lt;a href=&quot;http://xmpp.org/extensions/xep-0206.html&quot;&gt;Bosh&lt;/a&gt;, which allows transportation of &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; stanzas over &lt;span class=&quot;caps&quot;&gt;HTTP&lt;/span&gt;. From that, there is no reason to think we couldn&amp;#8217;t do a &lt;strong&gt;Web Based Multi User Chat&lt;/strong&gt;, with just &lt;em&gt;1 &lt;span class=&quot;caps&quot;&gt;HTML&lt;/span&gt; page&lt;/em&gt;, and &lt;em&gt;1 Javascript&lt;/em&gt; and that could be integrated in any web framework in just a few seconds : meet &lt;a href=&quot;http://github.com/superfeedr/aristochat/tree/master&quot;&gt;Aristochat&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/aristocats.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The great thing about Aristochat is that &lt;em&gt;it&amp;#8217;s just a &lt;span class=&quot;caps&quot;&gt;MUC&lt;/span&gt; client&lt;/em&gt;, which means that you can connect (and manage) to the room as well from your favorite &lt;span class=&quot;caps&quot;&gt;XMPP&lt;/span&gt; client (like &lt;a href=&quot;http://psi-im.org/&quot;&gt;Psi&lt;/a&gt; &lt;a href=&quot;http://www.gajim.org/&quot;&gt;Gajim&lt;/a&gt; or &lt;a href=&quot;http://adium.im/&quot;&gt;Adium&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Check the &lt;a href=&quot;http://superfeedr.com/chat/&quot;&gt;Superfeer chat&lt;/a&gt; to see an example. And, yes, &lt;a href=&quot;http://github.com/superfeedr/aristochat/tree/master&quot;&gt;Aristochat&lt;/a&gt; is &lt;span class=&quot;caps&quot;&gt;OSS&lt;/span&gt;, so you can fork, fetch and push it back with more features!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>User Test Driven Development</title>
        
        <category term="schema" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="test" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="mapping" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/mapping/schema/test/user-test-driven-development"/>
        <published>2009-06-30T00:00:00-07:00</published>
        <updated>2009-06-30T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/mapping/schema/test/user-test-driven-development</id>
        <content type="html">&lt;p&gt;We are &lt;strong&gt;strong believer&lt;/strong&gt; of &lt;a href=&quot;http://en.wikipedia.org/wiki/Test-driven_development&quot;&gt;Test Driven Development&lt;/a&gt;. It&amp;#8217;s a very powerful approach that allows you to write tests before actually writing code. (These tests are actually specifications). That is how we created our parsers : we selected random feeds on the web, and decided what &lt;em&gt;should&lt;/em&gt; be the mapping between their data and our &lt;a href=&quot;http://blog.superfeedr.com/Atom/schema/a-better-schema/&quot;&gt;standard Atom schema&lt;/a&gt;. Then, we wrote the code to actually perform the mapping.&lt;/p&gt;
&lt;p&gt;Unfortunately, the web &lt;strong&gt;isn&amp;#8217;t&lt;/strong&gt; standard (that&amp;#8217;s actually one of the problems we tackle!), so there are probably feeds out there for which the mapping that we&amp;#8217;ve identified isn&amp;#8217;t what you would expect us to do. You can help us improve our mapping to fit your needs.&lt;/p&gt;
&lt;p&gt;In our test suites we have &lt;span class=&quot;caps&quot;&gt;YAML&lt;/span&gt; files representing these mappings and their corresponding &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt; files. Then, we run it by comparing the parsed document to the &lt;span class=&quot;caps&quot;&gt;YAML&lt;/span&gt; mappings.&lt;/p&gt;
&lt;p&gt;Here is and &lt;span class=&quot;caps&quot;&gt;XML&lt;/span&gt; feed :&lt;br /&gt;
&lt;script src=&quot;http://gist.github.com/138121.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;Here is a example of mapping :&lt;br /&gt;
&lt;script src=&quot;http://gist.github.com/138122.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;If you have identified a feed that you think we&amp;#8217;re not parsing correctly, please, send us a this feed.xml file, along with the corresponding specification yaml file. We will then &lt;strong&gt;fix our code so that we extract the right info from your file&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You can use this &lt;a href=&quot;http://gist.github.com/138123&quot;&gt;template&lt;/a&gt; for the mapping file.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Building Realtime : turning feeds into streams</title>
        
        <category term="realtime" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="gospel" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="infrastructure" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/gospel/infrastructure/realtime/building-realtime"/>
        <published>2009-06-28T00:00:00-07:00</published>
        <updated>2009-06-28T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/gospel/infrastructure/realtime/building-realtime</id>
        <content type="html">&lt;p&gt;Technically, &lt;a href=&quot;http://en.wikipedia.org/wiki/Real-time_computing&quot;&gt;Real-Time Computing&lt;/a&gt; implies that there is a &lt;em&gt;time constraint&lt;/em&gt; in a system, it&amp;#8217;s &lt;strong&gt;different from instantaneity&lt;/strong&gt;. A real-time service is a service that can guarantee that it would do something in a given amount of time. &lt;a href=&quot;http://superfeedr.com&quot;&gt;Superfeedr&lt;/a&gt; is real-time, since we can guarantee that we will notify new entries in a feed to our users within a 15 minutes time frame.&lt;/p&gt;
&lt;p&gt;This is only achievable if we &amp;#8220;&lt;strong&gt;push&lt;/strong&gt;&amp;#8221; the information toward our users. We couldn&amp;#8217;t guarantee delivery time if we asked them to &amp;#8220;pull&amp;#8221; from us&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;This is a keyword here : in a real-time web, &lt;strong&gt;information is pushed from a place to another one&lt;/strong&gt;. &lt;em&gt;Facebook pushes my friend updates to my homepage, Twitter search pushes new result to the result page, Friendfeed pushes the conversation to a topic&amp;#8217;s page&amp;#8230; etc&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Unfortunately, as the web is right now, the information is almost never pushed to anybody. Look at this blog. I will publish this blog post and wait for you, for Google, for search engines to actually pull its content. Similarly, these services, once they have the information will probably not push it to anyone.&lt;/p&gt;
&lt;p&gt;In a perfect world, not only I would push this new content to you readers, to Google, to Delicious, to Digg, to Twitter, but also these services would push an update to their users and other services to notify them that received something from superfeedr&amp;#8230; and so on.&lt;/p&gt;
&lt;p&gt;Our mission at Superfeedr is to take all these &amp;#8216;static&amp;#8217; bits of information that are feeds, and push them to your services so that you can as well push them (or derived information) to other services&amp;#8230; creating a stream.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We&amp;#8217;re turning feeds into stream.&lt;/strong&gt;&lt;/p&gt;
&lt;p class=&quot;footnote&quot; id=&quot;fn1&quot;&gt;&lt;sup&gt;1&lt;/sup&gt; On top of that, &lt;a href=&quot;http://blog.superfeedr.com/gospel/something-stupid/&quot;&gt;pull is stupid&lt;/a&gt; .&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>A better Schema</title>
        
        <category term="Atom" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="schema" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/Atom/schema/a-better-schema"/>
        <published>2009-06-25T00:00:00-07:00</published>
        <updated>2009-06-25T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/Atom/schema/a-better-schema</id>
        <content type="html">&lt;p&gt;One of the great features of &lt;a href=&quot;http://superfeedr.com&quot;&gt;Superfeedr&lt;/a&gt; is that it sends a standard format for feed entries. Whether the initial feed format was any flavor of Atom, or &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;, we would map this into a standard Atom feed. Thanks to that it is &lt;strong&gt;easier&lt;/strong&gt; for you to integrate this data into your apps, since you will gain &lt;em&gt;consistency&lt;/em&gt; in the format.&lt;/p&gt;
&lt;p&gt;However, to achieve that, we have to make some decisions and scraps information from the initial feed. Mapping a title is easy, but that&amp;#8217;s about the only obvious data. We actually had to find the smallest common set of attribute that a feed has.&lt;br /&gt;
Up to now, entries that we sent had this :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;ID&lt;/li&gt;
	&lt;li&gt;&lt;span class=&quot;caps&quot;&gt;URL&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;Title&lt;/li&gt;
	&lt;li&gt;Summary&lt;/li&gt;
	&lt;li&gt;Published date&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;#8217;ve been working to complete that over the past few weeks, and here is what you will soon get, on top of what you already have:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Content (if available, if not, you&amp;#8217;ll get a summary)&lt;/li&gt;
	&lt;li&gt;Categories (or tags)&lt;/li&gt;
	&lt;li&gt;Authors informations : email, name and uri&lt;/li&gt;
	&lt;li&gt;Links : not only you will get the entry&amp;#8217;s url, but you will also get any other link that the entry may contain : enclosure, comments&amp;#8230; etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The new schema will be published soon, but first, we want to make sure that there is no other element that you would want to see added to it. What would you add in there?&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>RSS or Atom, not both!</title>
        
        <category term="gospel" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="feeds" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/feeds/gospel/atom-or-rss-not-both"/>
        <published>2009-06-23T00:00:00-07:00</published>
        <updated>2009-06-23T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/feeds/gospel/atom-or-rss-not-both</id>
        <content type="html">&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/RSS_(file_format)&quot;&gt;&lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;http://www.atomenabled.org/developers/syndication/atom-format-spec.php&quot;&gt;&lt;span class=&quot;caps&quot;&gt;ATOM&lt;/span&gt;&lt;/a&gt; have very similar (if not identical) purposes. I don&amp;#8217;t know any feed consumer that consumes only one type, yet, a lot of services are still providing both.&lt;/p&gt;
&lt;p&gt;Publishing both is useless, because it&amp;#8217;s likely that services will end up polling both of them, to identify new content. It is very hard for them to be 100% sure that they actually contain (and will always contain) the same information. You know that &lt;a href=&quot;http://blog.superfeedr.com/gospel/something-stupid/&quot;&gt;polling your blog or service is stupid&lt;/a&gt;&amp;#8230; don&amp;#8217;t make twice as stupid.&lt;/p&gt;
&lt;p&gt;Yet, if you publish both &lt;span class=&quot;caps&quot;&gt;ATOM&lt;/span&gt; and &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;, make our lives easier in two steps :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Remove the extra &lt;code&gt;&amp;lt;link href=&quot;...&quot;&amp;gt;&lt;/code&gt;, by keeping just Atom or &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Add a 301 redirection from one to another, so that you&amp;#8217;re not messing with your existing pollers (as they should probably follow redirections and be able to parse either format) : with Apache it&amp;#8217;s as easy as: &lt;code&gt;RedirectMatch 301 /statuses/user_timeline/(.*)\.rss http://twitter.com/statuses/user_timeline/$1.atom&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No more excuse for not doing it! Please note that I am not discussing whether you should keep &lt;span class=&quot;caps&quot;&gt;ATOM&lt;/span&gt; or &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;. I&amp;#8217;d go for Atom, but that&amp;#8217;s a not the case for everybody.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>We're doing something stupid so that you don't have to</title>
        
        <category term="gospel" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/gospel/something-stupid"/>
        <published>2009-06-19T00:00:00-07:00</published>
        <updated>2009-06-19T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/gospel/something-stupid</id>
        <content type="html">&lt;p&gt;It&amp;#8217;s a fact, polling sucks, and it sucks, because it&amp;#8217;s stupid. This is what &lt;a href=&quot;http://twitter.com/kellan&quot;&gt;kellan&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/rabble&quot;&gt;rabble&lt;/a&gt; &lt;a href=&quot;http://www.slideshare.net/rabble/beyond-rest-building-data-services-with-xmpp-pubsub?src=embed&quot;&gt;showed last year&lt;/a&gt; at &lt;span class=&quot;caps&quot;&gt;OSCON&lt;/span&gt; :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On July 21, 2008, Friendfeed hit Flickr 2.9 million times to get the latest photos of 45,754 users, of which 6,721 visited Flickr in that 24-hour period, and could have potentially uploaded a photo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And this is &lt;strong&gt;just friendfeed&lt;/strong&gt;. How many services is there around here that are polling Flickr, Twitter, Delicious, Youtube, or even this blog? Thousands (except maybe for this blog).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/polling_sucks.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Push is the solution&lt;/strong&gt;. Except that it only works if each service out there pushes, and if each consumer actually accepts to receive pushed content. That makes it pretty hypothetical, right?&lt;/p&gt;
&lt;p&gt;We (pollers) should &lt;strong&gt;collaborate&lt;/strong&gt;. Collaboration means that, even if we can all poll, there is probably no need for that. &lt;em&gt;We could probably all grow tomatoes, but it makes more sense to buy them from someone who can grow them cheaper and more effectively than us&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This is what &lt;a href=&quot;http://superfeedr.com&quot;&gt;Superfeedr&lt;/a&gt; is all about: &lt;del&gt;growing tomatoes&lt;/del&gt; doing something that you could do, but doing it &lt;a href=&quot;http://superfeedr.com/cost&quot;&gt;cheaper&lt;/a&gt;, more efficiently and, more importantly, by sharing the results with you.&lt;/p&gt;
&lt;p&gt;Yes, polling is still stupid, but we&amp;#8217;re doing it for you and everybody who cares about the same feeds.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>PubSubHubbub</title>
        
        <category term="api" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="http" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <category term="pubsubhubbub" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/api/http/pubsubhubbub/pubsubhubbub"/>
        <published>2009-06-18T00:00:00-07:00</published>
        <updated>2009-06-18T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/api/http/pubsubhubbub/pubsubhubbub</id>
        <content type="html">&lt;p&gt;We&amp;#8217;re proud to announce that &lt;a href=&quot;http://superfeedr.com&quot;&gt;Superfeedr&lt;/a&gt; is one of the very first services to actually support the infamous &lt;a href=&quot;http://code.google.com/p/pubsubhubbub/&quot;&gt;PubSubHubbub&lt;/a&gt; protocol. If you think the name is ugly, check the &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; style of the &lt;a href=&quot;http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.1.html&quot;&gt;spec&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This presentation should give you enough details about PubSubhubbub.&lt;br /&gt;
&lt;iframe src='http://docs.google.com/EmbedSlideshow?docid=ajd8t6gk4mh2_34dvbpchfs&amp;amp;size=s' frameborder='0' width='400' height='350'&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;What does that mean for you superfeedr users? It means that you can get the &lt;span class=&quot;caps&quot;&gt;ATOM&lt;/span&gt; payload of the feeds we parsed pushed to your endpoint url. Check our &lt;a href=&quot;http://groups.google.com/group/superfeedr/web/pubsubhubbub&quot;&gt;implementation notes&lt;/a&gt; to learn more.&lt;/p&gt;
&lt;p&gt;Ha, I almost forgot, you can find our hub there &lt;a href=&quot;http://superfeedr.com/hubbub&quot;&gt;http://superfeedr.com/hubbub&lt;/a&gt;.&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
    <entry>
        <title>Hello World</title>
        
        <category term="meta" scheme="http://www.sixapart.com/ns/types#tag" />
        
        <link href="http://blog.superfeedr.com/meta/hello-world"/>
        <published>2009-06-17T00:00:00-07:00</published>
        <updated>2009-06-17T00:00:00-07:00</updated>
        <id>blog.superfeedr.com:/meta/hello-world</id>
        <content type="html">&lt;p&gt;Welcome to the Superfeedr&amp;#8217;s blog. I am not sure what you expect from here. You know what a geek does when he&amp;#8217;s embarrassed does, right? He gets into technical details.&lt;/p&gt;
&lt;p&gt;This blog has been built with the great piece of code that &lt;a href=&quot;http://github.com/mojombo/jekyll/tree/master&quot;&gt;Jekyll&lt;/a&gt; is. It is hosted on &lt;a href=&quot;http://github.com&quot;&gt;Github&lt;/a&gt;, and I used &lt;a href=&quot;http://macromates.com/&quot;&gt;TextMate&lt;/a&gt; Version 1.5.8 (1498) to write it. I also used &lt;a href=&quot;http://git-scm.com/&quot;&gt;Git&lt;/a&gt; to push it on our &lt;a href=&quot;http://github.com/superfeedr&quot;&gt;Github&lt;/a&gt; repository. TextMate runs on my &lt;a href=&quot;http://www.apple.com/macbookpro/&quot;&gt;MacBookPro&lt;/a&gt; 2.53 Ghz Intel Core 2 Duo, with 4 GB of DD3 &lt;span class=&quot;caps&quot;&gt;RAM&lt;/span&gt;. It&amp;#8217;s about 85° F in the &lt;a href=&quot;http://maps.google.com/maps?client=safari&amp;amp;q=PariSoma&amp;amp;oe=UTF-8&amp;amp;ie=UTF8&amp;amp;hl=en&amp;amp;ll=37.774446,-122.41044&amp;amp;spn=0.04152,0.086002&amp;amp;z=14&amp;amp;iwloc=A&quot;&gt;room&lt;/a&gt; in which I am working right now.&lt;/p&gt;
&lt;p&gt;Welcome!&lt;/p&gt;</content>
        <author>
            <name>Julien</name>
            <uri>http://twitter.com/julien51</uri>
        </author>
    </entry>
    
</feed>