<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Steven Lees : FeedSync</title><link>http://blogs.msdn.com/stevenlees/archive/tags/FeedSync/default.aspx</link><description>Tags: FeedSync</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>FeedSync Design Principles</title><link>http://blogs.msdn.com/stevenlees/archive/2007/12/07/feedsync-design-principles.aspx</link><pubDate>Sat, 08 Dec 2007 02:32:57 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6698076</guid><dc:creator>StevenLees</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/stevenlees/comments/6698076.aspx</comments><wfw:commentRss>http://blogs.msdn.com/stevenlees/commentrss.aspx?PostID=6698076</wfw:commentRss><description>&lt;p&gt;There's been a good discussion for the past couple of days on the &lt;a title="atom-syntax archive" href="http://www.imc.org/atom-syntax/mail-archive/"&gt;atom-syntax&lt;/a&gt; list about sync, mostly focused on tombstones.&lt;/p&gt; &lt;p&gt;It's useful to know that our primary design point for &lt;a title="FeedSync" href="http://feedsync.org/"&gt;FeedSync&lt;/a&gt;, as &lt;a href="http://www.imc.org/atom-syntax/mail-archive/msg20085.html"&gt;Joe Cheng&lt;/a&gt; points out, is around "mesh sync". That is, if you have a collection of resources that you can represent as a feed, FeedSync is designed to reliably synchronize that resource collection across any number of endpoints in any conceivable network topology. As the &lt;a title="FeedSync specification" href="http://feedsync.org/spec"&gt;spec&lt;/a&gt; says,&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;em&gt;The extensions described in the FeedSync specification enable feed readers and publishers to generate and process incoming item changes in a manner that enables consistency to be achieved.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;The "achieving consistency" part means that you can be sure that if you implement the spec correctly, all nodes in the mesh will converge on the same data.&lt;/p&gt; &lt;p&gt;Another main design point is that FeedSync is designed for synchronizing human-scale data. That is, things like contact information, calendar items, task lists, and so on. A couple of people have asked me whether you could implement something like &lt;a title="SubEthaEdit" href="http://www.subethaedit.net/"&gt;SubEthaEdit&lt;/a&gt; with FeedSync. You could...but there are sure to be sync methods that are better for that kind of task. On the other hand, if the result of your SubEthaEdit-ing session is a collection of documents that you want to synchronize across multiple machines, then FeedSync is a great way to accomplish that.&lt;/p&gt; &lt;p&gt;One of the cool things about FeedSync is that even though it is designed for two-way, multi-endpoint mesh sync, it is still a pretty Simple set of Extensions on top of Atom and RSS. That means that FeedSync is simple enough to be useful in much simpler scenarios, such as one-way publish-subscribe, or two-way client-server scenarios.&lt;/p&gt; &lt;p&gt;There were some comments (from &lt;a href="http://www.imc.org/atom-syntax/mail-archive/msg20054.html"&gt;James Holderness&lt;/a&gt; and &lt;a href="http://www.snellspace.com/wp/?p=819"&gt;James Snell&lt;/a&gt;, for example) that FeedSync is unnecessarily complex for a task like deleting blog spam from client aggregators. That might be the case; and I'm certainly an advocate of using the simplest solution that accomplishes the task. As I said above, FeedSync's primary design point is around broader scenarios than just blogs. But if you think about your blog as a collection of resources, and you want that resource synchronized across multiple endpoints, then FeedSync is worth a look.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6698076" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/stevenlees/archive/tags/FeedSync/default.aspx">FeedSync</category></item><item><title>FeedSync</title><link>http://blogs.msdn.com/stevenlees/archive/2007/12/04/feedsync.aspx</link><pubDate>Wed, 05 Dec 2007 08:51:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6662638</guid><dc:creator>StevenLees</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/stevenlees/comments/6662638.aspx</comments><wfw:commentRss>http://blogs.msdn.com/stevenlees/commentrss.aspx?PostID=6662638</wfw:commentRss><description>&lt;P&gt;Today we published the final v1 spec for Simple Sharing Extensions, under a new name, FeedSync. The new name is a little simpler than the old one (kind of ironic!) and it captures the intent pretty well.&lt;/P&gt;
&lt;P&gt;We also kicked off a new site today, &lt;A href="http://feedsync.org/"&gt;http://feedsync.org/&lt;/A&gt;, which explains what FeedSync is about. There is a tutorial walkthrough, and pointers to some sample code in JavaScript, VB, and C# for those who are interested.&lt;/P&gt;
&lt;P&gt;&lt;A class="" title="Sam Ruby" href="http://intertwingly.net/blog/" mce_href="http://intertwingly.net/blog/"&gt;Sam Ruby&lt;/A&gt; was kind enough to update the &lt;A class="" title="Feed Validator" href="http://feedvalidator.org/" mce_href="http://feedvalidator.org/"&gt;Feed Validator&lt;/A&gt; for the changes. Thanks Sam!&lt;/P&gt;
&lt;P&gt;The &lt;A class="" title=FeedSync href="http://feedsync.org/" mce_href="http://feedsync.org/"&gt;FeedSync&lt;/A&gt; site has pretty much everything you need to get going, but if you're looking for more, &lt;A class="" title="Send mail" href="http://blogs.msdn.com/stevenlees/contact.aspx" mce_href="http://blogs.msdn.com/stevenlees/contact.aspx"&gt;let us know what's missing&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Happy syncing!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6662638" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/stevenlees/archive/tags/FeedSync/default.aspx">FeedSync</category></item><item><title>About a &amp;quot;by&amp;quot;</title><link>http://blogs.msdn.com/stevenlees/archive/2007/12/02/about-a-by.aspx</link><pubDate>Mon, 03 Dec 2007 03:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:6644117</guid><dc:creator>StevenLees</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/stevenlees/comments/6644117.aspx</comments><wfw:commentRss>http://blogs.msdn.com/stevenlees/commentrss.aspx?PostID=6644117</wfw:commentRss><description>&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;I was reviewing the spec comments that we received over the past few months on the SSE spec, and because there was a fair amount of feedback about the “by” attribute on sx:history, I’d like to explain where the spec ended up.&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;o:p&gt;Just to refresh your memory:&amp;nbsp;every time an item or entry in a feed is changed, the&amp;nbsp;endpoint making the change&amp;nbsp;needs to add an sx:history element to call out the changes. The element has&amp;nbsp;three attributes: a&amp;nbsp;&lt;EM&gt;&lt;STRONG&gt;sequence&lt;/STRONG&gt;&lt;/EM&gt; attribute (the change number), a &lt;STRONG&gt;&lt;EM&gt;when&lt;/EM&gt;&lt;/STRONG&gt; attribute (date/time for the change), and a &lt;STRONG&gt;&lt;EM&gt;by&lt;/EM&gt;&lt;/STRONG&gt; attribute (the endpoint that made the change).&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;o:p&gt;For purposes of sync, the by attribute has to uniquely identify the participating “endpoint”. You can think of by as the “endpoint ID.” The real world entity that the endpoint stands for could be one of several different things depending on your implementation: it could represent a user; or a user on a device; or a process for a user on a device; or something even more specific. One important consideration in picking which one of those things is an endpoint is that the by attribute determines the granularity of conflict detection. Any time an update is made by the same endpoint (the same “by”), that update subsumes all previous updates from that endpoint.&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;o:p&gt;For a practical example, consider the case where I’m syncing data from my laptop to my phone. I change entry A on my laptop; then later (but before I’ve had a chance to sync) I change entry A on my phone. When I sync, one of two things happens. If the by attribute on both my laptop and my phone is identical, then one of those changes is discarded, because as far as the algorithm is concerned, they’re from the exact same endpoint. If the by attribute is different on the two devices, then both changes are preserved. At some point I’ll get to view both changes and choose which one I want to keep; no data is lost.&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;o:p&gt;There were some suggestions that the by attribute should be required or recommended to be a URI. The reason that might be interesting is to somehow identify the (human) author of the change, or at least provide a pointer to the author. That’s definitely a useful thing to do. In the end, though, we felt that such a recommendation would make it harder for implementers to craft useful and unique endpoint IDs for their application.&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;o:p&gt;Our recommendation&amp;nbsp;is to choose the by attribute based on your granularity of conflict detection. Use a different element such as atom:author in order to indicate the source of a change.&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 0pt"&gt;&lt;FONT size=3&gt;&lt;FONT face=Calibri&gt;&lt;o:p&gt;Thanks for the feedback (past and future), it’s much appreciated!&lt;BR&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6644117" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/stevenlees/archive/tags/Simple+Sharing+Extensions/default.aspx">Simple Sharing Extensions</category><category domain="http://blogs.msdn.com/stevenlees/archive/tags/FeedSync/default.aspx">FeedSync</category></item></channel></rss>