<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US"><title type="text">DamnHandy</title><link rel="alternate" type="text/html" href="http://damnhandy.com" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Damnhandy" /><subtitle type="text">A blog about the things in my head.</subtitle><updated>2012-11-21T13:47:48+00:00</updated><generator uri="http://wordpress.org/">WordPress</generator><feedburner:info uri="damnhandy" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><id>http://damnhandy.com/feed/atom/</id><geo:lat>42.649758</geo:lat><geo:long>-71.333486</geo:long><feedburner:emailServiceId>Damnhandy</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry><title type="html">Handy-URI-Templates 1.1.7 Released</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Damnhandy/~3/POtRvi0imkQ/" /><category term="Java" /><author><uri>http://damnhandy.com</uri></author><updated>2012-11-21T05:47:48-08:00</updated><id>http://damnhandy.com/?p=510</id><summary type="html">Yesterday Handy URI Templates 1.1.7 was released which fixed a few uritemplate-test issues as well as some URI encoding fixes. Hat tip to tekener for those fixes. With that out of the way, I&amp;#8217;ll be focusing on 1.2 which will...</summary><content type="html" xml:base="http://damnhandy.com/2012/11/21/handy-uri-templates-1-1-7-released/">&lt;p&gt;Yesterday &lt;a href="https://github.com/damnhandy/Handy-URI-Templates"&gt;Handy URI Templates 1.1.7&lt;/a&gt; was released which fixed a few &lt;a href="https://github.com/uri-templates/uritemplate-test"&gt;uritemplate-test&lt;/a&gt; issues as well as some URI encoding fixes. Hat tip to &lt;a href="https://github.com/tekener"&gt;tekener&lt;/a&gt; for those fixes.&lt;/p&gt;
&lt;p&gt;With that out of the way, I&amp;#8217;ll be focusing on 1.2 which will change the API a bit, but will finally add reverse mapping so that you can use it to match request URLs to a URI template pattern. It turns out that this is a bit more complicated than I first imagined. A number of folks have pointed to the excellent &lt;a href="http://code.google.com/p/wo-furi/"&gt;wo-furi&lt;/a&gt; project as this already does reverse mapping. However, it only handles &lt;a href="http://tools.ietf.org/html/rfc6570#section-1.2"&gt;level 1&lt;/a&gt;, and maybe level 2 templates. Things get hairy when you start reverse mapping level 3 and level 4 templates.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=POtRvi0imkQ:8ax7CJiQ0yg:mIC1leqXSog"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=POtRvi0imkQ:8ax7CJiQ0yg:mIC1leqXSog" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=POtRvi0imkQ:8ax7CJiQ0yg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=POtRvi0imkQ:8ax7CJiQ0yg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=POtRvi0imkQ:8ax7CJiQ0yg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=POtRvi0imkQ:8ax7CJiQ0yg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=POtRvi0imkQ:8ax7CJiQ0yg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=POtRvi0imkQ:8ax7CJiQ0yg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=POtRvi0imkQ:8ax7CJiQ0yg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=POtRvi0imkQ:8ax7CJiQ0yg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=POtRvi0imkQ:8ax7CJiQ0yg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=POtRvi0imkQ:8ax7CJiQ0yg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=POtRvi0imkQ:8ax7CJiQ0yg:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=POtRvi0imkQ:8ax7CJiQ0yg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Damnhandy/~4/POtRvi0imkQ" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://damnhandy.com/2012/11/21/handy-uri-templates-1-1-7-released/</feedburner:origLink></entry><entry><title type="html">Handy Aspects Moved to GitHub</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Damnhandy/~3/z93HHB5Zl7g/" /><category term="Java" /><author><uri>http://damnhandy.com</uri></author><updated>2012-08-07T05:12:28-07:00</updated><id>http://damnhandy.com/?p=506</id><summary type="html">A few years back, I dabbled a bit with Aspect Oriented Programming and dorked around with JBoss AOP and AspectJ. I created a few aspects an threw them up on Java.net. Over the years, I never really kept up with...</summary><content type="html" xml:base="http://damnhandy.com/2012/08/07/handy-aspects-moved-to-github/">&lt;p&gt;A few years back, I dabbled a bit with Aspect Oriented Programming and dorked around with JBoss AOP and AspectJ. I created a &lt;a href="http://damnhandy.com/javabean-aspect/"&gt;few aspects&lt;/a&gt; an threw them up on &lt;a href="http://java.net"&gt;Java.net&lt;/a&gt;. Over the years, I never really kept up with maintaing the project. Since then, Java.net migrated projects and Handy Aspects was removed. Since then, I have received a few requests for the code and I planned on moving it to &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But rather than simply throwing the code up there &amp;#8220;as-is&amp;#8221;, I decided to bring the project up to date a bit. For example, I moved the build from Ant to Maven and brought the dependencies up to the latest versions. I also removed &lt;a href="http://www.jboss.org/jbossaop/"&gt;JBoss AOP&lt;/a&gt; version and everything is now based on &lt;a href="http://www.eclipse.org/aspectj/"&gt;AspectJ&lt;/a&gt;. With that said, you can follow and fork the new project &lt;a href="https://github.com/damnhandy/Handy-Aspects"&gt;Handy-Apsects project here&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=z93HHB5Zl7g:Rhw7jhfyGcs:mIC1leqXSog"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=z93HHB5Zl7g:Rhw7jhfyGcs:mIC1leqXSog" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=z93HHB5Zl7g:Rhw7jhfyGcs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=z93HHB5Zl7g:Rhw7jhfyGcs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=z93HHB5Zl7g:Rhw7jhfyGcs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=z93HHB5Zl7g:Rhw7jhfyGcs:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=z93HHB5Zl7g:Rhw7jhfyGcs:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=z93HHB5Zl7g:Rhw7jhfyGcs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=z93HHB5Zl7g:Rhw7jhfyGcs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=z93HHB5Zl7g:Rhw7jhfyGcs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=z93HHB5Zl7g:Rhw7jhfyGcs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=z93HHB5Zl7g:Rhw7jhfyGcs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=z93HHB5Zl7g:Rhw7jhfyGcs:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=z93HHB5Zl7g:Rhw7jhfyGcs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Damnhandy/~4/z93HHB5Zl7g" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://damnhandy.com/2012/08/07/handy-aspects-moved-to-github/</feedburner:origLink></entry><entry><title type="html">I want to like SCXML, but executable XML is a bit of a two-bagger</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Damnhandy/~3/ptxAr7_UTMM/" /><category term="Linked Data" /><category term="REST" /><category term="Semantic Web" /><author><uri>http://damnhandy.com</uri></author><updated>2012-05-31T05:18:52-07:00</updated><id>http://damnhandy.com/?p=495</id><summary type="html">Over the past few days I have been reading up on the State Chart XML spec. Ever since reading some of Stu Charltons ideas on a RESTful Hypermedia Agent and listening to his WS-REST keynote presentation, I&amp;#8217;ve taken more of...</summary><content type="html" xml:base="http://damnhandy.com/2012/05/31/i-want-to-like-scxml-but-executable-xml-is-a-bit-of-a-two-bagger/">&lt;p&gt;Over the past few days I have been reading up on the &lt;a href="http://www.w3.org/TR/scxml/"&gt;State Chart XML&lt;/a&gt; spec. Ever since reading some of Stu Charltons ideas on a &lt;a href="http://www.stucharlton.com/blog/archives/2010/03/building-a-restful-hypermedia.html"&gt;RESTful Hypermedia Agent&lt;/a&gt; and listening to his &lt;a href="http://www.stucharlton.com/blog/archives/2011/03/ws-rest-keynote-slides-and-rec.html"&gt;WS-REST keynote&lt;/a&gt; presentation, I&amp;#8217;ve taken more of an interest in hierarchical state machines and began taking a more in-depth look into SCXML.&lt;/p&gt;
&lt;p&gt;The design of SCXML is interesting. I like the &lt;a href="http://www.w3.org/TR/scxml/#script"&gt;ECMA Script&lt;/a&gt; functionality and XML structure feels clean at first. It all seems fine until you get to the section on &lt;a href="http://www.w3.org/TR/scxml/#executable"&gt;executable content&lt;/a&gt;. There&amp;#8217;s a bit of &lt;a href="http://niclasnilsson.se/articles/2006/04/26/alternatives-to-executable-xml"&gt;debate around &amp;#8220;executable xml&amp;#8221;&lt;/a&gt; and executable XML frameworks like &lt;a href="http://commons.apache.org/jelly/"&gt;Jelly&lt;/a&gt;. And even &lt;a href="http://www.charlespetzold.com/etc/CSAML.html"&gt;folks poking fun at the idea of an XML programming language&lt;/a&gt;. As a Java guy, I have grown to dislike build tools such as &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt; due to the fact that one can express relatively complex conditional logic in XML. I like tools like &lt;a href="http://maven.apache.org"&gt;Maven&lt;/a&gt; better since it&amp;#8217;s XML model is more declarative rather than executable (&lt;a href="http://maven.apache.org/guides/introduction/introduction-to-profiles.html"&gt;profiles&lt;/a&gt; are conditional). When I need more complex build operations, I&amp;#8217;d be looking at tools like &lt;a href="http://www.gradle.org/"&gt;Gradle&lt;/a&gt;. Don&amp;#8217;t get me started on XSLT.&lt;/p&gt;
&lt;p&gt;I really like the concept of SCXML, but I&amp;#8217;m not sold on the design. I don&amp;#8217;t really have issue with the use of XML in general, I get it. However, the executable XML content bit is really hard to get past. Expecially when a scripting evironment is available to the SCXML environment. I can debug JavaScript code with a number of tools. Executable XML content? Not so much. For me, the executable content bit is the technical equivalent of a &lt;a href="http://www.urbandictionary.com/define.php?term=two%20bagger"&gt;two-bagger&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=ptxAr7_UTMM:7TKbp8grLaQ:mIC1leqXSog"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=ptxAr7_UTMM:7TKbp8grLaQ:mIC1leqXSog" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=ptxAr7_UTMM:7TKbp8grLaQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=ptxAr7_UTMM:7TKbp8grLaQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=ptxAr7_UTMM:7TKbp8grLaQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=ptxAr7_UTMM:7TKbp8grLaQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=ptxAr7_UTMM:7TKbp8grLaQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=ptxAr7_UTMM:7TKbp8grLaQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=ptxAr7_UTMM:7TKbp8grLaQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=ptxAr7_UTMM:7TKbp8grLaQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=ptxAr7_UTMM:7TKbp8grLaQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=ptxAr7_UTMM:7TKbp8grLaQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=ptxAr7_UTMM:7TKbp8grLaQ:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=ptxAr7_UTMM:7TKbp8grLaQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Damnhandy/~4/ptxAr7_UTMM" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://damnhandy.com/2012/05/31/i-want-to-like-scxml-but-executable-xml-is-a-bit-of-a-two-bagger/</feedburner:origLink></entry><entry><title type="html">Handy URI Templates 1.1.2 Released</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Damnhandy/~3/cUvwlZC9neA/" /><category term="Java" /><category term="Linked Data" /><category term="REST" /><author><uri>http://damnhandy.com</uri></author><updated>2012-05-21T18:28:28-07:00</updated><id>http://damnhandy.com/?p=491</id><summary type="html">After a few weeks of tweaking, I put out a new release of Handy URI Templates. What&amp;#8217;s important about version 1.1.2 is that it is now being tested against the uritemplate-test suite started by Mark Nottingham. Most importantly, it is...</summary><content type="html" xml:base="http://damnhandy.com/2012/05/21/handy-uri-templates-1-1-2-released/">&lt;p&gt;After a few weeks of tweaking, I put out a new release of &lt;a href="https://github.com/damnhandy/Handy-URI-Templates"&gt;Handy URI Templates&lt;/a&gt;. What&amp;#8217;s important about version 1.1.2 is that it is now being tested against the &lt;a href="https://github.com/uri-templates/uritemplate-test"&gt;uritemplate-test&lt;/a&gt; suite started by &lt;a href="http://www.mnot.net/"&gt;Mark Nottingham&lt;/a&gt;. Most importantly, it is also now passing all tests. Additionally, this release also marks the introduction of expression validation as well. If you&amp;#8217;ve been using the 1.0.x versions, I&amp;#8217;d highly recommend moving up to 1.1.2.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=cUvwlZC9neA:i4VcaEXlgKU:mIC1leqXSog"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=cUvwlZC9neA:i4VcaEXlgKU:mIC1leqXSog" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=cUvwlZC9neA:i4VcaEXlgKU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=cUvwlZC9neA:i4VcaEXlgKU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=cUvwlZC9neA:i4VcaEXlgKU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=cUvwlZC9neA:i4VcaEXlgKU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=cUvwlZC9neA:i4VcaEXlgKU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=cUvwlZC9neA:i4VcaEXlgKU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=cUvwlZC9neA:i4VcaEXlgKU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=cUvwlZC9neA:i4VcaEXlgKU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=cUvwlZC9neA:i4VcaEXlgKU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=cUvwlZC9neA:i4VcaEXlgKU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=cUvwlZC9neA:i4VcaEXlgKU:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=cUvwlZC9neA:i4VcaEXlgKU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Damnhandy/~4/cUvwlZC9neA" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://damnhandy.com/2012/05/21/handy-uri-templates-1-1-2-released/</feedburner:origLink></entry><entry><title type="html">Fun with URI Templates and the Facebook Graph API</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Damnhandy/~3/yqabmKnsSuU/" /><category term="Java" /><category term="Linked Data" /><category term="REST" /><author><uri>http://damnhandy.com</uri></author><updated>2012-05-03T06:56:10-07:00</updated><id>http://damnhandy.com/?p=467</id><summary type="html">URI Templates can make interacting with the web APIs like the Facebook Graph API a little easier. Here, I&amp;#8217;ll show you how you can use URI Templates to create request URIs into the Facebook Graph API using the Handy URI...</summary><content type="html" xml:base="http://damnhandy.com/2012/05/03/fun-with-uri-templates-and-the-facebook-graph-api/">&lt;p&gt;URI Templates can make interacting with the web APIs like the &lt;a href="https://developers.facebook.com/docs/reference/api/"&gt;Facebook Graph API&lt;/a&gt; a little easier. Here, I&amp;#8217;ll show you how you can use URI Templates to create request URIs into the Facebook Graph API using the &lt;a href="https://github.com/damnhandy/Handy-URI-Templates"&gt;Handy URI Templates&lt;/a&gt; library. The URI Template examples described should be usable by any &lt;a href="http://tools.ietf.org/html/rfc6570"&gt;RFC6570&lt;/a&gt; URI Template processor, but I&amp;#8217;ll be focusing on how to use the &lt;a href="https://github.com/damnhandy/Handy-URI-Templates"&gt;Handy URI Templates&lt;/a&gt; API in Java. If you&amp;#8217;re using PHP, have a look at &lt;a href="http://mtdowling.com/"&gt;Michael Dowling&amp;#8217;s&lt;/a&gt; excellent &lt;a href="http://guzzlephp.org/"&gt;Guzzle Framework&lt;/a&gt; which has great URI template support.&lt;/p&gt;
&lt;h3&gt;URI Template Basics&lt;/h3&gt;
&lt;p&gt;We&amp;#8217;ll assume you have some familiarity with URI templates. Basically, a URI template is expression where replacement variables are identified by the text between &amp;#8216;{&amp;#8216; and &amp;#8216;}&amp;#8217;, like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://graph.facebook.com/{id}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Where &lt;code&gt;{id}&lt;/code&gt; is the name of the variable. This is similar to how paths are expressed in JAX-RS, and &lt;a href="http://www.opensearch.org/Specifications/OpenSearch/1.1#OpenSearch_URL_template_syntax"&gt;OpenSearch URL template syntax&lt;/a&gt; . The &lt;a href="http://tools.ietf.org/html/rfc6570"&gt;RFC6570&lt;/a&gt; spec provides a lot more details on the URI template standard syntax, so we&amp;#8217;ll focus on how to use URI templates in conjunction with the Facebook Graph API.&lt;/p&gt;
&lt;h3&gt;Facebook Graph API Basics&lt;/h3&gt;
&lt;p&gt;For the most part, most URIs in the Graph API follow the basic pattern of hostname + id. In a URI template, this pattern can be expresed as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://graph.facebook.com/{id}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When the template variable is expanded, it will allow you to create URIs that can be used request resources like so:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users: https://graph.facebook.com/btaylor (Bret Taylor)&lt;/li&gt;
&lt;li&gt;Pages: https://graph.facebook.com/cocacola (Coca-Cola page)&lt;/li&gt;
&lt;li&gt;Events: https://graph.facebook.com/251906384206 (Facebook Developer Garage Austin)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And so on. Facebook also requires you to supply the &lt;code&gt;access_token&lt;/code&gt; in a query parameter on the request URI, so now we end up with the expression:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://graph.facebook.com/{id}{?access_token}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Please check the Facebook documenation on how to get the token.&lt;/p&gt;
&lt;p&gt;Using the &lt;a href="https://github.com/damnhandy/Handy-URI-Templates"&gt;Handy URI Templates&lt;/a&gt; API, you can create a URI from an expression like so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;String expression = "https://graph.facebook.com/{id}{?access_token}";
String uri  = 
   UriTemplate.fromExpression(expression)
              .set("id", "bgolub")
              .set("access_token", System.getProperty("fb.access_token"))
              .expand();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will give you the following URI:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://graph.facebook.com/bgolub?access_token=your_fb_access_token
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Because the &lt;code&gt;{id}&lt;/code&gt; variable can contain sub paths, we need a way to express that. If we have want to express a URI template that gets a users information or the users photo albums, we need additional path segements. We could use multiple path segments with more variables, but this can make the template more complicated. One option is to modify the expression so that &lt;code&gt;{id}&lt;/code&gt; can accomodate a single path segement or multiple path segments by rewriting the expression as:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://graph.facebook.com{/id*}{?access_token}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This does a few things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;By putting the path &amp;#8216;/&amp;#8217; operator in the variable expression, we&amp;#8217;re stating that the values in this variable path segements. By default, if the variable values is an array, Collection or Map, the values will be &amp;#8216;,&amp;#8217; delimited.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;*&lt;/code&gt; modifier means &amp;#8216;explode&amp;#8217;. With an array or Collection plus the explode modifier, the values will be delimited by the &amp;#8216;/&amp;#8217; operator.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now if we change the code a little bit:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;String expression = "https://graph.facebook.com{/id*}{?access_token}";
String uri =  
    UriTemplate.fromExpression(expression)
               .set("id", new String[] {"bgolub","albums"})
               .set("access_token", System.getProperty("fb.access_token"))
               .expand();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&amp;#8217;ll note that the value we pass to the &lt;code&gt;id&lt;/code&gt; variable is an array of strings and the processor will render valuse as two strings separated by a &lt;code&gt;/&lt;/code&gt;.The resulting URI is now:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://graph.facebook.com/bgolub/albums?access_token=your_fb_access_token
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now lets see how we can make more advanced types of requests.&lt;/p&gt;
&lt;h3&gt;More Advanced Requests&lt;/h3&gt;
&lt;p&gt;The Graph API has a number of query parameters that modifiy the request. All of these are defined in the &lt;a href="https://developers.facebook.com/docs/reference/api/"&gt;Facebook Graph API documenation&lt;/a&gt; so I won&amp;#8217;t detail them here. With all of the query parameters collected, you end up with the following URI template expression:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://graph.facebook.com{/id*}{?q,ids,fields,type,center,distance,limit,offset,until,since,access_token}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can pretty much use this template express for the majority, if not all, of the Facebook Graph API. We&amp;#8217;ll use that expression for rest of the examples.&lt;/p&gt;
&lt;h4&gt;Search Request URIs&lt;/h4&gt;
&lt;p&gt;With the URI template, we can create URIs that map to Graph API search requests. Using the &amp;#8220;coffe&amp;#8221; example from the Facebook documenation:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;String expression = "https://graph.facebook.com{/id*}{?q,ids,fields,type,center,distance,limit,offset,until,since,access_token}";

String uri = 
    UriTemplate.fromExpression(expression)
                .set("id","search")
                .set("q", "coffee")
                .set("type","place")
                .set("center", new float[] {37.76f,-122.427f})
                .set("distance", 1000)
                .set("limit", 5)
                .set("offset", 10)
                .set("access_token", System.getProperty("fb.access_token"))
                .expand();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will give us the URI:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://graph.facebook.com/search?q=coffee&amp;amp;type=place&amp;amp;center=37.76,-122.427&amp;amp;distance=1000&amp;amp;limit=5&amp;amp;offset=10&amp;amp;access_token=your_access_token
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note how the variables &lt;code&gt;until&lt;/code&gt; and &lt;code&gt;since&lt;/code&gt; are not included in the expanded URI.&lt;/p&gt;
&lt;h4&gt;FQL Request URIs&lt;/h4&gt;
&lt;p&gt;Even things URIs with FQL queries can be expressed in a template. Give our code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;String expression = "https://graph.facebook.com{/id*}{?q,ids,fields,type,center,distance,limit,offset,until,since,access_token}";

  String uri = 
    UriTemplate.fromExpression(expression)
               .set("id","fql")
               .set("q", "SELECT uid2 FROM friend WHERE uid1=me()")
               .set("access_token", System.getProperty("fb.access_token"))
               .expand();
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Wrap Up&lt;/h3&gt;
&lt;p&gt;Hopefully this gives you a good idea on both how to use URI Templates in general, and a good insight into how you can use teh Handy URI Templates API. If you want more exmaples, have a look at the code on &lt;a href="https://github.com/damnhandy/Handy-URI-Templates/tree/master/src/test/java/com/damnhandy/uri/template/examples"&gt;GitHub here&lt;/a&gt;. There are examples for &lt;a href="https://github.com/damnhandy/Handy-URI-Templates/blob/master/src/test/java/com/damnhandy/uri/template/examples/TestFacebookGraphApi.java"&gt;Facebook&lt;/a&gt;, &lt;a href="https://github.com/damnhandy/Handy-URI-Templates/blob/master/src/test/java/com/damnhandy/uri/template/examples/TestTwitterSearchApi.java"&gt;Twitter&lt;/a&gt;, and &lt;a href="https://github.com/damnhandy/Handy-URI-Templates/blob/master/src/test/java/com/damnhandy/uri/template/examples/TestGitHubApis.java"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=yqabmKnsSuU:nosZvSl8p70:mIC1leqXSog"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=yqabmKnsSuU:nosZvSl8p70:mIC1leqXSog" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=yqabmKnsSuU:nosZvSl8p70:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=yqabmKnsSuU:nosZvSl8p70:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=yqabmKnsSuU:nosZvSl8p70:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=yqabmKnsSuU:nosZvSl8p70:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=yqabmKnsSuU:nosZvSl8p70:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=yqabmKnsSuU:nosZvSl8p70:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=yqabmKnsSuU:nosZvSl8p70:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=yqabmKnsSuU:nosZvSl8p70:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=yqabmKnsSuU:nosZvSl8p70:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=yqabmKnsSuU:nosZvSl8p70:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=yqabmKnsSuU:nosZvSl8p70:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=yqabmKnsSuU:nosZvSl8p70:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Damnhandy/~4/yqabmKnsSuU" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://damnhandy.com/2012/05/03/fun-with-uri-templates-and-the-facebook-graph-api/</feedburner:origLink></entry><entry><title type="html">A URI Templates Implementation for Java</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Damnhandy/~3/DJHnAZOzNo0/" /><category term="Linked Data" /><category term="REST" /><author><uri>http://damnhandy.com</uri></author><updated>2012-04-22T16:48:56-07:00</updated><id>http://damnhandy.com/?p=450</id><summary type="html">In my copious spare time, I have managed to cobble together an initial implementation of the URI Templates spec (RFC6570),  for Java. The project is up on GitHub here: http://github.com/damnhandy/Handy-URI-Templates The majority of the documentation is available in the README file,...</summary><content type="html" xml:base="http://damnhandy.com/2012/04/22/a-uri-templates-implementation-for-java/">&lt;p&gt;In my copious spare time, I have managed to cobble together an initial implementation of the URI Templates spec (&lt;a href="http://tools.ietf.org/html/rfc6570"&gt;RFC6570&lt;/a&gt;),  for Java. The project is up on &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt; here:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://github.com/damnhandy/Handy-URI-Templates"&gt;http://github.com/damnhandy/Handy-URI-Templates&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The majority of the documentation is available in the &lt;a href="https://github.com/damnhandy/Handy-URI-Templates/blob/master/README.md"&gt;README&lt;/a&gt; file, so have a gander at that for details on how to use it. It&amp;#8217;s in the initial phases right now, but it&amp;#8217;s a good time to kick the tires and provide feedback.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=DJHnAZOzNo0:f5nGe_2k130:mIC1leqXSog"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=DJHnAZOzNo0:f5nGe_2k130:mIC1leqXSog" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=DJHnAZOzNo0:f5nGe_2k130:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=DJHnAZOzNo0:f5nGe_2k130:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=DJHnAZOzNo0:f5nGe_2k130:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=DJHnAZOzNo0:f5nGe_2k130:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=DJHnAZOzNo0:f5nGe_2k130:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=DJHnAZOzNo0:f5nGe_2k130:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=DJHnAZOzNo0:f5nGe_2k130:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=DJHnAZOzNo0:f5nGe_2k130:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=DJHnAZOzNo0:f5nGe_2k130:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=DJHnAZOzNo0:f5nGe_2k130:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=DJHnAZOzNo0:f5nGe_2k130:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=DJHnAZOzNo0:f5nGe_2k130:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Damnhandy/~4/DJHnAZOzNo0" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://damnhandy.com/2012/04/22/a-uri-templates-implementation-for-java/</feedburner:origLink></entry><entry><title type="html">RESTful URIs, Unicorns, and Pixie Dust</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Damnhandy/~3/VrtuypPoTgE/" /><category term="Linked Data" /><category term="REST" /><category term="URL vs. URI" /><author><uri>http://damnhandy.com</uri></author><updated>2011-12-29T07:33:50-08:00</updated><id>http://www.damnhandy.com/?p=421</id><summary type="html">It often pains me to hear people talking about  so-called &amp;#8220;RESTful URLs&amp;#8221;. If you&amp;#8217;re using that term, or your spending the majority of you application planning designing URI structures rather than your media types, then chances are you don&amp;#8217;t really...</summary><content type="html" xml:base="http://damnhandy.com/2011/12/29/restful-uris-unicorns-and-pixie-dust/">&lt;p&gt;It often pains me to hear people talking about  so-called &amp;#8220;RESTful URLs&amp;#8221;. If you&amp;#8217;re using that term, or your spending the majority of you application planning designing URI structures rather than your media types, then chances are you don&amp;#8217;t really get the concepts in REST.&lt;/p&gt;
&lt;p&gt;Frequently, I see developers sit down and start doodling a &amp;#8220;REST API&amp;#8221; by mapping out a bunch of URI templates like so:&lt;/p&gt;
&lt;pre&gt;/users/{userId}

/users/{userId}/stuff

/users/{userId}/stuff/{stuffId}&lt;/pre&gt;
&lt;p&gt;I&amp;#8217;ll admit that I&amp;#8217;ve been guilty of taking this approach myself. For one thing, it&amp;#8217;s easy to communicate on paper. Most folks in business roles are used to seeing site maps where the content layout and URL structure are usually one in the same. By laying URI templates, you&amp;#8217;ve kind of accomplished the same thing. Folks can visualize a high-level structure of your application, but you end up backing yourself into a corner that is difficult to get out of. &lt;a href="http://www.stucharlton.com/" target="_blank"&gt;Stu Charlton&lt;/a&gt; perhaps summed it up best in one of his more &lt;a href="http://www.stucharlton.com/blog/archives/2011/06/the-trouble-with-apis.html" target="_blank"&gt;insightful posts&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;If one is thinking of &amp;#8220;how to methods map to my URI structures&amp;#8221;, we&amp;#8217;ve basically lost the plot as to why we have HTTP, URIs and media types in the first place. The goal is to *eliminate* the API as we normally think of it. (It&amp;#8217;s not about a library of calls over a network).&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The problem is that in approaching application design with the URI structure first is that you&amp;#8217;re doing things bassackwards. Some people do this because they&amp;#8217;ve followed some debatable advice and identified all of the &amp;#8220;nouns&amp;#8221; their application and started to work out a series of URL patterns that map to these nouns. As they create these URLs, they&amp;#8217;ve followed some &lt;a href="http://redrata.com/restful-uri-design" target="_blank"&gt;questionable advice&lt;/a&gt; as to what constitutes a &amp;#8220;RESTful URL.&amp;#8221; Subbu has another &lt;a href="http://www.subbu.org/blog/2008/07/restful-uris" target="_blank"&gt;nice post&lt;/a&gt; dispelling some of those claims, so I won&amp;#8217;t get into it here. The problem with doing all of the URI structure work up front is that you end up create a set of type resource URLs end up becoming fixed. Clients now end up coding to a specific set of URI patterns and/or conventions that are only discoverable from your documentation. The URI says nothing about what the data looks like or how the client should interpret it.&lt;/p&gt;
&lt;p&gt;Imagine for a moment that you&amp;#8217;re a DBA and you&amp;#8217;re designing a set of database tables. Which of the two activities are you likely to spend more time on:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The structure of your primary keys&lt;/li&gt;
&lt;li&gt;The schema of your database tables&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A few of us would opt for something like MySQL&amp;#8217;s auto-increment function and we&amp;#8217;d be spending the majority of our time on describing the schema. In designing a RESTful application, you should be focusing on the design of your media types rather than what your URLs look like. To be more blunt: you must be focusing your efforts on what the hell your data looks like to consumers of your application. In addition to that, you need to think about how you are expressing links to other resources within your application or resources that are external to it.&lt;/p&gt;
&lt;p&gt;This isn&amp;#8217;t to say that URL design should be arbitrary and delegated to your web framework of choice. Of course not, you should still have URI strategy. The point is that the specific URI structures are not what consumers of your API will have to deal with directly. It is bad form to make a client rely on &amp;#8220;out-of-band&amp;#8221; information to construct a URI in your own special little way in order to get into your application. Take this blog post for example. You likely followed a link posted somewhere else. It could have been from an Atom feed, a search result in Google, or a &lt;a href="http://bit.ly"&gt;Bit.ly&lt;/a&gt; link off of &lt;a href="http://twitter.com/damnhandy"&gt;Twitter&lt;/a&gt;. It is highly unlikely that you had to type in the URL yourself and figured out the WordPress permalink structure that I have enabled on this site. If you did do that, well then, you&amp;#8217;re awesome!&lt;/p&gt;
&lt;p&gt;The fact is that clients will enter your application from some entry point or bookmark you&amp;#8217;ve defined (&lt;a href="http://tools.ietf.org/html/rfc5785" target="_blank"&gt;.well-known&lt;/a&gt; is looking promising), or somewhere else on the web. Unless you&amp;#8217;re a major player like Amazon, Facebook, or others, these clients won&amp;#8217;t know that you have documentation that painfully detail your APIs URI structures. These clients will simply follow a link into your application. They didn&amp;#8217;t type it in according to your fancy-schmancy URI template scheme that is only found in your documentation.  The URL is only a means to identify an locate a resource on the web, it does not define how the resource is represented or make suggestions as to what it&amp;#8217;s about (remember that &lt;a href="http://www.w3.org/DesignIssues/Axioms.html#opaque" target="_blank"&gt;URIs are opaque&lt;/a&gt;?). At the end of the day, the client is going to have to be able to understand the media type that is retuned by requests made that URI. If you spend all of your time up front mapping methods to URI structures, you&amp;#8217;ll end up introducing a coupling that you can&amp;#8217;t easily break free from.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=VrtuypPoTgE:d6TE6IGtnAA:mIC1leqXSog"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=VrtuypPoTgE:d6TE6IGtnAA:mIC1leqXSog" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=VrtuypPoTgE:d6TE6IGtnAA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=VrtuypPoTgE:d6TE6IGtnAA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=VrtuypPoTgE:d6TE6IGtnAA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=VrtuypPoTgE:d6TE6IGtnAA:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=VrtuypPoTgE:d6TE6IGtnAA:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=VrtuypPoTgE:d6TE6IGtnAA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=VrtuypPoTgE:d6TE6IGtnAA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=VrtuypPoTgE:d6TE6IGtnAA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=VrtuypPoTgE:d6TE6IGtnAA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=VrtuypPoTgE:d6TE6IGtnAA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=VrtuypPoTgE:d6TE6IGtnAA:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=VrtuypPoTgE:d6TE6IGtnAA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Damnhandy/~4/VrtuypPoTgE" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://damnhandy.com/2011/12/29/restful-uris-unicorns-and-pixie-dust/</feedburner:origLink></entry><entry><title type="html">URL vs. URI: URLs as Queries and URIs as Identities</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Damnhandy/~3/CLWznbujpEM/" /><category term="Linked Data" /><category term="URL vs. URI" /><author><uri>http://damnhandy.com</uri></author><updated>2011-12-28T08:15:06-08:00</updated><id>http://www.damnhandy.com/?p=399</id><summary type="html">Continuing my with my ranting about the URL vs. URI bit, I thought I&amp;#8217;d continue on given my renewed interest in this topic thanks to Ora. In our LEDP position paper, we made the observation that URLs represent queries while...</summary><content type="html" xml:base="http://damnhandy.com/2011/12/28/url-vs-uri-urls-as-queries-and-uris-as-identities/">&lt;p&gt;Continuing my with my ranting about the URL vs. URI bit, I thought I&amp;#8217;d continue on given my renewed interest in this topic thanks to &lt;a href="http://Lassila.org/" target="_blank"&gt;Ora&lt;/a&gt;. In our &lt;a href="http://www.w3.org/2011/09/LinkedData/" target="_blank"&gt;LEDP&lt;/a&gt; position paper, we made the observation that URLs represent queries while URIs are identifiers. If you&amp;#8217;re wondering why you should care about this subtle distinction, please read on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;URLs as Queries&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve stated that URLs are &lt;em&gt;queries&lt;/em&gt;, but what does that really mean? Those of you familiar with blog software such as WordPress, know that the default URL pattern might go something like this:&lt;/p&gt;
&lt;pre&gt;&lt;a href="http://www.damnhandy.com/?p=399"&gt;http://www.damnhandy.com/?p=399&lt;/a&gt;&lt;/pre&gt;
&lt;p&gt;Here, the URL forms a &lt;em&gt;query&lt;/em&gt; for a blog post using its internal identifier. In this case, the URL is asking the WordPress database for a post and related items using the primary key of a row that represents the post. For most, it&amp;#8217;s pretty obvious that the query parameter &amp;#8220;p&amp;#8221; refers to the internal identity of the post.&lt;/p&gt;
&lt;p&gt;As we mention in the paper, there are many other ways to construct URLs to the same post. For example, we can embed the ID into a path segment:&lt;/p&gt;
&lt;pre&gt;http://damnhandy.com/archives/399&lt;/pre&gt;
&lt;p&gt;In all of these cases, the server application is interpreting the URL and using elements of the URL to internally resolve the information the client requested. While I&amp;#8217;ve only singled out WordPress, this pattern is quite common among several web application frameworks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Internal Identity vs. Global Identity&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When folks put information on the web, the content they publish usually has two identities:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;An Internal or local identity. This maybe the name of a file (i.e. &amp;#8220;me.jpg&amp;#8221;) or a the primary key of a row in a database.&lt;/li&gt;
&lt;li&gt;An external identity which is the ID of the information you&amp;#8217;ve published. On the web, this is the &amp;#8220;global identity&amp;#8221; exposed by the URL of the content&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Often, people don&amp;#8217;t tend to think about either much. The global identity of a resource is usually an after thought and is determined by the underlying framework driving the application. With web servers serving up documents, we&amp;#8217;re usually exposing the the local file name of the of the document. With database driven applictaions, we&amp;#8217;re exposing the primary key, or some alternate key, of a row in a database. Quite often when web applictaion changes frameworks, we see the global identity change too and the URL patterns change (i.e. .NET to Java&amp;#8217;s JSP, to Ruby, etc.).&lt;/p&gt;
&lt;p&gt;Using the previous WordPress example, we know that the internal blog post ID is &amp;#8220;399&amp;#8243;, but this internal ID really isn&amp;#8217;t suitable as a globally unique, unambiguous identifier. Another blog using WordPress, running the same exact version of the software, could also have a blog post ID of &amp;#8220;399&amp;#8243;. This does not means that the two sites have the same content, it only means that the two instances happen to have a post with an internal ID of &amp;#8220;399&amp;#8243;. As you might have noticed, the value &amp;#8220;399&amp;#8243; isn&amp;#8217;t a suitable web-scale identifier. We need something else.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Globally Identifiers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.subbu.org/about" target="_blank"&gt;Subbu Allamaraju&lt;/a&gt; had an interesting post a while back about &lt;a href="http://www.subbu.org/blog/2008/12/resource-identity-and-cool-uris" target="_blank"&gt;Resource Identity and Cool URIs&lt;/a&gt;. Subbu asserts that there is a distintion between the identity of a resource and its location and his key point is spot on:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;URIs uniquely identify resources but a URI used to fetch something is not always a good candidate to serve as a unique identifier in client applications.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;And this is where I feel that the core confusion with URLs and URIs: identity vs. location. If we look at his initial example, he desribes the following:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="code"&gt;&lt;pre class="xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;accounts&lt;/span&gt; &lt;span style="color: #000066;"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;urn:org:bank:accounts&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;account&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;id&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;AZA12093&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/id&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;link&lt;/span&gt; &lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;http://bank.org/account/AZA12093&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;rel&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;self&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
      ...
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/account&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;account&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;id&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;ADK31242&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/id&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;link&lt;/span&gt; &lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;http://bank.org/account/ADK31242&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;rel&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;self&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
      ...
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/account&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/accounts&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In his example, the internal identity of each account is being expressed through a path segment in the href attribute of the link element. This approach is functional and is similar to that of the previous WordPress example.&lt;/p&gt;
&lt;p&gt;The problem with this approach is that the ID values are only unique within the domain &amp;#8220;bank.org&amp;#8221;. There&amp;#8217;s no reliable way to assert that two sites are referring to the same account if we have to rely on the value of a path segment or query parameter. As stated earlier, if we take WordPress as an exmaple again, blog post &amp;#8220;399&amp;#8243; might talk about the Kardashians, or something else. There&amp;#8217;s no gurantee that the two URLs refer to the same information if they share the same internal identity. Most likely, they don&amp;#8217;t.&lt;/p&gt;
&lt;p&gt;We could make the link and the ID one in the same:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="code"&gt;&lt;pre class="xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;accounts&lt;/span&gt; &lt;span style="color: #000066;"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;urn:org:bank:accounts&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;account&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;id&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;http://bank.org/account/AZA12093&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/id&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;link&lt;/span&gt; &lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;http://bank.org/account/AZA12093&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;rel&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;self&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
      ...
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/account&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;account&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;id&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;http://bank.org/account/ADK31242&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/id&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;link&lt;/span&gt; &lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;http://bank.org/account/ADK31242&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;rel&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;self&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
      ...
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/account&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/accounts&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You might wonder what the hell is going on here since it looks pretty much the same as the first example. The difference is that we&amp;#8217;re saying that the ID and the link are identical. That is, the identity of the account is the URI. That URI also happens to be a URL that can be dereferenced. This works, and it&amp;#8217;s considered &lt;a href="http://www4.wiwiss.fu-berlin.de/bizer/pub/LinkedDataTutorial/#principles"&gt;basic principle of Linked Data&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;However, there are some problems with this approach too. As Subbu rightly points out, URIs are not always &lt;a href="http://www.w3.org/Provider/Style/URI"&gt;cool URIs&lt;/a&gt;. We are all aware that URIs do change at some point. If Bank.org is acquired by BiggerBank.com, what happens to the ID since we tied the ID to a host name that is likely to be retired soon?&lt;/p&gt;
&lt;p&gt;One solution is to follow good web practices and maintain the bank.org domain and either redirect requests to the older URLs to the new ones. Adobe does this with links to &lt;a href="http://www.futurewave.com" target="_blank"&gt;FurtureSplash&lt;/a&gt; and &lt;a href="http://www.macromedia.com/flash" target="_blank"&gt;Macromedia Flash&lt;/a&gt; locations. These URLs all resolve to the &lt;a href="http://www.adobe.com/products/flash.html" target="_blank"&gt;Adobe Flash&lt;/a&gt; product pages.&lt;/p&gt;
&lt;p&gt;This strategy allows us to keep the original identity but the link is changed to accommodate the new domain. We can expand on this strategy and change the value of the link:&lt;/p&gt;

&lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="code"&gt;&lt;pre class="xml" style="font-family:monospace;"&gt;&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;accounts&lt;/span&gt; &lt;span style="color: #000066;"&gt;xmlns&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;urn:org:bank:accounts&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;account&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;id&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;http://bank.org/account/AZA12093&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/id&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;link&lt;/span&gt; &lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;http://biggerbank.com/accounts/?id=http%3A//bank.org/account/AZA12093&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;rel&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;self&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
      ...
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/account&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;account&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;id&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;http://bank.org/account/ADK312423&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/id&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;link&lt;/span&gt; &lt;span style="color: #000066;"&gt;href&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;http://biggerbank.com/accounts/?id=http%3A/bank.org/account/ADK31242&amp;quot;&lt;/span&gt; &lt;span style="color: #000066;"&gt;rel&lt;/span&gt;=&lt;span style="color: #ff0000;"&gt;&amp;quot;self&amp;quot;&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
      ...
  &lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/account&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="color: #009900;"&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;lt;/accounts&lt;span style="color: #000000; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Yes, it looks ugly and weird, but it&amp;#8217;s valid and it works. If you look closely, it&amp;#8217;s not much different from the initial WordPress URL. The only difference is that we&amp;#8217;ve replaced a numeric identifier for a URI. It&amp;#8217;s a URI that references another URI, but it is valid. For some reason, people just don&amp;#8217;t like URLs that look like this.&lt;a href="http://dbpedia.org" target="_blank"&gt;DBPedia&lt;/a&gt; does this since they&amp;#8217;re describing data on Wikipedia:&lt;/p&gt;
&lt;pre&gt;&lt;a href="http://dbpedia.org/snorql/?describe=http%3A//en.wikipedia.org/wiki/BMW_7_Series_%2528E23%2529"&gt;http://dbpedia.org/snorql/?describe=http%3A//en.wikipedia.org/wiki/BMW_7_Series_%2528E23%2529&lt;/a&gt;&lt;/pre&gt;
&lt;p&gt;The big difference with this approach is that it&amp;#8217;s clear that the identifier is globally unique. There&amp;#8217;s significantly less ambigutity about the ID: &lt;code&gt;http://en.wikipedia.org/wiki/BMW_7_Series_(E23)&lt;/code&gt; than the ID: &lt;code&gt;BMW_7_Series_(E23)&lt;/code&gt;. Because no one else can mint valid URLs within the Wikipedia domain, you can have greater confidence that multiple applications are referring to the same thing. URIs as identifiers are globally unique.&lt;/p&gt;
&lt;p&gt;The global identity of information resources shouldn&amp;#8217;t change as frequently as it does. It drives my wife &lt;a href="http://www.urbandictionary.com/define.php?term=apeshit" target="_blank"&gt;apeshit&lt;/a&gt; that all of her recipe bookmarks change everytime &lt;a href="http://marthastwart.com" target="_blank"&gt;MarthaStewart.com&lt;/a&gt; updates their site. Part of the problem I believe is that most folks doing &lt;a href="http://en.wikipedia.org/wiki/Information_architecture" target="_blank"&gt;Information Architecture&lt;/a&gt; don&amp;#8217;t take identity into consideration and that a fair number of web frameworks do very little to assist in quality URI/URL design. But this post is long enough, so I&amp;#8217;ll save that for another post.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=CLWznbujpEM:G5WktuzWcKg:mIC1leqXSog"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=CLWznbujpEM:G5WktuzWcKg:mIC1leqXSog" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=CLWznbujpEM:G5WktuzWcKg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=CLWznbujpEM:G5WktuzWcKg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=CLWznbujpEM:G5WktuzWcKg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=CLWznbujpEM:G5WktuzWcKg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=CLWznbujpEM:G5WktuzWcKg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=CLWznbujpEM:G5WktuzWcKg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=CLWznbujpEM:G5WktuzWcKg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=CLWznbujpEM:G5WktuzWcKg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=CLWznbujpEM:G5WktuzWcKg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=CLWznbujpEM:G5WktuzWcKg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=CLWznbujpEM:G5WktuzWcKg:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=CLWznbujpEM:G5WktuzWcKg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Damnhandy/~4/CLWznbujpEM" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://damnhandy.com/2011/12/28/url-vs-uri-urls-as-queries-and-uris-as-identities/</feedburner:origLink></entry><entry><title type="html">W3C Linked Enterprise Data Workshop and more about URLs vs. URIs</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Damnhandy/~3/nUcuHUhEdTk/" /><category term="Linked Data" /><author><uri>http://damnhandy.com</uri></author><updated>2011-12-15T08:21:44-08:00</updated><id>http://www.damnhandy.com/?p=382</id><summary type="html">Last week, I had the pleasure of attending the W3C workshop on Linked Enterprise Data Patterns. My colleague Ora Lassila and I gave a presentation on the isues of identity in Linked Data. You can read our position paper and...</summary><content type="html" xml:base="http://damnhandy.com/2011/12/15/w3c-linked-enterprise-data-workshop-and-more-about-urls-vs-uris/">&lt;p&gt;Last week, I had the pleasure of attending the &lt;a href="http://www.w3.org/2011/09/LinkedData/"&gt;W3C workshop on Linked Enterprise Data Patterns&lt;/a&gt;. My colleague &lt;a href="http://Lassila.org/"&gt;Ora Lassila&lt;/a&gt; and I gave a presentation on the isues of identity in Linked Data. You can read our &lt;a href="http://www.w3.org/2011/09/LinkedData/ledp2011_submission_13.pdf"&gt;position paper&lt;/a&gt; and view our presentaion here:&lt;/p&gt;
&lt;div id="__ss_10520416" style="width: 425px;"&gt;
&lt;p&gt;&lt;strong style="display: block; margin: 12px 0 4px;"&gt;&lt;a title="Identity Crisis in Linked Data" href="http://www.slideshare.net/damnhandy/lod-identitycrisis" target="_blank"&gt;Identity Crisis in Linked Data&lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/10520416" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" width="425" height="355"&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;div style="padding: 5px 0 12px;"&gt;&lt;em&gt;View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/damnhandy" target="_blank"&gt;Ryan McDonough&lt;/a&gt;&lt;/em&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It would seem that many share the same frustrations that Ora and I have with the confusion between URLs and URIs, and the idea that URLs are &lt;em&gt;queries&lt;/em&gt; and URIs are &lt;em&gt;identifiers&lt;/em&gt;. Readers of this blog will note that over the past few years I have been trying to clarify the difference between a URL and a URI. I think it&amp;#8217;s safe to say that even after multiple, detailed posts on the topic, the distinction between the two remains murky for some. Hopefully we can start to clear things up.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=nUcuHUhEdTk:ab0XB45ZrP4:mIC1leqXSog"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=nUcuHUhEdTk:ab0XB45ZrP4:mIC1leqXSog" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=nUcuHUhEdTk:ab0XB45ZrP4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=nUcuHUhEdTk:ab0XB45ZrP4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=nUcuHUhEdTk:ab0XB45ZrP4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=nUcuHUhEdTk:ab0XB45ZrP4:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=nUcuHUhEdTk:ab0XB45ZrP4:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=nUcuHUhEdTk:ab0XB45ZrP4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=nUcuHUhEdTk:ab0XB45ZrP4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=nUcuHUhEdTk:ab0XB45ZrP4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=nUcuHUhEdTk:ab0XB45ZrP4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=nUcuHUhEdTk:ab0XB45ZrP4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=nUcuHUhEdTk:ab0XB45ZrP4:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=nUcuHUhEdTk:ab0XB45ZrP4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Damnhandy/~4/nUcuHUhEdTk" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://damnhandy.com/2011/12/15/w3c-linked-enterprise-data-workshop-and-more-about-urls-vs-uris/</feedburner:origLink></entry><entry><title type="html">Amazon Makes the Kindle Fire an Easy Target for a Thief</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Damnhandy/~3/R95s2j6pb3M/" /><category term="Technology" /><author><uri>http://damnhandy.com</uri></author><updated>2011-11-26T07:55:00-08:00</updated><id>http://www.damnhandy.com/?p=370</id><summary type="html">Having recieved a Kindle Fire this year, I was really surprised at the unpacking process and minimal security. While the device is very nice, the whole unpacking process made me realize that the Kindle Fire is a package thief&amp;#8217;s dream....</summary><content type="html" xml:base="http://damnhandy.com/2011/11/26/amazon-makes-the-kindle-fire-and-easy-target-for-a-thief/">&lt;p&gt;Having recieved a &lt;a href="http://www.amazon.com/Kindle-Fire-Amazon-Tablet/dp/B0051VVOB2/ref=amb_link_358993342_2?pf_rd_m=ATVPDKIKX0DER&amp;amp;pf_rd_s=center-1&amp;amp;pf_rd_r=1RXZQY8CCH5N9WVCS9TE&amp;amp;pf_rd_t=101&amp;amp;pf_rd_p=1334635022&amp;amp;pf_rd_i=507846"&gt;Kindle Fire&lt;/a&gt; this year, I was really surprised at the unpacking process and minimal security. While the device is very nice, the whole unpacking process made me realize that the Kindle Fire is a package thief&amp;#8217;s dream. Here&amp;#8217;s a few reason why:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Packaging&lt;/strong&gt;&lt;br /&gt;
One thing that makes stealing a Kinlde Fire easy is the packaging, Amazon makes it quite clear what is in the box. When it arrives to your door, or your bulding&amp;#8217;s mail room, the package is clearly marked with the words &amp;#8220;Kindle Fire&amp;#8221; all over it. In my case, the package sat in our building lobby clearly advertising what&amp;#8217;s inside:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.damnhandy.com/wp-content/uploads/2011/11/kindle-fire-package.jpg"&gt;&lt;img class="aligncenter size-medium wp-image-372" title="kindle-fire-package" src="http://www.damnhandy.com/wp-content/uploads/2011/11/kindle-fire-package-300x168.jpg" alt="" width="300" height="168" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This makes it really easy to identify which package has the 7-inch tablet inside.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Automatic Sign-In&lt;/strong&gt;&lt;br /&gt;
When I first opened the package and turned on the Kindle for the 1st time, it skipped past the sign-in screen since my wife&amp;#8217;s credentials where already entered and she was automatically logged into Amazon. At first, this seemed like a nice touch for folks like my grandmother who don&amp;#8217;t quite get sign-in procedures. However, this approach has far more cons than advantages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1-Click Enabled by Default&lt;/strong&gt;&lt;br /&gt;
The real kicker is that &lt;a href="http://en.wikipedia.org/wiki/1-Click"&gt;1-Click&lt;/a&gt; is enabled by default. When you purchase content, you are never prompted for a password. This gives potential gift takers an added bonus: the ability to purchase Amazon content on your dime. And if you have kids, they can snag games as often as they want.&lt;/p&gt;
&lt;p&gt;So if you&amp;#8217;re considering getting an Amazon Kindle for someone this year, make sure you check the box that says &amp;#8220;this is a gift&amp;#8221; as this will make sure the device doesn&amp;#8217;t sign you in automatically when you get it. Even if you&amp;#8217;re going to get it for yourself, this is probably a good thing to do. Second, if you live in an apartment building or condo, you might want to consider shipping the box to your work or someplace where the box isn&amp;#8217;t in plain sight.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=R95s2j6pb3M:jZThrve0UHw:mIC1leqXSog"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=R95s2j6pb3M:jZThrve0UHw:mIC1leqXSog" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=R95s2j6pb3M:jZThrve0UHw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=R95s2j6pb3M:jZThrve0UHw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=R95s2j6pb3M:jZThrve0UHw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=R95s2j6pb3M:jZThrve0UHw:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=R95s2j6pb3M:jZThrve0UHw:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=R95s2j6pb3M:jZThrve0UHw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=R95s2j6pb3M:jZThrve0UHw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=R95s2j6pb3M:jZThrve0UHw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=R95s2j6pb3M:jZThrve0UHw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?i=R95s2j6pb3M:jZThrve0UHw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=R95s2j6pb3M:jZThrve0UHw:l6gmwiTKsz0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=l6gmwiTKsz0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Damnhandy?a=R95s2j6pb3M:jZThrve0UHw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Damnhandy?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Damnhandy/~4/R95s2j6pb3M" height="1" width="1"/&gt;</content><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://damnhandy.com/2011/11/26/amazon-makes-the-kindle-fire-and-easy-target-for-a-thief/</feedburner:origLink></entry></feed>
