<?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:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;AkcDRXg7eCp7ImA9WhRUFUU.&quot;"><id>tag:blogger.com,1999:blog-25299220</id><updated>2012-01-26T15:27:54.600+01:00</updated><category term="hibernate" /><category term="tech" /><category term="deutsch" /><category term="augmented reality" /><category term="print 2.0" /><category term="observations" /><category term="english" /><category term="politics" /><category term="tutorial" /><category term="gis" /><category term="email" /><category term="events" /><category term="projects" /><category term="code" /><category term="procrastination" /><category term="ontology" /><category term="gmaps" /><category term="architecture" /><category term="http" /><category term="barcampberlin2" /><category term="flex" /><category term="infovis" /><category term="life" /><title>Flo Ledermann</title><subtitle type="html">&lt;a href="http://floledermann.blogspot.com/search/label/tech"&gt; code
&lt;/a&gt; - &lt;a href="http://floledermann.blogspot.com/search/label/ontology"&gt;
ontology
&lt;/a&gt; - &lt;a href="http://floledermann.blogspot.com/search/label/politics"&gt;
politics
&lt;/a&gt;
&lt;br&gt; &lt;a href="http://floledermann.blogspot.com/search/label/english"&gt;
english&lt;/a&gt; - &lt;a href="http://floledermann.blogspot.com/search/label/deutsch"&gt;
deutsch
&lt;/a&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/floledermann" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="floledermann" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">floledermann</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;C0YFRXw-fyp7ImA9WhZUE0g.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-4034540103127027907</id><published>2011-06-06T10:12:00.003+02:00</published><updated>2011-06-06T11:05:14.257+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-06T11:05:14.257+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="deutsch" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>This blog will move!</title><content type="html">[English]&lt;br /&gt;&lt;br /&gt;I am in the process of refurbishing &lt;a href="http://www.floledermann.com/"&gt;my website&lt;/a&gt;, which will allow me to host my blog as part of my own site from now on. This means that this Blogspot blog will be retired, and you will be able to find my blog from now on &lt;a href="http://www.floledermann.com/blog/"&gt;at its new, and permanent address&lt;/a&gt;. I am planning on posting more frequently again, so please check it out—I even made the effort to move all the old posts that still seemed relevant to me over there, so you won't miss anything. Please make sure to update the &lt;a href="http://www.floledermann.com/feeds/latest/blog/"&gt;feed URL&lt;/a&gt; in your RSS reader!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.floledermann.com/blog/"&gt;Go to Flo's new blog now&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[Deutsch]&lt;br /&gt;&lt;br /&gt;Im Zuge der Erneuerung  &lt;a href="http://www.floledermann.com/"&gt;meiner Website&lt;/a&gt; übersiedelt mein Blog an &lt;a href="http://www.floledermann.com/blog/"&gt;seine neue, selbstgehostete und permanente Adresse&lt;/a&gt;. Der Blogspot-Blog wird damit nach einer langen Phase der Inaktivität eingestellt, ich habe aber vor an der neuen Adresse wieder öfter zu posten. Also, bitte denkt daran auch die &lt;a href="http://www.floledermann.com/feeds/latest/blog/"&gt;Feed Adresse&lt;/a&gt; in eurem RSS Reader umzustellen!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.floledermann.com/blog/"&gt;Zu Flo's neuem Blog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-4034540103127027907?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/4034540103127027907?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/4034540103127027907?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2011/06/this-blog-will-move.html" title="This blog will move!" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author></entry><entry gd:etag="W/&quot;Ck4HQHk7fSp7ImA9WxBSEUg.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-7510441238924620287</id><published>2009-12-18T15:05:00.007+01:00</published><updated>2009-12-18T16:42:11.705+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-18T16:42:11.705+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gis" /><category scheme="http://www.blogger.com/atom/ns#" term="observations" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>The Beauty Of The Earth's Surface</title><content type="html">NASA's &lt;a href="http://www2.jpl.nasa.gov/srtm/"&gt;Shuttle Radar Topography Mission&lt;/a&gt; measured the earth's surface elevation in february 2000 using radar &lt;a href="http://en.wikipedia.org/wiki/Inferometry"&gt;interferometry&lt;/a&gt;. The resulting data is available to the public and can be used for various purposes. I have been playing with the data over the last days and experimented with different methods for visualizing terrains in 2d and 3d, primarily in the context of &lt;a href="http://www.openstreetmap.org/"&gt;Openstreetmap&lt;/a&gt; rendering. However, nothing has impressed me more than the very first plain grayscale image I produced (showing the area around and to the north of Vienna):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tnkA4sLKUhc/SyufVwRSBAI/AAAAAAAAADA/sfJmhBL4NJs/s1600-h/earth_relief.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer; width: 334px; height: 400px;" src="http://3.bp.blogspot.com/_tnkA4sLKUhc/SyufVwRSBAI/AAAAAAAAADA/sfJmhBL4NJs/s400/earth_relief.jpg" alt="" id="BLOGGER_PHOTO_ID_5416598172926608386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(click for a slightly larger version)&lt;br /&gt;&lt;br /&gt;I have never seen so clearly the details and variation of the earth's relief. On most maps, data like this is rendered in the background to give the viewer a sense of depth, but map graphics and surface textures are usually layered on top and take away a lot of the clarity that is so stunning here. One has to consider that the image shows an area that is usually considered to be rather "flat" - but look at how one can see the thousands and thousands of years of wind and rain working on the "Weinviertel" area to the north. Or look at the sharp edge of the "Wienerwald" area, suddenly dropping down to the really flat plains of the "Tullner Becken" and "Wiener Becken".&lt;br /&gt;&lt;br /&gt;I considered adding some labels and paths as means of orientation, but then I liked the idea to leave it like it is as a puzzle for you to figure out the locations of places you know in the image.&lt;br /&gt;&lt;br /&gt;Addendum: In the light of the current issue of "protecting the planet", pictures like these make me quite confident that the planet will do fine - even long after we humans managed to remove ourselves from it after a short, rather irrelevant episode of civilization...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-7510441238924620287?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/7510441238924620287/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=25299220&amp;postID=7510441238924620287" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/7510441238924620287?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/7510441238924620287?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2009/12/beauty-of-earths-surface.html" title="The Beauty Of The Earth's Surface" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_tnkA4sLKUhc/SyufVwRSBAI/AAAAAAAAADA/sfJmhBL4NJs/s72-c/earth_relief.jpg" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CUANRXY_fSp7ImA9WxNVFk8.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-6194791721718931065</id><published>2009-10-26T19:17:00.006+01:00</published><updated>2009-10-27T07:09:54.845+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-27T07:09:54.845+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="flex" /><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="augmented reality" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="print 2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>Augmented Reality in “Print 2.0”</title><content type="html">It's nice to see a project I have been involved with going live: The October issue of Red Bull's “Red Bulletin” magazine features augmented reality content that supplements the printed articles. But see for yourself:&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="295"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ixnPoUAW2_Y&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/ixnPoUAW2_Y&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="295"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Two groundbreaking new features made this move of augmented reality into mainstream media possible. Markerless tracking technology, developed by my former colleagues at &lt;a href="http://studierstube.icg.tu-graz.ac.at/handheld_ar/stbtracker.php"&gt;TU Graz&lt;/a&gt;, allows the system to identify and locate pages in the camera image without requiring special layout or patterns on the page. And even more important, implementing the base technologies in Flash (done by &lt;a href="http://imagination.at/"&gt;Imagination&lt;/a&gt; in Vienna) allows end users to explore the content within their browser, requiring only a webcam connected to or built into their computer. If you want to try for yourself, grab a copy of the magazine and go to &lt;a href="http://en.redbulletin.com/print2.0"&gt;http://en.redbulletin.com/print2.0&lt;/a&gt; (or to &lt;a href="http://de.redbulletin.com/print2.0"&gt;de.&lt;/a&gt; for the german version) to see it in action.&lt;br /&gt;&lt;br /&gt;I was involved early in the project as a consultant, implementing a prototype to experiment with various content formats and bringing together the right people to realize the project. It was clear that Red Bull as a customer would require a seamless and direct user experience to suit their brand, and fortunately some of my former colleagues at Vienna University of Technology are now among the top players in the worldwide augmented reality research community and were able to deliver the necessary technology. I am quite happy how this worked out, as it was an important step for me to move away from doing a lot of implementation work by myself to a more conceptual level, bringing together people and using my experience to move the project in the right direction early on.&lt;br /&gt;&lt;br /&gt;Although I am happy to see the results, I also see augmented reality, even in this very simple yet compelling form, still suffering from the same problems and obstacles like when I first experimented with it several years ago: Lighting (the real, not the virtual) is incredibly important and difficult to get right, because reflections on the page can make tracking impossible (especially in glossy magazines like Red Bulletin). In low lighting, the noise from the camera makes tracking impossible. Furthermore, the performance of the Flash implementation is a little below my expectations, requiring the application to use a camera resolution of 320x240 (!), further diminishing tracking and image quality. I believe there is a lot of potential for improvement here by optimizing either the implementation or Flash itself. (Hey Adobe, please note this down and check what you can do to optimize. And while you're at it, please &lt;a href="http://blogs.adobe.com/aharui/2008/01/threads_in_actionscript_3.html"&gt;add multi-threading capabilities to Actionscript&lt;/a&gt; if you want to see killer applications like this with decent performance - in a future of heavily parallelized systems this will be inevitable anyway.)&lt;br /&gt;&lt;br /&gt;Talking about the application itself, this is obviously nothing new. Basically, there is still no more compelling augmented reality application in sight than simply placing virtual stuff on real objects - Flash's built in capability to display streamed videos just adds a very nice content type to it. Worldwide, hundreds of researchers are still looking for the “killer app” that will only be possible with augmented reality (I tried for myself for some years). Until a genius comes up with a truly revolutionary idea, we will have to stick with permutations of &lt;a href="http://www.youtube.com/watch?v=xwKErm3xiGU"&gt;ARToolkit's cube demo&lt;/a&gt; as &lt;span style="font-style: italic;"&gt;the&lt;/span&gt; mainstream application - and work on providing stable tracking, good performance (possibly &lt;a href="http://studierstube.icg.tu-graz.ac.at/handheld_ar/"&gt;on mobile devices&lt;/a&gt;) and a seamless user experience as icing on the cake. If done right, this can be great added value for dead-tree publications.&lt;br /&gt;&lt;br /&gt;Here is Red Bull's promotion video for the project:&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="270"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.redbull.com/cs/RedBull/flash/RBPlayer.swf?data_url=http://www.redbull.com/cs/Satellite?c%3DRB_Video%26cid%3D1242783512547%26locale%3D1237398958898%26p%3D1242745957959%26pagename%3DRedBull%2FRB_Video%2FVideoPlayerDataXML" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="480" height="270"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-6194791721718931065?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/6194791721718931065/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=25299220&amp;postID=6194791721718931065" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/6194791721718931065?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/6194791721718931065?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2009/10/augmented-reality-in-20.html" title="Augmented Reality in &amp;ldquo;Print 2.0&amp;rdquo;" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUcCQnc5eip7ImA9WxJXEUw.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-7864388864628974053</id><published>2009-06-04T10:06:00.007+02:00</published><updated>2009-06-04T12:57:43.922+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-04T12:57:43.922+02:00</app:edited><title>Playing with Arduino</title><content type="html">&lt;span style="font-style: italic;"&gt;Finally&lt;/span&gt; I found some time to do a little hardware hacking on the &lt;a href="http://www.arduino.cc/"&gt;Arduino&lt;/a&gt; platform. As a quick first project and a first step towards much larger things we are planning at &lt;a href="http://maschinenringraum.blogspot.com/"&gt;Maschinenring&lt;/a&gt; I came up with something that a) makes sense and b) can be done with a minimum of money (€10 if you already have an Arduino) and a main focus on programming: A two-joint articulated plotting robot.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tnkA4sLKUhc/SieBaJpqmwI/AAAAAAAAACY/q2jywGIonaU/s1600-h/pappkamerad4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_tnkA4sLKUhc/SieBaJpqmwI/AAAAAAAAACY/q2jywGIonaU/s400/pappkamerad4.jpg" alt="" id="BLOGGER_PHOTO_ID_5343381769165642498" border="0" /&gt;&lt;/a&gt;Unfortunately, this picture is a fake :)) but I could not resist using this &lt;a href="http://en.wikipedia.org/wiki/Drawing_Hands"&gt;Escher quote&lt;/a&gt; (actually i guess the hand should carry a screwdriver to make it symmetrical but I didn't want to spend too much time in Photoshop for now). The real plotting results are much more disappointing because of mechanical errors which are not really controllable in software (and no, it's &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; the fault of the cardboard used for building the robot arms) and accumulate to an error of approximately +/- 0.5cm in the output.&lt;br /&gt;&lt;br /&gt;Nevertheless, it was a fun project and great for getting back into some hardware-oriented programming and thinking about things like optimizing calculations for integer math. More details (including a video of the robot in action and the Arduino source code) can be found at the &lt;a href="http://maschinenringraum.blogspot.com/2009/06/articulated-plotting-robot-for-10.html"&gt;Maschinenraum blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Heres a picture of the actual output: this should be an orthogonal spiral with a winding width of 1cm. (Sorry for the crappy quality, I only have a webcam for taking pictures right now.)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tnkA4sLKUhc/SieFheT19ZI/AAAAAAAAACg/ZBkv3cfMa6k/s1600-h/pappkamerad3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_tnkA4sLKUhc/SieFheT19ZI/AAAAAAAAACg/ZBkv3cfMa6k/s400/pappkamerad3.jpg" alt="" id="BLOGGER_PHOTO_ID_5343386293016851858" border="0" /&gt;&lt;/a&gt;Because of the low precision I didn't bother to program a way to upload more complex graphics to the robot yet, so output geometry is limited to things one can easily implement procedurally. Send me code if you want something drawn, and I send you an arm-signed drawing from the artist ;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-7864388864628974053?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/7864388864628974053/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=25299220&amp;postID=7864388864628974053" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/7864388864628974053?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/7864388864628974053?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2009/06/playing-with-arduino.html" title="Playing with Arduino" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_tnkA4sLKUhc/SieBaJpqmwI/AAAAAAAAACY/q2jywGIonaU/s72-c/pappkamerad4.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0QNQHo6fSp7ImA9WxdUE0s.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-8857535692877540476</id><published>2008-07-29T22:50:00.003+02:00</published><updated>2008-07-29T23:03:11.415+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-29T23:03:11.415+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="email" /><category scheme="http://www.blogger.com/atom/ns#" term="life" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>Empty Inbox!</title><content type="html">Usually I sort incoming mails into folders immediately, besides the ones that require some kind of action or a reply, which I leave in my inbox (I sometimes even pull automatically sorted emails back into the inbox if I want to remind myself to act upon them). This means there are always some messages in my inbox, usually between 10 and 30, depending on my workload and other factors. Some of these emails can get very old in there, years in some cases where I just don't find the right mindset for a reply.&lt;br /&gt;&lt;br /&gt;I am leaving for holiday tomorrow and wanted to answer some of these long waiting emails before that. The basis was laid already a few months ago when I decided to declare as abandoned some private email threads that have been waiting for multiple years, but now the impossible has happened:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tnkA4sLKUhc/SI-Crf_WOII/AAAAAAAAABQ/ejA-F2SSQa8/s1600-h/emptyinbox.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_tnkA4sLKUhc/SI-Crf_WOII/AAAAAAAAABQ/ejA-F2SSQa8/s400/emptyinbox.jpg" alt="" id="BLOGGER_PHOTO_ID_5228541376233617538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Empty Inbox! I can't remember if this has ever happened before since I started using email in ... 1995 I guess.&lt;br /&gt;&lt;br /&gt;How do you handle your inbox?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-8857535692877540476?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/8857535692877540476/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=25299220&amp;postID=8857535692877540476" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/8857535692877540476?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/8857535692877540476?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2008/07/empty-inbox.html" title="Empty Inbox!" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_tnkA4sLKUhc/SI-Crf_WOII/AAAAAAAAABQ/ejA-F2SSQa8/s72-c/emptyinbox.jpg" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CU4HSXs_cCp7ImA9WxdQEko.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-8882904214819412191</id><published>2008-06-12T14:09:00.003+02:00</published><updated>2008-06-12T14:32:18.548+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-12T14:32:18.548+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="deutsch" /><category scheme="http://www.blogger.com/atom/ns#" term="observations" /><category scheme="http://www.blogger.com/atom/ns#" term="politics" /><title>Jetzt geht's los!</title><content type="html">&lt;span style="font-size:78%;"&gt;[This is a German post – if you want to receive only English posts, you may subscribe to the &lt;a href="http://feeds.feedburner.com/floledermann-en"&gt;english feed&lt;/a&gt;]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Proletarier bekriegen sich gegenseitig und fordern, den Ölmultis Steuergeld in die Tasche zu schaufeln:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.heise.de/tp/r4/artikel/28/28112/1.html"&gt;Telepolis: Massive Streiks in Spanien und Portugal&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Manchmal wünsche ich mir schon, dass ein BWL-Gundkurs zur Allgemeinbildung gehört: Wenn der Produzent entdeckt, dass die &lt;a href="http://de.wikipedia.org/wiki/Preiselastizit%C3%A4t"&gt;Preiselastizität&lt;/a&gt; für ein Produkt gegen Null geht, wird er den Preis endlos steigern und sich dabei eins lachen. &lt;span style="font-style: italic;"&gt;Einziger&lt;/span&gt; Ausweg: weniger zu verbrauchen!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-8882904214819412191?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/8882904214819412191/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=25299220&amp;postID=8882904214819412191" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/8882904214819412191?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/8882904214819412191?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2008/06/jetzt-gehts-los.html" title="Jetzt geht's los!" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;AkAFRnw4eyp7ImA9WxZbGEg.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-8990869566403876735</id><published>2008-04-22T11:19:00.002+02:00</published><updated>2008-04-22T12:05:17.233+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-22T12:05:17.233+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="flex" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="life" /><category scheme="http://www.blogger.com/atom/ns#" term="architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><category scheme="http://www.blogger.com/atom/ns#" term="infovis" /><title>syn:wall at ITNOA exhibition</title><content type="html">I just finished my first &lt;a href="http://www.adobe.com/products/flex/"&gt;Flex&lt;/a&gt; project, an interactive projection wall for the exhibition &lt;a href="http://www.itnoa.org/"&gt;ITNOA - In The Name Of Architecture&lt;/a&gt;. The exhibition brings together projects of students of the three universities in Vienna teaching architecture (&lt;a href="http://arch.tuwien.ac.at/fakultaet/aktuelles"&gt;TU Wien&lt;/a&gt;, &lt;a href="http://ika.akbild.ac.at/mt/portal/"&gt;Akademie der Bildenden Künste&lt;/a&gt;, &lt;a href="http://www.dieangewandte.at/architecture/"&gt;Die Angewandte&lt;/a&gt;) in a self-curated setting. While the projects coming from different universities are presented in different areas of the printed-out part of the exhibition, syn:wall brings all projects together on one surface and creates neighborhood relationships between similar projects using quantitative attributes and tags.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tnkA4sLKUhc/SA2ue5eBpaI/AAAAAAAAAA0/NOEFUCYlSws/s1600-h/synwall.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_tnkA4sLKUhc/SA2ue5eBpaI/AAAAAAAAAA0/NOEFUCYlSws/s400/synwall.jpg" alt="" id="BLOGGER_PHOTO_ID_5191997791274116514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The result of such an exploration can be printed out on a color laser printer and taken home by the visitor as an individual page of a distributed, virtual exhibition catalog.&lt;br /&gt;&lt;br /&gt;One thing I learned (again) in this project is how inferior projectors are as an output medium. In a single grid cell of the exhibition, measuring 120 x 45 cm, a whole architecture project can be communicated in printed form, including texts, diagrams, plans and renderings. In the same area of the projected image there are 240 * 100 pixels, which can hold a lousy, pixelated thumbnail of the same project. Therefore I really like the idea of on-demand printing, and I would like to investigate this further in future projects, including producing larger prints with a plotter (something we originally planned to do but could not realize within the given budget and time).&lt;br /&gt;&lt;br /&gt;ITNOA will be on until the end of the week, with a closing down party on Friday, the 25th of April (unfortunately I cannot be there on Friday because of two other appointments). It is located in the "Albertinapassage", the underpass under the Ring on the Albertina side of the Opera. ITNOA is also probably the last chance to have a drink at the infamous "Gaudí Bar" there, since the underpass will be closed down shortly after the exhibition. This place somehow always inspires me to get totally wasted every time I am there...&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://sedzweinull.blogspot.com/"&gt;Rüdiger Suppin&lt;/a&gt; for working on the concept with me and to all ITNOA people who helped entering the project information and crop all the images.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-8990869566403876735?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/8990869566403876735/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=25299220&amp;postID=8990869566403876735" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/8990869566403876735?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/8990869566403876735?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2008/04/synwall-at-itnoa-exhibition.html" title="syn:wall at ITNOA exhibition" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_tnkA4sLKUhc/SA2ue5eBpaI/AAAAAAAAAA0/NOEFUCYlSws/s72-c/synwall.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkEFSHo4fip7ImA9WxZWFEk.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-897160041088046448</id><published>2008-03-13T21:28:00.003+01:00</published><updated>2008-03-13T22:43:39.436+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-13T22:43:39.436+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="life" /><category scheme="http://www.blogger.com/atom/ns#" term="observations" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>A weekend with the iPod touch</title><content type="html">Last week I got myself an iPod touch, because I had to spend money from a grant on hardware quickly and there is currently nothing else that I need. I got it primarily for testing web apps on its mobile Safari browser and to optimize them for its screen dimensions and touch interface. The iPod touch shares the same interface, operating system and applications with the iPhone (which becomes available in Austria &lt;a href="http://derstandard.at/?url=/?id=3263783"&gt;tomorrow&lt;/a&gt;), but lacks three of its features: cellphone capabilities, camera and Bluetooth - I actually own a cellphone which does all this, so I am quite happy feature-wise, but naturally cannot comment on these aspects of the iPhone.&lt;br /&gt;&lt;br /&gt;After a week of use I now want to share some of my experiences and observations with you. The first thing that stunned me is that they ship this thing a-maz-ing-ly fast! I ordered it on Monday afternoon, and on Tuesday early afternoon it was delivered to my door! Next: over at Apple, they know how to package their stuff - the packaging is so nicely done it is really a fetish on its own.&lt;br /&gt;&lt;br /&gt;The touch interface is really good for a "wow" from everyone, especially with the nicely done details I admire Apple for: Lists don't just stop scrolling at the end, but you can scroll a bit further and they will elastically go back after you release your finger. Applications zoom into view when you start them, and the thing emits this perfectly designed click sound on every action. Multi-touch is overrated IMHO, since I very rarely use it and would find it more convenient to have a single-finger gesture for zooming (multi-touch always also means &lt;span style="font-style: italic;"&gt;multi-hand&lt;/span&gt;, which is annoying - you cannot hold the thing and perform a multi-touch gesture with the same hand). The complete absence of haptic feedback also quickly turned out to be a caveat: simply no way of reliably controlling the audio player (volume, next song) while it is inside your pocket - you have to take it out, unlock, look at it, every time you want to change the volume. Also I found especially the volume slider would recognize gestures with my thumb unreliably, which is most annoying when the music is too loud and you have to fiddle around for seconds to be able to turn the volume down. Generally, a few (freely assignable?) physical buttons on the side of the thing would probably spoil the super-minimalistic design but would improve usability a lot for me.&lt;br /&gt;&lt;br /&gt;Speaking of design: Maybe my hands are just too sweaty, but after a short time of usage the thing looks really &lt;span style="font-style: italic;"&gt;ugly&lt;/span&gt;, on both sides. Finger taps and grease all over the screen and the shiny back makes you want to clean it all the time, which really is a Sisyphus thing. So its not exactly the kind of device you want to give out of your hand for business presentations, as everyone will go '&lt;span style="font-style: italic;"&gt;yuck, I'd better wash my hands...&lt;/span&gt;'&lt;br /&gt;&lt;br /&gt;Interestingly I already had several occasions where the much-appraised tilt sensor turned out to be annoying. Obviously, if gravity doesn't point in the direction of your own 'down' vector, you are in trouble, which happened to me in bed several times. I wanted to browse some pictures before going to sleep, and they all would turn to their sides. The other day, Patrizia wanted to turn a photo to look at some detail, but the photo would just turn together with the device and there was no way of stopping it from doing so. So there are situations where it would be nice to be able to deactivate or override that tilt sensor thingy.&lt;br /&gt;&lt;br /&gt;What surprised me is how little you can actually &lt;span style="font-style: italic;"&gt;do&lt;/span&gt; with that thing, in terms of producing or editing content. You cannot edit song information. You cannot reorder the pictures in a folder. You basically cannot delete anything that's on there while on the go. Speaking of limitations, this brings me to the iTunes software you are forced to use. But I do not want to go into the details here, in short: iTunes on Windows is &lt;span style="font-style: italic;"&gt;utter crap&lt;/span&gt;! I just hate it, and I will never understand how iTunes got the reputation it has... bleh! I hate it, hate it, hate it, and it will probably be the reason why my iPod will soon sit somewhere collecting dust, because actually they force you to use iTunes with the iPod touch - it is not possible to activate "disk mode" on this device which would allow you to use alternative programs. I guess this also means no chance for Linux users to ever sync their stuff with an iPod touch.&lt;br /&gt;&lt;br /&gt;The full meanness of the Apple corporation is revealed when you look at the syncing options for calendars and address books on Windows: Outlook and Windows Address Book are the only supported options. Importing bookmarks only from Internet Explorer! No Mozilla, no iCal, no standards support. They have their deals with Microsoft, and they don't give a dime about standards or open products. But it all comes in a nice package, and hey the user interface is nicely animated, so the geeks are flying for Apple. Pfui!&lt;br /&gt;&lt;br /&gt;What really surprises me is that they seem to get away with it, and the competition is screwing up so badly that Apple still, after all these years after the first iPod was released, looks like the only company that understands designing products. It's just unbelievable. Even though I hate this closed, proprietary, unhackable thing for its political implications, I wouldn't want to use any of the alternatives out there I have seen so far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-897160041088046448?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/897160041088046448/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=25299220&amp;postID=897160041088046448" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/897160041088046448?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/897160041088046448?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2008/03/weekend-with-ipod-touch.html" title="A weekend with the iPod touch" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DkEBRHg7fip7ImA9WB9bEEQ.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-2187118861048152407</id><published>2007-12-19T20:48:00.001+01:00</published><updated>2007-12-19T21:04:15.606+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-19T21:04:15.606+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="life" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>My Teeth</title><content type="html">I guess I really am one lucky guy... After seven years of avoiding it, I went to the dentist last week for a checkup, and guess what — nothing! Not one little hole in my denture to spoil the glory:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tnkA4sLKUhc/R2l12aaLD9I/AAAAAAAAAAM/epG1oKSYFZE/s1600-h/maul.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_tnkA4sLKUhc/R2l12aaLD9I/AAAAAAAAAAM/epG1oKSYFZE/s400/maul.jpg" alt="" id="BLOGGER_PHOTO_ID_5145773626909986770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I borrowed the X-Ray image for those of you who complain that I don't smile often enough. Thanks to &lt;a href="http://www.mediavirus.org/pad.me/"&gt;padme&lt;/a&gt; for making a contact print and scanning it!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:78%;"&gt;Note that above image is copyright by me and I explicitly disallow any form of copying, reproduction or use other than viewing it on this blog - Although I strongly believe in open source and creative commons, I am not willing to provide data about my body to anyone currently.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-2187118861048152407?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/2187118861048152407/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=25299220&amp;postID=2187118861048152407" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/2187118861048152407?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/2187118861048152407?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2007/12/my-teeth.html" title="My Teeth" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_tnkA4sLKUhc/R2l12aaLD9I/AAAAAAAAAAM/epG1oKSYFZE/s72-c/maul.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUEMR3g9eyp7ImA9WB9bEEQ.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-9075022455886942360</id><published>2007-12-10T16:35:00.000+01:00</published><updated>2007-12-19T20:48:06.663+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-12-19T20:48:06.663+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="http" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>Towards the perfect URL scheme for web applications. Part 1: Requirements</title><content type="html">[This is part one of a four-part article. I will add links to the other parts here as they become available.]&lt;br /&gt;&lt;br /&gt;I am currently working on a prototype for a small, new, top-secret web application (don't worry, I will let you know as soon as there is something online to show). When I sat down to start coding, the first thing I had to decide on was what the URLs inside the application should look like and how the URL space should be structured. I always had the impression that the question of how to design URLs for web applications has been largely neglected by the web developer community as I never read anything about a structured approach towards the problem — although it is a very visible feature and often the first usability test a site has to pass. So many apps and websites out there come with unreadable, unhackable URLs and/or, even worse, do not produce meaningful filenames when you try "save as..." on a page or downloadable file. I wanted to really get this right in the first place, so I started with writing down the things that annoy me regarding how URLs are constructed elsewhere, added a few "nice to have" features and lessons learned from my own previous experiences and compiled a requirements list that my scheme&lt;sup&gt;(1)&lt;/sup&gt; should meet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Requirements for a perfect URL scheme&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When I talk about "modern web applications" here I have a rough concept of the state of the art in mind (buzzword alert!): AJAX interface with a fallback to server-driven interactivity, REST APIs&lt;sup&gt;(2)&lt;/sup&gt;, widgetizable applications and an object-oriented data model. Other websites may have different requirements, but most of what I say here will apply to a broad range of applications.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. URLs should be human readable, rememberable and robust for voice communication (e.g. phone)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;One of the most important requirements for URLs is that they should make sense to a human. Machine-generated identifiers, deep folder hierarchies, special characters, strange extensions or query parameters are examples for URL parts that humans cannot easily parse or remember. More often than you think URLs are communicated by voice communication, over the phone or in the radio, therefore they should unambiguously serialze and deserialize from spoken language (which, by the way, is also a strong case for non-case sensitive or all-lowercase URLs).&lt;br /&gt;&lt;br /&gt;Obviously this requirement cannot be solved by a specification or scheme alone, but also lies in the application's responsibility. For example, if you have a document with the name 'qa4@@67g$O', the best scheme will not help you to provide a human readable URL.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. URLs should be short&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While this requirement is slightly related to the previous one, it is not the same. A longer URL may be much easier to remember, as you can easily try by using one of these tinyurl.com generated URLs. Still, partly for the reason of transmitting and displaying on devices with limited capabilities (think text messages), the URLs of our system should be naturally short with no superfluous namespaces, extensions or query parameters.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. The scheme should produce meaningful filenames &amp;amp; extensions for every page and file served&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is one of my top annoyances on the web, as most web applications fail to fulfill this requirement. Even with document servers that are supposed to provide files for download (e.g. PDFs), I frequently encounter missing extensions, not to speak of meaningful and unambiguous filenames. Whenever we serve a non-temporary page or document for viewing&lt;br /&gt;it should be possible for the user to save that page to her local machine, getting a meaningful filename with the correct filename extension.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. The scheme should make use of established specifications and conventions — filename extensions ('.'), hierarchy ('/'), queries ('?'), fragments ('#')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Obviously I do not want to reinvent URLs, but build on top of established standards and conventions. The problem is that these standards have emerged in a time before XML, Javascript and AJAX, and so we have to find an interpretation of the concepts offered to us that match the requirements of modern web applications.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. The scheme should use as few reserved characters as possible, leaving most of the allowed character set for the application&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I want to avoid introducing reserved characters in addition to the ones mentioned above  - partly because it would be a nonstandard extension to what we already have, partly because human readability would suffer by introducing additional non-letter characters.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6. URLs should be "hackable"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Closely related to human parseability requested in requirement 1, "hackability" means that parts of the URL could be removed or added by users, leading to deterministic, meaningful results. Some examples of this would be: removing everything after the last '/' should give you an overview of the content one level up a hierarchy, removing or changing extensions should change the content type served, adding parts of an URL seen elsewhere on the site should result in similar behavior on any other resource etc.. Note that a system with "hackable" URLs should also protect the user from accidentally modifying or deleting resources this way, so that users can safely play around with the URL scheme without causing damage.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;7. URLs should be able to address resources AND actions to be performed on these resources&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is the major new requirement I see with modern web applications. When HTTP was designed, URLs were meant as a way to access resources, in most cases static files. The operations to be performed on these resources were pushed into the HTTP protocol in form of the GET, PUT, POST, ... methods. In modern web applications it turned out that a predefined set of methods cannot cover all the different requirements that may emerge. We therefore need a way to express actions to be performed on resources within the URL, since no other method is provided by the HTTP protocol.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8. Resources or results of an action should be presentable in different formats (HTML, XML, JSON, plain text, ...), providing correct file name extensions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As static pages play a less important role in modern web applications and standards for the exchange of various data flavours emerge, it is important to be able to present a resource (e.g. an article) in different formats (e.g. HTML, Plain Text and RSS). New standards are emerging all the time and may become relevant in the future, so the pool of formats to choose from should be expandable in the future to support yet unanticipated usage of the data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;9. The scheme should support content to be served in a format determined by the preferences of the client application&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In addition to the explicit choice of format through the URL scheme discussed in the last item, the mechanism of implicit content format selection offered by HTTP through the "Accept" header&lt;sup&gt;(3)&lt;/sup&gt; should be supported. The Accept header allows the client to send a list of supported content types along with each request, allowing the server software to select a content type best suited for the task.&lt;br /&gt;&lt;br /&gt;This way our system can send different responses to a mobile phone and a full-fledged web browser, although both are using the same URL to access the content.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10. It should be possible to mix static files and generated content&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Although static files play a less important role in modern web applications, it is obvious that every web application will need to serve static files form the file system to the client. While in production environments this is often solved by a dedicated subdomain (e.g. static.foo.com), it should still be possible to serve static files and generated content from a single server.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;11. A single resource should have a single (normalized) URL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Flexible URL schemes often provide multiple paths to a single resource, leading to problems in unambiguously identifying resources. Search engines, for example, may not be able to conclude that two different URLs point to the same resource, usually leading to a reduced ranking for both pages. If multiple paths to a single resource are possible, an unambiguous normalization method (often called 'URL canonicalization') should be provided.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;12. Support the features of "standard" global filenames like robots.txt, sitemap.xml, favicon.ico&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Due to very unfortunate historical developments, some "standards" have emerged (none of them is actually a standard accepted by any official standardization authority) that rely on the presence of static files in the URL hierarchy of a server. Since these "standards" provide convenient or important functionality for many web applications, the URL scheme must either support these filenames by ensuring that no other resource can exist with an identical URL, or we need to find ways to support the features provided by these files through other means.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This concludes the requirements for a perfect URL scheme I have discovered and found important. In the next part (coming up soon!) I will discuss the constraints we face from the URL and HTTP specifications for designing our URLs. Part 3 will present the proposed URL scheme and Part 4 will discuss implementation issues. &lt;span style="font-style: italic;"&gt;Stay tuned!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Footnotes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1 - Let me state in advance that when I say "URL scheme" here, I do not mean to propose a new scheme outside the scope of what HTTP already supports. My intention is to find a way to structure the path component (everything that comes after the server name and port in the URL) in a way that reflects the needs of modern web applications.&lt;br /&gt;&lt;br /&gt;2 - I have to admit here I have never quite grasped what REST really is or why everyone is talking about it. As far as I understand, it is simply the concept of having a stateless API where every call is simply a HTTP request, and I have the vague idea that the URL scheme proposed here goes well along with it. If anyone has any further insigts, please enlighten me! (And yes, I have skimmed through the &lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/top.htm"&gt;dissertation&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;3 - The Accept header is discussed in detail in the &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html"&gt;HTTP/1.1 specification (RFC2616), section 14&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Updates&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2007-12-19: Added numbering to the individual requirements and added requirement 7 (Hackability)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-9075022455886942360?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/9075022455886942360/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=25299220&amp;postID=9075022455886942360" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/9075022455886942360?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/9075022455886942360?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2007/12/towards-perfect-url-scheme-for-web.html" title="Towards the perfect URL scheme for web applications. Part 1: Requirements" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;D08MRnc_cSp7ImA9WB9WE0Q.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-473675057713955158</id><published>2007-11-18T14:43:00.000+01:00</published><updated>2007-11-18T15:24:47.949+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-11-18T15:24:47.949+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="deutsch" /><category scheme="http://www.blogger.com/atom/ns#" term="life" /><category scheme="http://www.blogger.com/atom/ns#" term="observations" /><title>Beautiful Code - grausame Sprache?</title><content type="html">&lt;p&gt;Auf der Web2.0 Expo Berlin verteilte der O'Reilly Verlag Heftchen mit Auszügen aus der deutschsprachigen Übersetzung von "&lt;a href="http://www.amazon.de/Beautiful-Code-Theory-Practice-OReilly/dp/0596510047/"&gt;Beautiful Code&lt;/a&gt;". Darin habe ich gerade folgenden Satz gelesen:&lt;br /&gt;&lt;blockquote&gt;Wir sahen (oder glaubten zu sehen) ähnliche Probleme beim Nachhalten committeter Targets während der Übertragung von Änderungen vom Client zum Server, bei der Fortschrittsanzeige für den Benutzer während Update- oder Commit-Operationen und in verschiedenen anderen Fällen.&lt;/blockquote&gt;&lt;/p&gt;&lt;p&gt;Aah, ja. Ich fände es doch angemessen, die Schönheit von Code in einem Druckwerk eines namhaften Verlags auch mittels halbwegs vernünftiger Sprache zum Ausdruck zu bringen. Oder bin ich nur von der Grippe zu sehr geschwächt, um den Satz auf Anhieb zu kapieren?&lt;/p&gt;&lt;p&gt;Generell bemerke ich in letzter Zeit ein besorgniserregendes Absinken der Qualität von Lektorat und Übersetzungen, auch bei Verlagen die es sich leisten können (sollten). Was kann man dagegen tun? Wenn ich mich, gelangweilt und frustriert von der teils katastrophalen Qualität der Sprache in online Medien — ob "user generated" oder professionell — einem Druckwerk zuwende, möchte ich dort eigentlich nicht wieder mit der selben Schludrigkeit konfrontiert sein.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-473675057713955158?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/473675057713955158/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=25299220&amp;postID=473675057713955158" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/473675057713955158?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/473675057713955158?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2007/11/beautiful-code-grausame-sprache.html" title="Beautiful Code - grausame Sprache?" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEAMQXszeCp7ImA9WB9XGEo.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-6191638840712666616</id><published>2007-11-12T13:59:00.000+01:00</published><updated>2007-11-12T14:06:20.580+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-11-12T14:06:20.580+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorial" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>Berlin slides!</title><content type="html">The slides of my presentation at &lt;a href="http://web2open.eu/"&gt;Web2Open Berlin&lt;/a&gt;, titled "Advanced GPolyline usage — Interactivity and performance issues", are &lt;a href="http://home.subnet.at/flo/stuff/polylines/polylines_berlin.html"&gt;online&lt;/a&gt; now. I could not resist to create my own rudimentary HTML slide show framework for the presentation, so excuse the spartanic layout :)&lt;br /&gt;&lt;br /&gt;Btw.: you can find most of the slides of the main event online at &lt;a href="http://www.slideshare.net/tag/web2expoberlin"&gt;slideshare&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-6191638840712666616?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/6191638840712666616/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=25299220&amp;postID=6191638840712666616" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/6191638840712666616?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/6191638840712666616?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2007/11/berlin-slides.html" title="Berlin slides!" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkYHRng5eCp7ImA9WB9XEkg.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-3385948862610226734</id><published>2007-11-05T10:52:00.000+01:00</published><updated>2007-11-05T11:22:17.620+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-11-05T11:22:17.620+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="gmaps" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="life" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>My talk at Web2Open this wednesday</title><content type="html">I will be giving a talk at &lt;a href="http://web2open.eu/"&gt;Web2Open&lt;/a&gt; in Berlin (a free event attached to the O'Reilly &lt;a href="http://berlin.web2expo.com/"&gt;Web2.0 Expo&lt;/a&gt;) this Wednesday. The announced title and abstract of the talk are:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Advanced GPolyline usage - performance issues and interactivity&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;Due to different implementations on different browsers, complex and high resolution  Google polylines can lead to surprising  results up to non-responsive applications in some cases. I will present the - sometimes surprising - results of our performance  measurements, performance  improvement strategies and a comparison with an experimental alternative  implementation that can be also used for improved interactivity like  real-time editing or continuous panning along a line.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But maybe you can best decide whether you are interested by looking at a &lt;a href="http://www.maptales.com/files/screencasts/02_routes.html"&gt;screencast&lt;/a&gt; of the implementation I did for &lt;a href="http://www.maptales.com/"&gt;maptales&lt;/a&gt;. In the talk, I will provide some details and hints how to implement the shown features for your own applications.&lt;br /&gt;&lt;br /&gt;Looking forward to see you at Web2Open!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-3385948862610226734?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/3385948862610226734/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=25299220&amp;postID=3385948862610226734" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/3385948862610226734?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/3385948862610226734?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2007/11/my-talk-at-web2open-this-wednesday.html" title="My talk at Web2Open this wednesday" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0ECQH08eCp7ImA9WB9XEUs.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-2762484672087328584</id><published>2007-11-03T22:56:00.000+01:00</published><updated>2007-11-04T09:41:01.370+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-11-04T09:41:01.370+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ontology" /><category scheme="http://www.blogger.com/atom/ns#" term="procrastination" /><category scheme="http://www.blogger.com/atom/ns#" term="life" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><category scheme="http://www.blogger.com/atom/ns#" term="barcampberlin2" /><title>Procrastination</title><content type="html">I have heard the term &lt;a href="http://en.wikipedia.org/wiki/Procrastination"&gt;Procrastination&lt;/a&gt; for the first time only a few months ago (I think it was in the very recommendable &lt;a href="http://www.phdcomics.com/comics.php"&gt;PhD Comics&lt;/a&gt;). Since then, the word keeps popping up more and more often on my radar, and so it was no big surprise (although worth a smile) to hear a session on the topic being announced at &lt;a href="http://barcampberlin2.mixxt.de/"&gt;bar camp Berlin&lt;/a&gt; this morning. Of course you have experienced procrastination, everyone has I guess &amp;mdash; and it can be frustrating at times. But is it really a call for self-discipline or productivity management techniques, as commonly suggested, or should you not rather listen carefully and even give in from time to time to the alarm signs of your brain that just doesn't seem to want to work on the tasks you (or someone else) are trying to force it to?&lt;br /&gt;&lt;br /&gt;&lt;span&gt;One of the main reasons for p. that were mentioned in the session was distractions by a never ending bombardment of emails, bog posts, tweets, calls and alerts. But &lt;/span&gt;&lt;span&gt;distractions&lt;/span&gt; like these are not the &lt;span style="font-style: italic;"&gt;reasons&lt;/span&gt; for procrastination but mere artifacts, things that your brain is looking for in its under- or overwhelmedness with the "important" tasks assigned. I am writing this blog post without constantly checking my email or twitter now, because I am really involved with it and I want to get it right.&lt;br /&gt;&lt;br /&gt;My claim is that if you procrastinate regularly, there is something wrong. Deeply wrong. Try listening to yourself &amp;mdash; if your brain needs idleness, go home or go for a walk. Be brave and do it, even if you are supposed to work! Neither you nor your boss will profit from continued procrastination and the unhappyness and frustration that comes with it. If you constantly think about other things to do, you are most probably bored. Then you should think really hard if what you do &amp;mdash; or what you are supposed to be doing &amp;mdash; is really worth it. Do I &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; need this job? Do I &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; want to do a PhD? Do I &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; have to get christmas presents for my family? What is worth spending your time on in your life? Think deeply. Now. No matter how you decide, if you decide honestly, everyone will profit &amp;mdash; also the people you think you are doing a favor by keeping those tasks on the list.&lt;br /&gt;&lt;br /&gt;I am not saying that complete drifting and laziness should be the goal of our existence or that procrastination cannot take pathological forms, but it always astonishes me how obsessed people are with "success" in the very narrow definition of accomplishing tasks, often other people's tasks, and they take that definition of &lt;span style="font-style: italic;"&gt;their&lt;/span&gt; success from sources that are either manipulated (media) or far more powerful and in a better position to exploit them (their bosses), without thinking about what would make their lives really successful.&lt;br /&gt;&lt;br /&gt;Overcoming procrastination is certainly not a matter of deciding between boring to-do's or twitter or cleaning &amp;mdash; it's a decision between what really matters in life and what doesn't. We are a substitute society, and procrastination is our name for our addiction to substitutes. Feeds for adventures. Cleaning up for feeling at home. Tweets for love and friendship. Next time, step back for a minute, think about what you are missing and choose to make a real change, instead of trying to trick yourself back into the treadmill.&lt;br /&gt;&lt;br /&gt;P.S. I want to share with you the hilarious video shown in the session:&lt;br /&gt;&lt;br /&gt;&lt;object height="355" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/4P785j15Tzk&amp;amp;rel=1"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/4P785j15Tzk&amp;amp;rel=1" type="application/x-shockwave-flash" wmode="transparent" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Tagged: &lt;a href="http://technorati.com/tag/procrastination" rel="tag"&gt;procrastination&lt;/a&gt;, &lt;a href="http://technorati.com/tag/barcampberlin2" rel="tag"&gt;barcampberlin2&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-2762484672087328584?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/2762484672087328584/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=25299220&amp;postID=2762484672087328584" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/2762484672087328584?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/2762484672087328584?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2007/11/about-procrastination.html" title="Procrastination" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0cNQ34zcCp7ImA9WxZQEkg.&quot;"><id>tag:blogger.com,1999:blog-25299220.post-4017784879369009146</id><published>2007-10-28T12:34:00.001+01:00</published><updated>2008-02-17T14:31:32.088+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-17T14:31:32.088+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="hibernate" /><category scheme="http://www.blogger.com/atom/ns#" term="tech" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><category scheme="http://www.blogger.com/atom/ns#" term="english" /><title>Solving Hibernate Criteria's "Distinct Root Entity" limitation once and for all - including pagination</title><content type="html">I have to start with a rant: The Hibernate Criteria API, which I learned to at least partially like over the last months working on &lt;a href="http://www.maptales.com/"&gt;Maptales&lt;/a&gt; server code, has a few limitations which repeatedly make me wonder whether Hibernate really has been the right choice for a DB abstraction layer from time to time. It's not so much the limitations themselves, but rather the total lack of documentation of these limitations in the official Hibernate docs and examples and the generally rather arrogant tone on the Hibernate mailing Lists and FAQs — if you get an answer at all, that is — that annoy me and I guess a lot of other Hibernate users. The examples provided — and therefore copied blindly into nearly every Tutorial or Book about Hibernate out there — always avoid to show these limitations because of the triviality of the scenarios they cover. The purpose of a proper documentation would — for me — be to document especially such limitations and border cases where an API fails and provide solutions for these cases.&lt;br /&gt;&lt;br /&gt;The problem is even amplified by the fact that googling for such limitiations rarely brings up a solution, since, as mentioned above, the hibernate documentation and inherited tutorials all do a good job in concealing the problems, and few coders out there seem to really use Hibernate in more sophisticated ways &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; publish their experiences. Which makes me wonder, because for these trivial cases too often good ol' SQL would have been perfectly sufficient — and advantageous to those lamer wannabee DB coders who would actually be forced to learn something about databases instead of replicating stupid Hibernate tutorial examples.&lt;br /&gt;&lt;br /&gt;&amp;lt;/rant&gt;&lt;br /&gt;&lt;br /&gt;OK now the specific limitation I want to talk about is: &lt;span style="font-style: italic;"&gt;Hibernate does not return distinct results for a query with outer join fetching enabled for a collection&lt;/span&gt;. At least that's what they call it in the &lt;a href="http://www.hibernate.org/117.html#A12"&gt;Hibernate advanced problems FAQ&lt;/a&gt;, failing to discuss this problem in deep and to give a general solution. Quote:&lt;br /&gt;&lt;blockquote&gt;&lt;em&gt;One day Hibernate might be smart enough to know that if you call &lt;tt&gt;setFirstResult()&lt;/tt&gt; or &lt;tt&gt;setMaxResults()&lt;/tt&gt; it should not use a join, but a second SQL &lt;tt&gt;SELECT&lt;/tt&gt;. Try it, your version of Hibernate might already be smart enough. If not, write two queries, one for limiting stuff, the other for eager fetching.&lt;/em&gt;&lt;/blockquote&gt;And here they are again cutting of a large part of the problem. First, I checked an my version of hibernate is not "smart" enough, and it &lt;a href="http://opensource.atlassian.com/projects/hibernate/browse/HHH-2480"&gt;does not look like&lt;/a&gt; it will get any smarter soon. Second, the approach proposed there did not work for me when querying on properties of objects inside a collection - the collection has to always be JOINed for the query to work, therefore always producing results useless for pagination after transforming to distinct root entities. Generally, my problem was harder in a number of ways than the ususal examples:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I am nearly always using criterias on collection members, therefore I cannot revert to SELECT fetching.&lt;/li&gt;&lt;li&gt;I always have to use pagination (setFirstResult() and setMaxResults()), because in a web application it is not nice to return thousands of results on one page.&lt;/li&gt;&lt;li&gt;I am using PostGreSQL which adds a few oddities above it all (see below)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;After digging through a lot of useless to semi-enlightening blog posts (thanks to Rick Hightower for providing &lt;a href="http://www.jroller.com/RickHigh/entry/hibernate_query_getting_rid_of"&gt;two thirds of the solution&lt;/a&gt;) I could finally come up with the ultimate solution that works for me now:&lt;br /&gt;&lt;br /&gt;First you have to accept that you have to live with 2 queries instead of one. You simply cannot do pagination &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; restrictions on collection members in hibernate in a single criteria query. Once you have accepted that fact, you can go ahead and construct your base query.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public List queryCats(Date queryDate) throws Exception {&lt;br /&gt;Criteria criteria = getSession().createCriteria(Cat.class);&lt;br /&gt;criteria.setFirstResult(offset).setMaxResults(num);&lt;br /&gt;criteria.addOrder(Order.asc("age"));&lt;br /&gt;if (queryDate != null) {&lt;br /&gt;  Criteria subCrit = criteria.createCriteria("kittens", "kitten");&lt;br /&gt;  subCrit.add(Expression.ge("birthDate", queryDate));&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;What you need to do then is to project the result to a collection of ids of the objects that match the query, eliminating duplicates. Here also the mentioned speciality of Postgres (at a &lt;a href="http://archives.postgresql.org/pgsql-sql/2007-02/msg00169.php"&gt;second look&lt;/a&gt; it seems to be a general limitation) comes in: you have to include fields that are used for ordering in the projection clause. The nice thing is we can do the projection on demand and only if collection memebers are actually queried — this comes in handy for programatically constructed queries which can use the simple, single query way if collection properties are not used in the query:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  if (queryDate != null) {&lt;br /&gt;  // project result to distinct ids,&lt;br /&gt;  // including columns used for sorting&lt;br /&gt;  criteria.setProjection(Projections.distinct(&lt;br /&gt;    Projections.projectionList()&lt;br /&gt;      .add(Projections.id())&lt;br /&gt;      .add(Projections.property("birthDate"))&lt;br /&gt;  ));&lt;br /&gt;  List list = criteria.list();&lt;br /&gt;&lt;br /&gt;  // unfortunately we have to copy the ids out of the&lt;br /&gt;  // resulting Object[] List&lt;br /&gt;  List&lt;long&gt; idlist = new ArrayList&amp;lt;long&amp;gt;();&lt;br /&gt;&lt;br /&gt;  for (Iterator iditer = list.iterator(); iditer.hasNext();) {&lt;br /&gt;    Object[] record = (Object[]) iditer.next();&lt;br /&gt;    idlist.add((Long)record[0]);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // another Hibernate stupidity: empty Lists cause&lt;br /&gt;  // Expression.in to throw an error&lt;br /&gt;  if (idlist.size() &gt; 0) {&lt;br /&gt;    criteria = getSession().createCriteria(Cat.class);&lt;br /&gt;    criteria.add(Expression.in("id", idlist));&lt;br /&gt;  }&lt;br /&gt;  else {&lt;br /&gt;    return new ArrayList();&lt;br /&gt;  }&lt;br /&gt;}&lt;/long&gt;&lt;/pre&gt;&lt;br /&gt;You can then transparently use the id-query in the complex case or issue the main query in the simple case:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;  return criteria.list();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;The presented approach has worked for me in a number of cases, and I am very happy now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/25299220-4017784879369009146?l=floledermann.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://floledermann.blogspot.com/feeds/4017784879369009146/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=25299220&amp;postID=4017784879369009146" title="28 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/4017784879369009146?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/25299220/posts/default/4017784879369009146?v=2" /><link rel="alternate" type="text/html" href="http://floledermann.blogspot.com/2007/10/solving-hibernate-criterias-distinct.html" title="Solving Hibernate Criteria's &quot;Distinct Root Entity&quot; limitation once and for all - including pagination" /><author><name>Flo</name><uri>http://www.blogger.com/profile/13456675247042447579</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="21" src="http://www.ims.tuwien.ac.at/~flo/images/flo_new2.jpg" /></author><thr:total>28</thr:total></entry></feed>

