<?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-3465716704098863819</id><updated>2012-01-15T11:49:11.407-08:00</updated><category term='Atom'/><category term='Domain Driven Design'/><category term='SPARQL'/><category term='Project management'/><category term='Microsoft'/><category term='Rich Internet application'/><category term='Semantic Technology Conference'/><category term='RDF'/><category term='RDFa'/><category term='OpenSearch'/><category term='Semantic Web'/><category term='Modeling language'/><category term='Sesame'/><category term='Resource Description Framework'/><category term='Hypertext Transfer Protocol'/><category term='WebKit'/><category term='Java'/><category term='Ajax'/><category term='Google'/><category term='Domain-specific language'/><category term='Programming'/><category term='GNOME'/><category term='Web service'/><category term='Calais'/><category term='Object-Oriented'/><category term='World Wide Web'/><category term='Distributed Computing'/><category term='Linked Data'/><category term='Web server'/><category term='Google Chrome'/><category term='Database'/><category term='Web application'/><category term='HTML'/><category term='RDF/XML'/><category term='Jena'/><category term='Business logic'/><category term='Programming language'/><category term='Database theory'/><category term='Representational State Transfer'/><category term='XHTML'/><category term='Model–view–controller'/><category term='XSL Transformations'/><category term='N3'/><category term='Programming paradigm'/><category term='Database transaction'/><title type='text'>Programming The Web</title><subtitle type='html'>Applying the best qualities from the web's infrastructure.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>James Leigh</name><uri>http://www.blogger.com/profile/14146095505004628863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>64</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-151478337790838300</id><published>2012-01-15T11:39:00.000-08:00</published><updated>2012-01-15T11:49:11.426-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Sesame'/><category scheme='http://www.blogger.com/atom/ns#' term='Database transaction'/><title type='text'>Blob Store</title><content type='html'>In release 2.0-beta14 (I know, this is the late beta release) AliBaba introduced a new BLOB store. The blob store integrates with the RDF repository ObjectRepository to synchronize transactions. This allows both the BLOB store and the RDF store to be isolated and always consistent with one another. This is done using two-phase commit transactions in the BLOB store.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The BLOB store also has a few other advantages over a traditional file system. First every change is isolated until it is closed/committed. This prevents other readers from see an incomplete BLOB and help prevent inconsistency between the BLOB and RDF stores. In additional, as disk space is generally considered cheap, all past versions of BLOBs are keep on disk by default. This allows any previous versions to be retrieved (and restored) using the API.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The BLOB store API is fairly simple. Here what some code might look like using the BLOB store.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;  BlobStoreFactory factory = BlobStoreFactory.newInstance();&lt;/div&gt;&lt;div&gt;  BlobStore store = factory.openBlobStore(new File("."));&lt;/div&gt;&lt;div&gt;  &lt;/div&gt;&lt;div&gt;  String key = "http://example.com/store1/key1";&lt;/div&gt;&lt;div&gt;  BlobObject blob = store.open(key);&lt;/div&gt;&lt;div&gt;  &lt;/div&gt;&lt;div&gt;  OutputStream out = blob.openOutputStream();&lt;/div&gt;&lt;div&gt;  try {&lt;/div&gt;&lt;div&gt;    // write stream to out&lt;/div&gt;&lt;div&gt;  } finally {&lt;/div&gt;&lt;div&gt;    out.close();&lt;/div&gt;&lt;div&gt;  }&lt;/div&gt;&lt;div&gt;  &lt;/div&gt;&lt;div&gt;  InputStream in = blob.openInputStream();&lt;/div&gt;&lt;div&gt;  try {&lt;/div&gt;&lt;div&gt;    // read stream from in&lt;/div&gt;&lt;div&gt;  } finally {&lt;/div&gt;&lt;div&gt;    in.close();&lt;/div&gt;&lt;div&gt;  }&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;More API options can be see in the JavaDocs:&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.openrdf.org/doc/alibaba/2.0-beta14/apidocs/org/openrdf/store/blob/package-summary.html"&gt;http://www.openrdf.org/doc/alibaba/2.0-beta14/apidocs/org/openrdf/store/blob/package-summary.html&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3465716704098863819-151478337790838300?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/151478337790838300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2012/01/blob-store.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/151478337790838300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/151478337790838300'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2012/01/blob-store.html' title='Blob Store'/><author><name>James Leigh</name><uri>http://www.blogger.com/profile/14146095505004628863</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-6918530055908166166</id><published>2011-06-02T10:51:00.000-07:00</published><updated>2011-06-02T10:53:44.306-07:00</updated><title type='text'>Web Developer Review of BlackBerry PlayBook</title><content type='html'>Most reviews for the PlayBook focus on the same issue: very few downloadable apps in app world. As a web developer - I couldn't care less.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;First Impression&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Websites render fast, and due to the high dpi, look really nice. With its compact form, it fits well in my hands, easy to type and very portable. With a flash plugin included, streaming video is smooth and full screen works. Videos look really slick when plugged into a HD TV. Each app can only open one window, so the browser supports tabs and allows you to keep multiple tabs open at once.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Honeymoon Ends&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tabbed browsing works on the desktop, but not on the PlayBook. Only the open tab can be actively loading. Opening a new tab before the page loads can cancel the page from loading. Opening a new tab while watching video pauses the video. This makes watching commercials really frustrating because you can't turn away or it will pause. Watching videos in the browser is also frustrating, as after five minutes  the PlayBook goes into suspend. (There are some tricks to stop this, but not if in full screen mode.) &lt;br /&gt;&lt;br /&gt;In addition, despite all the fuss about multitasking, the PlayBook can't multitask. Most specifically you can only have one web page active at a time, and this includes webapps. &lt;br /&gt;&lt;br /&gt;Surprisingly, the PlayBook is much less web developer friendly than I expected. The script engine is incomplete. There is no offline support for webapps. There is no support for turning a webapp application into a chromeless app. Webworks development requires a series of confusing bat commands that don't work the first time. All of this makes it really hard to develop for the PlayBook.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What's Left&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The apps I use include Browser, Wi-Fi Sharing, Word To Go, Slides To Go, Videos, Pictures, aVNC, and ReelPortal. All of them work, but I expected more from almost every one of them.&lt;br /&gt;&lt;br /&gt;All that being said, I am going to hold on and put up with the current limitation of the PlayBook. I really like having a portable web browser, and I believe there is still a lot of potential for this device.  I am looking forward to seeing what the next software update has to offer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3465716704098863819-6918530055908166166?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/6918530055908166166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2011/06/web-developer-review-of-blackberry.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6918530055908166166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6918530055908166166'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2011/06/web-developer-review-of-blackberry.html' title='Web Developer Review of BlackBerry PlayBook'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-468151492625820749</id><published>2011-02-14T06:39:00.000-08:00</published><updated>2011-02-14T07:42:56.467-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web application'/><category scheme='http://www.blogger.com/atom/ns#' term='World Wide Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Hypertext Transfer Protocol'/><title type='text'>Five Steps to a More Secure Web App</title><content type='html'>There are a number of different authentication methods available to choose from when launching (or updating) a Web application. Choosing the wrong method can leave the system (or worse, the users) vulnerable to cyber attacks or &lt;a href="http://en.wikipedia.org/wiki/Identity_theft"&gt;identity theft&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Below are five rules that should always be obeyed (regardless of the method). By considering these rules and how your users will use your system, you can better understand the security requirements of your Web application and can choose the right method.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1) Never send clear user passwords over an unencrypted channel.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;When passwords are sent over an unencrypted channel, anyone who has access to the network (and a little know how) can read them. This should never be done with user supplied passwords (not even for intranet websites). Users often use the same password for multiple systems. Exposing a user's password in one system puts them at risk in another.&lt;br /&gt;&lt;br /&gt;Both basic authentication and form-based authentication are vulnerable to this and should never be used when users can choose their own passwords. Digest authentication and encrypted logins do not send clear passwords, and can be used when users can choose their own passwords.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Basic_access_authentication"&gt;HTTP basic authentication&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/HTTP+HTML_form-based_authentication"&gt;HTML form-based logins&lt;/a&gt; can be used in secure networks to restrict Web access as long as the passwords are pseudo random, unpredictable, and unique across other systems.&lt;br /&gt;&lt;br /&gt;For systems that allow user created passwords, care must be taken to ensure the passwords are not readable by others by using &lt;a href="http://en.wikipedia.org/wiki/HTTPS"&gt;HTTPS&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Digest_access_authentication"&gt;digest&lt;/a&gt; during logins.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2) Never send session tokens unencrypted over a shared network.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Unencrypted &lt;a href="http://en.wikipedia.org/wiki/Session_token#HTTP_session_token"&gt;session tokens&lt;/a&gt; are visible to anyone who has access to the network. Although session tokens don't expose the user's password, they do allow &lt;a href="http://en.wikipedia.org/wiki/HTTP_cookie#Cookie_theft_and_session_hijacking"&gt;hijacking&lt;/a&gt; accounts with unlimited access. This should never be used over a public wifi network (or other shared network) to access private information or make changes.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/HTTP_cookie"&gt;Cookie&lt;/a&gt; based authentication over HTTP is vulnerable to this. &lt;a href="http://en.wikipedia.org/wiki/Digest_access_authentication"&gt;Digest authentication&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/HTTPS"&gt;HTTPS&lt;/a&gt; sessions are not vulnerable.&lt;br /&gt;&lt;br /&gt;Digest authentication uses a unique &lt;a href="http://en.wikipedia.org/wiki/Salt_(cryptography)"&gt;"salt"&lt;/a&gt; for every request and digest systems prevent the same "salt" being used more than once (although this is optional). By never using and never allowing the same authentication token twice, digest authentication prevents account hijacking.&lt;br /&gt;&lt;br /&gt;HTTPS requests are encrypted and prevent &lt;a href="http://en.wikipedia.org/wiki/Eavesdropping"&gt;eavesdropping&lt;/a&gt; from others on the network, preventing access to any request tokens that might be present.&lt;br /&gt;&lt;br /&gt;Only allow HTTPS using keys from a &lt;a href="http://en.wikipedia.org/wiki/X.509#Certificate_authority"&gt;certificate authority&lt;/a&gt;, HTTPS with &lt;a href="http://en.wikipedia.org/wiki/Self-signed_certificate"&gt;self signed keys&lt;/a&gt;, HTTPS with mixed content or digest authentication should be used to exchange private information over shared networks.&lt;br /&gt;&lt;br /&gt;For more information about the vulnerabilities of using session tokens see &lt;a href="http://www.cgisecurity.com/2010/01/weaning-the-web-off-of-session-cookies-making-digest-authentication-viable.html"&gt;Weaning the Web Off of Session Cookies&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3) Always verify information sent over an insecure network.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Insecure networks may be vulnerable to malicious attacks such as &lt;a href="http://en.wikipedia.org/wiki/DNS_cache_poisoning"&gt;DNS posioning&lt;/a&gt;, or a &lt;a href="http://en.wikipedia.org/wiki/Reverse_proxy"&gt;trojan Web proxy&lt;/a&gt;. These attacks are often called &lt;a href="http://en.wikipedia.org/wiki/Man-in-the-middle_attack"&gt;man-in-the-middle&lt;/a&gt; and can manipulate the content from the server before it reaches the client (and vice-versa).&lt;br /&gt;&lt;br /&gt;Most unencrypted HTTP communication is vulnerable to this. Even mixed content of both HTTPS and HTTP is vulnerable to man-in-the-middle because compromised HTTP content can read and manipulate HTTPS content.&lt;br /&gt;&lt;br /&gt;Although digest authentication includes an optional integrity check to prevent this, most browsers either don't check or don't indicate to the user if the content has been verified.&lt;br /&gt;&lt;br /&gt;All Web browsers verify HTTPS content (when not mixed) and this should be used for insecure networks. For mobile devises that often connect from potentially insecure networks HTTPS (self signed or CA signed) should be enabled by default for any private information.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;4) Never give confidential information without verifying authenticity of the server.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Well &lt;a href="http://en.wikipedia.org/wiki/Domain_Name_System#Security_issues"&gt;disguised URLs&lt;/a&gt; and familiar looking pages can trick users into visiting and pseudo-logging into illegitimate websites. If your website asks your users for confidential information, ensure there is a clear way for your users to verify the authenticity of the site before logging in. Otherwise, your users might give confidential information to untrustworthy third parties without even knowing it.&lt;br /&gt;&lt;br /&gt;HTTPS using previously distributed keys (such as keys from an established &lt;a href="http://en.wikipedia.org/wiki/X.509#Certificate_authority"&gt;certificate authority&lt;/a&gt;) allow the user to verify the organization in their browser (near the address bar). This allows the user to quickly verify authenticity of the server.&lt;br /&gt;&lt;br /&gt;HTTPS with self sign certificates cannot be used to verify authenticity unless they have been previously distributed through a secure channel.&lt;br /&gt;&lt;br /&gt;Although digest authentication can include &lt;a href="http://tools.ietf.org/html/rfc2617#section-3.2.3"&gt;authentication-info&lt;/a&gt; to verify authenticity, most browsers either ignore it or don't indicate to the user when the site is verified. However, most browsers do show the host name and realm to the user for review before logging in and this does give the user a chance to check to domain name before logging in.&lt;br /&gt;&lt;br /&gt;Always use HTTPS for confidential, or sensitive information.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;5) Never access sensitive information over an unencrypted channel.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;HTTP traffic can be viewed by any who has access to the network. It is vital that all sensitive information is never sent over unencrypted HTTP. Sensitive information should always use HTTPS.&lt;br /&gt;&lt;br /&gt;Only exclusively HTTPS with known certificates should be used to exchange sensitive information with its users.&lt;br /&gt;&lt;br /&gt;Always use HTTPS for confidential, or sensitive information.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;In summary&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;By obeying these five rules you can pick the right authentication method and prevent your system and users from being vulnerable to cyber attacks and identify theft.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3465716704098863819-468151492625820749?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/468151492625820749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2011/02/five-steps-to-more-secure-web-app.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/468151492625820749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/468151492625820749'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2011/02/five-steps-to-more-secure-web-app.html' title='Five Steps to a More Secure Web App'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-364895489296087740</id><published>2010-11-28T16:37:00.000-08:00</published><updated>2010-11-28T16:41:30.208-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Representational State Transfer'/><category scheme='http://www.blogger.com/atom/ns#' term='Linked Data'/><category scheme='http://www.blogger.com/atom/ns#' term='Hypertext Transfer Protocol'/><category scheme='http://www.blogger.com/atom/ns#' term='RDF'/><title type='text'>Status Code 200 vs 303</title><content type='html'>The public LOD has been dominated by discussions on using 303 in response to a GET request for distinguishing between the requested resource identifier, and a description document identifier.&lt;br /&gt;&lt;br /&gt;Some resources can be represented completely on the Web. For these resources, any of their URLs can be used to identify them. This blog page, for example, can be identified by the URL in a browser's address bar. However, some resources cannot be completely viewed on the Web - they can only be described on the Web.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.w3.org/2001/tag/issues.html#httpRange-14"&gt;W3C recommends&lt;/a&gt; responding with a 200 status code for GET requests of a URL that identifies a resource which can be completely represented on the Web (an information resource). They also recommend responding with a 303 for GET requests of a URL that identifies a resource that cannot be completely represented on the Web.&lt;br /&gt;&lt;br /&gt;Popular Web servers today don't have much support for resources that can't be represented on the Web. This creates a problem for deploying (non-document) resource servers as it can be very difficult to set-up resources for 303 responses. The public LOD mailing list has been discussing an alternative of using the more common 200 response for any resource.&lt;br /&gt;&lt;br /&gt;The problem with always responding to a GET request with a 200 is the risk of using the same URL to identify both a resource and a document describing it. This breaks a fundamental &lt;a href="http://www.w3.org/TR/webarch/#id-resources"&gt;Web constraint&lt;/a&gt; that says URIs identify a single resource, and causes URI collisions.&lt;br /&gt;&lt;br /&gt;It is impossible to be completely free of all ambiguity when it comes to URI allocation. However, any ambiguity can impose a cost in communication due to the effort required to resolve it. Therefore, within reason, we should strive to avoid it. This is particularly true for Web recommendation standards.&lt;br /&gt;&lt;br /&gt;URI collision is perhaps the most common ambiguity in URI allocation. Consider a URL that refers to the movie The Sting and also identifies a description document about the movie. This collision creates confusion about what the URL identifies. If one wanted to talk about the creator of the resource identified by the URL, it would be unclear whether this meant "the creator of the movie" or "the editor of the description." Such ambiguity can be avoided using a 303 for a movie URL to redirect to a 200 of the description URL.&lt;br /&gt;&lt;br /&gt;As &lt;a href="http://lists.w3.org/Archives/Public/public-lod/2010Nov/0554.html"&gt;Tim Berners-Lee points out in an email&lt;/a&gt;, even including a Content-Location in a 200 response (to indicate a description of the requested resource) "leaves the web not working", because such techniques are already used to associate different representations (and different URLs) to the same resource, and not the other way around.&lt;br /&gt;&lt;br /&gt;Using any other 200 status code for representations that merely describe a resource (and don't completely represent it) causes ambiguity because Web browsers today interpret all 200 series responses (from a GET request) as containing an complete representation of the resource identified in the request URL.&lt;br /&gt;&lt;br /&gt;Every day, people bookmark and send links of documents they are viewing in a Web browser. It is essential that any document viewed in a Web browser has a URL identifier in the browser's address bar. Web browsers today don't look at the Content-Location header to get the document URL (nor should they). For Linked Data to work with today's Web, it must keep requests for resources separate from requests for description documents.&lt;br /&gt;&lt;br /&gt;The community has voiced common concerns about the complexity of URI allocation and the use of 303s using today's software. The LOD community jumped in with a few alternatives, however, we must consider how the Web works today and be realistic on further Web client expectations. The established 303 technique works today using today's Web browsers. 303 redirect may be complicated to setup in a document server, but let's give Linked Data servers a chance to mature.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3465716704098863819-364895489296087740?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/364895489296087740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2010/11/status-code-200-vs-303.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/364895489296087740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/364895489296087740'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2010/11/status-code-200-vs-303.html' title='Status Code 200 vs 303'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-674071239668062089</id><published>2010-09-13T10:21:00.000-07:00</published><updated>2010-09-13T10:23:40.403-07:00</updated><title type='text'>HTML-Oriented Development</title><content type='html'>The heart of all Web applications is the user interface (UI) design - this is what its user interact with. As any consultant knows: clients are more satisfied with a well designed UI and mediocre business logic then they are with a poorly designed UI with minimal transparency and fully automated business rules.&lt;br /&gt;&lt;br /&gt;What is surprising (when you think about it) is that most Web application frameworks orient around the business model and treat the HTML like a second class citizen. The conceptual model may be important, but even more important is the representation of the model in HTML. Good UIs provide the user with full transparency to the state and operations of the underlying model. It doesn't matter how well the model is if the HTML is too confusing or too obscure; users will avoid using it.&lt;br /&gt;&lt;br /&gt;The HTML of Web applications is surprisingly rich with domain concepts. Most well designed UIs contain all the classes, relationships, and attributes found in the underlying model and present them to the user in a language everyone involved can understand. There is a lot of emerging standards that can help turn this human readable data in HTML into machines readable data using RDFa, microformats, or microdata.&lt;br /&gt;&lt;br /&gt;Recently, David Wood and I started the project Callimachus; it has taken a different approach to Web application design/development. Callimachus reads the domain model from your HTML templates! In Callimachus there is no need to maintain multiple models, no SQL schema, no query languages, no object-relation mapping, it's all embedded in HTML using RDFa.&lt;br /&gt;&lt;br /&gt;RDFa allows your HTML to include resource identifiers, their relationships, and properties using additional attributes such as: about, rel, and property. Consider the following HTML snippet. Using RDFa the data is readable by both humans and machines alike. It says that James Leigh knows David Wood using the relationship "foaf:knows" and the property "foaf:name".&lt;br /&gt;&lt;br /&gt;&amp;lt;div about="james"&amp;gt;&lt;br /&gt;  &amp;lt;span property="foaf:name"&amp;gt;James Leigh&amp;lt;/span&amp;gt;&lt;br /&gt;  knows&lt;br /&gt;  &amp;lt;div rel="foaf:knows" resource="david"&amp;gt;&lt;br /&gt;    &amp;lt;span property="foaf:name"&amp;gt;David Wood&amp;lt;/span&amp;gt;&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;Written using a Callimachus HTML template it might look like the snippet below. Here is an embedded query asking who knows "david" and what is their name.&lt;br /&gt;&lt;br /&gt;&amp;lt;div about="?who"&amp;gt;&lt;br /&gt;  &amp;lt;span property="foaf:name" /&amp;gt;&lt;br /&gt;  knows&lt;br /&gt;  &amp;lt;div rel="foaf:knows" resource="david"&amp;gt;&lt;br /&gt;    &amp;lt;span property="foaf:name" /&amp;gt;&lt;br /&gt;  &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;Callimachus provides the framework necessary to create HTML templates to query, view, edit, and delete resources. This technique allows Web developers to save time and maintenance costs by applying the DRY principle (Don't Repeat Yourself) to Web application development.&lt;br /&gt;&lt;br /&gt;For more information about Callimathus see &lt;a href="http://callimachusproject.org/"&gt;http://callimachusproject.org&lt;/a&gt; or turn into my live Webcast on Wednesday at &lt;a href="http://www.wilshireconferences.com/semtech2010/email/email-webcast-091510.html"&gt;http://www.wilshireconferences.com/semtech2010/email/email-webcast-091510.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3465716704098863819-674071239668062089?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/674071239668062089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2010/09/html-oriented-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/674071239668062089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/674071239668062089'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2010/09/html-oriented-development.html' title='HTML-Oriented Development'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-4195830349687198414</id><published>2010-05-27T06:36:00.000-07:00</published><updated>2010-05-27T06:43:35.751-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Resource Description Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='Semantic Web'/><category scheme='http://www.blogger.com/atom/ns#' term='SPARQL'/><title type='text'>The Future of RDF</title><content type='html'>At the end of June, immediately after SemTech, I'll be attending the W3C RDF Next Step Workshop. This workshop has been set up with the goal of gathering feedback from the Semantic Web community to determine if (and how) RDF should evolve in the future. I'll be presenting two papers with &lt;a href="http://prototypo.blogspot.com/"&gt;David Wood&lt;/a&gt; which I hope will generate good discussions...(To review the papers or for more information on the workshop, go to &lt;a href="http://www.w3.org/2001/sw/wiki/RDF/NextStepWorkshop"&gt;NextStepWorkshop&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;The first paper I'm presenting will show a new &lt;a href="http://www.w3.org/2009/12/rdf-ws/papers/ws13"&gt;RESTful RDF Store API&lt;/a&gt; supporting named queries and change isolation. (I blogged about this &lt;a href="http://jamesrdf.blogspot.com/2010/02/beyond-sparql-protocol.html"&gt;earlier this year&lt;/a&gt;.) This proposed API would combine basic CRUD operations over RDF constructs (graphs, services and queries) and mandate RDF descriptions of services.  With the ability to modify an RDF store's state in SPARQL 1.1 comes the challenge of managing store versions and the need to manage them (and their differences) over HTTP.&lt;br /&gt;&lt;br /&gt;The other paper is a proposed &lt;a href="http://www.w3.org/2009/12/rdf-ws/papers/ws14"&gt;alternative handling of rdf:List in SPARQL&lt;/a&gt;. The way we currently deal with ordered collections in RDF, whether through tools or in SPARQL, is so difficult that it limits adoption of RDF. So much of data retrieval, which is currently dominated on the Web by XML, includes the notion of ordered collections - RDF must align the RDF representation with the conceptual notion of ordered collections if it has a chance of making inroads into already established networks. &lt;br /&gt;&lt;br /&gt;Where do you think RDF needs to go in the future? Does it need to change if it is going to stay viable?&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/15049970-6fe7-4671-9e26-79c49ef61a80/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=15049970-6fe7-4671-9e26-79c49ef61a80" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-4195830349687198414?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/4195830349687198414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2010/05/future-of-rdf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/4195830349687198414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/4195830349687198414'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2010/05/future-of-rdf.html' title='The Future of RDF'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-7854939326834305280</id><published>2010-03-08T09:06:00.000-08:00</published><updated>2010-03-08T09:07:56.881-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RDF/XML'/><title type='text'>Reinventing RDF Lists</title><content type='html'>Last month the &lt;a href="http://lists.w3.org/Archives/Public/semantic-web/2010Jan/0085.html"&gt;SW interest group discussed&lt;/a&gt; alternatives to containers and collections as part of a discussion around what the next generation of &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Resource_Description_Framework" title="Resource Description Framework" rel="wikipedia"&gt;RDF&lt;/a&gt; might look like. Below is my opinion on the matter.&lt;br /&gt;&lt;br /&gt;RDF's simplistic approach makes it possible to encode most data structures, both simple and complex. The challenge people have with RDF, coming from other Web formats, is the lack of basic ordered collections (a concept common in XML). In RDF you are forced into a linked list structure just to preserve resource order. The linked list structure known as rdf:List is difficult to work with and highly ineffective within modern RDF stores.&lt;br /&gt;&lt;br /&gt;Most RDF formats provide syntactic sugar to make it easier to write rdf:Lists. In turtle this is done using round brackets (parentheses); in RDF/XML this is done using the parseType collection attribute. However, because rdf:List is not a fundamental concept in RDF, no RDF store implementation preserves them, instead opting to use the fundamental triple form -- a linked list.&lt;br /&gt;&lt;br /&gt;RDF is made of the following fundamental concepts: URI, Literal, and Blank Node. A fundamental list concept should be added to make it easier and more efficient to work with ordered collections. This would not have a significant effect on RDF formats, as their syntax would not change, but would have a significant impact on the mindset of RDF implementers.&lt;br /&gt;&lt;br /&gt;With this change RDF implementers would strive to ensure that lists are implemented efficiently and provide convenient operations on them, just as they would other fundamental RDF concepts. The triple (linked list) form should be kept for compatibility with RDF systems that don't preserve lists, but the goal would be that RDF systems would not be obligated to provide a triple linked list form that has proven to be ineffective.&lt;br /&gt;&lt;br /&gt;By making lists a fundamental RDF concept, there is no required change for RDF libraries to continue to be compatible with existing standards. Most libraries and systems may already understand list short hand and some may also preserve it.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/423d1f55-f711-45f2-bc92-0881910787d5/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=423d1f55-f711-45f2-bc92-0881910787d5" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-7854939326834305280?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/7854939326834305280/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2010/03/reinventing-rdf-lists.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7854939326834305280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7854939326834305280'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2010/03/reinventing-rdf-lists.html' title='Reinventing RDF Lists'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-7565082960070954473</id><published>2010-03-01T07:06:00.000-08:00</published><updated>2010-03-01T07:08:40.728-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RDF/XML'/><title type='text'>Improving RDF/XML Interoperability</title><content type='html'>All the permitted variations in RDF/XML make working with it using XML tools difficult, at best. Most of the time assumptions are made about the structure of the RDF/XML document. These are based on particular RDF/XML implementations. However, there is no standard spec that says what this simplified structure should be. The next generation of RDF specs should correct this and create a subset of RDF/XML for working with XML tools.&lt;br /&gt;&lt;br /&gt;A good place to start is with the &lt;a href="http://lists.w3.org/Archives/Public/semantic-web/2010Jan/0242.html"&gt;document Leo Sauermann has started&lt;/a&gt;. I like the design, but feel the rules could be improved, based on my experience.&lt;br /&gt;&lt;br /&gt;The design of SimpleRdfXml, as proposed by Leo, is:&lt;br /&gt; 1. be compatible with RDF/XML&lt;br /&gt; 2. but only a subset&lt;br /&gt; 3. restrict to simplicity &lt;br /&gt;&lt;br /&gt;The rules I try to follow when serializing RDF/XML for use with XSLT are:&lt;br /&gt;&lt;br /&gt; 1. No nested elements (references to resources must be done via rdf:resource or rdf:nodeID).&lt;br /&gt; 2. No property attributes.&lt;br /&gt; 3. All blank nodes identified by rdf:nodeID.&lt;br /&gt; 4. Only full URIs, no relative URIs.&lt;br /&gt; 5. No type node elements, always as rdf:type element.&lt;br /&gt; 6. The same rdf:about maybe repeated on multiple nodes.&lt;br /&gt; 7. Never use rdf:ID.&lt;br /&gt; 8. Always use rdf:li when possible.&lt;br /&gt; 9. Always use rdf:parseType="Collection" when possible.&lt;br /&gt;10. All rdf:XMLLiterals written as rdf:parseType="Literal".&lt;br /&gt;11. Never use rdf:parseType="Resource".&lt;br /&gt;12. White-space is preserved within literal tags.&lt;br /&gt;&lt;br /&gt;By standardizing on these (or another RDF/XML subset), interoperability between XML and RDF tools becomes possible. This allows existing shops to reuse their current XML skills to work with RDF, easing their transition.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/c4fc4f21-939a-4de9-bf46-487a7b89ab55/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=c4fc4f21-939a-4de9-bf46-487a7b89ab55" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-7565082960070954473?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/7565082960070954473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2010/03/improving-rdfxml-interoperability.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7565082960070954473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7565082960070954473'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2010/03/improving-rdfxml-interoperability.html' title='Improving RDF/XML Interoperability'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-3541941256911500731</id><published>2010-02-17T04:34:00.000-08:00</published><updated>2010-02-17T04:36:21.284-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SPARQL'/><title type='text'>Beyond the SPARQL Protocol</title><content type='html'>The SPARQL Protocol has done a lot to bring different RDF stores together and make interoperability possible. However, the SPARQL Protocol does not encompass all operations that are typical of an RDF store. Below are some ideas, that would extend the protocol enough that it could become a general protocol for RDF store interoperability.&lt;br /&gt;&lt;br /&gt;One common complaint is the lack of direct support for graphs. This is partly addressed in the upcoming SPARQL 1.1, which includes support for GET/PUT/POST/DELETE on &lt;a href="http://www.w3.org/2009/sparql/docs/http-rdf-update/"&gt;named graphs&lt;/a&gt;. However, it is still missing the ability to manage these graphs. What is still needed is a way to assign a graph name to a set of triples as well as a vocabulary to search and describe the available graphs. The service could accepted a POST request of triples and responded with the created named graph to support construction. The graph metadata could be available in a separate service or as part of the existing SPARQL service, made available via SPARQL queries.&lt;br /&gt;&lt;br /&gt;The use of POST in SPARQL ensures &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Serializability" title="Serializability" rel="wikipedia"&gt;serializability&lt;/a&gt; of client operations. However, it prevents HTTP caching (with reasonably sized queries), which is necessary for Web scalability. This can be rectified by introducing standard named query support. By providing the client with the ability to create and manage server side queries (with variable bindings), many common operations can become cachable. These named queries can be described in their own service or as part of the existing SPARQL service. The named query metadata would include optional variable bindings and &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Web_cache" title="Web cache" rel="wikipedia"&gt;cache control&lt;/a&gt; settings. The queries could then be evaluated on HTTP GET to the URI of the query name, using the configured cache control, enabling Web scalability.&lt;br /&gt;&lt;br /&gt;Another requirement for broad RDF store deployments is the ability to isolate changes. Many changes are directly dependent on a particular state of the store and cannot be represented in a update statement. Although SPARQL 1.1 allows update statements to be dependent on a graph pattern, many changes have indirect relationships to the store state and cannot be related directly within a WHERE clause.&lt;br /&gt;&lt;br /&gt;To accommodate this form of isolation, separate service endpoints are needed to track the observed store state and the triples inserted/deleted. Metadata about the various available endpoints could be discoverable within each service (or through a dedicated service). This metadata could include such information as the parent service (if applicable) and the &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Isolation_%28database_systems%29" title="Isolation (database systems)" rel="wikipedia"&gt;isolation level&lt;/a&gt; used within the endpoint.&lt;br /&gt;&lt;br /&gt;To support serializable isolation, each endpoint would need to watch for Content-Location: &lt;endpoint-uri&gt; headers, which would indicate the source of the update statement in the POST requests. When such a update occurs, the service must validate that the observed store state in the source endpoint is the same as the store state in the target endpoint before proceeding.&lt;br /&gt;&lt;br /&gt;By standardizing graph, query, and isolation vocabularies within the SPARQL protocol, RDF stores would be much more appealing to a broader market.&lt;/endpoint-uri&gt;&lt;fieldset class="zemanta-related"&gt;&lt;legend class="zemanta-related-title"&gt;Related articles by Zemanta&lt;/legend&gt;&lt;ul class="zemanta-article-ul"&gt;&lt;li class="zemanta-article-ul-li"&gt;&lt;a href="http://www.w3.org/blog/SW/2010/01/28/new_sparql_drafts_published"&gt;New SPARQL drafts published&lt;/a&gt; (w3.org)&lt;/li&gt;&lt;/ul&gt;&lt;/fieldset&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/74e8e680-504b-4e11-b906-e4329c5b74eb/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=74e8e680-504b-4e11-b906-e4329c5b74eb" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-3541941256911500731?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/3541941256911500731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2010/02/beyond-sparql-protocol.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/3541941256911500731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/3541941256911500731'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2010/02/beyond-sparql-protocol.html' title='Beyond the SPARQL Protocol'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-3832101914240870985</id><published>2010-02-09T07:45:00.000-08:00</published><updated>2010-02-09T07:51:08.051-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RDFa'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><title type='text'>RDFa Change Sets</title><content type='html'>With so many sophisticated applications on the Web, the key/value HTML form seems overly simplistic for today's Web applications. The browser is increasingly being used to manipulate complex resources and an increasingly popular technique for encoding sophisticated data in HTML is &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/RDFa" title="RDFa" rel="wikipedia"&gt;RDFa&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;RDFa defines a method of encoding data within the DOM of an HTML page using attributes. This allows complex data resources to be connected to the visual aspects that are used to represent them. RDFa provides a standard way to convert an HTML DOM structure into RDF data for further processing.&lt;br /&gt;&lt;br /&gt;Instead of encoding your data in a key/value form, encode your data in RDFa and use DHTML and AJAX to manipulate the DOM structure and in turn manipulate the data. The conversion from HTML to data can be done on the server or client using existing libraries.&lt;br /&gt;&lt;br /&gt;There are a few ways that RDFa can help with communication to the server. The simplest would be to send back the entire HTML DOM for RDFa parsing on the server. However, an HTML page might contain an excessive amount of bulk and therefore this would not be appropriate as a general solution. Instead, using an RDFa parser on the client, the resulting RDF data can be sent to the server, ensuring only the data is transmitted back. This would reduce excessive network traffic and move some of the processing to the client.&lt;br /&gt;&lt;br /&gt;In a recent project, we went further and used rdfquery to parse before and after snapshots on the client to prepare a change-set for submission back to the server. In JavaScript, the client prepared an RDF graph of removed relationships and properties and an RDF graph of added relationships and properties. These two graphs represent a change-set. By using change-sets throughout the stack, enforcing authorization rules and tracking provenance became much more straight-forward.  Change-sets also gave more control over the transaction isolation level, by enabling the possibility of merging (non-conflicting) change-sets. Creating change-sets at the source (on the client) eliminated the need to load/compare all properties on the server, making the process more efficient and less fragile.&lt;br /&gt;&lt;br /&gt;RDFa on the client and submitting change-sets can help streamline data processing and manipulation and avoid much of the boilerplate code associated with mapping data from one format to another.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/6896a744-3673-4266-8151-a52cec53bf64/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=6896a744-3673-4266-8151-a52cec53bf64" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-3832101914240870985?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/3832101914240870985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2010/02/rdfa-change-sets.html#comment-form' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/3832101914240870985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/3832101914240870985'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2010/02/rdfa-change-sets.html' title='RDFa Change Sets'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-579709046748349857</id><published>2009-11-02T09:00:00.000-08:00</published><updated>2009-11-02T11:10:11.773-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Object-Oriented'/><category scheme='http://www.blogger.com/atom/ns#' term='Web service'/><category scheme='http://www.blogger.com/atom/ns#' term='Representational State Transfer'/><category scheme='http://www.blogger.com/atom/ns#' term='Hypertext Transfer Protocol'/><title type='text'>Why isn't the Web Object-Oriented?</title><content type='html'>A big part of the Web is web services, but often these services are not modelled using an object oriented paradigm, even though it is well suited for complex behaviours. Web services are often modelled using a simple request/response paradigm or a service oriented paradigm using a &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Representational_State_Transfer" title="Representational State Transfer" rel="wikipedia"&gt;RESTful&lt;/a&gt; framework, but many of these resource oriented frameworks can be adapted to support some object oriented concepts.&lt;br /&gt;&lt;br /&gt;Many people think of classes and methods when they think of &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Object-oriented_programming" title="Object-oriented programming" rel="wikipedia"&gt;Object-Oriented Programming&lt;/a&gt; (OOP). However, I like to think of OOP as message passing with class specialization. This is particularly helpful when designing Web services, which also use a message passing model. Even RESTful Web services use forms of message passing between nodes.&lt;br /&gt;&lt;br /&gt;Consider the simple URL below. When followed a GET request is sent to a Google server. This can be thought of as sending Google's search object a message with the given search term parameter (using the Google network as the authority). The search object (in this case a proxy) responds with an HTML page with the search results.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-size:xx-small"&gt;   Object Authority&lt;br /&gt; _________|_________&lt;br /&gt;/                   \&lt;br /&gt;http://www.google.com/search?q=Why+isn%27t+the+Web+Object-Oriented%3F&lt;br /&gt;\__________________________/  \_____________________________________/&lt;br /&gt;             |                                  |&lt;br /&gt;       Object Identity                       message&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;All HTTP requests can be thought of as messages being sent to remote objects. The request method, query parameters, headers, and body make up the message, and the request URI identifies the message's target object. The HTTP response is the message's return value.&lt;br /&gt;&lt;br /&gt;However, OOP is more than simply message passing. A big part of OOP is the association of behaviour with data. The relationship between behaviour and data drives at the difference between service oriented and object oriented paradigms. A service oriented model is like an object oriented model, but all objects are stateless singletons with their own unique behaviour. Because of this, pure service oriented systems can be more efficient (less data access), but is more expensive to maintain, as each service must consider all possible variations at once. In contrast, OOP supports behaviour specialization and can more closely reflect the structure of systems 'in the real world'.&lt;br /&gt;&lt;br /&gt;While many services are identified by a single request URI (scheme+authority+path), most RESTful frameworks allow data to also be associated with the URI. &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/JAX-RS" title="JAX-RS" rel="wikipedia"&gt;JAX-RS&lt;/a&gt;, for example, allows path parameters that are often populated with a unique entity ID. By incorporating the entity ID in the URI, data is associated with the behaviour in the same way as in an OOP paradigm. However, most RESTful frameworks fail to provide any support for object or resource behaviour specialization -- a feature that is incredibly powerful in class-based OOP.&lt;br /&gt;&lt;br /&gt;The Web is actually fairly close to seamlessly supporting an object-oriented paradigm. Processing efficiency seems to be the only barrier. However, with the growing costs of maintaining complex Web systems, I'm not sure how long this argument can hold up. When do you think we'll have an object oriented Web framework and what would it look it?&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/1f3186f7-35df-45af-88ce-4fb6e6313143/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=1f3186f7-35df-45af-88ce-4fb6e6313143" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-579709046748349857?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/579709046748349857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/11/why-isnt-web-object-oriented.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/579709046748349857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/579709046748349857'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/11/why-isnt-web-object-oriented.html' title='Why isn&apos;t the Web Object-Oriented?'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-6620798280700429227</id><published>2009-10-26T07:23:00.000-07:00</published><updated>2009-10-27T09:06:22.911-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web service'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming paradigm'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>The Complicated Software Stack</title><content type='html'>To aspiring Web application developers or people looking to put together their own Web application: the road to building a modern working Web application is a long and complicated journey.&lt;br /&gt;&lt;br /&gt;Today's Web application developer is nothing short of a jack-of-all-trates, requiring deep knowledge of everything from HTML and CSS to Java and SQL. Everything from common &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Create%2C_read%2C_update_and_delete" title="Create, read, update and delete" rel="wikipedia"&gt;CRUD&lt;/a&gt; tasks to sophisticated work-flows requires knowledge of half a dozen computer languages along with their quirks and variations across platforms and applications.&lt;br /&gt;&lt;br /&gt;Today's software is built using a mix of &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Programming_paradigm" title="Programming paradigm" rel="wikipedia"&gt;programming paradigms&lt;/a&gt; and data models. Every level in the software stack requires explicit data mapping between paradigms. Many Web applications include the following levels in their software stack:&lt;br /&gt;• Relational for persistence,&lt;br /&gt;• Object oriented (class-based) in the model,&lt;br /&gt;• Aspects peppered throughout,&lt;br /&gt;• Resource (or activity) oriented Web services,&lt;br /&gt;• Functional template engines,&lt;br /&gt;• Markup using key/value pairs, and&lt;br /&gt;• Prototype based objects for UI behaviour.&lt;br /&gt;&lt;br /&gt;The above complication comes at a price. Software takes longer to develop and is more expensive to maintain than it used to be. This is causing a greater divide between small tools and large software systems.&lt;br /&gt;&lt;br /&gt;Applications, like Microsoft Excel, which combine data processing and persistence using a consistent programming paradigm, have grown in popularity as a cheap alternatives to the complexity of modern Web applications.&lt;br /&gt;&lt;br /&gt;While the market for Web applications has grown, the scope has decreased, favouring large high volume systems. Smaller Web applications are too often over-architected and over-budget. There is a large (and growing) opportunity for software vendors to fill this divide and create a new platform that combines data processing and persistence, using a single programming paradigm, for Web applications.&lt;br /&gt;&lt;br /&gt;Can Web applications be built to use a single programming paradigm?&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/47d13b99-70c8-4b56-a1e7-c2c2a3aa6778/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=47d13b99-70c8-4b56-a1e7-c2c2a3aa6778" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-6620798280700429227?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/6620798280700429227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/10/complicated-software-stack.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6620798280700429227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6620798280700429227'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/10/complicated-software-stack.html' title='The Complicated Software Stack'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-2155318444033706912</id><published>2009-09-29T17:18:00.000-07:00</published><updated>2009-10-01T09:12:04.136-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebKit'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Chrome'/><title type='text'>Chrome Frame: Love It Or Hate It</title><content type='html'>&lt;p class="zemanta-img" style="margin: 1em; float: right; display: block; width: 104px;"&gt;&lt;a href="http://en.wikipedia.org/wiki/Image:GoogleChromeLogo.png"&gt;&lt;img src="http://upload.wikimedia.org/wikipedia/en/3/35/GoogleChromeLogo.png" alt="Google Chrome" style="border: medium none ; display: block;" height="93" width="98"&gt;&lt;/a&gt;&lt;span class="zemanta-img-attribution"&gt;Image via &lt;a href="http://en.wikipedia.org/wiki/Image:GoogleChromeLogo.png"&gt;Wikipedia&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;Google has clearly struck a nerve among browser makers with the announcement of Chrome Frame. Microsoft was awfully quick to down play any &lt;a href="http://arstechnica.com/microsoft/news/2009/09/microsoft-google-chrome-frame-makes-ie-less-secure.ars"&gt;thoughts about installing Chrome&lt;/a&gt; as a plugin for IE considering it refers to the &lt;a class="zem_slink" href="http://webkit.org/" title="WebKit" rel="homepage"&gt;WebKit&lt;/a&gt;'s market share as a "&lt;a href="http://www.techcrunch.com/2009/09/29/ballmer-microsoft-interview-chrome-windows-internetexplorer/"&gt;rounding error&lt;/a&gt;". Mozilla has also recently become vocal about putting down any &lt;a href="http://www.computerworld.com/s/article/9138662/Mozilla_slams_Google_s_Chrome_Frame_as_browser_soup_"&gt;notion of a browser-in-a-browser&lt;/a&gt; solution. This is all quite bizarre as both of these players are big into browser plugins of some form or another. Microsoft with its alternative &lt;a class="zem_slink" href="http://www.microsoft.com/SILVERLIGHT" title="Microsoft Silverlight" rel="homepage"&gt;Silverlight&lt;/a&gt; application engine and Mozilla, which acquired its market share through &lt;a href="http://www.computerworld.com/s/article/9011975/20_must_have_Firefox_extensions"&gt;extensible plugins&lt;/a&gt; of its own.&lt;br /&gt;&lt;br /&gt;It is actually quite common to have multiple rendering engines within the same browser: flash, silverlight, and Java being the most obvious, but there is more. IE has had a number of browser plugins in the past, including &lt;a href="http://www.iol.ie/%7Elocka/mozilla/control.htm"&gt;Mozilla ActiveX Control&lt;/a&gt; and &lt;a href="http://code.google.com/p/svgweb/"&gt;Google's SVG plugin&lt;/a&gt;. IE8 ships with multiple rendering engines that get triggered based on HTML tags or user actions. &lt;a href="http://en.wikipedia.org/wiki/Netscape_7"&gt;Nescape 7&lt;/a&gt;, although short lived, shipped with both the &lt;a class="zem_slink" href="http://developer.mozilla.org/en/docs/Gecko" title="Gecko (layout engine)" rel="homepage"&gt;Gecko&lt;/a&gt; and IE rendering engines. Mozilla has previously encouraged this type of action in the past, with Google's &lt;a href="http://code.google.com/p/explorercanvas/"&gt;ExCanvas&lt;/a&gt; and Mozilla's, now inactive, &lt;a href="https://wiki.mozilla.org/Tamarin:ScreamingMonkey"&gt;Screaming Monkey&lt;/a&gt; initiative. Today Mozilla still makes &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1419"&gt;IE available as a Firefox plugin&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I think it is ridiculous to ask users to only use particular browsers for particular websites. Choosing the best available rendering engine should be the choice of the website authors and I would welcome a mega-browser that seamlessly switches between Gecko, Trident, WebKit, and Presto based on the preferred engine of the author. More precisely, I trust website authors will choose standard compliant engines more then I trust users to choose standard compliant browsers.&lt;br /&gt;&lt;br /&gt;I find Mozilla's reaction particularly interesting as it comes at a time when I find myself, an old Gecko fan, looking at WebKit more seriously. Recently in a project, due to an &lt;a href="https://developer.mozilla.org/en/XPath/Axes/namespace"&gt;old outstanding Gecko issue&lt;/a&gt;, I had to put Firefox support on hold while Trident, Presto and WebKit continued to operate without much trouble.&lt;br /&gt;&lt;br /&gt;I know it is true with IE, but perhaps it is true with Mozilla as well, that they view the engine as just something a browser needs and not a feature in and of itself. Perhaps I have been wrong all along and &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/XUL" title="XUL" rel="wikipedia"&gt;XUL&lt;/a&gt; is actually Mozilla's doom.&lt;fieldset class="zemanta-related"&gt;&lt;legend class="zemanta-related-title"&gt;Related articles by Zemanta&lt;/legend&gt;&lt;ul class="zemanta-article-ul"&gt;&lt;li class="zemanta-article-ul-li"&gt;&lt;a href="http://www.downloadsquad.com/2009/09/26/webkit-claims-another-browser-as-epiphany-bails-on-mozilla/"&gt;WebKit claims another browser as Epiphany bails on Mozilla&lt;/a&gt; (downloadsquad.com)&lt;/li&gt;&lt;li class="zemanta-article-ul-li"&gt;&lt;a href="http://tech.slashdot.org/story/09/09/29/2052248/Mozilla-Slams-Chrome-Frame-As-Browser-Soup?from=rss"&gt;Mozilla Slams Chrome Frame As "Browser Soup"&lt;/a&gt; (tech.slashdot.org)&lt;/li&gt;&lt;li class="zemanta-article-ul-li"&gt;&lt;a href="http://www.computer-realm.net/chrome-vs-firefox/"&gt;Chrome vs Firefox&lt;/a&gt; (computer-realm.net)&lt;/li&gt;&lt;/ul&gt;&lt;/fieldset&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/08de43f1-430e-4a93-b58c-95b67e6001ac/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=08de43f1-430e-4a93-b58c-95b67e6001ac" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-2155318444033706912?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/2155318444033706912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/09/chrome-frame-love-it-or-hate-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2155318444033706912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2155318444033706912'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/09/chrome-frame-love-it-or-hate-it.html' title='Chrome Frame: Love It Or Hate It'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-8289254261092940236</id><published>2009-09-20T09:30:00.000-07:00</published><updated>2009-09-20T11:13:24.845-07:00</updated><title type='text'>Accept Headers: In The Wild</title><content type='html'>As web agents (including browsers) become more diverse there is an increasing need to distinguish between their types. The &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/User_agent" title="User agent" rel="wikipedia"&gt;User-Agent&lt;/a&gt; header can be used for this task, but requires the server to know in advance all the possible agents and what type they are. This is not possible as both the diversity and quantity of agents is growing too quickly for any single registry to track.&lt;br /&gt;&lt;br /&gt;According to the HTTP specification, the Accept header can be used to determine the type of agent. For example:&lt;br /&gt;• HTML browsers should include "text/html" within the Accept header,&lt;br /&gt;• XHTML browsers include "application/html+xml",&lt;br /&gt;• RDF browsers include "application/rdf+xml",&lt;br /&gt;• XSLT agents include "application/xml",&lt;br /&gt;• PDF agents include "application/pdf",&lt;br /&gt;• Office suites include "application/x-ms-application" or "application/vnd.oasis.opendocument", and&lt;br /&gt;• JavaScript libraries include "application/json"&lt;br /&gt;&lt;br /&gt;This allows the server to better redirect the agent to an appropriate resource.&lt;br /&gt;&lt;br /&gt;Obviously, if a service will only serve HTML browsers, the type of agent is not necessary, as is the case in the Web 1.0 days when everything on the Web was HTML. However, as HTTP is becoming a more popular protocol for non-HTML communication, the need for distinguishing between types of agents is becoming important.&lt;br /&gt;&lt;br /&gt;Consider the situation when an abstract information resource (like an order or an account) is identified by a URL. When the server receives a request for an abstract information resource, it needs to know which type of agent is requesting it, so it can better redirect the agent to an appropriate representation. If the agent is an HTML browser, the server should redirect to an html page displaying the order or account information; if a JavaScript library, the server should redirect to a json dump of the order/account summary; if a PDF agent, the server should redirect to a order/account summary report; if an office suite, the server should redirect to a spreadsheet of the details.&lt;br /&gt;&lt;br /&gt;This works very well in theory, but because the Web was built with only HTML browsers in mind, most browsers don't properly implement the HTTP specification (because they don't have to). Even worse is that most non-HTML browser agents either don't include an Accept Header at all or use */* and say nothing about the type of agent. Below are some of the default accept headers from popular user agents on the web.&lt;br /&gt;&lt;br /&gt;FF3.5 is an HTML and XHTML browser first, XML/XSLT agent second&lt;br /&gt;text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&lt;br /&gt;&lt;br /&gt;IE8 is a media viewer (apparently)&lt;br /&gt;image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, */*&lt;br /&gt;&lt;br /&gt;IE8+office is a media viewer and office suite&lt;br /&gt;image/gif, image/jpeg, image/pjpeg, application/x-ms-application,&lt;br /&gt;        application/vnd.ms-xpsdocument, application/xaml+xml,&lt;br /&gt;        application/x-ms-xbap, application/x-shockwave-flash,&lt;br /&gt;        application/x-silverlight-2-b2, application/x-silverlight,&lt;br /&gt;        application/vnd.ms-excel, application/vnd.ms-powerpoint,&lt;br /&gt;        application/msword, */*&lt;br /&gt;&lt;br /&gt;Chrome3 is an XHTML and XML/XSLT agent first, HTML browser second, and text viewer third.&lt;br /&gt;application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5&lt;br /&gt;&lt;br /&gt;Safari3 is an XHTML and XML/XSLT agent first, HTML browser second, and text viewer third.&lt;br /&gt;text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5&lt;br /&gt;&lt;br /&gt;Opera10 is an HTML and XHTML browser first, XML/XSLT agent second.&lt;br /&gt;text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1&lt;br /&gt;&lt;br /&gt;The MSN bot is an HTML browser, text viewer, xml client and application archiver.&lt;br /&gt;text/html, text/plain, text/xml, application/*, Model/vnd.dwf, drawing/x-dwf&lt;br /&gt;&lt;br /&gt;Google search bot is a jack of all agents, master of none&lt;br /&gt;*/*&lt;br /&gt;&lt;br /&gt;Yahoo search bot is a jack of all agents, master of none&lt;br /&gt;*/*&lt;br /&gt;&lt;br /&gt;AppleSyndication is a jack of all agents, master of none&lt;br /&gt;*/*&lt;br /&gt;&lt;br /&gt;See Also:&lt;br /&gt;&lt;a href="http://www.newmediacampaigns.com/page/browser-rest-http-accept-headers"&gt;Unacceptable Browser HTTP Accept Headers (Yes, You Safari and Internet Explorer)&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.newmediacampaigns.com/page/webkit-team-admits-accept-header-error"&gt;WebKit Team Admits Error, Downplays Importance, Re: 'Unacceptable Browser HTTP Accept Headers'&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/cef25e11-42b1-438e-b15c-49597cc93583/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=cef25e11-42b1-438e-b15c-49597cc93583" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-8289254261092940236?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/8289254261092940236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/09/accept-headers-in-wild.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8289254261092940236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8289254261092940236'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/09/accept-headers-in-wild.html' title='Accept Headers: In The Wild'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-2154736054727657201</id><published>2009-08-24T06:58:00.000-07:00</published><updated>2009-08-24T07:05:12.069-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RDFa'/><category scheme='http://www.blogger.com/atom/ns#' term='RDF'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Dereferencable Identifiers</title><content type='html'>A document URL is a dereferencable document identifier. We use &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Uniform_Resource_Locator" title="Uniform Resource Locator" rel="wikipedia"&gt;URLs&lt;/a&gt; all over the Web to identify HTML pages and other web resources. When you can't give out a brochure you can share a URL. Instead of sending a large email attachment, you might just send a URL instead. Rather then creating long appendixes, you can simply link to other resources. It is so much more useful to pass around URLs then it is trying to transfer entire documents around.&lt;br /&gt;&lt;br /&gt;This model has worked well for document and is now being adopted for other type of resources. With the popularity of XML, using URLs to identify data resources is now commonplace. Rather then passing around a complete record, agents pass around an identifier that can be used to lookup the record later. By using a URL as the identifier these agents don't need to be tied to any single dataset and are much more reusable.&lt;br /&gt;&lt;br /&gt;From the &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/HTML_5" title="HTML 5" rel="wikipedia"&gt;HTML5&lt;/a&gt; standardization process has risen the debate on the usefulness of URLs as model identifier. Most people agree that a URL is a good way to identify documents, web resources and data resources. However, the debate continues on the usefulness of using a URL as an identifier within a model vocabulary. One side claims that a model vocabulary should be centralized and therefore does not require the flexibility of a URL. The other side claims the model vocabulary should be extensible and requires a universal identifying scheme that URLs provide.&lt;br /&gt;&lt;br /&gt;To understand the potential usefulness of using a URL as a model identifier, consider the behaviour difference between a missing &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Document_Type_Definition" title="Document Type Definition" rel="wikipedia"&gt;DTD&lt;/a&gt; and a missing Java class. A DTD is identified using a URL and a Java class is not. When an XML validator encounters a DTD it does not understand it dereferences the identifier and uses the resulting model to process the XML document. When a JVM encounters a Java class it does not understand it throws an exception, often terminating the entire process. Now consider how much easier it would be to program if a programming environment used URLs for classes and model versions. Dependency management would become as simple as managing import statements. As the Web becomes the preferred programming environment of the future, we must consider these basic programming concerns.&lt;br /&gt;&lt;br /&gt;Although I enjoy working in abstractions, I certainly understand how things always get more complicated when you go meta: using URLs to describes other URLs. However, this complexity is essential to continue to maintain the flexibility and extensibility of the Web.&lt;br /&gt;&lt;br /&gt;See Also: &lt;a href="http://www.jenitennison.com/blog/node/124"&gt;HTML5/RDFa Arguments&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/92841b26-3f7b-42e6-aa09-ce6bed82e11b/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=92841b26-3f7b-42e6-aa09-ce6bed82e11b" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-2154736054727657201?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/2154736054727657201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/08/dereferencable-identifiers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2154736054727657201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2154736054727657201'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/08/dereferencable-identifiers.html' title='Dereferencable Identifiers'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-2351802173386077687</id><published>2009-08-23T11:47:00.000-07:00</published><updated>2009-08-23T11:57:03.129-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Project management'/><title type='text'>97 Things Every Project Manager Should Know</title><content type='html'>If the projects you manage don't go as smoothly as you'd like, 97 Things Every Project Manager Should Know offers knowledge that's priceless, gained through years of trial and error. This illuminating book contains 97 short and extremely practical tips -- whether you're dealing with software or non-IT projects -- from some of the world's most experienced project managers and software developers. You'll learn how they've dealt with everything from managing teams to handling project stakeholders to runaway meetings and more.&lt;br /&gt;&lt;br /&gt;This is O'Reilly's second book in its 97 Things series. My contributions included tips to Provide Regular Time to Focus and Work in Cycles.&lt;br /&gt;&lt;br /&gt;&lt;fieldset class="zemanta-related"&gt;&lt;legend class="zemanta-related-title"&gt;Related articles by Zemanta&lt;/legend&gt;&lt;ul class="zemanta-article-ul"&gt;&lt;li class="zemanta-article-ul-li"&gt;&lt;a href="http://oreilly.com/catalog/9780596804169/"&gt;97 Things Every Project Manager Should Know&lt;/a&gt; (oreilly.com)&lt;/li&gt;&lt;/ul&gt;&lt;/fieldset&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/7e096ff2-9f3b-4c4a-b28b-02fe5797f7bb/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=7e096ff2-9f3b-4c4a-b28b-02fe5797f7bb" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-2351802173386077687?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/2351802173386077687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/08/97-things-every-project-manager-should.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2351802173386077687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2351802173386077687'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/08/97-things-every-project-manager-should.html' title='97 Things Every Project Manager Should Know'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-7818723466786853265</id><published>2009-07-31T08:47:00.000-07:00</published><updated>2009-08-01T19:09:07.216-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SPARQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Sesame'/><category scheme='http://www.blogger.com/atom/ns#' term='Jena'/><title type='text'>SPARQL Federation and Quints</title><content type='html'>There are currently a couple popular way to federate sparql endpoints together:&lt;br /&gt;&lt;br /&gt;1) In Jena the service must be explicitly part of the query, and therefor the model,&lt;br /&gt;&lt;br /&gt;2) In Sesame the basic query patterns must be associated with one or more endpoints before evaluating the query, or&lt;br /&gt;&lt;br /&gt;3) Hack the remote query into a graph URI: &lt;a href="http://gearon.blogspot.com/2009/05/federated-queries-long-time-ago-tks.html"&gt;http://gearon.blogspot.com/2009/05/federated-queries-long-time-ago-tks.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Although both can be used to achieve the same results, Jena's solution puts more responsibility in the data model, and Sesame's put more responsibility in the deployment. Both have their trade offs, but I believe the query is suppose to be abstracted away from underlying services. The domain model (and therefore the queries) should not be aware of how the data is distributed (or stored) across a network. Therefore, I prefer to describe which graph patterns and relationships are available at each endpoint during deployment and make the application model independent of available service endpoints.&lt;br /&gt;&lt;br /&gt;Furthermore, I think it is a bit silly to add yet another level of complexity to the basic query pattern. Adding the service level turns the basic query pattern from a quad to a quint.&lt;br /&gt;&lt;br /&gt;To fully index a quint (with support for a service variable, which Jena does not support) would take 13 indexes (nearly double what a quad requires). Below is a table of some complexity levels and how many indexes they require to be fully indexed (variables could appear in any position within the pattern). I have included a theoretical sext that would allow you to group services in a network (just as graphs can be grouped in a service).&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Level&lt;/th&gt;&lt;th&gt;#ofIdx&lt;/th&gt;&lt;th&gt;Term&lt;/th&gt;&lt;th&gt;Data Structure&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;double&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;subject&lt;/td&gt;&lt;td&gt;directed graph&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;triple&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;predicate&lt;/td&gt;&lt;td&gt;labelled directed graph&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;quad&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;graph&lt;/td&gt;&lt;td&gt;multiple labelled directed graphs&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;quint&lt;/td&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;service&lt;/td&gt;&lt;td&gt;replicated multiple labelled directed graphs&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;sext&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;network&lt;/td&gt;&lt;td&gt;trusted replicated multiple labelled directed graphs&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Switching from triples to quad provides a big functionality leap (the ability to refer to an entire graph as a single resource). However, I question how much functionality a quint (or a sext) has over a quad. Couldn't the same functionality be put into a property of the graph (or embedded in the graph's URI authority). An inferencing engine/query could also conclude graph relationships like (subGraphOf), which would still allow a large, but precise, collection of graphs to be queried more effectively.&lt;br /&gt;&lt;br /&gt;Hopefully, this topic will have more time to mature before the SPARQL working group makes any official decisions on the matter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3465716704098863819-7818723466786853265?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/7818723466786853265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/07/sparql-service.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7818723466786853265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7818723466786853265'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/07/sparql-service.html' title='SPARQL Federation and Quints'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-1325983618571963253</id><published>2009-07-22T05:34:00.000-07:00</published><updated>2009-07-22T06:27:00.099-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Object-Oriented'/><title type='text'>Enterprise Information Systems and Web Technologies</title><content type='html'>I recently got back from speaking at the Enterprise Information Systems and Web Technologies conference in Orlando Florida. There I presented my paper on an &lt;a href="http://www.leighnet.ca/publications.xhtml"&gt;Object-Oriented rules engine&lt;/a&gt;. In the talk I shared examples of when businesses need to coordinate, track data, and policy check between organizations. Such as in transportation, satellite data tracking, and contract management. I outlined the following requirements and went into detail on the various components of the system.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Requirements&lt;/span&gt;&lt;br /&gt;Reduce the investment costs and time&lt;br /&gt;Policies understandable by domain experts&lt;br /&gt;Rules must not inadvertently interfer with one another&lt;br /&gt;Model complex domains&lt;br /&gt;Easily adapted to change&lt;br /&gt;Policy rules have access to external services&lt;br /&gt;Track all state changes both their cause and effect&lt;br /&gt;&lt;br /&gt;The talk was well received and posed some interesting discussions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3465716704098863819-1325983618571963253?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/1325983618571963253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/07/enterprise-information-systems-and-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/1325983618571963253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/1325983618571963253'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/07/enterprise-information-systems-and-web.html' title='Enterprise Information Systems and Web Technologies'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-8542105547732577895</id><published>2009-07-08T13:45:00.000-07:00</published><updated>2009-07-08T13:50:06.913-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Semantic Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Linked Data'/><title type='text'>Panel: Linked Open Data</title><content type='html'>The SemTech 2009 Videos have been posted, including the Linked Open Data Panel.&lt;br /&gt;&lt;br /&gt;The "data commons" is a cornerstone of the semantic web vision. The Linked and Open Data movements are progressing beyond the early adopter phase and preparing to cross the chasm. Enough experience now exists to reflect on how this data set is being used, how useful it is, and where we can take it from here. Beyond the basics, the panel will discuss issues such as quality of service, stability, and longevity. They'll also explore the evolution of the semantic web with a particular emphasis on modes of data use, reuse and aggregation.&lt;br /&gt;&lt;br /&gt;Paul Miller, The Cloud of Data&lt;br /&gt;Jamie Taylor, Metaweb Technologies, Inc.&lt;br /&gt;Leigh Dodds, Talis&lt;br /&gt;James Leigh, James Leigh Services, Inc.&lt;br /&gt;Kingsley Idehen, OpenLink Software, Inc.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.semanticuniverse.com/semtech-panel-linked-open-data.html"&gt;http://www.semanticuniverse.com/semtech-panel-linked-open-data.html&lt;/a&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/2e49d13b-cb5c-41c0-8db4-e50038aeee5d/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=2e49d13b-cb5c-41c0-8db4-e50038aeee5d" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-8542105547732577895?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/8542105547732577895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/07/panel-linked-open-data.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8542105547732577895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8542105547732577895'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/07/panel-linked-open-data.html' title='Panel: Linked Open Data'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-460214524766154633</id><published>2009-06-30T09:19:00.001-07:00</published><updated>2009-06-30T12:16:30.259-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Web server'/><category scheme='http://www.blogger.com/atom/ns#' term='Hypertext Transfer Protocol'/><title type='text'>HTTP Servlet Caching Filter</title><content type='html'>The nice thing about the HTTP protocol is how easy it is to implement an trivial HTTP server. At some point, however, just responding to HTTP requests is not enough and response caching must be introduced.&lt;br /&gt;&lt;br /&gt;If you search for "servlet response caching", you will find advice to ensure you use the correct response headers to facilitate HTTP caching and suggestions to use a servlet filter to cache the response. If you are like me, you would continue to search for a way to use both - a servlet filter that caches based on the correct response headers.&lt;br /&gt;&lt;br /&gt;With the HTTP protocol so well supported and J2EE so popular, finding a caching servlet filter that adheres to the HTTP spec should be easy, but it isn't. In fact, it is really hard to find any Java implementations that caches based on the HTTP response headers (servlet filter or otherwise). This seemed like an interesting problem that is fairly common, so I spent some time to see how far I could get with a servlet filter that understands HTTP caching.&lt;br /&gt;&lt;br /&gt;Despite my general knowledge of the HTTP spec, implementing it is a lot more difficult. For example, the If-Modified-Since and If-None-Match headers are fairly easy to understand, but when you try and implement this logic, things get a little more complicated. In working through this, I realized that there are nearly 20 possible scenarios that need to be handled by the server. The request might not have an If-Modified-Since header, it might have been modified, and it might not have been modified are three states the server must handle for that header. The If-None-Match may not be present or it might or might not match and it might have a '*' tag, which may not may not have an existing entity. You can't just process these one at a time either, but once you write down the edge cases it can all be handled fairly compactly within a precondition check.&lt;br /&gt;&lt;br /&gt;Another area that surprised me was the request Cache-Control directives. There are five boolean directives and three with a specified value. All of these directives are fairly easy to understand and are used to determine if the cache can be used and if it needs to be validated. However, that is a lot of variables to manage and combined with the possible server directives, its gets really harry tracking their state. There were many occasions when adding support for a new header/directive that I inadvertently broke an earlier unit test (couldn't have done it without them).&lt;br /&gt;&lt;br /&gt;The HTTP spec is fairly clear is some areas, but less so in others. One area that has had various interpretations is entity tags. It is fairly clear how ETags should be used with static GET requests, although I had to digest their implications on caches before I could understand how to use them with &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Content_negotiation" title="Content negotiation" rel="wikipedia"&gt;content negotiation&lt;/a&gt;. However, their recommended use with PUT and DELETE is still a bit of a mystery. When an entity has no fixed serialized format (such as a data record), it has many entity tags (one for each serialized variation and version). So, which entity tag should be used after a PUT or a DELETE that effects all variations?&lt;br /&gt;&lt;br /&gt;This get even more complicated when some URLs are used to represent a property of a data record.  If the property is a foreign key, the response has no serializable format, its a 303 See Also response. What does a PUT look like when you want to reference another resource? Furthermore, a DELETE of a property, just deletes the property, but the data record still exists and there is still a version associated with it, shouldn't the client be given the new version?&lt;br /&gt;&lt;br /&gt;In the end I have a new appreciation for why there are so many interpretations of the HTTP spec and I have a fairly general purpose HTTP caching servlet filter on top of it.&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/612d19c6-ca8c-4f26-ae91-0ef3be43eccc/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=612d19c6-ca8c-4f26-ae91-0ef3be43eccc" alt="Reblog this post [with Zemanta]" /&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-460214524766154633?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/460214524766154633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/06/http-servlet-caching-filter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/460214524766154633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/460214524766154633'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/06/http-servlet-caching-filter.html' title='HTTP Servlet Caching Filter'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-3426950914172519840</id><published>2009-06-17T16:45:00.000-07:00</published><updated>2009-06-30T12:20:40.370-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Object-Oriented'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Representational State Transfer'/><category scheme='http://www.blogger.com/atom/ns#' term='Hypertext Transfer Protocol'/><title type='text'>Resource Oriented Framework</title><content type='html'>What happens when you put an Object oriented Rules Engine in a Resource Oriented Framework? After three years of research, I think I have found the answer and have released it as &lt;a href="http://www.openrdf.org/"&gt;AliBaba&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;AliBaba is separated into three primary modules. The Object Repository provides the Object Oriented Rules Engine. It is based on the Elmo codebase that has been in active development for the past four years. The Metadata Server is a Resource Oriented Framework built around the Object Repository. Finally, the Federation SAIL gives AliBaba more scalability.&lt;br /&gt;&lt;br /&gt;In AliBaba, every resource is identified by a URL and can be manipulated through common REST operations (GET, PUT, DELETE). Each resource also has one or more types that enable it to take on Object Oriented features that can be defined in Java or OWL. Each object's properties and methods can be exposed with annotations as HTTP methods or operations. Operations are used with GET, PUT and DELETE HTTP methods by suffixing the URL with a '?' and the operation name. These operations are commonly used for object properties, while object methods are commonly exposed as other HTTP methods (POST) or as GET operations. This HTTP transparency allows the Metadata Server's API to hide within the HTTP protocol and not dictate the protocol used - allowing it to implement many existing RESTful protocols.&lt;br /&gt;&lt;br /&gt;AliBaba provides a unique combination of Object Oriented Programming and a Rules Engine, available in a Resource oriented Framework. I believe it combines some of the most promising design paradigms commonly used in Web applications. Its potential to minimize software maintenance costs and maximize productivity by combining these paradigms is very exciting.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/a0352467-25e9-40a3-9aad-86fd7a6c42ef/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=a0352467-25e9-40a3-9aad-86fd7a6c42ef" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-3426950914172519840?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/3426950914172519840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/06/resource-oriented-framework.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/3426950914172519840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/3426950914172519840'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/06/resource-oriented-framework.html' title='Resource Oriented Framework'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-1390570913535431019</id><published>2009-06-08T08:14:00.000-07:00</published><updated>2009-06-30T12:21:23.353-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Object-Oriented'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming language'/><title type='text'>Intersecting Mixins</title><content type='html'>As software models become increasingly complex, designers seek additional ways to express their domain models in a form that more closely matches their design concepts. One way this is done is through Mixins.&lt;br /&gt;&lt;br /&gt;A Mixin is a reusable set of class members that can be applied to more then one class. It is similar to inheritance, but does not interrupt the existing hierarchy.&lt;br /&gt;&lt;br /&gt;Suppose we have a class called "Invoice" within our domain model and we want to "enhance" this class with operations to fax, email, and snail-mail it to the customer. To prevent the reduction of Invoice's cohesion, we want to define this behaviour in a separate construct. We could subclass Invoice, but the ability to send a document is common among other classes as well. We could put this logic in a super class, but that only works if there is an appropriate common super class among them. An alternative is to create mixins, called Faxable, Emailable, and Mailable, that are added to all the classes that can be sent.&lt;br /&gt;&lt;br /&gt;Suppose some of our documents require a unique header. If this behaviour is common, but no appropriate super exists, a mixin would be a desirable choice. Mixins allow classes to be extended with new behaviour, but what if you want to alter existing behaviour? Unfortunately, many mixin implementations do not allow calls to the overridden method, and the ones that do require it to be done procedurally (by changing an open class at runtime).&lt;br /&gt;&lt;br /&gt;When using inheritance, a subclass can call the overridden method to intersect and alter the existing behaviour, but a mixin does not inherit the behaviour of its targets and there are possibly multiple mixins wanting to alter the same behaviour, so there is no single "super member", but one for every mixin that implements it.&lt;br /&gt;&lt;br /&gt;Most languages allow a mixin to override the target's behaviour, but don't allow it to be intercepted. Some languages, like Ruby and Python, allow the target class to be altered by renaming and replacing members. This allows the programmer to simulate an intersection, but is a much more complex way of handling it.&lt;br /&gt;&lt;br /&gt;In AliBaba's Object Repository a mixin, also known as a behaviour, can declare precedence among other mixins and allows them to control how method execution proceeds. For example if a mixin has the annotation @precedes, it will be executed before any of the given mixin classes are executed. By declaring the method with a @parameterTypes annotation, with the overridden method parameter types, and a Message as the method parameter, the mixin can call msg.proceed() to execute other behaviours and retrieve their result. This allows mixins to call the overridden methods and provides intersecting other methods.&lt;br /&gt;&lt;br /&gt;By extending the basic mixin construct to allow them to co-exist and interact, a mixin can be used to address other aspect oriented problems in an OO way.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/dbbecb39-55ad-435e-b661-906ee0ef2517/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=dbbecb39-55ad-435e-b661-906ee0ef2517" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-1390570913535431019?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/1390570913535431019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/06/intersecting-mixins.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/1390570913535431019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/1390570913535431019'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/06/intersecting-mixins.html' title='Intersecting Mixins'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-7055108182441351388</id><published>2009-06-04T11:35:00.001-07:00</published><updated>2009-06-30T12:22:20.388-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Model–view–controller'/><title type='text'>Time to Rethink MVC on the Web</title><content type='html'>Typical web applications don't do a very good job at separating the model, view, and controller logic. The view is particularly confusing as logic is split between server side and client side. This is a side effect from trying to support "dumb" (or nearly dumb) clients (browsers that only support static HTML). Furthermore, logic that would be more appropriate in the model, often gets put into the controller to avoid unnecessary access to the database.&lt;br /&gt;&lt;br /&gt;While these design decisions lead to faster web application servers, they also lead to what I call coincidence coding - an unwanted code separation that has no documentation or declared interface. The worst part is that this separation often happens in the most visible part of the system: over HTTP and SQL. This prevents the system from becoming a block box utility, because the internals rear their ugly heads. Any attempt to standardize the protocol (or to use well documented services) is impossible because the protocols get stuck between various components of the view or model and cannot be separated cleanly and maintained across versions.&lt;br /&gt;&lt;br /&gt;It is not all doom and gloom: the web is a different place then it was when many of these web frameworks were designed. I am pleased to report that all modern desktop web browsers have good support for client side templating using XSLT (finally!). This means web applications today don't need to support these dumb clients. Furthermore, web proxies have also been improving enough that it is now common for production deployments to plan on use a proxy server in front of the web server(s). Accessing the persisted data is not as much of a problem as it used to be, as database caching is usually planned when systems are being designed.&lt;br /&gt;&lt;br /&gt;With these (somewhat) recent developments, its time for a new breed of web frameworks to emerge. These frameworks could implement MVC on the web like we have never seem before - really separating the model from the view and from the controller. This could have a significant impact on the maintainability of web application software.&lt;br /&gt;&lt;br /&gt;Yesterday, I introduced what I believe to be the first web application framework that does a decent job of separating MVC. It is called the &lt;a href="http://www.openrdf.org/doc/alibaba/2.0-alpha1/alibaba-server-metadata/index.html"&gt;AliBaba Metadata Server&lt;/a&gt; and can be downloaded from &lt;a href="http://www.openrdf.org/"&gt;OpenRDF.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The view logic can only exist in static HTML, JS, CSS, and XSLT files. The model/data is transformed into standard data formats, like RDF and some forms of JSON without model specific transformations. You can't put any model logic into the controller, and all service logic must be put into the model. Stand alone, it would be slower than most web application servers, but with proxy and caching on both ends, I believe it will perform just as well and, most importantly, yield more maintainable web applications.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/22a4593b-9239-4f0c-8737-69eb6ac93bca/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=22a4593b-9239-4f0c-8737-69eb6ac93bca" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-7055108182441351388?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/7055108182441351388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/06/time-to-rethink-mvc-on-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7055108182441351388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7055108182441351388'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/06/time-to-rethink-mvc-on-web.html' title='Time to Rethink MVC on the Web'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-5064386632754248492</id><published>2009-06-01T09:08:00.000-07:00</published><updated>2009-06-30T12:22:55.777-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SPARQL'/><title type='text'>Standard RDF Protocol</title><content type='html'>The SPARQL Working Group's first meeting has come and gone. Part of that meeting discussed the scope of what should be undertaken as part of SPARQL2, including what features should be added to the protocol. SPARQL is a standard query language and protocol.&lt;br /&gt;&lt;br /&gt;I am a big fan of standards, as most people are in the Semantic Web community. However, I feel that a database protocol does not provide much value and in fact, should be tailored to the evaluation and storage mechanism used by the implementation.&lt;br /&gt;&lt;br /&gt;Standards are intended to be interoperable between implementations, and SPARQL must abstract away from the storage mechanism used in order to achieve the desired level of interoperability. This leads SPARQL to result in a less than efficient query/retrieval operation, when compared to storage specific mechanisms like SQL. However, this still has significant advantages, as a single query can be used with a wide array of storage mechanisms and remains unchanged between significant storage alterations. This does come at a cost to both the ability to create efficient queries and the ability to evaluate queries effectively using the SPARQL protocol.&lt;br /&gt;&lt;br /&gt;The cost of query parsing and optimization can always be improved and can be tailored to specific models, without any loss of interoperability at the query language level. However, a standard protocol cannot be optimized the same way.&lt;br /&gt;&lt;br /&gt;When a database backed application has performance problems, 9 out of 10 times it is due to excessive communication between the database and its clients. Therefore, I question the value in abstracting this communication protocol away from the storage/evaluation mechanism, because this will exacerbate communication overhead.&lt;br /&gt;&lt;br /&gt;While I think the SPARQL query language is developing nicely and should be considered in any project that wants to ease the maintainability of their queries, I also think any project that is concerned about the performance of their queries should consider using a proprietary protocol to optimize its communication with a database.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/15e5d475-cea5-4118-a780-05829f5cd7d7/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=15e5d475-cea5-4118-a780-05829f5cd7d7" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-5064386632754248492?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/5064386632754248492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/06/standard-rdf-protocol.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/5064386632754248492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/5064386632754248492'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/06/standard-rdf-protocol.html' title='Standard RDF Protocol'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-6202518070772733812</id><published>2009-05-25T08:00:00.000-07:00</published><updated>2009-06-30T12:23:17.124-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Semantic Technology Conference'/><title type='text'>Speaking at SemTech</title><content type='html'>&lt;a style="float: right;" href="http://www.semtech2009.com/"&gt;&lt;img src="http://www.semtech2009.com/2009/images/PartnerButtons/PartnerButtons_JPG/SemTech2009_SPEAKER.jpg" alt=""&gt;&lt;/a&gt;&lt;br /&gt;I will be speaking at the Semantic Technology Conference in San Jose again this year from June 14-18, 2009.&lt;br /&gt;&lt;br /&gt;"Modelling Objects in RDF" talk will be given for attendees that want to learn how to get started quickly building applications that use an RDF store.&lt;br /&gt;&lt;br /&gt;Paul Gearon and I will compare and contrast the features and structure of modern RDF stores to help you find the stores that works best for your environment and data.&lt;br /&gt;&lt;br /&gt;I will be discussing "Linked Open Data" in a panel to give you a chance to ask questions and get answers about how to share and use interconnected data across the web.&lt;br /&gt;&lt;br /&gt;Thomas Tague and I will demonstrate how you can you use OpenCalais (at no cost) to extract metadata and named entities into the Linked Data cloud from english text.&lt;br /&gt;&lt;br /&gt;As a speaker, I am authorized to share registration discounts up to $200. If have not registered yet and are interested in attending, please contact me.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/e5b448da-d5ce-4488-898c-4b7408977e9c/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=e5b448da-d5ce-4488-898c-4b7408977e9c" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-6202518070772733812?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/6202518070772733812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/05/speaking-at-semtech.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6202518070772733812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6202518070772733812'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/05/speaking-at-semtech.html' title='Speaking at SemTech'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-3696885410290235235</id><published>2009-05-21T13:36:00.000-07:00</published><updated>2009-05-21T13:41:42.383-07:00</updated><title type='text'>Toronto College of Technology TechTalk</title><content type='html'>I will be giving my "Modelling Objects in RDF" talk again at TCT next week on May 30th. If you missed the last JUG meeting and are interested in learning/talking about RDF, come by for the talk.&lt;br /&gt;&lt;br /&gt;More details can be found here:&lt;br /&gt;&lt;a href="http://www.torontocollege.com/Display.action"&gt;http://www.torontocollege.com/Display.action&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A Map can be found here:&lt;br /&gt;&lt;a href="http://www.torontocollege.com/BI/location.jsp"&gt;http://www.torontocollege.com/BI/location.jsp&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3465716704098863819-3696885410290235235?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/3696885410290235235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/05/toronto-college-of-technology-techtalk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/3696885410290235235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/3696885410290235235'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/05/toronto-college-of-technology-techtalk.html' title='Toronto College of Technology TechTalk'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-8688871036190572264</id><published>2009-05-21T10:40:00.001-07:00</published><updated>2009-06-30T12:24:07.214-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Object-Oriented'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Annotation Properties</title><content type='html'>In Java annotation properties are grouped in annotation classes, which are grouped in packages. Since Java does not consider properties a top level construct (they must be in a class), this organization makes sense for Java. However, often burying the property this deep can make the syntax hard to read.&lt;br /&gt;&lt;br /&gt;Compare the annotation syntax of JAX-RS vs Spring's annotation-based controller configuration. Spring makes full use of the annotation class/property grouping and can often look confusing as many annotation properties are crammed into the same declaration. Whereas JAX-RS tries to collapse annotation classes and properties together, allowing the annotation declaration to be simplified.&lt;br /&gt;&lt;br /&gt;Java allows annotation properties to be omitted if they have the name "value". This allows the coder to simply state the annotation class and the property value (omitting the annotation property).&lt;br /&gt;&lt;br /&gt;I argue that when using the short syntax, the annotation class (conceptually) becomes the annotation property and therefore should start with a lower case. This is how JavaDoc annotations have always be done (start with a lower case letter) and I think it should be carried over to Java annotations as well.&lt;br /&gt;&lt;br /&gt;Conceptually, annotation properties are akin to static final class properties and therefore should be easy distinguished from traditional classes. Creating lower case annotations class files is one easy way to do this.&lt;br /&gt;&lt;br /&gt;What do you think? Is it okay to create a Java file that starts with a lower case letter? If so, under what conditions?&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/5d9fb919-749e-4608-a4a7-b1fdec86aa4e/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=5d9fb919-749e-4608-a4a7-b1fdec86aa4e" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-8688871036190572264?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/8688871036190572264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/05/annotation-properties.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8688871036190572264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8688871036190572264'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/05/annotation-properties.html' title='Annotation Properties'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-2630397965690113000</id><published>2009-05-14T09:50:00.000-07:00</published><updated>2009-06-30T12:24:27.325-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='World Wide Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Is Google the database of the Web?</title><content type='html'>Yesterday Google announced plans to improve its user's searching experience by providing more ways to search and find information on the Web. With Google's new search options and rich snippets, it is putting it self in a position to not simply link to desired pages, but actually provide the information directly.&lt;br /&gt;&lt;br /&gt;By adopting RDFa, Google hopes to make it possible to start importing the deeper web into its cluster. It is starting by asking publishers of reviews, people, products, and organizations sites to share the raw data directly, so it can server the information without requiring its users to visit the publisher's site. Although Google is not the first search engine to use RDFa in the results, it is the first to start using it across all sites.&lt;br /&gt;&lt;br /&gt;I am happy to finally see Google start to include rich semantics in its interface, but I worry what this might mean to publishers. Will Google become the database of the Web? Will the Web surfers of tomorrow never leave Google's domain? Time will tell, but lets hope this triggers new discussions on how we "browse" the growing web of data.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/fea27101-72e4-41a6-8636-0dfb41866e69/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=fea27101-72e4-41a6-8636-0dfb41866e69" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-2630397965690113000?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/2630397965690113000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/05/is-google-database-of-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2630397965690113000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2630397965690113000'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/05/is-google-database-of-web.html' title='Is Google the database of the Web?'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-6896344169099249355</id><published>2009-05-06T07:46:00.000-07:00</published><updated>2009-06-30T12:25:06.122-07:00</updated><title type='text'>Toronto JUG Meeting</title><content type='html'>My presentation at yesterday's Toronto JUG meeting covered a lot of ground as it both introduced RDF and demonstrated how to use RDF with objects. Many of attendees struggled with the significant mind-shift from relational to RDF and how a data model can be represented as a graph of nodes.&lt;br /&gt;&lt;br /&gt;One important point, that I want to reiterate, is that RDF stores are not designed as general purpose databases (as relational databases are), but instead RDF stores are designed for complex data structures. Currently, RDF is mostly used within industries that have complicated data models. However, RDF is becoming more appealing to a wider audience as data models in general are becoming more complicated and interconnected.&lt;br /&gt;&lt;br /&gt;If you attended the meeting and/or are interested in talking more about RDF. Read through the getting started guide for Sesame[1] and join the discussions on IRC at irc://irc.freenode.net/sesame&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://wiki.aduna-software.org/confluence/display/SESDOC/GettingStarted"&gt;http://wiki.aduna-software.org/confluence/display/SESDOC/GettingStarted&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/d2c18f44-068c-4553-8716-e8936c71028f/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=d2c18f44-068c-4553-8716-e8936c71028f" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-6896344169099249355?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/6896344169099249355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/05/toronto-jug-meeting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6896344169099249355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6896344169099249355'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/05/toronto-jug-meeting.html' title='Toronto JUG Meeting'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-8282806990609478347</id><published>2009-04-30T09:43:00.000-07:00</published><updated>2009-06-30T12:25:33.749-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GNOME'/><category scheme='http://www.blogger.com/atom/ns#' term='SPARQL'/><category scheme='http://www.blogger.com/atom/ns#' term='N3'/><title type='text'>SPARQL Highlighting in GEdit</title><content type='html'>In searching for highlighting mode for N3 and gedit, the best I could fine was a blog post from a couple years ago[1]. When writing N3 I am overly cautious about typos, and I could use some indication of syntax errors. So I created a SPARQL syntax highlighting mode for gtksourceview. This will highlight all known xsd, rdf, rdfs, and owl classes, datatypes, and predicates to make creating ontologies in N3 easier.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lhy3WsQ03Bs/SfnhfG9d7QI/AAAAAAAAABk/LMIiub2bCsE/s1600-h/screenshot1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 213px;" src="http://1.bp.blogspot.com/_Lhy3WsQ03Bs/SfnhfG9d7QI/AAAAAAAAABk/LMIiub2bCsE/s320/screenshot1.png" alt="" id="BLOGGER_PHOTO_ID_5330539558530313474" border="0"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The file can be downloaded[2] and saved as ~/.gnome2/gtksourceview-1.0/language-specs/sparql.lang. Then the SPARQL mode is available from the View-&amp;gt;Highlight Mode-&amp;gt;Sources menu. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://www.semikolon.co.uk/blog/index.php?entry=entry070510-102401"&gt;http://www.semikolon.co.uk/blog/index.php?entry=entry070510-102401&lt;/a&gt;&lt;br /&gt;[2] &lt;a href="http://bugzilla.gnome.org/attachment.cgi?id=134935&amp;amp;action=view"&gt;http://bugzilla.gnome.org/attachment.cgi?id=134935&amp;amp;action=view&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/58e48069-c645-4747-8096-0dc41464b69e/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=58e48069-c645-4747-8096-0dc41464b69e" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-8282806990609478347?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/8282806990609478347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/04/in-searching-for-highlighting-mode-for.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8282806990609478347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8282806990609478347'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/04/in-searching-for-highlighting-mode-for.html' title='SPARQL Highlighting in GEdit'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Lhy3WsQ03Bs/SfnhfG9d7QI/AAAAAAAAABk/LMIiub2bCsE/s72-c/screenshot1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-7259193174888092577</id><published>2009-04-28T05:15:00.000-07:00</published><updated>2009-04-28T05:19:33.620-07:00</updated><title type='text'>Speaking at Toronto's JUG</title><content type='html'>I will be giving a talk entitled "Modelling Objects in RDF" next week at Toronto's Java User Group. If you are in the city, please come by and introduce yourself.&lt;br /&gt;&lt;br /&gt;Today's most used database model is the relational model. However, in today's high performance web-centric world, the relational database has begun to show its age. This talk introduces the Resource Description Framework (RDF) as an alternative database model. RDF is a family of standards to model properties and relationships between resources in a web-centric way. Unlike the relational model, which stores strictly defined records, an RDF model stores semi-structured graphs. This allows RDF stores to model more complex relationships, scale better across the web, and tolerate schema variations for compatibility.&lt;br /&gt;&lt;br /&gt;Object-oriented design is the preferred paradigm for modelling complex software; however, most RDF APIs are tuple-oriented and lack some of the fundamental concepts in object-oriented programming. This talk introduces Sesame and how it can be used with RDF resources using object-oriented designs.&lt;br /&gt;&lt;br /&gt;Event details can be found here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://torontojug.org/"&gt;http://torontojug.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3465716704098863819-7259193174888092577?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/7259193174888092577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/04/speaking-at-torontos-jug.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7259193174888092577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7259193174888092577'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/04/speaking-at-torontos-jug.html' title='Speaking at Toronto&apos;s JUG'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-6238532163583544695</id><published>2009-04-23T05:54:00.000-07:00</published><updated>2009-06-30T12:26:35.620-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web service'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSearch'/><category scheme='http://www.blogger.com/atom/ns#' term='Atom'/><title type='text'>AtomPub as a Discovery Protocol</title><content type='html'>AtomPub was designed as a blog API, but with all the advancement the browsers have made as an application platform, it hasn't achieved wide spread use among bloggers. However, that doesn't limit the usefulness of it as a general publishing protocol.&lt;br /&gt;&lt;br /&gt;My colleagues at Zepheira and I have been putting AtomPub into action recently. In our latest project we used AtomPub for a marketplace service registry. This allows others to publish the existence of their web service into collections. Because of the thorough documentation of AtomPub, it was easy to get everybody on board. With a simple example everybody started seeing the advantages of using a standard protocol. Generally speaking the AtomPub server was a breeze to maintain as all operations could be done using curl.&lt;br /&gt;&lt;br /&gt;In the same project we also used OpenSearch with Atom to integrate multiple (private) search engines into a unified result. With some sugar and spice added to the "self" links we created a very impressive search solution.&lt;br /&gt;&lt;br /&gt;Although AtomPub hasn't achieved much popularity within the blogging world, there are lots of benefits in using a standard protocol and AtomPub has proven itself as a great discovery protocol to us.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/ca7f9b01-4890-4697-9af0-803d134a70e6/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=ca7f9b01-4890-4697-9af0-803d134a70e6" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-6238532163583544695?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/6238532163583544695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/04/atompub-as-discovery-protocol.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6238532163583544695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6238532163583544695'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/04/atompub-as-discovery-protocol.html' title='AtomPub as a Discovery Protocol'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-8487869971287968107</id><published>2009-03-31T13:24:00.000-07:00</published><updated>2009-06-30T12:27:10.088-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database transaction'/><title type='text'>Long Running Transactions</title><content type='html'>I have been experimenting recently with long running transactions and am intrigued by its potential. The term 'long running transaction' is loaded with interpretations, so let me explain. Normally, when one thinks of a long running transaction, they think of a set of operations that can be undone. The implications of which are domain/implementation specific.&lt;br /&gt;&lt;br /&gt;However, I am experimenting with atomic optimistic long running transactions - like a database transaction that spans multiple HTTP requests. The key requirement here is that it is optimistic. This means there are no resource locks used across the requests, allowing concurrent access and non-conflicting modification.&lt;br /&gt;&lt;br /&gt;What makes this interesting, is when using a web interface to manipulate a complex structure. While other approaches would have the structure copied into session memory or track undo operations, this utilizes the indexes already present in the store (RDF in this case) and there is no need to track or even develop complicated undo behaviour. We are all familiar with the classic cancel/apply or restore/save buttons of local applications that span an application or set of dialogs. With optimistic long running transactions, this same experience can be used in a web application.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/b7cf2c8b-49aa-4a7f-9920-43a8a1ad192b/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=b7cf2c8b-49aa-4a7f-9920-43a8a1ad192b" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-8487869971287968107?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/8487869971287968107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/03/long-running-transactions.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8487869971287968107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8487869971287968107'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/03/long-running-transactions.html' title='Long Running Transactions'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-6507931764525525007</id><published>2009-03-19T05:25:00.000-07:00</published><updated>2009-06-30T12:28:00.594-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database theory'/><title type='text'>Eight Isolation Levels Every Web Developer Should Know</title><content type='html'>The &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/ACID" title="ACID" rel="wikipedia"&gt;ACID properties&lt;/a&gt; are one of the cornerstones of &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Database_theory" title="Database theory" rel="wikipedia"&gt;database theory&lt;/a&gt;. ACID defines four properties that must be present if a database is considered reliable: &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Atomicity_%28database_systems%29" title="Atomicity (database systems)" rel="wikipedia"&gt;Atomicity&lt;/a&gt;, &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Consistency_%28database_systems%29" title="Consistency (database systems)" rel="wikipedia"&gt;Consistency&lt;/a&gt;, Isolation, and Durability. While all four properties are important, isolation in particular is interpreted with the most flexibility. Most databases provide a number of &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Isolation_%28database_systems%29" title="Isolation (database systems)" rel="wikipedia"&gt;isolation levels&lt;/a&gt; to choose from, and many libraries today add additional layers which create even more fine-grained degrees of isolation. The main reason for this wide range of isolation levels is that relaxing isolation can often result in scalability and performance increases of several &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Order_of_magnitude" title="Order of magnitude" rel="wikipedia"&gt;orders of magnitude&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Read More Here:&lt;br /&gt;&lt;a href="http://www.infoq.com/articles/eight-isolation-levels"&gt;http://www.infoq.com/articles/eight-isolation-levels&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/20b031fb-4136-4390-8f29-de441b875fe5/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=20b031fb-4136-4390-8f29-de441b875fe5" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-6507931764525525007?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/6507931764525525007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/03/eight-isolation-levels-every-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6507931764525525007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6507931764525525007'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/03/eight-isolation-levels-every-web.html' title='Eight Isolation Levels Every Web Developer Should Know'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-7861241199620721903</id><published>2009-03-09T07:13:00.000-07:00</published><updated>2009-06-30T12:28:39.935-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Distributed Computing'/><title type='text'>RDF Federation</title><content type='html'>An RDF store (unlike an rdbms store) usually indexes everything. This means that the store's indexes are often larger then the data that it contains. Such large indexes makes I/O expensive and caching difficult. Scaling vertically by adding more memory for caching and faster disks can make a big difference, but it can get very expensive very quickly.&lt;br /&gt;&lt;br /&gt;The alternative is to scale horizontally. This can be done in one of two ways: by mirroring the indexes on other machines, or by partitioning the indexes to other machines. The first option, called clustering, can reduce the I/O load, but will still have difficult caching it. The second option, called federating, reduces the I/O load on each machine, and can allow each machine to specialize, making caching much more effective.&lt;br /&gt;&lt;br /&gt;Federating RDF stores is now going to be a lot easier with Sesame 3.0. Sesame 3.0 will support federating multiple (distributed) Sesame Repositories into a unified store. This allows large indexes to be distributed on multiple machines that are connected over a network. The federation supports multiple ways of partitioning the data. It can be partitioned by predicate (property), by subject, or both. When properly setup the federation can effectively proxy queries to the specialized members and join queries among the distributed members. For large-scale RDF stores, federating is becoming a valuable solution for RDF architecture.&lt;br /&gt;&lt;br /&gt;Instructions for setting up a read only Sesame Federation can be found here:&lt;br /&gt;&lt;a href="https://wiki.aduna-software.org/confluence/display/SESDOC/Federation"&gt;https://wiki.aduna-software.org/confluence/display/SESDOC/Federation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/4c85e434-db09-430d-b42d-5fc58c5219b3/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=4c85e434-db09-430d-b42d-5fc58c5219b3" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-7861241199620721903?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/7861241199620721903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/03/rdf-federation.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7861241199620721903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7861241199620721903'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/03/rdf-federation.html' title='RDF Federation'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-8962627390672904474</id><published>2009-03-02T05:07:00.000-08:00</published><updated>2009-06-30T12:29:04.639-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>What is the Future of Database Systems?</title><content type='html'>Last month saw a flurry of activity around the future of relational databases. Although no one can predict the future, I think it is safe to say that many system developers/architects are hungry for mainstream semi-structure databases.&lt;br /&gt;&lt;br /&gt;Feb 12 &lt;a href="http://www.readwriteweb.com/archives/is_the_relational_database_doomed.php"&gt;Is the Relational Database Doomed?&lt;/a&gt;&lt;br /&gt;Feb 13 &lt;a href="http://havemacwillblog.com/2009/02/13/is-the-relational-database-doomed/"&gt;Is The Relational Database Doomed?&lt;/a&gt;&lt;br /&gt;Feb 13 &lt;a href="http://www.healthcareguy.com/index.php/archives/473"&gt;CouchDB could be a viable alternative to relational databases for storing patient data&lt;/a&gt;&lt;br /&gt;Feb 16 &lt;a href="http://blog.nawroth.com/2009/02/future-of-rdbmss.html"&gt;The future of RDBMS's&lt;/a&gt;&lt;br /&gt;Feb 20 &lt;a href="http://www.infoq.com/news/2009/02/Relational-DB-Cloud"&gt;Is the Relational Database Not an Option in Cloud Computing?&lt;/a&gt;&lt;br /&gt;Feb 27 &lt;a href="http://bret.appspot.com/entry/how-friendfeed-uses-mysql"&gt;How FriendFeed uses MySQL to store schema-less data&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/8cfcf182-2643-4aa2-918c-98b4d4982f45/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=8cfcf182-2643-4aa2-918c-98b4d4982f45" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-8962627390672904474?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/8962627390672904474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/03/what-is-future-of-database-systems.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8962627390672904474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8962627390672904474'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/03/what-is-future-of-database-systems.html' title='What is the Future of Database Systems?'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-2715146087731264096</id><published>2009-02-26T12:32:00.000-08:00</published><updated>2009-06-30T12:29:44.863-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database transaction'/><title type='text'>RDF Transaction Isolation</title><content type='html'>Transaction Isolation in relational databases (for better or worse) is well established. However, the issue of &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Isolation_%28database_systems%29" title="Isolation (database systems)" rel="wikipedia"&gt;transaction isolation&lt;/a&gt; is rarely documented in RDF stores.&lt;br /&gt;&lt;br /&gt;The ANSI SQL isolation definitions are UPDATE (write) oriented and do not capture the general use case of RDF, which has no notion of UPDATE. For example, the first ANSI SQL phenomenon, dirty-write, is not even applicable to RDF transaction. Another phenomenon, non-repeatable reads, is defined by records retrieved by a SELECT statement. However, RDF queries (unlike SQL) are pattern based and the results don't have a direct relationship to any internal data record.&lt;br /&gt;&lt;br /&gt;Relational database isolation mechanisms do not perform nearly as well when INSERT/DELETE operations are used instead of UPDATE. Furthermore, relational databases often have a lax definition of "serializable", allowing conflicting INSERT operations (assuming that preventing conflicting UPDATE operations is sufficient).&lt;br /&gt;&lt;br /&gt;RDF is a different beast altogether. RDF is set oriented. Two RDF transactions adding or removing the same statement do not necessarily conflict with each other, as they would in SQL, because a successful add or remove operation in RDF does not require a state change.&lt;br /&gt;&lt;br /&gt;Early RDF use cases required full serializable transaction as many of the inferencing rules used in RDF needed to take the complete store state into account. Because of this, RDF stores generally only provide full serializable transactions. However, full serializable transactions often do not perform as well as lower isolation levels.&lt;br /&gt;&lt;br /&gt;RDF stores are now being used in environments that have a much greater, real-time demand, for fast concurrent write operations. These environments don't require full serialization, but currently lack any other isolation levels to choose from.&lt;br /&gt;&lt;br /&gt;To address this need Sesame 3.0 introduces five isolation levels that will allow RDF stores to vary the isolation level provided. By providing different levels, significant performance improvements can be made for lower isolation levels. For example:&lt;br /&gt;&lt;br /&gt;• Read Committed isolation level permits weak-consistency and allows proxies to cache repeated results without validation.&lt;br /&gt;• Snapshot isolation level permits &lt;a class="zem_slink" href="http://en.wikipedia.org/wiki/Eventual_consistency" title="Eventual consistency" rel="wikipedia"&gt;eventual-consistency&lt;/a&gt; and allows store clusters to maintain independent state and propagate the changes during idle periods.&lt;br /&gt;• Serializable isolation provides a higher degree of isolation, but does not require atomic consistency, permitting concurrent transactions.&lt;br /&gt;&lt;br /&gt;For more details on the isolation levels supported by Sesame 3.0 see:&lt;br /&gt;&lt;a href="http://wiki.aduna-software.org/confluence/display/SESDOC/TransactionIsolation"&gt;http://wiki.aduna-software.org/confluence/display/SESDOC/TransactionIsolation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What variations of transaction isolation have you used in your application?&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/99017ad0-ae30-4fc6-b27d-f6d329435155/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=99017ad0-ae30-4fc6-b27d-f6d329435155" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-2715146087731264096?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/2715146087731264096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/02/rdf-transaction-isolation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2715146087731264096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2715146087731264096'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/02/rdf-transaction-isolation.html' title='RDF Transaction Isolation'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-2969672329152309072</id><published>2009-02-24T12:49:00.001-08:00</published><updated>2009-06-30T12:30:04.125-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sesame'/><title type='text'>Sesame 3-alpha1</title><content type='html'>The first preview of the new Sesame API is now available. Here is an article explaining the new features: &lt;a href="http://www.devx.com/semantic/Article/40987"&gt;http://www.devx.com/semantic/Article/40987&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/ed50ac4a-2e00-4b00-b0a1-5b74f9216bc7/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=ed50ac4a-2e00-4b00-b0a1-5b74f9216bc7" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-2969672329152309072?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/2969672329152309072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/02/sesame-3-alpha1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2969672329152309072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2969672329152309072'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/02/sesame-3-alpha1.html' title='Sesame 3-alpha1'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-8770965820162815668</id><published>2009-02-12T04:54:00.000-08:00</published><updated>2009-06-30T12:30:30.214-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XSL Transformations'/><category scheme='http://www.blogger.com/atom/ns#' term='XHTML'/><title type='text'>XHTML: What is it Good For?</title><content type='html'>With IE8 nearly upon us, discussion on the future of web standards has once again been triggered. Again lacking in IE8 is support for XHTML, ensuring that IE is the only browser that doesn't support it.&lt;br /&gt;&lt;br /&gt;The goal of XHTML is to allow XML technologies to be used with HTML. XHTML has been a standard now for about five years, and IE is still (single handedly?) preventing websites from adopting it. Instead websites are forced to use server side solutions that require more bandwidth and processing, while making it harder for non-traditional agents to participate.&lt;br /&gt;&lt;br /&gt;Within recent discussions on XHTML many people seem to fail to understand the potential benefit XHTML has over HTML. An interesting example I came across was combining XSLT and XHTML together.&lt;br /&gt;&lt;br /&gt;I have written about XSLT before&lt;br /&gt;&lt;a href="http://jamesrdf.blogspot.com/2008/12/mvc-with-xslt.html"&gt;http://jamesrdf.blogspot.com/2008/12/mvc-with-xslt.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This example is from 2002 (around the time XSLT and XHTML were standardized) and can be found in more detail here:&lt;br /&gt;&lt;a href="http://www.webreference.com/xml/resources/books/practicalxml/chapter5/"&gt;http://www.webreference.com/xml/resources/books/practicalxml/chapter5/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As most of us know, XHTML is also an XML file and as such can be used as the input or output of XSLT.  What many do not realize (and what is not covered in the above link) is that XHTML can also be used as the stylesheet. XSLT supports a simplified syntax that allows XSLT tags to be embedded inside an XHTML template file, making the template look a lot more like other server-side templating engines.&lt;br /&gt;&lt;a href="http://www.w3.org/TR/xslt#result-element-stylesheet"&gt;http://www.w3.org/TR/xslt#result-element-stylesheet&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This allows you to use XHTML for the template and the content, and it works in all browsers, except *one* of them. Actually, you can get this to work in IE (even as early as IE5), but you have to use the XML rendering mode.&lt;br /&gt;&lt;br /&gt;The XML rendering mode requires that the pages return application/xml and no doctypes present. Unfortunately by using the XML rendering mode, no HTML-specific features are available: no cookies, no document.write and script tags are parsed differently.&lt;br /&gt;&lt;br /&gt;TV Series.com is rendered in XML mode, for example: &lt;a href="http://www.tvseries.com/"&gt;http://www.tvseries.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If IE would get around to implementing XHTML, I think a lot more websites could safely switch to serving static files and the Web would start to become a lot easier to work with. But that probably wouldn't be good for Silverlight.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/679005fd-3e96-49c4-9ed1-ebe6bc341561/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=679005fd-3e96-49c4-9ed1-ebe6bc341561" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-8770965820162815668?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/8770965820162815668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/02/xhtml.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8770965820162815668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8770965820162815668'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/02/xhtml.html' title='XHTML: What is it Good For?'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-210088816484822389</id><published>2009-02-02T11:25:00.000-08:00</published><updated>2009-02-02T11:33:39.694-08:00</updated><title type='text'>Elmo to Get a Face Lift</title><content type='html'>In 2008 Elmo's interface saw some adjustments to enable more efficient access across HTTP. The challenge with this new interface is to understand how the object operations map to RDF operations and what implications they have on performance over http.&lt;br /&gt;&lt;br /&gt;Despite the changes, EntityManager-oriented interface is still inappropriate for RDF/Object mapping, because relational operations do not directly map to RDF operations. Further, object persistence abstraction causes more performance problems then it solves for seasoned developers. Unlike object-relation mapping, RDF-object mapping is much more natural.&lt;br /&gt;&lt;br /&gt;Work has already begun on Elmo's successor, AliBaba Object Repository, providing an hybrid RDF/Object interface extension to Sesame. Performance over HTTP is a high priority and was the major inspiration to the new interface.&lt;br /&gt;&lt;br /&gt;Early development has already shown significant performance increases for both read heavy and write heavy transactions. For those interested in getting involved, you can checkout the code at&lt;br /&gt;&lt;a href="http://repo.aduna-software.org/svn/org.openrdf/alibaba/trunk/"&gt;http://repo.aduna-software.org/svn/org.openrdf/alibaba/trunk/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3465716704098863819-210088816484822389?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/210088816484822389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/02/elmo-to-get-face-lift.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/210088816484822389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/210088816484822389'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/02/elmo-to-get-face-lift.html' title='Elmo to Get a Face Lift'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-6356385085606619684</id><published>2009-01-29T14:05:00.000-08:00</published><updated>2009-01-30T11:26:41.374-08:00</updated><title type='text'>Perfection Is An Unrealistic Goal</title><content type='html'>Linda Rising gave a presentation on a topic that is still fairly misunderstood. She tries to address the question "What is the best way for us to work as individuals?" She talks about not deceiving yourself and understanding that everything is a journey without a destination. It is better to build something that is known to be imperfect now, than wait for clarification, as more knowledge can be gain from a system that doesn't work than any theoretical discussions. Software development is like a series of experiments, a series of learning cycles. She then uses our regular sleep cycles to identify our optimal work cycles and emphasises the importance of taking breaks throughout the day to improve productivity.&lt;br /&gt;&lt;br /&gt;http://www.infoq.com/news/2009/01/Perfection-Is-Unrealistic-Rising&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3465716704098863819-6356385085606619684?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/6356385085606619684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/01/perfection-is-unrealistic-goal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6356385085606619684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6356385085606619684'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/01/perfection-is-unrealistic-goal.html' title='Perfection Is An Unrealistic Goal'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-3525457068011816428</id><published>2009-01-26T06:27:00.000-08:00</published><updated>2009-06-30T12:32:10.784-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Semantic Technology Conference'/><title type='text'>Modelling Objects In RDF</title><content type='html'>Also at The Semantic Technology Conference this year, I will again be speaking on persisting Objects in RDF. This is an introductory session on building object-oriented applications with the Sesame RDF repository. This year we will be going into more detail on the advantages of using RDF as a persistence layer. Including achieving forward and backward data compatibility, OWL's representation richness, longer running optimistic transactions, and using graphs for auditing purposes.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/6b8cc87f-5214-4823-b67c-1164c23f4372/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=6b8cc87f-5214-4823-b67c-1164c23f4372" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-3525457068011816428?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/3525457068011816428/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/01/modelling-objects-in-rdf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/3525457068011816428'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/3525457068011816428'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/01/modelling-objects-in-rdf.html' title='Modelling Objects In RDF'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-8283200903375489916</id><published>2009-01-22T08:02:00.000-08:00</published><updated>2009-06-30T12:32:27.432-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Semantic Technology Conference'/><title type='text'>Unifying RDF Stores</title><content type='html'>In June I will be speaking at The Semantic Technology Conference with Paul Gearon about some of the integration work we did with Sesame and Mulgara. We will also be comparing a hand full of existing RDF stores and demonstrate how they can be used interchangeably or as a unified federation.&lt;br /&gt;&lt;br /&gt;The RDF storage market has become much more divers  recently, with many providers tailoring to specific environments and data patterns. This talk will cover some considerations to help you identify what RDF store implementation is best for your data and environment. We will discuss common features found with many providers, unique features found in only a few, and demonstrate some of the new features in Mulgara. We will also be demonstrating a unified RDF API to allow RDF stores to be swapped into applications post-development and how using a provider independent API enables divers RDF storage nodes to be federated together, allowing each node to be tailored to the unique shape of the data being stored within.&lt;br /&gt;&lt;br /&gt;Hope to see you there!&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/805602a6-d62c-4753-9391-a5db90d34b69/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=805602a6-d62c-4753-9391-a5db90d34b69" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-8283200903375489916?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/8283200903375489916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/01/unifying-rdf-stores.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8283200903375489916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8283200903375489916'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/01/unifying-rdf-stores.html' title='Unifying RDF Stores'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-2926136668302417441</id><published>2009-01-15T11:54:00.000-08:00</published><updated>2009-06-30T12:32:46.529-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RDF'/><title type='text'>Validating RDF</title><content type='html'>RDFS/OWL is criticized for its weak ability to validate documents in contrary to XML, which has many mature validation tools.&lt;br /&gt;&lt;br /&gt;A common confusion in RDF is the rdfs:range/rdfs:domain properties. A property value can always be assumed to have the type of the rdfs:range value. This is very different to XML, which only has rules to validate tags, but cannot conclude anything. Many of the predicates in RDF are used for similar inferencing, but they lacks any way to validate or check if a statement really is true. This is a critical feature for data interchange, which RDF is otherwise well suited for.&lt;br /&gt;&lt;br /&gt;To address this limitation, an RDF graph can be sorted and serialized into RDF/XML. With a little organization of statements, such as grouping by subject, and controlled serialization, common XML validation tools can be applied to a more formal RDF/XML document. Our validation was done with relatively small graphs and we restricted the use of BNodes to specific statements to ensure similarly structured data would produce similar XML documents.&lt;br /&gt;&lt;br /&gt;Although TriX could also have been used (it is a more formal XML serialization of RDF), it was considered that the format produced would not be as easy to work with for validation tools.&lt;br /&gt;&lt;br /&gt;With a controlled RDF/XML structure we were able to apply RNG to provide structure validation before accepting foreign data and able to automate the export into more controlled formats using XSLT. (We used a rule engine for state validation.) Although RDF is a great way to interchange data against an changing model, XML is still better over the last mile to restrict the vocabulary of the data accepted.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/7857437b-ed75-4ec3-9a3b-08c0abf5920e/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=7857437b-ed75-4ec3-9a3b-08c0abf5920e" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-2926136668302417441?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/2926136668302417441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/01/validating-rdf.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2926136668302417441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2926136668302417441'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/01/validating-rdf.html' title='Validating RDF'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-4398772351212809404</id><published>2009-01-12T06:01:00.000-08:00</published><updated>2009-06-30T12:33:06.682-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Did Google Just Expose Semantic Data in Search Results?</title><content type='html'>Google has been hesitant, in the past, of employing semantic technology, citing trust issues and the lack of quality meta-data in The Web today. However, it would appear Google is warming to the idea of semantics in the area of natural language processing. I have written a couple articles on the subject previously, but it appears that Google is exposing their own text analysis, acording to this blog entry.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.readwriteweb.com/archives/google_semantic_data.php"&gt;http://www.readwriteweb.com/archives/google_semantic_data.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/f2c77613-4d14-48ba-b754-f2cfafe1962b/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=f2c77613-4d14-48ba-b754-f2cfafe1962b" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-4398772351212809404?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/4398772351212809404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/01/did-google-just-expose-semantic-data-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/4398772351212809404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/4398772351212809404'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/01/did-google-just-expose-semantic-data-in.html' title='Did Google Just Expose Semantic Data in Search Results?'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-8687728990424823394</id><published>2009-01-08T06:42:00.000-08:00</published><updated>2009-06-30T12:33:29.335-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Representational State Transfer'/><title type='text'>Building Super-Scalable Web Systems with REST</title><content type='html'>I came across this blog posting that I thought was an interesting example of how the services should be oriented around the data and not the other way around.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.udidahan.com/2008/12/29/building-super-scalable-web-systems-with-rest/"&gt;http://www.udidahan.com/2008/12/29/building-super-scalable-web-systems-with-rest/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The idea here is that the data (in this case weather info) needs to be partitioned in a meaningful way (by location). REST services can then be created around this and utilize the caching available in HTTP.&lt;br /&gt;&lt;br /&gt;By creating and organizing services around the domain's data model more efficient services can be created. This reinforces why SOA often ends up failing, because there is not enough emphasis on the data. It also highlights REST support for caching and cache validation built into the protocol. Other service/message specifications (like SOAP) would have more difficulty identify and implementing a caching mechanism.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/85088f0f-97ea-490b-99ea-16f2fde4cbfe/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=85088f0f-97ea-490b-99ea-16f2fde4cbfe" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-8687728990424823394?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/8687728990424823394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2009/01/building-super-scalable-web-systems.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8687728990424823394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8687728990424823394'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2009/01/building-super-scalable-web-systems.html' title='Building Super-Scalable Web Systems with REST'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-8015235384931933898</id><published>2008-12-29T07:19:00.000-08:00</published><updated>2009-06-30T12:33:48.198-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Object-Oriented'/><title type='text'>Object Oriented Rule Engine</title><content type='html'>Last week I discussed the desire for a rule engine to allow object oriented domain logic to be browsed, searched, reviewed, and altered outside of an IDE.&lt;br /&gt;&lt;a href="http://jamesrdf.blogspot.com/2008/12/object-oriented-rule-engine.html"&gt;http://jamesrdf.blogspot.com/2008/12/object-oriented-rule-engine.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Earlier this year Zepheira, LLC needed an object oriented rule engine to enable different participants to manage continually changing rules. After developing a solution with Drools, it was observed that there were too many restrictions on the accessible data and the rules were getting too complicated to be effective with multiple participants each with different interests. Together we combined the modelling language - OWL (Web Ontology Language) - with the Object Oriented language Groovy to create a rule engine that was effective over large datasets and included many of the features of OOP including the ability to override selected rules for particular sub-domains within the model.&lt;br /&gt;&lt;br /&gt;We developed the model using OWL and extended it by adding the ability to define message types (LHS rule declarations) and method bodies (RHS rule execution). By separating the two and associating every rule with a concept class, we were able to apply OOP features to the rules. The syntax we used can now be seen here:&lt;br /&gt;&lt;a href="http://www.openrdf.org/doc/elmo/1.4/user-guide/x457.html#AEN466"&gt;http://www.openrdf.org/doc/elmo/1.4/user-guide/x457.html#AEN466&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;By developing Groovy domain logic in an RDF database we enabled many stakeholders access to review and alter the rules to facilitate their own what-if scenarios. It also made it possible to manage much more complex situations by utilizing the strong vocabulary of OWL to describe the concepts that could not easily be represented in a simple object model.&lt;br /&gt;&lt;br /&gt;We achieved the flexibility we needed and reduced the complexity of the rules by using an object oriented rule engine. The rule engine has since been licensed under the BSD licence as part of the OpenRDF Elmo project at &lt;a href="http://www.openrdf.org/"&gt;http://www.openrdf.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;About Zepheira&lt;br /&gt;Zepheira is a US-based professional services firm with expertise in semantic technologies and Enterprise Data Integration. For more information, visit: &lt;a href="http://www.zepheira.com/"&gt;www.zepheira.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/28b57f7e-2edd-48da-bbc8-2c4e7ef02861/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=28b57f7e-2edd-48da-bbc8-2c4e7ef02861" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-8015235384931933898?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/8015235384931933898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/12/object-oriented-rule-engine_29.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8015235384931933898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8015235384931933898'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/12/object-oriented-rule-engine_29.html' title='Object Oriented Rule Engine'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-4342761828268692027</id><published>2008-12-22T07:16:00.001-08:00</published><updated>2009-06-30T12:34:02.097-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Object-Oriented'/><title type='text'>Object Oriented Rule Engine</title><content type='html'>A rule engine should be used when a domain model has many rules that may change over time and need to be closely managed by domain experts.&lt;br /&gt;&lt;br /&gt;By using a rule engine, rules become much more tangible. They can be browsed, searched, reviewed, and altered in a way that facilitates their management without the complications and restrictions of a full-blown IDE.&lt;br /&gt;&lt;br /&gt;Rule engines are often avoided by DDD-ers (Domain Driven Designers) and OOP-ers (Object Oriented Programmers) because they pull domain logic out of the model and into a rule structure, disregarding many of the core features of OOP. (Separating the rules prevents classes from encapsulating their own behaviour, and doesn't allow inheritance or any form of overriding super class behaviour.)&lt;br /&gt;&lt;br /&gt;Drools, a popular Java rule engine, uses an OOP language (Java-like) to write the RHS (rule execution) and to some degree, the LHS (rule condition). However, the rules themselves are still very much detached from the model. The rule is more like an /if/ condition with a /then/ procedure. If the code does not belong to an extend-able class hierarchy, it is anything but OO.&lt;br /&gt;&lt;br /&gt;Tools could be written to allow a OO model, written in a language like Java, to be indexed and allow it to be browsed and searched - many IDEs already do this to a degree. However, the challenge is that the Java language (like many other languages) does not distinguish between the concepts (the classes and properties) and the behaviours (the rules). In Java, it is particularly difficult to distinguish between a property that retrieves and stores values and a method that applies logic to the state of the model.&lt;br /&gt;&lt;br /&gt;To combine the features of OOP with the advantages of a rule engine, the domain model needs to be stored in a more formal structure to facilitate its management. It needs to be in a structure that clearly distinguishes the concepts and their properties from the behaviour rules, while providing OOP features to them. Such a structure would need to be index-able to allow it to be browsed and searched and straight-forward enough to allow alteration of individual rules without the risk of data loss.&lt;br /&gt;&lt;br /&gt;Does such a rule engine exist? Check back next week.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/811552d5-c623-4e22-b11e-dd24e0a77cd9/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=811552d5-c623-4e22-b11e-dd24e0a77cd9" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-4342761828268692027?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/4342761828268692027/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/12/object-oriented-rule-engine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/4342761828268692027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/4342761828268692027'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/12/object-oriented-rule-engine.html' title='Object Oriented Rule Engine'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-7856841636480690926</id><published>2008-12-18T18:01:00.000-08:00</published><updated>2009-06-30T12:34:32.545-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Domain Driven Design'/><title type='text'>Repository Entity Pattern</title><content type='html'>The repository pattern is too often under used when developing a domain model. I like to take a spin off the Domain Driven Design repository pattern and apply it to all collections within the domain.&lt;br /&gt;&lt;br /&gt;Whenever the model needs a collection of entities, I use a repository. It is basically a glorified collection, controlling access to underlying entities in a type specific way. The main advantage to using a souped-up collection is that as needs change the implementation can be changed while maintaining the same interface. This abstraction also co-locates similar queries and query building logic into a single class structure, minimizing its duplication.&lt;br /&gt;&lt;br /&gt;Writing access and bulk update queries involves a significant investment for new models. The abstraction of using a repository interface allows you to focus on the business logic early on, while working with small datasets and in memory collections. As the model interfaces begins to stabilize more focus can be in optimizing entity access.&lt;br /&gt;&lt;br /&gt;For complex models that require uniquely optimized data access and updates. The repository pattern allows integrated query building logic to be separated and shared within it own class structure.&lt;br /&gt;&lt;br /&gt;An anti-pattern to be aware of when using the repository pattern is to ensure that you don't try and combine aggregates and repositories together. A repository should not have any properties, only a collection of entities. Violating this significantly complicates the implementation and leads to role confusion exacerbating the problem.&lt;br /&gt;&lt;br /&gt;A good definition of the pattern by Martin Fowler can be found on his website.&lt;br /&gt;&lt;a href="http://martinfowler.com/eaaCatalog/repository.html"&gt;http://martinfowler.com/eaaCatalog/repository.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There isn't many good examples of the repository pattern, so here is an example interface of what it might look like.&lt;br /&gt;&lt;br /&gt;interface Repository&lt;e&gt; extends Iterable&lt;e&gt; {&lt;br /&gt;  void add(E entity);&lt;br /&gt;  void remove(E entity);&lt;br /&gt;  void clear();&lt;br /&gt;  E findById(String id);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;interface SequentialRepository&lt;e&gt; extends Repository&lt;e&gt; {&lt;br /&gt;  E get(int index);&lt;br /&gt;  int indexOf(E entity);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;interface ScoreRepository extends SequentialRepository&lt;score&gt; {&lt;br /&gt;  List&lt;score&gt; findScoresByCategory(Category cat);&lt;br /&gt;  void setScoreLimit(int limit);&lt;br /&gt;  Score getMax();&lt;br /&gt;}&lt;/score&gt;&lt;/score&gt;&lt;/e&gt;&lt;/e&gt;&lt;/e&gt;&lt;/e&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/73841c5f-f92c-4d96-b4e1-94f392e7200f/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=73841c5f-f92c-4d96-b4e1-94f392e7200f" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-7856841636480690926?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/7856841636480690926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/12/repository-entity-pattern.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7856841636480690926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7856841636480690926'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/12/repository-entity-pattern.html' title='Repository Entity Pattern'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-8022976189626762136</id><published>2008-12-15T05:46:00.000-08:00</published><updated>2009-06-30T12:34:59.328-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web application'/><title type='text'>The 7 Stages of Scaling Web Apps</title><content type='html'>I came across this short presentation on the pains of scaling a web application and thought I would share it here.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.slideshare.net/davemitz/7-stages-of-scaling-web-applications"&gt;http://www.slideshare.net/davemitz/7-stages-of-scaling-web-applications&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/86f06df6-bf4c-4b99-a199-804f5f826fa5/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=86f06df6-bf4c-4b99-a199-804f5f826fa5" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-8022976189626762136?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/8022976189626762136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/12/7-stages-of-scaling-web-apps.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8022976189626762136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8022976189626762136'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/12/7-stages-of-scaling-web-apps.html' title='The 7 Stages of Scaling Web Apps'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-6393997242427883695</id><published>2008-12-05T08:27:00.001-08:00</published><updated>2009-06-30T12:35:19.952-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Rich Internet application'/><category scheme='http://www.blogger.com/atom/ns#' term='Web application'/><title type='text'>Rich Internet Applications</title><content type='html'>Silverlight, Flex, and JavaFx are all trying to capture a new market of rich Internet applications that promise to be the best of both desktop applications and web applications. However, none of them are accessible to agents. Like desktop applications, they can only be used for the purpose they were designed for and cannot be used for indexing, harvesting, or used in mashups. This is not surprising as none of their businesses depend on open interoperability. The only big web players that depend on open interoperability are Google and Yahoo!, which is why Google funds the Mozilla and Chrome browser projects.&lt;br /&gt;&lt;br /&gt;The web's biggest success is the inter-connectivity and vast amount of information available in the same format (HTML). It will be interesting to see if these new RIA platforms will have any effect on the trend of moving applications to the web.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/35de68fa-2c07-4f1e-9522-edb3574aa8df/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=35de68fa-2c07-4f1e-9522-edb3574aa8df" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-6393997242427883695?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/6393997242427883695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/12/rich-internet-applications.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6393997242427883695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6393997242427883695'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/12/rich-internet-applications.html' title='Rich Internet Applications'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-1518247987265354720</id><published>2008-12-01T05:53:00.000-08:00</published><updated>2009-06-30T12:35:54.217-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web application'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='Model–view–controller'/><title type='text'>MVC With XSLT</title><content type='html'>When Spring MVC (Model View Controller) was first released in 2003, it helped clarify the roles and bring a clearer separation between the model, the view and the controller to Java web development. Complicated HTML pages became easier to maintain and changes were straight forward to implement. However, web applications have changed significantly since then.&lt;br /&gt;&lt;br /&gt;With the recent explosion of new JavaScript libraries the separation between MVC has once again become blurred. Many HTML pages today are loaded in stages (a la AJAX), one entity at a time. Traditional Spring MVC seems overly complicated for small single entity results.&lt;br /&gt;&lt;br /&gt;Creating rich AJAX web applications can still follow the MVC design pattern, although it might require stepping out of the Java/JavaScript comfort zone.&lt;br /&gt;&lt;br /&gt;Consider a typical asynchronous request:&lt;br /&gt;1) User's activity triggers an HTTP request.&lt;br /&gt;2) The server processes the request and may invoke changes to the model and/or return part of the model (an entity) to the client.&lt;br /&gt;3) The script that sent the request, manipulates the response and displays it for the user.&lt;br /&gt;&lt;br /&gt;In the above we can still see the MVC pattern: the model is the server's response, the view is the manipulation of the response for display, and the controller is the server. However, this differs from the original Spring MVC of 2003 - the view has moved to the client and the model is (in part) serialized in an HTTP message body.&lt;br /&gt;&lt;br /&gt;Part of the confusion with AJAX development is around the role of the "view". It gets blurred between the serialization of an entity model and how JavaScript displays it. Inconsistencies in this area can cause many maintainability issues as the interaction between the client and server becomes confusing.&lt;br /&gt;&lt;br /&gt;By viewing dynamic HTTP responses as serializations of entities from a data source (model), and leaving the "view" for the client, clarity and maintainability can be achieved. The only standard display technology that works equally well for large entities and entity fragments is XSLT/HTML. Today's modern browsers all support XSLT 1.0 transformations using JavaScirpt. By using XML for the model interchange and XSLT/HTML for the view display, JavaScript usages can be limited to what it does best: filling in missing functionality of the browser.&lt;br /&gt;&lt;br /&gt;By limiting the role of JavaScript, its reusability is maximized. In the future the amount of JavaScript required by web applications should be significantly reduced. In addition, projects like &lt;a href="http://code.google.com/p/webforms2/"&gt;webforms2 (at google code)&lt;/a&gt; promise to bring tomorrow's HTML5 and Web forms 2.0 to today's browsers.&lt;br /&gt;&lt;br /&gt;XSLT brings more flexibility and reusability to the view layer (vs JSP-like technologies). By using client-side JavaScript/XSLT with other AJAX technologies modern web applications can achieve the richness of desktop applications, while still using best practises of the MVC design pattern.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/92e12528-a927-4831-ab1b-6a45dd6e4a96/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=92e12528-a927-4831-ab1b-6a45dd6e4a96" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-1518247987265354720?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/1518247987265354720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/12/mvc-with-xslt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/1518247987265354720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/1518247987265354720'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/12/mvc-with-xslt.html' title='MVC With XSLT'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-8389749105066772914</id><published>2008-11-24T07:32:00.001-08:00</published><updated>2009-06-30T12:36:26.908-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Object-Oriented'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Open Concepts</title><content type='html'>Most examples of open classes are extensions of core system classes (string/float), such as adding a "to_cents" method on Float. Often such extensions are not needed, as a new wrapper class, such as "Money", would serve the purpose better.&lt;br /&gt;&lt;br /&gt;Core classes may not need to be open for extensions, although that can sometimes be useful (remember how long it took Sun to add java.lang.String#replace(String,String)). It is important for Model classes to be open for downstream extensions. For this reason I use the term "Open Concepts" to indicate that the concepts in the model are extendable.&lt;br /&gt;&lt;br /&gt;The biggest advantage for having "Open Concepts" is that the model can be modified without modifying the original source. This creates many opportunities for multiple team system development. By enabling the model to permit dynamic integration of independent and decentralized designs (open), the code becomes simplified and more useful to a wide array of use-cases. Consider the productivity advantages of allowing downstream development to have more influence to extend the supplied model without necessarily involving upstream in the changes. These are many of the advantages that allowed the Ruby language to gain so much popularity.&lt;br /&gt;&lt;br /&gt;There are many ways to enable this, even in more mainstream languages. One popular approach is to implement a plug-in system for key points in the model (although this quickly become complicated with many "key points").&lt;br /&gt;&lt;br /&gt;A more generic way is to implement the role class model in all the concepts. This allows every individual to expose itself through multiple concepts. However, anyone that has used Mozilla's XPCOM, knows first hand how the syntax of this pattern can get out of hand.&lt;br /&gt;&lt;br /&gt;Today, with the popularity of new languages that support the run-time mixing of classes, new opportunities for creating an expendable model now exist. Such an approach allows both plugin-style and role-style extensions, but still uses the syntax of the host language. This allows the model to be used the same way as if no extensions are present.&lt;br /&gt;&lt;br /&gt;Any large system will need some type of extendability be it a plugin-style, a role-style, or an open-style model. It is worth considering the approach early in the development cycle, as many of these approaches are intrusive, by syntax or language.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/a0d4d17f-8277-401a-b85d-c6b6f40ed6d3/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=a0d4d17f-8277-401a-b85d-c6b6f40ed6d3" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-8389749105066772914?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/8389749105066772914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/11/open-concepts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8389749105066772914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/8389749105066772914'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/11/open-concepts.html' title='Open Concepts'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-6660481504833360714</id><published>2008-11-17T10:07:00.000-08:00</published><updated>2009-06-30T12:36:49.693-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Domain-specific language'/><category scheme='http://www.blogger.com/atom/ns#' term='Business logic'/><title type='text'>Storing Business Rules</title><content type='html'>Every application has some domain logic or business rules, but how much thought goes into how it is stored? Try asking yourself the following questions to help identify possible ways to serialize the domain logic.&lt;br /&gt;&lt;br /&gt;How often will it change? Will each deployment need to have customized rules, will they be changing at run-time?&lt;br /&gt;&lt;br /&gt;Who will be managing the domain logic? Will it be managed by people with a particular skill set? Does the domain logic need to have its own version control and distribution channel? Will the domain logic be reviewed by independent parties?&lt;br /&gt;&lt;br /&gt;What form will the domain logic take? Can it be defined in a formal structure? Is it data driven?&lt;br /&gt;&lt;br /&gt;There are many ways that domain logic could be stored, the most common is not always the best. Consider the following ways to serialize and store domain logic. You might use the same language as the application logic, or You might encode it in a domain specific language.&lt;br /&gt;&lt;br /&gt;Domain logic might be stored in flat files that are compiled or in a form more suitable for a rule engine. It could be embedded in one or more XML files, for indexing and quick access. Domain logic might also be stored in a formal structure, for user-initiated rules or dynamic version control.&lt;br /&gt;&lt;br /&gt;Domain logic can take on many forms and how it will be stored should be consider carefully. Depending on the makeup of the team or other external influences there maybe a need to make a greater distinction between domain and application logic.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/93aac6fd-7fcc-48b5-860d-48b9ff257b41/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=93aac6fd-7fcc-48b5-860d-48b9ff257b41" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-6660481504833360714?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/6660481504833360714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/11/storing-business-rules.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6660481504833360714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6660481504833360714'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/11/storing-business-rules.html' title='Storing Business Rules'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-7904103534291794538</id><published>2008-11-13T05:52:00.000-08:00</published><updated>2009-06-30T12:37:09.682-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Utilizing a Multi-Core System with the Actor Model</title><content type='html'>Demand for multi-core/multi-processor applications is growing, but developing for a multi-threaded application does not require a steep learning curve or an understanding of complicated edge cases. Learn how to develop efficient multi-threaded applications without using synchronized blocks.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devx.com/Java/Article/39868"&gt;http://www.devx.com/Java/Article/39868&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/50777b9b-d0fb-4694-b5f1-d05c20671561/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=50777b9b-d0fb-4694-b5f1-d05c20671561" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-7904103534291794538?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/7904103534291794538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/11/utilizing-multi-core-system-with-actor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7904103534291794538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7904103534291794538'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/11/utilizing-multi-core-system-with-actor.html' title='Utilizing a Multi-Core System with the Actor Model'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-7781622974722623319</id><published>2008-11-10T10:13:00.000-08:00</published><updated>2009-06-30T12:37:32.812-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Modeling language'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>What a Modelling Language Should Look Like</title><content type='html'>InfoQ gave a summary yesterday of a few blog posts on Modelling languages.&lt;br /&gt;Briefly, Steven Kelly and Juha-Pekka Tolvanen say such a language should:&lt;br /&gt;1) Map to the domain problem concepts and not implementation details.&lt;br /&gt;2) Be formalized and helpful.&lt;br /&gt;3) Have stand alone tooling support.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/news/2008/11/useful-modeling-language"&gt;http://www.infoq.com/news/2008/11/useful-modeling-language&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately, the discussion focused on a visual modelling language (UML) and did not address any alternative modelling languages, such as the standard Web Ontology Language (OWL), which addresses many of these issues. Although OWL was not designed as a visual language or arbitrary code-generation, it has grown to support such usage.&lt;br /&gt;&lt;br /&gt;TopBraid Composer, for example, is a mature editor and visualization tool for OWL.&lt;br /&gt;&lt;a href="http://www.topquadrant.com/topbraid/composer/"&gt;http://www.topquadrant.com/topbraid/composer/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/0e417bd2-de0f-4111-a3ba-79e50107fd87/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=0e417bd2-de0f-4111-a3ba-79e50107fd87" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-7781622974722623319?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/7781622974722623319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/11/what-modelling-language-should-look.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7781622974722623319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/7781622974722623319'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/11/what-modelling-language-should-look.html' title='What a Modelling Language Should Look Like'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-3104021789408159002</id><published>2008-11-06T06:00:00.000-08:00</published><updated>2009-06-30T12:38:07.431-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Module Dependencies</title><content type='html'>I was reminded recently of a domain model I used to work with that did not separate interfaces from their implementations. They never considered dependencies to be an issue because javac could compile the entire source tree at once.&lt;br /&gt;&lt;br /&gt;When I came on board, their product was nearing it's first release and their domain model's class dependency chart looked like a bowl of spaghetti. Eventually the lack of dependency management become apparent: each team was developing at a different pace, but everyone was forced into monolithic releases.&lt;br /&gt;&lt;br /&gt;Much of the circular dependencies were addressed by introducing interfaces or abstract classes. However, the process was slow and full of challenges. Hibernate only supports a single inheritance model, but with so many different perspectives such a restriction proved very limiting.&lt;br /&gt;&lt;br /&gt;Many of these problems could have been avoided had more thought gone into the the conceptual class hierarchy earlier and distinct modules been created to force developers into observing and thinking about class dependencies early in the development cycle.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/6e0fff4a-0371-4ab5-931f-3e7ebb9d7e2e/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=6e0fff4a-0371-4ab5-931f-3e7ebb9d7e2e" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-3104021789408159002?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/3104021789408159002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/11/module-dependencies.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/3104021789408159002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/3104021789408159002'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/11/module-dependencies.html' title='Module Dependencies'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-2302329601676846194</id><published>2008-11-03T10:03:00.000-08:00</published><updated>2009-06-30T12:38:30.811-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Where are programming languages going?</title><content type='html'>Anders Hejlsberg gave a keynote last month at JAOO http://jaoo.blip.tv/#1324214 (published two weeks ago) entitled "Where are programming languages going?". He said that with a little more restriction in languages, compilers could do a much better job at optimizing the code. I think this is an interesting discussion and agree with many of he ideas.&lt;br /&gt;&lt;br /&gt;Towards the end of the talk he addressed concurrency. He suggested that a for loop, for example, could automatically execute all iterations in parallel - if few mutable variables existed. This is an interesting idea, although a very difficult task. Unless the code fits into the map-reduce pattern, it will likely modify some shared memory structure or external state (read database) and could not safely be executed in parallel. I think we will have to see more integration between persistence frameworks and optimizers before such as idea could be realized.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/a3e7b95e-a389-4c7a-a2e1-1734cc54cbea/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=a3e7b95e-a389-4c7a-a2e1-1734cc54cbea" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-2302329601676846194?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/2302329601676846194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/11/where-are-programming-languages-going.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2302329601676846194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2302329601676846194'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/11/where-are-programming-languages-going.html' title='Where are programming languages going?'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-6557331682476352941</id><published>2008-10-30T12:44:00.000-07:00</published><updated>2009-06-30T12:38:56.047-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Semantic Web'/><title type='text'>What is the Semantic Web?</title><content type='html'>I get this question a lot and below is what the semantic web means to me. What do you view as the semantic web?&lt;br /&gt;&lt;br /&gt;Software is built around models: logical representations of a system of entities. Models are an important part of software development, as the user's experience is often a reflection of the underlying model. Any flaws in the model will cascade up all the way to the user's interaction with the system.&lt;br /&gt;&lt;br /&gt;Today's software programs have many different users with many different perspectives. Attempting to satisfy everyone with a single model leads to complexity that make the model difficult to understand and use.&lt;br /&gt;&lt;br /&gt;The semantic web provides standards to express interconnected models by capturing and contextualizing the knowledge about them. Semantic web technologies allows one to access the larger conceptual data model and from more abstract points of view. This enables both people *and* software to navigate between both high level and detailed views so information can easily be examined and modified from different perspectives.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/9964e01b-cbaf-49c3-b4a5-f65d4c1d8050/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=9964e01b-cbaf-49c3-b4a5-f65d4c1d8050" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-6557331682476352941?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/6557331682476352941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/10/what-is-semantic-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6557331682476352941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6557331682476352941'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/10/what-is-semantic-web.html' title='What is the Semantic Web?'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-6883495197806333758</id><published>2008-10-27T11:09:00.000-07:00</published><updated>2009-06-30T12:39:18.245-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Keeping Classes Small</title><content type='html'>Most people would agree that smaller classes are better. It is generally accepted that smaller classes are associated with robustness, reliability, reusability, and understandability. However, what causes a class to become too large?&lt;br /&gt;&lt;br /&gt;Many people instinctively try to implement a interface or concept as a single class. However, sometimes the implementation is too complicated to be understood quickly and the class size gets too large. If you think this might be the case, take a look at the class variables. If the number of variables is large, if some of the variables could be "grouped" together, or if some of the variables are only used some of the time, try and split the implementation details into their own classes and allow the original class to delegate to or compose them.&lt;br /&gt;&lt;br /&gt;Every time you are creating or adding to a class ask yourself if this could better explained in a separate class. This will help you or a co-developer later find what it is they are looking for faster.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/ad345400-c818-41de-a052-52bad7b5ebaa/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=ad345400-c818-41de-a052-52bad7b5ebaa" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-6883495197806333758?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/6883495197806333758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/10/keeping-classes-small.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6883495197806333758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/6883495197806333758'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/10/keeping-classes-small.html' title='Keeping Classes Small'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-9074527590241093153</id><published>2008-10-24T05:44:00.000-07:00</published><updated>2009-06-30T12:39:41.128-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sesame'/><title type='text'>Sesame 2.2.1 Released</title><content type='html'>This marks the first stable release of Mulgara's Sesame interface. Creating a unified API to access many specialized RDF stores.&lt;br /&gt;&lt;br /&gt;Other RDF stores that support the Sesame API include:&lt;br /&gt;OWLIM&lt;br /&gt;Virtuoso&lt;br /&gt;BigData&lt;br /&gt;AllegroGraph&lt;br /&gt;&lt;br /&gt;For more information about Sesame see:&lt;br /&gt;&lt;a href="http://www.openrdf.org/"&gt;http://www.openrdf.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3465716704098863819-9074527590241093153?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/9074527590241093153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/10/sesame-221-released.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/9074527590241093153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/9074527590241093153'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/10/sesame-221-released.html' title='Sesame 2.2.1 Released'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-5754251626771094089</id><published>2008-10-23T05:46:00.000-07:00</published><updated>2009-06-30T12:40:08.294-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Calais'/><title type='text'>Extracting Meaning from Text with OpenCalais R3</title><content type='html'>This article shows how to convert unstructured written text into structured data using OpenCalais, which is a public general-purpose text-extraction service that uses a combination of statistical and grammatical analysis to extract meaning.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.devx.com/semantic/Article/39550"&gt;http://www.devx.com/semantic/Article/39550&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/e4bb3d17-5a57-452d-8f72-d8577ed70775/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=e4bb3d17-5a57-452d-8f72-d8577ed70775" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-5754251626771094089?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/5754251626771094089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/10/extracting-meaning-from-text-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/5754251626771094089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/5754251626771094089'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/10/extracting-meaning-from-text-with.html' title='Extracting Meaning from Text with OpenCalais R3'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-2368706153041877104</id><published>2008-10-20T06:57:00.000-07:00</published><updated>2009-06-30T12:40:27.834-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Smaller Class Sizes</title><content type='html'>We hear this a lot wrt education, but can it also help programming? I think so!&lt;br /&gt;&lt;br /&gt;Code should be written in a way that explains what the code "should" be doing. This can only be done by continually giving the reader a summary of the operations that need to be performed. Think of each class as cheat sheet: it contains what is important to understand its behaviour. A class should not go into too much detail, but instead delegate to other classes for further details, leading to smaller classes. Every computer operation can be divided into sub operations. These sub operations may not be as important to a reader and should not distract or confuse the reader when trying to understand the purpose of the class.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/28ad5215-78be-4753-828b-76bcfeca38e5/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=28ad5215-78be-4753-828b-76bcfeca38e5" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-2368706153041877104?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/2368706153041877104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/10/smaller-class-sizes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2368706153041877104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/2368706153041877104'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/10/smaller-class-sizes.html' title='Smaller Class Sizes'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3465716704098863819.post-1647195363374637626</id><published>2008-10-14T14:25:00.000-07:00</published><updated>2009-06-30T12:40:47.292-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Easy To Read Code</title><content type='html'>If we wanted to write code for a computer, we would be using only 0s and 1s, but we don't. Code is written for human consumption. It is more important that a co-developer can easily "compile" the code than any machine. If any code contains a bug, a machine isn't going to fix it - only a human will. Therefore we should take extra care to make the reader's job as easy as possible by making the code as easy as possible to read. Any code worth writing is worth writing well.&lt;br /&gt;&lt;br /&gt;Unlike a computer, we can't read one line at a time. Our natural field of focus has a limited width and this needs to be considered when writing and creating APIs. This courtesy leads coders to limiting the length of each line. The easiest way to correct long lines of code is to use more local variables to allow operations to be separated on separate lines. However, too often this is not enough.&lt;br /&gt;&lt;br /&gt;Often libraries use overly verbose and repetitive names. This is done in the name of clarity, but at the expense of the readability of their users' code. API developers need to keep not only the readability of their own code in mind, but also the readability of their users' code. Here are four examples that I have seen recently, of APIs that force their users into writing difficult to read code:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ServletConfig#getServletContext() - The word Servlet is redundant in the method and could be removed to shorten calling code.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: trebuchet ms;"&gt;org.openrdf.repository.RepositoryConnection&lt;/span&gt; - Unless it is common to work with multiple connections from different packages, there is no need to repeat the word "repository" in the package and class prefix.&lt;/li&gt;&lt;li&gt;IReadableBinaryStreamRepresentation - Here is an example of a repeating suffix that adds nothing to clarify its use.&lt;/li&gt;&lt;li&gt;context.getKernelContext().getThisKernelRequest().getRequestScope() - If the API forces users in this type of repetitive message chaining, not only is the API forcing code that is hard to read, but it also couples the client to the structure of the navigation and any changes to the intermediate relationships forces the client to also change.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;To any API designers (or would be API designers) out there: Please spend some time thinking on how you can reduce the repetition in your API and strive to use short concise names. It will go a long way to making more readable code.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"&gt;&lt;a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/a3af2d01-74f2-49e3-9276-649b007365c5/" title="Reblog this post [with Zemanta]"&gt;&lt;img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=a3af2d01-74f2-49e3-9276-649b007365c5" alt="Reblog this post [with Zemanta]"&gt;&lt;/a&gt;&lt;span class="zem-script more-related pretty-attribution"&gt;&lt;script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"&gt;&lt;/script&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/3465716704098863819-1647195363374637626?l=jamesrdf.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jamesrdf.blogspot.com/feeds/1647195363374637626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://jamesrdf.blogspot.com/2008/10/easy-to-read-code.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/1647195363374637626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3465716704098863819/posts/default/1647195363374637626'/><link rel='alternate' type='text/html' href='http://jamesrdf.blogspot.com/2008/10/easy-to-read-code.html' title='Easy To Read Code'/><author><name>James Leigh</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_Lhy3WsQ03Bs/SPQDtbNc1QI/AAAAAAAAAAc/Y5EdC-QvWAU/S220/avatar.jpg'/></author><thr:total>6</thr:total></entry></feed>
