<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>pubsub &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/pubsub/</link>
	<description>Feed of posts on WordPress.com tagged "pubsub"</description>
	<pubDate>Sat, 28 Nov 2009 04:29:18 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Web hooks Protocol - Pubsubhubbub]]></title>
<link>http://azgtech.wordpress.com/2009/10/23/web-hooks-protocol-pubsubhubbub/</link>
<pubDate>Fri, 23 Oct 2009 02:33:49 +0000</pubDate>
<dc:creator>azghanvi</dc:creator>
<guid>http://azgtech.wordpress.com/2009/10/23/web-hooks-protocol-pubsubhubbub/</guid>
<description><![CDATA[A simple, open, server-to-server web-hook-based pubsub (publish/subscribe) protocol as an extension ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>A simple, open, server-to-server web-hook-based pubsub (publish/subscribe) protocol as an extension to Atom and RSS.</p>
<p>Parties (servers) speaking the <a href="http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.2.html">PubSubHubbub protocol</a> can get near-instant notifications (via webhook callbacks) when a topic (feed URL) they&#8217;re interested in is updated.</p>
<p>The protocol in a nutshell is as follows:</p>
<ul>
<li>An feed URL (a &#34;topic&#34;) declares its Hub server(s) in its Atom or RSS XML file, via &#60;link rel=&#34;hub&#34; &#8230;&#62;. The hub(s) can be run by the publisher of the feed, or can be a <a href="http://pubsubhubbub.appspot.com/">community hub that anybody can use</a>. (Atom and <a href="http://code.google.com/p/pubsubhubbub/wiki/RssFeeds">RssFeeds</a> are supported)</li>
</ul>
<ul>
<li>A subscriber (a server that&#8217;s interested in a topic), initially fetches the Atom URL as normal. If the Atom file declares its hubs, the subscriber can then avoid <a href="http://code.google.com/p/pubsubhubbub/wiki/WhyPollingSucks">lame, repeated polling</a> of the URL and can instead register with the feed&#8217;s hub(s) and subscribe to updates.</li>
</ul>
<ul>
<li>The subscriber subscribes to the Topic URL from the Topic URL&#8217;s declared Hub(s).</li>
</ul>
<ul>
<li>When the Publisher next updates the Topic URL, the publisher software <a href="http://code.google.com/p/pubsubhubbub/wiki/PublisherClients">pings the Hub(s)</a> saying that there&#8217;s an update.</li>
</ul>
<ul>
<li>The hub <a href="http://code.google.com/p/pubsubhubbub/wiki/PublisherEfficiency">efficiently fetches the published feed</a> and multicasts the new/changed content out to all registered subscribers.</li>
</ul>
<p>The protocol is decentralized and free. No company is at the center of this controlling it. Anybody can <a href="http://code.google.com/p/pubsubhubbub/wiki/Hubs">run a hub</a>, or anybody can ping (publish) or subscribe using <a href="http://code.google.com/p/pubsubhubbub/wiki/Hubs">open hubs</a>.</p>
<p>To bootstrap this, we&#8217;ve provided an open source reference implementation of the hub (the hard part of the protocol) that runs on Google App Engine, and is open for anybody to use.</p>
<p>&#60;iframe src=&#34;<a href="http://docs.google.com/present/embed?id=ajd8t6gk4mh2_34dvbpchfs&#38;size=m">http://docs.google.com/present/embed?id=ajd8t6gk4mh2_34dvbpchfs&#38;size=m</a>&#34; frameborder=&#34;0&#34; width=&#34;555&#34; height=&#34;451&#34;&#62;&#60;/iframe&#62;</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[gwt-strophe 0.1.0 released]]></title>
<link>http://jprieur.wordpress.com/2009/10/16/gwt-strophe-0-1-0-released/</link>
<pubDate>Thu, 15 Oct 2009 22:04:45 +0000</pubDate>
<dc:creator>jprieur</dc:creator>
<guid>http://jprieur.wordpress.com/2009/10/16/gwt-strophe-0-1-0-released/</guid>
<description><![CDATA[I just released the first version of gwt-strophe, GWT bindings for the Strophe XMPP library. Nothing]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>I just released the first version of gwt-strophe, GWT bindings for the Strophe XMPP library. Nothing much to say else than it is pretty young, with all that can imply. The project is hosted at <a href="https://launchpad.net/gwt-strophe" target="_blank">https://launchpad.net/gwt-strophe</a></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[GWT bindings for the Strophe XMPP library]]></title>
<link>http://jprieur.wordpress.com/2009/10/07/gwt-bindings-for-the-strophe-xmpp-library/</link>
<pubDate>Wed, 07 Oct 2009 20:03:54 +0000</pubDate>
<dc:creator>jprieur</dc:creator>
<guid>http://jprieur.wordpress.com/2009/10/07/gwt-bindings-for-the-strophe-xmpp-library/</guid>
<description><![CDATA[Google Web Toolkit bindings for Strophe, the JavaScript XMPP library, are available at https://launc]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><a href="http://code.google.com/webtoolkit/" target="_blank">Google Web Toolkit</a> bindings for <a href="http://code.stanziq.com/strophe/">Strophe</a>, the JavaScript XMPP library, are available at <a href="https://launchpad.net/gwt-strophe" target="_blank">https://launchpad.net/gwt-strophe</a>. I believe it provides an almost complete API coverage, including the PubSub plugin. However, it is quite young and far from being thoroughly tested, hence comments are more than welcome. No release yet, so to get the code, proceed as follows:</p>
<blockquote><p>bzr branch lp:gwt-strophe</p></blockquote>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Fast post to test pubsub]]></title>
<link>http://inkzeetest.wordpress.com/2009/08/16/fast-post-to-test-pubsub/</link>
<pubDate>Sun, 16 Aug 2009 01:10:54 +0000</pubDate>
<dc:creator>Alex Barrera</dc:creator>
<guid>http://inkzeetest.wordpress.com/2009/08/16/fast-post-to-test-pubsub/</guid>
<description><![CDATA[w00t! New content, see if we get it!]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>w00t! New content, see if we get it!</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Real-time WordPress.com subscription]]></title>
<link>http://andy.wordpress.com/2009/07/16/real-time-wordpress-com-subscription/</link>
<pubDate>Wed, 15 Jul 2009 18:06:24 +0000</pubDate>
<dc:creator>Andy</dc:creator>
<guid>http://andy.wordpress.com/2009/07/16/real-time-wordpress-com-subscription/</guid>
<description><![CDATA[Sometimes RSS isn&#8217;t fast enough. We&#8217;ve been experimenting with faster blog subscription ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><a href="http://www.flickr.com/photos/thatguyfromcchs08/2300190277/"><img class="alignright size-full wp-image-275" title="&#34;Going nowhere fast&#34; by Nathan" src="http://andy.wordpress.com/files/2009/07/2300190277_360853ae0d_m.jpg" alt="Going nowhere fast" width="150" height="112" /></a>Sometimes RSS isn&#8217;t fast enough. We&#8217;ve been experimenting with faster blog subscription delivery using Jabber to push the messages. When you use Jabber to subscribe to blogs you get the news as soon as it is published. Now almost every post and comment on <a href="http://wordpress.com/">WordPress.com</a> blogs is published this way and you can subscribe to these streams using almost any Jabber client. Messages are delivered typically within one second of publication. You can also publish to your blogs by typing instant messages. Soon comments will be appearing in Jabber chat rooms.</p>
<p>Let me break it down. <a href="http://jabber.org/">Jabber</a> (<a href="http://xmpp.org/">XMPP</a>) is an instant messaging protocol. There are dozens of free clients (programs) that can connect to Jabber services, thousands of Jabber servers, and millions of daily Jabber users around the world. Even some phones can connect to it, including the iPhone with an appropriate app. So you can probably use Jabber. The primary exception is people behind company or government firewalls that block XMPP ports, but we&#8217;ll have a web-based solution for them soon.</p>
<p>Before I give you a link I have to tell you that this service is experimental. If you use it, you are a tester so please wear your white lab coat. A few dozen people have been using it for several months with very few hiccups, but hiccups are still to be expected. Even so, most of us at Automattic rely on it daily to surface and accelerate the discussions on our private blogs. Finally I must tell you that we have not yet worked out all the business angles, so the feature set and limitations may change to accommodate our inevitable need to feed the monkey.</p>
<p>Now I give you <a href="http://im.wordpress.com/">im.wordpress.com</a>, which I demonstrated at the <a href="http://www.techcrunch.com/real-time-stream-and-4th-annual-crunchup-at-august-capital/">CrunchUp last week</a>. Every WordPress.com account is automatically linked to a Jabber account on im.wordpress.com. We have compiled <a href="http://support.wordpress.com/jabber/">instructions for setting up</a> some popular Jabber clients.</p>
<p>If you want my personal recommendation for a Jabber client, my choice for Mac OS X is <a href="http://adium.im/">Adium</a>. If you already use iChat, just stick with iChat. Some of my coworkers who run Windows have chosen <a href="http://pidgin.im/">Pidgin</a>. I also sometimes use <a href="http://psi-im.org/">Psi</a>, which is available for Mac, Windows, and Linux.</p>
<p>Here is some info for people familiar with XMPP. This service is based on <a href="http://www.xmpp.org/extensions/xep-0060.html">XEP-0060</a> (Publish-Subscribe) acting as a front-end for WordPress blogs. It started as a simple <a href="http://en.wordpress.com/firehose/">firehose</a> for our commercial partners and grew from there. People subscribing with Jabber clients don&#8217;t need Pubsub. They send simple commands to a chat bot and their items are delivered as XHTML-IM from the blog&#8217;s URL. The bot speaks XEP-0060 on their behalf. If you can speak XEP-0060, you can connect to pubsub.im.wordpress.com and subscribe to nodes. The nodes for this blog are /blogs/andy.wordpress.com/ for posts, /blogs/andy.wordpress.com/comments/ for all comments, and /blogs/andy.wordpress.com/2009/07/16/real-time-wordpress-com-subscription/ for comments on this post. Node discovery and item discovery and retrieval are not implemented. Reasonable subscription and traffic limits will be imposed. If you are looking for a complete feed of all our blogs and comments, try the <a href="http://en.wordpress.com/firehose/">firehose</a>.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Tag-based routing in laconi.ca]]></title>
<link>http://web2dot5.wordpress.com/2009/04/02/tag-based-routing-in-laconica/</link>
<pubDate>Thu, 02 Apr 2009 23:15:09 +0000</pubDate>
<dc:creator>Federico</dc:creator>
<guid>http://web2dot5.wordpress.com/2009/04/02/tag-based-routing-in-laconica/</guid>
<description><![CDATA[Following the last article, i have been experimenting again on laconica and pubsub, this time on the]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Following the last article, i have been experimenting again on laconica and pubsub, this time on the idea of &#8220;<a href="http://metajack.im/2009/01/22/filtering-the-real-time-web/" target="_blank">filtering the real time web</a>&#8220;.</p>
<p>Stomp and generally JMS messages offer the ability to specify headers and body of the message to transmit, in a way that resembles http requests.<br />
In fact, Stomp protocol is really similar to Http protocol, at least in the general structure. The difference is that there are different methods instead of GET, POST, etc..</p>
<blockquote><p>HTTP:<br />
<code><br />
POST /item HTTP/1.0<br />
Header: value</code></p>
<p>POSTBODY</p></blockquote>
<blockquote><p>STOMP (after CONNECT command)<br />
<code><br />
SEND<br />
destination: /item</code></p>
<p>MESSAGE_BODY</p></blockquote>
<p>Very readable, like HTTP. However the main difference is that Stomp, like XMPP, is a stateful and bidirectional protocol.</p>
<p>Like XMPP/pubsub, with STOMP and AMQP you can subscribe to a topic (a.k.a. pubsub node). However content-based routing is only done by STOMP and AMQP (in a way specified by the standard).<br />
AMQP is still in its early days. STOMP is a ready-to-use protocol as many of its implementations.</p>
<p>In the Stomp SUBSCRIBE operation it is possible to specify a JMS Selector. It&#8217;s a header passed when subscribing and it contains a SQL-92 Statement. SQL attributes to match the conditions against are the other headers.</p>
<p>FILTERING LACONICA PUBLIC TIMELINE BY TAGS<br />
&#8212;<br />
Before filtering, the code of the previous post used to push notices needs to be enriched a bit. Particularly, tags present in the notices are now put in a separate header.<br />
Doing this allows to be the target of a Selector.</p>
<p>Push an additional header:</p>
<pre class="brush: php;">
//send tags as headers, so they can be used as JMS selectors
common_log(LOG_DEBUG, 'searching for tags ' . $notice-&gt;id);
$tags = array();
$tag = new Notice_tag();
$tag-&gt;notice_id = $notice-&gt;id;
if ($tag-&gt;find()) {
while ($tag-&gt;fetch()) {
common_log(LOG_DEBUG, 'tag found = ' . $tag-&gt;tag);
array_push($tags,$tag-&gt;tag);
}
}
$tag-&gt;free();

$con-&gt;send('/topic/laconica.allusers',
$notice-&gt;content,
array(
'profile_id' =&gt; $notice-&gt;profile_id,
'tags' =&gt; implode($tags,' ')
)
);
common_log(LOG_DEBUG, 'sent to catch-all topic ' . $notice-&gt;id);
</pre>
<p>The Stomp client is really similar to the one of the previous post, but it specifies the additional header &#8220;selector&#8221; passed when subscribing.</p>
<p>The selector here is &#8220;tags LIKE %dent%&#8221;. This matches all the posts that contains the tag #dent. Substitute it to match the tag you want&#8230;</p>
<pre class="brush: php;">

&lt;?php

require_once &quot;Stomp.php&quot;;

$con = new Stomp('tcp://localhost:61613');
if (!$con-&gt;connect())
    print 'conn failed';

$what = '/topic/laconica.allusers';

$query = 'tags LIKE \'%dent%\'';

if (!$con-&gt;subscribe($what,array(&quot;selector&quot; =&gt; $query)))
    print &quot;sub failed&quot;;
else
    print &quot;sub to &quot;.$what.&quot; successful\n&quot;;

while (true) {
    $msg = $con-&gt;readFrame();
    if ($msg) {
        print $msg-&gt;headers['profile_id'].&quot;: &quot;.$msg-&gt;body. &quot; -- &quot;;
        print &quot;msg_time:&quot;.$msg-&gt;headers['created'].&quot; &quot;;
        print &quot;tags: &quot;.$msg-&gt;headers['tags'].&quot;\n&quot;;
        $con-&gt;ack($msg);
    }
}

$con-&gt;disconnect();
?
</pre>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Talking Without Speaking, Hearing Without Listening.]]></title>
<link>http://nickjosevski.wordpress.com/2009/03/20/talking-without-speaking-hearing-without-listening/</link>
<pubDate>Fri, 20 Mar 2009 02:49:30 +0000</pubDate>
<dc:creator>nickjosevski</dc:creator>
<guid>http://nickjosevski.wordpress.com/2009/03/20/talking-without-speaking-hearing-without-listening/</guid>
<description><![CDATA[In this blog I publish information and ideally have people that subscribe to it. For the blog I use ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>In this blog I publish information and ideally have people that subscribe to it. For the blog I use the WordPress hosting site (service) you may use an RSS aggregator to subscribe (client). In a business application you can achieve this same concept easily with WCF. In this post I will run through an example of the Medical System Client application subscribing to patients of interest. When other clients update those same patients with business critical data the active clients can receive an &#8216;alert&#8217; immediately at easily.</p>
<p>We begin with the client side setup. First we define the contract interface that contains our operational methods (excluded below, but examples include Save(), Retrieve(), etc). The key things to note on the interface is the &#8216;CallbackContract&#8217; attribute, and the subscribe/unsubscribe methods. The subscription methods use a Patient Id key but this can be whatever is most suitable in your situation, for example an enum will work fine for more generalised event types.</p>
<pre class="brush: csharp;">
[ServiceContract(CallbackContract = typeof(IPatientEvents))]
public interface IMyContract
{
   [OperationContract]
   void Subscribe(int patientId);
   [OperationContract]
   void UnSubscribe(int patientId);
}
</pre>
<p>The next step is to define an events interface. This interface outlines expected methods the client must implement to be able to handle the events raised by the service. Note that the event handler has an attribute defining it as a <em>OneWay</em> call. This event is lab results for a patient have been entered into the system, and are of a critical nature.</p>
<pre class="brush: csharp;">
public interface IPatientEvents
{
   [OperationContract(IsOneWay = true)]
   void LabResultsUpdated(int id, string text);
}
</pre>
<p>Then you simply create your client side class against the events interface. In this example the client is a WPF page class. </p>
<pre class="brush: csharp;">
class PatientDetails : Page, IPatientEvents
{
     MyContractClient proxy;

	 //other methods
}
</pre>
<p>The client will need to supply a context to the service so it can maintain an association on the channel. This is simply achieved through a constructor call when initialising the proxy. Also at this point we&#8217;re subscribing to the events for the given ID. This subscription can be client triggered this way. Alternatively certain actions can have the server subscribe the client server side. An example would be during a data retrieval call for a patient; the server forcing the setup up the subscription.</p>
<pre class="brush: csharp;">
  InstanceContext context = new InstanceContext(this);

  proxy = new MyContractClient(context);

  proxy.Subscribe(id);
</pre>
<p>Now on the service we implement the same contract <em>IMyContract</em> we also define the signature of the <em>delegate Action</em> that will be raised as an event. Along with implementing the method that will attach the event handler to the appropriate client. The key thing to note here is the <em>Current.GetCallbackChannel</em> this is linking via the context the client supplied in the proxy initialisation.</p>
<pre class="brush: csharp;">
[ServiceBehavior(InstanceContextMode
      = InstanceContextMode.PerCall)]
class PatientService : IMyContract
{
    static Action&lt;int, string&gt; m_EventLabs = delegate { };

    public void Subscribe(int patientId)
    {
        IPatientEvents subscriber =
          OperationContext.Current.GetCallbackChannel&lt;IPatientEvents&gt;();

        m_EventLabs += subscriber.LabResultsUpdated;
    }
}
</pre>
<p>All that&#8217;s left now is to write the actual event firing code, that can be triggered after an appropriate event. In this example the firing takes place after the Patients Lab Results have been updated. Thereby allowing any other users currently viewing this patient’s details to be alerted. </p>
<pre class="brush: csharp;">
public static void FireEvent(LabResult labResult)
{
    m_EventLabs(labResult.PatientId, labResult.ToString());
}

public bool SaveLabResults(LabResult lr)
{
    //save code...

    PatientService.FireEvent(labResult);
}
</pre>
<p>Back on the client we have defined a method that will be executed upon the event. Remember the service has attached the handler on the Subscribe() method. </p>
<pre class="brush: csharp;">
public void LabResultsUpdated(int id, string text)
{
    this.displayAlerts.Text = text;
}
</pre>
<p>That is all that is required to have your client quickly and easily subscribe to and handle events. It&#8217;s thread-safe and efficient with the service doing all the hard work.</p>
<p>I will expand on [ServiceContract(CallbackContract ... ] and [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] in future posts, and I&#8217;ll try to remember to update this post with direct links.</p>
<p>Just for some reference sake here are the objects used above that were not defined in the code blocks:</p>
<pre class="brush: csharp;">
[DataContract]
public class Patient
{    [DataMember]
    public int PatientId { get; set; }
    //more members
}
[DataContract]
public class LabResult
{    [DataMember]
    public int LabResultId { get; set; }
    //more members
}
//displayAlerts is just a page &lt;TextBlock&gt; object
</pre>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[WebSphere MQ Java &amp; Pub/Sub]]></title>
<link>http://cumbers.wordpress.com/2009/03/19/websphere-mq-java-pubsub/</link>
<pubDate>Thu, 19 Mar 2009 17:00:31 +0000</pubDate>
<dc:creator>Rich Cumbers</dc:creator>
<guid>http://cumbers.wordpress.com/2009/03/19/websphere-mq-java-pubsub/</guid>
<description><![CDATA[Just a quick post about WebSphere MQ Java Pub/Sub functionality. I have need to write an application]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Just a quick post about WebSphere MQ Java Pub/Sub functionality. I have need to write an application that uses the Base Java Classes for WebSphere MQ, making use of some Pub/Sub. There is a fair amount of information on the web on how to subscribe but no information on how to unsubscribve. To subscribe to a topic all you need to do once you have a MQQueueManager object is the following:<br />
<code><br />
int options =  CMQC.MQSO_CREATE &#124; CMQC.MQSO_RESUME &#124; CMQC.MQSO_DURABLE &#124; CMQC.MQSO_FAIL_IF_QUIESCING;<br />
MQTopic topic = qmgr.accessTopic("topicName", "topicObject", options, null, "DurabeIdentifier");<br />
</code><br />
Now you have the MQTopic object you can get messages that are published to the topic &#8220;topicObject/topicName&#8221;. As I mentioned the reason for this post was the lack of any information on the web, including the <a href="http://www-01.ibm.com/support/docview.wss?rs=171&#38;context=SSFKSJ&#38;context=SSEP7X&#38;dc=DA410&#38;q1=Using+Java&#38;uid=pub1sc34693500&#38;loc=en_US&#38;cs=utf-8&#38;lang=en">WebSphere MQ Using Java V7 manual</a>, and the <a href="http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp">WebSphere MQ V7 infocenter</a> on how to unsubscribe from the topic. Well eventually I gave up on the web, and decided to look at the MQ Test material that we have here at Hursley. The following code will unsubscribe from the topic:<br />
<code><br />
if (topic != null) {<br />
  if (topic.isSubscribed()) {<br />
    topic.getSubscriptionReference().setCloseOptions(CMQC.MQCO_REMOVE_SUB);<br />
    topic.getSubscriptionReference().close();<br />
  }<br />
  <del datetime="2009-03-26T11:00:04+00:00">topic.setCloseOptions(CMQC.MQCO_DELETE);</del><br />
  topic.close();<br />
}</code><br />
That will check if your topic is not null, is subscribed and then set some options to ensure that the subscription is deleted. Job done and only an hour wasted searching the docs!</p>
<p><strong>Update:</strong>You do not need to use topic.setCloseOptions(CMQC.MQCO_DELETE);. This would actually throw an MQRC_OPTION_NOT_VALID_FOR_TYPE (mqrc 2045) error! </p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[About the use of queues and pubsub in Laconi.ca]]></title>
<link>http://web2dot5.wordpress.com/2009/03/15/laconica-queues/</link>
<pubDate>Sun, 15 Mar 2009 19:57:51 +0000</pubDate>
<dc:creator>Federico</dc:creator>
<guid>http://web2dot5.wordpress.com/2009/03/15/laconica-queues/</guid>
<description><![CDATA[Lately i have been working on the idea of queues and pubsub mechanisms and how it is possible to int]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Lately i have been working on the idea of queues and pubsub mechanisms and how it is possible to integrate them in a microblogging service. I am fascinated by messaging protocols and event pushing!</p>
<p>Let me say that XMPP is in my opinion the protocol of the future, however its pubsub implementation is quite complex if compared to what STOMP offers, and I didn&#8217;t find any mature PHP library.</p>
<p>AQMP and STOMP are more suitable for internal processing, while XMPP is the perfect option for exposing data to the outside world and perhaps to connect desktop clients with microblogging services.</p>
<p>Apart from my opinions, STOMP is a mature protocol with a PHP library that works pretty well and  Apache ActiveMQ, the message broker, offers access using several protocols.</p>
<p><strong>INTRODUCING A MESSAGE BROKER IN LACONI.CA</strong></p>
<p>If queues are enabled in laconi.ca, it is possible to modify common_enqueue_notice() (called after the storage of the dent) in order to push the dent in the 4 queues that the software uses (OMB, jabber, sms, public), or simply push the dent in one and configure 3 mirror queues.</p>
<p>In this way the internal queue system is not used. Queue_item::top() has potential race conditions and polls the db every 5 seconds. That means that if we&#8217;re lucky we get the message quickly, if unlucky in 5 seconds. Latency could even be something secondary, but the system now is pretty inefficient.</p>
<p>If laconi.ca passes the message to an external broker, delivery would be more efficient and it is a piece of code that the community wouldn&#8217;t have to maintain.</p>
<p>The downside of this is that another software is on the list of requirements. However, if you have the possibility to run queuehandlers in background, it probably means you own the server and you can afford to install a message broker. Queues can still be disabled and the system still works without queues and message brokers, the only difference is that everything is done synchronously.</p>
<p><strong>WITH A MESSAGE BROKER, PUBSUB COMES FOR FREE</strong></p>
<p>Another feature of ActiveMQ is the use of &#8220;topics&#8221;. The main differences between queues and topics are that in the queues messages are sent to only one consumer (precisely, round-robin among consumers) and messages are persistent (stored internally while waiting consumers to connect). Topics are the opposite, the same message is sent to all its consumers that are currently connected to the broker.</p>
<p>Topics could be used for introducing a publish-subscribe system in Laconi.ca. In common_enqueue_notice() with only some lines of code it is possible to push each dent to topics such as &#8220;/topic/laconica.user.IDUSER&#8221;, &#8220;/topic/laconica.allusers&#8221; or do more complex association like &#8220;/topic/laconica.group.IDGROUP&#8221; and &#8220;/topic/laconica.tag.TAGNAME&#8221;.</p>
<p>With a topic dedicated to a group and using the XMPP endpoint of ActiveMQ, you can also gain MUC support in Laconi.ca (only read-only if there isn&#8217;t an handler)</p>
<p>Offering pubsub using ActiveMQ and STOMP calls is very easy, however i am not sure how interoperable this solution could be. I did not find any XMPP/Pubsub interface for ActiveMQ, although topics could be easily mapped to XMPP/Pubsub nodes.</p>
<p>If the pubsub notifications have to be XMPP based, i see two solutions: write a wrapper that gets all the messages via an ActiveMQ queue and speaks XMPP with ejabberd, or forget about ActiveMQ and use XMPP requests directly, perhaps using an AtomPub interface.</p>
<p><strong>POSSIBLE FUTURE DIRECTIONS</strong></p>
<p>Integrating queues at the end of the stack is not going to help much in terms of performance or flexibility of the whole system, but it&#8217;s a first step and, as they&#8217;re used marginally, they&#8217;re still an optional requirement.</p>
<p>With all these ideas around, like offering XMPP MUC support, AtomPub interfaces, XMPP/Pubsub output, etc.. in the future the system would have to be &#8220;decoupled&#8221;.</p>
<p>An input system that pushes dents in a queue as quickly as possible. The main Laconi.ca logic that works in the background and asynchronously. The internal logic will then push the info to queue handlers for real-time delivery AND store the dents in the DB. The main website will still poll data from the DB, with all the necessary caching layers, OR/AND poll directly the message broker for the required type of dent (see the list of topics mentioned before) via AJAX calls (ActiveMQ has support for that).</p>
<p>Any feedback is appreciated, or suggestions on things i might have overlooked! I am not an expert of message queue system so many of the things i have said may seem obvious, but not to someone who has a background of normal website and MVC development so i clearly stated all the steps&#8230;</p>
<p><strong>WHAT I DID</strong></p>
<p><code><br />
function common_enqueue_notice($notice)<br />
{<br />
if (common_config('queue','subsystem') == 'stomp') {<br />
// use an external message queue system via STOMP<br />
require_once("Stomp.php");<br />
$con = new Stomp(common_config('queue','stomp_server'));<br />
if (!$con-&#62;connect()) {<br />
common_log(LOG_ERR, 'Failed to connect to queue server');<br />
return false;<br />
}<br />
$queue_basename = common_config('queue','queue_basename');<br />
foreach (array('jabber', 'omb', 'sms', 'public') as $transport) {<br />
if (!$con-&#62;send(<br />
'/queue/'.$queue_basename.'-'.$transport, // QUEUE<br />
$notice-&#62;id,            // BODY of the message<br />
array (                 // HEADERS of the msg<br />
'created' =&#62; $notice-&#62;created<br />
))) {<br />
common_log(LOG_ERR, 'Error sending to '.$transport.' queue');<br />
return false;<br />
}<br />
common_log(LOG_DEBUG, 'complete remote queueing notice ID = ' . $notice-&#62;id . ' for ' . $transport);<br />
}<br />
$con-&#62;send('/topic/laconica.'.$notice-&#62;profile_id,<br />
$notice-&#62;content,<br />
array(<br />
'profile_id' =&#62; $notice-&#62;profile_id,<br />
'created' =&#62; $notice-&#62;created<br />
)<br />
);<br />
$con-&#62;send('/topic/laconica.allusers',<br />
$notice-&#62;content,<br />
array(<br />
'profile_id' =&#62; $notice-&#62;profile_id,<br />
'created' =&#62; $notice-&#62;created<br />
)<br />
);<br />
$result = true;<br />
}<br />
else {<br />
// in any other case, 'internal'<br />
foreach (array('jabber', 'omb', 'sms', 'public') as $transport) {<br />
$qi = new Queue_item();<br />
#OTHER OLD CODE...<br />
</code></p>
<p>This code sends the dent to 4 queues and 2 topics. Queues are used by the 4 background queuehandlers while 2 topics offer a simple pubsub service to either a single userid or to all of them (public timeline).</p>
<p>As regards queues, queuehandler.php has to be modified:<br />
<code><br />
# called by run()<br />
function stomp_dispatch() {<br />
require("Stomp.php");<br />
$con = new Stomp(common_config('queue','stomp_server'));<br />
if (!$con-&#62;connect()) {<br />
$this-&#62;log(LOG_ERR, 'Failed to connect to queue server');<br />
return false;<br />
}<br />
$queue_basename = common_config('queue','queue_basename');<br />
// subscribe to the relevant queue (format: basename-transport)<br />
$con-&#62;subscribe('/queue/'.$queue_basename.'-'.$this-&#62;transport());<br />
do {<br />
$frame = $con-&#62;readFrame();<br />
if ($frame) {<br />
$this-&#62;log(LOG_INFO, 'Got item enqueued '.common_exact_date($frame-&#62;headers['created']));<br />
// XXX: Now the queue handler receives only the ID of the<br />
// notice, and it has to get it from the DB<br />
// A massive improvement would be avoid DB query by transmitting<br />
// all the notice details via queue server...<br />
$notice = Notice::staticGet($frame-&#62;body);<br />
if ($notice) {<br />
$this-&#62;log(LOG_INFO, 'broadcasting notice ID = ' . $notice-&#62;id);<br />
$result = $this-&#62;handle_notice($notice);<br />
if ($result) {<br />
// if the msg has been handled positively, ack it<br />
// and the queue server will remove it from the queue<br />
$con-&#62;ack($frame);<br />
$this-&#62;log(LOG_INFO, 'finished broadcasting notice ID = ' . $notice-&#62;id);<br />
}<br />
else {<br />
// no ack<br />
$this-&#62;log(LOG_WARNING, 'Failed broadcast for notice ID = ' . $notice-&#62;id);<br />
}<br />
$notice-&#62;free();<br />
unset($notice);<br />
$notice = null;<br />
} else {<br />
$this-&#62;log(LOG_WARNING, 'queue item for notice that does not exist');<br />
}<br />
}<br />
} while (true);<br />
$con-&#62;disconnect();<br />
}<br />
</code></p>
<p>Here there&#8217;s the code for a simple pubsub consumer<br />
<code><br />
require_once "Stomp.php";<br />
$con = new Stomp('tcp://localhost:61613');<br />
if (!$con-&#62;connect())<br />
print 'conn failed';<br />
$what = '/topic/laconica.2';<br />
if (!$con-&#62;subscribe($what))<br />
print "sub failed";<br />
else<br />
print "sub to ".$what." successful\n";<br />
while (true) {<br />
$msg = $con-&#62;readFrame();<br />
if ($msg) {<br />
print $msg-&#62;headers['profile_id'].": ".$msg-&#62;body. " -- ";<br />
print "msg_time:".$msg-&#62;headers['created']." ";<br />
print "received:".date("Y-m-d H:i:s")."\n";<br />
$con-&#62;ack($msg);<br />
}<br />
}<br />
$con-&#62;disconnect();<br />
</code></p>
<p>Except the last bit, all this code is on the fmarani-clone of the dev repo on gitorious, branch 0.8.x</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[SMS und RSS]]></title>
<link>http://drazraeltod.wordpress.com/2009/03/11/sms-und-rss/</link>
<pubDate>Wed, 11 Mar 2009 12:41:37 +0000</pubDate>
<dc:creator>Dr. Azrael Tod</dc:creator>
<guid>http://drazraeltod.wordpress.com/2009/03/11/sms-und-rss/</guid>
<description><![CDATA[Mir ist gerade aufgefallen dass SMS und RSS so ziemlich vergleichbare Technologien sind. Beides ist ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Mir ist gerade aufgefallen dass SMS und RSS so ziemlich vergleichbare Technologien sind. Beides ist jeweils eigentlich eine ziemlich beschissene Lösung die sich ziemlich weit verbreitet hat, beides könnte man viel eleganter lösen.. wenn irgendjemand Interesse daran hätte und dennoch sind beides Dinge die ich relativ oft verwende (bei SMS eher weniger, zumindest wenn man &#8220;oft&#8221; als die Menge festlegt die andere dafür halten). Das natürlich obwohl ich das System für so schlecht wie irgendwie möglich halte.<!--more--></p>
<p>Bei SMS (oder auch Short Message Service, wehe ich höre noch einmal den Kommentar dass mir jemand eine &#8220;SMS-Nachricht&#8221; aufs &#8220;Handy&#8221; schicken will!) handelt es sich eigentlich um die Idee dass man mit nicht-benötigten Sendeblöcken im Netz doch eigentlich auch irgendwelche Daten übertragen könne. Gesagt, getan und schwups haben wir ein Nachrichtensystem das den Provider nichts kostet und Jährlich riesige <a href="http://home.g33ky.de/fact/308.html" target="_blank">Gewinne</a> <a href="http://home.g33ky.de/fact/265.html" target="_blank">abwirft</a>.</p>
<p>Das beste an diesem System kommt aber noch: 160 Zeichen (Die Menge die sich aus der Blockgröße ergibt) sind gerade so groß, dass permanent Leute diese Grenze überschreiten. Was tut man also? Man hängt mehrere Blöcke hintereinander und bereichnet jeden einzeln. Ein Antwortsystem baut man sich auf die selbe Art, wer auch nur wieder ein Ja/Nein zurückgeben will zahlt gleich noch eine Nachricht. Alternativ kann man natürlich auch Nachrichten an mehrere Leute senden&#8230; also mehrmals die Gleiche absenden und für jeden Empfänger erneut bezahlen.<br />
Völlig unbeachtet davon: eine solche Nachricht kostet meistens fast den gleichen Betrag wie eine Minute gespräch via Telefon. Ich möchte jetzt doch schon gerne mal sehen wer es nicht schafft in 60sec den Informationsgehalt von 160 Zeichen  per Stimme zu übertragen.</p>
<p>Dazu kommt dann natürlich noch das Eingabeproblem, wodurch man erstmal wieder alle möglichen neuen Ideen für Telefontastaturen oder neue Software verkaufen kann. Natürlich keine brauchbaren, dann könnten die Nutzer ja bei einem System bleiben und bräuchten kein Geld mehr auszugeben.</p>
<p><a href="http://de.wikipedia.org/wiki/RSS" target="_blank">RSS</a> hingegen (kurzform für Really Stupid Syndication) ist ein gaaaanz ganz tolles Polling-Format auf XML-Basis (und wie wir ja alle wissen ist XML schon rein grundsätzlich toll). Polling an sich sagt einfach schon genug aus und <a href="/2008/08/28/newsfeeds-defective-by-design/">ich werde bestimmt jetzt nicht anfangen wieder alle Nachteile dieses Systemes aufzuführen</a>. Die Twitter-Generation scheint eh nie zu verstehen dass es eben NICHT &#8220;echtzeit&#8221; bedeutet wenn ich alle 5min nachsehe ob es etwas neues gibt.</p>
<p>Trotz aller Fehler und Idiotien die bereits die Grundideen hinter diesen Systemen beinhalten, nutze ich diesen Mist, genau wie all die anderen Deppen. Warum?<br />
Der Grund ist einfach.. alle anderen tun es auch!!!!!!111111einseinself</p>
<p>Das nervt mich echt.. ich kann meine Termin-Erinnerungen via SMS aufs Handy bekommen, viele Leute in meiner Umgebung senden mir Kurznachrichten um mich schnell was zu fragen, meine Daten zwischen diesen vielen &#8220;tollen&#8221; Web2.0-Diensten tausche ich via RSS/Atom aus und selbst unser <a href="http://code.google.com/p/pychao" target="_blank">Python-IRC-Bot</a> <a href="http://home.g33ky.de/lastfacts.xml" target="_blank">schreibt</a> und liest diese Feeds (fast schon mehr als er andere Dinge tut).</p>
<p>Es ist irgendwie auch keine Besserung in Aussicht&#8230; es gibt ja bereits anerkannte Lösungen die alle Verwenden, warum sollte man dann schwach Verbreitete Sachen wie z.B. <a href="http://xmpp.org/extensions/xep-0060.html" target="_blank">Jabber-Pubsub</a> verwenden und quasi das Rad neu erfinden?</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Great XMPP Dispute and pubsubhubbub]]></title>
<link>http://blog.webhooks.org/2009/02/22/the-great-xmpp-dispute-and-pubsubhubbub/</link>
<pubDate>Sun, 22 Feb 2009 12:16:35 +0000</pubDate>
<dc:creator>Jeff Lindsay</dc:creator>
<guid>http://blog.webhooks.org/2009/02/22/the-great-xmpp-dispute-and-pubsubhubbub/</guid>
<description><![CDATA[Okay, it&#8217;s not really a dispute. That was sarcasm in the title. Just to be clear, since there]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Okay, it&#8217;s not really a dispute. That was sarcasm in the title. Just to be clear, since there&#8217;s always been a tiny bit of <em>useful</em> friction between the idea of XMPP and web hooks, it&#8217;s important to remember they are not mutually exclusive. Anybody hyping a battle between the two is trying to create or is imagining a controversy that isn&#8217;t real. Many proponents of web hooks are XMPP proponents as well. In fact, <a href="http://www.veodia.com/player.php?vid=fCNU1qQ1oSs">the video some are pushing around</a> to promote this supposed throw down is of two XMPP <em>supporters</em> (including <a href="http://www.danga.com/djabberd/">djabberd</a> author Brad Fitzpatrick) demoing a pubsub system based on web hook callbacks. And it takes place at <a href="http://technology.meetup.com/11/calendar/9322074/">an XMPP meetup</a>, so of course there was going to be some proselytizing.</p>
<p>Nevertheless, Jabber/XMPP is a <em>messaging protocol</em>. Web hooks provide a model for <em>functional extensibility</em>, so they are a platform for many different things. A push-based pubsub messaging system is just one use. Even though <a href="http://blogrium.com/2006/08/27/web-hooks/">I originally wrote about web hooks as a notification mechanism</a>, my mind was nowhere near pubsub. I was more focused on the idea of web service integration and orchestration. With the commoditization of CGI-enabled web hosting, I was thinking about how the popularity of web programming combined with the easy invocation of HTTP requests could be used to make a more useful and functionally extensible web. A more programmable web.</p>
<p>With that said, there is nothing wrong with discussing what you can and can&#8217;t do with web hooks and XMPP, but there is not some angry fight between camps. Done. Over. Moving on.</p>
<p>As it turns out, the project demoed in that video, which is called <a href="http://code.google.com/p/pubsubhubbub/">pubsubhubbub</a>, is something I had previously stumbled upon while browsing projects a friend of mine was involved in. There wasn&#8217;t much of a description, and I didn&#8217;t dive too deep into the code, so I bookmarked it to come back to it. After that demo happened, it seemed I misheard (from several people) that it was some XMPP pubsub system, which totally confused me because&#8230; it&#8217;s not. It&#8217;s a neat, distributed pubsub implementation built on web hook callbacks created by <a href="http://bradfitz.com/">Brad Fitzpatrick</a> and <a href="http://www.crunchbase.com/person/brett-slatkin">Brett Slatkin</a> (a Google App Engine developer). Hopefully they&#8217;ll put some more documentation up as it develops, but it&#8217;s just really neat to see some XMPP folks build an open pubsub system with web hooks. Cheers to them!</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[XMPP PubSub with ejabberd and XMPP4R]]></title>
<link>http://keoko.wordpress.com/2008/12/17/xmpp-pubsub-with-ejabberd-and-xmpp4r/</link>
<pubDate>Wed, 17 Dec 2008 14:12:04 +0000</pubDate>
<dc:creator>keoko</dc:creator>
<guid>http://keoko.wordpress.com/2008/12/17/xmpp-pubsub-with-ejabberd-and-xmpp4r/</guid>
<description><![CDATA[After reading &#8220;Beyond REST? Building Data Services with XMPP PubSub&#8221; and other articles ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>After reading <a href="http://en.oreilly.com/oscon2008/public/schedule/detail/4359">&#8220;Beyond REST? Building Data Services with XMPP PubSub&#8221;</a> and other articles about PubSub with XMPP, I decided it would be worth to test it. However, I didn&#8217;t find any complete step by step guide in how to test it with ejabberd as XMPP server and XMPP4R as XMPP client.</p>
<p>Below are the steps I followed to test a subscriber (user &#8220;sub&#8221;) waiting for items published to the node (&#8221;home/localhost/pub/updates&#8221;) for the publisher (user &#8220;pub&#8221;). Note you can add as many subscribers/publishers as you want.</p>
<ol>
<li>install ejabberd (XMPP server). I followed instructions of this <a href="http://ecedeno.com.ve/blog/index.php/2008/08/07/servidor-jabber-con-ejabberd-en-ubuntu-hardy-804/">article</a> (spanish) or <a href="http://sysmonblog.co.uk/?p=11">article</a> (english) without any surprise.</li>
<li>create two ejabberd users: &#8220;pub&#8221; (the publisher) and &#8220;sub&#8221; (the subscriber).
<p><code>sudo ejabberdctl register pub localhost pub<br />
sudo ejabberdctl register sub localhost sub </code></li>
<li>install XMPP4R Ruby gem.<br />
<code>sudo gem install xmpp4r</code></li>
<li>create file nodecreator.rb. See code below.
<pre class="ruby">

#! /usr/bin/ruby
require &#34;rubygems&#34;
require &#34;xmpp4r&#34;

require &#34;xmpp4r/pubsub&#34;
require &#34;xmpp4r/pubsub/helper/servicehelper.rb&#34;
require &#34;xmpp4r/pubsub/helper/nodebrowser.rb&#34;
require &#34;xmpp4r/pubsub/helper/nodehelper.rb&#34;

include Jabber
Jabber::debug = true

service = &#39;pubsub.localhost&#39;
jid = &#39;pub@localhost/laptop&#39;

password = &#39;pub&#39;
client = Client.new(JID.new(jid))
client.connect
client.auth(password)

client.send(Jabber::Presence.new.set_type(:available))
pubsub = PubSub::ServiceHelper.new(client, service)
pubsub.create_node(&#39;home/localhost/pub/&#39;)
pubsub.create_node(&#39;home/localhost/pub/updates&#39;)
</pre>
</li>
<li>create file publisher.rb. See code below.</li>
<pre class="ruby">

#! /usr/bin/ruby
require &#34;rubygems&#34;

require &#34;xmpp4r&#34;
require &#34;xmpp4r/pubsub&#34;
require &#34;xmpp4r/pubsub/helper/servicehelper.rb&#34;
require &#34;xmpp4r/pubsub/helper/nodebrowser.rb&#34;
require &#34;xmpp4r/pubsub/helper/nodehelper.rb&#34;
include Jabber
Jabber::debug = true
jid = &#39;pub@localhost/laptop&#39;

password = &#39;pub&#39;
service = &#39;pubsub.localhost&#39;
node = &#39;home/localhost/pub/updates&#39;
# connect XMPP client
client = Client.new(JID.new(jid))
# remove &#34;127.0.0.1&#34; if you are not using a local ejabberd
client.connect(&#34;127.0.0.1&#34;)
client.auth(password)
client.send(Jabber::Presence.new.set_type(:available))
# create item
pubsub = PubSub::ServiceHelper.new(client, service)
item = Jabber::PubSub::Item.new
xml = REXML::Element.new(&#34;greeting&#34;)
xml.text = &#39;hello world!&#39;

item.add(xml);
# publish item
pubsub.publish_item_to(node, item)
</pre>
<li>create file subscriber.rb. See code below.
<pre class="ruby">

#! /usr/bin/ruby
require &#34;rubygems&#34;
require &#34;xmpp4r&#34;
require &#34;xmpp4r/pubsub&#34;
require &#34;xmpp4r/pubsub/helper/servicehelper.rb&#34;

require &#34;xmpp4r/pubsub/helper/nodebrowser.rb&#34;
require &#34;xmpp4r/pubsub/helper/nodehelper.rb&#34;include Jabber
#Jabber::debug = true
jid = &#39;sub@localhost/laptop&#39;
password = &#39;sub&#39;
node = &#39;home/localhost/pub/updates&#39;
service = &#39;pubsub.localhost&#39;

# connect XMPP client
client = Client.new(JID.new(jid))
# remove &#34;127.0.0.1&#34; if you are not using a local ejabberd
client.connect(&#34;127.0.0.1&#34;)
client.auth(password)
client.send(Jabber::Presence.new.set_type(:available))
sleep(1)
# subscribe to the node
pubsub = PubSub::ServiceHelper.new(client, service)
pubsub.subscribe_to(node)
subscriptions = pubsub.get_subscriptions_from_all_nodes()
puts &#34;subscriptions: #{subscriptions}\n\n&#34;
puts &#34;events:\n&#34;

# set callback for new events

pubsub.add_event_callback do &#124;event&#124;
begin
event.payload.each do &#124;e&#124;
puts e,&#34;----\n&#34;
end
rescue
puts &#34;Error : #{$!} \n #{event}&#34;

end
# infinite loop
loop do
sleep 1
end
</pre>
</li>
<li>run nodecreator.rb. It creates the XMPP node &#8220;home/localhost/pub/updates&#8221;. It creates first the node &#8220;home/localhost/pub&#8221; and then the &#8220;home/localhost/pub/updates&#8221;. Seems quite obvious but I spent some hours after I got it.</li>
<li>check the nodes have been created. I used the discovery service functionality of Psi client.<img src="http://keoko.wordpress.com/files/2008/12/psi_service_discovery.png?w=300" alt="psi_service_discovery" title="psi_service_discovery" width="300" height="288" class="alignnone size-medium wp-image-67" /></li>
<li>run subscriber.rb file. The &#8220;sub&#8221; user subscribes to the node &#8216;updates&#8217; and waits for items in the &#8220;updates&#8221; node. Be aware you should close any XMPP connection with users &#8220;pub&#8221; and &#8220;sub&#8221; in case you are using any XMPP client such as Pidgin, Psi,&#8230; otherwise it won&#8217;t work.
<li>run publisher.rb file. It will send a message &#8220;&#60;greetings&#62;hello world!&#8221;&#60;/greetings&#62; to the subscriber. Run it as many times as you want.</li>
<li>If everything goes well yo will see in the subscriber screen a message like this.
<pre class="xml">

subscriptions: &#60;subscription node=&#39;home/localhost/pub/updates&#39; jid=&#39;sub@localhost&#39; subscription=&#39;subscribed&#39; xmlns=&#39;http://jabber.org/protocol/pubsub&#39;/&#62;

events:
&#60;items node=&#39;home/localhost/pub/updates&#39;&#62;&#60;item id=&#39;3376&#39;&#62;&#60;greeting&#62;hello world!&#60;/greeting&#62;&#60;/item&#62;&#60;/items&#62;
----
</pre>
</li>
</ol>
<p>Good Luck!</p>
<p>For this test, I used the following versions:</p>
<ul>
<li>Operating System: Ubuntu 8.04</li>
<li>Ruby:  1.8.6</li>
<li>XMPP4R: 0.4</li>
<li>ejabberd: 1.1.4</li>
</ul>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Mass Transit - Part 1 of N - Tim Barcz]]></title>
<link>http://noocyte.wordpress.com/2008/10/14/mass-transit-part-1-of-n-tim-barcz/</link>
<pubDate>Tue, 14 Oct 2008 08:57:44 +0000</pubDate>
<dc:creator>noocyte</dc:creator>
<guid>http://noocyte.wordpress.com/2008/10/14/mass-transit-part-1-of-n-tim-barcz/</guid>
<description><![CDATA[This looks interesting! I’ll have to follow the next n parts of this! This system started small but ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>This looks interesting! I’ll have to follow the next n parts of this! </p>
<blockquote><p>This system started small but gradually had increased demands in the form of new features clients wanted added. Pretty soon, when you clicked the save button multiple things were happening; a database row would be updated, an email would be sent, a new file would be written, another status file would be updated. These were all executed when the user clicked the button, therefore every action was a blocking action, the server couldn&#8217;t move on until it was done servicing that particular request.</p>
</blockquote>
<p><font color="#777777">The quote above is from the blog post and sort of sums up my experience with a CMS-like application (Synergi), where we once did a Save, Send Mail, Commit we ended up with something like this after a few years; Save, Mail, Mail, Mail, Update Table X, Update Table Y, Mail, Commit. So a solution, like the one proposed in the blog post, could work very well for Synergi. Interesting.</font></p>
<p><a href="http://devlicio.us/blogs/tim_barcz/archive/2008/10/13/mass-transit-part-1-of-n.aspx">Mass Transit &#8211; Part 1 of N &#8211; Tim Barcz</a></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Approfondimenti sul modello publish-subscribe]]></title>
<link>http://mondokubu.wordpress.com/2008/09/03/approfondimenti-sul-modello-publish-subscribe/</link>
<pubDate>Wed, 03 Sep 2008 12:46:36 +0000</pubDate>
<dc:creator>Francesco Allassia</dc:creator>
<guid>http://mondokubu.wordpress.com/2008/09/03/approfondimenti-sul-modello-publish-subscribe/</guid>
<description><![CDATA[Nel modello publish/subscribe, il produttore delle informazioni è chiamato editore mentre il consuma]]></description>
<content:encoded><![CDATA[Nel modello publish/subscribe, il produttore delle informazioni è chiamato editore mentre il consuma]]></content:encoded>
</item>
<item>
<title><![CDATA[Newsfeeds - Defective by Design?]]></title>
<link>http://drazraeltod.wordpress.com/2008/08/28/newsfeeds-defective-by-design/</link>
<pubDate>Thu, 28 Aug 2008 09:55:36 +0000</pubDate>
<dc:creator>Dr. Azrael Tod</dc:creator>
<guid>http://drazraeltod.wordpress.com/2008/08/28/newsfeeds-defective-by-design/</guid>
<description><![CDATA[Ein sehr großer Anteil meiner Freizeit geht mit dem Lesen von Newsfeeds drauf. Das kann ich mal als ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Ein sehr großer Anteil meiner Freizeit geht mit dem Lesen von <a href="http://de.wikipedia.org/wiki/Newsfeed" target="_blank">Newsfeeds</a> drauf. Das kann ich mal als einfache Tatsache so stehen lassen. Ich sammle die Feed-Adressen von interessanten Blogs wie andere Briefmarken, sortiere aus was keine interessanten Daten/Artikel/Links mehr liefert, versehe die gelesenen Artikel mit Tags, gebe bestimmte Tags wieder als Newsfeed aus und antworte von Zeit zu Zeit auf Posts. Ich kann wohl kaum noch bestreiten dass in meinem Fall schon ein gewisses Suchtverhalten diesbezüglich vorliegt.</p>
<p>Bei all der Zeit, die ich mit diesen Techniken verbringe, bin ich natürlich immer auf der Suche nach Möglichkeiten wie sich das Ganze bequemer lösen lässt.<!--more--> Im Moment laufen fast alle meine Aktionen über <a href="http://www.google.com/reader/view" target="_blank">Googles &#8220;Reader&#8221;</a>, was ein ziemlich guter Webbasierender Feedreader ist. Die Uptime-Statistiken sind natürlich wie bei allen anderen Google-Produkten für ein kostenloses Tool einfach traumhaft, auch treten eigentlich nie irgendwelche Performanceprobleme auf der Google-Seite auf und Funktionen hat das Ding eigentlich auch fast alles was ich mir wünschen kann.</p>
<p>Ab ein paar hundert Newsfeeds jedoch wird Reader immer umständlicher zu verwenden.<br />
Die Seitenleiste mit der Feedübersicht lässt sich auf kleinen Bildschirmen schon lange nicht mehr sinnvoll benutzen und das verwalten der Feeds ist so ziemlich unbrauchbar. (Doppelt eingetragene URLs werden nicht automatisch entdeckt, die Feeds Tags zuzuordnen lässt sich nur sehr umständlich bewerkstelligen und Tags die einem ganzem Feed zugeordnet sind, kann man scheinbar überhaupt nicht von einem einzelnem Item entfernen.)</p>
<p>Auch zeigt sich bei privaten Newsfeeds sehr schnell, dass ein polling der Quelle alle 3 Stunden (wenn man der einzige Leser ist) ziemlich fern von jeder Aktualität ist. Auch 1 Stunde bei allen anderen Feeds ist nicht unbedingt die tollste Sache seit geschnitten Brot.</p>
<p>Lokale Software (Testergebnisse zu <a href="http://de.wikipedia.org/wiki/Feedreader" target="_blank">einzelnen Clients</a> werden evtl. bald als Extraartikel folgen) hat es aber dennoch schwer mit derartigen Angeboten mitzuhalten. Natürlich würde ich am liebsten einen kleinen, schlanken Konsolen-Client verwenden und den RAM-fressenden Browser ganz deaktivieren. Leider bieten die wenigsten Newsfeeds den kompletten Inhalt gleich per Download an, also hat man dann den Konsolenclient UND den Browser offen. (Von eingebetteten Flash-Videos oder auch nur Bildern will ich lieber garnicht erst anfangen.)</p>
<p>Ein weiteres Problem mit lokaler Software zeigt sich ebenfalls erst wenn man ein paar Newsfeeds mehr als &#8220;normal&#8221; liest. Es macht verdammt wenig Spaß 1x die Stunde &#62;300 XML-Dateien zu pollen. Dieser Effekt lässt sich verringern indem man die Dateien verteilt nacheinander abruft, mit einem Volumentarif würde ich mir das aber dennoch mehrmals überlegen. Außerdem sind wir bei 1 Abruf pro Stunde gerade erst bei der Aktualität von Google Reader angekommen, vielen wird aber etwas wie &#8220;alle 10min&#8221; viel eher logisch erscheinen.</p>
<p>Hier sehen wir dann auch bereits das was mich an <a href="http://de.wikipedia.org/wiki/RSS" target="_blank">RSS</a> bzw. <a href="http://de.wikipedia.org/wiki/Atom_(XML-Format)" target="_blank">Atom</a> am meisten stört.<br />
Egal ob sich überhaupt etwas geändert hat und egal ob wir die letzten 10-50 Posts eh schon auf der Festplatte zwischengespeichert haben, wir laden jedes Mal alles in einer kompletten Datei aufs Neue herunter. Wenn der Newsfeed (wie eigentlich auch wünschenswert) dann auch noch den kompletten Postinhalt enthällt kommen da schnell ein paar hunder KB zusammen.</p>
<p>Besser wäre es z.B. schon eine Indexdatei zu basteln, die dann auf XML-Dateien mit den jeweiligen Inhalten für jeden Post verlinkt. Erstens könnte man so auf viel Overhead seitens der XML-Struktur in der Hauptdatei verzichten (evtl. könnte man sogar auf XML ganz verzichten, ein imho lohnendes Ziel). Zweitens würde es dies auch ermöglichen Änderungen der Quelle und ähnliches zu Indizieren.<br />
Eine CSV-ähnliche Zeile mit &#60;timestamp&#62;,edit&#124;new&#124;deleted&#124;blahfasel,&#60;post-id&#62;,&#60;post-URL&#62; würde pro Eintrag bereits reichen.</p>
<p>Aber warum an einer defekt designten Lösung herumfrickeln wenn es bereits bessere Ideen gibt? Die Einfachste Möglichkeit wäre wohl die Updates eher per per Push-Dienst auf den lokalen PC zu bekommen statt permanent nachsehen zu müssen ob neue Updates vorhanden sind. Eine weitere Möglichkeit sieht man bei diversen Web-Readern, es wird nur noch eine einzige Indexdatei für jeden Nutzer abgerufen, meist per AJAX, die schon sortiert die für den jeweiligen Nutzer interessanten Items enthällt.</p>
<p>Natürlich wäre ersteres eleganter, letzteres jedoch lässt sich offensichtlich einfacher realisieren ohne neben http noch andere Protokolle ins Spiel zu bringen (ansonsten gäbe es wohl auch endlos viele Lösungen, von denen jede besser ist als die aktuelle auf http-Basis).<br />
Allerdings gibt es auch für die erste Version bereits Protokolle über die es sich recht einfach lösen lassen würde.</p>
<p>Meine aktuelle Lieblingsvariante ist wohl der <a href="http://de.wikipedia.org/wiki/Alert-Dienst" target="_blank">Publish/Subscribe</a>-Mechanismus welcher im <a href="http://de.wikipedia.org/wiki/Jabber" target="_blank">Jabber</a>-Protokoll integriert wurde. Dabei handelt es sich um eine Möglichkeit, auf einem beliebigen <a href="http://www.xmpp.org/extensions/xep-0060.html" target="_blank">Pubsub</a>-Server (ist in z.B. <a href="http://de.wikipedia.org/wiki/Ejabberd" target="_blank">ejabberd</a> bereits integriert, ein Beispiel wäre z.B. pubsub.jabber.ccc.de) in einer Struktur seine Updates an eine <a href="http://www.xmpp.org/extensions/xep-0060.html#nodetypes" target="_blank">Node</a> zu senden, von dort aus verteilt der Server dann automatisch die Informationen an alle Clients die sich eingetragen haben weiter.</p>
<p>Leider krankt Pubsub derzeit noch stark daran dass es keine wirklich ausgereifte Implementierung auf Clientseite gibt. <a href="http://www.gajim.org" target="_blank">Gajim</a> unterstützt das XEP zwar scheinbar zu gewissen Werten (andere Clients scheinen afaik da noch überhaupt keine Anstrengungen zu unternehmen), es gibt aber immer wieder Probleme wenn man versucht es wirklich zu nutzen. In meinen Tests war es mir noch nicht möglich überhaupt eine Meldung von irgendeiner Pubsub-Node zu bekommen.</p>
<p>Auf der Serverseite sieht es theoretisch besser aus, z.B. besteht schon seit längerem ein <a href="http://wordpress.org/extend/plugins/jabber-feed" target="_blank">Plugin für WordPress</a>, dass es recht einfach ermöglichen würde neue Posts oder Kommentare auch per Pubsub auszuliefern. Allerdings hängt dies auch wieder an den Clients etwas, die Serverseitigen Scripte kann man ja atm nur über die XML-Konsole testen, die einige Clients bieten. Hier sollte natürlich die Grundregel gelten dass man NIEMALS einen Menschen dazu zwingen sollte <a href="http://de.wikipedia.org/wiki/Extensible_Markup_Language" target="_blank">XML-Code</a> zu tippen, in diesem Fall sogar Live mit einem Server zu reden. XML als &#8220;menschenlesbares&#8221; Datenformat ist wohl einer der Witze, die sich ein denkender Mensch nichtmal absichtlich hätte ausdenken können.</p>
<p>Alle aktuell verwendbaren Lösungen haben ohnehin offensichtlich das XML-Format gemeinsam. Für ein System das immer mehr und mehr Bandbreite schluckt, dessen Bereitstellung und Verarbeitung meiner Meinung nach in Zukunft immer wichtiger wird und dessen Inhalt meist nicht über &#60;timestamp&#62;&#60;autor&#62;&#60;link&#62;&#60;Datenpaket&#62; hinausgeht sollte man sich evtl. doch besser etwas anderes einfallen lassen. Aber das ist mal wieder nur meine Meinung.</p>
<p>Randbemerkung: Während ich diesen Artikel geschrieben hab (dieser stellt mit 4 Tagen als Entwurf einen neuen, privaten Rekord dar) wurde das Thema bei einigen anderen Stellen angeschnitten, vor allem beziehe ich mich damit auf mehrere Diskussionen im IRC (kann ich euch leider nicht zum Nachlesen verlinken) als auch auf einen <a href="http://www.nerdcore.de/wp/2008/08/28/wieviele-feeds-lest-ihr/" target="_blank">Beitrag von René</a>, zu dem es teilweise sehr interessante Kommentare gab.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA['Blogging']]></title>
<link>http://markdowe.wordpress.com/2007/12/22/blogging/</link>
<pubDate>Sat, 22 Dec 2007 12:02:00 +0000</pubDate>
<dc:creator>markdowe</dc:creator>
<guid>http://markdowe.wordpress.com/2007/12/22/blogging/</guid>
<description><![CDATA[PREFACE AN ARTICLE appeared in the Guardian Newspaper, dated 21 December 2007, written by James Ball]]></description>
<content:encoded><![CDATA[PREFACE AN ARTICLE appeared in the Guardian Newspaper, dated 21 December 2007, written by James Ball]]></content:encoded>
</item>
<item>
<title><![CDATA[a pythonic walk on jabber's pubsub ]]></title>
<link>http://ppolv.wordpress.com/2007/12/01/a-pythonic-walk-on-jabbers-pubsub/</link>
<pubDate>Sat, 01 Dec 2007 09:10:44 +0000</pubDate>
<dc:creator>ppolv</dc:creator>
<guid>http://ppolv.wordpress.com/2007/12/01/a-pythonic-walk-on-jabbers-pubsub/</guid>
<description><![CDATA[In the previous post, i wrote about the tool i&#8217;m using to work with XMPP PubSub. Now instead o]]></description>
<content:encoded><![CDATA[In the previous post, i wrote about the tool i&#8217;m using to work with XMPP PubSub. Now instead o]]></content:encoded>
</item>
<item>
<title><![CDATA[Managing a Jabber PubSub service]]></title>
<link>http://ppolv.wordpress.com/2007/11/28/managing-a-jabber-pubsub-service/</link>
<pubDate>Wed, 28 Nov 2007 04:03:11 +0000</pubDate>
<dc:creator>ppolv</dc:creator>
<guid>http://ppolv.wordpress.com/2007/11/28/managing-a-jabber-pubsub-service/</guid>
<description><![CDATA[Probably you already know many excellent choices for a Jabber(XMPP) client. However most of these cl]]></description>
<content:encoded><![CDATA[Probably you already know many excellent choices for a Jabber(XMPP) client. However most of these cl]]></content:encoded>
</item>
<item>
<title><![CDATA[The New PubSub]]></title>
<link>http://sipthat.wordpress.com/2007/08/21/the-new-pubsub/</link>
<pubDate>Tue, 21 Aug 2007 15:07:08 +0000</pubDate>
<dc:creator>elagerway</dc:creator>
<guid>http://sipthat.wordpress.com/2007/08/21/the-new-pubsub/</guid>
<description><![CDATA[Fellow Vancouver Voip veteran and buddy Ian Bell has reclaimed PubSub and will soon be launching a n]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Fellow Vancouver Voip veteran and buddy <a href="http://blog.somethingsimpler.com/">Ian Bell</a> has reclaimed <a href="http://PubSub.com">PubSub</a> and will soon be launching a new FaceBook app. Ian is a very capable fellow and he is in good company with Lance Tracey joining as CEO.</p>
<p>I think Ian is doing the right thing in going after the Facebook crowd, the intelligent search capabilities of PubSub will be put to good use there. Ian is also getting some love from Michael Arrington and Om Malik.</p>
<p>Great stuff Ian, good to see PubSub alive again!</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[A Long Tail battle]]></title>
<link>http://feedblog.org/2005/09/13/a-long-tail-battle/</link>
<pubDate>Tue, 13 Sep 2005 21:25:55 +0000</pubDate>
<dc:creator>burtonator</dc:creator>
<guid>http://feedblog.org/2005/09/13/a-long-tail-battle/</guid>
<description><![CDATA[Bob Wyman talks about problem&#8217;s he&#8217;s noticing with ranking on the long tail: If Matt had]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Bob Wyman talks about problem&#8217;s he&#8217;s noticing with <a href="http://bobwyman.pubsub.com/main/2005/09/the_battle_of_t.html">ranking on the long tail</a>:</p>
<blockquote><p>If Matt had been able to see the full set of millions of ranks that we compute, he would have noticed a second &#8220;region&#8221; of very stable ranks. That region is at the bottom of the ranking scale &#8212; sites that never get linked to by anyone. The harsh reality is that those with the lowest ranks tend to stay that way. Those with the highest rank tend to keep their high rank.</p></blockquote>
<p>Hm.  I don&#8217;t see this to be very interesting though.  These are probably just new blogs and people aren&#8217;t doing much to increase their inbound links.  The majority of the thin tail would/should have an indegree of zero.</p>
<p><a href="http://datamining.typepad.com/data_mining/2005/09/pubsub_top_1000.html">Matt Hurst has more on this</a>: </p>
<blockquote><p>It suggests, not surprisingly, that the higher you are ranked, the less likely you are to change rank &#8211; or the more stable the rank is.</p></blockquote>
<p>&#8230;</p>
<p>And Bob finishes with a great quote:</p>
<blockquote><p>The problem is that in almost all rankable systems that deal with information and ideas, the stuff at the top is where you&#8217;ll find things that everyone already knows about or, those at the top of the scale tend to reflect points-of-view that are well known, broadly accepted and are generally predictable&#8230; Unfortunately, you can&#8217;t just invert things and look at the bottom ranks as an alternative. The &#8220;signal-to-noise&#8221; ratio down there isn&#8217;t very good&#8230;</p>
<p>The really useful place to look, if new information or new ideas is that you&#8217;re interested in, is the middle ranks. As Aristotle said long ago: &#8220;Seek the mean.&#8221; That&#8217;s where the good stuff is.</p></blockquote>
<p>I couldn&#8217;t agree more.  This is why I like blogs.  The middle ground is very compelling.  I can read diverse and interesting topics from passionate people.  I don&#8217;t care about the short head.  I don&#8217;t subscribe to anyone on the Technorati Top 100.  If there&#8217;s something good there I&#8217;ll find it on another blog and hit it on a random walk while using my aggregator.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[PubSub LinkRank 1000]]></title>
<link>http://feedblog.org/2005/09/02/pubsub-linkrank-1000/</link>
<pubDate>Fri, 02 Sep 2005 12:10:51 +0000</pubDate>
<dc:creator>burtonator</dc:creator>
<guid>http://feedblog.org/2005/09/02/pubsub-linkrank-1000/</guid>
<description><![CDATA[Nice. PubSub increased the space race here and released their PubSub LinkRanks 1000: The PubSub Link]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><img src="http://burtonator.files.wordpress.com/2007/05/logo-3.jpg?w=95&#038;h=31" height="31" width="95" border="0" align="right" hspace="4" vspace="4" alt="logo" />Nice.  PubSub increased the space race here and released their <a href="http://demos.pubsub.com/linkranks1000/index.php?page=1">PubSub LinkRanks 1000</a>:</p>
<blockquote><p>The PubSub LinkRanks 1000 is a list of the most consistently influential sites that publish feeds, based on their average LinkRank scores from August 1st to August 30th, 2005. To learn more about LinkRanks, click here.</p>
<p>To create this list, we&#8217;ve averaged the daily LinkRanks of more than 15 million sources. We&#8217;ve also included a 15-day average as well as daily LinkRank data for August 30th as additional points of comparison.</p></blockquote>
<p>This is twice as good as the Feedster 500 and 10x as good as the Technorati Top 100!  <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .  That said it&#8217;s still not long tail enough.  There are still 14,999,900 blogs that aren&#8217;t ranked here (in PubSub&#8217;s index).    Still pretty damn cool.  </p>
<p>I&#8217;m no where to be seen on the list (feedblog.org).  Hopefully it&#8217;s not personal and just because my blog is so new.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[My PubSub LinkRank]]></title>
<link>http://feedblog.org/2005/08/19/my-pubsub-linkrank/</link>
<pubDate>Fri, 19 Aug 2005 13:40:34 +0000</pubDate>
<dc:creator>burtonator</dc:creator>
<guid>http://feedblog.org/2005/08/19/my-pubsub-linkrank/</guid>
<description><![CDATA[My kingdom for a way to include my PubSub LinkRank directly within my blog. It seems like it would b]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><img src="http://burtonator.files.wordpress.com/2007/05/logo-2.jpg?w=95&#038;h=31" height="31" width="95" border="0" align="right" hspace="4" vspace="4" alt="logo" />My kingdom for a way to include <a href="http://www.pubsub.com/site_stats.php?site=www.feedblog.org">my PubSub LinkRank</a> directly within my blog.  It seems like it would be pretty trivial to implement but they&#8217;re using SVG caching right now which means I probably wouldn&#8217;t ever see the graph updated if I used their URL.  </p>
<p>Here&#8217;s my current graph:</p>
<p><img src="http://burtonator.files.wordpress.com/2007/05/site-inlinks-new.jpg?w=280&#038;h=300" height="300" width="280" border="0" hspace="4" vspace="4" alt="site-inlinks-new" /></p>
<p>Which I&#8217;d like to see keep growing but it&#8217;s a bit difficult to keep checking back to their site.</p>
<p><b>Update: </b></p>
<p>I don&#8217;t know why I didn&#8217;t think of this before but they&#8217;re using a redirect to use a cached copy of graphs.  For example <a href="http://sandbox.pubsub.com/svg/linkcounts/site-inlinks-new.php?site=feedblog.org&#38;format=png">this</a> is the link in the HTML which then redirects to <a href="http://sandbox.pubsub.com/svg/cache-linkcounts/34/3416343359308203d5fc73d584216b91.png">this</a> link which is in a cache. I guess I could just include the graphic inline but I don&#8217;t want to hurt their servers.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Trackback is a Zombie]]></title>
<link>http://feedblog.org/2005/08/23/trackback-is-a-zombie/</link>
<pubDate>Tue, 23 Aug 2005 21:53:33 +0000</pubDate>
<dc:creator>burtonator</dc:creator>
<guid>http://feedblog.org/2005/08/23/trackback-is-a-zombie/</guid>
<description><![CDATA[Apparently Zawodny thinks trackback is dead: I&#8217;m convinced now more than ever. But I&#8217;ll ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Apparently Zawodny thinks <a href="http://jeremy.zawodny.com/blog/archives/005049.html">trackback is dead</a>:</p>
<blockquote><p>I&#8217;m convinced now more than ever. But I&#8217;ll spare you all long<br />
rant about why it&#8217;s dead, since others have already written this for me:</p>
<ul>
<li><a href="http://www.plasticbag.org/archives/2005/04/trackback_is_dead_are_comments_dead_too.shtml">Trackback is dead. Are Comments dead too?</a></li>
<li><a href="http://www.rolandtanglao.com/archives/2005/02/06/trackback_is_dead_use_pubsub">Trackback is dead, Use PubSub</a></li>
<li><a href="http://www.rolandtanglao.com/archives/2005/05/01/trackback_really_is_dead_sorry_elliott_et_al">Trackback really is dead &#8211; Sorry Elliott et al</a></li>
</ul>
</blockquote>
<p>I&#8217;ve always felt that the case for trackback was a difficult one to make.  One problem is that trackbacks are essentially automated comments.  </p>
<p>Why not just provide a web comment API?  No one has been working on this really and it&#8217;s a bit shocking that it&#8217;s 2005 and we still don&#8217;t have a way to syndicate comments (granted <a href="http://wordpress.org">WordPress</a> has a strong implementation of wfw:comments but that&#8217;s only one provider).  Given a permalink why can&#8217;t I get a list of comments?  Why can&#8217;t I post a comment through NetNewsWire or Ecto?  I can send a trackback via Ecto but only with reduced metadata (the extract, not the full text).</p>
<p>I still don&#8217;t feel that <a href="http://pubsub.com">Pubsub</a>, <a href="http://technorati.com">Technorati</a>, <a href="http://icerocket.com">IceRocket</a>, or <a href="http://feedster.com">Feedster</a> are the answer.  This just adds a brittle centralized man in the middle which can break when you least expect it.</p>
<p>Neither of these will be fixed anytime soon though.  Link tracking services will still be fragile and comment APIs won&#8217;t take off (I&#8217;m obviously jaded).</p>
<p><b>Update:</b></p>
<p><a href="http://rss.weblogsinc.com/entry/1234000187055912/">The RSS Weblog has some thoughts:</a></p>
<blockquote><p>Personally, I think TrackBacks foster self-promotion more than dialogue. Spam aside, linking offsite to follow the conversation is just too disruptive.</p></blockquote>
</div>]]></content:encoded>
</item>

</channel>
</rss>
