<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mariano Guerra's Log (Publicaciones sobre phsb)</title><link>http://marianoguerra.org/</link><description></description><atom:link href="http://marianoguerra.org/es/categories/phsb.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><lastBuildDate>Mon, 18 Nov 2024 17:56:42 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Pubsubhubbub developer's guide</title><link>http://marianoguerra.org/es/posts/200909pubsubhubbub-developers-guide/</link><dc:creator>Mariano Guerra</dc:creator><description>&lt;h2&gt;&lt;a name="naming_conventions"&gt;naming conventions&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a name="naming_conventions"&gt;pshb/PSHB = pubsubhubbub &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="naming_conventions"&gt;gae/GAE = Google App Engine &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="naming_conventions"&gt;things that start with "$" are bash commands &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="naming_conventions"&gt;things that start with "!" are important notes &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;a name="create_directory_to_hold_all_the_content_of_this_tutorial"&gt;create directory to hold all the content of this tutorial&lt;/a&gt;&lt;/h2&gt;&lt;pre class="prettyprint"&gt;&lt;a name="create_directory_to_hold_all_the_content_of_this_tutorial"&gt;&lt;span class="pln"&gt;$ mkdir pshb&lt;br&gt;$ cd pshb&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt;&lt;h2&gt;&lt;a name="download_Google_App_Engine_SDK"&gt;download Google App Engine SDK&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a name="download_Google_App_Engine_SDK"&gt;&lt;strong&gt;!&lt;/strong&gt; pshb trunk needs the latest version of GAE (1.2.4 as of today) to work, but &lt;strong&gt;!&lt;/strong&gt; the download page display an older version &lt;/a&gt;&lt;/p&gt;&lt;pre class="prettyprint"&gt;&lt;a name="download_Google_App_Engine_SDK"&gt;&lt;span class="pln"&gt;$ wget http&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="com"&gt;//googleappengine.googlecode.com/files/google_appengine_1.2.4.zip&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;$ unzip google_appengine_1&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="lit"&gt;2.4&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;zip&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt;&lt;p&gt;&lt;a name="download_Google_App_Engine_SDK"&gt;&lt;strong&gt;!&lt;/strong&gt; GAE needs python 2.5 in order to work, if you have an older or newer version of python install python 2.5 (OS and distro dependent, wont be covered here) &lt;/a&gt;&lt;/p&gt;&lt;h2&gt;&lt;a name="download_the_latest_version_of_pshb"&gt;download the latest version of pshb&lt;/a&gt;&lt;/h2&gt;&lt;pre class="prettyprint"&gt;&lt;a name="download_the_latest_version_of_pshb"&gt;&lt;span class="pln"&gt;$ svn checkout http&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="com"&gt;//pubsubhubbub.googlecode.com/svn/trunk/ pubsubhubbub&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt;&lt;h2&gt;&lt;a name="start_pshb"&gt;start pshb&lt;/a&gt;&lt;/h2&gt;&lt;pre class="prettyprint"&gt;&lt;a name="start_pshb"&gt;&lt;span class="pln"&gt;$ python2&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="lit"&gt;5&lt;/span&gt;&lt;span class="pln"&gt; google_appengine&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;dev_appserver&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;py pubsubhubbub&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;hub&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt;&lt;p&gt;&lt;a name="start_pshb"&gt;&lt;strong&gt;!&lt;/strong&gt; note the python2.5 command &lt;/a&gt;&lt;/p&gt;&lt;h2&gt;&lt;a name="check_that_the_hub_started"&gt;check that the hub started&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a name="check_that_the_hub_started"&gt;type &lt;span style="border-bottom: 1px dotted black;"&gt;http://localhost:8080&lt;/span&gt; on your browser, you should see something like: &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="check_that_the_hub_started"&gt;&lt;i&gt;Welcome to the demo &lt;span style="border-bottom: 1px dotted black;"&gt;PubSubHubbub&lt;/span&gt; reference Hub server!&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="check_that_the_hub_started"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="check_that_the_hub_started"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XkKIWh0VZYk/SqrdHFQ2i6I/AAAAAAAAGxs/kPxuBPwJ6Nc/s1600-h/pshb0.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_XkKIWh0VZYk/SqrdHFQ2i6I/AAAAAAAAGxs/kPxuBPwJ6Nc/s320/pshb0.png" alt="" id="BLOGGER_PHOTO_ID_5380355818589162402" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h2&gt;&lt;a name="download_the_example"&gt;download the example&lt;/a&gt;&lt;/h2&gt;&lt;pre class="prettyprint"&gt;&lt;a name="download_the_example"&gt;&lt;span class="com"&gt;# we will need to fetch the tubes library and the example that we will be using.&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;$ git clone git&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="com"&gt;//github.com/marianoguerra/tubes.git&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span class="com"&gt;# now we will start the example&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&lt;br&gt;$ cd tubes&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;ihasfriendz&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;$ python main&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;py&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt;&lt;p&gt;&lt;a name="download_the_example"&gt;we should see something like: &lt;/a&gt;&lt;/p&gt;&lt;pre class="prettyprint"&gt;&lt;a name="download_the_example"&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="pun"&gt;*&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Running&lt;/span&gt;&lt;span class="pln"&gt; on http&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="com"&gt;//0.0.0.0:8081/&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&lt;/span&gt;&lt;span class="pun"&gt;*&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="typ"&gt;Restarting&lt;/span&gt;&lt;span class="pln"&gt; &lt;/span&gt;&lt;span class="kwd"&gt;with&lt;/span&gt;&lt;span class="pln"&gt; reloader&lt;/span&gt;&lt;span class="pun"&gt;...&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a name="components_used_by_the_example"&gt;components used by the example&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;a name="components_used_by_the_example"&gt;   &lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a name="components_used_by_the_example"&gt;werkzeug: &lt;span style="border-bottom: 1px dotted black;"&gt;http://werkzeug.pocoo.org&lt;/span&gt; &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="components_used_by_the_example"&gt;jquery: &lt;span style="border-bottom: 1px dotted black;"&gt;http://jquery.com&lt;/span&gt; &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="components_used_by_the_example"&gt;tubes: &lt;span style="border-bottom: 1px dotted black;"&gt;http://github.com/marianoguerra/tubes/tree/master&lt;/span&gt; &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="components_used_by_the_example"&gt;pubsubhubbub_publish.py: from pshb &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a name="components_used_by_the_example"&gt;feedformatter.py: &lt;span style="border-bottom: 1px dotted black;"&gt;http://code.google.com/p/feedformatter/&lt;/span&gt; &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;a name="publish_the_feed_to_the_hub"&gt;publish the feed to the hub&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a name="publish_the_feed_to_the_hub"&gt;go to the following URL on your browser: &lt;span style="border-bottom: 1px dotted black;"&gt;http://localhost:8080/publish&lt;/span&gt; &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="publish_the_feed_to_the_hub"&gt;on the &lt;i&gt;Topic&lt;/i&gt; field enter: &lt;span style="border-bottom: 1px dotted black;"&gt;http://localhost:8081/atom/stream/_MYUSER_&lt;/span&gt; and click publish &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="publish_the_feed_to_the_hub"&gt;&lt;strong&gt;!&lt;/strong&gt; if everything goes OK, then you wont notice anything on the page, that's ok, browsers act that way to 204 responses &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="publish_the_feed_to_the_hub"&gt;&lt;strong&gt;!&lt;/strong&gt; &lt;i&gt;MYUSER&lt;/i&gt; is a placeholder for the user you will use to post notices on the test app later (for example &lt;span style="border-bottom: 1px dotted black;"&gt;http://localhost:8081/atom/stream/marianoguerra&lt;/span&gt;) &lt;/a&gt;&lt;/p&gt;&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XkKIWh0VZYk/SqrdHbMyTDI/AAAAAAAAGx0/HU3XaAhjP_w/s1600-h/pshb1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_XkKIWh0VZYk/SqrdHbMyTDI/AAAAAAAAGx0/HU3XaAhjP_w/s320/pshb1.png" alt="" id="BLOGGER_PHOTO_ID_5380355824477686834" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&lt;h2&gt;&lt;a name="subscribing_to_the_hub"&gt;subscribing to the hub&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a name="subscribing_to_the_hub"&gt;go to the following URL on your browser: &lt;span style="border-bottom: 1px dotted black;"&gt;http://localhost:8080/subscribe&lt;/span&gt; &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="subscribing_to_the_hub"&gt;on the &lt;i&gt;Callback&lt;/i&gt; field enter: &lt;span style="border-bottom: 1px dotted black;"&gt;http://localhost:8081/callback&lt;/span&gt; on the &lt;i&gt;Topic&lt;/i&gt; field enter: &lt;span style="border-bottom: 1px dotted black;"&gt;http://localhost:8081/atom/stream/_MYUSER_&lt;/span&gt; on the &lt;i&gt;Verify token&lt;/i&gt; field enter something random like: &lt;i&gt;iwantmahcookie&lt;/i&gt; &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="subscribing_to_the_hub"&gt;&lt;strong&gt;!&lt;/strong&gt; &lt;i&gt;MYUSER&lt;/i&gt; is a placeholder for the user you will use to post notices on the test app later (for example &lt;span style="border-bottom: 1px dotted black;"&gt;http://localhost:8081/atom/stream/marianoguerra&lt;/span&gt;) &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="subscribing_to_the_hub"&gt;click &lt;i&gt;Do it&lt;/i&gt; &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="subscribing_to_the_hub"&gt;&lt;strong&gt;!&lt;/strong&gt; if everything goes OK, then you wont notice anything on the page, that's OK, browsers act that way to 204 responses &lt;/a&gt;&lt;/p&gt;&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_XkKIWh0VZYk/SqrdHx3cWDI/AAAAAAAAGx8/V4UrVzmx1Tc/s1600-h/pshb2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://4.bp.blogspot.com/_XkKIWh0VZYk/SqrdHx3cWDI/AAAAAAAAGx8/V4UrVzmx1Tc/s320/pshb2.png" alt="" id="BLOGGER_PHOTO_ID_5380355830562183218" border="0"&gt;&lt;/a&gt;&lt;h2&gt;&lt;a name="create_some_content"&gt;create some content&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a name="create_some_content"&gt;go to the following URL on your browser: &lt;span style="border-bottom: 1px dotted black;"&gt;http://localhost:8081/files/index.html&lt;/span&gt; &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="create_some_content"&gt;post some content on the form, use the user you used as &lt;i&gt;MYUSER&lt;/i&gt; &lt;/a&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XkKIWh0VZYk/SqrdIRtBMoI/AAAAAAAAGyE/hOtiESEaaHY/s1600-h/pshb3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_XkKIWh0VZYk/SqrdIRtBMoI/AAAAAAAAGyE/hOtiESEaaHY/s320/pshb3.png" alt="" id="BLOGGER_PHOTO_ID_5380355839108395650" border="0"&gt;&lt;/a&gt;&lt;a name="create_some_content"&gt;&lt;br&gt;you can check that the item was posted going manually to &lt;span style="border-bottom: 1px dotted black;"&gt;http://localhost:8081/atom/stream/_MYUSER_&lt;/span&gt;, you should see an atom feed there&lt;br&gt;&lt;/a&gt;&lt;p&gt;&lt;a name="create_some_content"&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XkKIWh0VZYk/SqrdJC1gwRI/AAAAAAAAGyM/vKPiADfZpLI/s1600-h/pshb4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_XkKIWh0VZYk/SqrdJC1gwRI/AAAAAAAAGyM/vKPiADfZpLI/s320/pshb4.png" alt="" id="BLOGGER_PHOTO_ID_5380355852297355538" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;&lt;a name="manually_processing_the_tasks"&gt;manually processing the tasks&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a name="manually_processing_the_tasks"&gt;when running the hub on the dev server we have to run the task queues by hand, to do that go to &lt;span style="border-bottom: 1px dotted black;"&gt;http://localhost:8080/_ah/admin/queues&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="manually_processing_the_tasks"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_XkKIWh0VZYk/Sqrd_5aSiyI/AAAAAAAAGyU/pjEz8TOZXWc/s1600-h/pshb5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://2.bp.blogspot.com/_XkKIWh0VZYk/Sqrd_5aSiyI/AAAAAAAAGyU/pjEz8TOZXWc/s320/pshb5.png" alt="" id="BLOGGER_PHOTO_ID_5380356794660064034" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;p&gt;&lt;a name="manually_processing_the_tasks"&gt;on the &lt;i&gt;Tasks in Queue&lt;/i&gt; column of the &lt;i&gt;feed-pulls&lt;/i&gt; you should see a number different than 0 (that is the number of messages you created since the last execution of that task). &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="manually_processing_the_tasks"&gt;click on the &lt;i&gt;feed-pulls&lt;/i&gt; link, there click on the &lt;i&gt;run&lt;/i&gt; button. &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="manually_processing_the_tasks"&gt;when we run the feed pulls task, we tell pshb to fetch th&lt;/a&gt;&lt;a name="manually_processing_the_tasks"&gt;e feeds that have new content (the ones that did a post to the hub to inform that there is new content)&lt;br&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="manually_processing_the_tasks"&gt;&lt;/a&gt;&lt;/p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_XkKIWh0VZYk/SqreATS1_OI/AAAAAAAAGyc/loOLwdvXcSk/s1600-h/pshb6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_XkKIWh0VZYk/SqreATS1_OI/AAAAAAAAGyc/loOLwdvXcSk/s320/pshb6.png" alt="" id="BLOGGER_PHOTO_ID_5380356801608154338" border="0"&gt;&lt;/a&gt;&lt;p&gt;&lt;a name="manually_processing_the_tasks"&gt;&lt;strong&gt;!&lt;/strong&gt;  on production hubs this tasks are done autom&lt;/a&gt;&lt;a name="manually_processing_the_tasks"&gt;atically &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="manually_processing_the_tasks"&gt;now we go again to the &lt;i&gt;Task Queues&lt;/i&gt; page, th&lt;/a&gt;&lt;a name="manually_processing_the_tasks"&gt;ere the &lt;i&gt;event-delivery&lt;/i&gt; queue should have a number different than 0 (the number of messages that are pending to be sent to the subscribers), we click on the &lt;i&gt;event-delivery&lt;/i&gt; and then we click on the &lt;i&gt;run&lt;/i&gt; button. &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="manually_processing_the_tasks"&gt;when we run the event delivery task, we tell pshb to do a POST on every callback url registered for the feeds that were fetched on the &lt;i&gt;feed-pulls&lt;/i&gt; task. &lt;/a&gt;&lt;/p&gt;&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XkKIWh0VZYk/SqreA9bViFI/AAAAAAAAGyk/TOOj_6tdoJ8/s1600-h/pshb7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_XkKIWh0VZYk/SqreA9bViFI/AAAAAAAAGyk/TOOj_6tdoJ8/s320/pshb7.png" alt="" id="BLOGGER_PHOTO_ID_5380356812918065234" border="0"&gt;&lt;/a&gt;&lt;h2&gt;&lt;a name="seeing_it_work"&gt;seeing it work&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a name="seeing_it_work"&gt;now that we created a feed, informed the hub that we had new content, the hub fetched the content and sent it to the callback, we want to see this content, for this go with your browser to &lt;span style="border-bottom: 1px dotted black;"&gt;http://localhost:8081/new-notices/&lt;/span&gt;, you will see the notices that pshb posted back to you the last time. &lt;/a&gt;&lt;/p&gt;&lt;br&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_XkKIWh0VZYk/SqreBWaXNCI/AAAAAAAAGys/wxGClI7Q2S0/s1600-h/pshb8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 200px;" src="http://1.bp.blogspot.com/_XkKIWh0VZYk/SqreBWaXNCI/AAAAAAAAGys/wxGClI7Q2S0/s320/pshb8.png" alt="" id="BLOGGER_PHOTO_ID_5380356819624866850" border="0"&gt;&lt;/a&gt;&lt;br&gt;&lt;p&gt;&lt;a name="seeing_it_work"&gt;&lt;strong&gt;!&lt;/strong&gt; if you refresh the page you will notice that the messages aren't there anymore, that's because the example stores the new messages in a Queue that is flushed when the request for new notices is made, in this way you can see only the new messages. &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="seeing_it_work"&gt;&lt;strong&gt;!&lt;/strong&gt; the example stores all the information on global variables on main.py (this is to make the example simpler), so every time you change something on main.py and save the server will reload the changes and all the data will disappear. &lt;/a&gt;&lt;/p&gt;&lt;h2&gt;&lt;a name="for_lazy_people"&gt;for lazy people&lt;/a&gt;&lt;/h2&gt;&lt;pre class="prettyprint"&gt;&lt;a name="for_lazy_people"&gt;&lt;span class="com"&gt;#!/usr/bin/env sh&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span class="com"&gt;# create the example directory&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;mkdir pshb&lt;br&gt;cd pshb&lt;br&gt;&lt;br&gt;CWD&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;$&lt;/span&gt;&lt;span class="pun"&gt;(&lt;/span&gt;&lt;span class="pln"&gt;pwd&lt;/span&gt;&lt;span class="pun"&gt;)&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;EXAMPLE&lt;/span&gt;&lt;span class="pun"&gt;=&lt;/span&gt;&lt;span class="pln"&gt;$CWD&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;tubes&lt;/span&gt;&lt;span class="pun"&gt;/&lt;/span&gt;&lt;span class="pln"&gt;ihasfriendz&lt;br&gt;&lt;br&gt;wget http&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="com"&gt;//googleappengine.googlecode.com/files/google_appengine_1.2.4.zip&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;unzip google_appengine_1&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="lit"&gt;2.4&lt;/span&gt;&lt;span class="pun"&gt;.&lt;/span&gt;&lt;span class="pln"&gt;zip&lt;br&gt;&lt;br&gt;svn checkout http&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="com"&gt;//pubsubhubbub.googlecode.com/svn/trunk/ pubsubhubbub&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span class="com"&gt;# we will need to fetch the tubes library and the example that we will be using.&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;git clone git&lt;/span&gt;&lt;span class="pun"&gt;:&lt;/span&gt;&lt;span class="com"&gt;//github.com/marianoguerra/tubes.git&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;span class="com"&gt;# now we will start the example&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;&lt;br&gt;echo &lt;/span&gt;&lt;span class="str"&gt;"run \"cd $EXAMPLE; python main.py\" on a shell to run the example"&lt;/span&gt;&lt;span class="pln"&gt;&lt;br&gt;echo &lt;/span&gt;&lt;span class="str"&gt;"run \"cd $PWD; python2.5 google_appengine/dev_appserver.py pubsubhubbub/hub/\" on a shell to run the hub"&lt;/span&gt;&lt;/a&gt;&lt;/pre&gt;</description><guid>http://marianoguerra.org/es/posts/200909pubsubhubbub-developers-guide/</guid><pubDate>Sat, 12 Sep 2009 00:00:00 GMT</pubDate></item></channel></rss>