<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-32472356</id><updated>2011-09-11T03:32:34.824-07:00</updated><category term='feeds'/><category term='mobile'/><category term='Atom'/><category term='SQL'/><category term='client'/><category term='html5'/><category term='W3C'/><category term='atomdb'/><category term='URI template'/><category term='Web database'/><category term='offline'/><category term='in-line'/><category term='AtomPub'/><category term='storage'/><category term='Ajax'/><category term='query'/><category term='sync'/><category term='evolution'/><category term='Web'/><category term='HTTP'/><category term='git'/><category term='best practice'/><category term='bitsy'/><category term='extension'/><category term='Berkeley DB'/><category term='shoji'/><category term='society entrepreneur'/><category term='java'/><category term='REST'/><category term='anti-pattern'/><category term='security'/><category term='DataCache'/><category term='startup'/><category term='hierarchy'/><category term='WebDAV'/><category term='federation'/><category term='XML'/><category term='API'/><category term='gears'/><category term='dojo offline'/><category term='IETF'/><category term='source code'/><category term='WebSimpleDB'/><category term='conneg'/><category term='middleware'/><category term='mozilla'/><category term='architecture'/><category term='CMIS'/><category term='offline REST'/><category term='discovery'/><title type='text'>asymptotic tight bound</title><subtitle type='html'>I like to solve application problems using the Web (statelessness, hypermedia, self-descriptive representations, and uniform interfaces) to produce an asymptotically tight bound solution!</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.o-micron.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>74</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-32472356.post-8570596652268613829</id><published>2011-08-25T23:04:00.000-07:00</published><updated>2011-08-25T23:07:54.876-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='source code'/><title type='text'>Managing source code repositories</title><content type='html'>There are few areas in software engineering that get programmers and managers as actively engaged as the source code management processes. Naturally, it has evolved rapidly over the last decade or so as we went from RCS and Visual Source Safe to Git/Mercurial and SVN.&lt;br /&gt;&lt;br /&gt;As these tools have come and gone, so also have good and bad practices. In an effort to keep up with current practices, I came across &lt;a href="http://www.nvie.com/posts/a-successful-git-branching-model/"&gt;this article on using Git for source code management&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;What I like about this article is its simplicity and the ease with which you can survive a corporate software development environment for product engineering.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-8570596652268613829?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/8570596652268613829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=8570596652268613829&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8570596652268613829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8570596652268613829'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2011/08/managing-source-code-repositories.html' title='Managing source code repositories'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-343318103142892250</id><published>2010-01-16T16:09:00.000-08:00</published><updated>2010-01-16T16:14:39.813-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='offline'/><category scheme='http://www.blogger.com/atom/ns#' term='DataCache'/><category scheme='http://www.blogger.com/atom/ns#' term='W3C'/><title type='text'>New WD for programmable HTTP caching and processing</title><content type='html'>The programmable HTTP caching and processing standard that is advancing through W3C, called DataCache, has recently been updated. A new working draft is available. You can read the frequently updated, &lt;a href="http://dev.w3.org/2006/webapi/DataCache/"&gt;latest and greatest version&lt;/a&gt; or get to a &lt;a href="http://www.w3.org/TR/DataCache/"&gt;stable WD&lt;/a&gt; of DataCache.&lt;br /&gt;&lt;br /&gt;This version has several improvements over the previous working draft:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The spec extends the HTML5 ApplicationCache interface and add some behaviors to it related to programmability of caching.&lt;/li&gt;&lt;li&gt;There is no more a secure data cache concept that would be guarded by cookies.&lt;/li&gt;&lt;li&gt;This spec is heavily tied to the HTML5 Application Cache and refers  to a lot of terms, algorithms, interfaces, and events defined there.  It also modifies the networking model defined there.&lt;/li&gt;&lt;li&gt;The asynchronous interfaces are styled similar to Indexed Database.&lt;/li&gt;&lt;li&gt;I have removed the synchronous interface until we agree on the rest  of the spec.&lt;/li&gt;&lt;li&gt;Security considerations are modified.&lt;/li&gt;&lt;li&gt;Mechanisms to inspect the metadata of application caches is provided.&lt;/li&gt;&lt;li&gt;A new mechanism to annotate an application cache with outbox type of metadata is provided so that user agents can provide a control  panel to users for acting on outbox when network connectivity is  reestablished.&lt;/li&gt;&lt;li&gt;New events on the cache are removed or moved to events on cache  transactions.&lt;/li&gt;&lt;li&gt;The File API Blob interface is now used in the spec.&lt;/li&gt;&lt;li&gt;It is more richly hyperlinked and features improved IDL listings. &lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-343318103142892250?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/343318103142892250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=343318103142892250&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/343318103142892250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/343318103142892250'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2010/01/new-wd-for-programmable-http-caching.html' title='New WD for programmable HTTP caching and processing'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-5537050631774283869</id><published>2009-12-29T23:12:00.000-08:00</published><updated>2010-01-16T16:15:13.634-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Berkeley DB'/><category scheme='http://www.blogger.com/atom/ns#' term='Web database'/><category scheme='http://www.blogger.com/atom/ns#' term='W3C'/><title type='text'>New WD for browser database standard</title><content type='html'>At the start of a new year, I wish the best to you in 2010.&lt;br /&gt;&lt;br /&gt;The browser database standard that is advancing through W3C, called Indexed Database API, has recently been updated. A new working draft will soon be available. You can read the frequently updated, &lt;a href="http://dev.w3.org/2006/webapi/WebSimpleDB/"&gt;latest and greatest version&lt;/a&gt; or get to a &lt;a href="http://www.w3.org/TR/IndexedDB/"&gt;stable WD&lt;/a&gt; of Indexed Database.&lt;br /&gt;&lt;br /&gt;(Please note Indexed Database used to be called WebSimpleDB originally.)&lt;br /&gt;&lt;br /&gt;This version has several improvements over the previous working draft:&lt;br /&gt;&lt;br /&gt;1. It has a smaller footprint in terms of features.&lt;br /&gt;2. It is more specific in terms of supported data types.&lt;br /&gt;3. It supports two modes of deadlock-free operation.&lt;br /&gt;4. It offers concurrent iteration through multiple cursors for both synchronous and asynchronous clients.&lt;br /&gt;5. It features a consistent API style for asynchronous clients.&lt;br /&gt;6. It contains security considerations&lt;br /&gt;7. It is more richly hyperlinked and features improved IDL listings.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-5537050631774283869?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/5537050631774283869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=5537050631774283869&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5537050631774283869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5537050631774283869'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/12/new-wd-for-browser-database-standard.html' title='New WD for browser database standard'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-3253496665353037385</id><published>2009-12-23T07:53:00.001-08:00</published><updated>2009-12-23T07:55:36.588-08:00</updated><title type='text'>This blog is moving to its own domain</title><content type='html'>After much thought, I decided to finally host this blog at my own domain - blog.o-micron.com. Please adjust your subscriptions to the blog's new URL - http://blog.o-micron.com.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-3253496665353037385?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/3253496665353037385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=3253496665353037385&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/3253496665353037385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/3253496665353037385'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/12/this-blog-is-moving-to-its-own-domain.html' title='This blog is moving to its own domain'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-5375650403945634213</id><published>2009-11-06T08:03:00.000-08:00</published><updated>2009-11-06T08:25:55.403-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='offline'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><category scheme='http://www.blogger.com/atom/ns#' term='DataCache'/><title type='text'>Use Cases for DataCache</title><content type='html'>I discussed a set of &lt;a href="https://docs.google.com/fileview?id=0B0rjI-BMFJwBYzNhYTYyNWQtNGFhZi00N2MxLWIyNDMtNGJhZjA2Y2ZhNzRh&amp;amp;hl=en"&gt;use cases not well supported by HTML5 ApplicationCache&lt;/a&gt; with the HTML WG during a breakout session at TPAC. These use cases were the basis for &lt;a href="http://o-micron.blogspot.com/search/label/atomdb"&gt;AtomDB&lt;/a&gt; are being solved by the &lt;a href="http://www.w3.org/TR/DataCache/"&gt;DataCache&lt;/a&gt; API.&lt;br /&gt;&lt;br /&gt;Found out that OMA and AT&amp;amp;T had similar ideas too. Also learnt that these techniques could be merged with HTTP caching.&lt;br /&gt;&lt;br /&gt;Hixie agreed these use cases covered the ones the GMail team had asked for but he favored waiting until after &lt;a href="http://dev.w3.org/html5/spec/offline.html"&gt;AppCache&lt;/a&gt; had stabilized and browser implemented other HTML5 stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-5375650403945634213?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/5375650403945634213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=5375650403945634213&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5375650403945634213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5375650403945634213'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/11/use-cases-for-datacache.html' title='Use Cases for DataCache'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-2543427895109869957</id><published>2009-11-05T12:20:00.000-08:00</published><updated>2009-11-05T12:34:45.698-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Berkeley DB'/><category scheme='http://www.blogger.com/atom/ns#' term='Web database'/><category scheme='http://www.blogger.com/atom/ns#' term='WebSimpleDB'/><category scheme='http://www.blogger.com/atom/ns#' term='W3C'/><title type='text'>WebSimpleDB gets thumbs up from major browser vendors</title><content type='html'>Microsoft and Mozilla &lt;a href="http://www.w3.org/mid/F753B2C401114141B426DB383C8885E01B9AB26E@TK5EX14MBXC126.redmond.corp.microsoft.com"&gt;declared&lt;/a&gt; their &lt;a href="http://www.w3.org/mid/63df84f0911022342h757fc962o277aa63403c3be00@mail.gmail.com"&gt;intention&lt;/a&gt; to advance &lt;a href="http://dev.w3.org/2006/webapi/WebSimpleDB/"&gt;WebSimpleDB&lt;/a&gt; and their preference for it over &lt;a href="http://dev.w3.org/html5/webdatabase/"&gt;WebDatabase&lt;/a&gt; (which itself is &lt;a href="http://www.w3.org/mid/46E99E80-C466-48AD-B677-79AECC65C9D6@oracle.com"&gt;getting renamed to WebSQLDatabase&lt;/a&gt;) and &lt;a href="http://dev.w3.org/html5/webstorage/"&gt;WebStorage&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.w3.org/2009/11/02-webapps-irc#T21-40-38"&gt;WebDatabase will be frozen&lt;/a&gt; in terms of its current API and likely &lt;a href="http://www.w3.org/2009/11/02-webapps-irc#T22-09-43"&gt;stay at the SQL dialect of SQLite 3&lt;/a&gt;. WebSimpleDB has taken on the mandate of the WG to create a small and general set of primitives for building various rich JS libraries. WebSimpleDB is heavily influenced by Oracle's experience with &lt;a href="http://www.oracle.com/technology/documentation/berkeley-db/db/api_reference/C/index.html"&gt;Berkeley DB.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Stay tuned here for more on this topic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-2543427895109869957?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/2543427895109869957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=2543427895109869957&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/2543427895109869957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/2543427895109869957'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/11/websimpledb-gets-thumbs-up-from-major.html' title='WebSimpleDB gets thumbs up from major browser vendors'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-6802963968328053584</id><published>2009-10-16T12:00:00.000-07:00</published><updated>2009-10-16T12:09:56.198-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='offline'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><category scheme='http://www.blogger.com/atom/ns#' term='atomdb'/><category scheme='http://www.blogger.com/atom/ns#' term='W3C'/><title type='text'>DataCache API now rewritten and ready for FPWD</title><content type='html'>There was a wave of support for programmable HTTP caching when the &lt;a href="http://www.w3.org/mid/22F3C7CE-225F-4E78-9A16-0BF59814029A@oracle.com"&gt;first DataCache editor's draft was published&lt;/a&gt;. The main issue with the draft was the inability to derive the exact list of additional requirements on browsers compared with &lt;a href="http://dev.w3.org/html5/spec/offline.html"&gt;HTML5's AppCache&lt;/a&gt;. I went ahead and &lt;a href="http://dev.w3.org/2006/webapi/DataCache/"&gt;rewrote DataCache&lt;/a&gt; to make it easier to spot the differences. Here are the differences:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;A data cache does not have fallback or online whitelist namespaces or foreign entries.&lt;/li&gt;&lt;li&gt;A data cache provides a monotonically increasing numeric version identifier.&lt;/li&gt;&lt;li&gt;A data cache may have an authorization cookie.&lt;/li&gt;&lt;li&gt;Every resource managed in a data cache may be configured to process certain (HTTP) protocol methods locally&lt;/li&gt;&lt;li&gt;Zero or more data caches are automatically associated with a cache host at its creation/load time. A secure data cache group is available to a cache host if its authorization cookie will be sent to an origin server for fetching that cache host [RFC2965]. &lt;/li&gt;&lt;li&gt;The events checking and noupdate are not used. The events cached and updateready are merged in to a single event ready. Events downloading and progress are renamed as fetching and captured. There is no downloading update status for a data cache group.&lt;/li&gt;&lt;li&gt;No manifest is used. Instead an update transaction encapsulates a set of changes to the cache. An update transaction consists of any number of capture steps or release steps. An application can store a bag of bits independent of a network representation of that resource. This allows storing of off-line resources. The results are not visible until the transaction is committed. &lt;/li&gt;&lt;li&gt;Update transactions can be performed in workers but not in the background independently of applications.&lt;/li&gt;&lt;li&gt;It is possible to have only one online transaction but multiple off-line transactions are allowed.&lt;/li&gt;&lt;li&gt;It is possible to find out the resources added to or removed from cache starting at a certain version.&lt;/li&gt;&lt;li&gt;A data cache offers applications the ability to get the contents corresponding to a URI.&lt;/li&gt;&lt;li&gt;The navigator registers a scriptable HTTP interceptor that can off-line respond to arbitrary HTTP requests based on prior (data cache) configuration of the resources in those requests.&lt;/li&gt;&lt;li&gt;A new header is defined to by-pass data cache in request processing&lt;/li&gt;&lt;li&gt;A slightly different networking model is required to take into account interception.&lt;/li&gt;&lt;/ol&gt;I have a request to publish this new editor's draft as a FPWD and hopefully that will happen before &lt;a href="http://www.w3.org/2009/11/TPAC/PlenaryAgenda"&gt;TPAC&lt;/a&gt; with a view to discussing the draft during&lt;a href="http://www.w3.org/2008/webapps/wiki/TPAC2009APIs"&gt; WebApps WG f2f meeting&lt;/a&gt;. Read this in conjunction with &lt;a href="http://dev.w3.org/2006/webapi/WebSimpleDB/"&gt;WebSimpleDB&lt;/a&gt; so you can create off-line Web apps that can serve HTTP resources locally, including even query on the off-line cache.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-6802963968328053584?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/6802963968328053584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=6802963968328053584&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6802963968328053584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6802963968328053584'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/10/datacache-api-now-rewritten-and-ready.html' title='DataCache API now rewritten and ready for FPWD'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-6737522510496955444</id><published>2009-09-09T11:58:00.000-07:00</published><updated>2009-10-16T13:54:17.312-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web database'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><category scheme='http://www.blogger.com/atom/ns#' term='W3C'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Now published - an alternative to SQL for database storage in Web browsers</title><content type='html'>Many of us have raised serious issues with the WebDatabase API that provides SQL query access to a browser embedded database. Some of these are:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use of SQL means that it will be next to impossible to get agreement on the exact dialect supported by independent implementations.&lt;/li&gt;&lt;li&gt;The API is extraordinarily complex that an ordinary programmer would have a hugely difficult time using it. This means more bugs will remain hidden for longer in the spec, and more bugs would be found in code using the API. The complexity arises out of a need to prevent delays when accessing a database from affecting the user interface. As a result, practically every call to the API results in an asynchronous callback.&lt;/li&gt;&lt;li&gt;The API requires a lock acquisition scheme that does allows extremely limited  parallelism in data access. As a result, superior implementations cannot do well. Even though the intention is noble - avoid producing exceptions as a result of deadlocks - the result is delays and timeouts as well as higher level deadlocks, which the programmer still has to deal with.&lt;/li&gt;&lt;li&gt;The API has chosen to use SQL due to its well developed relational model. However, it doesn't want to provide an API that the typical database developer will be able to program against. This mythical "Web database" programmer receives undue importance in the design of the API.&lt;/li&gt;&lt;li&gt;Overly reliant on SQL, when the data model in browsers is that of objects. This forces everyone to develop layers to translate between rowsets and objects.&lt;/li&gt;&lt;/ol&gt;There is currently a deadlock that has arisen out of a number of browser vendors refusing to go along with WebDatabase (notably Mozilla and Microsoft) and a lack of an alternative. To break this deadlock, we have developed an alternative that will provide a highly efficient and functionally rich (although less richer than SQL), called WebSimpleDatabase.&lt;br /&gt;&lt;br /&gt;This editor's draft of &lt;a href="http://dev.w3.org/2006/webapi/WebSimpleDB/"&gt;WebSimpleDB&lt;/a&gt; is now available from W3C. I am inviting feedback on this draft so that I can incorporate it before it goes to FPWD.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-6737522510496955444?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/6737522510496955444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=6737522510496955444&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6737522510496955444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6737522510496955444'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/09/now-published-alternative-to-sql-for.html' title='Now published - an alternative to SQL for database storage in Web browsers'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-7218236203012843870</id><published>2009-07-13T09:09:00.001-07:00</published><updated>2009-07-13T09:44:39.509-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='in-line'/><category scheme='http://www.blogger.com/atom/ns#' term='Atom'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><title type='text'>Embed XML document inside another XML document</title><content type='html'>Ever considered the implications of embedding an XML document inside another XML document? Every new format developer, especially extension format developer has to consider the consequences of embedding an XML extension payload inside an XML envelope.&lt;br /&gt;&lt;br /&gt;In plain terms, what are the consequences of doing the following:&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;feed xmlns="http://www.w3.org/2005/Atom"&gt;&lt;br /&gt;&amp;lt;id&gt;...&amp;lt;/id&gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;entry&gt;&lt;br /&gt; &amp;lt;id&gt;...&amp;lt;/id&gt;&lt;br /&gt; ...&lt;br /&gt;&amp;lt;/entry&gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;/feed&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;While we do it all the time with &lt;a href="http://tools.ietf.org/html/rfc4287"&gt;Atom&lt;/a&gt;, this is an example of a document embedded inside another - Atom entry inside Atom feed. There are a number of issues lurking under the surface that one has to consider before copying the entry bits in to the feed itself. In general, there are many issue to consider while embedding one XML document inside another.&lt;br /&gt;&lt;br /&gt;These issues don't surface if you are managing all the bits yourself, i.e., you store the original bits of everything and normalize to a common set of encodings, namespaces, signatures, entities, and so on. However, if you are aggregating content from different publishers, then it's a different ball game. I started thinking about these issues as a result of &lt;a href="http://www.imc.org/atom-syntax/mail-archive/msg21224.html"&gt;Mark Nottingham's feedback&lt;/a&gt; about the &lt;a href="http://tools.ietf.org/html/draft-mehta-atom-inline"&gt;Atom in-line I-D&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here are some of the issues I could think about (and manifestations in the case of Atom):&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Duplication of content (e.g., &lt;span style="font-family:courier new;"&gt;&amp;lt;atom:title&gt;&lt;/span&gt;)&lt;/li&gt;&lt;li&gt;Inherited values for metadata (e.g., &lt;span style="font-family:courier new;"&gt;xml:lang&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;xml:base&lt;/span&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Character set and encoding (for XML and binary content)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Entity declarations&lt;/li&gt;&lt;li&gt;Namespace declarations&lt;/li&gt;&lt;li&gt;Digital signatures&lt;/li&gt;&lt;li&gt;Protocol metadata (&lt;span style="font-family:courier new;"&gt;ETag&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;Content-Length&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;Content-Type&lt;/span&gt;)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Did I miss some more? If so, please help me identify them. It will help in making the in-line I-D stronger and easier to implement and use.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-7218236203012843870?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/7218236203012843870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=7218236203012843870&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7218236203012843870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7218236203012843870'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/07/embed-xml-document-inside-another-xml.html' title='Embed XML document inside another XML document'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-5542544242692447895</id><published>2009-07-10T09:05:00.000-07:00</published><updated>2009-07-10T09:11:43.028-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='offline'/><title type='text'>Temper your 3G and iPhone expectations</title><content type='html'>"Why do we need offline capabilities when today's phones are so savvy about using the network and the network is so good."&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://www.pcworld.com/article/168126/why_i_should_not_have_bought_the_iphone_3gs.html"&gt;a PCWorld article, Bill Snyder&lt;/a&gt;, veteran mobile industry journo, basically admonishes us for expecting too much from mobile devices. Here are a few excerpts:&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;blockquote&gt;But my first few days with the iPhone [...] made me realize how far we are from the mobile, Web-based nirvana so often promised. The technology and the infrastructure are simply not there yet. It's time to lower our expectations.&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Our national infrastructure lags behind demand for high-speed services, and given the costs and the difficult economic conditions, we just have to wait until it catches up.&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Batteries have gotten much better. The problem, though, is the ever increasing demands made upon them by new features. Take my iPhone: That big, bright screen sucks power like a baby quaffs milk. Use a few other features, and suddenly you're running on empty. It's a serious problem for engineers, and it's only going to get worse.&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Battery technology, unlike CPU technology, does not dance to Moore's Law -- and it won't for some time.&lt;/blockquote&gt;There are two engineering alternatives for poor network and low battery life:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt; Hunker down and make designs for offline apps&lt;/li&gt;&lt;li&gt;Design &lt;a href="http://o-micron.blogspot.com/2009/04/bitsy-050-develop-seamlessly-on-lineoff.html"&gt;seamless online/off-line&lt;/a&gt; apps&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;#1 is good old mobile app design. There is no reason to go back to that since networks are indeed better and users want to use the network more often. However, #2 is a smart evolution path while we wait for 4G.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-5542544242692447895?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/5542544242692447895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=5542544242692447895&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5542544242692447895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5542544242692447895'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/07/temper-your-3g-and-iphone-expectations.html' title='Temper your 3G and iPhone expectations'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-1430811335864119475</id><published>2009-06-24T15:59:00.000-07:00</published><updated>2009-07-09T09:12:43.125-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bitsy'/><category scheme='http://www.blogger.com/atom/ns#' term='offline'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Requirements for and components needed in real Web Storage</title><content type='html'>Several times I have prodded people to provide requirements to WebStorage. Here's what I have gathered from use cases and scenarios people have suggested for WebStorage's scope:&lt;br /&gt;&lt;br /&gt;Here are three sets of requirements as I see them:&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Structured key-value pair storage and cursors&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Store, remove, and retrieve individual data items &lt;ol&gt;&lt;li&gt;items identified by a string key &lt;/li&gt;&lt;li&gt;         item values can be either null, object, or string &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Allow duplicate values for the same key &lt;/li&gt;&lt;li&gt;Allow organization of items in to more than one database per application &lt;/li&gt;&lt;li&gt;Sequentially walk items in a cursor starting at a point identified by a key value &lt;ol&gt;&lt;li&gt;         items should be presented in an increasing key value as determined by JavaScript's String comparison operator '==' &lt;/li&gt;&lt;li&gt;         once the highest key value is reached, no more items are provided &lt;/li&gt;&lt;li&gt;         if the matching key value is empty, the first key in the database is the starting point &lt;/li&gt;&lt;li&gt;         can walk through items in reverse order &lt;/li&gt;&lt;li&gt;         items obtained in the cursor are deletable - IOW, cursor is modifiable &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;  Provide a sequence object in each database to generate a monotonically increasing sequence of numbers &lt;/li&gt;&lt;li&gt;A database belongs to a single storage unit. &lt;/li&gt;&lt;li&gt;Applications are able to open or create a storage unit. &lt;/li&gt;&lt;li&gt;Allow storage of multiple items to be committed as part of an atomic transaction &lt;/li&gt;&lt;li&gt; Offer READ_COMMITTED and READ_UNCOMMITTED cursors &lt;/li&gt;&lt;li&gt; Transaction scope is limited to operations on databases within the same storage unit. &lt;/li&gt;&lt;li&gt;All APIs are synchronous &lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:130%;"&gt;HTTP Cache programming&lt;/span&gt;:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;capture a resource that is used for satisfying GET &amp;amp; HEAD requests&lt;br /&gt;&lt;ol&gt;&lt;li&gt;given just its URL, fetch and durably store its representation&lt;br /&gt;&lt;/li&gt;&lt;li&gt;as a locally produced representation&lt;/li&gt;&lt;li&gt;over write an existing representation&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;retrieve or remove a resource's representation or check for its presence&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:130%;"&gt;HTTP interception:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Store the methods on resources that are locally intercepted&lt;/li&gt;&lt;li&gt;Choose among the following for a locally intercepted method&lt;/li&gt;&lt;li&gt;Pass the headers and body of the request, without jeopardizing security, to the programmed interceptor&lt;/li&gt;&lt;li&gt;Make the request to the server, relay the request and the response to the programmed interceptor, and return the response to the application&lt;a style="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_4cn9Pl6cwjQ/SkK7m8Z5_UI/AAAAAAAAFAA/wCAF39Nrifo/s1600-h/real+Web+storage.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 274px;" src="http://1.bp.blogspot.com/_4cn9Pl6cwjQ/SkK7m8Z5_UI/AAAAAAAAFAA/wCAF39Nrifo/s320/real+Web+storage.png" alt="" id="BLOGGER_PHOTO_ID_5351045584993779010" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;A JS library for synchronized Web storage would use all three components to process network requests locally using HTTP interception, respond to queries locally using the b-tree storage and the HTTP cache as well as store pending requests for forwarding to the server when it is reachable.&lt;br /&gt;&lt;br /&gt;A pictorial representation of the layers involved in an implementation of CouchDB to run in a browser captures the contrast between the existing and the proposed breakdown of Web Storage.&lt;br /&gt;&lt;br /&gt;The browser is then required to do the switching between off-line and on-line and between relay and intercept as I explain in the &lt;a href="http://o-micron.blogspot.com/2009/04/bitsy-050-develop-seamlessly-on-lineoff.html"&gt;post on BITSY 0.5&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As I see it, these requirements subsume the requirements known to date for Ian Hickson's Web Storage draft. Were it not for the widespread use of LocalStorage, we could do away with it completely because the b-tree store is a more robust way of dealing with key-value pairs. However, there is no reason and, hopefully, little chance of the SQL portion making its way to the W3C hall of fame, I mean Rec.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-1430811335864119475?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/1430811335864119475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=1430811335864119475&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/1430811335864119475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/1430811335864119475'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/06/requirements-for-and-components-needed.html' title='Requirements for and components needed in real Web Storage'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_4cn9Pl6cwjQ/SkK7m8Z5_UI/AAAAAAAAFAA/wCAF39Nrifo/s72-c/real+Web+storage.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-7750632585458496005</id><published>2009-06-05T10:55:00.000-07:00</published><updated>2009-06-05T11:19:37.080-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='in-line'/><category scheme='http://www.blogger.com/atom/ns#' term='hierarchy'/><category scheme='http://www.blogger.com/atom/ns#' term='Atom'/><title type='text'>In-lining extensions and hierarchy for Atom</title><content type='html'>Linked resources are a real treasure in Atom. They allow you to connect, through hypertext, all kinds of things in to a useful content model. No wonder all sorts of Atom applications have invented custom or new standard link relations for Atom.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One challenge with linked resources, though, is that one has to make separate network requests to obtain their representations. While this is exactly the approach taken in HTML, there are some benefits to making representations of linked resources available in-line with the referring Atom document such as reduced network dependency and greater responsiveness.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Introducing an in-line representation technique for such situations, while making Atom as a format more useful, does nothing for standard Atom clients such as feed readers. These standard clients could, over time, provide better access to Atom extensions. For example, some feed readers do not provide adequate support for presenting categories. Others don't make available the "replies" link. A part of working with the Atom format is the opportunity of unimaginable extensibility and the disappointment of uptake and general utility. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In any case, we have revised the atom-hierarchy I-D and it is available in both &lt;a href="http://www.ietf.org/internet-drafts/draft-divilly-atom-hierarchy-01.txt"&gt;text&lt;/a&gt; and &lt;a href="http://www.oracle.com/technology/tech/feeds/spec/draft-divilly-atom-hierarchy.html"&gt;HTML&lt;/a&gt;. There is a demand for separating the &lt;a href="http://o-micron.blogspot.com/2009/05/atom-multiple-links-with-same-rel-value.html"&gt;in-line parts&lt;/a&gt; from the &lt;a href="http://o-micron.blogspot.com/2009/05/creating-hierarchy-of-documents-and.html"&gt;hierarchy parts&lt;/a&gt;, and this 01 version keeps them apart inside a single I-D. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-7750632585458496005?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/7750632585458496005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=7750632585458496005&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7750632585458496005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7750632585458496005'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/06/in-lining-extensions-and-hierarchy-for.html' title='In-lining extensions and hierarchy for Atom'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-4752953283054933203</id><published>2009-06-02T15:07:00.000-07:00</published><updated>2009-06-02T15:32:45.808-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='hierarchy'/><category scheme='http://www.blogger.com/atom/ns#' term='Atom'/><title type='text'>CMIS XVI: Ignore good hypertext practices at your own risk</title><content type='html'>The spec lead for &lt;a href="http://www.oasis-open.org/committees/download.php/32668/Draft%2062a.zip"&gt;CMIS AtomPub extensions&lt;/a&gt; simply doesn't have the patience to get his protocol right. Feedback is either too minor for his current attention or pretty much useless for his needs. Let me give an example for each.&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;When asked about a number of optional RFC5023 things that are never referenced by CMIS, such as those in &lt;a href="http://o-micron.blogspot.com/2009/05/cmis-xiv-cant-do-basic-path.html"&gt;CMIS XIV: Can't do basic path manipulation? Don't blame AtomPub&lt;/a&gt;, Al takes refuge in the W-I-P tent. &lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="fullpost"&gt;On the other hand, Al Brown is &lt;a href="http://www.imc.org/atom-syntax/mail-archive/msg21043.html"&gt;dead set against using entry inside link&lt;/a&gt; elements for in-lining hierarchy representations. I am beginning to get that his opposition is often not well-intentioned and that the &lt;a href="http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=cmis"&gt;CMIS TC&lt;/a&gt; members are nodding their heads without fully realizing the consequences of doing so.&lt;br /&gt;&lt;blockquote&gt;#1 does not ideally address CMIS' use case of how to represent a tree of atom entries in a single document but rather provide a generic pre-fetching/inlining mechanism.&lt;/blockquote&gt;This appears rather cavalier to me. But this would not be the time someone did so. Some of you would remember Dare Obasanjo and Yaron Goland g&lt;a href="http://www.25hoursaday.com/weblog/2007/06/09/WhyGDataAPPFailsAsAGeneralPurposeEditingProtocolForTheWeb.aspx"&gt;riping about AtomPub's lack of support for "hierarchical data inlining"&lt;/a&gt; and Microsoft's &lt;a href="http://www.25hoursaday.com/weblog/CommentView.aspx?guid=020611C4-F53C-4DF0-8DB0-9A050DD6CD9C"&gt;justification for Web3S as a brand new publishing protocol for the Web&lt;/a&gt; , which spawned a discussion about whether Atom could deal with recursive structures such as a hierarchy. Joe Gregorio eloquently refuted &lt;a href="http://bitworking.org/news/197/In-which-we-narrowly-save-Dare-from-inventing-his-own-publishing-protocol"&gt;claims that Atom syntax is not suitable for hierarchies&lt;/a&gt; by, essentially, advocating its hypertext mechanisms, which is exactly what the &lt;a href="http://o-micron.blogspot.com/2009/05/splitting-hierarchy-i-d.html"&gt;atom-hierarchy I-D&lt;/a&gt; is proposing.&lt;br /&gt;&lt;br /&gt;Quoting James Snell about how he dealt with &lt;a href="http://www.snellspace.com/wp/?p=681"&gt;hierarchy in IBM Lotus Connections:&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;In reality, it turns out that hierarchy in APP is actually quite simple to achieve. The IBM Lotus Connections product includes a component called “Activities” which has a very hierarchical data structure. Every user has a set of collections, each of which has a set of entries, each of which can have any number of comments that can be nested to any depth. When I first designed the Atom Publishing Protocol API for activities, I created a top level collection of Activities. Every entry in this collection represents an Activity. Every activity is also a collection. I post entries and comments to the activity collection using the standardized Atom Threading Extension to provide the additional hierarchy. An Atom Entry can represent pretty much anything, including a collection of Atom entries.&lt;br /&gt;&lt;br /&gt;At IBM we’ve look at pretty much all of these issues and found simple approaches to resolving them that fit perfectly well within the bounds of the Atom specs. We’re using APP for a lot of different things, not all of which fall neatly into the original use cases APP was intended to cover. Yes, we had to give certain aspects some careful thought but we generally could not find any showstoppers.&lt;/blockquote&gt;&lt;div&gt;Microsoft subsequently &lt;a href="http://www.25hoursaday.com/weblog/2008/02/28/WindowsLivePlatformNewsMicrosoftStandardizesOnAtomPubForWebServicesAndOtherStories.aspx"&gt;rolled back their plans and gave up on Web3S&lt;/a&gt; and instead switched to using Atom as is. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;If Al is right are right, perhaps the atom-syntax group, Microsoft, IBM, or Google would have defined the meaning of atom:entry inside atom:entry, which appears natural to Al, and included it in their APIs. I can only guess, having hung around atom-syntax and atom-protocol for the last 3 years, that in-lining an entire hierarchy was not a good hypertext-based protocol design approach, just like HTML does not inline all its CSS, images, JS, and embedded objects.&lt;br /&gt;&lt;br /&gt;Perhaps all this evidence will make you see why the approach proposed in &lt;a href="http://www.oracle.com/technology/tech/feeds/spec/draft-divilly-atom-hierarchy.html"&gt;atom-hierarchy I-D&lt;/a&gt; is suitable for what you are trying to achieve. But perhaps CMIS is right in what it is doing. &lt;a href="http://bitworking.org/news/197/In-which-we-narrowly-save-Dare-from-inventing-his-own-publishing-protocol"&gt;Quoting Joe&lt;/a&gt; from the earlier referenced post:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;no one has found the one true hierarchy to rule them all&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;We'll leave it for the future to decide.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-4752953283054933203?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/4752953283054933203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=4752953283054933203&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4752953283054933203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4752953283054933203'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/06/cmis-xv-ignore-good-hypertext-practices.html' title='CMIS XVI: Ignore good hypertext practices at your own risk'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-5020838721128166303</id><published>2009-05-28T16:38:00.000-07:00</published><updated>2009-05-28T17:20:36.876-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='hierarchy'/><category scheme='http://www.blogger.com/atom/ns#' term='Atom'/><title type='text'>CMIS XV: Perils of embedding entry inside entry</title><content type='html'>Recent updates to &lt;a href="http://www.oasis-open.org/committees/download.php/32668/Draft%2062a.zip"&gt;CMIS AtomPub binding&lt;/a&gt; suggest embedding atom:entry directly under atom:entry for in-lining hierarchically related entries. There are two bad consequences of this:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;There is no way to differentiate an entry that has no child entries from the case where the server did not inline the nested entries. &lt;br /&gt;&lt;/li&gt;&lt;li&gt;There is no context in the inlined entry as to its relation to the parent entry. Conversely, it is wrong to appropriate the use of atom:entry inside atom:entry entirely for the purpose of expressing hierarchical relation, because several other possibilities for opportunistic in-ling exist, e.g., replies and via.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The repetition of multiple entries inside an entry means that the benefits of atom:feed as a listing container are lost. &lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-5020838721128166303?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/5020838721128166303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=5020838721128166303&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5020838721128166303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5020838721128166303'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-xvi-perils-of-embedding-entry.html' title='CMIS XV: Perils of embedding entry inside entry'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-8076483967990401081</id><published>2009-05-28T10:54:00.000-07:00</published><updated>2009-06-01T14:10:45.591-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><category scheme='http://www.blogger.com/atom/ns#' term='hierarchy'/><title type='text'>Creating a hierarchy of documents and folders using hierarchy-ID</title><content type='html'>&lt;div&gt;You wouldn't be able to create images and HTML content in a local file system, and, say, store them in a CMIS system, and have all the hyperlinks work just fine. This appears to be a major problem to me as described in my previous post.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the other hand, this would work just fine in AtomPub, provided the server did the right thing and followed the hierarchy-ID. Here's an example:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt; GET /store;contents/&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;200&lt;span style="color:#000000;"&gt; OK&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; Content-Type: application/atom+xml;type=feed&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; Content-Length: nnn&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;feed&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;id&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;4&lt;/span&gt;b01ffb2-91da-4f80-a908-79b66d35db42&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/id&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Folder named "store"&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;link rel="self" href=&lt;span style="color:#b41818;"&gt;"/store;contents/"&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;link rel="up" href=&lt;span style="color:#b41818;"&gt;"/store;metadata"&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;app:collection href="/store;contents/"&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Folder named "store"&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;app:accept ah:role="master"&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;application/atom+xml;type=entry&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/app:accept&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;app:accept ah:role="detail" alternate=&lt;span style="color:#b41818;"&gt;"multipart-related"&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;image/*&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/app:accept&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/app:collection&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;updated&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;2009-01-01&lt;span style="color:#000000;"&gt;T10:&lt;/span&gt;00&lt;span style="color:#000000;"&gt;:&lt;/span&gt;00-07&lt;span style="color:#000000;"&gt;:&lt;/span&gt;00&amp;lt;&lt;span style="color:#000000;"&gt;/updated&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;/feed&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt; POST /store;contents/&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt; Content-Type: application/atom+xml;type=entry&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt; Content-Length: nnn&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt; Slug: images&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #ab1579"&gt;&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;entry&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Image collection for Web site&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;content&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;updated&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;2009-05-26&lt;span style="color:#000000;"&gt;T14:&lt;/span&gt;48&lt;span style="color:#000000;"&gt;:&lt;/span&gt;31.859-07&lt;span style="color:#000000;"&gt;:&lt;/span&gt;00&amp;lt;&lt;span style="color:#000000;"&gt;/updated&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/entry&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;201&lt;/span&gt; Created&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; Location: /store/images;metadata&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; Content-Location: /store/images;metadata&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; Content-Type: application/atom+xml;type=entry&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; Content-Length: nnn&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;entry&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;id&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;4&lt;/span&gt;b01ffb2-91da-4f80-a908-79b66d343b42&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/id&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Image collection for Web site&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;link rel="edit" href=&lt;span style="color:#b41818;"&gt;"/store/images;metadata"&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;link rel="up" href=&lt;span style="color:#b41818;"&gt;"/store;metadata"&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#b41818;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;link rel="down" href=&lt;/span&gt;"/store/images;contents/"&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;summary&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Folder named "images"&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/summary&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;updated&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;2009-05-26&lt;span style="color:#000000;"&gt;T14:&lt;/span&gt;48&lt;span style="color:#000000;"&gt;:&lt;/span&gt;31.859-07&lt;span style="color:#000000;"&gt;:&lt;/span&gt;00&amp;lt;&lt;span style="color:#000000;"&gt;/updated&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;published&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;2009-05-26&lt;span style="color:#000000;"&gt;T14:&lt;/span&gt;50&lt;span style="color:#000000;"&gt;:&lt;/span&gt;31.859-07&lt;span style="color:#000000;"&gt;:&lt;/span&gt;00&amp;lt;&lt;span style="color:#000000;"&gt;/published&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;app:edited&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;2009-05-26&lt;span style="color:#000000;"&gt;T14:&lt;/span&gt;50&lt;span style="color:#000000;"&gt;:&lt;/span&gt;31.859-07&lt;span style="color:#000000;"&gt;:&lt;/span&gt;00&amp;lt;&lt;span style="color:#000000;"&gt;/app:edited&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;/entry&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt; GET /store;contents/&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;200&lt;span style="color:#000000;"&gt; OK&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; Content-Type: application/atom+xml;type=feed&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; Content-Length: nnn&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;feed&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;id&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;4&lt;/span&gt;b01ffb2-91da-4f80-a908-79b66d35db42&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/id&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Folder named "store"&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;link rel="self" href=&lt;span style="color:#b41818;"&gt;"/store;contents/"&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;link rel="up" href=&lt;span style="color:#b41818;"&gt;"/store;metadata"&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;app:collection href="/store;contents/"&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Folder named "store"&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;app:accept ah:role="master"&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;application/atom+xml;type=entry&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/app:accept&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;app:accept ah:role="detail" alternate=&lt;span style="color:#b41818;"&gt;"multipart-related"&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;image/*&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/app:accept&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/app:collection&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;updated&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;2009-05-26&lt;span style="color:#000000;"&gt;T14:&lt;/span&gt;50&lt;span style="color:#000000;"&gt;:&lt;/span&gt;31.859-07&lt;span style="color:#000000;"&gt;:&lt;/span&gt;00&amp;lt;&lt;span style="color:#000000;"&gt;/updated&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;entry&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;id&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;4&lt;/span&gt;b01ffb2-91da-4f80-a908-79b66d343b42&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/id&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Image collection for Web site&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;link rel="edit" href=&lt;span style="color:#b41818;"&gt;"/store/images;metadata"&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;link rel="up" href=&lt;span style="color:#b41818;"&gt;"/store;metadata"&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;link rel="down" href=&lt;span style="color:#b41818;"&gt;"/store/images;contents/"&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;summary&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Folder named "images"&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/summary&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt;     &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;updated&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;2009-05-26&lt;span style="color:#000000;"&gt;T14:&lt;/span&gt;48&lt;span style="color:#000000;"&gt;:&lt;/span&gt;31.859-07&lt;span style="color:#000000;"&gt;:&lt;/span&gt;00&amp;lt;&lt;span style="color:#000000;"&gt;/updated&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt;     &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;published&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;2009-05-26&lt;span style="color:#000000;"&gt;T14:&lt;/span&gt;50&lt;span style="color:#000000;"&gt;:&lt;/span&gt;31.859-07&lt;span style="color:#000000;"&gt;:&lt;/span&gt;00&amp;lt;&lt;span style="color:#000000;"&gt;/published&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt;     &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;app:edited&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;2009-05-26&lt;span style="color:#000000;"&gt;T14:&lt;/span&gt;50&lt;span style="color:#000000;"&gt;:&lt;/span&gt;31.859-07&lt;span style="color:#000000;"&gt;:&lt;/span&gt;00&amp;lt;&lt;span style="color:#000000;"&gt;/app:edited&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/entry&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;/feed&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt; GET /store/images;contents/&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;200&lt;span style="color:#000000;"&gt; OK&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; Content-Type: application/atom+xml;type=feed&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; Content-Length: nnn&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;/p&gt; &lt;p color="#0000ff" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; "&gt;&amp;lt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;feed&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;id&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;4&lt;/span&gt;b01ffb2-91da-4f80-a908-79b66d35db42&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/id&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Folder named "images"&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#b41818;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;link rel="self" href=&lt;/span&gt;"/store/images;contents/"&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#b41818;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;link rel="up" href=&lt;/span&gt;"/store/images;metadata"&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;app:collection href="/store/images;contents/"&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Folder named "images"&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;app:accept ah:role="master"&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;application/atom+xml;type=entry&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/app:accept&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;app:accept ah:role="detail" alternate=&lt;span style="color:#b41818;"&gt;"multipart-related"&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;image/*&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/app:accept&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/app:collection&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;updated&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;2009-05-26&lt;span style="color:#000000;"&gt;T14:&lt;/span&gt;48&lt;span style="color:#000000;"&gt;:&lt;/span&gt;31.859-07&lt;span style="color:#000000;"&gt;:&lt;/span&gt;00&amp;lt;&lt;span style="color:#000000;"&gt;/updated&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;/feed&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt; POST /store/images;contents/&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt; Content-Type: multipart/related;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;          boundary="===============1605871705==";&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;          type="application/atom+xml"&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   Slug: logo.gif&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   MIME-Version: &lt;span style="color:#0000ff;"&gt;1.0&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #ab1579"&gt;&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   Media Post&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   --===============&lt;span style="color:#0000ff;"&gt;1605871705&lt;/span&gt;==&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   Content-Type: application/atom+xml; charset="utf-8"&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   MIME-Version: &lt;span style="color:#0000ff;"&gt;1.0&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #ab1579"&gt;&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;?xml version="1.0"?&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;entry xmlns="http://www.w3.org/2005/Atom"&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Logo image&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;updated&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;2005-10-07&lt;/span&gt;T17:&lt;span style="color:#0000ff;"&gt;17&lt;/span&gt;:&lt;span style="color:#0000ff;"&gt;08&lt;/span&gt;Z&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/updated&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;author&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;name&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Daffy&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/name&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/author&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;summary type="text"&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;         A company logo&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/summary&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;content src="cid:99334422@example.com"&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;              type="image/gif" &lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/entry&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   --===============&lt;span style="color:#0000ff;"&gt;1605871705&lt;/span&gt;==&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   Content-Type: image/gif&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   MIME-Version: &lt;span style="color:#0000ff;"&gt;1.0&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   Content-ID: &lt;span style="color:#0000ff;"&gt;&amp;lt;99334422&lt;/span&gt;@example.com&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #ab1579"&gt;&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   GIF89a...binary image data...&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;   --===============&lt;span style="color:#0000ff;"&gt;1605871705&lt;/span&gt;==--&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; min-height: 15.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;201&lt;/span&gt; Created&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; Location: /store/images/logo.gif;metadata&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; Content-Location: /store/images/logo.gif;metadata&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; Content-Type: application/atom+xml;type=entry&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt; Content-Length: nnn&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;entry&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;id&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;4&lt;/span&gt;b01ffb2-91da-4f80-a908-79c56d343b42&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/id&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;   &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Logo image&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/title&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt; &lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#b41818;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;link rel="edit" href=&lt;/span&gt;"/store/images/logo.gif;metadata"&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#b41818;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;link rel="up" href=&lt;/span&gt;"/store/images;metadata"&lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;updated&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;2005-10-07&lt;/span&gt;T17:&lt;span style="color:#0000ff;"&gt;17&lt;/span&gt;:&lt;span style="color:#0000ff;"&gt;08&lt;/span&gt;Z&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/updated&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;author&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;name&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;Daffy&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/name&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/author&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;summary type="text"&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;         A company logo&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;/summary&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;content src="/store/images/logo.gif"&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;              type=&lt;span style="color:#b41818;"&gt;"image/gif"&lt;/span&gt; &lt;span style="color:#ab1579;"&gt;/&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#0000ff;"&gt;&amp;lt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;updated&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;2009-05-26&lt;span style="color:#000000;"&gt;T14:&lt;/span&gt;58&lt;span style="color:#000000;"&gt;:&lt;/span&gt;31.859-07&lt;span style="color:#000000;"&gt;:&lt;/span&gt;00&amp;lt;&lt;span style="color:#000000;"&gt;/updated&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p color="#0000ff" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; "&gt;&amp;lt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;published&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;2009-05-26&lt;span style="color:#000000;"&gt;T14:&lt;/span&gt;59&lt;span style="color:#000000;"&gt;:&lt;/span&gt;31.859-07&lt;span style="color:#000000;"&gt;:&lt;/span&gt;00&amp;lt;&lt;span style="color:#000000;"&gt;/published&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p color="#0000ff" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; "&gt;&amp;lt;&lt;span style="color:#000000;"&gt;   &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;app:edited&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;2009-05-26&lt;span style="color:#000000;"&gt;T14:&lt;/span&gt;59&lt;span style="color:#000000;"&gt;:&lt;/span&gt;31.859-07&lt;span style="color:#000000;"&gt;:&lt;/span&gt;00&amp;lt;&lt;span style="color:#000000;"&gt;/app:edited&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt; &lt;p color="#0000ff" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; "&gt;&amp;lt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&amp;lt;&lt;span style="color:#000000;"&gt;/entry&lt;/span&gt;&lt;span style="color:#ab1579;"&gt;&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="color: rgb(171, 21, 121);  font-family:Monaco;font-size:11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-8076483967990401081?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/8076483967990401081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=8076483967990401081&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8076483967990401081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8076483967990401081'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/creating-hierarchy-of-documents-and.html' title='Creating a hierarchy of documents and folders using hierarchy-ID'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-1670060006236605805</id><published>2009-05-28T10:34:00.001-07:00</published><updated>2009-05-28T10:43:43.887-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><title type='text'>CMIS XIV: Can't do basic path manipulation? Don't blame AtomPub</title><content type='html'>David Nuscheler pointed out in an offline conversation that he can't do basic content management such as authoring an HTML document with links to images in the form &amp;lt;img src="http://www.blogger.com/images/logo.gif" /&gt; using CMIS. He suspects it is due to AtomPub's approach to server-managed namespace. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To cut the long story short, &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;he is right that CMIS AtomPub seems a lost chance&lt;/span&gt; to address this basic requirement. The CMIS AtomPub draft (revised after so much wrangling over AtomPub interoperability) passively works against the intent of AtomPub mechanisms to support the desired naming and path usage. Here's why I think so:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;It says nothing about the desirability of supporting the AtomPub Slug header when creating new items (whether folders or documents). &lt;/li&gt;&lt;li&gt;It also says nothing about the desirability of hierarchical paths for a certain class of CMIS applications. &lt;/li&gt;&lt;li&gt;It suggests that all content be supplied out-of-line.&lt;/li&gt;&lt;li&gt;It promotes examples such as the following path names that bear no resemblance to the hierarchical arrangement of folders and documents.&lt;p&gt;http://cmisexample.oasis-open.org/rep1/8991ed69-adb9-4833-90a0-504d5338f006 (is the folder child) with the content of this document in http://cmisexample.oasis-open.org/rep1/4b01ffb2-91da-4f80-a908-79b66d35db42&lt;/p&gt;&lt;p&gt;http://cmisexample.oasis-open.org/rep1/151c2ae8-ea3d-4031-b331-08680ac3e607/3 (is the folder entry)&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;In another post I will illustrate how to perform a basic series of AtomPub operations to obtain the desired behavior.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-1670060006236605805?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/1670060006236605805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=1670060006236605805&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/1670060006236605805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/1670060006236605805'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-xiv-cant-do-basic-path.html' title='CMIS XIV: Can&apos;t do basic path manipulation? Don&apos;t blame AtomPub'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-7763582254619781934</id><published>2009-05-26T11:46:00.001-07:00</published><updated>2009-05-26T12:13:02.866-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><category scheme='http://www.blogger.com/atom/ns#' term='WebDAV'/><title type='text'>WebDAV or AtomPub</title><content type='html'>This question is often asked by content managers, whether blogs or otherwise. I often pull together a bunch of links from all over the Web to answer this question. So this time, I thought of summarizing it on my blog. Your comments to correct any mistakes are most welcome.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's my (meek) attempt to contrast and compare the two approaches:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;WebDAV:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Adds 7 new HTTP methods&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Natively understands folders as "collections"&lt;/li&gt;&lt;li&gt;Clients manipulate and control namespace &lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Clients can "parse" URIs to apply semantics of hierarchy&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Supports locking of entire hierarchies&lt;/li&gt;&lt;li&gt;Natively supports relocating and copying document to a different folder&lt;/li&gt;&lt;li&gt;Does not separate modifiable resources from read-only view of resources&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;AtomPub:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;No new HTTP methods&lt;/li&gt;&lt;li&gt;Natively understands listings as "feeds" and modifiable listings as "collections"&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Servers control namespace, clients can make suggestions. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;Clients can navigate to URIs identified in hypertext but not construct these URIs&lt;/li&gt;&lt;li&gt;Natively supports only optimistic concurrency control of single resources&lt;/li&gt;&lt;li&gt;Separates view-only resources from their underlying modifiable resources.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;There is an interesting recent discussion comparing AtomPub and WebDAV in the context of &lt;a href="http://blog.ianbicking.org/2009/01/11/atompub-instead-o-webdav/"&gt;Wiki API&lt;/a&gt;s about the differences. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Bottom line is "&lt;a href="http://intertwingly.net/wiki/pie/WebDav"&gt;use WebDAV if you can&lt;/a&gt;". AtomPub is a simpler technique, but it is also less feature rich. Of course, extensions and other such things will add back some of the features over time, if people like the lightweight foundation of AtomPub.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-7763582254619781934?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/7763582254619781934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=7763582254619781934&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7763582254619781934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7763582254619781934'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/webdav-or-atompub.html' title='WebDAV or AtomPub'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-8774837346290279483</id><published>2009-05-20T10:29:00.000-07:00</published><updated>2009-05-20T10:42:42.195-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='discovery'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><category scheme='http://www.blogger.com/atom/ns#' term='hierarchy'/><category scheme='http://www.blogger.com/atom/ns#' term='Atom'/><title type='text'>Splitting hierarchy I-D</title><content type='html'>Based on the &lt;a href="http://www.imc.org/atom-protocol/mail-archive/msg11341.html"&gt;discussion of hierarchy concepts in Atom&lt;/a&gt; on the atom-protocol list as well as others interested in hierarchical relations in Atom, we have split out the hierarchical navigation and representation portions from the &lt;a href="http://ietf.org/internet-drafts/draft-divilly-atompub-hierarchy-00.txt"&gt;original hierarchy I-D&lt;/a&gt; into a new I-D titled atom-hierarchy. This was done with the intention of achieving consensus on the Atom syntax to be used for parent/child like navigation separately from how such resources are manipulated.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We will continue to edit the new I-D to incorporate new feedback. Both &lt;a href="http://www.ietf.org/internet-drafts/draft-divilly-atom-hierarchy-00.txt"&gt;text&lt;/a&gt; and &lt;a href="http://www.oracle.com/technology/tech/feeds/spec/draft-divilly-atom-hierarchy.html"&gt;HTML&lt;/a&gt; versions of this I-D are available.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, given the &lt;a href="http://www.imc.org/atom-protocol/mail-archive/msg11349.html"&gt;discussion about discovery of AtomPub collections&lt;/a&gt; on the atom-protocol list , it is useful to have a clear path to take as well as guidance about which mechanisms to use under certain conditions. Therefore, we feel that a new RFC is needed to clarify the way in which collections ought to be identified.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some of the material for this RFC is taken from the &lt;a href="http://ietf.org/internet-drafts/draft-divilly-atompub-hierarchy-00.txt"&gt;existing hierarchy I-D&lt;/a&gt;. The idea is that the best practices for collection discovery are best kept separate from new stuff. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;We continue to edit the I-D to incorporate any feedback. Both &lt;a href="http://www.ietf.org/internet-drafts/draft-divilly-atompub-discovery-00.txt"&gt;text&lt;/a&gt; and &lt;a href="http://www.oracle.com/technology/tech/feeds/spec/draft-divilly-atompub-discovery.html"&gt;HTML&lt;/a&gt;versions of this I-D are available.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As a result of these two new submissions, the &lt;a href="http://ietf.org/internet-drafts/draft-divilly-atompub-hierarchy-00.txt"&gt;original hierarchy I-D&lt;/a&gt; is going to be significantly smaller in its scope. We will revise that I-D in the near future, in case you were wondering what would happen to it.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-8774837346290279483?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/8774837346290279483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=8774837346290279483&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8774837346290279483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8774837346290279483'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/splitting-hierarchy-i-d.html' title='Splitting hierarchy I-D'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-7461430006980839938</id><published>2009-05-18T16:48:00.000-07:00</published><updated>2009-05-18T16:54:42.813-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='offline'/><category scheme='http://www.blogger.com/atom/ns#' term='atomdb'/><title type='text'>Write-through Web Caches and GMail</title><content type='html'>Google I/O has a session on a &lt;a href="http://code.google.com/events/io/sessions/GeneralCachingArchitectureOfflineApps.html"&gt;generalized architecture for offline Web applications&lt;/a&gt;. Interestingly it is touting its use of a write-through cache as the basis for this new architecture as you can see from this session description:&lt;div&gt;&lt;blockquote&gt;Puzzled by all the new architectural choices possible when trying to build an offline-capable web application? So were we until we decided to design the newly launched Gmail Mobile Web for iPhone and Android's offline capabilities by analogy with microprocessor caches: offline via a portable write-through caching layer running on either HTML 5 or Gears databases.&lt;/blockquote&gt;We first demonstrated the utility of this architecture in June 2008 by building AtomDB and its recommendations for application architecture. See details in my original post titled: &lt;a href="http://o-micron.blogspot.com/2008/06/mobile-databases-or-write-through-web.html"&gt;Mobile databases or write-through Web caches.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I couldn't be more amused as Gears was initially touting an application-specific switch for offline-ready Web apps, which would be an absolute nightmare for app developers and users. All the best to Google for marketing this new term, which we had coined.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-7461430006980839938?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/7461430006980839938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=7461430006980839938&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7461430006980839938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7461430006980839938'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/write-through-web-caches-and-gmail.html' title='Write-through Web Caches and GMail'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-8373931822155742384</id><published>2009-05-18T16:24:00.000-07:00</published><updated>2009-05-18T16:47:59.642-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><title type='text'>CMIS XIII: Interoperability in AtomPub</title><content type='html'>Sometimes I feel that the CMIS community feels compelled to interoperate at the AtomPub protocol level without knowing why they want to nor fully comprehending what it means to. Therefore, IMHO, despite best intentions they seem to be stumbling on their way to it.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;AtomPub interoperability is elusive -- how many generic AtomPub clients talk to multiple servers constantly? &lt;a href="http://www.imc.org/atom-protocol/mail-archive/msg11371.html"&gt;Brian Smith thinks&lt;/a&gt; there are no standard AtomPub clients and there is no real interoperability in AtomPub. &lt;div&gt;&lt;blockquote&gt;Because an AtomPub server is allowed to do anything it wants in response to a&lt;br /&gt;request, there's no way to write a useful AtomPub client without making many&lt;br /&gt;assumptions about the server's behavior.&lt;/blockquote&gt;&lt;div&gt;In doing so, he falls for the common fallacy in thinking that true interoperability means the client knows exactly what the server can and will do. This is the same fallacy that doomed the features draft after 12 revisions because it tried to specify the whole universe of server behavior interfaced through AtomPub.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://roy.gbiv.com/untangled/"&gt;Roy Fielding&lt;/a&gt; nicely explained &lt;a href="http://www.mailinglistarchive.com/atom-protocol@imc.org/msg08616.html"&gt;what interoperability means in IETF and specifically in AtomPub&lt;/a&gt; was discussed long back in the atom-protocol list (h.t. &lt;a href="https://twitter.com/pkeane"&gt;Peter Keane&lt;/a&gt;). The key takeaway is this:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;Interoperability means that client and server should be able to communicate and understand intentions and responses even if they don't understand the payload.&lt;/blockquote&gt;&lt;/div&gt;It is not trivial to define a standard AtomPub client, but I disagree that there are no standard AtomPub clients. We wrote one and it is called &lt;a href="http://o-micron.blogspot.com/2008/06/mobile-databases-or-write-through-web.html"&gt;AtomDB&lt;/a&gt;. It works with standard and/or extended AtomPub servers. To take a few examples, we work with both blogging servers as well as with GData servers equally well.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-8373931822155742384?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/8373931822155742384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=8373931822155742384&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8373931822155742384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8373931822155742384'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-xiii-interoperability-in-atompub.html' title='CMIS XIII: Interoperability in AtomPub'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-6744836028288889386</id><published>2009-05-18T13:37:00.000-07:00</published><updated>2009-05-18T13:50:16.096-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><title type='text'>CMIS XII: Must-understand signaling in app:accept</title><content type='html'>Since rudimentary AtomPub clients may be unduly surprised when a sophisticated &lt;a href="http://o-micron.blogspot.com/2009/05/cmis-x-is-cmis-good-atompub-citizen.html"&gt;CMIS AtomPub server summarily rejects a POST request&lt;/a&gt; with a hard to understand response. So, it is best to forewarn such clients about the requirements of the server.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To do this, one would need to use a must-understand signaling mechanism in AtomPub, of which there is exactly ONE in standard AtomPub. The &lt;a href="http://tools.ietf.org/html/rfc5023#section-8.3.4"&gt;app:accept&lt;/a&gt; element's content signals to the client what type of content the server is willing to accept. If the request fails because the content does not meet the expectations of the server, a &lt;a href="http://tools.ietf.org/html/rfc5023#section-9.2"&gt;415 response is generated&lt;/a&gt;. This means the rudimentary client can easily understand the sophisticated server. Plus, the sophisticated server now has a means of conveying additional information to the sophisticated client. And, best of all, no permission is needed from anyone at IETF, unlike the &lt;a href="http://tools.ietf.org/html/rfc5023#section-16.6"&gt;registration for "type"&lt;/a&gt;, although an &lt;a href="http://tools.ietf.org/html/rfc4287#section-7"&gt;IANA registration&lt;/a&gt; for the parameter would be good to have.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-6744836028288889386?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/6744836028288889386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=6744836028288889386&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6744836028288889386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6744836028288889386'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-xii-must-understand-signaling-in.html' title='CMIS XII: Must-understand signaling in app:accept'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-6277147923287258422</id><published>2009-05-18T12:12:00.000-07:00</published><updated>2009-06-01T14:10:14.780-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><title type='text'>Advertising entry POST constraints in AtomPub</title><content type='html'>&lt;div&gt;The main question of this post is:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;How can a server advertise additional entry POST processing behavior beyond that specified in AtomPub so that a client is forewarned or better informed?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are two kinds of AtomPub extensions:&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;some provide additional protocol behavior. For example, a &lt;a href="http://tools.ietf.org/html/draft-gregorio-atompub-multipart"&gt;multi-part accepting AtomPub server&lt;/a&gt; may wish to advertise that it can process media entry creation in a single HTTP request. Or a &lt;a href="http://ietf.org/internet-drafts/draft-divilly-atompub-hierarchy-00.txt"&gt;hierarchy managing AtomPub server&lt;/a&gt; may create new collections as a side effect of creating new entries. &lt;/li&gt;&lt;li&gt;some restrict the kind of Atom entries they accept. For example, a &lt;a href="http://code.google.com/apis/finance/developers_guide_protocol.html"&gt;Google Finance server&lt;/a&gt; only accepts new portfolio or transaction entries. A &lt;a href="http://www.oasis-open.org/committees/download.php/32171"&gt;CMIS server&lt;/a&gt; may disallow an entry that does not meet certain typing rules that control the server.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;For the first kind of server, a new kind of client would be required to take advantage of the behavior.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;div&gt;It is the capriciousness of the second kind of server that I worry about and have blogged &lt;a href="http://o-micron.blogspot.com/2009/05/cmis-ii-cmissing-good-old-atompub.html"&gt;here&lt;/a&gt; and &lt;a href="http://o-micron.blogspot.com/2009/05/cmis-x-is-cmis-good-atompub-citizen.html"&gt;here&lt;/a&gt;. The basic problem is that a client would not know whether an AtomPub server will cooperate or not. Of course, there are very few guarantees in the AtomPub world, and co-operation is not one of them. However, to make a good citizen out of an extende AtomPub server would be an important thing to fret about. Don't you agree?&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The main effect of the approach taken to address the above need is on standard AtomPub clients which are not limited to a single server's behavior. In other words, a specialized GData client will understand Google's extensions for multi-part POST, but is there a way this kind of behavior can be advertised and understood by the client. Is there a case where a client should desist from making POST requests if it encounters a server that is too restrictive to work with the rudimentary AtomPub client?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;Solutions:&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The main server behavior advertisement in AtomPub is the content of  app:collection, i.e., app:accept and app:categories. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The basic question is whether, for standard AtomPub clients that don't understand any extensions, there is benefit to receiving better app:accept advertisements. In other words, is there some additional information about app:accept that will help clients better determine whether a request is likely to be accepted by the server. I know there is no must-understand extension mechanism for app:collection, so I don't know what would be the best alternative:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Use a new MIME type parameter on app:accept for the Atom entry content type&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Use a new attribute on app:accept&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Use an extension element in app:collection to identify CMIS requirements&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Use the app:categories with a link to an AtomPub category document&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-6277147923287258422?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/6277147923287258422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=6277147923287258422&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6277147923287258422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6277147923287258422'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/advertising-entry-constraints-in.html' title='Advertising entry POST constraints in AtomPub'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-5135455440380322857</id><published>2009-05-14T23:20:00.000-07:00</published><updated>2009-06-01T14:12:38.239-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><title type='text'>CMIS XI: Why I would reorganize the AtomPub extensions</title><content type='html'>I have been pretty aggressive in pointing out issues with &lt;a href="http://www.oasis-open.org/committees/download.php/32171"&gt;CMIS's AtomPub bindings&lt;/a&gt; and personally do not like the way it has been written. Why? I feel it is loosely written, even for a pre-release draft, and it leaves too many interoperability issues arising from editorial standards that would be discovered rather late. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have written in both the W3C style (see the &lt;a href="http://o-micron.blogspot.com/2009/04/bitsy-050-develop-seamlessly-on-lineoff.html"&gt;BITSY proposal&lt;/a&gt;) and the IETF style (see the &lt;a href="http://o-micron.blogspot.com/2009/05/hierarchy-in-atompub.html"&gt;hierarchy-ID&lt;/a&gt;). I will be the first to admit that some of the technical details of my proposal might be in error. However, those errors got pointed out and corrected very early in the cycle. Nevertheless, I haven't gone through enough of these cycles myself to understand the benefits or shortcomings of either, I have a strong feeling that readers like the terseness of either specs as that creates tighter specs, as long as the concepts are well explained and examples used. There is way too much repetition in the current CMIS AtomPub draft to pass muster at my shop.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So instead of moaning and griping about the current CMIS AtomPub bindings draft, one would question - how would you do it instead? Although fortunately, no one has asked that question, I figured I better have an answer in case someone did. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span class="fullpost"&gt;&lt;div&gt;But before sketching a proposal, let me state my goals of reorganizing the content: &lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;It should illustrate CMIS's use of AtomPub since it is an AtomPub variant, not a brand new protocol.&lt;/li&gt;&lt;li&gt;It should avoid duplication of link relation values. The link relation "repository" is defined/explained identically at least 17 times plus once in the IANA registration. It is a different matter that this particular registration may never take place as "service" might replace "repository" or for some other reason. Other relations are not much better and may occur up to one dozen times. May be it is just me, but I fail to see how this style is of benefit to anyone. Ideally, one place where you describe the model, one place where you define it, and a registration. It should be pretty much an exercise in inference about where you may use which links.&lt;/li&gt;&lt;li&gt;It does not clearly state how interoperability is to be achieved with standard AtomPub clients, an issue I have highlighted &lt;a href="http://o-micron.blogspot.com/2009/05/cmis-vs-atompub-hierarchy-i-d.html"&gt;here&lt;/a&gt;, &lt;a href="http://o-micron.blogspot.com/2009/05/cmis-ii-cmissing-good-old-atompub.html"&gt;here&lt;/a&gt;, &lt;a href="http://o-micron.blogspot.com/2009/05/cmis-vi-case-of-unpredictable-relations.html"&gt;here&lt;/a&gt;, and &lt;a href="http://o-micron.blogspot.com/2009/05/cmis-x-is-cmis-good-atompub-citizen.html"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Although AtomPub clearly defines Collection, Entry, Media Resource, and Feed resources and the standard operations that can be performed on each, there is a fair amount of duplication going on in the CMIS AtomPub bindings draft. Instead, the spec should only define any additional restrictions for each CMIS resource mapping to an AtomPub resource.&lt;/li&gt;&lt;li&gt;The draft should define the meanings of various special arguments used as query parameters in one place instead of scattering them all over the document and repeating the explanations a dozen or so times. As an example, the exact same text for "filter Argument" is repeated 13 times across the draft. The draft should spend far more time on encodings and allowed content than it currently does. If certain attributes have repository-specific syntaxes, this draft should not even introduce them.&lt;/li&gt;&lt;li&gt;The whole notion of allowable actions very likely could be collapsed in to the Allows HTTP header. I have not had the chance to fully understand that, but certainly some effort should be expended towards that direction.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;If this is an early draft, then less is more. I wouldn't push a hard-to-review draft and disclaim reviewers comments saying that this is an early draft. Again, may be its only me, but I get the feeling that this draft would have a pretty hard time getting anywhere, if it were not OASIS. &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-5135455440380322857?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/5135455440380322857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=5135455440380322857&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5135455440380322857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5135455440380322857'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-xi-why-i-would-reorganize-atompub.html' title='CMIS XI: Why I would reorganize the AtomPub extensions'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-86564378629958924</id><published>2009-05-14T09:23:00.000-07:00</published><updated>2009-05-14T09:36:09.853-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><title type='text'>CMIS X: Is CMIS a good AtomPub citizen?</title><content type='html'>CMIS has consumed a lot of my blog space for a good reason. Hierarchy is quite important to CMIS and we (&lt;a href="http://cdivilly.wordpress.com/"&gt;Colm Divilly&lt;/a&gt; and I) have spent a great deal of time on it. Despite having pointed out several issues in this blog, I can't beat the feeling that CMIS is determined to go its own way at the slightest hint of inconvenience. &lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Firstly, despite the &lt;a href="http://o-micron.blogspot.com/2009/05/cmis-viii-futile-to-model-atom-using.html"&gt;futility of modeling Atom with an XSD&lt;/a&gt;, CMIS insists on it whether it is informational, mandatory, or illustrative for tooling. Additionally, when probed about AtomPub interoperability with the &lt;a href="http://www.oasis-open.org/committees/download.php/32171"&gt;binding for CMIS&lt;/a&gt;, here's what &lt;a href="http://lists.oasis-open.org/archives/cmis/200905/msg00113.html"&gt;the editor has to say&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Helvetica;font-size:12px;"&gt;&lt;blockquote type="cite"&gt;&lt;tt&gt;The spec states it is repository specific what happens when a non atom entry media type or atom entry media type without cmis info is POST'ed to a collection.  It suggests that the repository may create an instance of a document of a default type.&lt;/tt&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;What this means is that whether a CMIS server works with a non-CMIS client is upto the server to decide. This is what I posted about in &lt;a href="http://o-micron.blogspot.com/2009/05/cmis-ii-cmissing-good-old-atompub.html"&gt;CMIS II: (C)MISsing good old AtomPub.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you leave it to individual CMIS servers to decide whether they support non-CMIS AtomPub clients, then this is not true interoperability. &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-86564378629958924?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/86564378629958924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=86564378629958924&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/86564378629958924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/86564378629958924'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-x-is-cmis-good-atompub-citizen.html' title='CMIS X: Is CMIS a good AtomPub citizen?'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-4150349761302369157</id><published>2009-05-13T13:00:00.001-07:00</published><updated>2009-05-13T13:32:35.478-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>CMIS IX: Confused loyalties - CMIS or AtomPub</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;In a previous post, I complained that I &lt;a href="http://o-micron.blogspot.com/2009/05/cmis-ii-cmissing-good-old-atompub.html"&gt;miss good old AtomPub&lt;/a&gt; when working with CMIS servers. One of the reasons is duplication of key information items of Atom in a CMIS property set. One of my colleagues reported an issue to the CMIS TC for &lt;a href="http://tools.oasis-open.org/issues/browse/CMIS-98"&gt;CMIS properties that duplicate APP/ATOM information&lt;/a&gt;. Duplication produces two problems as any good DBA will tell you:&lt;div&gt;&lt;ol&gt;&lt;li&gt;Wasted resources&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Missed updates&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;Let me illustrate what would happen if the &lt;a href="http://tools.oasis-open.org/issues/browse/CMIS-98?focusedCommentId=10165&amp;amp;page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#action_10165"&gt;editor's proposal to resolve the issue&lt;/a&gt; (to which the TC agreed) (emphasis mine) were to be applied:&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class="action-body"&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 0, 0);"&gt;I'd like to keep the duplicated info. Originally we did remove the duplicated fields: id, createdby, etc. However, that made some properties special and could not be updated in the same way - by setting a cmis property field. Also, it became less obvious on how to search on those fields.&lt;br /&gt;&lt;br /&gt;I do think an order of processing should be stated: &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;cmis:property is authoritative if present, then atompub&lt;/span&gt; (or vice-versa). &lt;br /&gt;&lt;br /&gt;The bandwidth cost of having that info in two places is not that significant in my opinion.&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;Now take the case where a vanilla AtomPub client is working with a CMIS server. It attempts to update an existing document entry and changes the content of the &lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;atom:entry/atom:updated&lt;/span&gt; field but does not change the &lt;span class="Apple-style-span"   style="color: rgb(0, 0, 34);   font-family:Trebuchet;font-size:14px;"&gt;&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;atom:entry/atom:published&lt;/span&gt; and&lt;span class="Apple-style-span"  style=" ;font-family:'courier new';"&gt;atom:entry/cmis:object/cmis:properties/cmis:propertyDateTime[cmis:name=UpdateDate]/cmis:value&lt;/span&gt;&lt;/span&gt; then, the server will silently ignore the update if CMIS comes first.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, &lt;a href="http://www.oasis-open.org/committees/download.php/32171"&gt;version 0.61c1 of the AtomPub bindings for CMIS&lt;/a&gt; states:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="color: rgb(102, 0, 0);"&gt;When POSTing an Atom Document, the atom fields take precedence over the CMIS property field for writeable properties.  For example, atom:title will overwrite cmis:name&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;If this does make it to the final version of the spec, then all will be forgotten, although I do think that this little footnote deserves greater attention.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hope the lessons from my analysis of CMIS prove useful for the numerous activities (e.g., &lt;a href="http://kenai.com/projects/suncloudapis/pages/Home"&gt;SunCloud&lt;/a&gt;, &lt;a href="http://code.google.com/apis/gdata"&gt;GData&lt;/a&gt;, &lt;a href="http://developer.netflix.com/docs/REST_API_Conventions"&gt;Netflix&lt;/a&gt;) currently underway to develop AtomPub interfaces to various applications. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-4150349761302369157?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/4150349761302369157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=4150349761302369157&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4150349761302369157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4150349761302369157'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-ix-confused-loyalties-cmis-or.html' title='CMIS IX: Confused loyalties - CMIS or AtomPub'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-5839098577486752735</id><published>2009-05-13T10:39:00.000-07:00</published><updated>2009-06-01T14:16:11.148-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>Atom: Multiple links with same rel value</title><content type='html'>The &lt;a href="http://tools.ietf.org/html/rfc4287"&gt;Atom syntax RFC&lt;/a&gt; stays away from specifying too many restrictions on the &lt;span cstyle="font-family:'courier new';"&gt;atom:link &lt;/span&gt;element, which is quite useful in a number of scenarios. Here are two that are of immediate value:&lt;div&gt;&lt;ol&gt;&lt;li&gt;Atom neither prohibits content inside the link element nor ascribes any particular meaning to it. The &lt;a href="http://o-micron.blogspot.com/2009/05/hierarchy-in-atompub.html"&gt;hierarchy-ID&lt;/a&gt; uses this behavior to allow servers to inline the content of a particular kind of link, with &lt;span  style="font-family:'courier new';"&gt;rel=detail&lt;/span&gt;, inside the link element. &lt;b&gt;This example has been updated to be valid by the RNG Atom schema.&lt;/b&gt; For example:&lt;p&gt;&lt;code&gt;&amp;lt;entry xmlns="..." xmlns:h=".../"&gt;&lt;br /&gt;&amp;lt;title&gt;A master entry&amp;lt;/title&gt;&lt;br /&gt;&amp;lt;id&gt;...&amp;lt;/id&gt;&lt;br /&gt;&amp;lt;updated&gt;...&amp;lt;/updated&gt;&lt;br /&gt;&amp;lt;author&gt;&amp;lt;name&gt;John Doe&amp;lt;/name&gt;&amp;lt;/author&gt;&lt;br /&gt;&amp;lt;content&gt;Some text.&amp;lt;/content&gt;&lt;br /&gt;&amp;lt;link rel="self" href="/collection/master1"/&gt;&lt;br /&gt;&amp;lt;link rel="edit" href="/collection/master1"/&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&amp;lt;link rel="detail"&lt;br /&gt;  href="/collection/master1/collection"&gt;&lt;br /&gt;  &amp;lt;h:inline count="0"&gt;&lt;br /&gt;    &amp;lt;feed xmlns:app="..."&gt;&lt;br /&gt;      &amp;lt;id&gt;...&amp;lt;/id&gt;&lt;br /&gt;      &amp;lt;app:collection&lt;br /&gt;         href="/collection/master1/collection"&gt;&lt;br /&gt;     &amp;lt;title&gt;Detail collection&amp;lt;/title&gt;&lt;br /&gt;     &amp;lt;app:accept h:role="detail"&gt;&lt;br /&gt;        application/atom+xml;type=entry&lt;br /&gt;     &amp;lt;/app:accept&gt;&lt;br /&gt;   &amp;lt;/app:collection&gt;&lt;br /&gt;   &amp;lt;link rel="self"&lt;br /&gt;      href=""/collection/master1/collection"/&gt;&lt;br /&gt;  &amp;lt;/feed&gt;&lt;br /&gt;&amp;lt;/h:inline&gt;&lt;br /&gt;&amp;lt;/link&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/entry&gt;&lt;/code&gt;&lt;/p&gt;The highlighted portion shows an empty detail feed inlined in the master entry. This saves a round-trip and invents minimal new markup.&lt;/li&gt;&lt;li&gt;Another use arises when a certain link is repeated a number of times. For example, &lt;a href="http://www.oasis-open.org/committees/cmis/charter.php"&gt;CMIS&lt;/a&gt; shows a good number of such examples where a single folder entry can have children of four different kinds - policies, relationships, documents, and descendants. In another example, this time using &lt;a href="http://developer.netflix.com/docs/REST_API_Conventions"&gt;Netflix REST API&lt;/a&gt;, a Netflix title entry can have children of 7 different kinds - awards, directors, cast, screen formats, episodes, seasons, languages. Each different kind leads to its own feed/collection. So instead of creating dozens of new application specific relation registrations that have no use in any applications besides the one that create them, just provide for a new attribute on &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;atom:link&lt;/span&gt; elements to distinguish the kind of content in that link. &lt;span style="text-decoration: line-through"&gt;Heck we could even use the atom's category term attribute for this.&lt;/span&gt; Here's an example demonstrating my point.&lt;p&gt;&lt;code&gt;&amp;lt;entry xmlns="..." xmlns:h=".../"&gt;&lt;br /&gt;&amp;lt;title&gt;A folder entry&amp;lt;/title&gt;&lt;br /&gt;&amp;lt;id&gt;...&amp;lt;/id&gt;&lt;br /&gt;&amp;lt;updated&gt;...&amp;lt;/updated&gt;&lt;br /&gt;&amp;lt;author&gt;&amp;lt;name&gt;John Doe&amp;lt;/name&gt;&amp;lt;/author&gt;&lt;br /&gt;&amp;lt;content src="..."/&gt;&lt;br /&gt;&amp;lt;link rel="self" href="/folder;metadata"/&gt;&lt;br /&gt;&amp;lt;link rel="edit" href="/folder;metadata"/&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;br /&gt;&amp;lt;link rel="detail" type="application/atom+xml;type=feed"&lt;br /&gt;title="Folder children collection"&lt;br /&gt;href="/folder;contents/" h:kind="contents"&gt;&lt;br /&gt;&amp;lt;h:inline count="0"/&gt;&lt;br /&gt;&amp;lt;/link&gt;&lt;br /&gt;&amp;lt;link rel="detail" type="application/atom+xml;type=feed"&lt;br /&gt;title="Folder relationships collection"&lt;br /&gt;href="/folder;relationships/" h:kind="relationships"&gt;&lt;br /&gt;&amp;lt;h:inline count="0"/&gt;&lt;br /&gt;&amp;lt;/link&gt;&lt;br /&gt;&amp;lt;link rel="related" type="application/atom+xml;type=feed"&lt;br /&gt;title="Folder descendants feed"&lt;br /&gt;href="/folder;descendants/" h:kind="descendants"&gt;&lt;br /&gt;&amp;lt;h:inline count="0"/&gt;&lt;br /&gt;&amp;lt;/link&gt;&lt;br /&gt;&amp;lt;link rel="detail" type="application/atom+xml;type=feed"&lt;br /&gt;title="Folder policy collection"&lt;br /&gt;href="/folder;policies/" h:kind="policies"&gt;&lt;br /&gt;&amp;lt;h:inline count="0"/&gt;&lt;br /&gt;&amp;lt;/link&gt; &lt;/span&gt;&lt;br /&gt;&amp;lt;/entry&gt;&lt;/code&gt;&lt;/p&gt;This approach does away with creating new IANA registrations and allows the API developer to control the semantics of the term associated with &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rel=detail&lt;/span&gt; links. Google already uses repeating links with the same rel value in their &lt;a href="http://code.google.com/apis/documents/docs/1.0/developers_guide_protocol.html#ListFolderContents"&gt;Google Documents API&lt;/a&gt;. They use &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rel="http://schemas.google.com/docs/2007#parent"&lt;/span&gt;, but the point is that there is an alternative to inventing new rel values, especially when no new Atom data model semantics are involved.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;UPDATE: Julian corrected me in the comments below. So the second example uses &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;h:kind&lt;/span&gt; instead of Atom's &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;term&lt;/span&gt; attribute.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;UPDATE 2: Albert corrected me in the comments below. So the examples above are corrected and do not introduce Atom markup directly under atom:link elements.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-5839098577486752735?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/5839098577486752735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=5839098577486752735&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5839098577486752735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5839098577486752735'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/atom-multiple-links-with-same-rel-value.html' title='Atom: Multiple links with same rel value'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-7244647325434304213</id><published>2009-05-12T16:58:00.000-07:00</published><updated>2009-05-12T17:15:53.359-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='Atom'/><title type='text'>CMIS VIII: Futile to model Atom using XSD</title><content type='html'>The &lt;a href="http://www.oasis-open.org/committees/download.php/32171"&gt;CMIS AtomPub bindings&lt;/a&gt; include a W3C schema for XML, aka XSD for Atom, in a file called atom.xsd. I wanted to warn potential users of that schema about the perils of validating against that schema.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First of all, &lt;a href="http://www.asahi-net.or.jp/~eb2m-mrt/atomextensions/atomextensions.html"&gt;Atom's syntax has been specified using RNG&lt;/a&gt;. There are &lt;a href="http://www.atomenabled.org/feedvalidator/"&gt;programmatic Atom validators&lt;/a&gt; to ascertain whether an Atom document meets the requirements of RFC4287. There  is a very good reason to not use XSD for modeling Atom - its open extension model.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you have done any application programming with Atom formats, you would know that Atom allows foreign mark-up to be used anywhere (pretty much). That means you can arbitrarily interleave the elements from Atom's namespace with those from a foreign namespace. XSD does not have any mechanism to allow this. For example, in the document below, the highlighted mark up could occur anywhere except after the entry close tag:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;/code&gt;&lt;/div&gt;&lt;code&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Helvetica;font-size:12px;"&gt;&lt;pre&gt;&lt;span class="Apple-style-span"   style="font-family:Helvetica;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: normal; font-size:12px;"&gt;&amp;lt;feed xmlns="http://www.w3.org/2005/Atom" xmlns:f="http://example.com"&gt; &amp;lt;title&gt;Example Feed&amp;lt;/title&gt;&lt;br /&gt;&amp;lt;link href="http://example.org/"/&gt;&lt;br /&gt;&amp;lt;updated&gt;2003-12-13T18:30:02Z&amp;lt;/updated&gt;&lt;br /&gt;&amp;lt;author&gt;&lt;br /&gt;&amp;lt;name&gt;John Doe&amp;lt;/name&gt;&lt;br /&gt;&amp;lt;/author&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&amp;lt;f:foreign&gt;something&amp;lt;f:foreign&gt;&lt;br /&gt;&lt;/span&gt;&amp;lt;id&gt;urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6&amp;lt;/id&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="Apple-style-span"   style="font-family:Helvetica;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: normal; font-size:12px;"&gt;&amp;lt;entry&gt;&lt;br /&gt;&amp;lt;title&gt;Atom-Powered Robots Run Amok&amp;lt;/title&gt;&lt;br /&gt;&amp;lt;link href="http://example.org/2003/12/13/atom03"/&gt;&lt;br /&gt;&amp;lt;id&gt;urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a&amp;lt;/id&gt;&lt;br /&gt;&amp;lt;updated&gt;2003-12-13T18:30:02Z&amp;lt;/updated&gt;&lt;br /&gt;&amp;lt;summary&gt;Some text.&amp;lt;/summary&gt;&lt;br /&gt;&amp;lt;/entry&gt;&lt;br /&gt;&amp;lt;/feed&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;/code&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;The only restriction on foreign markup is that it cannot occur directly under the feed element anywhere after the first entry element. I highlighted a problem in CMIS with this concept in a previous blog post that explains why &lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;&lt;a href="http://o-micron.blogspot.com/2009/05/cmis-vii-has-more-items-and-paging.html"&gt;hasMoreItems&lt;/a&gt;&lt;/span&gt;&lt;a href="http://o-micron.blogspot.com/2009/05/cmis-vii-has-more-items-and-paging.html"&gt; results in invalid Atom&lt;/a&gt; documents.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-7244647325434304213?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/7244647325434304213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=7244647325434304213&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7244647325434304213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7244647325434304213'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-viii-futile-to-model-atom-using.html' title='CMIS VIII: Futile to model Atom using XSD'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-202801556807178617</id><published>2009-05-12T16:43:00.000-07:00</published><updated>2009-05-12T16:58:50.736-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><title type='text'>CMIS VII: hasMoreItems and paging</title><content type='html'>In the example for folder children included with the &lt;a href="http://www.oasis-open.org/committees/download.php/32171"&gt;AtomPub bindings for CMIS&lt;/a&gt;, I noticed a weird thing just before the end of the document:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;/code&gt;&lt;/div&gt;&lt;code&gt;&lt;/code&gt;&lt;div&gt;&lt;code&gt;&lt;div&gt;    ...&lt;/div&gt;&lt;div&gt;  &amp;lt;/ns3:entry&gt;&lt;/div&gt;&lt;div style="font-weight:bold"&gt;  &amp;lt;ns1:hasMoreItems&gt;false&amp;lt;/ns1:hasMoreItems&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/ns3:feed&gt;&lt;/div&gt;&lt;/code&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;    &lt;/div&gt;&lt;/div&gt;&lt;div&gt;Now Atom's liberal content model allows various kinds of foreign markup. However, Atom very carefully prevents any foreign markup from occurring at the end of a list of entries. In other words, it is illegal to put anything in a feed document after the first entry besides another entry element. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That means if you want to indicate that this feed document is the last in a series of pages containing the children of a folder, that foreign markup has to come before the first entry in the feed document.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Alternatively, just use &lt;a href="http://www.ietf.org/rfc/rfc5005"&gt;Atom paging and archiving&lt;/a&gt; and be done with it. In fact, &lt;a href="http://tools.ietf.org/html/rfc5023#section-10.1"&gt;AtomPub has its own paging&lt;/a&gt;, if that meets the needs of CMIS (no reason why it can't).&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-202801556807178617?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/202801556807178617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=202801556807178617&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/202801556807178617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/202801556807178617'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-vii-has-more-items-and-paging.html' title='CMIS VII: hasMoreItems and paging'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-3908176110662327384</id><published>2009-05-12T16:09:00.000-07:00</published><updated>2009-05-12T16:36:16.768-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><title type='text'>CMIS VI: A case of unpredictable relations</title><content type='html'>In &lt;a href="http://www.oasis-open.org/committees/download.php/32171"&gt;CMIS AtomPub extensions&lt;/a&gt;, an entry may optionally specify two relations:&lt;div&gt;&lt;ol&gt;&lt;li&gt;If this is a folder entry, it only specifies children link if it actually has children&lt;/li&gt;&lt;li&gt;If this is a folder or document entry, it only specifies parent link if a parent exists.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;There is a basic problem with this approach. Suppose that a folder is empty, i.e., has no children. How can I find out the URL to which I can POST an entry to create a document? Ideally, this should be solved in the manner proposed by &lt;a href="http://o-micron.blogspot.com/2009/05/hierarchy-in-atompub.html"&gt;hierarchy-ID&lt;/a&gt; where a link with &lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;rel="detail"&lt;/span&gt; is automatically created for folder type of entries. Thereby, if a folder is empty, its detail link would produce a feed with no entries, but include enough information to describe that the collection that produced the feed, i.e., the folder resource, is willing to receive new entries and the URL at which a POST request will result in a new document entry being added to the folder would also be disclosed. Here's what I mean in terms of concrete syntax:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;entry&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;title&gt;Folder metadata&amp;lt;/title&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;link rel="self" href="/a;metadata"/&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;link rel="edit" href="/a;metadata"/&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;link rel="children" href="/a/" title="document children collection"/&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;id&gt;tag:example.org;2009:1&amp;lt;/id&gt;&lt;/div&gt;&lt;div&gt;  ...&lt;/div&gt;&lt;div&gt;&amp;lt;/entry&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;feed&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;title&gt;Folder contents&amp;lt;/title&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;link rel="self" href="/a/"/&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;link rel="parent" href="/a;metadata"/&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;id&gt;tag:example.org;2009:1-1&amp;lt;/id&gt;&lt;/div&gt;&lt;div&gt;  ...&lt;/div&gt;&lt;div&gt;  &amp;lt;app:collection href="/a/"&gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;title&gt;Folder collection&amp;lt;/title&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;/app:collection&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/feed&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This mechanism works in all cases (for parent and children relations), is auto-discoverable and hence works beautifully with standard AtomPub clients.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One thing to notice here is that I am using a link to the parent folder entry from the folder children feed. Since CMIS allows the possibility that an implementation may or may not allow multiple parents, the optimization for a single parent system is that the parent link returns an entry as opposed to a feed with a single parent entry. This makes it possible for a client to know that it cannot create more parents. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On a related note, I found that the parent link is optional for document entries. What does it mean for a document to not have a parent? It sounds like another major headache for clients (especially those who are synchronizing for disconnected use) to know under what conditions certain entries will outlive their parent folders.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-3908176110662327384?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/3908176110662327384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=3908176110662327384&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/3908176110662327384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/3908176110662327384'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-vi-case-of-unpredictable-relations.html' title='CMIS VI: A case of unpredictable relations'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-721642786482376104</id><published>2009-05-12T15:45:00.000-07:00</published><updated>2009-05-12T16:09:12.397-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><title type='text'>CMIS V: Semantics of multi-parent document entries</title><content type='html'>First a disclaimer: I haven't read the CMIS domain model completely, but I think I understand the premise broadly.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CMIS allows a document to be hard-linked from several folders. Therefore the same document entry may occur in several folder children feeds. The &lt;a href="http://www.oasis-open.org/committees/download.php/32171"&gt;CMIS AtomPub extension&lt;/a&gt; spec does not clarify whether the entry occurring in different folder feeds corresponding to a shared document is the exact same Atom entry. (&lt;a href="http://www.ietf.org/rfc/rfc4287.txt"&gt;Atom uniquely identifies entries&lt;/a&gt; using the atom:id element.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's take an example. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;feed&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;link rel="self" href="/a/b"/&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;id&gt;tag:example.org,2009:1&amp;lt;/id&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;entry&gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;id&gt;tag:example.org,2009:2&amp;lt;/id&gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;link rel="edit" href="/a/1"/&gt;&lt;/div&gt;&lt;div&gt;    &amp;amp;content src="..." type="..."/&gt;&lt;/div&gt;&lt;div&gt;    ...&lt;/div&gt;&lt;div&gt;  &amp;lt;/entry&gt;&lt;/div&gt;&lt;div&gt;  ...&lt;/div&gt;&lt;div&gt;&amp;lt;/feed&gt;&lt;/div&gt;&lt;div&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;code&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;feed&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;link rel="self" href="/a/c"/&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;id&gt;tag:example.org,2009:3&amp;lt;/id&gt;&lt;/div&gt;&lt;div&gt;  &amp;lt;entry&gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;id&gt;tag:example.org,2009:2&amp;lt;/id&gt;&lt;/div&gt;&lt;div&gt;    &amp;lt;link rel="edit" href="/a/1"/&gt;&lt;/div&gt;&lt;div&gt;    &amp;amp;content src="..." type="..."/&gt;&lt;/div&gt;&lt;div&gt;    ...&lt;/div&gt;&lt;div&gt;  &amp;lt;/entry&gt;&lt;/div&gt;&lt;div&gt;  ...&lt;/div&gt;&lt;div&gt;&amp;lt;/feed&gt;&lt;/div&gt;&lt;div&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If by some deduction we find out that both representations above are of collection feeds, then it is going to raise some questions for AtomPub. I have not seen two completely different collections claiming membership of the same entry.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;In any case, another unaddressed issue with shared documents is what happens when one of the folders containing it is DELETEd. The behavior specified in Section 3.4.5.4.2.4 is silent about this matter. One of the problems of the CMIS model is that it extends Atom's semantic model and creates encumbrances across collections. AtomPub steers clear of this problem, but CMIS will need to address this issue as it defines a specific data model that includes this problem.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-721642786482376104?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/721642786482376104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=721642786482376104&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/721642786482376104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/721642786482376104'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-v-semantics-of-multi-parent.html' title='CMIS V: Semantics of multi-parent document entries'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-3086467685206466181</id><published>2009-05-12T15:06:00.000-07:00</published><updated>2009-05-12T15:38:27.486-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><title type='text'>CMIS III: Gratuitous CMIS markup on Atom elements</title><content type='html'>I never quite understood the need to enlist the help of &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;cmis:id&lt;/span&gt; on &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;atom:link&lt;/span&gt; elements, which is called for in Section 3.2 of &lt;a href="http://www.oasis-open.org/committees/download.php/32171"&gt;AtomPub bindings for CMIS&lt;/a&gt;. There are prominent signals about its importance, but no justification of its needs in AtomPub link relations.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example, here's what a &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;atom:link&lt;/span&gt; element would look like if generated by a CMIS server:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;&amp;lt;atom:link rel="repository" cmis:id="..." href="..." type="application/atomsvc+xml"/&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CMIS AtomPub extensions make the presence of &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;cmis:id&lt;/span&gt; mandatory, which is yet another encumbrance on using existing AtomPub clients.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even though this requirement looks silly, I was disappointed that the editors of the spec did not follow up with examples that showed the use of &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;cmis:id.&lt;/span&gt; For example, the document entry example in the specification package does not use cmis:id on any of the links including for relations introduced by CMIS.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-3086467685206466181?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/3086467685206466181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=3086467685206466181&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/3086467685206466181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/3086467685206466181'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-iii-gratuitous-cmis-markup-on-atom.html' title='CMIS III: Gratuitous CMIS markup on Atom elements'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-3973306966534111138</id><published>2009-05-12T14:49:00.001-07:00</published><updated>2009-05-12T15:45:20.041-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><title type='text'>CMIS IV: Confusing feeds and collections</title><content type='html'>CMIS AtomPub extension does not see any difference between feeds and collections, even though they are vastly different in Atom's data model. A feed is a representation of a resource whereas a collection is a resource and it defines the methods (and its semantics) and representations that can be exchanged with it. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CMIS provides &lt;a href="http://o-micron.blogspot.com/2009/05/ccmis-atompub-binding-and-atompub.html"&gt;a queer AtomPub service document&lt;/a&gt; that contains among other things:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;A collection with &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;cmis:collectionType="rootchildren"&lt;/span&gt; that is aimed at holding the folders and documents that are lodged in the root folder.&lt;/li&gt;&lt;li&gt;A second collection with &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;cmis:collectionType="rootdescendants"&lt;/span&gt; that is aimed at holding all the folders and documents in that repository.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;It is perfectly fine to have two such feeds, but, IMHO, it makes no sense to have two such collections. In fact it makes no sense to have any collection of descendants. There can only be a feed of descendants. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To draw an analogy to a simple file-system perspective, there is no such thing as adding a file to the recursive listing of a directory. You can only add a file to a directory.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, since a CMIS server is going to end up creating such a large number of collections, it makes sense to adopt &lt;a href="http://o-micron.blogspot.com/2009/05/discovering-atompub-collections-best.html"&gt;a standard mechanism for discovering collections backing feeds&lt;/a&gt; and their metadata like how we describe in the &lt;a href="http://o-micron.blogspot.com/2009/05/hierarchy-in-atompub.html"&gt;hierarchy-ID&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-3973306966534111138?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/3973306966534111138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=3973306966534111138&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/3973306966534111138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/3973306966534111138'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-iii-confusing-feeds-and.html' title='CMIS IV: Confusing feeds and collections'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-2702397688278006791</id><published>2009-05-12T12:22:00.000-07:00</published><updated>2009-05-12T15:36:49.544-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><title type='text'>CMIS I: AtomPub binding and AtomPub service documents</title><content type='html'>&lt;div&gt;This is the beginning of a new series of posts on the still-nascent &lt;a href="http://www.oasis-open.org/committees/download.php/32171"&gt;AtomPub binding of CMIS&lt;/a&gt;. Although, this spec has been seen by over 20 companies (led by &lt;a href="http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=cmis"&gt;IBM, Microsoft, and EMC&lt;/a&gt; that are participating in its TC) over six months now, I doubt anyone involved in writing this spec has ever written an &lt;a href="http://ietf.org/rfc/rfc5023.txt"&gt;AtomPub&lt;/a&gt; server or client.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;The section 3.4.2 of the CMIS AtomPub "binding" specification is quite illogical if you follow through these arguments:&lt;div&gt;&lt;ol&gt;&lt;li&gt; A repository is represented by an Atom service document.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Within the Atom service document, each workspace maps to a single repository.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Firstly, there is no such thing as an Atom service document. The spec is referring to an AtomPub service document.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Secondly, if Repository &lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;≊&lt;/span&gt; Service Document and Service Document contains multiple workspaces, then how can each workspace &lt;span class="Apple-style-span"  style="font-size:x-large;"&gt;≊&lt;/span&gt; Repository? May be the spec should have stated that the AtomPub service document corresponding to a CMIS repository MUST contain exactly one workspace.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thirdly, the CMIS spec says nothing about the constraints on what kind of entries the server can accept into its various collections. This is information that is typically advertised in the AtomPub service document. Two things can be currently specified in this:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;What MIME type of data is acceptable to the server for adding to the collection&lt;/li&gt;&lt;li&gt;What categories are acceptable to be used on entries being posted.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;For a moment, disregard the second part since AtomPub's use of categories is the worst thing about RFC 5023. At least the CMIS spec should state how the first part is to be addressed. Here's what could be a decent CMIS service document:&lt;/div&gt;&lt;div&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;service xmlns="..." xmlns:cmis="..."&gt;&lt;br /&gt;  &amp;lt;workspace&gt;&lt;br /&gt;    &amp;lt;collection cmis:collectionType="rootchildren"&gt;&lt;br /&gt;      &amp;lt;atom:title atom="..."&gt;Root children collection&amp;lt;/atom:title&gt;&lt;br /&gt;      &amp;lt;accept&gt;application/atom+xml;type=entry&amp;lt;/accept&gt;&lt;br /&gt;      &amp;lt;accept&gt;text/*&amp;lt;/accept&gt;&lt;br /&gt;      &amp;lt;accept&gt;image/*&amp;lt;/accept&gt;&lt;br /&gt;      ...&lt;br /&gt;    &amp;lt;collection&gt;...&amp;lt;/collection&gt;&lt;br /&gt;  &amp;lt;/workspace&gt;&lt;br /&gt;&amp;lt;service&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This example states that the collection can accept new entries (for example, creating new folders). Unless the CMIS spec requires this, there is no means to address introspection needs of AtomPub clients. The example above also shows how documents could be created as well that are either images or text. &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CMIS TC has &lt;a href="http://www.imc.org/atom-syntax/mail-archive/msg20988.html"&gt;invited comments from the AtomPub community&lt;/a&gt; on this spec but the spec provides no examples of their use of AtomPub. If they went through this exercise, they would find a number of such illogical things that I am going to highlight in a multi-part blog series.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Stay tuned...&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-2702397688278006791?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/2702397688278006791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=2702397688278006791&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/2702397688278006791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/2702397688278006791'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/ccmis-atompub-binding-and-atompub.html' title='CMIS I: AtomPub binding and AtomPub service documents'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-5989922729685869947</id><published>2009-05-12T11:42:00.000-07:00</published><updated>2009-05-12T14:48:09.569-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><title type='text'>CMIS II: (C)MISsing good old AtomPub</title><content type='html'>In my earlier &lt;a href="http://o-micron.blogspot.com/2009/05/cmis-vs-atompub-hierarchy-i-d.html"&gt;post on AtomPub vs. CMIS&lt;/a&gt;, I expressed concern that &lt;a href="http://www.oasis-open.org/committees/download.php/32171"&gt;new constraints on Atom syntax introduced by CMIS&lt;/a&gt; go so far as to rule out using a standard AtomPub client with a CMIS AtomPub server. In theory, one could say that adding a new required element to Atom's schema is a non-starter. However, if there is a desire for CMIS servers to support standard AtomPub clients, then the current spec is quite far from that goal.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Let's see the consequences of new constraints on the AtomPub and Atom syntax used by CMIS servers. A non-CMIS client will be unable to talk to CMIS even for use cases so simple as adding a document to a folder. Consider the following request to the root folder of a CMIS repository:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;code&gt;POST /folder&lt;br /&gt;Content-Type: application/atom+xml&lt;br /&gt;Content-Length: nnn&lt;br /&gt;&lt;br /&gt;&amp;lt;entry xmlns="..."&gt;&lt;br /&gt;  &amp;lt;id/&gt;&lt;br /&gt;  &amp;lt;content type="text"&gt;&lt;br /&gt;    Can I live inside CMIS?&lt;br /&gt;  &amp;lt;/content&gt;&lt;br /&gt;  &amp;lt;updated&gt;...&amp;lt;/updated&gt;&lt;br /&gt;&amp;lt;/entry&gt;&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Even though the CMIS AtomPub "binding" doesn't state this clearly, and is a fantastic example of how NOT to write a RESTful specification, in my understanding the above request will fail with a 400 status code (not clear which one). This is because:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://o-micron.blogspot.com/2009/05/ccmis-atompub-binding-and-atompub.html"&gt;CMIS doesn't state acceptable content&lt;/a&gt; in an AtomPub understandable manner anywhere. &lt;/li&gt;&lt;li&gt;Even if it were to advertise accepted content, a compliant CMIS AtomPub server could reject a POSTed entry if it did not meet CMIS expectations. Thus you could not expect the server to take the text from the atom:content element and save it as the document content. I am basing this on reading the following paragraph in Section 3.4.4.3.2.2:&lt;ul&gt;&lt;li&gt;&lt;p&gt;The behavior is repository specific when a non-(atom/cmis)-entry document is posted to a folder URI.  For example, the repository MAY auto-create a document with a specific type (document) the client could edit.  The repository MAY also throw an exception.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Nowhere does the document state what makes a valid CMIS/Atom entry document. As a saving grace, the specification package includes an example document entry. This example uses out-of-line content and an edit-media link element.&lt;/li&gt;&lt;li&gt;Let's assume that the server allows our entry through and creates a new document using it. Now the entry that is stored is full of duplicate information. &lt;ol&gt;&lt;li&gt;The content stream location is in two places: &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;atom:entry/atom:content@src&lt;/span&gt; and &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;atom:entry/atom:link[rel=stream]@href&lt;/span&gt;&lt;/li&gt;&lt;li&gt;The time when the entry was created is in two places: &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;atom:entry/atom:published&lt;/span&gt; and &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;atom:entry/cmis:object/cmis:properties/cmis:propertyDateTime[cmis:name=CreationDate]/cmis:value&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Also repeated is information such as &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;atom:entry/atom:id&lt;/span&gt;, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;atom:entry/atom:author&lt;/span&gt; and &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;atom:entry/atom:updated&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;There is more material for many more posts. So stay tuned...&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-5989922729685869947?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/5989922729685869947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=5989922729685869947&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5989922729685869947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5989922729685869947'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-ii-cmissing-good-old-atompub.html' title='CMIS II: (C)MISsing good old AtomPub'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-7806018199780794567</id><published>2009-05-11T09:10:00.000-07:00</published><updated>2009-05-11T09:32:00.471-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><category scheme='http://www.blogger.com/atom/ns#' term='best practice'/><title type='text'>Discovering AtomPub Collections - best current practices</title><content type='html'>When working with &lt;a href="http://o-micron.blogspot.com/2008/07/uniform-data-synchronization-for-mobile.html"&gt;data synchronization using Atom feeds in AtomDB&lt;/a&gt;, we frequently encounter situations where we learn about a feed simply through its public URL. However, most feed documents do not provide any indication of whether new items can be added to them. (This is not because of a lack of existing standards but because existing standards are either not well known or are unsuitable.)&lt;br /&gt;&lt;br /&gt;Some assume that if a feed is generated from some well known AtomPub server, then it must be modifiable. Of course, specialized AtomPub clients, such as for &lt;a href="http://o-micron.blogspot.com/2009/05/cmis-vs-atompub-hierarchy-i-d.html"&gt;CMIS&lt;/a&gt;, dealing with specific feeds can always use out-of-band communication to figure this out. The problem is that standard AtomPub clients that are provided only a feed URL have no way of figuring out such assumptions.&lt;br /&gt;&lt;br /&gt;There are two alternatives:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.imc.org/atom-syntax/mail-archive/msg20560.html"&gt;James Snell has suggested the use of "&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rel=service&lt;/span&gt;"&lt;/a&gt; but that tends to not be present on any of the feeds we see. It is mainly designed for use in HTML pages for discovering AtomPub services. &lt;/li&gt;&lt;li&gt;&lt;a href="http://tools.ietf.org/html/rfc5023#section-8.3.5"&gt;Section 8.3.5 of RFC5023&lt;/a&gt; specifies the semantics of an &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;app: collection&lt;/span&gt; element appearing as a child of &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;atom:feed&lt;/span&gt; element. This mechanism is very useful to us for discovering whether a feed is modifiable and, if so, how it may be modified using AtomPub. It helps in situations where there are far too many feeds to be enumerated in a service document as well as where an implementation does not use AtomPub service documents. Lotus Connections uses this approach in its feeds (among other non-standard apporaches).&lt;/li&gt;&lt;/ol&gt;James Snell also suggests &lt;a href="http://www.imc.org/atom-protocol/mail-archive/msg11352.html"&gt;using &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;app:collection&lt;/span&gt; inside of &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;atom:entry&lt;/span&gt;&lt;/a&gt; elements. Lotus Connections does this in its feeds. However, per &lt;a href="http://tools.ietf.org/html/rfc5023#section-8.3.5"&gt;8.3.5 of RFC 5023&lt;/a&gt; there is no meaning ascribed to putting &lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;app:collection&lt;/span&gt; in &lt;span class="Apple-style-span" style="font-family: 'courier new';"&gt;atom:entry&lt;/span&gt; documents. So I am not sure it has any standard interpretation at the moment.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The downside of the first approach is that it requires a round-trip to find enough metadata about editing the feed. Another problem is that if collections are programmatically produced, the service/workspace/collection metaphor easily breaks down. This part of AtomPub is the least suitable for application feeds as evidenced by their absence in AtomPub usage within GData, OpenSocial, as well as Netflix APIs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The downside of the second approach is that it is repeated in every feed document, and hence consumes more resources. Secondly, this approach is a little verbose and wouldn't be understood at all in HTML documents.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-7806018199780794567?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/7806018199780794567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=7806018199780794567&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7806018199780794567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7806018199780794567'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/discovering-atompub-collections-best.html' title='Discovering AtomPub Collections - best current practices'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-891581979122999240</id><published>2009-05-08T09:57:00.000-07:00</published><updated>2009-05-08T14:39:44.106-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='extension'/><category scheme='http://www.blogger.com/atom/ns#' term='CMIS'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><category scheme='http://www.blogger.com/atom/ns#' term='hierarchy'/><title type='text'>CMIS vs. AtomPub Hierarchy I-D</title><content type='html'>Led by Microsoft, IBM, and EMC, OASIS has been working on a modern &lt;a href="http://www.oasis-open.org/committees/cmis/charter.php"&gt;standard for content management systems, called CMIS&lt;/a&gt;. This group has started from a submission made by the above three vendors called &lt;a href="http://community.emc.com/community/labs/cmis"&gt;CMIS v0.5&lt;/a&gt;. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This standard also includes a "binding for REST/Atom". In layman terms a binding is an adaptation of the abstract standard to a specific network protocol and format. Julian Reschke suggested that we hash out the overlap between &lt;a href="http://www.oasis-open.org/committees/download.php/32171"&gt;CMIS AtomPub extensions&lt;/a&gt; and the&lt;a href="http://o-micron.blogspot.com/2009/05/hierarchy-in-atompub.html"&gt; AtomPub hierarchy-ID&lt;/a&gt;. Here's a summary of the most important areas of disconnect.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CMIS genuinely tries to provide a good &lt;a href="http://www.ietf.org/rfc/rfc5023.txt"&gt;AtomPub&lt;/a&gt; extension, but fails on at least three counts:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Link relations defined by CMIS cannot be used by a client that does not understand CMIS. So if you would like to have parent-child relations but don't want to put a &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;cmis:id&lt;/span&gt; attribute (yes, that is a SHOULD level requirement), then you are out of luck. On the contrary, &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rel=master&lt;/span&gt; and &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rel=detail&lt;/span&gt; from &lt;a href="http://www.ietf.org/internet-drafts/draft-divilly-atompub-hierarchy-00.txt"&gt;hierarchy-ID&lt;/a&gt; do not impose any additional requirements.&lt;/li&gt;&lt;li&gt;There is no way to auto-discover the POST url for a feed. For example, you obtained a list of documents in a folder and now want to add another document to that folder. Without understanding &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rel=repository&lt;/span&gt; and &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;cmis:collectionType&lt;/span&gt;, there is no way to do that. On the contrary, &lt;a href="http://www.ietf.org/internet-drafts/draft-divilly-atompub-hierarchy-00.txt"&gt;hierarchy-ID&lt;/a&gt; will be understood even by existing AtomPub clients, and these clients will be able to add another item next to the existing document.&lt;/li&gt;&lt;li&gt;The CMIS spec defines PUT and DELETE methods on an &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;atom:feed&lt;/span&gt; type resource (yes, see Section 3.4.5.4 and 3.4.5.6). I would imagine that the CMIS spec would need to go to IETF for doing something like this because they are in effect extending the semantics of the &lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;application/atom+xml;type=feed&lt;/span&gt; MIME type. No such extraordinary extension is going on in &lt;a href="http://www.ietf.org/internet-drafts/draft-divilly-atompub-hierarchy-00.txt"&gt;hierarchy-ID&lt;/a&gt; and this ID is before the IETF for consideration.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Now, we have every intention of engaging the CMIS to help them understand the consequences of these issues, namely a monolith hanging off a lean protocol that can only be used for content management and improving the use of existing AtomPub metadata for doing simple things like discovering the URL for modifying a feed. Whether that will have any useful outcome is anyone's guess.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-891581979122999240?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/891581979122999240/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=891581979122999240&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/891581979122999240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/891581979122999240'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/cmis-vs-atompub-hierarchy-i-d.html' title='CMIS vs. AtomPub Hierarchy I-D'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-8924770306600908990</id><published>2009-05-05T11:09:00.000-07:00</published><updated>2009-09-17T09:29:44.918-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IETF'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><category scheme='http://www.blogger.com/atom/ns#' term='hierarchy'/><category scheme='http://www.blogger.com/atom/ns#' term='feeds'/><title type='text'>Hierarchy in AtomPub</title><content type='html'>We have &lt;a href="http://ietf.org/internet-drafts/draft-divilly-atompub-hierarchy-00.txt"&gt;submitted the AtomPub hierarchy I-D&lt;/a&gt; to IETF for consideration along Standards Track. Although there is no working group looking at extensions to Atom or AtomPub, and there is &lt;a href="http://bitworking.org/news/425/atompub-is-a-failure"&gt;not so good feeling &lt;/a&gt;about the future of AtomPub, there seems to be a very good use for Atom and AtomPub for document-oriented data.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.feedbooks.com/"&gt;Feedbooks&lt;/a&gt; is &lt;a href="http://blog.feedbooks.com/?p=231"&gt;planning to use the hierarchy approach&lt;/a&gt; (hat tip &lt;a href="http://twitter.com/pkeane"&gt;Peter Keane&lt;/a&gt;) described in the I-D in its future versions, which means there will be greater usage experience to go around and improve future revisions of this I-D.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-8924770306600908990?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/8924770306600908990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=8924770306600908990&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8924770306600908990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8924770306600908990'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/05/hierarchy-in-atompub.html' title='Hierarchy in AtomPub'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-7302660124792017137</id><published>2009-04-27T13:51:00.000-07:00</published><updated>2009-04-27T14:03:56.039-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bitsy'/><category scheme='http://www.blogger.com/atom/ns#' term='query'/><category scheme='http://www.blogger.com/atom/ns#' term='URI template'/><category scheme='http://www.blogger.com/atom/ns#' term='atomdb'/><category scheme='http://www.blogger.com/atom/ns#' term='offline REST'/><category scheme='http://www.blogger.com/atom/ns#' term='shoji'/><title type='text'>Getting to Offline Web data via BITSY</title><content type='html'>&lt;div&gt;There are probably two camps of developers interested in WebStorage - one that develop local applications and another that develop offline-ready applications. The first camp doesn't really care for the data that lives on the server; it is just a back up of the data that lives locally. The second camp has tons of data that is shared among users and was previously only available in a connected mode. The first camp probably doesn't deal with HTTP or REST abstractions for their data but the second one has to deal with the HTTP interface to data as well as situations in which offline access to that data is required.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For the second category, IMHO, it may be better to focus on getting the right HTTP abstractions emulated locally for offline purposes. If people are going to need to upgrade their browsers for off-line use, then might as well provide them one that will allow them to run an "embedded REST server" within the browser. I mean let people write their own server emulation logic in JavaScript using whatever storage that's available to them in the browser, whether it is key-value pair or SQLite or another, and serve offline requests over the same interface that the server does - HTTP and URL.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have a proposal before the Webapps WG at W3C to consider adding JavaScript interceptors to enable various kinds of offline operations to take place without necessitating any standards about the SQL storage and access.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; Ideally, combine my proposal with something Atom-like but more query-friendly, such as &lt;a href="http://www.aminus.org/rbre/shoji/shoji-draft-01.txt"&gt;Shoji&lt;/a&gt;, which allows a rich set of queries using &lt;a href="http://bitworking.org/projects/URI-Templates/spec/draft-gregorio-uritemplate-03.txt"&gt;URI Templates&lt;/a&gt;. I haven't fully understood Shoji or verified that it would work well for specifying and processing queries that are in the 80% scenario, so I am going out on a limb there.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-7302660124792017137?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/7302660124792017137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=7302660124792017137&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7302660124792017137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7302660124792017137'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/04/getting-to-offline-web-data-via-bitsy.html' title='Getting to Offline Web data via BITSY'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-6039503281046168452</id><published>2009-04-27T09:33:00.000-07:00</published><updated>2009-07-09T09:13:22.210-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bitsy'/><category scheme='http://www.blogger.com/atom/ns#' term='dojo offline'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><category scheme='http://www.blogger.com/atom/ns#' term='gears'/><title type='text'>How is BITSY different (from HTML, Dojo Offline, Gears, WebStorage)?</title><content type='html'>&lt;div&gt;Just last week I released a new draft version of BITSY that dramatically reduced its scope to provide simple primitives that can be used with different formats and protocols. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That this continues to raise the basic question - how's it different from everything out there - is an interesting problem in and of itself. This question has been asked several times on the &lt;a href="http://lists.w3.org/Archives/Public/public-webapps"&gt;public-webapps ML&lt;/a&gt; (&lt;a href="http://lists.w3.org/Archives/Public/public-webapps/2008AprJun/0335.html"&gt;Maciej Stachowiak&lt;/a&gt;, &lt;a href="http://lists.w3.org/Archives/Public/public-webapps/2008AprJun/0336.html"&gt;Kris Zyp&lt;/a&gt;, &lt;a href="http://lists.w3.org/Archives/Public/public-webapps/2008OctDec/0110.html"&gt;Mike Smith&lt;/a&gt;, &lt;a href="http://lists.w3.org/Archives/Public/public-webapps/2009AprJun/0155.html"&gt;Jonas Sicking&lt;/a&gt;, and &lt;a href="http://lists.w3.org/Archives/Public/public-webapps/2009AprJun/0349.html"&gt;Anne van Kesteren&lt;/a&gt;) in a few different contexts. So I am trying to summarize the answers here for future reference.&lt;/div&gt;&lt;h3&gt;Contrasting with ApplicationCache in HTML5&lt;/h3&gt;&lt;div&gt;The HTML5 ApplicationCache is one specific use case of providing a durable, read-only offline store of HTTP resources inside the browser. The browser is itself a client of the offline cache and uses a specialized protocol to perform caching of application resources such as JPG, HTML, CSS, and JS files. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A special file format is used to convey the required resources and a special versioning scheme is used to move from one version of files to another in an atomic manner. That way you wouldn't have an old JS file and a new HTML page. It is critical for browsers to have this atomicity, but that is not necessarily the case with other applications running inside browsers. Their needs are more dynamic and their behavior in failure scenarios is more flexible than a browser's internal offline store.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;ApplicationCache does not allow programmatic inclusion of items (&lt;a href="http://lists.w3.org/Archives/Public/public-html/2009Jan/0287.html"&gt;dynamic entries were removed&lt;/a&gt; some time ago); all data capture in BITSY is through an API, i.e., as a dynamic entry&lt;/li&gt;&lt;li&gt;ApplicationCache does not secure one user's private resources from another; BITSY requires the presence of a specified cookie&lt;/li&gt;&lt;li&gt;ApplicationCache only responds to GET and HEAD requests; BITSY can respond to arbitrary HTTP requests&lt;/li&gt;&lt;li&gt;ApplicationCache does not allow an application to intercept any requests locally; BITSY allows application-defined JavaScript code to intercept requests locally&lt;/li&gt;&lt;li&gt;ApplicationCache uses its own data format for identifying items for local storage and exludes any other formats such as JSON and Atom; BITSY does not have any format limitations&lt;/li&gt;&lt;li&gt;ApplicationCache operates per its own refresh protocol and that excludes a different protocol, especially one that does not require all or nothing semantics for data versioning; BITSY has no protocol limitations.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;h3&gt;Contrasting with Gears LocalServer&lt;/h3&gt;&lt;div&gt;Gears is quite close to BITSY's primitives in terms of dynamic entries and capturing locally generated data. However, it is primarily a means of serving read-only requests for applications.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;LocalServer only responds to GET and HEAD requests; BITSY can respond to arbitrary HTTP requests locally&lt;/li&gt;&lt;li&gt;LocalServer does not allow an application to intercept any requests locally; BITSY allows application-defined JavaScript code to intercept requests locally&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;h3&gt;Contrasting with Dojo's Offline Toolkit &lt;a href="http://www.sitepen.com/blog/2008/09/23/effortless-offline-with-offlinerest/"&gt;OfflineRestStore&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;For one, you will need to cede all data access logic to the library, in this case Dojo, in order to use offline serving. This would be true of any other library. However data is not always used in this way. Your  HTTP caching choice should be independent of your data access library.&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Dojo offline API provides a means of logging pending network requests and accessing data through a special API (that is different from page navigation, XHR, or other kinds of network requests originating in a browser); BITSY does not require any special API for data access because it is present in every HTTP access path. &lt;/li&gt;&lt;li&gt;Requests are queued for immediate delivery to the server, even if connectivity is available. This means that your normal path is always local, even if you didn't want to. &lt;a href="http://www.oracle.com/technology/tech/feeds/spec/bitsy.html#review-policy"&gt;BITSY's review policy&lt;/a&gt; means that the normal path is not affected when browser is connected.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Dojo switches between the network and local store based on the &lt;code&gt;navigator.onLine&lt;/code&gt; property; BITSY can use any intelligence available about battery power, connection latency and bandwidth, location, and so on to decide whether to perform a network operation or satisfy a request locally. Heck, it can even pin the app request to the local store to get maximum responsiveness.&lt;/li&gt;&lt;li&gt;When using the OfflineRest Dojo API, an application cannot emulate the server. Using BITSY's interceptors, a complete server can be emulated inside the browser.&lt;/li&gt;&lt;li&gt;Dojo cannot store non-textual data such as images or video; BITSY allows capture of arbitrary server-hosted resources&lt;/li&gt;&lt;li&gt;OfflineRest can replay PUT, POST, and DELETE requests, provided they all do the thing Persevere understands. If you wanted to use a different semantic or if you need to use extended HTTP methods, you are out of luck.&lt;/li&gt;&lt;li&gt;Dojo's synchronization protocol is internal to its OfflineRest implementation. That makes it hard to resolve conflicts or adapt to your server's requirements. With BITSY, there are no limitations on how to synchronize. It might be a little daunting, but it means any library developer can take advantage and build a suitable sync library. &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-6039503281046168452?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/6039503281046168452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=6039503281046168452&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6039503281046168452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6039503281046168452'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/04/how-is-bitsy-different-from-html-dojo.html' title='How is BITSY different (from HTML, Dojo Offline, Gears, WebStorage)?'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-1986913512435562510</id><published>2009-04-24T15:13:00.000-07:00</published><updated>2009-07-09T09:11:53.611-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bitsy'/><category scheme='http://www.blogger.com/atom/ns#' term='sync'/><category scheme='http://www.blogger.com/atom/ns#' term='offline'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='atomdb'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>BITSY 0.5.0 - Develop seamlessly on-line/off-line Web applications</title><content type='html'>We have been working for a while to make it possible to perform HTTP processing from within JavaScript code. This means that you can deal with off-line situations as well as improve responsiveness and availability of applications.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now we have a new draft of &lt;a href="http://www.oracle.com/technology/tech/feeds/spec/bitsy.html"&gt;BITSY, version 0.5.0&lt;/a&gt;, which explains exactly how you can &lt;a href="http://www.blogger.com/2008/07/uniform-data-synchronization-for-mobile.html"&gt;seamlessly access data on-line and off-line&lt;/a&gt; using application-supplied interceptors. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This draft is based on the availability of pluggable protocol handlers available in Safari (&lt;a href="http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSURLProtocol_Class/Reference/Reference.html"&gt;NSURLProtocol&lt;/a&gt;), Internet Explorer's (&lt;a href="http://msdn.microsoft.com/en-us/library/aa767916%28VS.85%29.aspx"&gt;URLMon&lt;/a&gt;), and Firefox (&lt;a href="http://www.blogger.com/2009/02/overriding-default-http-behavior-in.html"&gt;nsIHttpChannel and nsIHttpProtocolHandler&lt;/a&gt;). We have developed an implementation of this new BITSY draft for Safari and Firefox for Linux, MacOS, and Windows platforms as a browser plug-in.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In a major distinction from &lt;a href="http://www.oracle.com/technology/tech/feeds/pdf/oracle%20atomdb.pdf"&gt;AtomDB&lt;/a&gt;, the implementation of BITSY 0.5.0 is completely independent of Atom and XML. This allows custom HTTP-based protocols to be combined with transparent off-line data access and manipulation. To test BITSY, we have developed JavaScript libraries for &lt;a href="http://bitworking.org/news/250/RFC-5023-The-Atom-Publishing-Protocol"&gt;Atom Publishing Protocol&lt;/a&gt; based synchronization. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now you can perform your own RESTful data synchronization or create and distribute libraries of RESTful data synchronization. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-1986913512435562510?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/1986913512435562510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=1986913512435562510&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/1986913512435562510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/1986913512435562510'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/04/bitsy-050-develop-seamlessly-on-lineoff.html' title='BITSY 0.5.0 - Develop seamlessly on-line/off-line Web applications'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-4107721478903861181</id><published>2009-04-13T16:26:00.000-07:00</published><updated>2009-07-09T09:11:38.481-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Limiting access to locally persistent data</title><content type='html'>Sam Ruby worries about &lt;a href="http://intertwingly.net/blog/2009/04/09/Abusing-Web-Storage?#c1239665162"&gt;security of locally persistent data&lt;/a&gt;, for example, in &lt;a href="http://dev.w3.org/html5/webstorage/"&gt;WebStorage&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;Having a Web Storage mechanism will enable people like me, who aren’t security experts, to design applications which capture more sensitive data which could be exposed with the right XSS attack.&lt;/blockquote&gt;A sane way to protect locally persistent data is to try and protect it the same way server resident data is protected. For example, if an authentication token is required in the form of a cookie to access protected parts of the site, the same token must be good to protect data that came from those protected parts.&lt;br /&gt;&lt;br /&gt;Let's work through this example:&lt;br /&gt;&lt;br /&gt;Some JavaScript requests URL X from its server. GET X&lt;br /&gt;Server challenges the browser for auth. 401 WWW-Authenticate: Cookie form-action="/login?redirect=X"&lt;br /&gt;Browser shows the form-action page. GET /login?redirect=X&lt;br /&gt;User enters credentials and submits the form. POST /login/do&lt;br /&gt;Server checks credentials and responds with the redirect and an auth token. 303 Set-Cookie: C=Y, Location =X&lt;br /&gt;Browser redirects to the original location along with the cookie. GET X Cookie: C=Y&lt;br /&gt;&lt;br /&gt;Now when the page asks browser for persistent storage, it should be able to identify the cookie used to secure the data stored locally. For example:&lt;br /&gt;&lt;br /&gt;window.createDatabase('myDB', 'C').&lt;br /&gt;&lt;br /&gt;The browser automatically uses the current value of the cookie 'C' to restrict access to 'myDB'. Next time, when I access 'myDB' by doing:&lt;br /&gt;&lt;br /&gt;window.openDatabase('myDB', 'C')&lt;br /&gt;&lt;br /&gt;then the browser verifies that the current value of cookie 'C' is the same as that recorded when 'myDB' was created. If it is not, the request would fail.&lt;br /&gt;&lt;br /&gt;My proposal, in effect, is to ensure that data access can only take place if the authorization token that the server verified in order to provide the private data is, in fact, present at the time of accessing that same data.&lt;br /&gt;&lt;br /&gt;This protects against scenarios where different directories are protected differently on the server. It also avoids asking the JS code any questions about the current value of a cookie and does not pass any cookie values to the JS code.&lt;br /&gt;&lt;br /&gt;Of course, if the cookie goes bad after a while, the locally persistent data is also useless. Unless the local data is somehow flushed out to the server periodically, this could be a big deal. Otherwise, you can just refresh from the server using the current auth token and go from there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-4107721478903861181?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/4107721478903861181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=4107721478903861181&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4107721478903861181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4107721478903861181'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/04/limiting-access-to-locally-persistent.html' title='Limiting access to locally persistent data'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-3267480773183686264</id><published>2009-04-13T15:57:00.000-07:00</published><updated>2009-07-09T09:11:15.524-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='sync'/><category scheme='http://www.blogger.com/atom/ns#' term='offline'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Web Storage needs Free/Open/Simple Sync as well</title><content type='html'>Persistent storage on Web clients, especially where augmenting data stored on server, MUST be friendly for synchronization. This is the golden rule for offline applications that we have learnt from 10 years of offline CRM applications in Siebel (now Oracle).&lt;br /&gt;&lt;br /&gt;SQL has done nothing to make it easier to sync unless you are willing to pay $$ to license complex sync software. Why can't we make simpler sync software for Web? Well the answer to that question lies in our ability to simplify data access abstractions in Web applications. Sync/offline can be made easy, cheap, and automatic if the following are acceptable:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Identify data through URL&lt;/li&gt;&lt;li&gt;Operate on data with HTTP methods&lt;/li&gt;&lt;li&gt;Provide JavaScript interception on XHR (just like Apple provides Objective-C interception on NSURLRequest and URLMON provides Asynchronous Pluggable Protocol).&lt;/li&gt;&lt;/ol&gt;At Oracle, we have a working implementation of all three for Firefox 3 and Safari, which when combined with a generally acceptable query language can provide an easy to sync, secure, persistent storage solution. This approach is biased towards document-oriented data models, which REST and Web are already predisposed towards. Moreover, it does not require extensive synchronization software to be buried inside the database itself. Unlike CouchDB whose synchronization code lives alongside the db itself, synchronization in our implementation is performed in JavaScript thus giving as much or as little sync flexibility as required.&lt;br /&gt;&lt;br /&gt;Oracle can make this technology available to anyone who likes this approach over the current DIY sync and at-your-own-risk SQL storage available in some browsers. Contact me if you would like to know more about this or get your hands on the technology or develop an alternative to the current storage mess in Web browsers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-3267480773183686264?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/3267480773183686264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=3267480773183686264&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/3267480773183686264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/3267480773183686264'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/04/persistent-storage-on-web-clients.html' title='Web Storage needs Free/Open/Simple Sync as well'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-1295036023851381499</id><published>2009-04-12T22:53:00.001-07:00</published><updated>2009-07-09T09:10:53.963-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><category scheme='http://www.blogger.com/atom/ns#' term='client'/><title type='text'>To SQL or not to SQL - that is the question</title><content type='html'>Members of the Web apps WG of W3C are debating what access model is appropriate for persistent storage on Web clients. HTML5 WD [1] used to include a section on "Structured client-side storage" until February this year. Then, after a long discussion on the scope of the draft, Ian Hickson carved out various pieces including persistent storage to their own separate spec drafts.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;The &lt;a href="http://dev.w3.org/html5/webstorage/"&gt;current editor's draft&lt;/a&gt; of WebStorage continues the model from HTML5's previous working draft of SQL/relational access. This was intended to build upon the &lt;a href="https://developer.mozilla.org/en/mozIStorageService"&gt;SQL support available in Mozilla&lt;/a&gt; as a non-standard component as well as the inclusion of &lt;a href="http://code.google.com/apis/gears/api_database.html"&gt;SQL storage in Google Gears&lt;/a&gt;. Even the iPhone and BlackBerry browsers provide SQL storage inside Web browsers based on an a previous version of WebStorage.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;In March, the Ian Hickson of the Web Storage draft made a request for publishing his draft as a FPWD to the &lt;a href="http://www.w3.org/2008/webapps/charter/"&gt;Web apps WG whose charter&lt;/a&gt; includes "Offline APIs and Structured Storage for enabling local access to Web application resources when not connected to a network." This is at variance to the abstract of the current editor's draft of Web Storage which states that the spec includes an API for "a database system with a &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;SQL&lt;/span&gt; frontend." (emphasis mine)&lt;br /&gt;&lt;br /&gt;A discussion on the use of SQL in a data access API and its open-ended nature has been going on over at the public-webapps mailing list. The main pro- and con- points of the discussion are:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;There is no definition of what constitutes SQL in the API.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The only two public implementations of this API - WebKit and Gears - and both are using SQLite, whose implementation doesn't conform to any public SQL standards.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Basing the standard on a limited SQLite syntax (and semantics) compromises interop&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There is a need to consider other options for structured data management. Some of those named are OODB, jLINQ, CouchDB, Persevere. Among query techniques come - JSONQuery (similar to XQuery &amp;amp; XPath, but for JSON), and CouchDB's view mechanisms.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Providing access to multiple different database mechanisms via a single API does not solve the original problem that there is no standard vocabulary for any one of them.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The behavior of a simple o&lt;a href="http://lists.w3.org/Archives/Public/public-webapps/2009AprJun/0130.html"&gt;perator such as equality test is different for different implementations&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Even though there is "no such thing as standard SQL", it is not clear that inventing a brand new query language and database model for Web clients' structured storage is better.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Since applications are beginning to use the SQL storage in browsers, there must be something good about it. So let's just hash out the details and get this done.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Since very few use an OODB, it would not meet the requirements of Web Storage&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There's lots of competence and experience with SQL out there. And there's something to be said for the fact that SQL has proven itself as a usable language at this point. I doubt that we could design a language that cover as many use cases as well as SQL does. Though of course we might be able to still be able to follow the&lt;a href="http://lists.w3.org/Archives/Public/public-webapps/2009AprJun/0134.html"&gt; 80% rule if we design our own language&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;SQLite wasn't the first browser-accessible DBMS, nor is it the most ubiquitous choice of target. &lt;a href="http://lists.w3.org/Archives/Public/public-webapps/2009AprJun/0139.html"&gt;IE's Jet database engine&lt;/a&gt;, which is the underlying engine for Access, would seem to be the most useful target specification.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There are strong arguments for &lt;a href="http://lists.w3.org/Archives/Public/public-webapps/2009AprJun/0140.html"&gt;not breaking existing content&lt;/a&gt;, of course, but there are also strong arguments for not having experimental implementations of early drafts completely dictate the standardization process.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;My contribution to this discussion so far is:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Many CLI standards have been based on SQL 92, but they allow all kinds of extensions. Not only that, Web Storage is more than CLI, it also includes an embedded database.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the question in my mind is not whether an unanchored reference to SQL is fine as much as whether SQL is the right way (and for years to come, the only structured way) to think of Web application's (locally persistent) data.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There is no end to how much Oracle and various other companies shield developers using their platforms from using raw SQL. There are more reasons for that than I can list here, but suffice it to say that the Web Storage spec should consider techniques that are better matched to the Web as a data access platform - i.e., in terms of URLs and HTTP methods&lt;br /&gt;&lt;/li&gt;&lt;li&gt;building applications on WebbKit is fine, but anyone can rely on the SQL API, at this time, at their own risk. It does not justify why the SQL technology is superior to other choices, however preliminary they might be. Or you risk going down the path of EJB which only 'got persistence right' after 5 iterations and only when the public declared a revolt and completely gave up on J2EE persistence.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;SQL as a given cannot be assumed to be the only acceptable query language for the data being managed. Problems of this model include - &lt;ul&gt;&lt;br /&gt;&lt;li&gt;Problems caused by version mismatches between server and client schemas significantly affects decentralized evolution.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The relational model does not allow data for which there is no schema placeholder, thus rejecting the principle of 'ignore what you don't understand'.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Incompatibility between database ids and URLs means that applications live a schizophrenic life when it comes to identifying data.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Incompatibility between database operations and HTTP methods means that atomicity and idempotence guarantees of HTTP are inapplicable to local data&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-1295036023851381499?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/1295036023851381499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=1295036023851381499&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/1295036023851381499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/1295036023851381499'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/04/to-sql-or-not-to-sql-that-is-question.html' title='To SQL or not to SQL - that is the question'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-94292475584386552</id><published>2009-02-23T17:28:00.000-08:00</published><updated>2009-07-09T09:10:29.968-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bitsy'/><category scheme='http://www.blogger.com/atom/ns#' term='atomdb'/><category scheme='http://www.blogger.com/atom/ns#' term='mozilla'/><title type='text'>Overriding default HTTP behavior in Mozilla</title><content type='html'>Faced with &lt;a href="http://www.blogger.com/%5B1%5D%20http://www.mail-archive.com/mozilla-netlib@mozilla.org/msg00432.html"&gt;Darin Fisher's puzzle of overriding the default HTTP behavior&lt;/a&gt; in Mozilla, I am coming up short on my implementation.&lt;br /&gt;&lt;br /&gt;I have done all the programming and developed a component that implements nsIHttpProtocolHandler and is installed to the component registrar as offering MyHttpHandler (my custom handler) with the "@mozilla.org/network/protocol;1?name=http" contract ID. However, this handler doesn't seem to get picked at all.&lt;br /&gt;&lt;br /&gt;Here's how I went about my custom component in a Firefox add-on (in native code):&lt;br /&gt;&lt;ol style="list-style-type: decimal;"&gt;&lt;li&gt;Create a module using the routine module entry point. The entry point returns a list of components that includes MyHttpHandler's ClassID, ContractID, constructor, and registration routine &lt;/li&gt;&lt;li&gt;In the registration routine, add to the &lt;span style="text-decoration: line-through;"&gt;http-startup&lt;/span&gt; xpcom-startup category the name value pair for my MyHttpHandler and its contract ID&lt;/li&gt;&lt;li&gt;MyHttpHandler implements both nsIHttpProtocolHandler and nsIObserver interfaces&lt;/li&gt;&lt;li&gt;MyHttpHandler's Observe method handles xpcom-startup &lt;span style="text-decoration: line-through;"&gt;and http-startup&lt;/span&gt; events. &lt;/li&gt;&lt;li&gt;When it gets the &lt;span style="text-decoration: line-through;"&gt;http-startup&lt;/span&gt; xpcom-startup event, MyHttpHandler is registered to override the default HTTP handler. To do this, I use the &lt;span style="text-decoration: line-through;"&gt;subject that arrives on the event&lt;/span&gt;NS_HTTP_PROTOCOLHANDLER_CID to get its service from XPCOM as the default handler and chain it to MyHttpHandler. Then I use MyHttpHandler's factory and register it as the factory for MyHttpHandler's Class ID and NS_HTTP_PROTOCOLHANDLER_CID contract ID.&lt;/li&gt;&lt;li&gt;The registration succeeds after the browser is initialized and I can confirm that from the logs.&lt;/li&gt;&lt;li&gt;Oh and yes, I have to ensure that I support the following interfaces in my class - &lt;code&gt;nsIHttpProtocolHandler,nsIProxiedProtocolHandler, nsIProtocolHandler, nsIObserver&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;What may be missing? Does Mozilla not trust anyone else to write the HTTP behavior or is there something lacking in my code? You can &lt;a href="http://groups.google.com/group/mozilla.dev.extensions/browse_thread/thread/258057c935aae80e#"&gt;follow this discussion&lt;/a&gt; on the Mozilla extension developer mailing list.&lt;br /&gt;&lt;br /&gt;UPDATE: I found the source of the problem. I needed to respond to QueryInterface for the nsIProtocolHandler interface in addition to the nsIHttpProtocolHandler interface. Now, I am able to intercept  all the HTTP scenarios encountered within Firefox including proxy, https, and, of course, caching.&lt;br /&gt;&lt;br /&gt;Replacing the Http/Https protocol handlers and channels, of course, means impacting the browser big time, but the replacement works quite OK. The only concern is how my replacement will be impacted by future revisions to Mozilla's own nsHttpProtocolHandler and nsHttpChannel. That, though, is a story for another day.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;UPDATE: I don't listen for http-startup anymore. Instead I do my work at xpcom-startup. There are other updates to the algorithm as well. So be sure to re-read this post to get an updated solution.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-94292475584386552?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/94292475584386552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=94292475584386552&amp;isPopup=true' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/94292475584386552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/94292475584386552'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2009/02/overriding-default-http-behavior-in.html' title='Overriding default HTTP behavior in Mozilla'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-3015251990422609803</id><published>2008-10-31T15:13:00.000-07:00</published><updated>2009-09-17T09:29:13.869-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IETF'/><category scheme='http://www.blogger.com/atom/ns#' term='AtomPub'/><category scheme='http://www.blogger.com/atom/ns#' term='hierarchy'/><category scheme='http://www.blogger.com/atom/ns#' term='feeds'/><title type='text'>New I-D on Atom feed hierarchies</title><content type='html'>We have been looking at issues around the publication and consumption of application feeds. Naturally, we come across data that is easily modeled as master-detail relations. A simple representation of this relation cannot currently be performed in any standard or even sane way that works entirely using hyperlinks.&lt;br /&gt;&lt;br /&gt;A hierarchical master-detail relation of an Entry to a Feed implies the detail Feed is created when the master Entry is created and the Feed is removed when the Entry is removed. The Entry is called the "master entry" and the Feed is called "detail feed". This relationship allows a client to use AtomPub to create a new Collection by posting an Entry to an existing Collection.&lt;br /&gt;&lt;br /&gt;Therefore, I co-wrote an &lt;a href="http://www.oracle.com/technology/tech/feeds/spec/draft-divilly-atompub-hierarchy-00.txt"&gt;I-D to support master-detail relations among feeds&lt;/a&gt;. A discussion was started on the &lt;a href="http://www.blogger.com/atom-protocol@imc.org"&gt;Atom protocol mailing list&lt;/a&gt;. You are welcome to leave comments here as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-3015251990422609803?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/3015251990422609803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=3015251990422609803&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/3015251990422609803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/3015251990422609803'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/10/new-i-d-on-atom-feed-hierarchies.html' title='New I-D on Atom feed hierarchies'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-6320815662824641828</id><published>2008-10-30T16:52:00.000-07:00</published><updated>2009-07-09T09:10:15.691-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sync'/><category scheme='http://www.blogger.com/atom/ns#' term='offline'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Atom'/><category scheme='http://www.blogger.com/atom/ns#' term='atomdb'/><title type='text'>Microsoft's take on off-line and data services</title><content type='html'>&lt;p&gt;&lt;a href="http://blogs.msdn.com/pablo/"&gt;Pablo Castro of Microsoft&lt;/a&gt; recently kicked off a discussion on &lt;a href="http://blogs.msdn.com/astoriateam/archive/2008/10/22/astoria-futures-offline-enabled-data-services.aspx"&gt;off-line data services for Astoria&lt;/a&gt;. He is averse to caching and seamless online/off-line applications. If the data service is provided by Astoria, then there is no problem. However, if the data source is not Astoria-based then sync falls apart, and there is no chance of getting the full set of data locally in a way that guarantees that "all the data required for offline" is stored locally at sync time.&lt;/p&gt; &lt;p&gt;This is no different from the SOAP story, where everyone thought it would enable interoperable services only to find that the technologies were good enough only for intranet solutions built with the same tools and technologies on both sides of the interaction.&lt;/p&gt; &lt;p&gt;If you are interested in seeing advances made in the area of cache syncing standard AtomPub services (which by the way are way more interoperable than Astoria-only data sources), then you should check out the details of AtomDB. My blog argues for a seamless caching approach as Web-friendly as well as open to any standard AtomPub data source. So does the feed technology center on OTN &lt;a rel="nofollow" target="_new" href="http://oracle.com/technology/tech/feeds/"&gt;http://oracle.com/technology/tech/feeds/&lt;/a&gt; have details about AtomDB, a project I have been focused on for the last one year.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-6320815662824641828?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/6320815662824641828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=6320815662824641828&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6320815662824641828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6320815662824641828'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/10/microsofts-take-on-off-line-and-data.html' title='Microsoft&apos;s take on off-line and data services'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-4562055391941648888</id><published>2008-10-28T14:43:00.001-07:00</published><updated>2009-07-09T09:09:38.297-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='anti-pattern'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><title type='text'>Non-hypertext "RESTful API"</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;Roy Fielding gives a bunch of &lt;a href="http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven"&gt;anti-patterns for applying REST to application interface design&lt;/a&gt;. One of them is:&lt;br /&gt;&lt;blockquote&gt;A REST API must not define fixed resource names or hierarchies (an obvious coupling of client and server). Servers must have the freedom to control their own namespace. Instead, allow servers to instruct clients on how to construct appropriate URIs, such as is done in HTML forms and URI templates, by defining those instructions within media types and link relations. &lt;em&gt;[Failure here implies that clients are assuming a resource structure due to out-of band information, such as a domain-specific standard, which is the data-oriented equivalent to RPC's functional coupling].&lt;/em&gt;&lt;/blockquote&gt;Roy does not give any examples of this anti-pattern. However, I wanted to note an example that will help illustrate the way in which this anti-pattern manifests itself in interface design.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://code.google.com/apis/finance/developers_guide_protocol.html"&gt;Google Finance API&lt;/a&gt; is a purported RESTful API that constructs URLs inside JavaScript code for managing application state instead of using hyperlinks produced on servers.&lt;br /&gt;&lt;br /&gt;Here's how: when &lt;a href="http://code.google.com/apis/finance/developers_guide_protocol.html#CreatingTransactions"&gt;creating a transaction for a position&lt;/a&gt;, the API defines a URL format to use.&lt;br /&gt;&lt;div style="border: 1px none ; background-color: rgb(136, 170, 170);"&gt;&lt;pre&gt;http://finance.google.com/finance/feeds/default/portfolios/&lt;var&gt;portfolioID&lt;/var&gt;/positions/&lt;var&gt;TICKERID&lt;/var&gt;/transactions&lt;/pre&gt;&lt;/div&gt;This format is to be used in JavaScript code for preparing a request to submit to the server.  The server does provide the URL to the position collection, so it is merely a matter of appending "transactions" to that URL. Still by putting that logic in JavaScript as opposed to a well-defined media type, this design choice fouls up on adherence to REST.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-4562055391941648888?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/4562055391941648888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=4562055391941648888&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4562055391941648888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4562055391941648888'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/10/non-hypertext.html' title='Non-hypertext &quot;RESTful API&quot;'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-6249888578841831484</id><published>2008-10-08T09:54:00.000-07:00</published><updated>2008-10-08T10:05:30.736-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='atomdb'/><title type='text'>Mobile Monday Silicon Valley</title><content type='html'>Yesterday, over 50 people attended Mobile Monday's meeting at Oracle HQ in Redwood City. We discussed data management for mobile applications and considered the use of feeds as data sources as well as the importance of seamless online-offline applications.&lt;br /&gt;&lt;br /&gt;The session was very interactive and a large number of issues were discussed along the way. Discussion revolved around the following issues:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Security&lt;ul&gt;&lt;li&gt;authorization&lt;/li&gt;&lt;li&gt;encryption&lt;/li&gt;&lt;li&gt;device loss&lt;/li&gt;&lt;li&gt;holes in IE mobile browser&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Trade-offs in application development vis-a-vis HTML5 storage&lt;/li&gt;&lt;li&gt;Fit for feature phones as opposed to smart phones&lt;/li&gt;&lt;li&gt;Suitability for graph structured data models in general&lt;/li&gt;&lt;li&gt;Support for JSON as opposed to XML feeds&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Here's the slide deck I used for the presentation.&lt;br /&gt;&lt;iframe src="http://docs.google.com/EmbedSlideshow?docid=dcbwmqs9_1799zfkzjgx" width="410" frameborder="0" height="342"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-6249888578841831484?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/6249888578841831484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=6249888578841831484&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6249888578841831484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6249888578841831484'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/10/mobile-monday-silicon-valley.html' title='Mobile Monday Silicon Valley'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-2623836203156597348</id><published>2008-10-01T11:45:00.001-07:00</published><updated>2008-10-01T11:51:09.682-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='feeds'/><title type='text'>Netflix adopts a feed-style API</title><content type='html'>Netflix joined the growing list of Atom feed-based APIs for Web-based applications by announcing their &lt;a href="http://developer.netflix.com/docs/REST_API_Conventions"&gt;REST API Conventions.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Link expansion continues to be an interesting area of innovation in feed-based APIs aimed at reducing the number of requests involved in fetching data in bulk. Another area of innovation is authorization, and the increasing adoption of OAuth as the means of delegating access to third parties has made a good REST API within the reach of many service providers.&lt;br /&gt;&lt;br /&gt;Finally, another interesting thing about the API is their emphasis on XML as the choice format, with Atom feeds providing much of the vocabulary such as categories and links. However, they retain POX formats for message exchange, which includes HTTP header information in response bodies. Hopefully, this is vestigial and will be treated as inferior to the feed format.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-2623836203156597348?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/2623836203156597348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=2623836203156597348&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/2623836203156597348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/2623836203156597348'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/10/netflix-adopts-feed-style-api.html' title='Netflix adopts a feed-style API'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-1505509655784356509</id><published>2008-09-30T17:30:00.000-07:00</published><updated>2008-09-30T17:36:50.027-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conneg'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><title type='text'>HTTP and Content Negotiation</title><content type='html'>There are three levels of HTTP experts -&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Who understand HTTP GET and POST (I'll call them naive)&lt;/li&gt;&lt;li&gt;Who understand uniform methods and conditional operations (I'll call them RESTafarians)&lt;/li&gt;&lt;li&gt;Who understand content negotiation (and its resulting design challenges), HTTP caching (and its industrial use) and idempotence (I'll call them REST masters)&lt;/li&gt;&lt;/ol&gt;I am certainly in the second category - RESTafarians and try to learn from the REST masters. So when I came across this message from Bill de hOra &lt;a href="http://groups.google.com/group/restful-json/msg/6dac5662d197f047"&gt;elucidating the impact of a content negotiation choice&lt;/a&gt;, I thought I would aggregate it on my blog.&lt;br /&gt;&lt;blockquote&gt;any solution that depends on conneg needs to define a processing ladder of alternatives (eg, depending solely on Accept: won't fly in the part of the mobile web I currently work in, unfortunately). &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-1505509655784356509?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/1505509655784356509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=1505509655784356509&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/1505509655784356509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/1505509655784356509'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/09/http-and-content-negotiation.html' title='HTTP and Content Negotiation'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-6851135618349875131</id><published>2008-09-30T15:38:00.000-07:00</published><updated>2009-07-09T09:09:23.814-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sync'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='atomdb'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Oracle OpenWorld Unconference</title><content type='html'>Oracle's OpenWorld was a great opportunity to meet with developers building mobile applications and discussing their data management needs.&lt;br /&gt;&lt;br /&gt;It was also an opportunity to do an unconference session around the rich Web application architecture and AtomDB. Those who came (about a dozen or so folks) were thinking how they could benefit from this kind of an architectural move.&lt;br /&gt;&lt;br /&gt;Here's the slide deck from the &lt;a href="http://wiki.oracle.com/page/Unconference%3AResponsive%2C+scalable%2C+and+highly+available+Ajax+applications+in+Web+browsers+using+feed"&gt;Rich Web Applications&lt;/a&gt; unconference session  (although the demos can't really be seen in this presentation).&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://docs.google.com/EmbedSlideshow?docid=dcbwmqs9_98fhjg4kd7" frameborder="0" height="342" width="410"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-6851135618349875131?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/6851135618349875131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=6851135618349875131&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6851135618349875131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6851135618349875131'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/09/oracle-openworld-unconference.html' title='Oracle OpenWorld Unconference'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-4417830297670545797</id><published>2008-09-17T11:16:00.000-07:00</published><updated>2009-07-09T09:08:41.608-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sync'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='offline'/><category scheme='http://www.blogger.com/atom/ns#' term='atomdb'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Android, Chrome, and Gears - what's cooking?</title><content type='html'>I have been following Google's emergence as a player of note in the applications area and respect them for driving innovations in application interfaces, browser standards, as well as mobile technologies.&lt;br /&gt;&lt;br /&gt;The combination and evolution of Android, Chrome, and Gears is suggestive of a vision being laid out by Google about the Web as a platform for building useful applications. Certainly, this would be interest to those of us trying to bridge the gap between enterprise and useful Web.&lt;br /&gt;&lt;br /&gt;Of course, Google has tried to improve browser stability with Chrome, but that is not the only reason why they built a Web browser. &lt;a href="http://www.informationweek.com/blog/main/archives/2008/09/could_there_be.html"&gt;David Berlind's article on Information Week&lt;/a&gt; tries to justify the case that Gears is quite central to Google's browser story.&lt;span id="articleBody"&gt;&lt;blockquote&gt;My guess is that Google sees an offline technology like Gears as being so fundamental to the future of Web applications, that it can't not be built into the browser. The folks at Mozilla (where Gears is an add-on t the browser), on the other hand, probably didn't see it that way. &lt;/blockquote&gt;&lt;/span&gt;My blog and Oracle's investment in AtomDB is proof of the fact that Oracle feels that the Web has a lot to offer, and for many applications a key missing piece is the lack of a suitable caching and proxy technology that works under the hood. This story is the best means of transitioning gradually from the current state of affairs in terms of browser depoloyment. You can write an application that works on conventional Web browsers like IE and Firefox which lack the Gears off-line capability and that work even better when Gears is available as either a plug-in or standard inside the browser.&lt;br /&gt;&lt;br /&gt;Gives you more than one good reason to switch to Chrome as you get more of your coffee, er applications from the Web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-4417830297670545797?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/4417830297670545797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=4417830297670545797&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4417830297670545797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4417830297670545797'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/09/android-chrome-and-gears-whats-cooking.html' title='Android, Chrome, and Gears - what&apos;s cooking?'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-7025360231606240199</id><published>2008-09-17T11:08:00.000-07:00</published><updated>2009-07-09T09:07:40.479-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bitsy'/><category scheme='http://www.blogger.com/atom/ns#' term='sync'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='atomdb'/><category scheme='http://www.blogger.com/atom/ns#' term='feeds'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Oracle OpenWorld - Ajax Unconference</title><content type='html'>I have created an unconference session at OpenWorld on &lt;a href="http://wiki.oracle.com/page/Unconference:Responsive,+scalable,+and+highly+available+Ajax+applications+in+Web+browsers+using+feed"&gt;Rich Web Applications&lt;/a&gt;. The idea is to meet like minded people who are developing Ajax applications for standard Web browsers and are interested in learning how feed technologies can help them standardize their APIs as well as improve the serviceability of these interfaces.&lt;br /&gt;&lt;br /&gt;As you know, &lt;a href="http://code.google.com/apis/gdata"&gt;GData&lt;/a&gt; has long offered feed and Atom publishing protocol-based API as a means of retrieving and updating data in various Google applications through a RESTful protocol. Other applications also now offer similar interfaces, e.g., and &lt;a href="http://code.google.com/apis/opensocial/"&gt;OpenSocial&lt;/a&gt;. The preponderance of such application interfaces combined with their fairly high usage on the Web indicates a good match of this style with the application integration requirements.&lt;br /&gt;&lt;br /&gt;Come to the unconference session to discuss your pet peeves about Ajax application data interfaces as well as hear about Oracle's technology proposals to help address some of these issues such as reliability, availability, and responsiveness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-7025360231606240199?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/7025360231606240199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=7025360231606240199&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7025360231606240199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7025360231606240199'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/09/oracle-openworld-ajax-unconference.html' title='Oracle OpenWorld - Ajax Unconference'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-2553446226779721435</id><published>2008-09-17T10:28:00.000-07:00</published><updated>2009-07-09T09:07:21.384-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Oracle is hosting Mobile Monday Silicon Valley next month</title><content type='html'>&lt;a href="http://www.mobilemonday.us/"&gt;Mobile Monday&lt;/a&gt; comes to Redwood City next month, as Oracle hosts mobile developers from all over the Bay Area. If you have attended this event before, then the new thing is that Oracle is now taking a renewed interest in mobile infrastructure. Oracle will talk about ways in which mobile Web applications can offer greater responsiveness and reliability, while at the same time tapping multiple sources of data on the Web.&lt;br /&gt;&lt;br /&gt;If you haven't come to MoMo before, then you will find it to be a great networking event besides meaty technical topics and a serious discussion of issues faced by mobile developers.&lt;br /&gt;&lt;br /&gt;Detailed announcement will follow shortly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-2553446226779721435?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/2553446226779721435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=2553446226779721435&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/2553446226779721435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/2553446226779721435'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/09/oracle-is-hosting-mobile-monday-silicon.html' title='Oracle is hosting Mobile Monday Silicon Valley next month'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-6000564352490534817</id><published>2008-09-17T10:22:00.001-07:00</published><updated>2009-07-09T09:07:03.096-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='atomdb'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Mobile Web Megatrends</title><content type='html'>Ajit Jaokar, a mobile die-hard, organized a &lt;a href="http://www.mobilewebmegatrends.com/"&gt;small event on the emerging trends of Mobile Web&lt;/a&gt;. The event received a pretty good audience of infrastructure developers and Web enthusiasts ranging from browser vendors to ecosystem reviewers.&lt;br /&gt;&lt;br /&gt;Of course, Oracle was there too. Our presentation highlighted our interest in making the mobile Web browser a competent environment for developing reliable and speedy applications, and the technology Oracle has developed, called AtomDB, to support this vision.&lt;br /&gt;&lt;br /&gt;Information about AtomDB is now available on the Oracle Technology Network as part of its &lt;a href="http://www.oracle.com/technology/tech/feeds/index.html"&gt;Feed Technology Center&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-6000564352490534817?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/6000564352490534817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=6000564352490534817&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6000564352490534817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/6000564352490534817'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/09/mobile-web-megatrends.html' title='Mobile Web Megatrends'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-8008345525815017968</id><published>2008-08-04T13:49:00.001-07:00</published><updated>2008-08-04T13:51:42.381-07:00</updated><title type='text'>True character</title><content type='html'>How many of us can see this applicable to ourselves? Khushwant Singh, a political and social commentator in India had &lt;a href="http://www.hindustantimes.com/StoryPage/StoryPage.aspx?sectionName=ViewsSectionPage&amp;amp;id=bb31fcb6-664e-467a-8664-2de8b58491d2&amp;amp;&amp;amp;Headline=Our+failing+political+esteem&amp;amp;strParent=strParentID"&gt;very prescient words to say about character&lt;/a&gt;. I hazard a guess that even companies work the same way.&lt;br /&gt;&lt;blockquote&gt;A person's true character is revealed in the way he behaves in times of crises when he believes his future is at stake. If he is afraid of consequences that may follow and compromises with his principles, he becomes a lesser person in people’s eyes as well as his own: he is unable to see his face in the mirror. On the other hand, if he sticks to his avowed beliefs, he may suffer adversity but people will admire him as an example of rectitude and he can hold his head high with pride.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-8008345525815017968?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/8008345525815017968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=8008345525815017968&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8008345525815017968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8008345525815017968'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/08/true-character.html' title='True character'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-8039673720032112140</id><published>2008-07-31T15:53:00.002-07:00</published><updated>2008-08-04T13:59:03.153-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='evolution'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>Architectural Evoution of Commercial Computing</title><content type='html'>Discussions about the evolution of styles of software architecture used in commercial computing often veer towards the usual cyclical story. However, it is not as simple as some would like to think of it.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_4cn9Pl6cwjQ/SJdtTB5ETzI/AAAAAAAADY4/BD_2e2W0Vrs/s1600-h/arch+evol.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://bp1.blogger.com/_4cn9Pl6cwjQ/SJdtTB5ETzI/AAAAAAAADY4/BD_2e2W0Vrs/s320/arch+evol.png" alt="" id="BLOGGER_PHOTO_ID_5230769665906855730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Take a look at the following image of the major innovation in software architecture during the last six decades and see how each culminated in the pronouncement of a style as the pre-eminent one. Every time a style gained prominence, the next decade led to unlearning as new computer architecture, networks, and tools led to another new style's emergence.&lt;br /&gt;&lt;br /&gt;Do you agree with the trend line here? Do you know of others that are better at telling this history?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-8039673720032112140?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/8039673720032112140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=8039673720032112140&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8039673720032112140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8039673720032112140'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/07/architectural-evoution-of-commercial.html' title='Architectural Evoution of Commercial Computing'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_4cn9Pl6cwjQ/SJdtTB5ETzI/AAAAAAAADY4/BD_2e2W0Vrs/s72-c/arch+evol.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-3376273917938223222</id><published>2008-07-15T10:42:00.000-07:00</published><updated>2009-07-09T09:06:14.456-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bitsy'/><category scheme='http://www.blogger.com/atom/ns#' term='sync'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='atomdb'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Uniform data synchronization for mobile data access</title><content type='html'>As I mentioned in a previous blog post, Mobile Monday Austin hosted a session on mobile data access allowing me an opportunity to present Oracle's work on AtomDB. Here are my slides used in the session titled "&lt;a href="http://docs.google.com/Presentation?id=dcbwmqs9_34trsfrjhp"&gt;Mobile Data Access using AtomDB&lt;/a&gt;".&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://docs.google.com/EmbedSlideshow?docid=dcbwmqs9_34trsfrjhp" frameborder="0" height="342" width="410"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Among many interesting questions I heard, the most interesting one was "How do you perform local authorization/authentication?" I say this because like many other issues with local processing for greater responsiveness/higher availability this issue also forces us to transparently provide local behavior without imposing additional burden on servers or clients.&lt;br /&gt;&lt;br /&gt;The answer to that is that we do not perform local authentication. However, once a principal is authenticated, applications inform AtomDB about the required authorization through the JavaScript control API for AtomDB called BITSY. Through this API, applications provide the HTTP &lt;span style="font-family:courier new;"&gt;Authorization &lt;/span&gt;or &lt;span style="font-family:courier new;"&gt;Cookie &lt;/span&gt;header used to ascertain whether a certain data access request is sufficiently authorized or not. AtomDB sends this header in requests to the server and records responses. Only if later the application uses the same header for the data access request will the recorded responses be provided to it. If there is a mismatch or a missing header, then the response is &lt;span style="font-family:courier new;"&gt;401 Authorization Required&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-3376273917938223222?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/3376273917938223222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=3376273917938223222&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/3376273917938223222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/3376273917938223222'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/07/uniform-data-synchronization-for-mobile.html' title='Uniform data synchronization for mobile data access'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-7348427981859773535</id><published>2008-06-27T09:41:00.000-07:00</published><updated>2009-07-09T09:05:30.978-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sync'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='atomdb'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Mobile Monday Austin in July</title><content type='html'>I will be &lt;a href="http://weblog.cenriqueortiz.com/mobilemondayaustin/2008/06/26/mobilemonday-austin-oracle-on-mobile-applications-and-databases-july-14th/"&gt;speaking at MobileMonday, Austin on July 14&lt;/a&gt;. C. Enrique Ortiz has invited Oracle to discuss challenges for mobile applications in the context of the rich Web. Here's a synopsis of the talk:&lt;br /&gt;&lt;blockquote&gt;There is heavy latent demand for mobile applications and recent industry events have heightened interest in mobile Web applications. Mobile application developers face a number of inherent challenges of mobility such as form factor and user interaction. Besides these, they are also forced to deal with incidental issues such as platform fragmentation and unreliable connectivity. Various “Rich Internet Application” platforms are currently targeting these problems. Oracle, of these, is interested primarily in standards-based platforms, i.e., Web browsers and AJAX. Therefore, Oracle has developed a solution to the network unreliability problem in the context of Web browsers, Oracle’s AtomDB . This technology provides a transparent, local, read-write cache for application data that is synchronized with data sources using the same REST APIs used by AJAX applications to access their data. This talk will focus on the dual use of IETF’s Atom publishing protocol for application programming as well as data synchronization. He will also discuss areas of future work in off line data for Web applications.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-7348427981859773535?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/7348427981859773535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=7348427981859773535&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7348427981859773535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7348427981859773535'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/06/mobile-monday-austin-in-july.html' title='Mobile Monday Austin in July'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-5454099839177326521</id><published>2008-06-27T09:34:00.000-07:00</published><updated>2009-07-09T09:05:02.062-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sync'/><category scheme='http://www.blogger.com/atom/ns#' term='mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='atomdb'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Mobile databases or write-through Web caches</title><content type='html'>Finally, Oracle is going public with the work we have been doing on Web data, specifically in the context of mobile devices. In the past, most developers, including Oracle, have developed full-fledged relational databases for mobile devices. Our group at Oracle has took a different approach due to the uncertain outlook on connectivity and the need for responsiveness and availability over consistency.&lt;br /&gt;&lt;br /&gt;We have developed a tiny embedded database, rather a write-through cache for mobile Web browsers that provides transparent access to Web data for read-write operations. A technical paper on our approach describes AtomDB, the motivations for it, and the future work to make AtomDB a core component of the rich, mobile-ready Web. Here's an excerpt from that paper &lt;a href="http://csse.usc.edu/%7Emehta/Going%20far%20without%20the%20bars.pdf"&gt;Going far without the bars&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;Mobile application developers can’t avoid human computer interface challenges, limited network connectivity, and harried users, but they shouldn't have to deal with new data storage and communication models and synchronization issues. In this paper we explore how the AJAX application model and the Atom data model, widely used for on-line applications, can be combined to create seamless on-line/off-line model for mobile applications. We show how existing applications can be made robust to intermittent connectivity and limited battery capacity without any application changes. This is achieved through a local Web data proxy and synchronization architecture called BITSY. We illustrate this approach with two robust mobile Web applications, one existing and another new, running on AtomDB, an implementation of BITSY built as a browser plug-in.&lt;/p&gt; &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-5454099839177326521?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/5454099839177326521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=5454099839177326521&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5454099839177326521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5454099839177326521'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/06/mobile-databases-or-write-through-web.html' title='Mobile databases or write-through Web caches'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-4869578304613961470</id><published>2008-06-03T10:51:00.000-07:00</published><updated>2008-06-03T11:02:14.304-07:00</updated><title type='text'>Differences between S3 and Atompub</title><content type='html'>Since both &lt;a href="http://docs.amazonwebservices.com/AmazonS3/2006-03-01/RESTAPI.html"&gt;S3&lt;/a&gt; and &lt;a href="http://www.ietf.org/rfc/rfc5023.txt"&gt;Atompub&lt;/a&gt; are considered &lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/top.htm"&gt;REST style&lt;/a&gt; interfaces, people often wonder whether it matters which one of the two they are using.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The bottom line is - S3 is best suited for server-side programming and Atompub is best for client-side interaction. This does not mean that the converse is disallowed, but, at least in the case of S3, a number of issues will render it unsuitable.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I will highlight a few differences between S3 and Atompub:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Various Amazon proprietary headers, data formats, URL templates, and operations are required in S3's REST API. Atom does not require any new headers (one new optional header is defined in Atompub), and all the formats and operations are public standards in heavy use on the Internet. &lt;/li&gt;&lt;li&gt;S3 requires clients to mint URIs on their own following a template. &lt;/li&gt;&lt;ol&gt;&lt;li&gt;This means that the server cannot change without breaking clients.&lt;/li&gt;&lt;/ol&gt;&lt;ol&gt;&lt;li&gt;This means that one user can easily overwrite another's data since they could each mint the same URLs when creating new data. &lt;/li&gt;&lt;/ol&gt;&lt;li&gt;The S3 API does not provide a means of retrieving or changing metadata of objects.&lt;/li&gt;&lt;li&gt;S3 does not handle any concurrency - it allows arbitrary writes to win.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt; S3 and Atompub are at different levels of abstraction. S3 is suitable for server-side programming, but cannot be exposed to the entire world. Therefore, S3 is good for corporates to implement their applications internally. However, anyone interested in providing an API that an unaffiliated developer would use would prefer to employ Atompub.&lt;br /&gt;&lt;br /&gt;Benefits of using Atompub over S3&lt;br /&gt;&lt;ol&gt;&lt;li&gt;  No need to create new metadata vocabularies - just build on Atom and related efforts (such as Geo RSS, Dublin Core, etc.)&lt;/li&gt;&lt;li&gt;  Standard dumb-proof techniques for retrieving and manipulating individual items and their metadata, operating on lists of items including paging and &lt;/li&gt;&lt;li&gt;  Atompub uses HTTP conditional updates to control concurrent updates&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;UPDATE:&lt;/span&gt; A well-done slide deck by &lt;a href="http://www.slideshare.net/takemaru/practical-atompub-servers-yapcasia-2008/"&gt;takemaru on practical Atompub servers &lt;/a&gt;explains how S3 is well suited for situations where the client of the API wishes to control the URI space, where metadata is simple and with the data.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-4869578304613961470?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/4869578304613961470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=4869578304613961470&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4869578304613961470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4869578304613961470'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/06/differences-between-s3-and-atompub.html' title='Differences between S3 and Atompub'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-8383865130720845170</id><published>2008-04-09T10:56:00.000-07:00</published><updated>2008-04-09T11:11:45.850-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web database'/><title type='text'>Clamor for self-scaling databases for Web development</title><content type='html'>Not that this is an easy problem, but awareness is half the problem solved, or something to the same effect.&lt;br /&gt;&lt;br /&gt;This is what I would like from a Web database:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Require no work on the part of the application development or administrative orgs for&lt;/li&gt;&lt;ol&gt;&lt;li&gt;high availability&lt;br /&gt;&lt;/li&gt;&lt;li&gt;disaster recovery&lt;/li&gt;&lt;li&gt;scaling&lt;/li&gt;&lt;li&gt;geographical placement&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Of course, availability guarantees are negotiable&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Self-tuned query execution&lt;br /&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Allow for run-time evolution of data structure/schema&lt;/li&gt;&lt;li&gt;based on analysis of the structure and queries being processed&lt;/li&gt;&lt;li&gt;Support querying of XML data and full text search, not necessarily XQuery - see GData API, Lucene query syntax   &lt;/li&gt;&lt;li&gt;Subset of SQL only supported - GQL, Amazon's SimpleDB&lt;/li&gt;&lt;/ol&gt;     &lt;li&gt;Make database directly Web aware&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Protect against DOS attacks&lt;/li&gt;&lt;li&gt;Protect against injection threats&lt;/li&gt;&lt;li&gt;Provide feeds and native support for Atom/WebDAV&lt;/li&gt;&lt;li&gt;Relations recorded as Web-style hyperlinks&lt;/li&gt;&lt;li&gt;Native support for synchronization to devices&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Record level authorization&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Using encrypted authorization keys&lt;/li&gt;&lt;li&gt;Works directly with HTTP authentication (or its extension)&lt;/li&gt;&lt;li&gt;Support for flexible authentication, OpenID, OAuth&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Flexible transaction policies&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Stale reads&lt;/li&gt;&lt;li&gt;Optimistic concurrency&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;Am I missing something important in this list?&lt;br /&gt;&lt;br /&gt;As to those who have expressed a desire for such databases:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bitworking.org/news/158/ETech-07-Summary-Part-2-MegaData"&gt;MegaData&lt;/a&gt; - Joe Gregorio&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://itc.conversationsnetwork.org/shows/detail571.html"&gt;Database Requirements in the Age of Scalable Services&lt;/a&gt; - Adam Bosworth&lt;/li&gt;&lt;li&gt;&lt;a href="http://antirez.com/post/missing-scalable-opensource-database.html"&gt;Scalable Databases for Web applications&lt;/a&gt; - Salvatorre Sanfilippo&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-8383865130720845170?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/8383865130720845170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=8383865130720845170&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8383865130720845170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/8383865130720845170'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/04/clamor-for-self-scaling-databases-for.html' title='Clamor for self-scaling databases for Web development'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-4629096735824513120</id><published>2008-01-22T11:05:00.000-08:00</published><updated>2008-04-09T10:56:06.386-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='society entrepreneur'/><title type='text'>Entrepreneurs and society</title><content type='html'>"Once an entrepreneur, an entrepreneur for life." No? Perhaps I am wrong in believing this but I have never been able to wean myself off the E-tap since I first co-founded a company in late 1999.&lt;br /&gt;&lt;br /&gt;I constantly stumble in to interesting non-profit problems that it seems like an endless loop of &lt;a href="http://www.economist.com/displaystory.cfm?story_id=10555875"&gt;social entrepreneurism&lt;/a&gt;. Not the enlightened and exalted form like that practiced by Muhammad Yusuf or Baba Amte. Anyway, I came across this interesting quote from G. B. Shaw on unreasonable people, which I can relate to quite well -&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;“The reasonable man adapts himself to the world, the unreasonable one persists in trying to adapt the world to himself. Therefore all progress depends on the unreasonable man.”&lt;/blockquote&gt;Vive la unreasaonable!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-4629096735824513120?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/4629096735824513120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=4629096735824513120&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4629096735824513120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4629096735824513120'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2008/01/entrepreneurs-and-society.html' title='Entrepreneurs and society'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-442195179495674749</id><published>2007-12-10T03:29:00.000-08:00</published><updated>2007-12-10T03:43:52.220-08:00</updated><title type='text'>SAP CRM for iPhone and drag-and-drop</title><content type='html'>Apple, through its lack of an SDK for iPhone, has coerced software developers to treat the Web as a first class development platform for mobile device.&lt;br /&gt;&lt;br /&gt;Last week &lt;a href="http://news.yahoo.com/s/nm/20071204/tc_nm/sap_dc_1"&gt;SAP announced availability of its CRM software for the iPhone&lt;/a&gt; ahead of other platforms. Someone looking for details about breakthroughs that SAP made in its mobile software offering to adjust to the iPhone environment will be quite disappointed in this announcement. But a careful reading betrays the brute force approach most enterprise vendors of Web-based applications take -- bend the platforms to their whims. Their announcement claims&lt;br /&gt;&lt;blockquote&gt;  The iPhone software, part of a new sales-force automation  suite from SAP, uses a Web-based interface with drag-and-drop  tools ...&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt; Apple went to great lengths to &lt;a href="https://developer.apple.com/iphone/devcenter/designingcontent.html"&gt;convey that drag-and-drop is not good for mobile devices&lt;/a&gt;. In fact, its own iPhone applications forgo drag-and-drop features. And yet, SAP says that is exactly what its iPhone applications are distinguished at!&lt;br /&gt;&lt;br /&gt;No surprises here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-442195179495674749?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/442195179495674749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=442195179495674749&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/442195179495674749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/442195179495674749'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2007/12/sap-crm-for-iphone-and-drag-and-drop.html' title='SAP CRM for iPhone and drag-and-drop'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-4751545513431544680</id><published>2007-09-20T12:14:00.000-07:00</published><updated>2007-09-20T12:22:31.841-07:00</updated><title type='text'>Theory of astronomical real estate markets</title><content type='html'>I keep on wondering how income to house price ratios soared to 4.5 from a 40 year level of 3. The Economist points out how &lt;a href="http://economist.com/finance/displaystory.cfm?story_id=9831159"&gt;high housing prices might be the result of an extremely stable global economy over the last 3 decades&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Belief that the business cycle has been tamed for good helps explain why property prices in many rich countries have risen so high and why there has been such a willingness to take on debt at large multiples of income. A less volatile economy makes income streams more reliable and, goes the argument, justifies higher prices for all assets, including housing. A reduced fear of job losses means homebuyers in America, Britain and elsewhere have been content to take out huge home loans.&lt;/blockquote&gt;The reasoning seems to make sense. However, the true test of this theory is in its ability to explain effects of the credit market volatility on the future of US and the global real estate markets.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-4751545513431544680?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/4751545513431544680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=4751545513431544680&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4751545513431544680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4751545513431544680'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2007/09/theory-of-astronomical-real-estate.html' title='Theory of astronomical real estate markets'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-9219012319268727825</id><published>2007-06-21T14:50:00.000-07:00</published><updated>2007-06-21T15:01:19.677-07:00</updated><title type='text'>Graph structures and Atom</title><content type='html'>If one is willing to interpret a relational database through the eyes of  an application (family, really), Atom does indeed help. In more general  sense a simple two level hierarchy (container, element (container,  element()) can go quite far when using hyperlinks. However, if  interpreting a relational schema without any knowledge of applications  that use this schema, Atom won't be of much help, and you might be  better off with something else like Web3S or RDF.&lt;br /&gt;&lt;br /&gt;Note to myself: Atom pub still doesn't provide a comprehensive mechanism  for synchronizing changes to these feeds across autonomous agents, but  that's for another day.&lt;br /&gt;&lt;br /&gt;Consider an application where data is richly interconnected, and at  present, lives in relational databases. For example, drivers carry insurance  (except those who like paying for tickets), and insurance covers  vehicles. This data  can be supplied as Atom feeds (both atompub and regular atom). So this three node graph can be represented as three separate  collections one for each node, and three compound feeds one for each  edge in the graph. A compound feed is one where the entries contain feeds in their content. Alternatively, one could use microformats and provide links, but then you'd require an XHTML processor to understand the relations.&lt;br /&gt;&lt;br /&gt;Might I add that the additional bytes being generated for Atom feeds  could be offset by the diminished traffic to a server because the data  required is already sitting in an intermediary or the client, and may be  synchronized efficiently. Whether you would be willing to work with  potentially "stale" application data is still another discussion to have.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-9219012319268727825?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/9219012319268727825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=9219012319268727825&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/9219012319268727825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/9219012319268727825'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2007/06/graph-structures-and-atom.html' title='Graph structures and Atom'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-7341394125634579791</id><published>2007-05-30T02:23:00.000-07:00</published><updated>2007-05-30T02:45:14.907-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='federation'/><title type='text'>Changing the world?!</title><content type='html'>Why would you listen to me? Why, I am just a sleep-deprived gadfly who could dream of nothing better. &lt;a href="http://www.webratio.com/images/20050408Bosworth.pps"&gt;Adam Bosworth said this a couple of years ago &lt;/a&gt;at the MySQL User Conf 2005. In any case, I referred to this talk in one of my previous posts &lt;a href="http://o-micron.blogspot.com/2006/08/converging-applications-and-web.html"&gt;converging applications and the Web&lt;/a&gt;.  (Surprisingly, there are plenty of references to Adam's talk but none really to his talk directly - the top results are, instead, everyone else's opinions of his talk.)&lt;br /&gt;&lt;br /&gt;Joe Gregorio resonated with this idea when I discussed the future of AtomPub at the &lt;a href="http://www.tbray.org/ongoing/When/200x/2007/04/16/Interop"&gt;recent AtomPub Interop at Google&lt;/a&gt;. His post on &lt;a href="http://bitworking.org/news/158/ETech-07-Summary-Part-2-MegaData"&gt;MegaData &lt;/a&gt;also discusses how it is possible to achieve Web-level federation of data.&lt;br /&gt;&lt;br /&gt;This space has only just begun to attract attention and the rest of this decade should produce reasonable replacements for the traditional client-server RDBMS + 3GL based applications we have lived with for the last three decades or so. Clearly a lot more is at stake than just blogs and news, social networks and photo sharing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-7341394125634579791?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/7341394125634579791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=7341394125634579791&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7341394125634579791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/7341394125634579791'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2007/05/changing-world.html' title='Changing the world?!'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-5086390175338773612</id><published>2007-03-28T11:17:00.001-07:00</published><updated>2007-03-28T11:17:41.303-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='startup'/><title type='text'>Are you smart enough?</title><content type='html'>Paul Graham &lt;a href="http://www.paulgraham.com/notnot.html"&gt;says&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;If you don't think you're smart enough to start a startup doing something technically difficult, just write enterprise software. Enterprise software companies aren't technology companies, they're sales companies, and sales depends mostly on effort.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-5086390175338773612?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/5086390175338773612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=5086390175338773612&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5086390175338773612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/5086390175338773612'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2007/03/are-you-smart-enough.html' title='Are you smart enough?'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-2319637939697727616</id><published>2007-03-19T13:17:00.000-07:00</published><updated>2007-03-19T13:37:30.997-07:00</updated><title type='text'>Email riot</title><content type='html'>Have you ever heard of an&lt;span style="font-style: italic;"&gt; email riot&lt;/span&gt;? I could only find one genuine use of it online. Nevertheless, let me explain to you what it means. For those with little time -&lt;br /&gt;&lt;blockquote&gt;An email riot occurs when one mob of users tries to rush out of an administered mailing list while another mob wants to keep in on an interesting conversation, while no administrators are actually listening to their requests. The bigger the maling list, the more dangerous the riot becomes.&lt;br /&gt;&lt;/blockquote&gt;I just witnessed one and am completely bewildered that people scantly understand mail technology or protocol in this day and age. The riot started when I sent an email to a scarcely used, but a large mailing list. Of course, some people wrote to me "WAY TO GO MAN" and some others pleaded that I stop the impending mobs. But I knew nothing would work better than to not respond to any of the hundreds of messages that were going to follow.&lt;br /&gt;&lt;br /&gt;Blackberry and PDA users were trying to rush out the door asking someone to "PLEASE REMOVE ME" from this mailing list. Others were pleading to keep the thread alive for the reach it afforded. Yet others were simply saying "Do what you want but I want to get more messages on this topic" All the while few realized that their messages were being sent to countless people as they chose to "Reply to All".&lt;br /&gt;&lt;br /&gt;I guess people are so used to engaging in CYA email discussions that they tend to remove the Reply button from their tool bar in favor of the almighty "Reply to All". Not only that, they forget that no one on the administered mailing list is actually reading their messages. Its almost like a riot-prone area which has no government. No one pays attention to "Help me" or "Save my life".&lt;br /&gt;&lt;br /&gt;Then there were people offering advice to add an email filter to keep the rogue email out of their in boxes. And there were others shouting at the former to keep their mouth shut to reduce the email traffic, all the while adding their own through the "Reply to All". The most amusing emails were ones asking everyone to stop responding to the rioters while heaping more pain to the entire mailing list:&lt;br /&gt;&lt;blockquote&gt;THERE IS NO ONE WHO WILL "REMOVE" OR "UNSUBSCRIBE" YOU FROM THE ... EMAILS.&lt;br /&gt;SO PLEASE DO NOT REQUEST THAT!!&lt;br /&gt;&lt;br /&gt;THINK BEFORE YOU SEND:&lt;br /&gt;THIS THREAD DIES OFF ONLY IF YOU JUST STOP REPLYING TO IT.&lt;br /&gt;&lt;br /&gt;Yes, it's ironical that I am sending a message for this purpose.  I'm sorry.&lt;br /&gt;&lt;/blockquote&gt;How long did it go on? Well it started on a Friday evening, and is still going on on a Monday morning, albeit the traffic is about one every hour.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-2319637939697727616?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/2319637939697727616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=2319637939697727616&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/2319637939697727616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/2319637939697727616'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2007/03/have-you-ever-heard-of-email-riot-i.html' title='Email riot'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-4859709450589251180</id><published>2006-11-21T11:06:00.001-08:00</published><updated>2007-03-19T13:37:56.306-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Lazy JSR spec writers</title><content type='html'>&lt;span style="font-family:arial;"&gt;Can't believe the JSR 173 spec writers were so lazy!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;When did you last feel like flagellating a JSR editor? Well, Chris Fry (BEA) and his team of JSR 173 expert group members definitely deserve this rich reward for a stupid mistake of copy-and-paste. You'd say we all do that some time or the other. In this case, the spec has produced a lingering result due to the copy-and-paste error.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Copy-and-paste&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;The StAX API uses the standard service provider initialization techniques and requires that users beseech the "standard" factories for an instance of various XML factory classes. Lazily enough, the spec editors copied a method to instantiate the InputFactory and used it ditto for instantiating the OutputFactory. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Only that they forgot to change the signature of this method, so it also returns an InputFactory.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;So the code for:&lt;/span&gt;&lt;br /&gt;&lt;blockquote style="font-family: arial;"&gt;&lt;pre&gt;public static XMLInputFactory newInstance(String factoryId,  &lt;br /&gt;                                     ClassLoader classLoader)&lt;br /&gt;throws FactoryConfigurationError {&lt;br /&gt;return (XMLInputFactory) FactoryFinder.find(&lt;br /&gt; factoryId,&lt;br /&gt; "com.bea.xml.stream.MXParserFactory",&lt;br /&gt; classLoader);&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-family:arial;"&gt;was copied as:&lt;/span&gt;&lt;br /&gt;&lt;blockquote style="font-family: arial;"&gt;&lt;pre&gt;public static XMLInputFactory newInstance(String factoryId,&lt;br /&gt;                                     ClassLoader classLoader)&lt;br /&gt;throws FactoryConfigurationError {&lt;br /&gt;return (XMLInputFactory) FactoryFinder.find(&lt;br /&gt; factoryId,&lt;br /&gt; "com.bea.xml.stream.XMLOutputFactoryBase",&lt;br /&gt; classLoader);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;span style="font-family:arial;"&gt;Don't believe me? &lt;/span&gt;&lt;a style="font-family: arial;" href="http://java.sun.com/javaee/5/docs/api/javax/xml/stream/XMLOutputFactory.html#newInstance%28java.lang.String,%20java.lang.ClassLoader%29"&gt;Then take a look &lt;/a&gt;&lt;span style="font-family:arial;"&gt;for yourself.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Why am I complaining now?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;I am working with this library in an OSGi run time, where I have to use this two-arg factory creation. But I can't quite do this with the existing StAX API and I don't see any existing fix for this BUG. Sun closed a &lt;/span&gt;&lt;a style="font-family: arial;" href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6306251"&gt;bug filed for this in August 2005&lt;/a&gt;&lt;span style="font-family:arial;"&gt; saying that the spec needs to be changed and they can't do anything. Codehaus recorded a &lt;/span&gt;&lt;a style="font-family: arial;" href="http://jira.codehaus.org/browse/STAX-22"&gt;bug in September 2005 &lt;/a&gt;&lt;span style="font-family:arial;"&gt;that has yet to be worked on. Seems like the Extreme Lab at Indiana is &lt;/span&gt;&lt;a style="font-family: arial;" href="http://www.extreme.indiana.edu/bugzilla/show_bug.cgi?id=194"&gt;tracking this issue &lt;/a&gt;&lt;span style="font-family:arial;"&gt;as well to make it a part of some maintenance release.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Are you working with an alternative for pull parsing that works better with large amounts of character data? Let me know...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-4859709450589251180?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/4859709450589251180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=4859709450589251180&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4859709450589251180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/4859709450589251180'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2006/11/cant-believe-jsr-173-spec-writers-were_21.html' title='Lazy JSR spec writers'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-116316804062624237</id><published>2006-11-10T06:14:00.000-08:00</published><updated>2007-03-19T13:38:22.434-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='middleware'/><category scheme='http://www.blogger.com/atom/ns#' term='architecture'/><title type='text'>The King (J2EE) is dead, long live the King</title><content type='html'>&lt;p class="mobile-post"&gt;&lt;span style="font-size:85%;"&gt;I always considered middleware technologies to be ephemeral and favored explicit architectural thinking for long term stability. (&lt;a href="http://sunset.usc.edu/%7Emehta/phd/dissertation.pdf"&gt;My dissertation&lt;/a&gt; shows how different styles are essentially composable from small and simple primitives independent of middleware technologies.) Industrial technologies aka runaway trains, viz., CORBA, DCOM, and J2EE were each a rehash of DCE RPC. Neither introduced anything fundamentally superior to the other and was eventually bogged down by its own mess - a melange of services and factories, single points of failures, nasty recovery techniques, specialized and opaque serializations, and a lofty but misguided goal for portability. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;While it may reflect my naivety, I am of the opinion that if a technology cannot be explained within a few hours, and if its evolution cannot be guaranteed over a decade, then its premature death is certain.&lt;/span&gt;&lt;/p&gt;&lt;p class="mobile-post"&gt;&lt;span style="font-size:85%;"&gt;The only technology I know of that has survived for more than  a decade, receives tremendous use, and shows no signs of aging or obsolescence is HTTP. Even SMTP could be considered to be in this league, except that it is plagued by problems of authentication and credibility even as our mailboxes are jammed with spam.&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;Now Richard Monson-Haefel writes of the impending &lt;a href="http://beta.blogger.com/&amp;%7E%7ESPECIAL_REMOVE%21#%7E%7Elt;http://searchwebservices.techtarget.com/originalContent/0,289142,sid26_gci1198211,00.html"&gt;demise of JEE and posts a preemptive obit &lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;of the pre-eminent enterprise stack - JEE 5. I saw this coming for the last year and a half and my move to XML feeds and REST was no coincidence. Some of you know that I have switched out of the Oracle middleware group to the Oracle database group a few months ago.&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="mobile-post"&gt;&lt;span style="font-size:85%;"&gt;Two years ago when I finished at USC, I was raring to build simple software architectures for solving complex problems that would survive decades and still be held in high regard. I now finally have a shot at the goal with the first internal venture project funded at Oracle that campaigned for and am now heading. This project focuses on high throughput data synchronization at the Internet scale. This technology would form the underpinning of a resource-oriented database, which I considered the best alternative for petabyte sized databases, which are in line to become the norm in the SaaS world.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-116316804062624237?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/116316804062624237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=116316804062624237&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/116316804062624237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/116316804062624237'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2006/11/jee-is-dead-long-live-jee.html' title='The King (J2EE) is dead, long live the King'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-115817338396072192</id><published>2006-09-13T11:49:00.000-07:00</published><updated>2006-11-10T17:48:53.446-08:00</updated><title type='text'>Editorial selection</title><content type='html'>A very nicely written article on the &lt;a href="http://bokardo.com/archives/diggs-design-dilemma/"&gt;design issues with the democratic editorial process&lt;/a&gt; being used widely on Web 2.0 discusses the inherent systemic flaws leading to overall poor quality of information. &lt;br&gt; &lt;div class="comment-body"&gt; 			&lt;p&gt;&lt;b&gt;Value of information&lt;/b&gt;&lt;br&gt; Novel and true information has more value than stale and misleading information. Big media editing process is inherently biased and produces a small community of information evaluators. On the other hand democratic, i.e., social editing often creates the least common denominator of information, not the same as novel and true information.&lt;/p&gt; 	&lt;p&gt;&lt;b&gt;Approximation to optimal editing&lt;/b&gt;&lt;br&gt; The academic editorial process works quite effectively by producing blind votes, subjective review, and reviewer selection. The process usually advances the community and its agenda. &lt;/p&gt; 	&lt;p&gt;It is not quite optimal because it is slow, biased towards the community goals, requires a qualification for entry, and can be rigged in favor of certain groups. &lt;/p&gt; 	&lt;p&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;br&gt; Democracy unfortunately does not produce good information. Neither does capitalism. You ought to have a meritocracy to distribute valuable information and foster excellence. Would be great if someone could address some of these drawbacks of academic the editorial process and introduce it to mass communication. &lt;/p&gt;   		&lt;/div&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-115817338396072192?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/115817338396072192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=115817338396072192&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/115817338396072192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/115817338396072192'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2006/09/editorial-selection.html' title='Editorial selection'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-115533377237875212</id><published>2006-08-11T15:02:00.000-07:00</published><updated>2006-11-10T17:48:53.338-08:00</updated><title type='text'>XML feeds - format selection</title><content type='html'>&lt;span style="font-size: 85%;"&gt;I am spending a fair amount of time these days thinking about middleware that will power the applications for the '20s and beyond. From the wave of metaphors used in the "Web 2.0" parlance, one dominant theme is the pervasive use of XML feeds to communicate information to consumers.&lt;br&gt; &lt;br&gt; &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;As Ray Ozzie claims, XML feeds are the equivalent of Unix pipes for the Internet. If Unix pipes provided much fuel for composite applications on the workstation, XML feeds are expected to provide the glue for Internet scale composite applications. In another article, &lt;/span&gt;&lt;span style="font-size: 85%;"&gt;Adam Bosworth claims that &lt;a  href="http://acmqueue.com/modules.php?name=Content&amp;amp;pa=showpage&amp;amp;pid=337"&gt;XML feeds will save the world&lt;/a&gt;. &lt;/span&gt;&lt;br&gt; &lt;span style="font-size: 85%;"&gt;&lt;br&gt; There are mainly two flavors of XML feeds as I speak - RSS and Atom. I am sure you have read several articles comparing the two. Many such articles end up being technical comparisons for the sake of it, especially to promote Atom.&lt;br&gt; &lt;br&gt; If you are thinking "Why does it matter how many formats there are or that I am using one and not the other?", read on.&lt;br&gt; &lt;br&gt; Of course, anything can be computed (within Turing's incompleteness limits). Therefore, anything that is in RSS can be written as Atom and vice versa, correct? Turns out the answer is actually in the negative. To quote DeWitt Clinton the lead engineer of Amazon's A9 search:&lt;/span&gt;&lt;br&gt; &lt;blockquote&gt;the problem is that the RSS syndication format is that it is lossy&lt;br&gt; &lt;/blockquote&gt; &lt;span style="font-size: 85%;"&gt;Hopefully, this statement will get your attention and suggest that you read the &lt;a  href="http://www.unto.net/unto/work/on-rss-and-atom/"&gt;entire article&lt;/a&gt;. The lossiness is invisible when dealing with simple use cases of syndication. However, when you start aggregating feeds and introducing semi-structured information in the feed payload, the entire problem starts becoming more and more apparent.&lt;br&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-115533377237875212?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/115533377237875212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=115533377237875212&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/115533377237875212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/115533377237875212'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2006/08/xml-feeds-format-selection.html' title='XML feeds - format selection'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32472356.post-115515567794109587</id><published>2006-08-09T13:04:00.000-07:00</published><updated>2006-11-10T17:48:52.959-08:00</updated><title type='text'>converging applications and the Web</title><content type='html'>&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;Adam Bosworth &lt;a href="http://www.adambosworth.net/archives/2004_07.html"&gt;paints a vision for the future of applications (and the Web)&lt;/a&gt; that far exceeds what I have been pushing for as a vision for business applications. Although this is an old post, with more than 60K of markup text, its relevance and applicability is quite durable. One of the best takeaways from this article is his definition of a Web services browser:&lt;br /&gt;&lt;blockquote&gt;... is a browser that can access information published as XML messages by services, let the user interact in a rich and graceful way with this information or these services, but can run well in terms of interaction whether the user is online or offline.&lt;/blockquote&gt;In separate but loosely congurent ways, we are preparing for the convergence of large applications with the Web mainly as a response to&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;customers demanding greater flexibility in &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;creating and &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;organizing live data owned by a wide variety of sources, and&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;users increasingly craving for mobility from their desktops without being tearfully separated from their applications.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;I am convinced that it is not a question of if but rather of when, applications will take on a greater similarity with the Web and the Web will resemble more of a read/write medium like traditional applications than a 1% contribute/99% consume medium that was the Web in its first decade and a half.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;Of course, this requires that the Web (as in content and platform) evolve to increasingly favor a subscription model (think of Atom), a greater separation of content from information (think of JSON/XML/microformat), and a richer interaction model for end users (think of AJAX). A lot of this is tagged "Web 2.0" these days.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32472356-115515567794109587?l=blog.o-micron.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.o-micron.com/feeds/115515567794109587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32472356&amp;postID=115515567794109587&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/115515567794109587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32472356/posts/default/115515567794109587'/><link rel='alternate' type='text/html' href='http://blog.o-micron.com/2006/08/converging-applications-and-web.html' title='converging applications and the Web'/><author><name>Nikunj Mehta</name><uri>http://www.blogger.com/profile/08819862609445802833</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://2.bp.blogspot.com/_4cn9Pl6cwjQ/SleBTvKigoI/AAAAAAAAFAk/MaDzTLpR1k0/S220/nrmehta.jpg'/></author><thr:total>0</thr:total></entry></feed>
