{"id":119,"date":"2003-04-28T08:06:00","date_gmt":"2003-04-28T12:06:00","guid":{"rendered":"http:\/\/www.markbaker.ca\/wp\/?p=194"},"modified":"2003-04-28T08:06:00","modified_gmt":"2003-04-28T12:06:00","slug":"rss-history-via-state-transfer","status":"publish","type":"post","link":"http:\/\/www.markbaker.ca\/blog\/2003\/04\/rss-history-via-state-transfer\/","title":{"rendered":"RSS history via state transfer"},"content":{"rendered":"<p>Mark Nottingham created <a href=\"http:\/\/www.mnot.net\/rss\/history\/\">RSS History<\/a>,\nin order to help distinguish the various ways in which an RSS feed can be interpreted.\nA very useful feature, for sure, but I think I have a better idea about how to do it.<\/p>\n\n<p>If you think of a blog in terms of one agent receiving a compound document\ncontaining representations of individual items, the &#8220;h:overwrite&#8221; semantic\nshould be reproducable simply by telling the receiving agent <em>what<\/em> resource\n(item) that data is a representation of; the only possible way the receiving\nagent can interpret this, is that the more recent representation &#8220;overwrites&#8221; the\nolder one.  In other words, we just need to give the item a URI (\npreferably <em>without<\/em> a fragment identifier, though I suppose it could\nwork with them &#8211; I&#8217;ll have to think more about that).<\/p>\n\n<p>Similarly, the &#8220;h:add&#8221; semantic would be the result of not including the URI,\ngiving the receiving agent no choice but to interpret that data as additional\ndata, rather than replacement data.<\/p>\n\n<p>&#8220;h:none&#8221; should be a special case of the overwrite semantic, so that if a single\nRSS document contains two representations of the same resource, that the\n&#8220;most recent&#8221; one overwrites the older one.  Of course, this requires that the channel\nposess some sort of ordering semantics.  I&#8217;m no RSS whiz, but the only example of this\nI know of is <a href=\"http:\/\/web.resource.org\/rss\/1.0\/\">RSS 1.0<\/a> when it talks about\nusing rdf:Seq (sequence) rather than rdf:Bag to contain items.  So you&#8217;d need to use a\nrdf:Seq if you wanted a feed like this.  Makes sense.<\/p>\n\n<p>As a proposal, I guess this boils down to using rdf:about\/GUID on items when you\nwant replacement (perhaps in the future, i.e. if you don&#8217;t use the URI now, you can&#8217;t\nreplace later)), don&#8217;t when you don&#8217;t (or even better, use a different URI), and use rdf:seq\nwhen order matters within a channel, even for intra-channel replacement.  Oh, and use RDF\n1.0. 8-)  This has the downside that existing aggregators will likely change behaviour\nbased on the same input, but I don&#8217;t think it&#8217;s too much of a\n<a href=\"http:\/\/www.catb.org\/~esr\/writings\/taoup\/html\/ch11s01.html\">surprising<\/a>\nchange.  I think the gain in functionality, simplicity, and\n<a href=\"http:\/\/www.ics.uci.edu\/~fielding\/pubs\/dissertation\/net_app_arch.htm#sec_2_3_5\">visibility<\/a>\nis worth it, but I&#8217;m not an author of an aggregator so I might be missing something.<\/p>","protected":false},"excerpt":{"rendered":"Mark Nottingham created RSS History, in order to help distinguish the various ways in which an RSS feed can be interpreted. A very useful feature, for sure, but I think I have a better idea about how to do it. If you think of a blog in terms of one agent receiving a compound document [&hellip;]","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-119","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/www.markbaker.ca\/blog\/wp-json\/wp\/v2\/posts\/119","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.markbaker.ca\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.markbaker.ca\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.markbaker.ca\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.markbaker.ca\/blog\/wp-json\/wp\/v2\/comments?post=119"}],"version-history":[{"count":0,"href":"http:\/\/www.markbaker.ca\/blog\/wp-json\/wp\/v2\/posts\/119\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.markbaker.ca\/blog\/wp-json\/wp\/v2\/media?parent=119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.markbaker.ca\/blog\/wp-json\/wp\/v2\/categories?post=119"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.markbaker.ca\/blog\/wp-json\/wp\/v2\/tags?post=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}