<?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" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C08DQ3YzcSp7ImA9WhRQFUg.&quot;"><id>tag:blogger.com,1999:blog-31254910</id><updated>2011-12-10T13:17:52.889-08:00</updated><title>Coffee &amp; Gems</title><subtitle type="html">About software development</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://michaelmarth.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>90</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/CoffeeGems" /><feedburner:info uri="coffeegems" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D0MERHg5cCp7ImA9WxFWEEg.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-8812607521170753224</id><published>2010-05-28T06:56:00.000-07:00</published><updated>2010-05-28T07:03:25.628-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-28T07:03:25.628-07:00</app:edited><title>Second FISE Hackathon</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://dev.day.com/content/ddc/blog/2009/12/iksworkflowbenchmark/_jcr_content/images/iksworkflowbenchmark/iks-logo.jpg"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 214px; height: 111px;" src="http://dev.day.com/content/ddc/blog/2009/12/iksworkflowbenchmark/_jcr_content/images/iksworkflowbenchmark/iks-logo.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;At this week's &lt;a href="http://www.iks-project.eu/"&gt;IKS&lt;/a&gt; meeting at Paderborn the second &lt;a href="http://dev.day.com/content/ddc/blog/2010/04/fise_the_iks_restfu.html"&gt;FISE&lt;/a&gt; &lt;a href="http://wiki.iks-project.eu/index.php/FISEHackathonMay2010"&gt;Hackathon&lt;/a&gt; took place. FISE is an open source semantic engine that provides semantic annotation algorithms like semantic lifting. The actual annotation algorithms are pluggable through OSGi. Existing CMSs can integrate the engine through an HTTP interface (inspired from &lt;a href="http://lucene.apache.org/solr/"&gt;Solr&lt;/a&gt;). Last week, &lt;a href="http://dev.day.com/content/ddc/blog.html?blog=author&amp;amp;author=Bertrand+Delacretaz"&gt;Bertrand&lt;/a&gt; gave an introductory talk about FISE that is &lt;a href="http://dev.day.com/content/ddc/blog/2010/05/introduction_to_iks.html"&gt;available online&lt;/a&gt;.&lt;br /&gt;&lt;p&gt;&lt;br /&gt;There was no explicitly set goal for the second Hackathon. Rather, the existing code base was extended in various different directions. Some examples:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;a language detection enhancement engine (I am particularly glad to see this - automatic language detection in CMSs is a pet passion of mine)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;a UI for FISE users that allows humans to resolve ambiguities&lt;br /&gt;&lt;/li&gt;&lt;li&gt;myself, I coded a JCR-based storage engine for the content and annotations&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There was also a good amount of work done on the annotation structure used by FISE and &lt;a href="http://wiki.iks-project.eu/index.php/EnhancementStructure"&gt;documented on the IKS wiki&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;A &lt;a href="http://wiki.iks-project.eu/index.php/FISEsecondHackathonReport"&gt;complete report of the Hackathon&lt;/a&gt; is available on the IKS wiki (the only thing it fails to mention: the event's good spirit).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;One major non-code step was to get many participants up to speed with the FISE engine and enable them to deploy the engine as well as get accustomed with the architecture and code base.&lt;br /&gt;&lt;br /&gt;It was only last week that I took a deeper look into FISE. I like its architecture a lot. The HTTP interface makes it easy to play with FISE as well as integrate it. Even more important, the pluggable archirecture that is mostly inherited from the OSGi services architecture makes FISE very flexible and extensible. This is particularly important given the different natures of the enhancement engines that we want to be able to deploy (hosted services, proprietary, open source, etc). I consider FISE to be a particularly well suited use case for OSGi.&lt;/p&gt;&lt;p&gt;(cross-posting from &lt;a href="http://dev.day.com/content/ddc/blog/2010/05/second_fise_hackatho.html"&gt;here&lt;/a&gt;)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-8812607521170753224?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/8812607521170753224/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=8812607521170753224" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/8812607521170753224?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/8812607521170753224?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/Oplyq0gXoB0/second-fise-hackathon.html" title="Second FISE Hackathon" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2010/05/second-fise-hackathon.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cMQXY_fCp7ImA9WxFTGEU.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-1220920550633938611</id><published>2010-04-10T01:36:00.000-07:00</published><updated>2010-04-10T01:44:40.844-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-10T01:44:40.844-07:00</app:edited><title>NoSQL talk at Developer Summit</title><content type="html">&lt;div&gt;Three days ago I had to chance to talk about NoSQL at the &lt;a href="http://www.internet-briefing.ch/index.cfm?CFID=46404093&amp;amp;CFTOKEN=10212126&amp;amp;page=101498&amp;amp;anlass_id=216"&gt;Internet Briefing's Developer Summit&lt;/a&gt;. On top of general ideas and concepts like the CAP theorem I chose to talk about &lt;a href="http://jackrabbit.apache.org/"&gt;Apache Jackrabbit&lt;/a&gt;, &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt; and &lt;a href="http://cassandra.apache.org/"&gt;Cassandra&lt;/a&gt;. My slides are embedded below.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It was a really good event with interesting speakers and a knowledgeable audience. I was especially pleased that when I talked about CouchDB's HTTP API someone from the audience mentioned that &lt;a href="http://sling.apache.org/site/index.html"&gt;Apache Sling&lt;/a&gt; does something very similar for Jackrabbit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Special kudos to Christian Stocker of Liip for daring to do a live demo of the "real-time web" - he took a picture from his phone and had it pop up on Jabber and Twitter in about 5 secs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Vlad Trifa has posted a good summary of the whole event (&lt;a href="http://www.webofthings.com/2010/04/07/internet-developers-day-part-1/"&gt;part 1&lt;/a&gt;, &lt;a href="http://www.webofthings.com/2010/04/07/internet-developers-day-part-2/"&gt;part 2&lt;/a&gt;) - he also gave a great presentation about the application of the REST architectural style to the "Web of Things".&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_3657930"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/mmarth/no-sql-3657930" title="No Sql"&gt;No Sql&lt;/a&gt;&lt;/strong&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=nosql-100407111005-phpapp01&amp;stripped_title=no-sql-3657930" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=nosql-100407111005-phpapp01&amp;stripped_title=no-sql-3657930" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/mmarth"&gt;mmarth&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-1220920550633938611?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/1220920550633938611/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=1220920550633938611" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/1220920550633938611?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/1220920550633938611?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/5lMTHqyTo5E/nosql-talk-at-developer-summit.html" title="NoSQL talk at Developer Summit" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2010/04/nosql-talk-at-developer-summit.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcFSXk4eip7ImA9WxBbFEw.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-3462962738980534944</id><published>2010-03-12T08:11:00.000-08:00</published><updated>2010-03-12T08:56:58.732-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-12T08:56:58.732-08:00</app:edited><title>CMS vendors now and then</title><content type="html">CMS analyst Janus Boye has just &lt;a href="http://www.jboye.com/blogpost/vendors-kill-products-and-make-customers-pay/"&gt;published a post on CMS vendors that discontinue their products&lt;/a&gt; (because they get bought out or similar)&lt;div&gt;&lt;blockquote&gt;During the past 10 years, a number of software products used by online  professionals have been discontinued&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;That sentence reminded me that I had given a talk almost 10 years ago (it was in 2001 exactly) that contained a slide on the CMS market at that time:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UDN4j-Aji_4/S5pv2Rc2ARI/AAAAAAAA-ZE/rHAxNCPDRVo/s1600-h/Dock.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_UDN4j-Aji_4/S5pv2Rc2ARI/AAAAAAAA-ZE/rHAxNCPDRVo/s400/Dock.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5447789677446037778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The circles denote vendors that were part of CMS market overview articles by popular German IT magazines in that year (I wanted to show how differently the market place could be perceived). A vendor placed in any of the circles had enough attention to be part of at least one evaluation. The vendors outside of the circles were not part of any of these overview articles, but somehow present in the market place - at least I knew their names back then.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It is interesting to look at the landscape from that time. Of course there are a number of well-known vendors that got bought (Vignette, Obtree, Gauss), but the majority still seems to linger on - at least, a web site still exists, for example &lt;a href="http://www.trenovis.de/index.cfm?contentid=39"&gt;iRacer&lt;/a&gt;, &lt;a href="http://www.schema.de/eds/"&gt;Schema Text&lt;/a&gt;, or &lt;a href="http://www.contens.de/de/pub/index.cfm"&gt;Contens&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the other hand, one can ask how many vendors that were important enough to make it into a (German) market overview are still relevant in the market place today. I have used &lt;a href="http://spreadsheets.google.com/pub?key=tFsgr9oK6C8D1cgbmERMvLA&amp;amp;output=html"&gt;Janus Boye's spreadsheet of relevant European CMS vendors&lt;/a&gt; as a benchmark and checked which vendor's of today's list were already in 2001's presentation: &lt;a href="http://www.day.com/day/en.html"&gt;Day&lt;/a&gt;, &lt;a href="https://www.coremedia.com/en"&gt;Coremedia&lt;/a&gt; and &lt;a href="http://www.opentext.com/"&gt;Open Text&lt;/a&gt; were "in the circles". &lt;a href="http://www.sdltridion.com/"&gt;Tridion&lt;/a&gt; was there, but outside of the circles. The rest of the vendors that Janus considers relevant today were not on my radar in 2001.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The end of my presentation involved a couple of CMS-related predictions. Let's see how I did. I predicted:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;product borders between CMS, DMS and app servers will blur further - my take now: &lt;i&gt;wrong. I do not think that these border are more blurry than they were in 2001&lt;/i&gt;&lt;/li&gt;&lt;li&gt;more standards and standards-based software (Java, JSP/ASP, XML, XSL) - &lt;i&gt;true. The underlying technologies of CMSs are more homogeneous than they were at that time. Remember TCL?&lt;/i&gt;&lt;/li&gt;&lt;li&gt;But no true compatibility. &lt;i&gt;True. Nothing more to say.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Improved Personalization. Improved Multi-Channel support. &lt;i&gt;Both not really true, but rather fads of those days.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Improved DMS features and Office integration. &lt;i&gt;Don't ask me why I said that.&lt;/i&gt;&lt;/li&gt;&lt;li&gt;No quick market consolidation in sight. &lt;i&gt;Right on the money here.&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;Mostly correct on general market considerations, mostly wrong on features.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-3462962738980534944?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/3462962738980534944/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=3462962738980534944" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/3462962738980534944?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/3462962738980534944?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/YDwTTcAD0bY/cms-vendors-now-and-then.html" title="CMS vendors now and then" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_UDN4j-Aji_4/S5pv2Rc2ARI/AAAAAAAA-ZE/rHAxNCPDRVo/s72-c/Dock.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2010/03/cms-vendors-now-and-then.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAFQ3c7cSp7ImA9WxBQEEg.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-5394883619738616643</id><published>2010-01-09T06:50:00.000-08:00</published><updated>2010-01-09T07:25:12.909-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-09T07:25:12.909-08:00</app:edited><title>mp3tagger on GitHub</title><content type="html">On the &lt;a href="http://michaelmarth.blogspot.com/2009/11/python-script-to-set-genre-in-itunes.html"&gt;mp3 tagger post&lt;/a&gt; I have received quite a bit of feedback and feature requests. Therefore, I thought it might be a good idea to do "social coding" and &lt;a href="http://github.com/michaelmarth/mp3tagger"&gt;put the code on GitHub&lt;/a&gt; where it can easily be forked (and the forks can be watched).&lt;br /&gt;&lt;br /&gt;Other than that, the latest version of the tagger contains these improvements:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the Last.fm keys and secret are not stored in the code anymore, but entered on the first run and stored in ~/.mp3tagger.cfg&lt;/li&gt;&lt;li&gt;you can run the script in two additional modes: simulation and ask. In simulation mode no changes to mp3s will be saved, in ask mode you will be asked to save each change. Start the script with flags "-m simulation" or "-m ask", respectively.&lt;/li&gt;&lt;li&gt;It is now possible to specify a list of genre tags that will be considered (additionally to the mp3 default genre tags). The list needs to be stored in a config file at ~/.mp3tagger_genres.cfg (in the "generic" section of the file). The full format this file needs to have is shown below.&lt;/li&gt;&lt;li&gt;The last improvement is a tricky one: after tagging all my mp3s I ended up with hundreds of albums tagged with genre &lt;span style="font-style: italic;"&gt;Electronic&lt;/span&gt; or &lt;span style="font-style: italic;"&gt;Indie&lt;/span&gt;. I wanted to refine these genres into sub-genres. This again works by putting a list of possible sub-genres into ~/.mp3tagger_genres.cfg and running the tagger with flag "-r &lt;span style="font-style: italic;"&gt;genre&lt;/span&gt;", e.g. "-r Electronic". You would run this option when you find that you have too many albums of one genre and want to split them up.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So in summary my config file ~/.mp3tagger_genres.cfg looks like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[generic]&lt;br /&gt;genres=Shoegaze,Dubstep,Grime,Dub,Drum And Bass&lt;br /&gt;[refinements]&lt;br /&gt;Electronic=Idm,Turntableism,Techno,Minimal,Dub,Big Beat,Ambient,Breakbeat,House,Lounge,Electroclash,Drum And Bass,Chillout&lt;br /&gt;Indie=Indie Rock,Indie Pop,Singer-Songwriter,Indie Pop,Shoegaze,Post-Rock,Americana,New Wave,Alt-Country&lt;br /&gt;Reggae=Dancehall,Dub,Ska&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-5394883619738616643?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/5394883619738616643/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=5394883619738616643" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/5394883619738616643?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/5394883619738616643?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/R-LX9y6DLcI/mp3tagger-on-github.html" title="mp3tagger on GitHub" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2010/01/mp3tagger-on-github.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D08GSXo_eyp7ImA9WxNbEkQ.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-8516550838640378334</id><published>2009-11-15T06:30:00.001-08:00</published><updated>2009-11-15T06:37:08.443-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-15T06:37:08.443-08:00</app:edited><title>Running the iTunes genre tagger script with OS X Automator</title><content type="html">Due to &lt;a href="http://michaelmarth.blogspot.com/2009/11/python-script-to-set-genre-in-itunes.html"&gt;public demand&lt;/a&gt; here's a little recipe how to run &lt;a href="http://michaelmarth.blogspot.com/2009/11/python-script-to-set-genre-in-itunes.html"&gt;last post's mp3 tagger&lt;/a&gt; without using the command line on OS X:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Open Automator&lt;/li&gt;&lt;li&gt;Start a new "Application" project&lt;/li&gt;&lt;li&gt;Drag the "Run Shell Script" action into the right workflow panel, set the "pass input" drop-down to "as arguments" and edit the script to (see screenshot below):&lt;/li&gt;&lt;/ul&gt;for f in "$@"&lt;br /&gt;do&lt;br /&gt;   /opt/local/bin/python /Users/michaelmarth/Development/Code/mp3tagger/tag_groupings.py -d "$f"&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;(you will have to adapt the paths to your local setup)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Save the application and happily start dropping mp3 folders onto the application's icon.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img.skitch.com/20091115-xp4nqy4fnhqg72xdhey19nqdwx.jpg"&gt;&lt;img style="cursor: pointer; width: 736px; height: 245px;" src="http://img.skitch.com/20091115-xp4nqy4fnhqg72xdhey19nqdwx.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-8516550838640378334?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/8516550838640378334/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=8516550838640378334" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/8516550838640378334?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/8516550838640378334?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/S8xroH0CGmw/running-itunes-genre-tagger-script-with.html" title="Running the iTunes genre tagger script with OS X Automator" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/11/running-itunes-genre-tagger-script-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQDSXozeSp7ImA9WxNUEkU.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-7900704455924011778</id><published>2009-11-03T10:27:00.000-08:00</published><updated>2009-11-03T13:22:58.481-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-03T13:22:58.481-08:00</app:edited><title>Python script to set genre in iTunes with Last.fm tags</title><content type="html">Now that I have started to seriously use iTunes I figured it might be nice to have the genre tag set in a meaningful way. Since I have a reasonably large collection of mp3s doing that manually was out of question - I wrote me a Python script to do that. There seems to be a large demand for such a functionality (at least I found a lot of questions on how to automatically set the genre tag) so maybe someone else finds the script useful. It is pasted below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;General Strategy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The basic idea is to use Last.fm's tags for genre tagging. In iTunes the genre tag is IMO best used when it only contains one single genre, i.e. something like "Electronica", &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; something like "Electronica / Dance". On the other hand dropping all but one tag would lose a lot of information, so I decided to use the groupings tag for additional information that is contained in the list of tags that an artist has on Last.fm. In the example above that would be something like "Electronica, Dance, 80s, German". In that way it is simple to use iTunes' Smart Playlist feature to create play lists of all, say, dance music. This approach is probably not suitable for classical music..&lt;br /&gt;&lt;br /&gt;The ID3 field that is exposed in iTunes' UI as "grouping" is defined in the &lt;a href="http://www.id3.org/id3v2.3.0"&gt;ID3v2 spec&lt;/a&gt; as:&lt;br /&gt;&lt;dl&gt;&lt;dt style="font-weight: bold;"&gt;TIT1&lt;/dt&gt;&lt;dd&gt;The 'Content group description' frame is used if the sound belongs to a larger category of sounds/music. For example, classical music is often sorted in different musical sections (e.g. "Piano Concerto", "Weather - Hurricane"). &lt;/dd&gt;&lt;/dl&gt;So, the strategy I described above seems to be kind of in line with the spec. In general, it is a good idea to have a look at the &lt;a href="http://www.id3.org/id3v2.3.0"&gt;ID3v2 spec&lt;/a&gt; if you consider dabbling with mp3 tags.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Practical Considerations&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If one would just take an artist's highest-rated Last.fm tag for the genre one would end up with pretty inconsistent genre tags (think "hip-hop", "hip hop", and "hiphop"). Therefore, I chose to use a fixed set of values for genre. In a previous version of ID3 the list of possible genres was fixed. While this is clearly a terrible idea to start with it came along handy in this case. I used his as a fixed list for genres.&lt;br /&gt;&lt;br /&gt;The second practical consideration was which Last.fm tags to include. In Last.fm parlance each artist tag comes with a weight (values form 0 to 100). Selecting only the tags with weight larger than 50 worked out fine for me (usually I had 1-5 tags per artist).&lt;br /&gt;&lt;br /&gt;A third thing you might want to be aware of: if you programmatically change tags in an mp3 iTunes will not pick up these changes automatically. A simple way of letting it know: select the "Get Info" command on these items. This will trigger a reload of the new tag values.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Script&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To run the script you will need the Python libraries &lt;a href="http://code.google.com/p/mutagen/"&gt;mutagen&lt;/a&gt; and &lt;a href="http://code.google.com/p/pylast/"&gt;pylast&lt;/a&gt; installed. Run it with the option&lt;br /&gt;-d directory_with_mp3s&lt;br /&gt;The script will walk along this directory and modify all mp3s it finds. Also, you will need a &lt;a href="http://www.last.fm/api/account"&gt;Last.fm API key&lt;/a&gt; and set your API_KEY and API_SECRET accordingly in the script.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;# encoding: utf-8&lt;br /&gt;"""&lt;br /&gt;tag_groupings.py&lt;br /&gt;&lt;br /&gt;Created by Michael Marth on 2009-11-02.&lt;br /&gt;Copyright (c) 2009 marth.software.services. All rights reserved.&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;import getopt&lt;br /&gt;import pylast&lt;br /&gt;import os.path&lt;br /&gt;from mutagen.id3 import TCON, ID3, TIT1&lt;br /&gt;&lt;br /&gt;help_message = '''&lt;br /&gt;Adds ID3 tags to mp3 files for genre and groupings. Tag values are retrieved from Last.FM. Usage:&lt;br /&gt;-d mp3_directory&lt;br /&gt;'''&lt;br /&gt;&lt;br /&gt;class Usage(Exception):&lt;br /&gt;   def __init__(self, msg):&lt;br /&gt;       self.msg = msg&lt;br /&gt;&lt;br /&gt;all_genres = TCON.GENRES&lt;br /&gt;genre_cache = {}&lt;br /&gt;groupings_cache = {}&lt;br /&gt;API_KEY = "your key here"&lt;br /&gt;API_SECRET = "your secret here"&lt;br /&gt;network = pylast.get_lastfm_network(api_key = API_KEY, api_secret = API_SECRET)&lt;br /&gt;&lt;br /&gt;def artist_to_genre(artist):&lt;br /&gt;   if genre_cache.has_key(artist):&lt;br /&gt;       return genre_cache[artist]&lt;br /&gt;   else:&lt;br /&gt;       tags = network.get_artist(artist).get_top_tags()      &lt;br /&gt;       for tag in tags:&lt;br /&gt;           if all_genres.__contains__(tag[0].name.title()):&lt;br /&gt;               genre_cache[artist] = tag[0].name.title()&lt;br /&gt;               print "%20s %s" % (artist,tag[0].name.title())&lt;br /&gt;               return tag[0].name.title()&lt;br /&gt;&lt;br /&gt;def artist_to_groupings(artist):&lt;br /&gt;   if groupings_cache.has_key(artist):&lt;br /&gt;       return groupings_cache[artist]&lt;br /&gt;   else:&lt;br /&gt;       tags = network.get_artist(artist).get_top_tags()&lt;br /&gt;       relevant_tags = []&lt;br /&gt;       for tag in tags:&lt;br /&gt;           if int(tag[1]) &gt;= 50:&lt;br /&gt;               relevant_tags.append(tag[0].name.title())&lt;br /&gt;       groupings = ", ".join(relevant_tags)&lt;br /&gt;       groupings_cache[artist] = groupings&lt;br /&gt;       print "%20s %s" % (artist,groupings)&lt;br /&gt;       return groupings&lt;br /&gt;&lt;br /&gt;def walk_mp3s():&lt;br /&gt;   for root, dirs, files in os.walk('.'):&lt;br /&gt;       for name in files:&lt;br /&gt;           if name.endswith(".mp3"):&lt;br /&gt;               audio = ID3(os.path.join(root, name))&lt;br /&gt;               artist = audio["TPE1"]&lt;br /&gt;               genre = artist_to_genre(artist[0])&lt;br /&gt;               grouping = artist_to_groupings(artist[0])&lt;br /&gt;               if genre != None:&lt;br /&gt;                   audio["TCON"] = TCON(encoding=3, text=genre)&lt;br /&gt;               if grouping != None:&lt;br /&gt;                   audio["TIT1"] = TIT1(encoding=3, text=grouping)&lt;br /&gt;               audio.save()&lt;br /&gt;&lt;br /&gt;def main(argv=None):&lt;br /&gt;   if argv is None:&lt;br /&gt;       argv = sys.argv&lt;br /&gt;   try:&lt;br /&gt;       try:&lt;br /&gt;           opts, args = getopt.getopt(argv[1:], "ho:vd:", ["help", "output="])&lt;br /&gt;       except getopt.error, msg:&lt;br /&gt;           raise Usage(msg)&lt;br /&gt; &lt;br /&gt;       # option processing&lt;br /&gt;       for option, value in opts:&lt;br /&gt;           if option == "-v":&lt;br /&gt;               verbose = True&lt;br /&gt;           if option in ("-h", "--help"):&lt;br /&gt;               raise Usage(help_message)&lt;br /&gt;           if option in ("-o", "--output"):&lt;br /&gt;               output = value&lt;br /&gt;           if option in ("-d"):&lt;br /&gt;               try:&lt;br /&gt;                   os.chdir(value)&lt;br /&gt;               except Exception,e:&lt;br /&gt;                   print "error with directory " + value&lt;br /&gt;                   print e&lt;br /&gt;       walk_mp3s()      &lt;br /&gt; &lt;br /&gt;   except Usage, err:&lt;br /&gt;       print &gt;&gt; sys.stderr, sys.argv[0].split("/")[-1] + ": " + str(err.msg)&lt;br /&gt;       print &gt;&gt; sys.stderr, "\t for help use --help"&lt;br /&gt;       return 2&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;   sys.exit(main())&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-7900704455924011778?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/7900704455924011778/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=7900704455924011778" title="12 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/7900704455924011778?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/7900704455924011778?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/_FWOtstoV_0/python-script-to-set-genre-in-itunes.html" title="Python script to set genre in iTunes with Last.fm tags" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>12</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/11/python-script-to-set-genre-in-itunes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEENSHwzcSp7ImA9WxNUEk4.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-1092470555444988911</id><published>2009-11-02T23:15:00.001-08:00</published><updated>2009-11-02T23:18:19.289-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-02T23:18:19.289-08:00</app:edited><title>Interviewed by Internet Briefing Blog</title><content type="html">Reto Hartinger of the &lt;a href="http://www.internet-briefing.ch/"&gt;Internet Briefing group&lt;/a&gt; has &lt;a href="http://blog.internet-briefing.ch/2009/11/03/nosql/"&gt;interviewed me&lt;/a&gt; about what I work on these days. The interview is in German.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-1092470555444988911?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/1092470555444988911/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=1092470555444988911" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/1092470555444988911?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/1092470555444988911?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/17AYE6ZZR0I/interviewed-by-internet-briefing-blog.html" title="Interviewed by Internet Briefing Blog" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/11/interviewed-by-internet-briefing-blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUEQH8yfSp7ImA9WxNVE0Q.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-5464712224369365710</id><published>2009-10-18T10:59:00.000-07:00</published><updated>2009-10-24T07:23:21.195-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-24T07:23:21.195-07:00</app:edited><title>Colayer's approach to collaboration software</title><content type="html">Chances are you have not heard of &lt;a href="http://colayer.com/"&gt;Colayer&lt;/a&gt;, a Swiss-Indian company producing a SaaS-based collaboration software. I did a small project with the guys, that is how I got to know. When I first saw their product I immediately thought the guys are onto something good, so it is worthwhile to share a bit of their application concepts. They follow an approach I have not seen anywhere else.&lt;br /&gt;&lt;br /&gt;On first look Colayer seems to be a mixture between wikis and forums: the logical data structure resembles a hierarchical web-based forum and the forum entries are editable and versioned like in a wiki. But there is more: presence and real-time. All users that are currently logged in are visible and one can have real-time chats within the context of the page one is in or see updates to the page in real-time (similar as in Google Docs). These chats are treated as atomic page elements (called &lt;span style="font-style: italic;"&gt;sems &lt;/span&gt;in Colayer parlance) just like the forum entries or other texts. Through this mechanism, all communication around one topic stays on one page and &lt;span style="font-weight: bold;"&gt;in the same context&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;There are two more crucial elements: time and semantics. All sem's visibility is controlled by their age and their importance. As such, a simple chat is given less weight that a project decision and will fade out of view after some time. All new items from all pages (i.e. discussions or topics) are aggregated on a personal home page and shown within the context where they occurred.&lt;br /&gt;&lt;br /&gt;Below is a screenshot of such different sems in one page. One page corresponds to one topic or forum or wiki page. You can see the hierarchical model and the different semantics (denoted by the colors).&lt;br /&gt;&lt;br /&gt;&lt;a title="200 -- OK" style="background: rgb(190, 245, 180) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; color: rgb(51, 102, 51);" originaltxcolor="" originalbgcolor="" arrgreenfp="" arrredfp="" phrasesfound="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UDN4j-Aji_4/St6yxCgUPwI/AAAAAAAA83g/eUNu84zFTxo/s1600-h/colayer-screen-ColayerScreen.jpg"&gt;&lt;img style="cursor: pointer; width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/St6yxCgUPwI/AAAAAAAA83g/eUNu84zFTxo/s320/colayer-screen-ColayerScreen.jpg" alt="" id="BLOGGER_PHOTO_ID_5394945959192182530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is an example screen shot that aggregates different recent sems on one page (essentially a context-aware display of new items including time and context in the same display). Note that this way of displaying new items manages to map importance, time and context into a two-dimensional page, which I find a very cool achievement.&lt;br /&gt;&lt;br /&gt;&lt;a title="200 -- OK" style="background: rgb(190, 245, 180) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; color: rgb(51, 102, 51);" originaltxcolor="" originalbgcolor="" arrgreenfp="" arrredfp="" phrasesfound="" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UDN4j-Aji_4/St6y9SdtmNI/AAAAAAAA83o/eeVGo8KR0PI/s1600-h/colayer-screen-OverviewPage.jpg"&gt;&lt;img style="cursor: pointer; width: 269px; height: 320px;" src="http://3.bp.blogspot.com/_UDN4j-Aji_4/St6y9SdtmNI/AAAAAAAA83o/eeVGo8KR0PI/s320/colayer-screen-OverviewPage.jpg" alt="" id="BLOGGER_PHOTO_ID_5394946169634658514" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The funny thing about Colayer's product (especially when compared to Google Wave) is that one "gets it" when first looking at it. It solves a problem I am facing in my work on a daily basis: where to put or find crucial information - on an internal mailing list or on the wiki?&lt;br /&gt;&lt;br /&gt;The Colayer application is delivered as a browser-based SaaS solution (mainly targeted towards company-internal collaboration). This limits potential usage scenarios outside of the firewall. It would be cool if Colayer found a way of opening up their application to other data sources or consumers. It would be worth it, the app rocks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-5464712224369365710?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/5464712224369365710/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=5464712224369365710" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/5464712224369365710?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/5464712224369365710?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/e_11CArD4Ak/colayers-approach-to-collaboration.html" title="Colayer's approach to collaboration software" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_UDN4j-Aji_4/St6yxCgUPwI/AAAAAAAA83g/eUNu84zFTxo/s72-c/colayer-screen-ColayerScreen.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/10/colayers-approach-to-collaboration.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAEQnw-cSp7ImA9WxNXE0U.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-2729812611935132778</id><published>2009-10-01T01:45:00.000-07:00</published><updated>2009-10-01T01:45:03.259-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-01T01:45:03.259-07:00</app:edited><title>Found out about FlexEvent.UPDATE_COMPLETE</title><content type="html">Here is a small bit about the asynchronous nature of the Flex layout mechanisms that I learned while slapping together a presales demo yesterday:&lt;br /&gt;
&lt;br /&gt;
When changing properties of &lt;a href="http://livedocs.adobe.com/flex/3/langref/mx/core/UIComponent.html"&gt;UIComponents&lt;/a&gt; listen for &lt;a href="http://livedocs.adobe.com/flex/3/langref/mx/events/FlexEvent.html#UPDATE_COMPLETE"&gt;FlexEvent.UPDATE_COMPLETE&lt;/a&gt; events. They get fired when the change is actually done. In my case I needed to get the textWidth of a &lt;a href="http://livedocs.adobe.com/flex/3/langref/mx/controls/Label.html"&gt;Label&lt;/a&gt; after changing the label text. Right after calling the setter of text the getter of textWidth will still return the old value.&lt;br /&gt;
&lt;br /&gt;
[Some &lt;a href="http://jonathanbranam.net/flex3anatomy/event/updateComplete"&gt;background reading&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-2729812611935132778?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/2729812611935132778/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=2729812611935132778" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/2729812611935132778?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/2729812611935132778?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/qZKGJdQ16Uc/found-out-about-flexeventupdatecomplete.html" title="Found out about FlexEvent.UPDATE_COMPLETE" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/10/found-out-about-flexeventupdatecomplete.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YARn07fSp7ImA9WxNXEkQ.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-4217157000138135692</id><published>2009-09-29T23:07:00.001-07:00</published><updated>2009-09-29T23:12:27.305-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-29T23:12:27.305-07:00</app:edited><title>Talk at Java User Group</title><content type="html">Yesterday, I gave a &lt;a href="http://www.jugs.ch/html/events/2009/rest.html"&gt;talk at the Java User Group Switzerland&lt;/a&gt; (JUGS) titled "Agile RESTful Web Development". It was about the REST style in principle and hands-on RESTful development with Apache Sling. I enjoyed giving the talk and think that it was well received. Here's the slide deck:&lt;br /&gt;&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_2094296"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/mmarth/agile-restful-web-development" title="Agile RESTful Web Development"&gt;Agile RESTful Web Development&lt;/a&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=restjugs-090930010641-phpapp02&amp;amp;rel=0&amp;amp;stripped_title=agile-restful-web-development"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=restjugs-090930010641-phpapp02&amp;amp;rel=0&amp;amp;stripped_title=agile-restful-web-development" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View more &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/mmarth"&gt;mmarth&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-4217157000138135692?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/4217157000138135692/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=4217157000138135692" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/4217157000138135692?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/4217157000138135692?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/7eQdyEQ4FwE/talk-at-java-user-group.html" title="Talk at Java User Group" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/09/talk-at-java-user-group.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAFRHk_cSp7ImA9WxNQEUQ.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-2476553882635765085</id><published>2009-09-17T05:43:00.001-07:00</published><updated>2009-09-17T06:05:15.749-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-17T06:05:15.749-07:00</app:edited><title>Ruby script for generating Google sitemaps</title><content type="html">I just wrote a small Ruby script to generate a &lt;a href="https://www.google.com/webmasters/tools/sitemap-list?hl=de&amp;amp;siteUrl=http%3A%2F%2Fdev.day.com%2F"&gt;Google sitemap&lt;/a&gt; out of file directory. I thought that it might come handy as a quick start for someone, so here is the code (requires the builder gem)&lt;br /&gt;&lt;br /&gt;require 'builder'&lt;br /&gt;htmlfiles = Dir.glob("*.html")&lt;br /&gt;x = Builder::XmlMarkup.new(:target =&gt; $stdout, :indent =&gt; 1)&lt;br /&gt;x.instruct!&lt;br /&gt;x.urlset( "xmlns" =&gt; "http://www.sitemaps.org/schemas/sitemap/0.9" ) {&lt;br /&gt;for file in htmlfiles do&lt;br /&gt;  x.url{x.loc "http://www.example.com/#{file}"; x.lastmod "2009-09-17"; x.changefreq "monthly"; x.priority "0.8"}&lt;br /&gt;end&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-2476553882635765085?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/2476553882635765085/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=2476553882635765085" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/2476553882635765085?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/2476553882635765085?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/39TgASnqLjc/ruby-script-for-generating-google.html" title="Ruby script for generating Google sitemaps" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/09/ruby-script-for-generating-google.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYFSXk8cCp7ImA9WxJUF0g.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-184992191049189785</id><published>2009-07-16T07:13:00.000-07:00</published><updated>2009-07-16T07:21:58.778-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-16T07:21:58.778-07:00</app:edited><title>NoSQL: A long-time relation(ship) comes to an end</title><content type="html">&lt;blockquote&gt;&lt;/blockquote&gt;(cross-posting from &lt;a href="http://dev.day.com/microsling/content/blogs/main/cambrian.html"&gt;here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;OK, I admit it, declaring that "&lt;a href="http://www.rgoarchitects.com/nblog/2007/08/21/TheRDBMSIsDead.aspx"&gt;the RDBMS is dead&lt;/a&gt;" is a meme that has been going around the software industry for a while. Remember object-oriented data bases that were supposed to replace the relational ones? Well, guess who is still here. However, despite the RDBMS's amazing survival skills I would like to propose a related prediction:&lt;br /&gt;&lt;br /&gt;I believe that the year 2009 will go down in history as the year when the "&lt;em&gt;relational model default&lt;/em&gt;" ended. The term "relational model default" was coined by me to describe a peculiar thing that goes on in application development: start talking to your average application developer about some arbitrary business requirement and chances are that simultaneously he mentally constructs a relational model to fit those requirements.&lt;br /&gt;&lt;p&gt;That relational approach to modeling your problem may or may not be suitable. The real problem is that all too often this default does not get challenged. As a consequence, whatever the fitting data model might be, it gets shoehorned into tables and relations.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;This default "thinking" has not yet changed for the masses, but I believe that it has changed for the early adopters (which means that invariably it will change for the masses in some years).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I see the default to change from:&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;"I need to store some data i.e. I need a relational database"&lt;/blockquote&gt;to:&lt;br /&gt;&lt;blockquote&gt;"I need to store something, let me see the data to decide how to store it."&lt;/blockquote&gt;The most concrete and visible manifestation of the rising interest in non-relational data store is the "NoSQL" movement. NoSQL denotes a group of people interested in exploring and comparing alternatives to the traditional relational data storages like MySQL or Postgres. The inaugural get-together has been covered in &lt;a href="http://www.computerworld.com/s/article/9135086/No_to_SQL_Anti_database_movement_gains_steam_"&gt;Computerworld&lt;/a&gt;, see also &lt;a href="http://blog.oskarsson.nu/2009/06/nosql-debrief.html"&gt;Johan Oskarsson's post&lt;/a&gt; and there is, of course, a &lt;a href="http://twitter.com/#search?q=%23nosql"&gt;Hashtag&lt;/a&gt;.&lt;br /&gt;&lt;p&gt;Other than the NoSQL group I have a second data point to offer: there is a &lt;a href="http://en.wikipedia.org/wiki/Cambrian_explosion"&gt;Cambrian Explosion&lt;/a&gt; happening in terms of projects exploring non-relational data stores. During the Cambrian Explosion a major diversification of organisms took place. Similarly a plethora of new  projects that explore alternatives to relational models continue to gain interest. Here is an incomplete list:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://www.franz.com/agraph/allegrograph/"&gt;AllegroGraph&lt;/a&gt;, &lt;a href="http://aws.amazon.com/simpledb/"&gt;Amazon's SimpleDB&lt;/a&gt;, &lt;a href="http://incubator.apache.org/cassandra/"&gt;Cassandra&lt;/a&gt;, &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;, &lt;a href="http://github.com/cliffmoon/dynomite/tree/master"&gt;Dynomite&lt;/a&gt;, &lt;a href="http://code.google.com/appengine/docs/python/datastore/"&gt;Google's App Engine datastore&lt;/a&gt;, &lt;a href="http://hadoop.apache.org/hbase/"&gt;HBase&lt;/a&gt;, &lt;a href="http://hypertable.org/"&gt;Hypertable&lt;/a&gt;, &lt;a href="http://kai.wiki.sourceforge.net/"&gt;Kai&lt;/a&gt;, &lt;a href="http://memcachedb.org/"&gt;MemcacheDB&lt;/a&gt;, &lt;a href="http://www.mongodb.org/"&gt;Mongo DB&lt;/a&gt;, &lt;a href="http://neo4j.org/"&gt;Neo4J&lt;/a&gt;,&lt;a href="http://www.openrdf.org/"&gt; OpenRDF&lt;/a&gt;, &lt;a href="http://project-voldemort.com/"&gt;Project Voldemort&lt;/a&gt;, &lt;a href="http://code.google.com/p/redis/"&gt;Redis&lt;/a&gt;, &lt;a href="http://github.com/tuulos/ringo/tree/master"&gt;Ringo&lt;/a&gt;, &lt;a href="http://code.google.com/p/scalaris/"&gt;Scalaris &lt;/a&gt;, &lt;a href="http://code.google.com/p/thrudb/"&gt;ThruDB&lt;/a&gt;, &lt;a href="http://tokyocabinet.sourceforge.net/"&gt;Tokyo Cabinet&lt;/a&gt; (and &lt;a href="http://tokyocabinet.sourceforge.net/tyrantdoc/"&gt;Tokyo Tyrant&lt;/a&gt; and &lt;a href="http://opensource.plurk.com/LightCloud/"&gt;LightCloud&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Last, but certainly not least, there are &lt;a href="http://jackrabbit.apache.org/"&gt;Apache Jackrabbit&lt;/a&gt; and &lt;a href="http://sling.apache.org/site/index.html"&gt;Apache Sling&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;From my perspective there are three main areas of innovation in this Cambrian Explosion of data stores:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;1. Models&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In the relational model you break down your data into tables and relations. This model implies that the data is somewhat tabular. However, in some cases the data simply is not tabular.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Consider web content, which is  hierarchical and mixes fine-granular data with binary files (this model is implemented in Jackrabbit). Other (not mutually exclusive) alternative models are document-oriented, key-value pairs, or Graphs/RDF.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;One very important aspect of many alternative models is that they are schemaless. That means that they accommodate for &lt;a href="http://www.betaversion.org/%7Estefano/linotype/news/93/"&gt;Data First&lt;/a&gt; approaches where it is not required to define the data structure before one can actually store any data. This enables agile approaches to software development in the short term as well as more flexibility in the long term evolution of business requirements.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Without defining a data structure first it is not possible to store anything at all in an RDBMS. This fact is probably one of the root causes of the relational default thinking. An RDBMS-based developer simply cannot develop anything without thinking about table structure.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;b&gt;2. Scalability&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A second area of innovation is scalability. This can be split down into two sections: One is scalability achieved by distributing the data store across separate machines, the approach pioneered by Google. Opposed to classical clustering of RDBMSs the order of magnitude of machines that are considered is hundreds rather than ten. Obviously, different trade-offs regarding consistency and availability of individual cluster nodes must be taken when architecting for such a high number of cluster nodes. &lt;a href="http://en.wikipedia.org/wiki/Eventual_consistency"&gt;Eventual consistency&lt;/a&gt; is one of the interesting concepts invented in this space.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;While the commoditization of server hardware triggered this first approach to scalability, a second area is related to the rise of multi-core processors. For a number of years CPUs have not gotten faster, but rather the number of cores has increased. There is no explicit contradiction in running a classical RDBMS on a multi-core machine and even having the RDBMS take advantage of them. However, it seems to me that the SQL language is a poor fit for queries in a multi-core environment when compared with alternatives such as &lt;a href="http://en.wikipedia.org/wiki/Map_reduce"&gt;Map/Reduce&lt;/a&gt; which are parallel by design.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;b&gt;3. Web&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The third area of innovation revolves around the fact that the web is the dominant paradigm for computing in our time. This is also acknowledged by the two considerations discussed above. However, a third one is that HTTP is used for accessing the data. Other types of connectivity that were typically implemented as JDBC or ODBC drivers are not needed/used anymore. In many cases the data store exposes its resources in a RESTful API. An obvious benefit is the ubiquitous availability of clients including the browser itself. The classical RDBMS approach involving a dedicated driver looks like a client-server architecture mindset in comparison (&lt;a href="http://dev.day.com/microsling/content/blogs/main/yourdataisyourserver.html"&gt;I wrote about this 1.5 years ago&lt;/a&gt;).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;At this point let me re-iterate that RDBMSs are here to stay, just like mainframes never went away. Moreover, a couple of the innovation areas cited above are not that new at all, especially, when it comes to non-relational data models (for example, I recently dug into the foundations of the Lotus Notes document store and came out very impressed). However, it is only now that the relational model default will disappear.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;What about content management systems?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Considering the content management system industry as a whole I am extremely happy about this shift away from RDBMSs. Especially the model aspect is crucial: RDBMSs embody a fundamentally wrong model for content. There are varying opinions in the industry about what "content" really is, but one thing is more or less universally accepted: it is (at least partially) &lt;em&gt;unstructured&lt;/em&gt;. Well, RDBMSs are designed for &lt;em&gt;structured&lt;/em&gt; data. Duh.&lt;br /&gt;&lt;p&gt;So why are there one gazillion LAMP-based CMSs? I blame the relational model default. But as this default vanishes we will see more and more CMSs that are not based on an RDBMS (see the Jackrabbit wiki for &lt;a href="http://wiki.apache.org/jackrabbit/JcrLinks"&gt;a list of JCR-based ones&lt;/a&gt;, as well as the recent PHP-based JCR implementations &lt;a href="https://fosswiki.liip.ch/display/jackalope/Home"&gt;Jackalope&lt;/a&gt; or for &lt;a href="http://forge.typo3.org/projects/show/package-typo3cr"&gt;Typo3&lt;/a&gt; or the &lt;a href="http://bergie.iki.fi/blog/midgard_and_jcr-a_look_at_two_content_repositories/"&gt;Midgard content repository&lt;/a&gt;).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Don't laugh, but I truly envision a better (CMS) world once more CMSs are built upon proper tools and not forced into a relational model anymore. It will be a better world for developers and consequently for the CMS users.&lt;br /&gt;&lt;/p&gt;&lt;span style="font-size:130%;"&gt;What about Day?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;REST and content repositories were invented and evangelized by Day's Chief Scientist Roy and Day's CTO David years ago already. So it is no surprise that Day's content management systems are in an excellent shape with respect to these considerations. &lt;a href="http://www.day.com/day/en/products.html"&gt;CQ5&lt;/a&gt; is built upon Apache Jackrabbit, i.e. a data store that implements a content-centric model, and Apache Sling, a web framework designed to be RESTful right from the start.&lt;br /&gt;&lt;p&gt;When it comes to scaling: a week ago we &lt;a href="http://twitter.com/SarahBurnett/status/2529615139"&gt;gave a live demonstration&lt;/a&gt; on how to install and cluster CQ5 on Amazon's EC2 service. But, expect even more exciting news in this area.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-184992191049189785?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/184992191049189785/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=184992191049189785" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/184992191049189785?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/184992191049189785?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/3uRjKSihuzQ/nosql-long-time-relationship-comes-to.html" title="NoSQL: A long-time relation(ship) comes to an end" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/07/nosql-long-time-relationship-comes-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkINQnY5cSp7ImA9WxJVEko.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-1891373238561952907</id><published>2009-06-29T03:14:00.000-07:00</published><updated>2009-06-29T03:16:33.829-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-29T03:16:33.829-07:00</app:edited><title>Jazoon 09 slides</title><content type="html">The slides shown in &lt;a href="http://michaelmarth.blogspot.com/2009/06/jazoon-talk-on-scalable-agile-web.html"&gt;my Jazoon talk&lt;/a&gt; are now online:&lt;br /&gt;&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_1653454"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/mmarth/jazoon-2009?type=powerpoint" title="Jazoon 2009"&gt;Jazoon 2009&lt;/a&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jazoon-2009-090629043757-phpapp02&amp;amp;stripped_title=jazoon-2009"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jazoon-2009-090629043757-phpapp02&amp;amp;stripped_title=jazoon-2009" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View more &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/mmarth"&gt;mmarth&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-1891373238561952907?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/1891373238561952907/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=1891373238561952907" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/1891373238561952907?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/1891373238561952907?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/r9s_OX1GbR4/jazoon-09-slides.html" title="Jazoon 09 slides" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/06/jazoon-09-slides.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMNQ3k4cCp7ImA9WxJWGE8.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-9088460773159160539</id><published>2009-06-22T04:38:00.000-07:00</published><updated>2009-06-24T00:11:32.738-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-24T00:11:32.738-07:00</app:edited><title>Jazoon talk on "Scalable Agile Web Development"</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UDN4j-Aji_4/Sj9tYsNrcEI/AAAAAAAA4ME/Oj5i8Pqf0Ls/s1600-h/jazoonlogo09_web.gif"&gt;&lt;img style="cursor: pointer; width: 320px; height: 70px;" src="http://3.bp.blogspot.com/_UDN4j-Aji_4/Sj9tYsNrcEI/AAAAAAAA4ME/Oj5i8Pqf0Ls/s320/jazoonlogo09_web.gif" alt="" id="BLOGGER_PHOTO_ID_5350115153292259394" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On Thursday, I will give a talk at the &lt;a href="http://jazoon.com/"&gt;Jazoon &lt;/a&gt;conference in Zurich. It will be about Apache Sling, the web framework for content-centric applications. The agenda is:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scalable Agile Web Development: REST meets JCR meets OSGI&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This session is a very hands-on lab that shows how a real web application is developed from scratch in a very agile fashion leveraging a heavy-weight enterprise ready back-end yet allowing for unprecedented agility in development in building rest-style web applications. Thinking of a classic j2ee stack this may sound like a contradiction.&lt;br /&gt;&lt;br /&gt;Agility of development begins with the amount of tooling and setup we need to get started, so expect to see the entire walk-through from installation of the server software to the development of a complete application within the time constraints of the session.&lt;br /&gt;&lt;br /&gt;Agenda:&lt;br /&gt;(1) Web architecture, think outside the box.&lt;br /&gt;(2) Meet: apache sling.&lt;br /&gt;(3) Building a real-life webapp from scratch.&lt;br /&gt;&lt;br /&gt;The full conference agenda is &lt;a href="http://jazoon.com/en/conference/schedule.html"&gt;here&lt;/a&gt;. I shall also help Michael Dürig with his session on &lt;a style="font-weight: bold;" href="http://jazoon.com/en/conference/presentationdetails.html?type=sid&amp;amp;detail=10080"&gt;Scala and Sling&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-9088460773159160539?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/9088460773159160539/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=9088460773159160539" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/9088460773159160539?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/9088460773159160539?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/9H4JPADgjNU/jazoon-talk-on-scalable-agile-web.html" title="Jazoon talk on &quot;Scalable Agile Web Development&quot;" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_UDN4j-Aji_4/Sj9tYsNrcEI/AAAAAAAA4ME/Oj5i8Pqf0Ls/s72-c/jazoonlogo09_web.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/06/jazoon-talk-on-scalable-agile-web.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcCRng7fyp7ImA9WxJSFk0.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-1856374086847775751</id><published>2009-05-06T03:46:00.001-07:00</published><updated>2009-05-06T03:51:07.607-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-06T03:51:07.607-07:00</app:edited><title>CMIS Technical Committee</title><content type="html">It has been a while since I have been on a standards committee (the last one was &lt;a href="http://www.omtp.org/"&gt;OMTP&lt;/a&gt;), but I have now joined the Technical Committee of &lt;a href="http://en.wikipedia.org/wiki/Content_Management_Interoperability_Services"&gt;CMIS&lt;/a&gt;: Content Management Interoperability Services. Better interop is certainly something the CMS world is in dire need of.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-1856374086847775751?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/1856374086847775751/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=1856374086847775751" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/1856374086847775751?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/1856374086847775751?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/aoP2y874UQg/cmis-technical-committee.html" title="CMIS Technical Committee" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/05/cmis-technical-committee.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YERng-eSp7ImA9WxJTGU0.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-8651360944482318883</id><published>2009-04-28T01:49:00.000-07:00</published><updated>2009-04-28T01:58:27.651-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-28T01:58:27.651-07:00</app:edited><title>minimeme.org says: Hello world!</title><content type="html">Today, I am happy to announce that &lt;a href="http://minimeme.org/"&gt;minimeme.org&lt;/a&gt; is finally "officially" going live. minimeme is a news aggregator focused on tech and software development news.&lt;br /&gt;&lt;br /&gt;minimeme was born out of a personal frustration of mine: each morning I would skim through my feed reader only to find the relevant items twice or more times. On the other hand the signal to noise ratio of many feeds was way too low. I felt like a machine trying to retrieve the important items. So I decided to build a machine to do that for me.&lt;br /&gt;&lt;br /&gt;There is no human intervention in the news selection - it is all done in a bias-free, neutral algorithm. Hence there is the claim "little Switzerland of tech news", minimeme is supposed to be neutral like Switzerland.&lt;br /&gt;&lt;br /&gt;Having tested the algorithm for a couple of months I believe minimeme is now stable enough to be officially let loose. On top of the two currently implemented sections "&lt;a href="http://minimeme.org/dev.html"&gt;dev&lt;/a&gt;" (&lt;a href="http://minimeme.org/dev.atom"&gt;feed&lt;/a&gt;) and "&lt;a href="http://minimeme.org/valley.html"&gt;valley&lt;/a&gt;" (&lt;a href="http://minimeme.org/valley.atom"&gt;feed&lt;/a&gt;) there is a &lt;a href="http://twitter.com/mnmm"&gt;Twitter account&lt;/a&gt; you might like to follow. "dev" covers software development aspects from Ruby to CSS to REST. In the "valley" section you will find news from Google to startups to gadgets.&lt;br /&gt;&lt;br /&gt;For the future I plan to add other topics as well as look into some recommendation algorithms. Let me now on the &lt;a href="http://minimeme.uservoice.com/pages/general"&gt;feedback forum&lt;/a&gt; which features you would like to see.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-8651360944482318883?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/8651360944482318883/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=8651360944482318883" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/8651360944482318883?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/8651360944482318883?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/M7JiApEAbS4/minimemeorg-says-hello-world.html" title="minimeme.org says: Hello world!" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/04/minimemeorg-says-hello-world.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIMQXg7fyp7ImA9WxVaGEQ.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-3001639244691562930</id><published>2009-04-16T07:54:00.000-07:00</published><updated>2009-04-16T08:09:40.607-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-16T08:09:40.607-07:00</app:edited><title>The Lifetime of a CMS Installation</title><content type="html">&lt;p&gt;(cross-posting from &lt;a href="http://dev.day.com/microsling/content/blogs/main/cmslifetime.html"&gt;here&lt;/a&gt;)&lt;/p&gt;CMS analyst &lt;a href="http://www.jboye.com/janus-boye/"&gt;Janus Boye&lt;/a&gt; has &lt;a href="http://www.jboye.com/blogpost/a-new-cms-every-3-years/"&gt;blogged about the expected lifetime of a CMS installation&lt;/a&gt;, i.e. for how long an installed CMS can be expected to be in production. His guess is a lifetime of 3 years. On the blog's comments Janus and I &lt;a href="http://www.jboye.com/blogpost/10-years-web-content-management-some-inconvenient-truths/"&gt;got into a discussion about the accuracy of that guess&lt;/a&gt; where &lt;a href="http://www.jboye.com/blogpost/10-years-web-content-management-some-inconvenient-truths/#comment-599"&gt;he asked Day to publish actual real data&lt;/a&gt; about this topic.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I like this idea because publishing this data provides a benefit to our potential new customers: a &lt;em&gt;reliable&lt;/em&gt; indicator (without any hand-waving or gut feelings) of the CMS's lifetime that &lt;em&gt;can be used in business plan&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;The data&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The data I have used is taken from Day's support contracts. Only customer data from outside ouf Europe was used (simply because it was available to me). This selection is likely to bias the results towards shorter lifetimes as Day's oldest customers are based in Europe. The basic assumption is that the life time of the CMS is equivalent to the duration of the support contract. The used end point of each contract period is the date up to which the contract is paid for as of today.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;You might argue that there could be customers that have a contract but do not actually use the product anymore, which could in fact be the case (I do not know of any). On the other hand, I am aware of customers that still use the product and have terminated their support contract. Therefore, in order to reduce &lt;a href="http://en.wikipedia.org/wiki/Selection_bias"&gt;selection bias&lt;/a&gt; I did not remove any data points due to this particular consideration.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;Each customer was counted once for each product he purchased, i.e. a customer that has two distinct support contracts for CRX and CQ was sampled twice. I discarded all OEM contracts because they are of their different nature (they would skew the result towards longer lifetimes). Finally, I also dropped a data point where the support contract was cancelled because the customer went out-of-business alltogether.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;I believe that this data set is reasonably unbiased to provide meaningful results with respect to the question of the lifetime of a customer's CQ/CRX installation.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;The Method&lt;/span&gt;&lt;/p&gt;Luckily for Day, the data is what is called "&lt;a href="http://en.wikipedia.org/wiki/Censoring_%28statistics%29"&gt;right censored&lt;/a&gt;". That means that it is unknown for how long an existing support contract will go on - actually the majority of the available data points are right censored.&lt;br /&gt;&lt;p&gt;The scientific discipline that is concerned with analyzing data of this kind is called "&lt;a href="http://en.wikipedia.org/wiki/Survival_analysis"&gt;survival analysis&lt;/a&gt;". One is interested in the &lt;a href="http://en.wikipedia.org/wiki/Survival_function"&gt;survival function&lt;/a&gt; which maps a set of events onto time. The survival function is a property of a random variable, i.e. it needs to be estimated (in &lt;a href="http://en.wikipedia.org/wiki/Estimator"&gt;the statistical sense of the word&lt;/a&gt;).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;One well know estimator for the survival function is the Kaplan-Meier estimator (which is &lt;a href="http://en.wikipedia.org/wiki/Nonparametric"&gt;non-parametric&lt;/a&gt;, i.e. there are no underlying assumptions about the distribution of the data). In a nutshell:&lt;/p&gt; &lt;p&gt;&lt;br /&gt;The Kaplan-Meier estimate of the survival function, S_hat(t), corresponds to the non-parametric MLE estimate of S(t). The resulting estimate is a step function that has jumps at observed event times, t&lt;sub&gt;i&lt;/sub&gt;. In general, it is assumed the t&lt;sub&gt;i&lt;/sub&gt; are ordered: 0 &lt;1&gt;i is d&lt;sub&gt;i&lt;/sub&gt;, and the number of individuals at risk (ie, who have not experienced the event) at a time before t&lt;sub&gt;i&lt;/sub&gt; is Y&lt;sub&gt;i&lt;/sub&gt;, then the Kaplan-Meier estimate of the survival function and its estimated variance is given by:&lt;/p&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_UDN4j-Aji_4/SedHco5kYZI/AAAAAAAA3h4/XNkG-_Bj8uk/s320/f1.png" alt="" id="BLOGGER_PHOTO_ID_5325303755423786690" border="0" /&gt;The quantity of interest is the mean survival time (and its respective estimate) which is given by:&lt;br /&gt;&lt;p&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SedHjQcWpsI/AAAAAAAA3iA/kLTuOHtaOYg/s320/f2.png" alt="" id="BLOGGER_PHOTO_ID_5325303755423786690" border="0" /&gt;&lt;/p&gt;Because S(t) may not converge to zero, the estimate may diverge. Therefore the integral is only taken up to a finite number. A reasonable choice of is the largest observed or censored time.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;Results&lt;/span&gt;&lt;/p&gt;Resisting a geek's urge to implement the estimator myself I used the freely available &lt;a href="http://www.r-project.org/"&gt;R&lt;/a&gt; to calculate the results. Here is a plot of the Kaplan-Meier estimate for the survival function with 95% confidence bounds (time is in days):&lt;br /&gt;&lt;p&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_UDN4j-Aji_4/SedIr4ZqIdI/AAAAAAAA3iI/pdiGct9-MUI/s320/plot.png" alt="" id="BLOGGER_PHOTO_ID_5325303755423786690" border="0" /&gt;&lt;/p&gt;And finally, the estimated value for the mean survival time, i.e. the estimated lifetime of a Day CMS installation is: 2453 days with a standard deviation of 154 days. &lt;b&gt;That's about 6.7 years&lt;/b&gt;. Mind you, this result is likely to be lower than if the whole customer base had been analyzed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-3001639244691562930?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/3001639244691562930/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=3001639244691562930" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/3001639244691562930?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/3001639244691562930?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/rr-8OPp6mrg/lifetime-of-cms-installation.html" title="The Lifetime of a CMS Installation" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_UDN4j-Aji_4/SedHco5kYZI/AAAAAAAA3h4/XNkG-_Bj8uk/s72-c/f1.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/04/lifetime-of-cms-installation.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UGSX4-eyp7ImA9WxVVEks.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-7364826073033313430</id><published>2009-03-05T06:50:00.000-08:00</published><updated>2009-03-05T07:00:28.053-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-05T07:00:28.053-08:00</app:edited><title>HATEOAS in 3 lines</title><content type="html">&lt;a href="http://www.innoq.com/blog/st/"&gt;Stefan Tilkov&lt;/a&gt; brilliantly sums up the out-of-band information problem in REST's HATEOAS constraint &lt;a href="http://tech.groups.yahoo.com/group/rest-discuss/message/12195"&gt;on the REST-discuss group&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Given the representation contains&lt;br /&gt;&lt;br /&gt;&amp;lt;link rel="some-concept" ref="/some-uri"&gt;&lt;br /&gt;&lt;br /&gt;you don't hardcode the string "/some-uri" into your client, but rather the string "some-concept".&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-7364826073033313430?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/7364826073033313430/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=7364826073033313430" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/7364826073033313430?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/7364826073033313430?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/sQCjm8_cbRk/hateoas-in-3-lines.html" title="HATEOAS in 3 lines" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/03/hateoas-in-3-lines.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYBRn88fSp7ImA9WxVVEk0.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-6645897326242960109</id><published>2009-03-04T12:44:00.000-08:00</published><updated>2009-03-04T13:45:57.175-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-04T13:45:57.175-08:00</app:edited><title>The misuse of the term "RESTful" in the Rails community</title><content type="html">Today I went to a talk at the local Ruby on Rails group. The speaker was quite clueful. He had even implemented his own DSL to describe his business problem. Obviously, the guy was not a noobie in Ruby.&lt;br /&gt;&lt;br /&gt;However, what really turned me off was his usage of the word "RESTful". For him, it seemed to be a way to describe the inner workings of his application, like, say, "separation of concerns". RoR guys are generally not the most clueless people, but nobody in the audience challenged him about this. It seemed to be the generally accepted usage of the term in the Rails community.&lt;br /&gt;&lt;br /&gt;This made me think that DHH and Rails have done two things to REST:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;First, they greatly help to evangelize the term "RESTful"&lt;/li&gt;&lt;li&gt;Second, they hijacked the meaning of the term and changed it from "architectural style" to "application architecture"&lt;/li&gt;&lt;/ul&gt;As it happens I listened to a podcast from the Pragmatic Programmers on my way home. It was about the .Net Ruby implementation and, of course, Rails and consequently REST were brought up. One of the speakers said that he was only introduced to REST through Rails. He went on to explain REST in way that confused the hell out of me, but the essence was along the lines of "http is good". If the Rails community is fuzzy about what REST is, people who get it second hand from them are as well.&lt;br /&gt;&lt;br /&gt;I believe that a &lt;span style="font-style: italic;"&gt;part &lt;/span&gt;of the misunderstanding is that the term "&lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/net_arch_styles.htm"&gt;architectural style&lt;/a&gt;" (as opposed to "architecture") is not understood well enough in the development community. However, Roy Fielding has written a brilliant post about that difference between an architectural style and an architecture: "&lt;a href="http://roy.gbiv.com/untangled/2008/on-software-architecture"&gt;On Software Architecture&lt;/a&gt;".&lt;br /&gt;&lt;blockquote&gt;Web implementations are not equivalent to Web architecture and Web architecture is not equivalent to the REST style.&lt;/blockquote&gt;RESTful-Rails-people please have a look at that post.&lt;br /&gt;&lt;br /&gt;PS: &lt;a href="http://www.nofluffjuststuff.com/blog/ted_neward/2009/01/2009_predictions_2008_predictions_revisited.html"&gt;Ted Neward had some predictions for 2009&lt;/a&gt; (as I silently predicted, nobody cared that I did not make any predictions for 2009), one of them just came to my mind (emphasis mine):&lt;br /&gt;&lt;blockquote&gt;Roy Fielding will officially disown most of the "REST"ful authors and software packages available. Nobody will care--or worse, somebody looking to make a name for themselves will proclaim that Roy "doesn't really understand REST". And they'll be right--Roy doesn't understand &lt;span style="font-weight: bold;"&gt;what &lt;/span&gt;&lt;em style="font-weight: bold;"&gt;they&lt;/em&gt;&lt;span style="font-weight: bold;"&gt; consider to be REST&lt;/span&gt;, and the fact that he created the term will be of no importance anymore. Being &lt;span style="font-weight: bold;"&gt;"REST"ful will equate to "I did it myself!"&lt;/span&gt;, complete with expectations of a gold star and a lollipop.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-6645897326242960109?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/6645897326242960109/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=6645897326242960109" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/6645897326242960109?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/6645897326242960109?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/Z5XgwtJzgf8/misuse-of-term-restful-in-rails.html" title="The misuse of the term &quot;RESTful&quot; in the Rails community" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/03/misuse-of-term-restful-in-rails.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IARnc5eSp7ImA9WxVQEEk.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-6745499558787298007</id><published>2009-01-27T00:24:00.001-08:00</published><updated>2009-01-27T00:39:07.921-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-27T00:39:07.921-08:00</app:edited><title>Microformat rel-tags are a broken spec</title><content type="html">In my current pet project I do a fair amount of parsing of &lt;a href="http://microformats.org/wiki/rel-tag"&gt;rel-tags&lt;/a&gt; (the microformat spec for "tagging"). At first I got a bit agitated how many occurrences there are where the spec is not implemented correctly. But I have come to realize that the spec is simply broken. There are two ways I can think of a spec to be broken:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;If it's internally inconsistent or inconsistent with other specs.&lt;/li&gt;&lt;li&gt;If it's somehow useless.&lt;/li&gt;&lt;/ol&gt;The rel-tag is almost 1.), which makes it a little bit of 2.). Here's why: the spec says that this tag&lt;br /&gt;&lt;pre&gt;&amp;lt;a href="http://technorati.com/tag/tech" rel="tag"&gt;fish&amp;lt;/a&gt;&lt;/pre&gt;denotes "tech" rather than "fish." This means that this microformat restricts the URL space on your server. You need to have the "tag" folder and in it there must be a file "tech" - unless you link to another site which is not a solution to the problem.&lt;br /&gt;Being able to control my own URL space is one of the pronciples of the web. That's what I mean with "the rel-tag spec is inconsistent with other specs." The problem is much the same as with the &lt;a href="http://en.wikipedia.org/wiki/Favicon"&gt;/favicon.ico&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;The use of a &lt;i&gt;reserved location&lt;/i&gt; on a website conflicts with the &lt;a href="http://www.w3.org/TR/webarch/" class="external text" title="http://www.w3.org/TR/webarch/" rel="nofollow"&gt;Architecture of the World Wide Web&lt;/a&gt; and is known as &lt;i&gt;link squatting&lt;/i&gt; or &lt;i&gt;URI squatting&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;As a result there is endless rel-tags on the web that are constructed like:&lt;br /&gt;&lt;pre&gt;http://somesite/tags/default.asp?tag=tech&lt;/pre&gt; or similar. This has &lt;a href="http://weblog.200ok.com.au/2006/01/limitations-of-rel-microformat.html"&gt;been spotted previously&lt;/a&gt;, of course. I wonder why this criticism  has not been addressed so far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-6745499558787298007?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/6745499558787298007/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=6745499558787298007" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/6745499558787298007?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/6745499558787298007?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/5cz1qGoLm_I/microformat-rel-tags-are-broken-spec.html" title="Microformat rel-tags are a broken spec" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/01/microformat-rel-tags-are-broken-spec.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UBRHw6eCp7ImA9WxVSEk4.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-342842665622297239</id><published>2009-01-06T00:37:00.000-08:00</published><updated>2009-01-06T00:40:55.210-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-06T00:40:55.210-08:00</app:edited><title>One button - endless possibilities</title><content type="html">By pure chance I found a useful feature on my iPhone: when you play music but have another application in the foreground double-clicking "the" button will bring up a mini iPod control. That's nice e.g. for skipping a song without having to leave the app in the foreground.&lt;br /&gt;&lt;br /&gt;Related news from the Macworld:&lt;br /&gt;&lt;br /&gt;&lt;embed src="http://www.theonion.com/content/themes/common/assets/videoplayer/flvplayer.swf" allowScriptAccess="always" type="application/x-shockwave-flash" wmode="transparent" flashvars="file=http://www.theonion.com/content/xml/92328/video&amp;amp;debugging=true&amp;amp;autostart=false&amp;amp;image=http://www.theonion.com/content/files/images/NO_KEYBOARD_article.jpg&amp;amp;bufferlength=3&amp;amp;embedded=true&amp;amp;title=Apple%20Introduces%20Revolutionary%20New%20Laptop%20With%20No%20Keyboard" height="355" width="400" &gt;&lt;/embed&gt;&lt;br/&gt;&lt;a href="http://www.theonion.com/content/node/92328?utm_source=embedded_video"&gt;Apple Introduces Revolutionary New Laptop With No Keyboard&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-342842665622297239?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/342842665622297239/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=342842665622297239" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/342842665622297239?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/342842665622297239?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/_YT5rP7t3CI/one-button-endless-possibilities.html" title="One button - endless possibilities" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2009/01/one-button-endless-possibilities.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEDQnkzfip7ImA9WxRWF0Q.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-7694500414768668814</id><published>2008-11-04T01:06:00.001-08:00</published><updated>2008-11-04T01:24:33.786-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-04T01:24:33.786-08:00</app:edited><title>Java and XML</title><content type="html">I'll scream if I read the word "pluggable" once more... I mean, seriously, how hard can you make simple things?&lt;br /&gt;&lt;br /&gt;Don't know what I mean? Dig this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Think about it this way: JDOM ships with the Apache Xerces parser. That parser isn't part of JDOM, but is used by JDOM, so it's included to ensure that JDOM is usable out of the box. The same principle applies for JAXP, but it isn't as clearly publicized: JAXP comes with a parser so it can be used immediately. However, many people refer to the classes included in Sun's parser as part of the JAXP API itself. For example, a common question on newsgroups used to be, "How can I use the XMLDocument class that comes with JAXP? What is its purpose?" The answer is somewhat complicated.&lt;br /&gt;&lt;br /&gt;First, the com.sun.xml.tree.XMLDocument class is not part of JAXP. It is part of Sun's Crimson parser, packaged in earlier versions of JAXP. So the question is misleading from the start. Second, a major purpose of JAXP is to provide vendor independence when dealing with parsers. With JAXP, you can use the same code with Sun's XML parser, Apache's Xerces XML parser, and Oracle's XML parser. Using a Sun-specific class, then, violates the point of using JAXP. Are you starting to see how this subject has gotten muddied? The parser and the API in the JAXP distribution have been lumped together, and some developers mistake classes and features from one as part of the other, and vice versa.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;From &lt;a href="http://www.developertutorials.com/tutorials/java/all-about-jaxp-1-050714/page2.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Who does really want vendor-independence in an XML processing API?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-7694500414768668814?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/7694500414768668814/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=7694500414768668814" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/7694500414768668814?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/7694500414768668814?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/UY9jx1RvcQQ/java-and-xml.html" title="Java and XML" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2008/11/java-and-xml.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkECRXk8eip7ImA9WxRTF0Q.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-1285411364845433762</id><published>2008-09-07T07:32:00.000-07:00</published><updated>2008-09-07T07:44:24.772-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-07T07:44:24.772-07:00</app:edited><title>Wrangling with GMail</title><content type="html">OK, here's a rant:&lt;br /&gt;&lt;br /&gt;10 years of Google. And it's beginning to treat its customers(*) like MS. Today, I wanted to mail myself(!) a zip file as a backup. Gmail wouldn't let me, though, because the zip contained "an executable,... blah, security". Well, yes, there was a .bat in the zip. But this sure reminded me of long-gone days when my employers forced me to use Outlook (which did not not allow to open received executables unless you really really wanted to and hacked the registry). When will we see a GMail Clippy?&lt;br /&gt;&lt;br /&gt;Btw: if you ever wondered what happened to MS's Clippy:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blogs.msdn.com/blogfiles/officeoffline/WindowsLiveWriter/Donotgogentleintothatgoodnightpart3_90BD/Do%20not%20go%20gentle%20into%20that%20good%20night%20--%20part%203_ebbeb878-86ca-4261-94d1-ce4e7aad6c36.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://blogs.msdn.com/blogfiles/officeoffline/WindowsLiveWriter/Donotgogentleintothatgoodnightpart3_90BD/Do%20not%20go%20gentle%20into%20that%20good%20night%20--%20part%203_ebbeb878-86ca-4261-94d1-ce4e7aad6c36.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;From: &lt;a href="http://blogs.msdn.com/officeoffline/archive/2008/05/27/do-not-go-gentle-into-that-good-night-part-3.aspx"&gt;http://blogs.msdn.com/officeoffline/archive/2008/05/27/do-not-go-gentle-into-that-good-night-part-3.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(*) yes, I am a paying customer. I bought storage space.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-1285411364845433762?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/1285411364845433762/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=1285411364845433762" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/1285411364845433762?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/1285411364845433762?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/7V1Dq3gQTEM/wrangling-with-gmail.html" title="Wrangling with GMail" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2008/09/wrangling-with-gmail.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04CQX0_cCp7ImA9WxRTFE8.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-8458160191204924828</id><published>2008-09-02T09:55:00.000-07:00</published><updated>2008-09-02T23:06:00.348-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-02T23:06:00.348-07:00</app:edited><title>Social Network Application Development</title><content type="html">Today, I gave a talk about development of applications within social networks at the Internet Briefing in Zurich. It was mostly about marketing aspects, rather than technology. Find the slides (in German) below (or &lt;a href="http://marth.ch/static/socialapps.pdf"&gt;download them here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px;text-align:left" id="__ss_579471"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/mmarth/socialapps-presentation?src=embed" title="Socialapps"&gt;Socialapps&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=socialapps-1220374541514450-9&amp;stripped_title=socialapps-presentation" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=socialapps-1220374541514450-9&amp;stripped_title=socialapps-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View SlideShare &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/mmarth/socialapps-presentation?src=embed" title="View Socialapps on SlideShare"&gt;presentation&lt;/a&gt; or &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/upload?src=embed"&gt;Upload&lt;/a&gt; your own.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-8458160191204924828?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/8458160191204924828/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=8458160191204924828" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/8458160191204924828?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/8458160191204924828?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/hSmC_JrtEqs/social-network-application-development.html" title="Social Network Application Development" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2008/09/social-network-application-development.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YHR3o6eSp7ImA9WxRTEko.&quot;"><id>tag:blogger.com,1999:blog-31254910.post-6327046345892107426</id><published>2008-09-01T07:21:00.001-07:00</published><updated>2008-09-01T07:25:36.411-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-01T07:25:36.411-07:00</app:edited><title>Finally, Outlook makes sense</title><content type="html">Ever got an email from an Outlook user only to get an "email recalled" message afterwards (cf. &lt;a href="http://en.wikipedia.org/wiki/Eternal_September"&gt;Eternal September&lt;/a&gt;)? I just found out out that this is just a elaborate way of grabbing your attention. Hmm, I should do a Thunderbird plugin that sends fake recall mails...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blogs.msdn.com/blogfiles/officeoffline/WindowsLiveWriter/Rubbernecking2.0_89D6/Rubber-necking%2020_f8c0a6c6-f70d-429b-959f-d15a882e7a0b.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px;" src="http://blogs.msdn.com/blogfiles/officeoffline/WindowsLiveWriter/Rubbernecking2.0_89D6/Rubber-necking%2020_f8c0a6c6-f70d-429b-959f-d15a882e7a0b.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;(this is from: &lt;a href="http://blogs.msdn.com/officeoffline/archive/2008/08/29/rubber-necking-2-0.aspx"&gt;http://blogs.msdn.com/officeoffline/archive/2008/08/29/rubber-necking-2-0.aspx&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31254910-6327046345892107426?l=michaelmarth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://michaelmarth.blogspot.com/feeds/6327046345892107426/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=31254910&amp;postID=6327046345892107426" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/6327046345892107426?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/31254910/posts/default/6327046345892107426?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/CoffeeGems/~3/nRxx-TROpNE/finally-outlook-makes-sense.html" title="Finally, Outlook makes sense" /><author><name>Michael Marth</name><uri>http://www.blogger.com/profile/03925861261744910154</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/SUeD8wPkY9I/AAAAAAAAmyw/aNzQyc24UuU/S220/0e7e11a6f.4392315.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://michaelmarth.blogspot.com/2008/09/finally-outlook-makes-sense.html</feedburner:origLink></entry></feed>

