<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:planet="http://planet.intertwingly.net/" xmlns:indexing="urn:atom-extension:indexing" indexing:index="no"><access:restriction xmlns:access="http://www.bloglines.com/about/specs/fac-1.0" relationship="deny"/>
  <title>PlanetDay</title>
  <updated>2010-09-03T03:00:27Z</updated>
  <generator uri="http://intertwingly.net/code/venus/">Venus</generator>
  <author>
    <name>Lars Trieloff</name>
    <email>lars.trieloff@day.com</email>
  </author>
  <id>http://dev.day.com/planetday/atom.xml</id>
  <link href="http://dev.day.com/planetday/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://dev.day.com/planetday/" rel="alternate"/>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=337</id>
    <link href="http://jukkaz.wordpress.com/2010/08/26/age-discrimination-with-clojure/" rel="alternate" type="text/html"/>
    <title>Age discrimination with Clojure</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Michael Dürig, a colleague of mine and big fan of Scala, wrote a nice post about the relative complexity of Scala and Java. Such comparisons are of course highly debatable, as seen in the comments that Michi’s post sparked, but for the fun of it I wanted to see what the equivalent code would look [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=337&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://michid.wordpress.com/">Michael Dürig</a>, a colleague of mine and big fan of <a href="http://www.scala-lang.org/">Scala</a>, wrote a <a href="http://michid.wordpress.com/2010/08/24/so-scala-is-too-complex/" title="So Scala is too complex?">nice post</a> about the relative complexity of Scala and Java.</p>
<p>Such comparisons are of course highly debatable, as seen in the comments that Michi’s post sparked, but for the fun of it I wanted to see what the equivalent code would look like in <a href="http://clojure.org/">Clojure</a>, my favourite post-Java language.</p>
<pre class="brush: clojure;">(use '[clojure.contrib.seq :only (separate)])

(defstruct person :name :age)

(def persons
  [(struct person "Boris" 40)
   (struct person "Betty" 32)
   (struct person "Bambi" 17)])

(let [[minors majors] (separate #(&lt;= (% :age) 18) persons)]
  (println minors)
  (println majors))
</pre>
<p>The output is:</p>
<pre class="brush: clojure;">({:name Bambi, :age 17})
({:name Boris, :age 40} {:name Betty, :age 32})
</pre>
<p>I guess the consensus among post-Java languages is that features like JavaBean-style structures and functional collection algorithms should either be a built-in part of the language or at least trivially implementable in supporting libraries.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/337/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/337/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/337/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/337/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/jukkaz.wordpress.com/337/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jukkaz.wordpress.com/337/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/jukkaz.wordpress.com/337/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jukkaz.wordpress.com/337/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/337/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/337/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/337/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/337/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/337/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/337/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=337&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-08-26T16:12:15Z</updated>
    <category term="General"/>
    <category term="clojure"/>
    <category term="Java"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-09-03T03:00:13Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://bdelacretaz.wordpress.com/?p=1393</id>
    <link href="http://grep.codeconsult.ch/2010/08/26/so-java-is-more-complex-than-scala-you-must-be-kidding/" rel="alternate" type="text/html"/>
    <title>So Java is more complex than Scala? You must be kidding</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">My esteemed colleague Michael Duerig posts about Scala code being simpler than java. His Scala example is beautiful, no question about it: object ScalaMain { case class Person(name: String, age: Int) val persons = List( Person("Boris", 40), Person("Betty", 32), Person("Bambi", 17)) val (minors, majors) = persons.partition(_.age &lt;= 18) def main(args: Array[String]) = { println (minors.mkString(", [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1393&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>My esteemed colleague Michael Duerig posts about <a href="http://michid.wordpress.com/2010/08/24/so-scala-is-too-complex/">Scala code being simpler than java</a>.</p>
<p>His Scala example is beautiful, no question about it:</p>
<pre>object ScalaMain {
  case class Person(name: String, age: Int)

  val persons = List(
    Person("Boris", 40),
    Person("Betty", 32),
    Person("Bambi", 17))

  val (minors, majors) = persons.partition(_.age &lt;= 18) 

  def main(args: Array[String]) = {
    println (minors.mkString(", "))
    println (majors.mkString(", "))
  }
}
</pre>
<p>Though I wonder how many Scala programmers are actually able to come up with such concise and elegant code.</p>
<p>Michi’s corresponding java example, however, is…let’s say <em>horrible</em>. Like making things as complex and bloated as they can be.</p>
<p>Here’s my (slightly) more elegant Java version:</p>
<pre>import java.util.List;
import java.util.ArrayList;
import java.util.HashMap;

public class Person extends HashMap&lt;String, Object&gt; {

    public Person(String name, int age) {
        put("name", name);
        put("age", age);
    }

    public static void main(String args[]) {
        final Person [] persons = {
            new Person("Boris", 40),
            new Person("Betty", 32),
            new Person("Bambi", 17),
        };

        List&lt;Person&gt; minors = new ArrayList&lt;Person&gt;();
        List&lt;Person&gt; majors = new ArrayList&lt;Person&gt;();

        for(Person p : persons) {
            if( (Integer)p.get("age") &lt;= 18 ) {
                minors.add(p);
            } else {
                majors.add(p);
            }
        }

        System.out.println(minors);
        System.out.println(majors);

        // Output:
        // [{age=17, name=Bambi}]
        // [{age=40, name=Boris}, {age=32, name=Betty}]
    }
}
</pre>
<p>Not bad hey? 37 lines all included, and although Java does require more boilerplate code, it’s not too bad.</p>
<p>All this is kinda tongue in cheek, ok? We could start all sorts of flame wars about type safety, generics and dynamic programming – my point is just that elegant and ugly code can be written in any language. </p>
<p>Scala definitely helps with conciseness, but in my opinion Java does not require things to be as bloated as some of those language wars examples show.</p>
<p>I’m on my way to Michi’s office to sort this out face to face as well ;-)</p>
<p><em>Update: face to face discussion went well, we agreed to not start religious wars…and in the meantime, here are two additional (and more serious) posts on the subject:</em></p><em>
<ul>
<li>
<a href="http://lamp.epfl.ch/~odersky/blogs/isscalacomplex.html">Simple or Complicated</a>, by Martin Odersky.
</li>
<li>
<a href="http://warpedjavaguy.wordpress.com/2010/08/02/the-scala-is-too-complex-conspiracy-1/">The “Scala is too Complex” Conspiracy</a> by WarpedJavaGuy.
</li>
</ul>
</em><p><em/></p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1393/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1393/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/bdelacretaz.wordpress.com/1393/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bdelacretaz.wordpress.com/1393/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/bdelacretaz.wordpress.com/1393/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bdelacretaz.wordpress.com/1393/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/bdelacretaz.wordpress.com/1393/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bdelacretaz.wordpress.com/1393/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/bdelacretaz.wordpress.com/1393/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bdelacretaz.wordpress.com/1393/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/bdelacretaz.wordpress.com/1393/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bdelacretaz.wordpress.com/1393/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/bdelacretaz.wordpress.com/1393/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bdelacretaz.wordpress.com/1393/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1393&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-08-26T11:48:07Z</updated>
    <category term="Java"/>
    <category term="java"/>
    <category term="programming"/>
    <category term="scala"/>
    <author>
      <name>bdelacretaz</name>
    </author>
    <source>
      <id>http://grep.codeconsult.ch</id>
      <logo>http://0.gravatar.com/blavatar/e6e901bd190e100a6787d0252d1f244f?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://grep.codeconsult.ch/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://grep.codeconsult.ch" rel="alternate" type="text/html"/>
      <link href="http://grep.codeconsult.ch/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://grep.codeconsult.ch/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>cat /dev/brain | egrep -i 'tech|thoughts|noise'</subtitle>
      <title>bertrand's brain grep</title>
      <updated>2010-09-03T03:00:04Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://michid.wordpress.com/?p=230</id>
    <link href="http://michid.wordpress.com/2010/08/24/so-scala-is-too-complex/" rel="alternate" type="text/html"/>
    <title>So Scala is too complex?</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">There is currently lots of talk about Scala being to complex. Instead of more arguing I implemented the same bit of functionality in Scala and in Java and let everyone decide for themselves. There is some nice example code in the manual to the The Scala 2.8 Collections API which partitions a list of persons [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=michid.wordpress.com&amp;blog=2538862&amp;post=230&amp;subd=michid&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>There is currently <a href="http://warpedjavaguy.wordpress.com/2010/08/02/the-scala-is-too-complex-conspiracy-1/">lots of talk</a> about <a href="http://www.scala-lang.org/">Scala</a> being to complex. Instead of more arguing I implemented the same bit of functionality in Scala and in Java and let everyone decide for themselves. </p>
<p>There is some nice example code in the manual to the <a href="http://lampwww.epfl.ch/~odersky/whatsnew/collections-api/collections.html">The Scala 2.8 Collections API</a> which partitions a list of persons into two lists of minors and majors. Below are the fleshed out implementations in Scala and Java.</p>
<p>First Scala:</p>
<pre class="brush: java;">object ScalaMain {
  case class Person(name: String, age: Int)

  val persons = List(
    Person("Boris", 40),
    Person("Betty", 32),
    Person("Bambi", 17))

  val (minors, majors) = persons.partition(_.age &lt;= 18) 

  def main(args: Array[String]) = {
    println (minors.mkString(", "))
    println (majors.mkString(", "))
  }
}
</pre>
<p>And now Java:</p>
<pre class="brush: java;">import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

class Person {
    private final String name;
    private final int age;

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public boolean equals(Object other) {
        if (this == other) {
            return true;
        }
        else if (other instanceof Person) {
            Person p = (Person) other;
            return name == null ? p.name == null : name.equals(p.name)
                    &amp;&amp; age == p.age;

        }
        else {
            return false;
        }
    }

    @Override
    public int hashCode() {
        int h = name == null ? 0 : name.hashCode();
        return 39*h + age;
    }

    @Override
    public String toString() {
        return new StringBuilder("Person(")
            .append(name).append(",")
            .append(age).append(")").toString();
    }
}

public class JavaMain {

    private final static List&lt;Person&gt; persons = Arrays.asList(
        new Person("Boris", 40),
        new Person("Betty", 32),
        new Person("Bamby", 17));

    private static List&lt;Person&gt; minors = new ArrayList&lt;Person&gt;();
    private static List&lt;Person&gt; majors = new ArrayList&lt;Person&gt;();

    public static void main(String[] args) {
        partition(persons, minors, majors);
        System.out.println(mkString(minors, ","));
        System.out.println(mkString(majors, ","));
    }

    private static void partition(List&lt;? extends Person&gt; persons,
            List&lt;? super Person&gt; minors, List&lt;? super Person&gt; majors) {

        for (Person p : persons) {
            if (p.getAge() &lt;= 18) minors.add(p);
            else majors.add(p);
        }
    }

    private static &lt;T&gt; String mkString(List&lt;T&gt; list, String separator) {
        StringBuilder s = new StringBuilder();
        Iterator&lt;T&gt; it = list.iterator();
        if (it.hasNext()) {
            s.append(it.next());
        }
        while (it.hasNext()) {
            s.append(separator).append(it.next());
        }
        return s.toString();
    }

}
</pre>
<p>Impressive huh? And the Java version is not even entirely correct since its equals() method might not cope correctly with super classes of Person.</p>
<br/>Filed under: <a href="http://michid.wordpress.com/category/uncategorized/">Uncategorized</a> Tagged: <a href="http://michid.wordpress.com/tag/java/">Java</a>, <a href="http://michid.wordpress.com/tag/scala/">Scala</a> <a href="http://feeds.wordpress.com/1.0/gocomments/michid.wordpress.com/230/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/michid.wordpress.com/230/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/michid.wordpress.com/230/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/michid.wordpress.com/230/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/michid.wordpress.com/230/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/michid.wordpress.com/230/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/michid.wordpress.com/230/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/michid.wordpress.com/230/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/michid.wordpress.com/230/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/michid.wordpress.com/230/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/michid.wordpress.com/230/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/michid.wordpress.com/230/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/michid.wordpress.com/230/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/michid.wordpress.com/230/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=michid.wordpress.com&amp;blog=2538862&amp;post=230&amp;subd=michid&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-08-24T21:04:04Z</updated>
    <category term="Uncategorized"/>
    <category term="Java"/>
    <category term="Scala"/>
    <author>
      <name>michid</name>
    </author>
    <source>
      <id>http://michid.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/8a44e33f0c0b6ba0377f3633082fb84d?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://michid.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://michid.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://michid.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://michid.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Hacking Scala</subtitle>
      <title>Michid's Weblog</title>
      <updated>2010-09-03T03:00:23Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://bdelacretaz.wordpress.com/?p=1391</id>
    <link href="http://grep.codeconsult.ch/2010/07/30/adobe-day-and-open-source-a-dream-and-a-nightmare/" rel="alternate" type="text/html"/>
    <title>Adobe, Day and Open Source: a dream and a nightmare</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">What does the acquisition of Day by Adobe mean for Day’s open source activities? Some people are disappointed by the lack of comments about this in the official announcements to date. Thankfully, Erik Larson, senior director of product management and strategy at Adobe, commented on Glyn Moody’s blog post quite early in the frenzy of [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1391&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>What does <a href="http://www.day.com/day/en/company/adobefaq.html">the acquisition of Day by Adobe</a> mean for Day’s open source activities? Some people are disappointed by the lack of comments about this in the official announcements to date.</p>
<p>Thankfully, Erik Larson, senior director of product management and strategy at Adobe, commented on <a href="http://www.computerworlduk.com/community/blogs/index.cfm?blogid=14&amp;entryid=3098">Glyn Moody’s blog post</a> quite early in the frenzy of tweets and blog posts that followed yesterday’s announcement. </p>
<p>Quoting him:</p>
<blockquote><p>
…we are very excited for Day’s considerable “open source savvy” to expand Adobe’s already significant open source efforts and expertise. That is a strategic benefit of the combination of the two companies. I have personally learned a lot from David Nuscheler and his team in the past few months as we put the deal together.
</p></blockquote>
<p>Not bad for a start, but we’re engineers right? Used to consider the worst case, to make sure we’re prepared for it.</p>
<p>Me, I’m an engineer but also an optimistic, and I’m used to start with the ideal, happy case when analyzing situations. It helps focus my efforts on a worthy goal.</p>
<p>So let’s do this and dream about the best and worst cases. This is absolutely 100% totally my own dreams, I’m not speaking for anyone here, not wearing any hat. Just dreamin’, y’know?</p>
<h5 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">The Dream</h5>
<p>This is late 2011.</p>
<p>The last few months have more than confirmed that Day’s acquisition by Adobe, one year ago, happened for <em>strategic</em> reasons: a big part of the deal was filling up gaps in Adobe’s enterprise offering, but Day’s open source know-how and network have brought a lot of value as well.</p>
<p>Day folks have played an important role in expanding the open development culture inside Adobe; Photoshop will probably never be fully open source, but moving more key components of the Adobe technology stack to open source, and most importantly open development, has paid off nicely. In terms of reaching out to developers and customers, in getting much better feedback at all levels, and in terms of software quality of course. It’s those eyeballs.</p>
<p>The Apache Software Foundation’s <a href="http://incubator.apache.org">Incubator</a> has been quite busy in the last few months. The new platinum sponsor enjoys a fruitful relationship with the foundation.</p>
<p>With <a href="http://java.dzone.com/articles/java-content-repository-best">JCR</a> moving to their core, Adobe’s enterprise applications are starting to reach a new level of flexibility. Customers are enthusiastic about being able to access their data via simple and standards-based interfaces. Enterprise-level mashups, anyone?</p>
<p>JCR is not just that minor content repository API pushed by that small swiss software vendor anymore: being adopted by a major player has made a huge difference in terms of market recognition (<em>I’m sure my friends at <a href="http://onehippo.com">Hippo</a>, <a href="http://jahia.com">Jahia</a> and <a href="http://sakaiproject.org">Sakai</a>, among others, will love that one</em>). The added resources have also helped improve the implementations, and people love the book!</p>
<p>With this, <a href="http://jackrabbit.apache.org">Apache Jackrabbit</a> and <a href="http://sling.apache.org">Apache Sling</a> have reached new levels of community participation and quality. Although quite a few new committers are from Adobe, a number of other companies have also pushed their developers to participate more, due to the increased market visibility of JCR.</p>
<p>Adobe’s additional resources, used wisely to take advantage of the Day team’s strengths, have enabled them to fully realize the CQ5 vision. Everything <em>is</em> content, really.</p>
<p>As in all fairy tales, the former Day team and Adobe live happily ever after. <em>(Editor’s note: this is not Disney, can we strike that one please?)</em></p>
<h5 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">The Nightmare</h5>
<p>This is late 2011, and I can hear the programmers complaining in their bland cubicles. </p>
<p>Aaarrggghhhhh.</p>
<p>The few Day folks who still work at Adobe did try to convince their management to continue on the open source and open development track. No luck – you can’t argue with an US company making 4 billion a year, can you?</p>
<p>CQ5 customers are too busy converting their websites to native PDF (this is about <em>documents</em>, right?) to realize what’s going on. The most desperate just switched to DrooplaPress, the newest kid on the LISP-based CMSes block. That won’t help business much but at least it’s fun to work with. If you love parentheses, that is.</p>
<p>Adobe’s competitors who <em>really</em> jumped on the open source and open development train are gone for good, it is too late to catch up. You should have sold you shares a year ago.</p>
<p>Luckily, <a href="http://jackrabbit.apache.org">Apache Jackrabbit</a> and <a href="http://sling.apache.org">Apache Sling</a> are still alive, and increased involvement of the “Benelux Gang” (ex-Day folks spread over a few Benelux content management companies) in those projects means there’s still hope.</p>
<p>You wake up wondering why you didn’t accept that job at the local fast food. Computers are so boring.</p>
<h5 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">Coda</h5>
<p>I know life is more complicated than dreams sometimes, but I like dreams much better than nightmares, and I’m a chronic optimistic. So you can easily guess which scenario I’m going to work towards!</p>
<p>I’ll keep you posted about what <em>really</em> happens next. Once I wake up, that is.</p>
<p>Just dreamin’, y’know?</p>
<h5 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">Related reading</h5>
<p><a href="http://jukkaz.wordpress.com/2010/07/28/open-source-at-adobe/">Open Source at Adobe</a> by my colleague and fellow Apache Member Jukka Zitting.</p>
<p><a href="http://www.h-online.com/open/features/TransferSummit-Open-innovation-in-software-means-Open-Source-1022212.html">Open innovation in software means Open Source</a>, a recent post of mine.</p>
<p>See also my collected links related to the announcement at <a href="http://delicious.com/bdelacretaz/adobeday">http://delicious.com/bdelacretaz/adobeday</a>.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1391/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1391/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/bdelacretaz.wordpress.com/1391/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bdelacretaz.wordpress.com/1391/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/bdelacretaz.wordpress.com/1391/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bdelacretaz.wordpress.com/1391/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/bdelacretaz.wordpress.com/1391/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bdelacretaz.wordpress.com/1391/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/bdelacretaz.wordpress.com/1391/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bdelacretaz.wordpress.com/1391/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/bdelacretaz.wordpress.com/1391/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bdelacretaz.wordpress.com/1391/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/bdelacretaz.wordpress.com/1391/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bdelacretaz.wordpress.com/1391/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1391&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-07-30T13:49:07Z</updated>
    <category term="Adobe"/>
    <category term="Day Software"/>
    <category term="Open Source"/>
    <category term="Thoughts"/>
    <category term="opensource"/>
    <category term="adobe"/>
    <category term="day"/>
    <author>
      <name>bdelacretaz</name>
    </author>
    <source>
      <id>http://grep.codeconsult.ch</id>
      <logo>http://0.gravatar.com/blavatar/e6e901bd190e100a6787d0252d1f244f?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://grep.codeconsult.ch/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://grep.codeconsult.ch" rel="alternate" type="text/html"/>
      <link href="http://grep.codeconsult.ch/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://grep.codeconsult.ch/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>cat /dev/brain | egrep -i 'tech|thoughts|noise'</subtitle>
      <title>bertrand's brain grep</title>
      <updated>2010-09-03T03:00:05Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=329</id>
    <link href="http://jukkaz.wordpress.com/2010/07/28/open-source-at-adobe/" rel="alternate" type="text/html"/>
    <title>Open Source at Adobe?</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The news is just in about Adobe being set to acquire Day Software (see also the FAQ). Assuming the deal goes through, it looks like I’ll be working for Adobe by the end of this year. I’m an open source developer, so I’m looking forward to finding out how committed Adobe is in supporting the [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=329&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The <a href="http://www.adobe.com/aboutadobe/pressroom/pressreleases/201007/072810AdobetoAcquireDaySoftware.html" title="Adobe to Acquire Day Software">news</a> is just in about <a href="http://www.adobe.com/">Adobe</a> being set to acquire <a href="http://www.day.com/">Day Software</a> (see also the <a href="http://www.day.com/day/en/company/adobefaq.html">FAQ</a>). Assuming the deal goes through, it looks like I’ll be working for Adobe by the end of this year. I’m an open source developer, so I’m looking forward to <a href="http://www.computerworlduk.com/community/blogs/index.cfm?entryid=3098&amp;blogid=14" title="Will Adobe See the Light (of Day)?">finding out</a> how committed Adobe is in supporting the <a href="http://www.day.com/day/en/company/news_events/press_releases/day_awarded_for_opensourcesupport.html" title="Day Awarded for Open Source Support">open development model</a> we’re using for many parts of Day products.</p>
<p>The <a href="http://www.computerworlduk.com/community/blogs/index.cfm?entryid=3098&amp;blogid=14#tsb">first comments</a> from <a href="http://twitter.com/erikdlarson">Erik Larson</a>, a senior director of product management and strategy at Adobe, seem promising and he also <a href="http://twitter.com/erikdlarson/status/19729843366">asked</a> what the deal should mean for open source. This is my response from the perspective of the open source projects I’m involved in.</p>
<p>First and foremost I’m looking forward to continuing the open and standards-based development of our key technologies like <a href="http://jackrabbit.apache.org/">Apache Jackrabbit</a> and <a href="http://sling.apache.org/">Apache Sling</a>. There’s no way we’d be able to maintain the current level of <a href="http://grep.codeconsult.ch/2010/07/02/open-innovation-in-software-means-open-source-2/">innovation and productivity</a> in these key parts of our product infrastructure without our symbiotic relationship with the open source community.</p>
<p>Second, I’m hoping that our experience and involvement with open source projects will help Adobe better interact with the various open source efforts that leverage Adobe standards and technologies like <a href="http://www.adobe.com/products/xmp/" title="Extensible Metadata Platform">XMP</a>, <a href="http://www.adobe.com/devnet/pdf/">PDF</a> and <a href="http://www.adobe.com/devnet/flv/">Flash</a>. The Apache Software Foundation is a home to a <a href="http://jukkaz.wordpress.com/2007/11/16/digital-media-at-apache/" title="Digital Media at Apache">growing collection</a> of digital media projects like <a href="http://pdfbox.apache.org/" title="Apache PDFBox">PDFBox</a>, <a href="http://xmlgraphics.apache.org/fop/" title="Apache FOP">FOP</a>, <a href="http://tika.apache.org/" title="Apache Tika">Tika</a>, <a href="http://xmlgraphics.apache.org/batik/" title="Apache Batik">Batik</a> and <a href="http://commons.apache.org/sanselan/" title="Apache Commons Sanselan">Sanselan</a>, all of which are in one way or another related to Adobe’s business. For example as a committer and release manager of the <a href="http://pdfbox.apache.org/">Apache PDFBox</a> project I’d much appreciate better access to Adobe’s deep technical PDF know-how. Similarly, in <a href="http://tika.apache.org/">Apache Tika</a> we’re considering using XMP as our metadata standard, and better access to and co-operation with the people behind Adobe’s XMP toolkit SDK (see more below) would be highly valuable.</p>
<p>It would be great to see Adobe becoming more proactive in reaching out and supporting such grass-roots efforts that leverage their technologies. I’ve <a href="http://markmail.org/message/zwobxjatnngs2slt">dealt with</a> Adobe lawyers on such cases before with good results but it did take some time before I found the correct people to contact. Another area of improvement would be to make freely redistributable Adobe IP more easily accessible for external developers by pushing them out to central repositories like Maven Central, RubyGems or CPAN, for example like I did when making <a href="http://jira.codehaus.org/browse/MAVENUPLOAD-2485">PDF core font information</a> available on Maven Central.</p>
<p>Finally, it would be great to see Adobe going further in embracing an open development model for some of their codebases like the <a href="http://sourceforge.net/adobe/adobexmp/home/">XMP toolkit SDK</a> that they already release under open source licenses. I’d love to champion or mentor the effort, should Adobe be willing to bring the XMP toolkit to the <a href="http://incubator.apache.org/">Apache Incubator</a>!</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/329/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/329/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/329/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/329/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/jukkaz.wordpress.com/329/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jukkaz.wordpress.com/329/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/jukkaz.wordpress.com/329/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jukkaz.wordpress.com/329/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/329/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/329/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/329/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/329/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/329/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/329/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=329&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-07-28T12:54:28Z</updated>
    <category term="General"/>
    <category term="adobe"/>
    <category term="apache"/>
    <category term="day"/>
    <category term="open source"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-09-03T03:00:14Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://bdelacretaz.wordpress.com/?p=1372</id>
    <link href="http://grep.codeconsult.ch/2010/07/21/dear-oracle-can-we-have-our-nice-javadoc-urls-back/" rel="alternate" type="text/html"/>
    <title>Dear Oracle, can we have our nice javadoc URLs back?</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">If you support this request, please vote for it in the comments below and/or on twitter using the #E17476 hashtag! Update (2010/07/24): it looks like the old java.sun.com URLs are back, thanks Oracle and especially @mreinhold! Update (2010/07/27): see also Good Feedback and Happy Endings – The Ugly URLs. Dear Oracle, A while ago you [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1372&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><em>If you support this request, please vote for it in the comments below and/or on twitter using the <b><a href="http://search.twitter.com/search?q=%23E17476">#E17476</a></b> hashtag!</em></p>
<p><b>Update (2010/07/24):</b> it looks like the old java.sun.com URLs are back, thanks Oracle and especially <a href="http://twitter.com/mreinhold/status/19377658717">@mreinhold</a>!</p>
<p><b>Update (2010/07/27):</b> see also <a href="http://blogs.sun.com/theaquarium/entry/good_feedback_and_happy_endings">Good Feedback and Happy Endings – The Ugly URLs</a>.</p>
<p>Dear Oracle,</p>
<p>A while ago you bought Sun, and IIRC promised to do good things for Java. Or at least indicated you would. Or something like that.</p>
<p>Now, a bad thing happened a few days ago. Not a bad bad bad thing, just a tiny annoying change in the cool URLs that Sun used to publish the JDK’s javadocs. Not annoying annoying annoying but not nice.</p>
<p>Even Google remembers: today if I search for <code> IndexOutOfBoundsException</code> on Google it returns the following URL:</p>
<p><a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/IndexOutOfBoundsException.html">http://java.sun.com/j2se/1.5.0/docs/api/java/lang/IndexOutOfBoundsException.html</a></p>
<p>Which is a <a href="http://www.w3.org/Provider/Style/URI.html">cool URL that shouldn’t change</a>.</p>
<p>Now, requesting this URL today causes a redirect to:</p>
<p><a href="http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/api/java/lang/IndexOutOfBoundsException.html">http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/api/java/lang/IndexOutOfBoundsException.html</a></p>
<p>Which is also somewhat cool, but not as much. Factor 10 down in coolness. It makes me assume that you’re serving javadocs from a CD, and that CD’s identifier is E17476_01. That’s useful info if you’re the filesystem driver who’s reading the CD, but I doubt filesystem drivers are searching for javadocs on Google. Also, I’m not looking at downloading anything. Just browsing, okay?</p>
<p>Cool URLs shouldn’t change. </p>
<p>Can we have the old one back? Ok, maybe with java.oracle.com instead of java.sun.com – you bought them anyway. But please please please, let the poor CD filesystem driver alone!</p>
<p>Thanks.</p>
<p><em>P.S. we’re having a little vote on Twitter about this, check it out at <a href="http://search.twitter.com/search?q=%23E17476">http://search.twitter.com/search?q=%23E17476</a></em></p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1372/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1372/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/bdelacretaz.wordpress.com/1372/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bdelacretaz.wordpress.com/1372/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/bdelacretaz.wordpress.com/1372/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bdelacretaz.wordpress.com/1372/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/bdelacretaz.wordpress.com/1372/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bdelacretaz.wordpress.com/1372/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/bdelacretaz.wordpress.com/1372/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bdelacretaz.wordpress.com/1372/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/bdelacretaz.wordpress.com/1372/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bdelacretaz.wordpress.com/1372/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/bdelacretaz.wordpress.com/1372/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bdelacretaz.wordpress.com/1372/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1372&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-07-21T08:58:01Z</updated>
    <category term="Java"/>
    <category term="The Web"/>
    <author>
      <name>bdelacretaz</name>
    </author>
    <source>
      <id>http://grep.codeconsult.ch</id>
      <logo>http://0.gravatar.com/blavatar/e6e901bd190e100a6787d0252d1f244f?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://grep.codeconsult.ch/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://grep.codeconsult.ch" rel="alternate" type="text/html"/>
      <link href="http://grep.codeconsult.ch/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://grep.codeconsult.ch/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>cat /dev/brain | egrep -i 'tech|thoughts|noise'</subtitle>
      <title>bertrand's brain grep</title>
      <updated>2010-09-03T03:00:05Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://bdelacretaz.wordpress.com/?p=1368</id>
    <link href="http://grep.codeconsult.ch/2010/07/16/this-is-how-we-work-at-apache/" rel="alternate" type="text/html"/>
    <title>This is how we work at Apache</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I just had to (re-)explain how the Apache way of working makes a difference by enabling a continuous flow of information between developers. No more begging for reports, no more boring meetings where you only exchange information: who could say no to that? Here it is for your enjoyment. This is the same thing that [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1368&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I just had to (re-)explain how the <a href="http://apache.org">Apache</a> way of working makes a difference by enabling a continuous flow of information between developers. </p>
<p>No more begging for reports, no more boring meetings where you only exchange information: who could say no to that?</p>
<p>Here it is for your enjoyment. This is the same thing that I’ve been saying in my recent <a href="http://www.slideshare.net/bdelacretaz">talks</a> on this topic, reduced to the bare minimum.</p>
<ul>
<li>All technical discussions and decisions on public mailing lists.</li>
<li><em>Speak in URLs</em>: if you reference something (discussion, vote,<br/>
code…anything) include its URL, which must be permanent.</li>
<li>Shared code repository, commit early, commit often (as in: daily at least, from day one)</li>
<li>Commit events sent to mailing lists and/or RSS feeds to which people<br/>
can subscribe.</li>
<li>Shared issue tracker and <em>“if you’re working on something it must be<br/>
an issue in the tracker”</em> so that progress reports are automatic. Also generates mail/RSS events.</li>
<li>Commits are linked to tracker issue IDs – by speaking in URLs in your commit messages, mostly.</li>
<li>Automatic archiving of all this information, for self-service access.</li>
</ul>
<p>All this is public and centrally accessible of course, so everybody<br/>
gets the same information.</p>
<p>The main reluctance that I see when trying to convince people to work<br/>
in this way is the fear of exposing your mistakes and initial bad<br/>
designs in public. My answer is to <em>just get over it</em>: you’d find tons<br/>
of such blunders if you were to analyze my work at Apache in the last<br/>
ten years, yet I’m reasonably alive and kicking.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1368/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1368/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/bdelacretaz.wordpress.com/1368/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bdelacretaz.wordpress.com/1368/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/bdelacretaz.wordpress.com/1368/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bdelacretaz.wordpress.com/1368/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/bdelacretaz.wordpress.com/1368/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bdelacretaz.wordpress.com/1368/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/bdelacretaz.wordpress.com/1368/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bdelacretaz.wordpress.com/1368/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/bdelacretaz.wordpress.com/1368/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bdelacretaz.wordpress.com/1368/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/bdelacretaz.wordpress.com/1368/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bdelacretaz.wordpress.com/1368/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1368&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-07-16T10:40:55Z</updated>
    <category term="Open Source"/>
    <category term="asf"/>
    <category term="collaboration"/>
    <category term="opensource"/>
    <author>
      <name>bdelacretaz</name>
    </author>
    <source>
      <id>http://grep.codeconsult.ch</id>
      <logo>http://0.gravatar.com/blavatar/e6e901bd190e100a6787d0252d1f244f?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://grep.codeconsult.ch/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://grep.codeconsult.ch" rel="alternate" type="text/html"/>
      <link href="http://grep.codeconsult.ch/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://grep.codeconsult.ch/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>cat /dev/brain | egrep -i 'tech|thoughts|noise'</subtitle>
      <title>bertrand's brain grep</title>
      <updated>2010-09-03T03:00:05Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://bdelacretaz.wordpress.com/?p=1366</id>
    <link href="http://grep.codeconsult.ch/2010/07/08/list-all-your-maven-dependencies/" rel="alternate" type="text/html"/>
    <title>List all your Maven dependencies</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Here’s a one-liner (well, two) that neatly lists all the Maven dependencies from your project. Useful to check their licenses, for example. # first grab all dependencies mvn dependency:resolve # then list them with -o to keep noise low, # remove extra information and duplicates mvn -o dependency:list \ | grep ":.*:.*:.*" \ | cut [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1366&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Here’s a one-liner (well, two) that neatly lists all the Maven dependencies from your project. Useful to check their licenses, for example.</p>
<pre># first grab all dependencies
mvn dependency:resolve

# then list them with -o to keep noise low,
# remove extra information and duplicates
mvn -o dependency:list \
| grep ":.*:.*:.*" \
| cut -d] -f2- \
| sed 's/:[a-z]*$//g' \
| sort -u
</pre>
<p>The output looks like this:</p>
<pre>asm:asm:jar:1.5.3
asm:asm:jar:3.1
biz.aQute:bnd:jar:0.0.169
cglib:cglib:jar:2.1_3
classworlds:classworlds:jar:1.1
classworlds:classworlds:jar:1.1-alpha-2
...
</pre>
<p>so it’s also useful to detect multiple versions of the same dependency in a multi-module project.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1366/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1366/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/bdelacretaz.wordpress.com/1366/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bdelacretaz.wordpress.com/1366/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/bdelacretaz.wordpress.com/1366/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bdelacretaz.wordpress.com/1366/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/bdelacretaz.wordpress.com/1366/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bdelacretaz.wordpress.com/1366/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/bdelacretaz.wordpress.com/1366/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bdelacretaz.wordpress.com/1366/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/bdelacretaz.wordpress.com/1366/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bdelacretaz.wordpress.com/1366/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/bdelacretaz.wordpress.com/1366/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bdelacretaz.wordpress.com/1366/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1366&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-07-08T09:38:01Z</updated>
    <category term="tools"/>
    <author>
      <name>bdelacretaz</name>
    </author>
    <source>
      <id>http://grep.codeconsult.ch</id>
      <logo>http://0.gravatar.com/blavatar/e6e901bd190e100a6787d0252d1f244f?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://grep.codeconsult.ch/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://grep.codeconsult.ch" rel="alternate" type="text/html"/>
      <link href="http://grep.codeconsult.ch/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://grep.codeconsult.ch/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>cat /dev/brain | egrep -i 'tech|thoughts|noise'</subtitle>
      <title>bertrand's brain grep</title>
      <updated>2010-09-03T03:00:06Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://bdelacretaz.wordpress.com/?p=1362</id>
    <link href="http://grep.codeconsult.ch/2010/07/02/open-innovation-in-software-means-open-source-2/" rel="alternate" type="text/html"/>
    <title>Open innovation in software means open source</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Here’s a “reprint” of an article that I wrote recently for the H, to introduce my talk at TransferSummit last week. According to Henry Chesbrough[1], Open Innovation consists of using external ideas as well as internal ideas, and internal and external paths to market, to advance a company’s technology. Software architects and developers are usually [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1362&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><em>Here’s a “reprint” of an <a href="http://www.h-online.com/open/features/TransferSummit-Open-innovation-in-software-means-Open-Source-1022212.html">article</a> that I wrote recently for <a href="http://www.h-online.com/">the H</a>, to introduce my <a href="http://www.transfersummit.com/programme/60">talk</a> at <a href="http://www.transfersummit.com">TransferSummit</a> last week.</em></p>
<p/>
<p>According to Henry Chesbrough[1], Open Innovation consists of <em>using external ideas as well as internal ideas, and internal and external paths to market, to advance a company’s technology</em>.</p>
<p>Software architects and developers are usually not short of ideas, but which of those ideas are the really good ones? How do you select the winning options and avoid wasting energy and money on the useless ones?</p>
<p>Feedback is the key to separating the wheat from the chaff. Fast and good quality feedback is required to steer any fast vehicle or sports device, and it works the same in software: without a performant feedback loop, you’re bound to fall on your face – or at least to be slower than your competitors on the road to success.</p>
<h5 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">Innovation is not invention – it’s about value</h5>
<p>In a recent <a href="http://h30507.www3.hp.com/t5/Supply-Chain-Management-Blog/Innovation-how-shall-we-go-after-it/ba-p/80884">blog post on the subject</a>, Christian Verstraete, CTO at HP, rightly notes that innovation is not invention. Whereas the value of a new invention might be unknown, the goal of innovation is to produce value, often from existing ideas.</p>
<p>The output of our feedback loop must then be a measurement of value – and what better value for a software product than happy stakeholders? Other developers adopting your ideas, field testers happy with performance, experts suggesting internal changes which will make them feel good about your software’s structure. That kind of feedback is invaluable in steering your innovative software product in the right direction, quickly.</p>
<h5 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">How fast is your feedback loop?</h5>
<p>If you have to wait months to get that high-quality feedback, as you might in a corporate setting, your pace of innovation will be accordingly slow.</p>
<p>In the old world of committees, meetings and reports, things move at the speed of overstuffed schedules and overdue reports – slowly. In the new world of agile open source projects, fast and asynchronous Internet-based communication channels are your friends, helping people work at their own pace and on their own schedule, while collectively creating value quickly.</p>
<p>Open source organizations like the Apache Software Foundation provide standardised tools and best practices to foster efficient communications amongst project members. Shared source code repositories generate events to which project members can subscribe, to be informed immediately of any changes in modules that they’re interested in. Web-based issue trackers also use events and subscriptions to make it easy to collaborate efficiently on specific tasks, without requiring the simultaneous online presence of collaborators. Mailing lists also allow asynchronous discussions and decisions, while making all the resulting information available in self-service to new project members.</p>
<p>It is these shared, event-based and asynchronous communications channels that build the quick feedback loop that is key to software innovation. It is not uncommon for a software developer to receive feedback on a piece of code that they wrote, from the other end of the world, just a few minutes after committing that code to the project’s public code repository. Compared to a written problem report coming “from above” a few weeks later, when the developer has moved on to a different module, the value of that fast feedback is very high. It can feel a bit like a bunch of field experts looking over your shoulder while you’re working – scary but extremely efficient.</p>
<h5 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">How good are your feedback “sensors”?</h5>
<p>Fast feedback won’t help if it’s of low quality, and fortunately open source projects can also help a lot here. Successful projects can help bring together the best minds in the industry, to collectively solve a problem that benefits all of them. The Apache HTTP server project is one of the best examples, with many CTO-level contributors including a few that were involved in defining the protocols and the shape of today’s Web. If software developers (God forbid) were sold between companies the way soccer players are transferred between teams, we’d see millions of dollars flowing around.</p>
<p>Open source projects are very probably the best way to efficiently bring software experts together today. Industry associations and interest groups might fulfill that role in other industries, but developers like to express themselves in code, and open source projects are where that happens today.</p>
<p>You could of course hire experts to give feedback on your software inside your company, but it’s only a handful of companies who have enough money to bring in the level and number of experts that we are talking about – and that might well turn out to be much slower than the open source way of working.</p>
<h5 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">What’s the right type of project?</h5>
<p>Creating or joining an open source project that helps your business and attracts a community of experts is not that easy: the open source project space is somewhat crowded today, and those experts are busy people.</p>
<p>Judging from the Apache Software Foundation’s achievements in the last ten years, infrastructure projects have by far the highest success rate. If you can reduce (part of) your problem to a generalised software infrastructure that appeals to a wide range of software developers, those experts will see value in joining the project. Apache Hadoop is another very successful example of software architects and developers from different companies joining forces to solve a hard problem (large scale distributed computing) in a way that can benefit a whole industry. On a smaller scale, Apache Jackrabbit , one of the projects in which my employer is very active, brings together many experts from the content management world, to solve the problem of storing, searching and retrieving multimedia content efficiently. Those types of software modules are used as central infrastructure components in systems that share a similar architecture, while offering very different services to their end users.</p>
<p>Projects closer to the user interface level are often harder to manage in an open group, partly because they are often more specific to the exact problem that they solve, and also because it is often hard for people coming from different companies and cultural backgrounds to agree on the colour of the proverbial bike shed. An infrastructure software project can be well defined by an industry specification (such as JCR in Jackrabbit’s case), and/or by automated test suites. These are usually much easier to agree on than user interface mock-ups.</p>
<h5 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">Where next?</h5>
<p>I hope to have convinced you that open source projects provide the best feedback loop for innovative software. As a next step, I would recommend getting involved in open source projects that matter to you. There are many ways to contribute, from reporting bugs in a useful way, to writing tutorials, contributing new modules or extensions, or simply reporting on your use of the software in various environments.</p>
<p>Contributing, in any small or big way, to a successful open source project is the best way to see this high-quality feedback loop in action. You might also try to use the open source ways of working inside your company, to create or improve your own high-quality “innovation feedback loop”.</p>
<p>I cannot pretend to have the definitive answer to the “how do you select and execute the right ideas to innovate?” question. When it comes to software, however, the fast and high-quality feedback loop that open source projects provide is, in my opinion, the best selection tool.</p>
<p><em>[1] Chesbrough, H.W. (2003). Open Innovation: The new imperative for creating and profiting from technology. Boston: Harvard Business School Press</em></p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1362/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1362/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/bdelacretaz.wordpress.com/1362/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bdelacretaz.wordpress.com/1362/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/bdelacretaz.wordpress.com/1362/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bdelacretaz.wordpress.com/1362/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/bdelacretaz.wordpress.com/1362/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bdelacretaz.wordpress.com/1362/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/bdelacretaz.wordpress.com/1362/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bdelacretaz.wordpress.com/1362/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/bdelacretaz.wordpress.com/1362/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bdelacretaz.wordpress.com/1362/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/bdelacretaz.wordpress.com/1362/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bdelacretaz.wordpress.com/1362/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1362&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-07-02T09:05:29Z</updated>
    <category term="Open Source"/>
    <category term="Thoughts"/>
    <category term="innovation"/>
    <category term="opensource"/>
    <author>
      <name>bdelacretaz</name>
    </author>
    <source>
      <id>http://grep.codeconsult.ch</id>
      <logo>http://0.gravatar.com/blavatar/e6e901bd190e100a6787d0252d1f244f?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://grep.codeconsult.ch/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://grep.codeconsult.ch" rel="alternate" type="text/html"/>
      <link href="http://grep.codeconsult.ch/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://grep.codeconsult.ch/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>cat /dev/brain | egrep -i 'tech|thoughts|noise'</subtitle>
      <title>bertrand's brain grep</title>
      <updated>2010-09-03T03:00:06Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>https://bdelacretaz.wordpress.com/?p=1360</id>
    <link href="http://grep.codeconsult.ch/2010/07/01/my-new-flyer-ebike-fast-and-fun/" rel="alternate" type="text/html"/>
    <title>My new Flyer ebike: fast and fun!</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I recently bought a new Flyer electric bike, got a faster T8 HS ex-demo for a good price. I sold the previous C8+ to my nephew, happy that it’s staying in the family! In about 15’000km all year in any weather (including snow and accompanying salt on the road) over 4 1/2 years, I have [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1360&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><img alt="flyer-t8hs.jpg" border="0" height="238" src="http://bdelacretaz.files.wordpress.com/2010/07/flyer-t8hs.jpg?w=401&amp;h=238" style="float: right;" title="flyer-t8hs.jpg" width="401"/>I recently bought a new <a href="http://flyer.ch/">Flyer</a> electric bike, got a faster T8 HS  ex-demo for a good price.</p>
<p>I sold the previous C8+ to my nephew, happy that it’s staying in the family! In about 15’000km all year in any weather (including snow and accompanying salt on the road) over 4 1/2 years, I have had exactly zero problems with the C8, which says a lot about the build quality and maturity of those bikes. It needed just the usual bike maintenance, and an expected change of battery after about 600 charging cycles, but zero maintenance related to the electronics or motor. Not to mention only two punctures in 15’000km, thanks to the Schwalbe Marathon puncture-proof tires. Over time, those tires get full of small superficial holes which are mostly punctures that didn’t happen, very cool!</p>
<p>The new bike is an <em>HS</em> model, as in <em>high speed</em>: contrary to the old one which would only assist me until 25kmh (so you’d be faster on flat with a good bike), this one happily helps up to 45kmh or more, and it’s also a better bike to start with: 28″ wheels, more rigid frame and thinner higher-pressure tires. As with all so-called <em>pedelec</em> bikes, the Flyers don’t go anywhere if you don’t pedal, the assistance only kicks in (very naturally) when you ride normally, and gives you more power.</p>
<p>And this thing is fast: I just beat my record on the commute back from the office, 350m elevation over 12km, getting home in 29:30 which means 24kmh average speed on Lausanne’s steep hills. Not bad – you do have to pedal hard to reach such speeds uphill, but it’s a lot of fun and I get home almost as fast as any other transportation, considering the traffic density – and I don’t need to spend time at the gym after that, so I’m probably saving time all in all! The morning downhill ride takes about 20 minutes, unbeatable at 8AM unless you ride a helicopter.</p>
<p>The equipment is very good: Magura hydraulic rim brakes (almost as good as discs, I guess newer models have them), LED lights, lockable front fork and the SRAM dual drive which combines a 3-gear hub with an 8-gear rear derailleur to get 24 usable combinations (no “forbidden” ones like dual derailleurs). You cannot have a front derailleur on the Flyer due to the motor wheel which drives the chain, and the dual drive is really the best of both worlds in the city: gear hub for quick downchanging when stopping or surprised, and derailleur for fine tuning.</p>
<p>All in all, an excellent commuter’s bike if your ride is steep, or just for the fun of riding faster. The big plus with the ebike is that you can use less of your own energy if you’re tired or if conditions are bad, while still getting to your destination in a reasonable amount of time. </p>
<p>You do have to ride very carefully as sleepy car drivers and pedestrians often don’t realize how fast you ride on that thing, nor that you’re actually faster than cars in many tight or bumpy places. After years of motorcycling and cycling I’m used to being very clear about my intentions on the road, using obvious positioning in lanes, and that helps a lot! The city of Lausanne is also doing an excellent job in helping cyclists find safe space to ride, and most of my commute is on very low-traffic roads as a result.</p>
<p>Do I sound enthusiastic? That’s because I am – electric bikes are by far the best way of commuting in a steep city like Lausanne. They are somewhat expensive to buy, but maintenance costs almost nothing, and you save a lot on gym costs (and doctor’s fees I guess – cycling is good for your health).  And if you drive a car or motorbike to work, you should really calculate how much <em>that</em> costs and draw the right conclusions!</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1360/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1360/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/bdelacretaz.wordpress.com/1360/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bdelacretaz.wordpress.com/1360/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/bdelacretaz.wordpress.com/1360/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bdelacretaz.wordpress.com/1360/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/bdelacretaz.wordpress.com/1360/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bdelacretaz.wordpress.com/1360/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/bdelacretaz.wordpress.com/1360/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bdelacretaz.wordpress.com/1360/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/bdelacretaz.wordpress.com/1360/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bdelacretaz.wordpress.com/1360/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/bdelacretaz.wordpress.com/1360/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bdelacretaz.wordpress.com/1360/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1360&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-07-01T21:32:06Z</updated>
    <category term="Fun"/>
    <category term="cycling"/>
    <category term="ebike"/>
    <category term="flyer"/>
    <author>
      <name>bdelacretaz</name>
    </author>
    <source>
      <id>http://grep.codeconsult.ch</id>
      <logo>http://0.gravatar.com/blavatar/e6e901bd190e100a6787d0252d1f244f?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://grep.codeconsult.ch/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://grep.codeconsult.ch" rel="alternate" type="text/html"/>
      <link href="http://grep.codeconsult.ch/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://grep.codeconsult.ch/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>cat /dev/brain | egrep -i 'tech|thoughts|noise'</subtitle>
      <title>bertrand's brain grep</title>
      <updated>2010-09-03T03:00:04Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://michid.wordpress.com/?p=221</id>
    <link href="http://michid.wordpress.com/2010/06/18/type-level-programming-equality/" rel="alternate" type="text/html"/>
    <title>Type Level Programming: Equality</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Apocalisp has a great series on Type Level Programming with Scala. At some point the question came up whether it is possible to determine equality of types at run time by having the compiler generate types representing true and false respectively. Here is what I came up with. trait True { type t = True [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=michid.wordpress.com&amp;blog=2538862&amp;post=221&amp;subd=michid&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://apocalisp.wordpress.com/">Apocalisp</a> has a great series on <a href="http://michid.wordpress.com/2010/01/29/scala-type-level-encoding-of-the-ski-calculus/">Type</a> <a href="http://michid.wordpress.com/2008/10/29/meta-programming-with-scala-conditional-compilation-and-loop-unrolling/">Level</a> <a href="http://michid.wordpress.com/2008/08/27/meta-programming-with-scala-part-iii-partial-function-application/">Programming</a> <a href="http://michid.wordpress.com/2008/07/30/meta-programming-with-scala-part-ii-multiplication/">with</a> <a href="http://michid.wordpress.com/2008/04/18/meta-programming-with-scala-part-i-addition/">Scala</a>. At <a href="http://apocalisp.wordpress.com/2010/06/10/type-level-programming-in-scala-part-2-implicitly-and/">some point</a> the question came up whether it is possible to determine equality of types at run time by having the compiler generate types representing <em>true</em> and <em>false</em> respectively. Here is what I came up with. </p>
<pre class="brush: java;">trait True { type t = True }
trait False { type t = False }

case class Equality[A] {
  def check(x: A)(implicit t: True) = t
  def check[B](x: B)(implicit f: False) = f
}
object Equality {
  def witness[T] = null.asInstanceOf[T]
  implicit val t: True = null
  implicit val f: False = null
}

// Usage:
import Equality._

val test1 = Equality[List[Boolean]] check witness[List[Boolean]]
implicitly[test1.t =:= True]
// Does not compile since tt is True
// implicitly[test1.t =:= False]  

val test2 = Equality[Nothing] check witness[AnyRef]
// Does not compile since ft is False
// implicitly[test2.t =:= True]
implicitly[test2.t =:= False]
</pre>
<p>Admittedly this is very hacky. For the time being I don’t see how to further clean this up. Anyone?</p>
<br/>Filed under: <a href="http://michid.wordpress.com/category/uncategorized/">Uncategorized</a> Tagged: <a href="http://michid.wordpress.com/tag/meta-programming/">Meta-Programming</a>, <a href="http://michid.wordpress.com/tag/scala/">Scala</a> <a href="http://feeds.wordpress.com/1.0/gocomments/michid.wordpress.com/221/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/michid.wordpress.com/221/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/michid.wordpress.com/221/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/michid.wordpress.com/221/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/michid.wordpress.com/221/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/michid.wordpress.com/221/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/michid.wordpress.com/221/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/michid.wordpress.com/221/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/michid.wordpress.com/221/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/michid.wordpress.com/221/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/michid.wordpress.com/221/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/michid.wordpress.com/221/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/michid.wordpress.com/221/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/michid.wordpress.com/221/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=michid.wordpress.com&amp;blog=2538862&amp;post=221&amp;subd=michid&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-06-18T16:13:53Z</updated>
    <category term="Uncategorized"/>
    <category term="Meta-Programming"/>
    <category term="Scala"/>
    <author>
      <name>michid</name>
    </author>
    <source>
      <id>http://michid.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/8a44e33f0c0b6ba0377f3633082fb84d?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://michid.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://michid.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://michid.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://michid.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Hacking Scala</subtitle>
      <title>Michid's Weblog</title>
      <updated>2010-09-03T03:00:23Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://bdelacretaz.wordpress.com/?p=1354</id>
    <link href="http://grep.codeconsult.ch/2010/06/15/can-i-haz-web/" rel="alternate" type="text/html"/>
    <title>Can I haz web?</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">How many people today still think information is only valid or “serious” when represented on an A4 piece of paper? Way too many, if you ask me. I’m always disappointed when people push out important content as PDF documents (or much worse…I won’t even name that format) attached to web pages or email messages, instead [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1354&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>How many people today still think information is only valid or “serious” when represented on an A4 piece of paper? </p>
<p>Way too many, if you ask me.</p>
<p>I’m always disappointed when people push out important content as PDF documents (or much worse…I won’t even name <em>that</em> format) attached to web pages or email messages, instead of just including the content in those web pages or messages, as a first-class citizen.</p>
<p>For some reason, people seem to think that information presented in A4 format has more value than the same information presented as a simple and clean web page. It is quite the opposite actually: web pages can be linked to, easily indexed, reformatted for efficient reading (thanks <a href="http://lab.arc90.com/experiments/readability/">readability</a>), etc.</p>
<p>Ted Nelson, the inventor of hypertext, wrote in 1999 already [1]:</p>
<blockquote><p>
We must overthrow the paper model, with its four prison walls and peephole one-way links
</p></blockquote>
<p>And also, in the same paper:</p>
<blockquote><p>
WYSIWYG generally means “What You See Is What You Get” — meaning what you get <b>when you print it out</b>. In other words, paper is the flat heart of most of today’s software concepts.
</p></blockquote>
<p>Granted, we haven’t fully solved the two-way links problem yet, but I hope you get the idea. Who needs paper or A4 pages? This is 2010, and this is the Web.</p>
<p>Please think about it next time you publish an important piece of information. Does it really need to live in the prison walls of a “document”? In what ways is that more valid than a web page or plain text email message? </p>
<p>Most of the time, almost always, the answer is: <em>it’s not more valid, it’s just less usable</em>.</p>
<p>Can I haz web? kthxbye.</p>
<p>[1] <a href="http://people.artcenter.edu/~vanallen/web_techniques/tednelson_liberate.htm">http://people.artcenter.edu/~vanallen/web_techniques/tednelson_liberate.htm</a></p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1354/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1354/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/bdelacretaz.wordpress.com/1354/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bdelacretaz.wordpress.com/1354/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/bdelacretaz.wordpress.com/1354/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bdelacretaz.wordpress.com/1354/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/bdelacretaz.wordpress.com/1354/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bdelacretaz.wordpress.com/1354/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/bdelacretaz.wordpress.com/1354/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bdelacretaz.wordpress.com/1354/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/bdelacretaz.wordpress.com/1354/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bdelacretaz.wordpress.com/1354/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/bdelacretaz.wordpress.com/1354/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bdelacretaz.wordpress.com/1354/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1354&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-06-15T11:59:14Z</updated>
    <category term="The Web"/>
    <category term="collaboration"/>
    <author>
      <name>bdelacretaz</name>
    </author>
    <source>
      <id>http://grep.codeconsult.ch</id>
      <logo>http://0.gravatar.com/blavatar/e6e901bd190e100a6787d0252d1f244f?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://grep.codeconsult.ch/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://grep.codeconsult.ch" rel="alternate" type="text/html"/>
      <link href="http://grep.codeconsult.ch/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://grep.codeconsult.ch/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>cat /dev/brain | egrep -i 'tech|thoughts|noise'</subtitle>
      <title>bertrand's brain grep</title>
      <updated>2010-09-03T03:00:06Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://michid.wordpress.com/?p=214</id>
    <link href="http://michid.wordpress.com/2010/06/14/working-around-type-erasure-ambiguities-scala/" rel="alternate" type="text/html"/>
    <title>Working around type erasure ambiguities (Scala)</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In my previous post I showed a workaround for the type erasure ambiguity problem in Java. The solution uses vararg parameters for disambiguation. As Paul Phillips points out in his comment, this solution doesn’t directly port over to Scala. Java uses Array to pass varargs, Scala uses Seq. Unlike Array, Seq is not reified so [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=michid.wordpress.com&amp;blog=2538862&amp;post=214&amp;subd=michid&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>In my <a href="http://michid.wordpress.com/2010/05/30/working-around-type-erasure-ambiguities/">previous post</a> I showed a workaround for the type erasure ambiguity problem in Java. The solution uses vararg parameters for disambiguation. As <a href="http://michid.wordpress.com/2010/05/30/working-around-type-erasure-ambiguities/#comment-456">Paul Phillips</a> points out in his comment, this solution doesn’t directly port over to Scala. Java uses Array to pass varargs, Scala uses Seq. Unlike Array, Seq is not reified so Seq[String] and Seq[Int] again erase to the same type putting us back to square one. </p>
<p>However, there is another way to add disambiguation parameters to the methods: implicits! Here is how:</p>
<pre class="brush: java;">implicit val x: Int = 0
def foo(a: List[Int])(implicit ignore: Int) { }

implicit val y = ""
def foo(a: List[String])(implicit ignore: String) { }

foo(1::2::Nil)
foo("a"::"b"::Nil)
</pre>
<br/>Filed under: <a href="http://michid.wordpress.com/category/uncategorized/">Uncategorized</a> Tagged: <a href="http://michid.wordpress.com/tag/puzzle/">Puzzle</a>, <a href="http://michid.wordpress.com/tag/scala/">Scala</a> <a href="http://feeds.wordpress.com/1.0/gocomments/michid.wordpress.com/214/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/michid.wordpress.com/214/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/michid.wordpress.com/214/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/michid.wordpress.com/214/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/michid.wordpress.com/214/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/michid.wordpress.com/214/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/michid.wordpress.com/214/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/michid.wordpress.com/214/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/michid.wordpress.com/214/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/michid.wordpress.com/214/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/michid.wordpress.com/214/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/michid.wordpress.com/214/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/michid.wordpress.com/214/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/michid.wordpress.com/214/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=michid.wordpress.com&amp;blog=2538862&amp;post=214&amp;subd=michid&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-06-14T21:33:21Z</updated>
    <category term="Uncategorized"/>
    <category term="Puzzle"/>
    <category term="Scala"/>
    <author>
      <name>michid</name>
    </author>
    <source>
      <id>http://michid.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/8a44e33f0c0b6ba0377f3633082fb84d?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://michid.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://michid.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://michid.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://michid.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Hacking Scala</subtitle>
      <title>Michid's Weblog</title>
      <updated>2010-09-03T03:00:24Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://michid.wordpress.com/?p=210</id>
    <link href="http://michid.wordpress.com/2010/05/30/working-around-type-erasure-ambiguities/" rel="alternate" type="text/html"/>
    <title>Working around type erasure ambiguities</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In an earlier post I already showed how to work around ambiguous method overloads resulting from type erasure. In a nut shell the following code wont compile since both overloaded methods foo erase to the same type. Scala: def foo(ints: List[Int]) {} def foo(strings: List[String]) {} Java: void foo(List&lt;Integer&gt; ints) {} void foo(List&lt;String&gt; strings) {} [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=michid.wordpress.com&amp;blog=2538862&amp;post=210&amp;subd=michid&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>In an earlier <a href="http://michid.wordpress.com/2008/01/18/implicit-double-dispatch/">post</a> I already showed how to work around ambiguous method overloads resulting from type erasure. In a nut shell the following code wont compile since both overloaded methods <em>foo</em> erase to the same type. </p>
<p>Scala:</p>
<pre class="brush: java;">def foo(ints: List[Int]) {}
def foo(strings: List[String]) {}
</pre>
<p>Java:</p>
<pre class="brush: java;">void foo(List&lt;Integer&gt; ints) {}
void foo(List&lt;String&gt; strings) {}
</pre>
<p>It turns out that there is a simple though somewhat hacky way to work around this limitations: in order to make the ambiguity go away, we need to change the signature of <em>foo</em> in such a way that 1) the erasure of the <em>foo</em> methods are different and 2) the call site is not affected. </p>
<p>Here is a solution for Java:</p>
<pre class="brush: java;">void foo(List&lt;Integer&gt; ints, Integer... ignore) {}
void foo(List&lt;String&gt; strings, String... ignore) {}
</pre>
<p>We can now call <em>foo</em> passing either a list of ints or a list of strings without ambiguity: </p>
<pre class="brush: java;">foo(new ArrayList&lt;Integer&gt;());
foo(new ArrayList&lt;String&gt;());
</pre>
<p>This doesn’t directly port over to Scala (why?). However, there is a similar hack for Scala. I leave this as a puzzle for a couple of days before I post my solution. </p>
<br/>Filed under: <a href="http://michid.wordpress.com/category/uncategorized/">Uncategorized</a> Tagged: <a href="http://michid.wordpress.com/tag/java/">Java</a>, <a href="http://michid.wordpress.com/tag/puzzle/">Puzzle</a>, <a href="http://michid.wordpress.com/tag/scala/">Scala</a> <a href="http://feeds.wordpress.com/1.0/gocomments/michid.wordpress.com/210/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/michid.wordpress.com/210/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/michid.wordpress.com/210/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/michid.wordpress.com/210/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/michid.wordpress.com/210/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/michid.wordpress.com/210/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/michid.wordpress.com/210/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/michid.wordpress.com/210/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/michid.wordpress.com/210/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/michid.wordpress.com/210/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/michid.wordpress.com/210/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/michid.wordpress.com/210/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/michid.wordpress.com/210/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/michid.wordpress.com/210/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=michid.wordpress.com&amp;blog=2538862&amp;post=210&amp;subd=michid&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-05-30T15:05:46Z</updated>
    <category term="Uncategorized"/>
    <category term="Java"/>
    <category term="Puzzle"/>
    <category term="Scala"/>
    <author>
      <name>michid</name>
    </author>
    <source>
      <id>http://michid.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/8a44e33f0c0b6ba0377f3633082fb84d?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://michid.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://michid.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://michid.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://michid.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Hacking Scala</subtitle>
      <title>Michid's Weblog</title>
      <updated>2010-09-03T03:00:23Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-31254910.post-8812607521170753224</id>
    <link href="http://michaelmarth.blogspot.com/feeds/8812607521170753224/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="https://www.blogger.com/comment.g?blogID=31254910&amp;postID=8812607521170753224" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/8812607521170753224?v=2" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/8812607521170753224?v=2" rel="self" type="application/atom+xml"/>
    <link href="http://feedproxy.google.com/~r/CoffeeGems/~3/Oplyq0gXoB0/second-fise-hackathon.html" rel="alternate" type="text/html"/>
    <title>Second FISE Hackathon</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><a href="http://dev.day.com/content/ddc/blog/2009/12/iksworkflowbenchmark/_jcr_content/images/iksworkflowbenchmark/iks-logo.jpg"><img alt="" border="0" src="http://dev.day.com/content/ddc/blog/2009/12/iksworkflowbenchmark/_jcr_content/images/iksworkflowbenchmark/iks-logo.jpg" style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 214px; height: 111px;"/></a><br/>At this week's <a href="http://www.iks-project.eu/">IKS</a> meeting at Paderborn the second <a href="http://dev.day.com/content/ddc/blog/2010/04/fise_the_iks_restfu.html">FISE</a> <a href="http://wiki.iks-project.eu/index.php/FISEHackathonMay2010">Hackathon</a> 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 <a href="http://lucene.apache.org/solr/">Solr</a>). Last week, <a href="http://dev.day.com/content/ddc/blog.html?blog=author&amp;author=Bertrand+Delacretaz">Bertrand</a> gave an introductory talk about FISE that is <a href="http://dev.day.com/content/ddc/blog/2010/05/introduction_to_iks.html">available online</a>.<br/><p><br/>There was no explicitly set goal for the second Hackathon. Rather, the existing code base was extended in various different directions. Some examples:<br/></p><ul><li>a language detection enhancement engine (I am particularly glad to see this - automatic language detection in CMSs is a pet passion of mine)<br/></li><li>a UI for FISE users that allows humans to resolve ambiguities<br/></li><li>myself, I coded a JCR-based storage engine for the content and annotations<br/></li></ul><p>There was also a good amount of work done on the annotation structure used by FISE and <a href="http://wiki.iks-project.eu/index.php/EnhancementStructure">documented on the IKS wiki</a>.<br/></p><p>A <a href="http://wiki.iks-project.eu/index.php/FISEsecondHackathonReport">complete report of the Hackathon</a> is available on the IKS wiki (the only thing it fails to mention: the event's good spirit).<br/></p><p>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.<br/><br/>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.</p><p>(cross-posting from <a href="http://dev.day.com/content/ddc/blog/2010/05/second_fise_hackatho.html">here</a>)</p><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/31254910-8812607521170753224?l=michaelmarth.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2010-05-28T14:03:25Z</updated>
    <published>2010-05-28T13:56:00Z</published><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://michaelmarth.blogspot.com/2010/05/second-fise-hackathon.html</feedburner:origlink>
    <author>
      <name>Michael Marth</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/03925861261744910154</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-31254910</id>
      <author>
        <name>Michael Marth</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/03925861261744910154</uri>
      </author>
      <link href="http://michaelmarth.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://michaelmarth.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/31254910/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/CoffeeGems" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>About software development</subtitle>
      <title>Coffee &amp; Gems</title>
      <updated>2010-08-18T21:52:44Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=323</id>
    <link href="http://jukkaz.wordpress.com/2010/05/27/forking-a-jvm/" rel="alternate" type="text/html"/>
    <title>Forking a JVM</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The thread model of Java is pretty good and works well for many use cases, but every now and then you need a separate process for better isolation of certain computations. For example in Apache Tika we’re looking for a way to avoid OutOfMemoryErrors or JVM crashes caused by faulty libraries or troublesome input data. [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=323&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html" title="java.lang.Thread">thread model</a> of Java is pretty good and works well for many use cases, but every now and then you need a separate process for better isolation of certain computations. For example in <a href="http://tika.apache.org/">Apache Tika</a> we’re <a href="https://issues.apache.org/jira/browse/TIKA-416" title="TIKA-416: Out-of-process text extraction">looking</a> for a way to avoid <a href="https://issues.apache.org/jira/browse/PDFBOX-209" title="PDFBOX-209: java.lang.OutOfMemoryError while parsing pdf file">OutOfMemoryErrors</a> or <a href="https://issues.apache.org/jira/browse/PDFBOX-511" title="PDFBOX-511: JVM crash in PDColorSpaceInstance.createColor()">JVM crashes</a> caused by <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6645513" title="Crash in the libcmm">faulty libraries</a> or <a href="https://issues.apache.org/jira/browse/TIKA-259" title="TIKA-259: Safe parsing of droste.zip">troublesome input data</a>.</p>
<p>In C and many other programming languages the straightforward way to achieve this is to <a href="http://www.opengroup.org/onlinepubs/000095399/functions/fork.html">fork</a> separate processes for such tasks. Unfortunately Java doesn’t support the concept of a fork (i.e. creating a copy of a running process). Instead, all you can do is to start up a completely new process. To create a mirror copy of your current process you’d need to start a new JVM instance with a recreated classpath and make sure that the new process reaches a state where you can get useful results from it. This is quite complicated and typically depends on predefined knowledge of what your classpath looks like. Certainly not something for a simple library to do when deployed somewhere inside a complex application server.</p>
<p>But there’s another way! The latest Tika trunk <a href="http://svn.apache.org/viewcvs?view=rev&amp;rev=944945">now</a> <a href="http://svn.apache.org/viewcvs?view=rev&amp;rev=948081">contains</a> an early version of a fork feature that allows you to start a new JVM for running computations with the classes <em>and</em> data that you have in your current JVM instance. This is achieved by copying a few supporting class files to a temporary directory and starting the “child JVM” with only those classes. Once started, the supporting code in the child JVM establishes a simple communication protocol with the parent JVM using the standard input and output streams. You can then send serialized data and processing agents to the child JVM, where they will be deserialized using a special class loader that uses the communication link to access classes and other resources from the parent JVM.</p>
<p>My code is still far from production-ready, but I believe I’ve already solved all the tricky parts and everything seems to work as expected. Perhaps this code should go into an <a href="http://commons.apache.org/">Apache Commons</a> component, since it seems like it would be useful also to other projects beyond Tika. Initial searching didn’t bring up other implementations of the same idea, but I wouldn’t be surprised if there are some out there. Pointers welcome.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/323/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/323/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/323/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/323/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/jukkaz.wordpress.com/323/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jukkaz.wordpress.com/323/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/jukkaz.wordpress.com/323/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jukkaz.wordpress.com/323/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/323/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/323/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/323/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/323/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/323/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/323/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=323&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-05-27T21:48:21Z</updated>
    <category term="ASF"/>
    <category term="Java"/>
    <category term="apache"/>
    <category term="commons"/>
    <category term="tika"/>
    <category term="fork"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-09-03T03:00:15Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=319</id>
    <link href="http://jukkaz.wordpress.com/2010/05/26/apache-meritocracy-vs-architects/" rel="alternate" type="text/html"/>
    <title>Apache meritocracy vs. architects</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Ceki Gülcü recently wrote an interesting post on the Apache community model and its vulnerability in cases where consensus can not be reached with reasonable effort. Also the discussion in the comments is interesting. Ceki’s done some amazing work especially on Java logging libraries, and his design vision shines through the code he’s written. He’s [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=319&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Ceki Gülcü recently wrote an <a href="http://ceki.blogspot.com/2010/05/forces-and-vulnerabilites-of-apache.html" title="The forces and vulnerabilities of the Apache model">interesting post</a> on the Apache community model and its vulnerability in cases where consensus can not be reached with reasonable effort. Also the discussion in the comments is interesting.</p>
<p>Ceki’s done some amazing work especially on Java logging libraries, and his design vision shines through the code he’s written. He’s clearly at the high edge of the talent curve even among a community of highly qualified open source developers, which is why I’m not surprised that he dislikes the conservative nature of the consensus-based development model used at Apache. And the <a href="http://logging.apache.org/log4j/">log4j</a> history certainly is a sorry example of conservative forces more or less killing active development. In hindsight Ceki’s decision to start the <a href="http://www.slf4j.org/">slf4j</a> and <a href="http://logback.qos.ch/">logback</a> projects may have been the best way out of the deadlock.</p>
<p>Software development is a complex task where best results are achieved when a clear sense of architecture and design is combined with hard work and attention to details. A consensus-based development model is great for the latter parts, but can easily suffer from the design-by-committee syndrome when dealing with architectural changes or other design issues. From this perspective it’s no surprise that the Apache Software Foundation is considered a great place for maintaining stable projects. Even the <a href="http://incubator.apache.org/">Apache Incubator</a> is geared towards established codebases.</p>
<p>Even fairly simple refactorings like the one I’m <a href="https://issues.apache.org/jira/browse/JCR-890">currently proposing</a> for <a href="http://jackrabbit.apache.org/" title="Apache Jackrabbit">Apache Jackrabbit</a> can require quite a bit of time-consuming consensus-building, which can easily frustrate people who are proposing such changes. In Jackrabbit I’m surrounded by highly talented people so I treat the consensus-building time as a chance to learn more and to challenge my own assumptions, but I can easily envision cases where this would just seem like extra effort and delay.</p>
<p>More extensive design work is almost always best performed mainly by a single person based on reviews and comments by other community members.  Most successful open and closed source projects can trace their core architectures back to the work of a single person or a small tightly-knit team of like-minded developers. This is why many projects recognize such a “benevolent dictator” as the person with the final word on matters of project architecture.</p>
<p>The Apache practices for resolving vetos and other conflicts work well when dealing with localized changes where it’s possible to objectively review two or more competing solutions to a problem, but in my experience they don’t scale that well to larger design issues. The best documented practice for such cases that I’ve seen is the “<a href="http://incubator.apache.org/learn/rules-for-revolutionaries.html">Rules for revolutionaries</a>” post, but it doesn’t cover the case where there are multiple competing visions for the future. Any ideas on how such situations should best be handled in Apache communities?</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/319/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/319/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/319/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/319/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/jukkaz.wordpress.com/319/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jukkaz.wordpress.com/319/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/jukkaz.wordpress.com/319/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jukkaz.wordpress.com/319/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/319/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/319/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/319/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/319/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/319/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/319/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=319&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-05-26T00:12:09Z</updated>
    <category term="General"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-09-03T03:00:13Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://roy.gbiv.com/untangled/?p=131</id>
    <link href="http://roy.gbiv.com/untangled/2010/icse-most-influential-paper-award" rel="alternate" type="text/html"/>
    <title>ICSE Most Influential Paper award</title>
    <summary>On the same day that Liam was born, I received news that one of my two papers published at the ICSE 2000 conference has been given the International Conference on Software Engineering’s Most Influential Paper Award for its impact on software engineering research over the past decade. The paper, A case study of open source [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>On the same day that <a href="http://roy.gbiv.com/untangled/2010/some-people-call-him-liam">Liam was born</a>, I received news that one of my two papers published at the ICSE 2000 conference has been given the <a href="http://www.icse-conferences.org/mostinfluential.html">International Conference on Software Engineering’s Most Influential Paper Award</a> for its impact on software engineering research over the past decade. The paper, <em><a href="http://doi.acm.org/10.1145/337180.337209">A case study of open source software development: the Apache server</a></em>, is co-authored by Audris Mockus, myself, and James Herbsleb.  The <a href="http://www.sigsoft.org/awards/mostInfPapAwd.htm">MIP</a> is an important award within the academic world; my thanks to the award committee and congrats to Audris and Jim. I wish I could have been there in South Africa for the presentation. This year’s award is shared with a paper by Corbett et al. on <a href="http://doi.acm.org/10.1145/337180.337234">Bandera</a>.</p>
<p>Interestingly, my other paper in ICSE 2000 was the <a href="http://doi.acm.org/10.1145/337180.337228">first conference paper about REST</a>, co-authored with my adviser, <a href="http://www.ics.uci.edu/~taylor/">Dick Taylor</a>. That must have caused some debate within the awards committee. As I understand it, the MIP award is based on academic citations of the original paper and any follow-up publication in a journal. Since I encouraged people to read and <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/faq.htm">cite my dissertation</a> directly, rather than the ICSE paper’s summary or its corresponding <a href="http://doi.acm.org/10.1145/514183.514185">journal version</a>, I am not surprised that the REST paper is considered less influential. However, it does make we wonder what would have happened if I had never published my dissertation on the Web.  Would that paper have been cited more, or would nobody know about REST? <em>shrug</em>. I like the way it turned out.</p>
<p>The next two International Conferences on Software Engineering will be held in Hawaii (<a href="http://2011.icse-conferences.org/">ICSE 2011</a>), with Dick as the general chair, and Zürich (<a href="http://www.ifi.uzh.ch/arvo/req/events/ICSE2012/">ICSE 2012</a>). That is some fine scheduling on the part of the conference organizers! Fortunately, I have a pretty good excuse to attend both.</p></div>
    </content>
    <updated>2010-05-21T03:46:17Z</updated>
    <category term="open source"/>
    <category term="software architecture"/>
    <category term="Apache"/>
    <category term="ICSE"/>
    <category term="MIP"/>
    <category term="REST"/>
    <author>
      <name>Roy T. Fielding</name>
    </author>
    <source>
      <id>http://roy.gbiv.com/untangled</id>
      <link href="http://roy.gbiv.com/untangled/feed" rel="self" type="application/atom+xml"/>
      <link href="http://roy.gbiv.com/untangled" rel="alternate" type="text/html"/>
      <subtitle>musings of Roy T. Fielding</subtitle>
      <title>Untangled</title>
      <updated>2010-09-03T03:00:19Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://roy.gbiv.com/untangled/?p=102</id>
    <link href="http://roy.gbiv.com/untangled/2010/some-people-call-him-liam" rel="alternate" type="text/html"/>
    <title>Some people call him Liam</title>
    <summary>After years of planning and hoping and preparing and learning and worrying and just getting on with life, I became a Daddy in March. It came as a bit of a shock, in spite of the eight months of watching the ultrasounds and taking classes and helping Cheryl as the little pod grew. We had [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://roy.gbiv.com/untangled/wp-content/uploads/2010/05/liam_day.jpg"><img alt="Roy in Day t-shirt holding Liam in hospital" class="alignleft size-medium wp-image-110" height="300" src="http://roy.gbiv.com/untangled/wp-content/uploads/2010/05/liam_day-225x300.jpg" title="introducing Liam" width="225"/></a>After years of planning and hoping and preparing and learning and worrying and just getting on with life, I became a Daddy in March.  It came as a bit of a shock, in spite of the eight months of watching the ultrasounds and taking classes and helping Cheryl as the little pod grew.  We had just moved to a bigger place, still had dozens of boxes left to unpack before the weekend’s baby shower, and I had only been asleep for a few hours when Cheryl woke me up with the news: Hospital, now!</p>
<p>Three weeks early. Twenty-two days early, to be exact. All the books say that the range of 38-42 weeks is “normal”, so he was only eight days ahead of the curve and (thank goodness) beyond the stage of preemie health concerns. 2600 grams (5.732 lbs.) of joy, and a healthy Mommy as well. Woohoo! Of course, that also meant we were tossed out of the hospital about 40 hours after birth, thanks to our wonderful US healthcare system.</p>
<p><a href="http://roy.gbiv.com/untangled/wp-content/uploads/2010/05/liam_side.jpg"><img alt="Liam on his side with fist toward camera" class="alignright size-medium wp-image-114" height="300" src="http://roy.gbiv.com/untangled/wp-content/uploads/2010/05/liam_side-225x300.jpg" title="Liam practicing his REST-fu" width="225"/></a>The staff and facilities at <a href="http://www.hoaghospital.org/">Hoag Hospital </a>were excellent, but the whole experience was marred by the rush out of the hospital and then a corresponding rush back to the hospital three days later after a test for <a href="http://kidshealth.org/parent/pregnancy_newborn/common/jaundice.html">jaundice</a> turned up in the critical range. We really weren’t prepared for that one; I am still peeved that the test wasn’t automatically scheduled for day 4 (instead of waiting for our pediatrician to see him on day 5). However, a night in the ICU tanning bed, with extra feeding to help evacuate the bilirubin, was enough to get him back to a safe zone and he was good to go home again.</p>
<p>Twenty-two days early doesn’t sound like much, but it is huge. Most of our friends went long for their first baby, so I had this schedule in the back of my mind of all the things that I was going to finish by April so that I could take a long, relaxing break into parenthood. Bzzt!  The Anaheim IETF meeting was being held the following week, just twelve miles from my house, and my fellow HTTP standard editors had planned a whole week of editing httpbis at or near my place. Bzzt! We had delayed buying a bunch of baby things until after the shower. Bzzt! We had all these classes on what to expect in terms of sensing the arrival and onset of labor. Bzzt!</p>
<p><a href="http://roy.gbiv.com/untangled/wp-content/uploads/2010/05/liam_sleep.jpg"><img alt="Liam sleeping on his dad's shoulder" class="alignleft size-medium wp-image-123" height="225" src="http://roy.gbiv.com/untangled/wp-content/uploads/2010/05/liam_sleep-300x225.jpg" title="Liam's spot" width="300"/></a>None of those plans truly mattered, in the grand scheme of things, but it taught me a quick lesson about my limitations as a working Daddy. At least some of my planning worked out, such as saving my vacation time so that I could spend the better part of six weeks at home. He is almost at two months now and still has to eat every three hours. I usually take the night shift and catch up with email while he sleeps on my shoulder. This weekend I discovered that I can actually type this way, with Liam sliding down a bit to warm his legs on my laptop, though I have to watch out when his little feet brush over the multitouch trackpad.</p>
<p>I’ll be catching up on the backblog soon. Now, if I can just get him to sleep long enough to edit a specification …</p>
<p>BTW, Liam is his nickname.</p></div>
    </content>
    <updated>2010-05-16T09:21:20Z</updated>
    <category term="family"/>
    <category term="fatherhood"/>
    <author>
      <name>Roy T. Fielding</name>
    </author>
    <source>
      <id>http://roy.gbiv.com/untangled</id>
      <link href="http://roy.gbiv.com/untangled/feed" rel="self" type="application/atom+xml"/>
      <link href="http://roy.gbiv.com/untangled" rel="alternate" type="text/html"/>
      <subtitle>musings of Roy T. Fielding</subtitle>
      <title>Untangled</title>
      <updated>2010-09-03T03:00:20Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=313</id>
    <link href="http://jukkaz.wordpress.com/2010/05/14/buzzword-conference-in-june/" rel="alternate" type="text/html"/>
    <title>Buzzword conference in June</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Like the Lucene conference I mentioned earlier, Berlin Buzzwords 2010 is a new conference that fills in the space left by the decision not to organize an ApacheCon in Europe this year. Going beyond the Apache scope, Berlin Buzzwords is a conference for all things related to scalability, storage and search. Some of the key projects [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=313&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Like the <a href="http://www.lucene-eurocon.com/">Lucene conference</a> I <a href="http://jukkaz.wordpress.com/2010/04/21/lucene-conference-in-may/">mentioned</a> earlier, <a href="http://berlinbuzzwords.de/">Berlin Buzzwords 2010</a> is a new conference that fills in the space left by the decision not to organize an ApacheCon in Europe this year. Going beyond the Apache scope, Berlin Buzzwords is a conference for all things related to scalability, storage and search. Some of the key projects in this space are <a href="http://hadoop.apache.org/" title="Apache Hadoop">Hadoop</a>, <a href="http://couchdb.apache.org/" title="Apache CouchDB">CouchDB</a> and <a href="http://lucene.apache.org/" title="Apache Lucene">Lucene</a>.</p>
<p><a href="http://berlinbuzzwords.de/"><img alt="" class="aligncenter size-full wp-image-315" height="118" src="http://jukkaz.files.wordpress.com/2010/05/buzzpoint_logo.png?w=450&amp;h=118" title="Berlin Buzzwords 2010" width="450"/></a></p>
<p>I’ll be there to make a case for hierarchical databases (including <a href="http://jcp.org/en/jsr/detail?id=283" title="JSR 283: Content Repository for Java Technology API Version 2.0">JCR</a> and <a href="http://jackrabbit.apache.org/" title="Apache Jackrabbit">Jackrabbit</a>) and to present <a href="http://tika.apache.org/">Apache Tika</a> project. The abstracts of my talks are:</p>
<p style="padding-left: 30px;"><strong>The return of the hierarchical model</strong></p>
<p style="padding-left: 30px;">After its introduction the relational model quickly replaced the network and hierarchical models used by many early databases, but the hierarchical model has lived on in file systems, directory services, XML and many other domains. There are many cases where the features of the hierarchical model fit the needs of modern use cases and distributed deployments better than the relational model, so it’s a good time to reconsider the idea of a general-purpose hierarchical database.</p>
<p style="padding-left: 30px;">The first part of this presentation explores the features that differentiate hierarchical databases from relational databases and NoSQL alternatives like document databases and distributed key-value stores. Existing hierarchical database products like XML databases, LDAP servers and advanced filesystems are reviewed and compared.</p>
<p style="padding-left: 30px;">The second part of the presentation introduces the Content Repositories for the Java Technology (JCR) standard as a modern take on standardizing generic hierarchical databases. We also look at Apache Jackrabbit, the open source JCR reference implementation, and how it implements the hierarchical model.</p>
<p>and:</p>
<p style="padding-left: 30px;"><strong>Text and metadata extraction with Apache Tika</strong></p>
<p style="padding-left: 30px;">Apache Tika is a toolkit for extracting text and metadata from digital documents. It’s the perfect companion to search engines and any other applications where it’s useful to know more than just the name and size of a file. Powered by parser libraries like <a href="http://poi.apache.org/">Apache POI</a> and <a href="http://pdfbox.apache.org/" title="Apache PDFBox">PDFBox</a>, Tika offers a simple and unified way to access content in dozens of document formats.</p>
<p style="padding-left: 30px;">This presentation introduces Apache Tika and shows how it’s being used in projects like Apache Solr and Apache Jackrabbit. You will learn how to integrate Tika with your application and how to configure and extend Tika to best suit your needs. The presentation also summarizes the key characteristics of the more widely used file formats and metadata standards, and shows how Tika can help deal with that complexity.</p>
<p>I hear there are still some early bird <a href="http://twitter.com/hadoopberlin/status/13911230201">tickets available</a>. See you in Berlin!</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/313/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/313/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/313/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/313/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/jukkaz.wordpress.com/313/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jukkaz.wordpress.com/313/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/jukkaz.wordpress.com/313/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jukkaz.wordpress.com/313/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/313/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/313/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/313/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/313/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/313/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/313/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=313&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-05-14T10:47:47Z</updated>
    <category term="General"/>
    <category term="Jackrabbit"/>
    <category term="tika"/>
    <category term="conference"/>
    <category term="berlin buzzwords"/>
    <category term="jcr"/>
    <category term="berlin"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-09-03T03:00:14Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=307</id>
    <link href="http://jukkaz.wordpress.com/2010/05/14/commit-early-commit-often/" rel="alternate" type="text/html"/>
    <title>Commit early, commit often!</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A huge commit was made in a log4j branch yesterday. The followup discussion: Comment: “I haven’t had a chance to review the rest of the commit, but it seems like a substantial amount of work that was done in isolation. While things are still fresh, can you walk through the whats in this thing and the decisions [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=307&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>A <a href="http://svn.apache.org/viewvc?view=revision&amp;revision=943816">huge commit</a> was made in a log4j branch yesterday. The followup discussion:</p>
<p><a href="http://markmail.org/message/qv7g2rsqe55gbikw">Comment</a>:</p>
<blockquote>
<p style="padding-left: 30px;"><em>“I haven’t had a chance to review the rest of the commit, but it seems like a substantial amount of work that was done in isolation.  While things are still fresh, can you walk through the whats in this thing and the decisions that you made.”</em></p>
</blockquote>
<p><a href="http://markmail.org/message/lrlqa6hqfaypfage">Reply</a>:</p>
<blockquote>
<p style="padding-left: 30px;"><em>“I didn’t want to commit code until I had the core of something that actually functioned. I struggled for a couple of weeks over how to attack XMLConfiguration. [...] See below for what I came up with.”</em></p>
</blockquote>
<p>Followed by ten bullet points about the changes made. Unfortunately the only thing our version control system now knows about these changes is “First version”.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/307/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/307/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/307/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/307/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/jukkaz.wordpress.com/307/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jukkaz.wordpress.com/307/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/jukkaz.wordpress.com/307/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jukkaz.wordpress.com/307/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/307/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/307/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/307/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/307/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/307/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/307/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=307&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-05-14T08:58:53Z</updated>
    <category term="General"/>
    <category term="development"/>
    <category term="scm"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-09-03T03:00:14Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=302</id>
    <link href="http://jukkaz.wordpress.com/2010/04/21/lucene-conference-in-may/" rel="alternate" type="text/html"/>
    <title>Lucene conference in May</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">This year there is no ApacheCon Europe, but a number of more focused events related to projects at Apache and elsewhere are showing up to fill the space. The first one is Apache Lucene EuroCon, a dedicated Lucene and Solr user conference on 18-21 May in Prague. That’s the place to be if you’re in Europe [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=302&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>This year there is no <a href="http://eu.apachecon.com/c/aceu2009/">ApacheCon Europe,</a> but a number of more focused events related to projects at Apache and elsewhere are showing up to fill the space.</p>
<p>The first one is <a href="http://lucene-eurocon.org/">Apache Lucene EuroCon</a>, a dedicated Lucene and Solr user conference on 18-21 May in Prague. That’s the place to be if you’re in Europe and interested in Lucene-based search technology (or want to stop by for the <a href="http://www.ceskypivnifestival.cz/en/">beer festival</a>). I’ll be there presenting <a href="http://lucene.apache.org/tika/">Apache Tika</a>, and the abstract of my presentation is:</p>
<blockquote>
<p style="padding-left: 30px;"><em>Apache Tika is a toolkit for extracting text and metadata from digital documents. It’s the perfect companion to search engines and any other applications where it’s useful to know more than just the name and size of a file. Powered by parser libraries like <a href="http://poi.apache.org/">Apache POI</a> and <a href="http://pdfbox.apache.org/">PDFBox</a>, Tika offers a simple and unified way to access content in dozens of document formats.</em></p>
<p style="padding-left: 30px;"><em>This presentation introduces Apache Tika and shows how it’s being used in projects like <a href="http://lucene.apache.org/solr/">Apache Solr</a> and <a href="http://jackrabbit.apache.org/">Apache Jackrabbit</a>. You will learn how to integrate Tika with your application and how to configure and extend Tika to best suit your needs. The presentation also summarizes the key characteristics of the more widely used file formats and metadata standards, and shows how Tika can help deal with that complexity.</em></p>
</blockquote>
<p>The rest of the <a href="http://lucene-eurocon.org/agenda.html">conference program</a> is also now available. See you there!</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/302/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/302/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/302/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/302/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/jukkaz.wordpress.com/302/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jukkaz.wordpress.com/302/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/jukkaz.wordpress.com/302/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jukkaz.wordpress.com/302/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/302/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/302/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/302/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/302/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/302/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/302/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=302&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-04-21T21:23:28Z</updated>
    <category term="General"/>
    <category term="apache"/>
    <category term="conference"/>
    <category term="lucene"/>
    <category term="prague"/>
    <category term="tika"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-09-03T03:00:14Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=299</id>
    <link href="http://jukkaz.wordpress.com/2010/04/12/simple-tolowercase-is-simple-right/" rel="alternate" type="text/html"/>
    <title>“SIMPLE”.toLowerCase() is simple, right?</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">It turns out that "SIMPLE".toLowerCase().equals("simple") is not true if your default locale is Turkish, but your code is written in English. Turkish has two “i” characters, one with a dot and one without, which throws the above code off balance. The fix is to write the expression either as "SIMPLE".toLowerCase(Locale.ENGLISH).equals("simple") or even better as "SIMPLE".equalsIgnoreCase("simple"). [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=299&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>It turns out that <code>"SIMPLE".toLowerCase().equals("simple")</code> is not true if your default locale is Turkish, but your code is written in English. Turkish has two “i” characters, one with a dot and one without, which throws the above code off balance. The fix is to write the expression either as <code>"SIMPLE".toLowerCase(Locale.ENGLISH).equals("simple")</code> or even better as <code>"SIMPLE".equalsIgnoreCase("simple")</code>.</p>
<p>I just stumbled on this issue with <a href="http://lucene.apache.org/tika/">Apache Tika</a> (see <a href="https://issues.apache.org/jira/browse/TIKA-404">TIKA-404</a>), and it seems like I’m <a href="http://java.sys-con.com/node/46241">not</a> <a href="http://www.mattryall.net/blog/2009/02/the-infamous-turkish-locale-bug">the</a> <a href="http://jira.atlassian.com/browse/CONF-5931">only</a> <a href="https://issues.apache.org/jira/browse/COLLECTIONS-294">one</a>.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/299/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/299/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/299/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/299/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/jukkaz.wordpress.com/299/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jukkaz.wordpress.com/299/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/jukkaz.wordpress.com/299/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jukkaz.wordpress.com/299/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/299/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/299/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/299/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/299/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/299/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/299/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=299&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-04-12T15:06:59Z</updated>
    <category term="General"/>
    <category term="i18n"/>
    <category term="Java"/>
    <category term="locale"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-09-03T03:00:13Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-6874149097478073929.post-4883321099489056957</id>
    <link href="http://blog.meschberger.ch/feeds/4883321099489056957/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="https://www.blogger.com/comment.g?blogID=6874149097478073929&amp;postID=4883321099489056957" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/6874149097478073929/posts/default/4883321099489056957" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/6874149097478073929/posts/default/4883321099489056957" rel="self" type="application/atom+xml"/>
    <link href="http://blog.meschberger.ch/2008/10/linkedhashmaps-hidden-features.html" rel="alternate" type="text/html"/>
    <title>LinkedHashMap's hidden (?) features</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Recently I discovered two very nice features of the <tt>java.util.LinkedHashMap</tt>: <tt>accessOrder</tt> and <tt>removeEldestEntry(Entry)</tt>. These features combined let you implement simple LRU caches in under two minutes.<br/><br/><b><tt>accessOrder</tt></b><br/><br/>The <tt>accessOrder</tt> flag is set when creating the <tt>LinkedHashMap</tt> instance using the <tt>LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)</tt> constructor. This boolean flag specifies how the entries in the map are ordered:<br/><br/><dl><br/><dt><tt>accessOrder=true</tt></dt><br/><dd>The elements are ordered according to their access: When iterating over the map the most recently accessed entry is returned first and the least recently accessed element is returned last. Only the <tt>get</tt>, <tt>put</tt>, and <tt>putAll</tt> methods influence this ordering.</dd><br/><dt><tt>accessOrder=false</tt></dt><br/><dd>The elements are ordered according to their insertion. This is the default if any of the other <tt>LinkedHashMap</tt> constructors is used. In this ordering read access to the map has no influence on element ordering.</dd><br/></dl><br/><br/><b><tt>removeEdlestEntry(Entry)</tt></b><br/><br/>The second feature of interest is the <tt>removeEldestEntry(Entry)</tt> method. This method is called with the eldest entry whenever an element is added to the map. <i>Eldest</i> means the element which is returned last when iterating over the map. So the notion of <i>eldest</i> is influenced by <tt>accessOrder</tt> set on the map. The <tt>removeEldestElement</tt> in its default implementation just returns <tt>false</tt> to indicate, that nothing should happen. An extension of the <tt>LinkedHashMap</tt> may overwrite the default implementation to do whatever would be required:<br/><br/><ul><br/><li>If the implementation decides to remove the eldest element for any one reason, say a size limitation, it just returns <tt>true</tt> and the eldest element is removed from the map</li><br/><li>The implementation may also decide to modify the map itself in some way or the other. But in this case, the implementation should return <tt>false</tt>, otherwise the eldest element will still be removed.</li><br/></ul><br/><br/><br/><b>A simple LRU Cache</b><br/><br/>Taking the two features together, a very simple LRU Cache may be implemented in just a few lines of code:<br/><br/><pre><br/>public class LRUCache&lt;K, V&gt; extends LinkedHashMap&lt;K, V&gt; {<br/>private final int limit;<br/>public LRUCache(int limit) {<br/>  super(16, 0.75f, true);<br/>  this.limit = limit;<br/>}<br/>@Override<br/>protected boolean removeEldestEntry(Map.Entry&lt;K,V&gt; eldest) {<br/>  return size() &gt; limit;<br/>}<br/>}<br/></pre><br/><br/>The mechanism is very easy: The <tt>LRUCache(int)</tt> constructor initializes the map with the default initial size and load factor and sets the map into <tt>accessOrder</tt> mode. The <tt>removeEldestEntry</tt> just checks the current map size (after the addition of a new entry) against the <tt>limit</tt> and returns <tt>true</tt> if the limit has been reached.<br/><br/>A real world implementation would of course have to check and handle the <tt>limit</tt> value on the constructor.<br/><br/><br/>To see a <tt>LinkedHashMap</tt> based LRU Cache in action, have a look at the <a href="http://svn.apache.org/viewvc/incubator/sling/trunk/bundles/extensions/bundleresource/src/main/java/org/apache/sling/bundleresource/impl/BundleResourceCache.java?view=markup"><tt>BundleResourceCache.BundleResourceMap</tt></a>. This implements a simple entry cache to speed access to OSGi Bundle entries. To not waste memory, the size of the cache is limited.<div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/6874149097478073929-4883321099489056957?l=blog.meschberger.ch" width="1"/></div></div>
    </content>
    <updated>2010-04-12T09:55:29Z</updated>
    <published>2008-10-08T06:32:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="LinkedHashMap"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="Cache"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="Sling"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="LRU"/>
    <author>
      <name>fmeschbe</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/14510099790398523034</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-6874149097478073929</id>
      <author>
        <name>fmeschbe</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/14510099790398523034</uri>
      </author>
      <link href="http://blog.meschberger.ch/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://www.blogger.com/feeds/6874149097478073929/posts/default" rel="self" type="application/atom+xml"/>
      <link href="http://blog.meschberger.ch/" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <title>fmeschbe's blog</title>
      <updated>2010-08-22T18:41:40Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://michid.wordpress.com/?p=206</id>
    <link href="http://michid.wordpress.com/2010/04/11/ann-talking-at-scala-days-2010-in-lausanne-next-thursday/" rel="alternate" type="text/html"/>
    <title>[ANN] Talking at Scala Days 2010 in Lausanne next Thursday</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I’ll be talking at Scala Days 2010 in Lausanne on April 15th about the Scala scripting engine for Apache Sling. While my talk at Jazoon 09 was mainly about using Scala from Sling, this session will be more focused on internals of the Scala scripting engine. Unfortunately (or fortunately depending on the point of view) [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=michid.wordpress.com&amp;blog=2538862&amp;post=206&amp;subd=michid&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’ll be talking at <a href="http://days2010.scala-lang.org/">Scala Days 2010</a> in Lausanne on April 15th about the Scala scripting engine for <a href="http://sling.apache.org/">Apache Sling</a>. While my talk at <a href="http://people.apache.org/~mduerig/scala4sling/">Jazoon 09</a> was mainly about using Scala from Sling, <a href="http://days2010.scala-lang.org/node/50">this session</a> will be more focused on internals of the Scala scripting engine. </p>
<p>Unfortunately (or fortunately depending on the point of view) the conference is sold out already. Watch my <a href="http://people.apache.org/~mduerig/scala4scripting/">Scala for scripting</a> page for the session slides and other upcoming support material.</p>
<br/>Filed under: <a href="http://michid.wordpress.com/category/uncategorized/">Uncategorized</a> Tagged: <a href="http://michid.wordpress.com/tag/conference/">Conference</a>, <a href="http://michid.wordpress.com/tag/scala/">Scala</a> <a href="http://feeds.wordpress.com/1.0/gocomments/michid.wordpress.com/206/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/michid.wordpress.com/206/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/michid.wordpress.com/206/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/michid.wordpress.com/206/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/michid.wordpress.com/206/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/michid.wordpress.com/206/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/michid.wordpress.com/206/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/michid.wordpress.com/206/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/michid.wordpress.com/206/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/michid.wordpress.com/206/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/michid.wordpress.com/206/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/michid.wordpress.com/206/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/michid.wordpress.com/206/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/michid.wordpress.com/206/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=michid.wordpress.com&amp;blog=2538862&amp;post=206&amp;subd=michid&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-04-11T20:05:17Z</updated>
    <category term="Uncategorized"/>
    <category term="Conference"/>
    <category term="Scala"/>
    <author>
      <name>michid</name>
    </author>
    <source>
      <id>http://michid.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/8a44e33f0c0b6ba0377f3633082fb84d?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://michid.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://michid.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://michid.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://michid.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Hacking Scala</subtitle>
      <title>Michid's Weblog</title>
      <updated>2010-09-03T03:00:24Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-31254910.post-1220920550633938611</id>
    <link href="http://michaelmarth.blogspot.com/feeds/1220920550633938611/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="https://www.blogger.com/comment.g?blogID=31254910&amp;postID=1220920550633938611" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/1220920550633938611?v=2" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/1220920550633938611?v=2" rel="self" type="application/atom+xml"/>
    <link href="http://feedproxy.google.com/~r/CoffeeGems/~3/5lMTHqyTo5E/nosql-talk-at-developer-summit.html" rel="alternate" type="text/html"/>
    <title>NoSQL talk at Developer Summit</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div>Three days ago I had to chance to talk about NoSQL at the <a href="http://www.internet-briefing.ch/index.cfm?CFID=46404093&amp;CFTOKEN=10212126&amp;page=101498&amp;anlass_id=216">Internet Briefing's Developer Summit</a>. On top of general ideas and concepts like the CAP theorem I chose to talk about <a href="http://jackrabbit.apache.org/">Apache Jackrabbit</a>, <a href="http://couchdb.apache.org/">CouchDB</a> and <a href="http://cassandra.apache.org/">Cassandra</a>. My slides are embedded below.</div><div><br/></div><div>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 <a href="http://sling.apache.org/site/index.html">Apache Sling</a> does something very similar for Jackrabbit.</div><div><br/></div><div>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.</div><div><br/></div><div>Vlad Trifa has posted a good summary of the whole event (<a href="http://www.webofthings.com/2010/04/07/internet-developers-day-part-1/">part 1</a>, <a href="http://www.webofthings.com/2010/04/07/internet-developers-day-part-2/">part 2</a>) - he also gave a great presentation about the application of the REST architectural style to the "Web of Things".</div><br/><br/><div id="__ss_3657930" style="width: 425px;"><strong style="display: block; margin: 12px 0 4px;"><a href="http://www.slideshare.net/mmarth/no-sql-3657930" title="No Sql">No Sql</a></strong><div style="padding: 5px 0 12px;">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/mmarth">mmarth</a>.</div></div><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/31254910-1220920550633938611?l=michaelmarth.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2010-04-10T08:44:40Z</updated>
    <published>2010-04-10T08:36:00Z</published><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://michaelmarth.blogspot.com/2010/04/nosql-talk-at-developer-summit.html</feedburner:origlink>
    <author>
      <name>Michael Marth</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/03925861261744910154</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-31254910</id>
      <author>
        <name>Michael Marth</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/03925861261744910154</uri>
      </author>
      <link href="http://michaelmarth.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://michaelmarth.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/31254910/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/CoffeeGems" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>About software development</subtitle>
      <title>Coffee &amp; Gems</title>
      <updated>2010-08-18T21:52:44Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=295</id>
    <link href="http://jukkaz.wordpress.com/2010/03/30/true-size-of-finland/" rel="alternate" type="text/html"/>
    <title>True size of Finland</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Whenever you see a map, the chances are that it uses the Mercator projection. It’s a fine enough projection especially on a local scale, but I’ve always disliked the way it makes places that are far from the equator seem much larger than they really are. Since I’ve lived most of my life in Finland [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=295&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Whenever you see a map, the chances are that it uses the <a href="http://en.wikipedia.org/wiki/Mercator_projection">Mercator projection</a>. It’s a fine enough projection especially on a local scale, but I’ve always disliked the way it makes places that are far from the equator seem much larger than they really are. Since I’ve lived most of my life in Finland (i.e. above 60° N or as high up north as Alaska), I find that this distortion heavily affects my ability to accurately estimate distances in other parts of the world even when I’m well aware of this problem.</p>
<p>To illustrate this issue, I’ve constructed the below image that shows how Finland compares to Central Europe and Southern China (the areas I’m most interested in) in the Mercator projection and the <a href="http://en.wikipedia.org/wiki/Goode_homolosine_projection">Goode homolosine projection</a> that accurately represents the relative areas of any two places on the earth. The difference is really quite striking:</p>
<p><img alt="" class="aligncenter size-full wp-image-296" height="416" src="http://jukkaz.files.wordpress.com/2010/03/size.png?w=430&amp;h=416" title="Mercator vs Goode homolosine" width="430"/></p>
<p>I’m considering purchasing a poster with such an <a href="http://en.wikipedia.org/wiki/Map_projection#Equal-area">equal-area</a> world map and hanging it on a wall somewhere I can see it every day. That way I could perhaps overcome the systematic error that the Mercator projection has taught me.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/295/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/295/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/295/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/295/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/jukkaz.wordpress.com/295/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jukkaz.wordpress.com/295/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/jukkaz.wordpress.com/295/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jukkaz.wordpress.com/295/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/295/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/295/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/295/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/295/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/295/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/295/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=295&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-03-29T23:31:40Z</updated>
    <category term="General"/>
    <category term="map"/>
    <category term="projection"/>
    <category term="Mercator"/>
    <category term="Goode homolosine"/>
    <category term="systematic error"/>
    <category term="perception"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-09-03T03:00:12Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-31254910.post-3462962738980534944</id>
    <link href="http://michaelmarth.blogspot.com/feeds/3462962738980534944/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="https://www.blogger.com/comment.g?blogID=31254910&amp;postID=3462962738980534944" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/3462962738980534944?v=2" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/3462962738980534944?v=2" rel="self" type="application/atom+xml"/>
    <link href="http://feedproxy.google.com/~r/CoffeeGems/~3/YDwTTcAD0bY/cms-vendors-now-and-then.html" rel="alternate" type="text/html"/>
    <title>CMS vendors now and then</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">CMS analyst Janus Boye has just <a href="http://www.jboye.com/blogpost/vendors-kill-products-and-make-customers-pay/">published a post on CMS vendors that discontinue their products</a> (because they get bought out or similar)<div><blockquote>During the past 10 years, a number of software products used by online  professionals have been discontinued</blockquote></div><div>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:</div><div><br/></div><div><br/><a href="http://4.bp.blogspot.com/_UDN4j-Aji_4/S5pv2Rc2ARI/AAAAAAAA-ZE/rHAxNCPDRVo/s1600-h/Dock.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5447789677446037778" src="http://4.bp.blogspot.com/_UDN4j-Aji_4/S5pv2Rc2ARI/AAAAAAAA-ZE/rHAxNCPDRVo/s400/Dock.jpg" style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; cursor: hand; width: 400px; height: 300px;"/></a><br/></div><div>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.</div><div><br/></div><div>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 <a href="http://www.trenovis.de/index.cfm?contentid=39">iRacer</a>, <a href="http://www.schema.de/eds/">Schema Text</a>, or <a href="http://www.contens.de/de/pub/index.cfm">Contens</a>.</div><div><br/></div><div>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 <a href="http://spreadsheets.google.com/pub?key=tFsgr9oK6C8D1cgbmERMvLA&amp;output=html">Janus Boye's spreadsheet of relevant European CMS vendors</a> as a benchmark and checked which vendor's of today's list were already in 2001's presentation: <a href="http://www.day.com/day/en.html">Day</a>, <a href="https://www.coremedia.com/en">Coremedia</a> and <a href="http://www.opentext.com/">Open Text</a> were "in the circles". <a href="http://www.sdltridion.com/">Tridion</a> was there, but outside of the circles. The rest of the vendors that Janus considers relevant today were not on my radar in 2001.</div><div><br/></div><div>The end of my presentation involved a couple of CMS-related predictions. Let's see how I did. I predicted:</div><div><ul><li>product borders between CMS, DMS and app servers will blur further - my take now: <i>wrong. I do not think that these border are more blurry than they were in 2001</i></li><li>more standards and standards-based software (Java, JSP/ASP, XML, XSL) - <i>true. The underlying technologies of CMSs are more homogeneous than they were at that time. Remember TCL?</i></li><li>But no true compatibility. <i>True. Nothing more to say.</i></li><li>Improved Personalization. Improved Multi-Channel support. <i>Both not really true, but rather fads of those days.</i></li><li>Improved DMS features and Office integration. <i>Don't ask me why I said that.</i></li><li>No quick market consolidation in sight. <i>Right on the money here.</i></li></ul>Mostly correct on general market considerations, mostly wrong on features.</div><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/31254910-3462962738980534944?l=michaelmarth.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2010-03-12T16:56:58Z</updated>
    <published>2010-03-12T16:11:00Z</published><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://michaelmarth.blogspot.com/2010/03/cms-vendors-now-and-then.html</feedburner:origlink>
    <author>
      <name>Michael Marth</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/03925861261744910154</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-31254910</id>
      <author>
        <name>Michael Marth</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/03925861261744910154</uri>
      </author>
      <link href="http://michaelmarth.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://michaelmarth.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/31254910/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/CoffeeGems" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>About software development</subtitle>
      <title>Coffee &amp; Gems</title>
      <updated>2010-08-18T21:52:44Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=293</id>
    <link href="http://jukkaz.wordpress.com/2010/01/29/the-new-basic/" rel="alternate" type="text/html"/>
    <title>The new BASIC</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I’m seeing many posts that worry about computing devices like iPhones and the new iPad preventing people from having direct control over the hardware. Mark is telling us about a Ctrl+Reset and a BASIC prompt. Nowadays you get started with the following on an HTML page: &lt;script type="text/javascript"&gt; document.write("Hello, World!"); &lt;/script&gt; And you can do [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=293&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’m seeing <a href="http://diveintomark.org/archives/2010/01/29/tinkerers-sunset" title="Mark Pilgrim: Tinkerer's Sunset">many</a> <a href="http://www.tbray.org/ongoing/When/201x/2010/01/27/iPad" title="Tim Bray: Nothing Creative">posts</a> that worry about computing devices like iPhones and the new iPad preventing people from having direct control over the hardware. Mark is telling us about a Ctrl+Reset and a BASIC prompt. Nowadays you get started with the following on an HTML page:</p>
<pre>    &lt;script type="text/javascript"&gt;
    document.write("Hello, World!");
    &lt;/script&gt;</pre>
<p>And you can do <em>anything</em>! Don’t tell me the days of tinkering are over.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/293/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/293/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/293/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/293/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/jukkaz.wordpress.com/293/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jukkaz.wordpress.com/293/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/jukkaz.wordpress.com/293/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jukkaz.wordpress.com/293/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/293/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/293/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/293/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/293/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/293/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/293/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=293&amp;subd=jukkaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-01-29T22:40:07Z</updated>
    <category term="Technology"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-09-03T03:00:13Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://michid.wordpress.com/?p=192</id>
    <link href="http://michid.wordpress.com/2010/01/29/scala-type-level-encoding-of-the-ski-calculus/" rel="alternate" type="text/html"/>
    <title>Scala type level encoding of the SKI calculus</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In one of my posts on type level meta programming in Scala the question of Turing completeness came up already. The question is whether Scala’s type system can be used to force the Scala compiler to carry out any calculation which a Turing machine is capable of. Various of my older posts show how Scala’s [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=michid.wordpress.com&amp;blog=2538862&amp;post=192&amp;subd=michid&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>In one of my <a href="http://michid.wordpress.com/2008/10/29/meta-programming-with-scala-conditional-compilation-and-loop-unrolling/">posts</a> on type level meta programming in Scala the question of <a href="http://en.wikipedia.org/wiki/Turing_complete">Turing completeness</a> came up already. The question is whether Scala’s type system can be used to force the Scala compiler to carry out any calculation which a Turing machine is capable of. Various of my older posts show how Scala’s type system can be used to encode <a href="http://michid.wordpress.com/2008/04/18/meta-programming-with-scala-part-i-addition/">addition</a> and <a href="http://michid.wordpress.com/2008/08/27/meta-programming-with-scala-part-iii-partial-function-application/">multiplication</a> on natural numbers and how to encode <a href="http://michid.wordpress.com/2008/10/29/meta-programming-with-scala-conditional-compilation-and-loop-unrolling/">conditions and bounded loops</a>. </p>
<p>Motivated by the blog post <a href="http://apocalisp.wordpress.com/2009/09/02/more-scala-typehackery/">More Scala Typehackery</a> which shows how to encode a version of the <a href="http://en.wikipedia.org/wiki/Lambda_calculus">Lambda calculus</a> which is limited to abstraction over a single variable in Scala’s type system I set out to further explore the topic. </p>
<p/><h5 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">The SKI combinator calculus</h5><br/>
Looking for a calculus which is relatively small, easily encoded in Scala’s type system and known to be Turing complete I came across the <a href="http://en.wikipedia.org/wiki/SKI_combinator_calculus">SKI combinator calculus</a>. The SKI combinators are defined as follows:<p/>
<p>  <img alt="Ix \rightarrow x " class="latex" src="http://l.wordpress.com/latex.php?latex=Ix+%5Crightarrow+x+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="Ix \rightarrow x "/>,<br/>
  <img alt="Kxy \rightarrow x " class="latex" src="http://l.wordpress.com/latex.php?latex=Kxy+%5Crightarrow+x+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="Kxy \rightarrow x "/>,<br/>
  <img alt="Sxyz \rightarrow xz(yz) " class="latex" src="http://l.wordpress.com/latex.php?latex=Sxyz+%5Crightarrow+xz%28yz%29+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="Sxyz \rightarrow xz(yz) "/>.</p>
<p>They can be used to encode arbitrary calculations. For example reversal of arguments. Let <img alt="R \equiv S(K(SI))K " class="latex" src="http://l.wordpress.com/latex.php?latex=R+%5Cequiv+S%28K%28SI%29%29K+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="R \equiv S(K(SI))K "/>. Then </p>
<p>  <img alt="R x y \equiv " class="latex" src="http://l.wordpress.com/latex.php?latex=R+x+y+%5Cequiv+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="R x y \equiv "/><br/>
  <img alt="S(K(SI))K x y \rightarrow " class="latex" src="http://l.wordpress.com/latex.php?latex=S%28K%28SI%29%29K+x+y+%5Crightarrow+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="S(K(SI))K x y \rightarrow "/><br/>
  <img alt="K(SI)x(Kx)y \rightarrow " class="latex" src="http://l.wordpress.com/latex.php?latex=K%28SI%29x%28Kx%29y+%5Crightarrow+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="K(SI)x(Kx)y \rightarrow "/><br/>
  <img alt="SI(Kx)y \rightarrow " class="latex" src="http://l.wordpress.com/latex.php?latex=SI%28Kx%29y+%5Crightarrow+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="SI(Kx)y \rightarrow "/><br/>
  <img alt="Iy(Kxy) \rightarrow " class="latex" src="http://l.wordpress.com/latex.php?latex=Iy%28Kxy%29+%5Crightarrow+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="Iy(Kxy) \rightarrow "/><br/>
  <img alt="Iyx \rightarrow yx " class="latex" src="http://l.wordpress.com/latex.php?latex=Iyx+%5Crightarrow+yx+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="Iyx \rightarrow yx "/>.</p>
<p>Self application is used to find <a href="http://en.wikipedia.org/wiki/Fixed_point_combinator">fixed points</a>. Let <img alt="\beta \equiv S(K\alpha)(SII) " class="latex" src="http://l.wordpress.com/latex.php?latex=%5Cbeta+%5Cequiv+S%28K%5Calpha%29%28SII%29+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="\beta \equiv S(K\alpha)(SII) "/> for some combinator <img alt="\alpha " class="latex" src="http://l.wordpress.com/latex.php?latex=%5Calpha+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="\alpha "/>. Then <img alt="\beta\beta \rightarrow \alpha(\beta \beta) " class="latex" src="http://l.wordpress.com/latex.php?latex=%5Cbeta%5Cbeta+%5Crightarrow+%5Calpha%28%5Cbeta+%5Cbeta%29+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="\beta\beta \rightarrow \alpha(\beta \beta) "/>. That is, <img alt="\beta\beta" class="latex" src="http://l.wordpress.com/latex.php?latex=%5Cbeta%5Cbeta&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="\beta\beta"/> is a fixed point of <img alt="\alpha " class="latex" src="http://l.wordpress.com/latex.php?latex=%5Calpha+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="\alpha "/>. This can be used to achieve recursion. Let <img alt="R " class="latex" src="http://l.wordpress.com/latex.php?latex=R+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="R "/> be the reversal combinator from above. Further define </p>
<p>  <img alt="A_0 x \equiv c " class="latex" src="http://l.wordpress.com/latex.php?latex=A_0+x+%5Cequiv+c+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="A_0 x \equiv c "/> for some combinator <img alt="c " class="latex" src="http://l.wordpress.com/latex.php?latex=c+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="c "/> and<br/>
  <img alt="A_n x \equiv x A_{n-1} " class="latex" src="http://l.wordpress.com/latex.php?latex=A_n+x+%5Cequiv+x+A_%7Bn-1%7D+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="A_n x \equiv x A_{n-1} "/>.</p>
<p>That is, combinator <img alt="A_n" class="latex" src="http://l.wordpress.com/latex.php?latex=A_n&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="A_n"/> is the combinator obtained by applying its argument to the combinator <img alt="A_{n-1}" class="latex" src="http://l.wordpress.com/latex.php?latex=A_%7Bn-1%7D&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="A_{n-1}"/>. (There is a bit of cheating here: I should actually show that such combinators exist. However since the SKI calculus is Turing complete, I take this for granted.) Now let <img alt="\alpha " class="latex" src="http://l.wordpress.com/latex.php?latex=%5Calpha+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="\alpha "/> be <img alt="R" class="latex" src="http://l.wordpress.com/latex.php?latex=R&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="R"/> in <img alt="\beta " class="latex" src="http://l.wordpress.com/latex.php?latex=%5Cbeta+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="\beta "/> from above (That is we have <img alt="\beta \equiv S(KR)(SII)" class="latex" src="http://l.wordpress.com/latex.php?latex=%5Cbeta+%5Cequiv+S%28KR%29%28SII%29&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="\beta \equiv S(KR)(SII)"/> now). Then</p>
<p>  <img alt="\beta\beta A_0 \rightarrow c" class="latex" src="http://l.wordpress.com/latex.php?latex=%5Cbeta%5Cbeta+A_0+%5Crightarrow+c&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="\beta\beta A_0 \rightarrow c"/> </p>
<p>and by induction</p>
<p>  <img alt="\beta\beta A_n \rightarrow \beta\beta A_{n-1} \rightarrow c" class="latex" src="http://l.wordpress.com/latex.php?latex=%5Cbeta%5Cbeta+A_n+%5Crightarrow+%5Cbeta%5Cbeta+A_%7Bn-1%7D+%5Crightarrow+c&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="\beta\beta A_n \rightarrow \beta\beta A_{n-1} \rightarrow c"/>.</p>
<p/><h5 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">Type level SKI in Scala</h5><br/>
Encoding the SKI combinator calculus in Scala’s type system seems not too difficult at first. It turns out however that some care has to be taken regarding the order of evaluation. To guarantee that for all terms which have a normal form, that normal form is actually found, a lazy evaluation order has to be employed. <p/>
<p>Here is a Scala type level encoding of the SKI calculus:</p>
<pre class="brush: java;">trait Term {
  type ap[x &lt;: Term] &lt;: Term
  type eval &lt;: Term
}

// The S combinator
trait S extends Term {
  type ap[x &lt;: Term] = S1[x]
  type eval = S
}
trait S1[x &lt;: Term] extends Term {
  type ap[y &lt;: Term] = S2[x, y]
  type eval = S1[x]
}
trait S2[x &lt;: Term, y &lt;: Term] extends Term {
  type ap[z &lt;: Term] = S3[x, y, z]
  type eval = S2[x, y]
}
trait S3[x &lt;: Term, y &lt;: Term, z &lt;: Term] extends Term {
  type ap[v &lt;: Term] = eval#ap[v]
  type eval = x#ap[z]#ap[y#ap[z]]#eval
}

// The K combinator
trait K extends Term {
  type ap[x &lt;: Term] = K1[x]
  type eval = K
}
trait K1[x &lt;: Term] extends Term {
  type ap[y &lt;: Term] = K2[x, y]
  type eval = K1[x]
}
trait K2[x &lt;: Term, y &lt;: Term] extends Term {
  type ap[z &lt;: Term] = eval#ap[z]
  type eval = x#eval
}

// The I combinator
trait I extends Term {
  type ap[x &lt;: Term] = I1[x]
  type eval = I
}
trait I1[x &lt;: Term] extends Term {
  type ap[y &lt;: Term] = eval#ap[y]
  type eval = x#eval
}
</pre>
<p>Further lets define some constants to act upon. These are used to test whether the calculus actually works.</p>
<pre class="brush: java;">trait c extends Term {
  type ap[x &lt;: Term] = c
  type eval = c
}
trait d extends Term {
  type ap[x &lt;: Term] = d
  type eval = d
}
trait e extends Term {
  type ap[x &lt;: Term] = e
  type eval = e
}
</pre>
<p>Eventually the following definition of <em>Equals</em> lets us check types for equality:</p>
<pre class="brush: java;">case class Equals[A &gt;: B &lt;:B , B]()

Equals[Int, Int]     // compiles fine
Equals[String, Int] // won't compile
</pre>
<p>Now lets see whether we can evaluate some combinators.</p>
<pre class="brush: java;">  // Ic -&gt; c
  Equals[I#ap[c]#eval, c]

  // Kcd -&gt; c
  Equals[K#ap[c]#ap[d]#eval, c]

  // KKcde -&gt; d
  Equals[K#ap[K]#ap[c]#ap[d]#ap[e]#eval, d]

  // SIIIc -&gt; Ic
  Equals[S#ap[I]#ap[I]#ap[I]#ap[c]#eval, c]

  // SKKc -&gt; Ic
  Equals[S#ap[K]#ap[K]#ap[c]#eval, c]

  // SIIKc -&gt; KKc
  Equals[S#ap[I]#ap[I]#ap[K]#ap[c]#eval, K#ap[K]#ap[c]#eval]

  // SIKKc -&gt; K(KK)c
  Equals[S#ap[I]#ap[K]#ap[K]#ap[c]#eval, K#ap[K#ap[K]]#ap[c]#eval]

  // SIKIc -&gt; KIc
  Equals[S#ap[I]#ap[K]#ap[I]#ap[c]#eval, K#ap[I]#ap[c]#eval]

  // SKIc -&gt; Ic
  Equals[S#ap[K]#ap[I]#ap[c]#eval, c]

  // R = S(K(SI))K  (reverse)
  type R = S#ap[K#ap[S#ap[I]]]#ap[K]
  Equals[R#ap[c]#ap[d]#eval, d#ap[c]#eval]
</pre>
<p>Finally lets check whether we can do recursion using the fixed point operator from above. First lets define <img alt="\beta " class="latex" src="http://l.wordpress.com/latex.php?latex=%5Cbeta+&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="\beta "/>.</p>
<pre class="brush: java;">  // b(a) = S(Ka)(SII)
  type b[a &lt;: Term] = S#ap[K#ap[a]]#ap[S#ap[I]#ap[I]]
</pre>
<p>Further lets define some of the <img alt="A_n" class="latex" src="http://l.wordpress.com/latex.php?latex=A_n&amp;bg=ffffff&amp;fg=000000&amp;s=0" title="A_n"/>s from above.</p>
<pre class="brush: java;">trait A0 extends Term {
  type ap[x &lt;: Term] = c
  type eval = A0
}
trait A1 extends Term {
  type ap[x &lt;: Term] = x#ap[A0]#eval
  type eval = A1
}
trait A2 extends Term {
  type ap[x &lt;: Term] = x#ap[A1]#eval
  type eval = A2
}
</pre>
<p>Now we can do iteration on the type level using a fixed point combinator:</p>
<pre class="brush: java;">  // Single iteration
  type NN1 = b[R]#ap[b[R]]#ap[A0]
  Equals[NN1#eval, c]

  // Double iteration
  type NN2 = b[R]#ap[b[R]]#ap[A1]
  Equals[NN2#eval, c]

  // Triple iteration
  type NN3 = b[R]#ap[b[R]]#ap[A2]
  Equals[NN3#eval, c]
</pre>
<p>Finally lets check whether we can do ‘unbounded’ iteration. </p>
<pre class="brush: java;">trait An extends Term {
  type ap[x &lt;: Term] = x#ap[An]#eval
  type eval = An
}
// Infinite iteration: Smashes scalac's stack
  type NNn = b[R]#ap[b[R]]#ap[An]
  Equals[NNn#eval, c]
</pre>
<p>Well, we can <img alt=";-)" class="wp-smiley" src="http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif"/> </p>
<pre>$ scalac SKI.scala
Exception in thread "main" java.lang.StackOverflowError
        at scala.tools.nsc.symtab.Types$SubstMap.apply(Types.scala:3165)
        at scala.tools.nsc.symtab.Types$SubstMap.apply(Types.scala:3136)
        at scala.tools.nsc.symtab.Types$TypeMap.mapOver(Types.scala:2735)
</pre>
<br/>Filed under: <a href="http://michid.wordpress.com/category/uncategorized/">Uncategorized</a> Tagged: <a href="http://michid.wordpress.com/tag/meta-programming/">Meta-Programming</a>, <a href="http://michid.wordpress.com/tag/scala/">Scala</a> <a href="http://feeds.wordpress.com/1.0/gocomments/michid.wordpress.com/192/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/michid.wordpress.com/192/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/michid.wordpress.com/192/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/michid.wordpress.com/192/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/michid.wordpress.com/192/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/michid.wordpress.com/192/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/michid.wordpress.com/192/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/michid.wordpress.com/192/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/michid.wordpress.com/192/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/michid.wordpress.com/192/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/michid.wordpress.com/192/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/michid.wordpress.com/192/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/michid.wordpress.com/192/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/michid.wordpress.com/192/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=michid.wordpress.com&amp;blog=2538862&amp;post=192&amp;subd=michid&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2010-01-29T17:58:41Z</updated>
    <category term="Uncategorized"/>
    <category term="Meta-Programming"/>
    <category term="Scala"/>
    <author>
      <name>michid</name>
    </author>
    <source>
      <id>http://michid.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/8a44e33f0c0b6ba0377f3633082fb84d?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://michid.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://michid.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://michid.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://michid.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Hacking Scala</subtitle>
      <title>Michid's Weblog</title>
      <updated>2010-09-03T03:00:23Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/lotd20100113.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/lotd20100113.html" rel="alternate" type="text/html"/>
    <title>[LOTD] Standards Diagram for Content Management</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Following up on Jon Marks' <a href="http://dev.day.com/microsling/content/blogs/main/lotd20091126.html">post on standards relevant for content management</a> Justin Cormack has put together a "<a href="http://blog.technologyofcontent.com/2010/01/standards-diagram/">Standards Diagram for Content Management</a>" Prezi landscape. Nice work!
</p>



<br/>
<p>
The part "structuring" in Justin's presentation contains Docbook and DITA. <a href="http://dev.day.com/microsling/content/blogs/main/docbookdita.html">Theresa compared these two standards</a> a while ago:
</p>

<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"><a href="http://www.slideshare.net/?src=embed"><img alt="SlideShare" src="http://static.slideshare.net/swf/logo_embd.png"/></a> | <a href="http://www.slideshare.net/day/doc-book-vs-dita-teresa" title="View 'Doc Book Vs Dita Teresa' on SlideShare">View</a> | <a href="http://www.slideshare.net/upload">Upload your own</a></div></div>
    </summary>
    <updated>2010-01-13T00:00:01Z</updated>
    <category term="lotd"/>
    <category term="jcr"/>
    <category term="cmis"/>
    <category term="webdav"/>
    <category term="standards"/>
    <category term="atom"/>
    <category term="wcm"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2010-01-13T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/dsconfig.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/dsconfig.html" rel="alternate" type="text/html"/>
    <title>Declarative Services: Configuration</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p> OSGi Declarative Services components are configured by properties defined by the component developer in the component descriptor and by configuration managed by system administrators using the OSGi Configuration Admin Service. The combined set of properties is traditionally made available to the component as a <tt>Dictionary</tt> calling the <tt>ComponentContext.getProperties()</tt> method. The component context is provided to the <tt>activate</tt> method called when the component is activated. </p>  <p> This makes configuration of components very simple, since the component itself does not have to care where configuration comes from and how it is maintained. In addition, a component always knows it is starting from scratch when the <tt>activate</tt> method is called. This is because a component instance is never reused and a component reconfiguration means the component is deactivated and activated with the new configuration.  </p>  <p> There are some drawbacks to this solution, though: </p>  <ul> <li>Reactivation of a component may be an expensive operation. Particularly if the component provides a service which is heavily used and relied upon, such as for example the <tt>SlingRepository</tt> service in Communiqu&amp;eactue 5.</li> <li>If a component is keeping internal state, e.g. gathering statistics, reactivation of the component will cause loss of this state.</li> </ul>  <p> This is where the new Declarative Services specification version 1.1 kicks in and improves much. First of all, configuration may be updated dynamically without reactivating the component. Second a component may declare itself as not needing configuration or even as requiring configuration thus only activating the component if configuration is actually available from the Configuration Admin service. </p>  <p> To use dynamic reconfiguration you have to declare a method to take this updated configuration in the <tt>modified</tt> attribute of the component element. When using the Apache Felix Maven SCR Plugin, use the <tt>modified</tt> attribute of the <tt>@scr.component</tt> tag:  </p><pre> @scr.component modified="modified" </pre>  <p> and define a method taking the configuration, for example:  </p><pre> private void modified(Map config) {<br/>     // apply the configurtion dynamically<br/> } </pre>  <p> Unless the configuration may cause the component's references to be modified the component configuration is now dynamically provided without reactivating the component. </p>  <p> The method defined in the <tt>modified</tt> attribute has the same requirements as the <tt>activate</tt> method: It may be have any access modifier (but should not be public) and it may take any combination of <tt>ComponentContext</tt>, <tt>BundleContext</tt>, and <tt>Map</tt> arguments. Of course for a <tt>modified</tt> the primary useful type <tt>Map</tt> as in the example above&lt;. </p><p>  If you know your component cannot be configured or if you absolutely need configuration of your component, you can declare this desire using the <tt>configuration-policy</tt> attribute of the <tt>component</tt> element (or the <tt>policy</tt> attribute of the <tt>@scr.component</tt> JavaDoc tag):  </p><dl> <dt><tt>optional</tt></dt> <dd>Configuration from the Configuration Admin Service is provided to the component if available. This is the default setting and is the same as in the previous Declarative Services specification.</dd> <dt><tt>require</tt></dt> <dd>Configuration from the Configuration Admin Service is required for the component to be activated. If the configuration is deleted, the component will be deactivated. This setting allows for a component to be controlled by the existence of configuration.</dd> <dt><tt>ignore</tt></dt> <dd>Configuration from the Configuration Admin Service is never retrieved on behalf of and provided to the component. If your component has no configurable properties, this setting makes sense.</dd> </dl>   <p> <b>Note: </b> To use the functionality described in this article, you have to use a Declarative Services 1.1 implementation such as Apache Felix SCR 1.2.0 or newer. </p></div>
    </summary>
    <updated>2010-01-13T00:00:01Z</updated>
    <category term="osgi"/>
    <category term="declarative services"/>
    <category term="component"/>
    <category term="scr"/>
    <category term="configuration"/>
    <category term="modified"/>
    <category term="configuration admin"/>
    <author>
      <name>Felix Meschberger</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2010-01-13T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/dsdelayedcomponent.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/dsdelayedcomponent.html" rel="alternate" type="text/html"/>
    <title>Declarative Services: Delayed Components</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p> The OSGi Declarative services specification defines three types of components: </p>  <ol> <li><b>Immediate Components</b> are immediately created when the providing bundle is started and may or may not provide services </li> <li><b>Delayed Components</b> provide services but are only created when used by a service consumer.</li> <li><b>Factory Components</b> are created on demand by calling the <tt>ComponentFactory.newInstance(Dictionary)</tt> method of the Component Factory service registered for the component.</li> </ol>  <p> This blog is about a special behaviour of delayed components which may seem unexpected in the first place: Delayed components are created (activated) on-demand (when they are first requested) and have to be deleted (deactivated) as soon as there is no user any longer (Chapter 112.5.4, Delayed Component, in the Compendium Spec; see also <a href="https://issues.apache.org/jira/browse/FELIX-1825">FELIX-1825</a>) </p>  <p> The intent of this behaviour is to reduce the system (or bundle) startup time in that delayed components are only instantiated when really used. In addition memory consumption may be reduced at times when the service is not used. The drawback is, that the service is activated and deactivated if there is a single consumer which uses the service for short periods of times only. An example of such an oft used service is an OSGi <tt>EventHandler</tt> service, which is got by the Event Admin service when ever an event must be delivered and released after the delivery. </p>  <p> <b>How does a Component become a delayed component ?</b> </p>  <p> By default a component providing a service is a delayed component unless the component is explicitly declared as an immediate component. If you are using the Apache Felix Maven SCR plugin, a component is (by default) delayed if the <tt>@scr.service</tt> tag is used. Thus the above activation and deactivation rules apply. To turn a service component into an immediate component, you have to set the immediate attribute to, as in : </p>  <pre> @scr.component immediate="true" </pre>  <p> <b>Shall I change all my components to be immediate components ?</b> </p>  <p> The short answer is: <i>It depends</i>. </p>  <p> Here are some general rules of thumb: </p>  <ul> <li>If your service can be expected to be immediately used and not released until system shutdown, defining the component as delayed does not make much sense. In this case, it is probably better to explicitly define the component as immediate. An example of such a component is a Servlet service in Sling, which is immediately used by the Sling Servlet Registry.</li> <li>If your service is in fact a service factory (using the <tt>servicefactory</tt> attribute, you cannot declare the component immediate, because service factory components are always delayed</li> <li>If your component is used a lot for short periods of time, you should probably define your service as an immediate component. An example of such a service is an OSGi <tt>EventHandler</tt> service.</li> <li>If you want to maintain state in your component and make that state available to clients by registering a service, the component should be defined as immediate. An example of such a service might be statistics provider, which gathers statistics and provides them through its service API.</li> <li>If your component is only seldom used it would be best to define it as a delayed component. An example of such a component in Communiqué 5 might be a workflow step service, which implements very specific behaviour.</li> </ul></div>
    </summary>
    <updated>2010-01-12T00:00:01Z</updated>
    <category term="osgi"/>
    <category term="declarative services"/>
    <category term="component"/>
    <category term="scr"/>
    <category term="delayed component"/>
    <author>
      <name>Felix Meschberger</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2010-01-13T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-31254910.post-5394883619738616643</id>
    <link href="http://michaelmarth.blogspot.com/feeds/5394883619738616643/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="https://www.blogger.com/comment.g?blogID=31254910&amp;postID=5394883619738616643" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/5394883619738616643?v=2" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/5394883619738616643?v=2" rel="self" type="application/atom+xml"/>
    <link href="http://feedproxy.google.com/~r/CoffeeGems/~3/R-LX9y6DLcI/mp3tagger-on-github.html" rel="alternate" type="text/html"/>
    <title>mp3tagger on GitHub</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">On the <a href="http://michaelmarth.blogspot.com/2009/11/python-script-to-set-genre-in-itunes.html">mp3 tagger post</a> 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 <a href="http://github.com/michaelmarth/mp3tagger">put the code on GitHub</a> where it can easily be forked (and the forks can be watched).<br/><br/>Other than that, the latest version of the tagger contains these improvements:<br/><ul><li>the Last.fm keys and secret are not stored in the code anymore, but entered on the first run and stored in ~/.mp3tagger.cfg</li><li>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.</li><li>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.</li><li>The last improvement is a tricky one: after tagging all my mp3s I ended up with hundreds of albums tagged with genre <span style="font-style: italic;">Electronic</span> or <span style="font-style: italic;">Indie</span>. 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 <span style="font-style: italic;">genre</span>", 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.<br/></li></ul>So in summary my config file ~/.mp3tagger_genres.cfg looks like:<br/><br/><pre><br/>[generic]<br/>genres=Shoegaze,Dubstep,Grime,Dub,Drum And Bass<br/>[refinements]<br/>Electronic=Idm,Turntableism,Techno,Minimal,Dub,Big Beat,Ambient,Breakbeat,House,Lounge,Electroclash,Drum And Bass,Chillout<br/>Indie=Indie Rock,Indie Pop,Singer-Songwriter,Indie Pop,Shoegaze,Post-Rock,Americana,New Wave,Alt-Country<br/>Reggae=Dancehall,Dub,Ska<br/></pre><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/31254910-5394883619738616643?l=michaelmarth.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2010-01-09T15:25:12Z</updated>
    <published>2010-01-09T14:50:00Z</published><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://michaelmarth.blogspot.com/2010/01/mp3tagger-on-github.html</feedburner:origlink>
    <author>
      <name>Michael Marth</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/03925861261744910154</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-31254910</id>
      <author>
        <name>Michael Marth</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/03925861261744910154</uri>
      </author>
      <link href="http://michaelmarth.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://michaelmarth.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/31254910/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/CoffeeGems" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>About software development</subtitle>
      <title>Coffee &amp; Gems</title>
      <updated>2010-08-18T21:52:44Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/bundleidentification.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/bundleidentification.html" rel="alternate" type="text/html"/>
    <title>Identifications of OSGi Bundles</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p> Looking at the Bundle details in the Web Console you will notice a number of entries providing information about the bundles. In this article I will explain a bit more about the information regarding the identification of bundles. </p>  <p> Looking at the following screen dump you will notice a number of identifaction details of a bundle: </p> <p><a href="http://dev.day.com/microsling/content/blogs/main/bundleidentification/docroot/bundledetails.png">    <img src="http://dev.day.com/microsling/content/blogs/main/bundleidentification/docroot/bundledetails-thumb.png" style="float: none;"/> </a> </p> <ol> <li>The bundle identification number. This is a number uniquely identifying the bundle. This number assigned to the bundle at the installation time of the bundle and never changes. These numbers are also unique within the framework. Never will a bundle ever be assigned the same number, even if the currently installed bundle is uninstalled.</li>  <li>The bundle name. This is a descriptive name of the bundle which is ignored by the OSGi framework. This name is provided by the bundle developer as the contents of the <tt>Bundle-Name</tt> manifest header.</li>  <li>The bundle symbolic name. This is a symbolic name of the bundle, which is used by the OSGi framework together with the bundle version number to identify the bundle. That is, no two bundles with the same symbolic name and version may be installed in a single OSGi framework. But multiple bundles may be installed which have the same symbolic name but differ in their version number. This symbolic name is provided by the bundle developer as the contents of the <tt>Bundle-SymbolicName</tt> manifest header.</li>  <li>The bundle version. The version of the bundle is used to convey the development state of the bundle as a whole. Together with the bundle symbolic name the version number must be unique within an OSGi framework (see the description of the bundle symbolic name). Note that the OSGi framework places only synthatic restrictions on version numbers. This version is provided by the bundle developer as the contents of the <tt>Bundle-Version</tt> manifest header.</li>  <li>The bundle location. The bundle location is basically just a string. It is recommended that this string follows the syntax of an URL and it may even be used as an URL to update the bundle from: The <code>Bundle.update()</code> method uses the bundle location to try to access an updated bundle version. This is not used as such though in Communiqué 5 where the bundle location merely indicates where the bundle has initially been installed from. This value is provided by the administrator as the <tt>location</tt> parameter when installing the bundle through the <code>BundleContext.installBundle(String location)</code> or <code>BundleContext.installBundle(String location, InputStream input)</code> method. This value will not changed when the bundle is updated.</li>  <li>The last modification time. The last modification time is set by the framework when the bundle is modified. A bundle is modified when it is installed, updated or uninstalled. Starting and stopping the bundle does not change the last modification time. This information can be used to verify that a bundle update has really been executed by the OSGi framework.</li> </ol>  <p> As can be seen a number of identification details are set on installation time and never change afterwards and some details may change over time when a bundle is updated. </p>  <p> So here are the rules regarding these details: </p>  <ul> <li>The bundle identification number is assigned by the framework and is never reused.</li> <li>The bundle location is assigned from the <tt>location</tt> parameter when the bundle is installed and never changes during the existence of the bundle. No two bundles will ever be installed at the same time with the same bundle location. As such this location is also a unique identifier for bundles. But in contrast to the bundle identification number, the location may be "reused". That is, once a bundle with a given location has been uninstalled another bundle may be installed with the same location.</li> <li>The bundle symbolic name and version together also uniquely identify an installed bundle. These values are taken from the bundle manifest and therefore may change when a bundle is updated. But it is not allowed for multiple bundles to be installed with the same symbolic name and version at the same time.</li> </ul>  <p> So, whenever you update a bundle, either placing it into an <tt>install</tt> folder in the repository or through the Web Console, expect the bundle version and/or symbolic name to change. But both the bundle identification number and the bundle location will not be modified. The bundle last modification time will reflect the time at which the bundle has actually been updated by the framework. </p></div>
    </summary>
    <updated>2010-01-07T00:00:01Z</updated>
    <category term="osgi"/>
    <category term="bundle"/>
    <category term="location"/>
    <category term="id"/>
    <category term="symbolic name"/>
    <author>
      <name>Felix Meschberger</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2010-01-13T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/iksworkflowbenchmark.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/iksworkflowbenchmark.html" rel="alternate" type="text/html"/>
    <title>Custom CQ5 workflow step that integrates Twitter and Jabber</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
<a href="http://www.iks-project.eu"><img align="right" height="111" src="http://dev.day.com/microsling/content/blogs/main/iksworkflowbenchmark/docroot/iks-logo.jpg" width="214"/></a>
As part of the <a href="http://www.iks-project.eu/">IKS project</a> each CMS vendor completes a couple of <a href="http://wiki.iks-project.eu/index.php/Benchmarks">benchmarks</a> in order to establish a baseline against which future semantic improvements can be measured. For benchmark 3 "Workflow Service" Bertrand and I chose to implement the task "Create a multi-channel (email, SMS, instant messaging, Twitter,...) notification service for workflow transitions". We have created an automated <a href="http://dev.day.com/docs/en/cq/current/javadoc/com/day/cq/workflow/exec/JavaProcessExt.html">workflow step</a> that can be inserted into a custom workflow and either send an e-mail, send a direct message on <a href="http://www.twitter.com">Twitter</a> or send a chat message on <a href="http://www.google.com/talk/">GTalk</a>/<a href="http://xmpp.org/">Jabber</a>. The corresponding message's payload is the path to the content node in the workflow plus an optional custom text.
</p><p>
Below follows a description how this functionality was implemented in CQ5. The complete code is attached to this post as a CQ5 package. I will outline of some of the considerations and gotchas regarding this particular feature, but some issues apply to CQ5 development in general as well. The environment I used for development was <a href="http://dev.day.com/docs/en/crx/current/developing/development_tools/developing_with_crxde_lite.html">CRXDE Lite</a> (the web-based IDE available at <a href="http://localhost:4502/crxde">/crxde</a> of your CQ5 installation) and a beta version of the upcoming CQ5 release 5.3. It is probably helpful to install the package (see setup section below) and read the code alongside with this post.
</p>
<h6 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">OSGi services</h6>
<p>
A good way to hook up external services like Twitter etc. is to create a custom OSGi service that exposes only the business functionality and hides the internal classes. Moreover, it is good practice to provide a Java interface and the separate the implementation of the service (allowing the replacement of the implementation without affecting relying parties). The services will show up in the Sling configuration console at <a href="http://localhost:4502/system/console/configMgr">/system/console/configMgr</a>. This allows the administrator to configure the service's private parameters at deployment time (in our case Twitter account credentials and Jabber user credentials). The config is consumed by the service like e.g.:
</p>

<div class="codesnippet scrollablecodesnippet">
<pre>/** @scr.property */
public static final String GTALK_USER = "gtalk.service.user"; 
/** @scr.property */
public static final String GTALK_PASSWORD = "gtalk.service.password";   

protected void activate(ComponentContext context) {
    Dictionary config = context.getProperties();
    user = (String) config.get(GTALK_USER);
    password = (String) config.get(GTALK_PASSWORD);
}</pre></div>

<h6 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">3rd party libraries</h6>
<p>
In order to use Twitter and Jabber I utilized the open source libraries <a href="http://yusuke.homeip.net/twitter4j/en/index.html">Twitter4J</a> and <a href="http://today.java.net/pub/a/today/2006/10/05/instant-messaging-for-jabber-with-smack.html">Smack</a>, respectively. With CRXDE (Lite) it is very simple to include such 3rd party jars in a custom OSGi bundle: just drop them in the bundle's /libs folder. When building the bundle CRXDE will embed them. Compilation and deployment is done by executing "Build Bundle" (right-click on the .bnd file in the bundle root).
</p>
<h6 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">A note on 3rd party jar's dependencies</h6>
<p>
It might well be that the bundle compiles and deploys, but does not start. Check the OSGi console at <a href="http://localhost:4502/system/console/bundles">/system/console/bundles</a> to find out if your bundle's state is "Active" (good) or just "Installed" (not good). The latter happens e.g. when the embedded jar has dependencies on other jars that are not embedded. In such a case check the bundle's details page in the Sling console to find out which dependencies are missing and either add them to /libs as well or take them out of the OSGi imports. That is achieved by editing the <a href="http://www.aqute.biz/Code/Bnd">.bnd file</a>'s import directive, e.g.
</p>
<div class="codesnippet scrollablecodesnippet">
<pre>Import-Package: !com.sun.syndication.*, !dalvik.system, *
</pre></div>

<h6 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">Workflow action</h6>
<p>
The last needed piece is a workflow step that can be added into a custom workflow. For that purpose one simply needs to create a class that implements the Interface <a href="http://dev.day.com/docs/en/cq/current/javadoc/com/day/cq/workflow/exec/JavaProcessExt.html">JavaProcessExt</a>. The method <a href="http://dev.day.com/docs/en/cq/current/javadoc/com/day/cq/workflow/exec/JavaProcessExt.html#execute%28com.day.cq.workflow.exec.WorkItem,%20com.day.cq.workflow.WorkflowSession,%20java.lang.String[]%29">execute</a> will receive the workflow's payload - from there is is trivial to obtain the services described above and pass them the content. CQ Workflow Actions can be customized for each particular workflow they are used in. I use this feature to customize the accounts to which a message shall be sent (the custom format is explained in the setup section below). The customization string is passed to the execute method as well: comma-separated values will arrive as a String[] array.
</p><p>

</p><h6 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">Setting up the package</h6>
<p>
To get this up and running download the attached CQ5 package and install it throught the <a href="http://localhost:4502/etc/packages.html">package manager</a>. In the Sling console configure the the services <a href="http://localhost:4502/system/console/configMgr/com.day.cq.mailer.impl.MailerService">com.day.cq.mailer.impl.MailerService</a>, <a href="http://localhost:4502/system/console/configMgr/com.day.iks.service.impl.TwitterServiceImpl">com.day.iks.service.impl.TwitterServiceImpl</a> and <a href="http://localhost:4502/system/console/configMgr/com.day.iks.service.impl.GtalkServiceImpl">com.day.iks.service.impl.GtalkServiceImpl</a>. For Twitter and Gtalk you need to supply the credentials of the (technical) user that shall send the DMs or chat messages, respectively. In the case of e-mail you need to configure your mail server.
</p><p>
Next, create a custom workflow in the CQ5 workflow section and add the workflow action (name). The configuration options are:
</p><p>
</p><ul>
<li><p>for sending an e-mail: email,user@mydomain.com,some_message</p></li>
<li><p>for sending a direct message on Twitter: dm,twitter_user,some_message</p></li>
<li><p>for sending a chat message on Gtalk: gtalk,user@gmail.com,some_message</p></li>
</ul>
<p/><p>
The (optional) message will be appended with the content item's path.
</p><p>
Here is an example for GTalk:
</p><p>
<a href="http://dev.day.com/microsling/content/blogs/main/iksworkflowbenchmark/docroot/wf.jpg">
<img src="http://dev.day.com/microsling/content/blogs/main/iksworkflowbenchmark/docroot/wf-thumb.jpg"/>
</a>
</p><p>
In the cases of Twitter DM and GTalk make sure that the recipient has opted-in to receive messages from the technical user you have configured as a sender. 
</p></div>
    </summary>
    <updated>2009-12-28T00:00:01Z</updated>
    <category term="iks-project"/>
    <category term="cq5"/>
    <category term="tutorial"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2010-01-13T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/railsjcr2.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/railsjcr2.html" rel="alternate" type="text/html"/>
    <title>JCR and Rails revisited</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
<a href="http://www.thoughtworks.com/who-we-are/our-people/profiles/Wang,+Pengchao.html">Pengchao Wang of Thoughtworks</a> has published his approach to using JCR as a backend for a JRuby-based Rails app. Interestingly, Pengchao uses unstructured nodes (at least, that is what I gather from reading the code), so he can take full advantage of the schema-free side of JCR and freely add properties to JCR-persisted Ruby objects. The <a href="http://github.com/wpc/jcr-rails-demo">code is on GitHub</a>, have a look at <a href="http://github.com/wpc/jcr-rails-demo/blob/master/lib/jcr/record_base.rb">jcr-rails-demo/lib/jcr/record_base.rb</a> from which the models classes inherit. If Rails and JCR is of interest to you: also have a look at what Ngoc Dao wrote on how to <a href="http://dev.day.com/microsling/content/blogs/main/railsjcr.html#comment">use JCR in Rails applications</a>
</p>
<div id="__ss_2756151" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/x5studio/rails-jcr" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="Rails + JCR">Rails + JCR</a><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">presentations</a> from <a href="http://www.slideshare.net/x5studio" style="text-decoration: underline;">shen liu</a>.</div></div></div>
    </summary>
    <updated>2009-12-21T00:00:01Z</updated>
    <category term="jcr"/>
    <category term="dynamic languages"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2010-01-13T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/lotd20091218.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/lotd20091218.html" rel="alternate" type="text/html"/>
    <title>[LOTD] The Skinny on JCR, CMIS and OSGi</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
Remember <a href="http://jonontech.com/">Jon Mark</a>'s <a href="http://jonontech.com/2009/11/26/cmis-jcr-and-osgi-for-idiots/">overview picture of content technologies</a> I <a href="http://dev.day.com/microsling/content/blogs/main/lotd20091126.html">mentioned</a> the other day? Jon has just <a href="http://www.cmswire.com/cms/web-cms/wcm-field-notes-the-skinny-on-jcr-cmis-and-osgi-006279.php?utm_source=twitter&amp;utm_medium=twitterfeed&amp;utm_campaign=Social%20Media%20%28Twitter%29">published his first column on CMSWire</a> where he delivers a brilliant textual description of his diagram, spanning across JCR, CMIS and OSGi.
</p>
<p>
Jon rightfully points out that CMIS is of very limited value for managing web content and explains that further in the comments section. It is at best tricky to store in a CMIS repository an HTML document that contains references to other items in the same repository, i.e. you will struggle to use CSS, images or hyperlinks.
</p></div>
    </summary>
    <updated>2009-12-18T00:00:01Z</updated>
    <category term="lotd"/>
    <category term="jcr"/>
    <category term="cmis"/>
    <category term="osgi"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2010-01-13T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/jdiffjcr1jcr2.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/jdiffjcr1jcr2.html" rel="alternate" type="text/html"/>
    <title>Differences between JCR 1 and JCR 2 on API level</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
My colleague <a href="http://dev.day.com/microsling/content/blogs/main.html?poster=Sebastian%20Hoogenberk">Sebastian Hoogenberk</a> has run <a href="http://www.jdiff.org/">JDiff</a> over the <a href="http://www.day.com/maven/jsr170/javadocs/jcr-1.0/">JCR 1</a> and <a href="http://www.day.com/maven/jsr170/javadocs/jcr-2.0/">JCR 2</a> Javadocs. <a href="http://www.day.com/maven/jdiff-jcr1-jcr2/changes.html">The results</a> are useful to get a clear overview over the changes on API level. Note that JDiff unfortunately seems to get confused with some methods and marks them both as "added" and "replaced".
</p></div>
    </summary>
    <updated>2009-12-17T00:00:01Z</updated>
    <category term="jcr"/>
    <category term="jsr-170"/>
    <category term="jsr-283"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2010-01-13T00:00:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://bdelacretaz.wordpress.com/?p=1344</id>
    <link href="http://grep.codeconsult.ch/2009/12/07/open-innovation-in-software-means-open-source/" rel="alternate" type="text/html"/>
    <title>Open Innovation in Software means Open Source</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I’m giving a talk today at the Open Source, Open Development, Open Innovation workshop in Oxford: Open source software is more than just a licence, it is also a software development methodology that allows companies to share resources and collaborate on non-core parts of their software/service offering. When managed well, open development enables a reduction [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1344&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’m giving a talk today at the <a href="http://www.oss-watch.ac.uk/events/2009-12-07_business/programme.xml">Open Source, Open Development, Open Innovation workshop</a> in Oxford:</p>
<blockquote><p>
Open source software is more than just a licence, it is also a software development methodology that allows companies to share resources and collaborate on non-core parts of their software/service offering. When managed well, open development enables a reduction in cost, and an increase in innovation as a result of the convergence of the best minds in the problem space. In this presentation Bertrand Delacretaz will describe how <a href="http://www.day.com">Day Software</a> has embraced open development by positioning itself as the leaders in both open standards and open source software. We will examine how Day’s active engagement with 25 open source projects and numerous standards groups has enabled the company to become a world leader in their market and in the open source projects they participate in.
</p></blockquote>
<p>The funny thing is that the above abstract was written by Ross Gardler while waiting for my own version of it – and it says exactly what I was trying to say, only better ;-)</p>
<p>The event is covered by a <a href="http://www.coveritlive.com/index2.php/option=com_altcaster/task=viewaltcast/altcast_code=a3264d23fa/height=550/width=470">live blog</a>, and you can ask questions there.</p>
<p/>
<p>To put it simply, my conclusion is that quick feedback from users and customers is key to open innovation – and open source. if done right, provides <em>lots</em> of feedback, fast.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1344/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1344/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/bdelacretaz.wordpress.com/1344/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bdelacretaz.wordpress.com/1344/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/bdelacretaz.wordpress.com/1344/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bdelacretaz.wordpress.com/1344/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/bdelacretaz.wordpress.com/1344/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bdelacretaz.wordpress.com/1344/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/bdelacretaz.wordpress.com/1344/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bdelacretaz.wordpress.com/1344/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/bdelacretaz.wordpress.com/1344/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bdelacretaz.wordpress.com/1344/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/bdelacretaz.wordpress.com/1344/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bdelacretaz.wordpress.com/1344/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1344&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2009-12-07T10:38:33Z</updated>
    <category term="Open Source"/>
    <category term="conferences"/>
    <author>
      <name>bdelacretaz</name>
    </author>
    <source>
      <id>http://grep.codeconsult.ch</id>
      <logo>http://0.gravatar.com/blavatar/e6e901bd190e100a6787d0252d1f244f?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://grep.codeconsult.ch/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://grep.codeconsult.ch" rel="alternate" type="text/html"/>
      <link href="http://grep.codeconsult.ch/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://grep.codeconsult.ch/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>cat /dev/brain | egrep -i 'tech|thoughts|noise'</subtitle>
      <title>bertrand's brain grep</title>
      <updated>2010-09-03T03:00:05Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=285</id>
    <link href="http://jukkaz.wordpress.com/2009/12/07/daily-shoot-week-3/" rel="alternate" type="text/html"/>
    <title>Daily Shoot, week 3</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Another week of @dailyshoot: PS. Check out the updated dailyshoot.com web site.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=285&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Another week of <a href="http://twitter.com/dailyshoot">@dailyshoot</a>:</p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/jlz/4147320799/"><img alt="" class="alignnone" height="240" src="http://farm3.static.flickr.com/2602/4147320799_99dd07b1e5_m.jpg" style="vertical-align: middle;" title="Home Alone" width="160"/></a> <a href="http://jukkaz.wordpress.com/http://www.flickr.com/photos/jlz/4151305182/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2598/4151305182_9714bd8a99_m.jpg" style="vertical-align: middle;" title="My Door" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4153338693/"><img alt="" class="alignnone" height="240" src="http://farm3.static.flickr.com/2508/4153338693_5194ec93ec_m.jpg" style="vertical-align: middle;" title="Playing with Food" width="160"/></a> <a href="http://www.flickr.com/photos/jlz/4155752365/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2575/4155752365_a7d4467902_m.jpg" style="vertical-align: middle;" title="Velo" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4158486726/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2627/4158486726_5ebd746f1a_m.jpg" style="vertical-align: middle;" title="Walking in the Air" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4161185154/"><img alt="" class="alignnone" height="240" src="http://farm3.static.flickr.com/2485/4161185154_019562aa99_m.jpg" style="vertical-align: middle;" title="Big Wheel" width="160"/></a> <a href="http://www.flickr.com/photos/jlz/4164652474/"><img alt="" class="alignnone" height="160" src="http://farm5.static.flickr.com/4003/4164652474_3eaa68c975_m.jpg" style="vertical-align: middle;" title="Recycled" width="240"/></a></p>
<p>PS. Check out the updated <a href="http://dailyshoot.com/">dailyshoot.com</a> web site.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/285/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/285/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/285/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/285/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/jukkaz.wordpress.com/285/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/jukkaz.wordpress.com/285/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/jukkaz.wordpress.com/285/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/jukkaz.wordpress.com/285/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/285/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/285/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/285/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/285/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/285/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/285/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=285&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2009-12-07T09:17:04Z</updated>
    <category term="General"/>
    <category term="dailyshoot"/>
    <category term="photography"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://www.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-08-26T16:00:15Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/cq53preview.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/cq53preview.html" rel="alternate" type="text/html"/>
    <title>Top 10 Features in the Upcoming CQ 5.3 Release</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
Here is a short presentation with my personal top ten features in our upcoming release. Of course, this would ideally be accompanied by short fast paced demos, so if you are interested in getting personalized demo or a video, please <a href="mailto:information@day.com">reach out to us</a>.
</p>

<div id="__ss_2626962" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/uncled/whats-new-in-cq-53-top-10-features" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="What's new in CQ 5.3? Top 10 features.">What's new in CQ 5.3? Top 10 features.</a><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">documents</a> from <a href="http://www.slideshare.net/uncled" style="text-decoration: underline;">David Nuescheler</a>.</div></div></div>
    </summary>
    <updated>2009-12-02T00:00:01Z</updated>
    <category term="cq5"/>
    <category term="cms"/>
    <author>
      <name>David Nuescheler</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2010-01-13T00:00:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=283</id>
    <link href="http://jukkaz.wordpress.com/2009/11/29/daily-shoot-week-2/" rel="alternate" type="text/html"/>
    <title>Daily Shoot, week 2</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">As I mentioned last week, I’ve been following @dailyshoot for a series of daily photo assignments. Here’s what I shot this week:<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=283&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>As I <a href="http://jukkaz.wordpress.com/2009/11/23/daily-shoot-week-1/">mentioned</a> last week, I’ve been following <a href="http://twitter.com/dailyshoot">@dailyshoot</a> for a series of daily photo assignments. Here’s what I shot this week:</p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/jlz/4127988621/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2643/4127988621_1ff9e7f58a_m.jpg" title="Rugged Terrain" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4131789816/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2526/4131789816_bbcb836d58_m.jpg" title="Droplets" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4133945303/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2501/4133945303_78bcf77558_m.jpg" title="The Final Frontier" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4137339865/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2789/4137339865_5774d6e308_m.jpg" title="Tools of Distance" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4138818696/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2579/4138818696_4caec3921c_m.jpg" title="Our Separate Ways" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4141391776/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2544/4141391776_99f809a30b_m.jpg" title="Learning to Dance" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4143462625/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2561/4143462625_f698920c52_m.jpg" title="The Green Field" width="240"/></a></p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/283/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/283/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/283/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/283/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/283/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/283/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/283/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/283/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/283/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/283/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=283&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2009-11-29T16:38:51Z</updated>
    <category term="General"/>
    <category term="dailyshoot"/>
    <category term="photography"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://www.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-07-28T12:30:08Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=276</id>
    <link href="http://jukkaz.wordpress.com/2009/11/28/sling-over-http/" rel="alternate" type="text/html"/>
    <title>Sling over HTTP</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A few days ago I posted about Jackrabbit, and now it’s time to follow up with Sling as a means of accessing a content repository over HTTP. Apache Sling is a web framework based on JCR content repositories like Jackrabbit and among other things it adds some pretty nice ways of accessing manipulating content over [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=276&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>A few days ago I <a href="http://jukkaz.wordpress.com/2009/11/24/jackrabbit-over-http/">posted</a> about <a href="http://jackrabbit.apache.org/" title="Apache Jackrabbit">Jackrabbit</a>, and now it’s time to follow up with <a href="http://sling.apache.org/" title="Apache Sling">Sling</a> as a means of accessing a <a href="http://jukkaz.wordpress.com/2009/11/18/content-repository-over-http/" title="Content Repository over HTTP">content repository over HTTP</a>. Apache Sling is a web framework based on JCR content repositories like Jackrabbit and among other things it adds some pretty nice ways of accessing manipulating content over HTTP.</p>
<p>The easiest way to get started with Sling is to download the “Sling Standalone Application” from the <a href="http://sling.apache.org/site/downloads.cgi">Sling downloads page</a>. Unpack the distribution package and start the Sling application with “java -jar org.apache.sling.launchpad.app-5-incubator.jar”. Like Jackrabbit, Sling can by default be accessed at <a href="http://localhost:8080/">http://localhost:8080/</a>. There’s a <a href="http://sling.apache.org/site/discover-sling-in-15-minutes.html">15 minute tutorial</a> that you can check out to learn more about Sling.</p>
<p>Since Sling comes with an embedded Jackrabbit repository, it also supports much of the WebDAV functionality covered in my previous post. Instead of rehashing those points, this post takes a look at the additional HTTP content access features in Sling.</p>
<p><strong>CR1: Create a document</strong></p>
<p>Like with Jackrabbit, all documents in Sling have a path that is used to identify and locate the document. Sling solves the problem of having to come up with the document name by supporting a virtual “star resource” that’ll automatically generate a unique name for a new document. Thus instead of having to think of a URL like “http://localhost:8080/hello” in advance, the new document can be created by simply posting to the star resource at “http://localhost:8080/*”.</p>
<p>The <a href="http://sling.apache.org/site/manipulating-content-the-slingpostservlet-servletspost.html">Sling POST servlet</a> is a pretty versatile tool, and can be used to perform many content manipulation operations using normal HTTP POST requests and the application/x-www-form-urlencoded format used by normal HTML forms. With the POST servlet, the example document can be created like this:</p>
<pre style="margin: 20px;">$ curl --data 'title=Hello, World!' --data 'date=2009-11-17T12:00:00.000Z' \
       --data 'date@TypeHint=Date' --user admin:admin \

http://localhost:8080/*
</pre>
<p>The 201 Created response will contain a Location header that points to the newly created document. In this case the returned URL is “http://localhost:8080/hello_world_” based on some document title heuristics included in Sling. If you run the command again you’ll get a different URL since the Sling star resource will automatically avoid overwriting existing content.</p>
<p>Pros:</p>
<div>
<ul>
<li>A single standard POST request is enough</li>
<li>The HTML form format is used for the POST body</li>
<li>Automatically generated clean and readable document URL</li>
</ul>
</div>
<div>Cons:</div>
<div>
<ul>
<li>The star resource URL pattern is fixed and creates an unnecessarily tight binding between the client and the server</li>
</ul>
</div>
<p><strong>CR2: Read a document</strong></p>
<p>Sling contains multiple ways of accessing the document content in different renderings. In fact much of the power of Sling comes from the extensive support for rendering underlying content in various different and easily customizable ways.</p>
<p>Unfortunately at least the latest 5-incubator version of the Sling Application doesn’t support any reasonable default rendering at the previously returned document URL. The client needs to explicitly know to add a “.json” or “.xml” suffix to the document URL to get a JSON or XML rendering of the document.</p>
<pre style="margin: 30px;">$ curl http://localhost:8080/hello_world_.json
{
  "title":           "Hello, World!",
  "date":            "Tue Nov 17 2009 12:00:00 GMT+0100",
  "jcr:primaryType": "nt:unstructured"
}
$ curl http://localhost:8080/hello_world_.xml
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;hello_world_ xmlns:fn="http://www.w3.org/2005/xpath-functions"
              xmlns:fn_old="http://www.w3.org/2004/10/xpath-functions"
              xmlns:xs="http://www.w3.org/2001/XMLSchema"
              xmlns:jcr="http://www.jcp.org/jcr/1.0"
              xmlns:mix="http://www.jcp.org/jcr/mix/1.0"
              xmlns:sv="http://www.jcp.org/jcr/sv/1.0"
              xmlns:sling="http://sling.apache.org/jcr/sling/1.0"
              xmlns:rep="internal"
              xmlns:nt="http://www.jcp.org/jcr/nt/1.0"
              jcr:primaryType="nt:unstructured"
              date="2009-11-17T12:00:00.000+01:00"
              title="Hello, World!"/&gt;
</pre>
<p>The JCR document view format is used for the XML rendering.</p>
<p>Pros:</p>
<ul>
<li>A single GET request is enough</li>
<li>Both the JSON and XML formats are easy to consume</li>
</ul>
<p>Cons:</p>
<ul>
<li>Simply GETting the document URL doesn’t return anything useful</li>
<li>The “.json” and “.xml” URL patterns create an unnecessary binding between the client and the server</li>
<li>Neither rendering contains property type information</li>
<li>The XML rendering contains unnecessary namespace declarations</li>
</ul>
<p><strong>CR3: Update a document</strong></p>
<p>The Sling POST servlet supports also document updates, so we can just POST the updated properties to the document URL:</p>
<pre style="margin: 30px;">$ curl --data 'history=Document date updated' \
       --data 'date=2009-11-18T12:00:00.000Z' \
       --data 'date@TypeHint=Date' --user admin:admin \

http://localhost:8080/hello_world_</pre>
<p>Pros:</p>
<ul>
<li>A single standard POST request is enough</li>
<li>The HTML form format is used for the POST body</li>
</ul>
<p>Cons:</p>
<ul>
<li>None.</li>
</ul>
<p><strong>CR4: Delete a document</strong></p>
<p>You can either use the special “:operation=delete” feature of the Sling POST servlet or a standard DELETE request to delete a document:</p>
<pre style="margin: 30px;">$ curl --data ':operation=delete' --user admin:admin \

http://localhost:8080/hello_world_

$ curl --request DELETE --user admin:admin \

http://localhost:8080/hello_world_</pre>
<p>Pros:</p>
<ul>
<li>A standard DELETE or POST request is all that’s needed</li>
</ul>
<p>Cons:</p>
<ul>
<li>None.</li>
</ul>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/276/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/276/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/276/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/276/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/276/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/276/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/276/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/276/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/276/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/276/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=276&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2009-11-28T21:18:06Z</updated>
    <category term="General"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://www.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-05-27T20:00:27Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://www.osoco.org/blog/?p=73</id>
    <link href="http://www.osoco.org/blog/?p=73" rel="alternate" type="text/html"/>
    <title>Increasing Interest in JCR and Apache Sling</title>
    <summary>I’m attending some tech conferences in the Java space for several years now; for the last years I’m trying to push JCR, Apache Jackrabbit, and Apache Sling at various occasions – mostly through several talks. It seems to me that there is a change/increase in interest for these topics.
While two years ago, people have not [...]</summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I’m attending some tech conferences in the Java space for several years now; for the last years I’m trying to push JCR, Apache Jackrabbit, and Apache Sling at various occasions – mostly through several talks. It seems to me that there is a change/increase in interest for these topics.<br/>
While two years ago, people have not been really that interested in JCR and usually asked questions along the line of “why should i use this? I have a database, it works fine” etc., this has definitly changed now. There are more and more people interested in alternatives to a POD (plain old database). It seems to me that the pain with traditional dbs is now too much and they’re searching for nosql solutions. Don’t get me wrong, JCR is not the golden hammer for data storage – there are valid use cases for PODs, but there are also many use cases where an alternative like JCR is much better suited.<br/>
Today people ask questions like  “I looked at jcr, I have this problem, and I think I could do it this way. What do you think?” and of course variations on this theme.<br/>
I don’t think that this is motivated through the NOSQL hype, I ratherthink that this is a parallel movement which has the same origin. In addition, these people seems to know a lot about Apache Jackrabbit and usually ask deep going questions. As I’m not working on Jackrabbit itself – I’m a user of Jackrabbit – these questions usually give me a hard time <img alt=":)" class="wp-smiley" src="http://www.osoco.org/blog/wp-includes/images/smilies/icon_smile.gif"/><br/>
While I have a hard time with Jackrabbit questions, people seem often to have a hard time understanding the needs for Apache Sling. For one this might be cause they are still living in their POD driven world and know how to handle applications based on databases. Building applications on top of NOSQL solutions is a slightly different thing. When it comes to Apache Sling which is a web framework, it is immediately compared against web application frameworks with all the nice ui features, widget libraries and whatnot. And as Sling does not provide a UI library it is often immediately discarded.<br/>
But on the bright side as soon as people realize that they need something like JCR and now need a way to get all this content stored in the repository out to the users in a nice, elegant and flexible way, they also realize that Apache Sling helps a lot.<br/>
So my hope is that the adaption of JCR is increasing (and I think that is already the case) and that this drives the adoption of Apache Sling as well <img alt=":)" class="wp-smiley" src="http://www.osoco.org/blog/wp-includes/images/smilies/icon_smile.gif"/><br/>
And of course we are not day dreaming in Apache Sling – we will continue it’s development and add missing pieces or provide bridges etc.</p></div>
    </content>
    <updated>2009-11-26T15:07:46Z</updated>
    <category term="Allgemein"/>
    <author>
      <name>cziegeler</name>
    </author>
    <source>
      <id>http://www.osoco.org/blog</id>
      <link href="http://www.osoco.org/blog/?feed=rss2" rel="self" type="application/atom+xml"/>
      <link href="http://www.osoco.org/blog" rel="alternate" type="text/html"/>
      <subtitle>Every Day is a Good Day</subtitle>
      <title>A Matter of Unimportance</title>
      <updated>2009-11-26T15:30:06Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/lotd20091126.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/lotd20091126.html" rel="alternate" type="text/html"/>
    <title>[LOTD] CMIS, JCR and OSGi for Idiots</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
Drinking with <a href="http://dev.day.com/microsling/content/blogs/main.html?poster=David%20Nuescheler">David</a> has <a href="http://dev.day.com/microsling/content/blogs/main.xml">inspired Jon Marks</a> (aka <a href="http://twitter.com/McBoof/">@McBoof</a>) to draw a brilliant <a href="http://jonontech.com/2009/11/26/cmis-jcr-and-osgi-for-idiots/">drawing of the landscape of content technologies</a>. Beer :)
</p></div>
    </summary>
    <updated>2009-11-26T00:00:01Z</updated>
    <category term="lotd"/>
    <category term="jcr"/>
    <category term="cmis"/>
    <category term="osgi"/>
    <category term="beer"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2010-01-13T00:00:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=260</id>
    <link href="http://jukkaz.wordpress.com/2009/11/24/jackrabbit-over-http/" rel="alternate" type="text/html"/>
    <title>Jackrabbit over HTTP</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Last week I posted a simple set of operations that a “RESTful content repository” should support over HTTP. Here’s a quick look at how Apache Jackrabbit meets this challenge. To get started I first downloaded the standalone jar file from the Jackrabbit downloads page, and started it with “java -jar jackrabbit-standalone-1.6.0.jar”. This is a quick [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=260&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Last week I <a href="http://jukkaz.wordpress.com/2009/11/18/content-repository-over-http/" title="Content Repository over HTTP">posted</a> a simple set of operations that a “RESTful content repository” should support over HTTP. Here’s a quick look at how <a href="http://jackrabbit.apache.org/">Apache Jackrabbit</a> meets this challenge.</p>
<p>To get started I first downloaded the standalone jar file from the <a href="http://jackrabbit.apache.org/downloads.html">Jackrabbit downloads page</a>, and started it with “java -jar jackrabbit-standalone-1.6.0.jar”. This is a quick and easy way to get a Jackrabbit repository up and running. Just point your browser to <a href="http://localhost:8080/">http://localhost:8080/</a> to check that the repository is there.</p>
<p>Jackrabbit comes with a built-in advanced WebDAV feature that gives you pretty good control over your content. The root URL for the default workspace is <a href="http://localhost:8080/server/default/jcr:root/">http://localhost:8080/server/default/jcr:root/</a> and by default Jackrabbit grants full write access if you specify any username and password.</p>
<p>Note that Jackrabbit also has another, filesystem-oriented WebDAV feature that you can access at <a href="http://localhost:8080/repository/default/">http://localhost:8080/repository/default/</a>. This entry point is great for dealing with simple things like normal files and folders, but for more fine-grained content you’ll want to use the advanced WebDAV feature as outlined below.</p>
<p><strong>CR1: Create a document</strong></p>
<p>All documents (nodes) in Jackrabbit have a pathname just like files in a normal file system. Thus to create a new document, we first need to come up with a name and a location for it. Let’s call the example document “hello” and place it at the root of the default workspace, so we can later address it at the path “/hello”. The related WebDAV URL is http://localhost:8080/server/default/jcr:root/hello/.</p>
<p>You can use the MKCOL method to create a new node in Jackrabbit. An MKCOL request without a body will create a new empty node, but you can specify the initial contents of the node by including a snippet of JCR system view XML that describes your content. In our case we want to specify the “title” and “date” properties. Note that JCR does not support date-only properties, so we need to store the date value as a more accurate timestamp.</p>
<p>The full request looks like this:</p>
<pre style="margin: 20px;">$ curl --request MKCOL --data @- --user name:pass \
       http://localhost:8080/server/default/jcr:root/hello/ &lt;&lt;END
&lt;sv:node sv:name="hello" xmlns:sv="http://www.jcp.org/jcr/sv/1.0"&gt;
  &lt;sv:property sv:name="message" sv:type="String"&gt;
    &lt;sv:value&gt;Hello, World!&lt;/sv:value&gt;
  &lt;/sv:property&gt;
  &lt;sv:property sv:name="date" sv:type="Date"&gt;
    &lt;sv:value&gt;2009-11-17T12:00:00.000Z&lt;/sv:value&gt;
  &lt;/sv:property&gt;
&lt;/sv:node&gt;
END</pre>
<p>The resulting document is available at the URL we already constructed above, i.e. http://localhost:8080/server/default/jcr:root/hello/.</p>
<p>Pros:</p>
<div>
<ul>
<li>A single standard WebDAV MKCOL request is enough</li>
<li>The standard JCR system view XML format is used for the MKCOL body</li>
<li>The XML format is easy to produce</li>
</ul>
</div>
<div>Cons:</div>
<div>
<ul>
<li>We need to decide the name and location of the document before it can be created</li>
<li>The name of the document is duplicated, once in the URL and once in the sv:name attribute</li>
<li>The date property must be specified down to the millisecond</li>
<li>While standardized, the MKCOL method is not as well known as PUT or POST</li>
<li>While standardized, the JCR system view format is not as well known as JSON, Atom or generic XML</li>
<li>The system view XML format is quite verbose</li>
</ul>
</div>
<p><strong>CR2: Read a document</strong></p>
<p>Now that the document is created, we can read it with a standard GET request:</p>
<pre style="margin: 30px;">$ curl --user name:pass http://localhost:8080/server/default/jcr:root/hello/
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;sv:node sv:name="hello"
         xmlns:fn="http://www.w3.org/2005/xpath-functions"
         xmlns:fn_old="http://www.w3.org/2004/10/xpath-functions"
         xmlns:xs="http://www.w3.org/2001/XMLSchema"
         xmlns:jcr="http://www.jcp.org/jcr/1.0"
         xmlns:mix="http://www.jcp.org/jcr/mix/1.0"
         xmlns:sv="http://www.jcp.org/jcr/sv/1.0"
         xmlns:rep="internal"
         xmlns:nt="http://www.jcp.org/jcr/nt/1.0"&gt;
  &lt;sv:property sv:name="jcr:primaryType" sv:type="Name"&gt;
    &lt;sv:value&gt;nt:unstructured&lt;/sv:value&gt;
  &lt;/sv:property&gt;
  &lt;sv:property sv:name="date" sv:type="Date"&gt;
    &lt;sv:value&gt;2009-11-17T12:00:00.000Z&lt;/sv:value&gt;
  &lt;/sv:property&gt;
  &lt;sv:property sv:name="message" sv:type="String"&gt;
    &lt;sv:value&gt;Hello, World!&lt;/sv:value&gt;
  &lt;/sv:property&gt;
&lt;/sv:node&gt;</pre>
<p>Note that the result includes the standard jcr:primaryType property that is always included in all JCR nodes. Also all namespaces registered in the repository are included even though strictly speaking they add little value to the response.</p>
<p>Pros:</p>
<ul>
<li>A single GET request is enough</li>
<li>The XML format is easy to consume</li>
</ul>
<p>Cons:</p>
<ul>
<li>The system view format is a bit verbose and generally not that well known</li>
</ul>
<p><strong>CR3: Update a document</strong></p>
<p>The WebDAV feature in Jackrabbit does not support setting multiple properties in a single request, so we need to use separate requests for each property change. The easiest way to update a property is to PUT the new value to the property URL. The only tricky part is that unless the node type explicitly says otherwise the new value is by default stored as a binary stream. You need to specify a custom jcr-value/… content type to override that default.</p>
<pre style="margin: 30px;">$ curl --request PUT --header "Content-Type: jcr-value/date" \
       --data "2009-11-18T12:00:00.000Z"  --user name:pass \

http://localhost:8080/server/default/jcr:root/hello/date

$ curl --request PUT --header "Content-Type: jcr-value/string" \
       --data "Document date updated"  --user name:pass \

http://localhost:8080/server/default/jcr:root/hello/history</pre>
<p>GETting the document after these changes will give you the updated property values.</p>
<p>Pros:</p>
<ul>
<li>Standard PUT requests are used</li>
<li>No XML or other wrapper format needed, just send the raw value as the request body</li>
</ul>
<p>Cons:</p>
<ul>
<li>More than one request needed</li>
<li>Need to use non-standard jcr-value/… media types for non-binary values</li>
</ul>
<p><strong>CR4: Delete a document</strong></p>
<p>Deleting a document is easy with the DELETE method:</p>
<pre style="margin: 30px;">$ curl --request DELETE --user name:pass \

http://localhost:8080/server/default/jcr:root/hello/</pre>
<p>That’s it. Trying to GET the document after it’s been deleted gives a 404 response, just as expected.</p>
<p>Pros:</p>
<ul>
<li>A standard DELETE request is all that’s needed</li>
</ul>
<p>Cons:</p>
<ul>
<li>None.</li>
</ul>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/260/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/260/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/260/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/260/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/260/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/260/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/260/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/260/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/260/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/260/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=260&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2009-11-24T01:25:34Z</updated>
    <category term="General"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://www.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-05-25T22:00:29Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/monitoring.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/monitoring.html" rel="alternate" type="text/html"/>
    <title>The perfect monitoring</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>I often thought about how a perfect monitoring solution should like; then the following requirements come up:</p>  <p>1) consistent: When the monitoring indicates a problem, there really is a problem with the application. </p> <p>2) reliable: When there is a problem that hinders the users from properly working on the application, the monitoring will indicate this, before the support line is overwhelmed by calls reporting that your application has a problem. </p> <p>3) informative: When a monitoring indicates a problem, there should a recommendation how this problem can be fixed with minimal impact. This recommendation can be either documented offline (operation guidelines) or in the monitoring itself. </p> <p>4) proactive: a monitoring resource should detect problems before they happen. Sounds strange, but many problems (excessive use of memory) can be reported before they actually have a big impact. </p> <p>The requirement 2) is a hard one; essentially it requires that all problem situations are pre-known and the presence of such a problem situation can be indicated by the monitoring resource. In fact most situations are not known to anybody, until they happen and are fully analyzed and understood. </p> <p>1) can fulfilled very easily: never report a problem. From a purely academical view this requirement is fulfilled then, but actually it is not really usable. A more usable approach is to report only when it's 99,99% clear that no user can work anymore (e.g. on a CQ authoring system when a vital OSGI service isn't available any more). But the more subtile problems cannot be caught that way. </p> <p>3) requires a certain amount of experience with the application and the will to write good documentation, that is kept up to date. And 4) requires knowledge about typical problems and the signs of problems. </p> <p>All these requirements often need an extension to the application to provide an interface to the monitoring, where the monitoring can fetch the data from and decide what to do with it. But monitoring is the poor child of application development; it is neither a functional requirement nor a non-functional requirement with the importance of usability, performance or availability (aah, by the way: how should we measure that? No-one cares, as long you guarantee 99,9% ...), but only a requirement of the operations team - no-one spends time or money on it, until operations ask for it. "Ups, we already spent our budget on other things". Only a few operations teams have the management standing, that they can deny such applications to run on their machines then, in most cases they are just overruled by management. Then, the operations team usually comes up with some thoughts and tries to fill the gap themselves, but in most times that does not work very well. Especially requirement 2) is then often violated and 3) and 4) are not implemented at all. But operations can show some green bulbs in the monitoring system to the management. </p> <p>So, as a last requirement (which should be the very first requirement, though): </p> <p>5) there should be a proper monitoring at all. A monitoring that only watches for a running process cannot detect that this process already internally has deadlocked and isn't working anymore. </p> <p>Finally, when you need to implement a complex application, make sure that some of its internal state can be exposed to an external monitoring solution, which helps to operate your application. Treat this as a normal "must-have" feature with specification, implementation and test. You will make your operations team really happy. </p> <p>If you do not do that, your monitoring system are actually the users, when they complain about non-working functionality, which must be fixed by your operations team then. And that brings costs (service calls) and negative management attention. Nothing one wants to have.</p></div>
    </summary>
    <updated>2009-11-23T00:00:01Z</updated>
    <category term="operations"/>
    <category term="cq5"/>
    <author>
      <name>Joerg Hoh</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2010-01-13T00:00:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=254</id>
    <link href="http://jukkaz.wordpress.com/2009/11/23/daily-shoot-week-1/" rel="alternate" type="text/html"/>
    <title>Daily Shoot, week 1</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">A week ago James Duncan Davidson and Mike Clark launched @dailyshoot, a Twitter feed that posts daily photo assignments. The idea is to encourage people who want to learn photography to practice it every day with the help of a simple assignment that fits a single tweet. I’m following Duncan’s blog, so I found out [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=254&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>A week ago <a href="http://duncandavidson.com/">James Duncan Davidson</a> and <a href="http://clarkware.com/about.html">Mike Clark</a> launched <a href="http://twitter.com/dailyshoot">@dailyshoot</a>, a Twitter feed that posts daily photo assignments. The idea is to encourage people who want to learn photography to practice it every day with the help of a simple assignment that fits a single tweet. I’m following Duncan’s blog, so I <a href="http://blog.duncandavidson.com/2009/11/the-daily-shoot.html" title="The Daily Shoot">found out</a> about Daily Shoot the day it was launched.</p>
<p>So far I’ve completed all the assignments and I’ve already learned quite a bit doing so. It’s very interesting to see how other people interpret the same assignments. I avoid looking at other responses before completing an assignment so that I don’t end up just copying someone else’s approach. Once I’m done I look at what other’s have done for some nice insight on what I could have done differently. The process is quite educational.</p>
<p>Here’s what I’ve shot this week:</p>
<p style="text-align: center;"><a href="http://www.flickr.com/photos/jlz/4110418300/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2804/4110418300_4368b4b7dd_m.jpg" title="The Red Desert" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4113281186/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2762/4113281186_b80c2b5c50_m.jpg" title="Martinsgasse" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4115683738/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2750/4115683738_6902197e9a_m.jpg" title="Into the Unknown" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4117124465/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2591/4117124465_f3250abbb6_m.jpg" title="Satrap" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4119973735/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2773/4119973735_af899a27e9_m.jpg" title="Four" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4122393762/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2622/4122393762_46642d7b60_m.jpg" title="Fier Franken f&#xFC;nfundachtzig" width="240"/></a> <a href="http://www.flickr.com/photos/jlz/4125156460/"><img alt="" class="alignnone" height="160" src="http://farm3.static.flickr.com/2755/4125156460_2976ac927d_m.jpg" title="Der Basler" width="240"/></a></p>
<p>You can click on the pictures for more background on each assignment and how I approached it. For more information on Daily Shoot, see the recently launched <a href="http://dailyshoot.com/">website</a>.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/254/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/254/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/254/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/254/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/254/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/254/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/254/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/254/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/254/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/254/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=254&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2009-11-22T23:12:58Z</updated>
    <category term="General"/>
    <category term="dailyshoot"/>
    <category term="photography"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://www.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-05-14T10:30:25Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/igniteslides.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/igniteslides.html" rel="alternate" type="text/html"/>
    <title>Ignite slides</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>RT <a href="http://twitter.com/joannekh/status/5878829373">@joannekh</a>:</p>

<div class="blockquote">
<p>
Day Ignite presentations now available at <a href="http://www.day.com/ignite">www.day.com/ignite</a>
</p>
</div>

<p>
(<a href="http://www.slideshare.net/Dayignite/presentations">dayignite on slideshare</a>)
</p></div>
    </summary>
    <updated>2009-11-21T00:00:01Z</updated>
    <category term="ignite"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2010-01-12T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/contentrepositories.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/contentrepositories.html" rel="alternate" type="text/html"/>
    <title>What is a content repository</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div style="border-bottom: 1px dotted rgb(153, 153, 153); padding: 2px;">
			<p>
				Joint post of <a href="http://bergie.iki.fi/about/">Henri Bergius</a> and <a href="http://michaelmarth.blogspot.com/">Michael Marth</a> cross-posted <a href="http://bergie.iki.fi/blog/what_is_a_content_repository/">here</a> and here.
			</p>
		</div>
		<p>
			Web Content Repositories are more than just plain old relational databases. In fact, the requirements that arise when managing web content have led to a class of content repository implementations that are comparable on a conceptual level. During the <a href="http://www.iks-project.eu/">IKS</a> community <a href="http://www.iks-project.eu/civicrm/event/info?reset=1&amp;id=3">workshop in Rome</a> we got together to compare JCR (the <a href="http://jackrabbit.apache.org/">Jackrabbit</a> implementation) and <a href="http://www.midgard-project.org/">Midgard</a>'s content repository. While in some cases the terminology might be different, many of the underlying ideas are identical. So we came up with a list of common traits and features of our content repositories. For comparison, there is also <a href="http://couchdb.apache.org/">Apache CouchDB</a>.
		</p>
		<p>
			So, why use a Content Repository for your application instead of the old familiar RDBMS? Repositories provide several advantages:
		</p>
		<ul>
			<li>
				<p>
					<em>Common rules for data access</em> mean that multiple applications can work with same content without breaking consistency of the data
				</p>
			</li>
			<li>
				<p>
					<em>Signals about changes</em> let applications know when another application using the repository modifies something, enabling collaborative data management between apps
				</p>
			</li>
			<li>
				<p>
					<em>Objects instead of SQL</em> mean that developers can deal with data using APIs more compatible with the rest of their desktop programming environment, and without having to fear issues like SQL injection
				</p>
			</li>
			<li>
				<p>
					<em>Data model is scriptable</em> when you use a content repository, meaning that users can easily write Python or PHP scripts to perform batch operations on their data without having to learn your storage format
				</p>
			</li>
			<li>
				<p>
					<em>Synchronization and sharing</em> features can be implemented on the content repository level meaning that you gain these features without having to worry about them
				</p>
			</li>
		</ul>
		<table border="0" cellpadding="0" cellspacing="0" class="tblGenFixed">
			<tbody><tr>
				<td class="s0">
					feature
				</td>
				<td class="s1">
					JCR / Jackrabbit
				</td>
				<td class="s2">
					Midgard
				</td>
				<td class="s3">
					CouchDB
				</td>
			</tr>
			<tr>
				<td class="s4">
					content type system
				</td>
				<td class="s5">
					In JCR structured or unstructured nodes are supported and can be mixed at will in a content tree.
				</td>
				<td class="s5">
					Content types are defined in MgdSchema types. All content must be stored to an MgdSchema type, but types can be extended on content instance level using the "parameter" triplets
				</td>
				<td class="s6">
					Type-free
				</td>
			</tr>
			<tr>
				<td class="s7">
					type hierarchy
				</td>
				<td class="s8">
					Structured node types support inheritence of types, additional cross-cutting aspects can be added with "mixins". Node types can define allowed node types for child nodes in the content hierarchy.
				</td>
				<td class="s8">
					MgdSchemas allow inheritance, and an extended type can be instantiated either using the extended type or the base type
				</td>
				<td class="s9">
					Type-free
				</td>
			</tr>
			<tr>
				<td class="s4">
					IDs
				</td>
				<td class="s5">
					Nodes with mixin "referenceable" have <strike>GUID</strike> a UUID. In practice the node path is often used to reference nodes.
				</td>
				<td class="s5">
					Every object has a GUID used for referencing. Objects located in trees that have a "name" property can also be referred to using the path
				</td>
				<td class="s6">
					All objects can be accessed via a UUID
				</td>
			</tr>
			<tr>
				<td class="s7">
					References
				</td>
				<td class="s8">
					Nodes can reference each other with hard link (special property type) or soft link (by referring to the node path)
				</td>
				<td class="s8">
					MgdSchema types can have properties linking to other objects of same or different type. A link of "parentfield" type places an MgdSchema type in a tree.
				</td>
				<td class="s9">
					No reference support built-in
				</td>
			</tr>
			<tr>
				<td class="s4">
					content hierarchy
				</td>
				<td class="s5">
					All content is hierarchical / in a tree
				</td>
				<td class="s5">
					Content can exist in tree, or independently of it depending on the MgdSchema type definition
				</td>
				<td class="s6">
					flat structure
				</td>
			</tr>
			<tr>
				<td class="s7">
					interesting property types
				</td>
				<td class="s8">
					Multi-valued (like an array), binary properties (e.g. for files), nodes have an implicit sort-order
				</td>
				<td class="s8">
					Binary properties stored using the Midgard Attachment system
				</td>
				<td class="s9">
					Support for binary properties
				</td>
			</tr>
			<tr>
				<td class="s4">
					transactions
				</td>
				<td class="s5">
					Multiple content modifications are written in transactions.
				</td>
				<td class="s5">
					Transactions can be used optionally.
				</td>
				<td class="s6"/>
			</tr>
			<tr>
				<td class="s7">
					events
				</td>
				<td class="s8">
					JCR Observers can register for content changes on different paths and/or for different node types and/or CRUD, receive notification of changes as serialized node
				</td>
				<td class="s8">
					All transactions cause both process-internal GObject signals, and interprocess DBus signals
				</td>
				<td class="s9">
					Support for one external event notification shell script
				</td>
			</tr>
			<tr>
				<td class="s4">
					workspaces
				</td>
				<td class="s5">
					Workspaces provide separate root trees.
				</td>
				<td class="s5">
					No workspaces support in Midgard 9.03, coming in next version
				</td>
				<td class="s6">
					Multiple databases within one CouchDB instance
				</td>
			</tr>
			<tr>
				<td class="s7">
					import and export
				</td>
				<td class="s8">
					nodes or parts of the repository (or the whole repo) can be imported or exported in XML. 2 formats: docview for human-frindly representation, sysview including all technical aspects
				</td>
				<td class="s8">
					Objects can be exported and imported in XML format. There are tools supporting replication via HTTP, tarballs, XMPP, and the CouchDB replication protocol
				</td>
				<td class="s9">
					JSON serialization is the standard way of accessing the repository. CouchDB replication protocol supports full synchronization between instances
				</td>
			</tr>
			<tr>
				<td class="s4">
					versioning
				</td>
				<td class="s5">
					Checkin/checkout model to create new versions of nodes, optionally versions complete sub-trees, supports branching of versions.
				</td>
				<td class="s5">
					No versioning
				</td>
				<td class="s6">
					All versions of content are stored and accessible separately, no branching
				</td>
			</tr>
			<tr>
				<td class="s7">
					locking
				</td>
				<td class="s8">
					Nodes can be locked and unlocked
				</td>
				<td class="s8">
					Objects can be locked and unlocked
				</td>
				<td class="s9"/>
			</tr>
			<tr>
				<td class="s4">
					object mapping
				</td>
				<td class="s5">
					Not in standard, but implemented in Jackrabbit. Rarely used in practice.
				</td>
				<td class="s5">
					Object mapping is the standard way of accessing the repository
				</td>
				<td class="s6">
					All content is accessed via JSON objects
				</td>
			</tr>
			<tr>
				<td class="s7">
					queries
				</td>
				<td class="s8">
					In JCR1 Sql or XPath, in JCR2 also QueryBuilder.
				</td>
				<td class="s8">
					Query Builder
				</td>
				<td class="s9">
					Javascript map/reduce
				</td>
			</tr>
			<tr>
				<td class="s4">
					access control
				</td>
				<td class="s5">
					Done on repository level, i.e. all access control is independent of application. In Jackrabbit: pluggable authentication/authorization handlers.
				</td>
				<td class="s5">
					No access control in Midgard repository, usually implemented on application level. Midgard proves a user authentication API
				</td>
				<td class="s6">
					No access control
				</td>
			</tr>
			<tr>
				<td class="s7">
					persistence
				</td>
				<td class="s8">
					In Jackrabbit different Persistence Managers can be plugged in (RDBMS, tar file, ...)
				</td>
				<td class="s8">
					libgda allows storage to different RDBMS like MySQL, SQLite and Postgres
				</td>
				<td class="s9">
					CouchDB has its own storage
				</td>
			</tr>
			<tr>
				<td class="s4">
					architecture
				</td>
				<td class="s5">
					Jackrabbit: library (jar), JEE resource, OSGi bundle or standalone server
				</td>
				<td class="s5">
					Library
				</td>
				<td class="s6">
					Erlang-based daemon
				</td>
			</tr>
			<tr>
				<td class="s7">
					APIs
				</td>
				<td class="s8">
					Standard: Java-based, PHP coming up. In Jackrabbit: also WebDAV and HTTP-based API
				</td>
				<td class="s8">
					C, Objective-C, PHP, Python
				</td>
				<td class="s9">
					HTTP+JSON
				</td>
			</tr>
			<tr>
				<td class="s4">
					full-text search
				</td>
				<td class="s5">
					Included in repository. In Jackrabbit: Lucene bundled
				</td>
				<td class="s5">
					No (SOLR used on application level)
				</td>
				<td class="s6">
					Plugin for using Lucene, not installed by default
				</td>
			</tr>
			<tr>
				<td class="s7">
					standard metadata
				</td>
				<td class="s8">
					All nodes have access rights, jcr:primaryType and jcr:mixinTypes properties. JCR 2.0 standardizes a set of optional metadata properties.
				</td>
				<td class="s8">
					All objects have a set of standard metadata including creator, revisor, timestamps etc
				</td>
				<td class="s9">
					No standard properties
				</td>
			</tr>
		</tbody></table>
		<p> </p></div>
    </summary>
    <updated>2009-11-19T00:00:01Z</updated>
    <category term="iks-project"/>
    <category term="jcr"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2010-01-07T00:00:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=251</id>
    <link href="http://jukkaz.wordpress.com/2009/11/18/content-repository-over-http/" rel="alternate" type="text/html"/>
    <title>Content Repository over HTTP</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Two weeks ago during the BarCamp at the ApacheCon US I chaired a short session titled “The RESTful Content Repository”. The idea of the session was to discuss the various ways that existing content repositories support RESTful access over HTTP and to perhaps find some common ground from which a generic content repository protocol could [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=251&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Two weeks ago during the <a href="http://us.apachecon.com/c/acus2009/schedule/barcamp">BarCamp</a> at the <a href="http://us.apachecon.com/c/acus2009/">ApacheCon US</a> I chaired a short session titled “The RESTful Content Repository”. The idea of the session was to discuss the various ways that existing content repositories support RESTful access over HTTP and to perhaps find some common ground from which a generic content repository protocol could be formulated.</p>
<p>The <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm" title="Representational State Transfer">REST architectural style</a> was generally accepted as a useful set of constraints for the architecture of distributed content-based applications, but as an architectural style it doesn’t define what the bits on the wire should look like. This is what we set out to define with the <a href="http://tools.ietf.org/html/rfc2616" title="Hypertext Transfer Protocol -- HTTP/1.1">HTTP protocol</a> as a baseline. We didn’t get too far, but see below for some collected thoughts and a useful set of “test cases” that I hope to use to further investigate this idea.</p>
<p><strong>Existing solutions</strong></p>
<p>Many existing content repositories and related products already support one or more HTTP-based access patterns: <a href="http://jackrabbit.apache.org/">Apache Jackrabbit</a> exposes two slightly different WebDAV-based access points. <a href="http://sling.apache.org/">Apache Sling</a> adds the <a href="http://sling.apache.org/site/manipulating-content-the-slingpostservlet-servletspost.html">SlingPostServlet</a> and default JSON and XML renderings of content. <a href="http://couchdb.apache.org/">Apache CouchDB</a> uses JSON over HTTP as the primary access protocol. <a href="http://lucene.apache.org/solr/">Apache Solr</a> uses XML over HTTP. <a href="http://www.midgard-project.org/">Midgard</a> doesn’t have a built-in HTTP binding for content, but makes it very easy to implement such bindings. This list just scratches the surface…</p>
<p>There are even existing generic protocols that match at least parts of what we wanted to achieve. <a href="http://tools.ietf.org/html/rfc2518">WebDAV</a> has been around for ten years already, but the way it extends HTTP with extra methods makes it harder to use with existing HTTP clients and libraries. The <a href="http://tools.ietf.org/html/rfc5023">AtomPub protocol</a> solves that issue, but being based on the <a href="http://tools.ietf.org/html/rfc4287">Atom format</a> and leaving much of the server behaviour undefined, AtomPub may not be the best solution for generic content repositories.</p>
<p><strong>Content repository operations over HTTP</strong></p>
<p>To better understand the needs and capabilities of existing solutions, we should come up with a simple set of content operations and find out if and how different systems support those operations over HTTP. The most basic such set of operations is CRUD, i.e. how to create, read, update, and delete a document, so let’s start with that. I’m giving each operation a key (CRn, as in “Content Repository operation N”) and a brief description of what’s expected. In later posts I hope to explore how these operations can be implemented with <a href="http://curl.haxx.se/">curl</a> or some other simple HTTP client accessing various kinds of content repositories. I’m also planning to extend the set of required operations to cover features like search, linking, versioning, transactions, etc.</p>
<p><strong>CR1: Create a document</strong></p>
<p>Documents with simple properties like strings and dates are basic building blocks of all content applications. How can I create a new document with the following properties?</p>
<ul>
<li>title = “Hello, World!” (string)</li>
<li>date = 2009-11-17 (date)</li>
</ul>
<p>At the end of this operation I should have a URL that I can use to access the created document.</p>
<p><strong>CR2: Read a document</strong></p>
<p>Given the URL of a document (see CR1), how do I read the properties of that document?</p>
<p>The retrieved property values should match the values given when the document was created.</p>
<p><strong>CR3: Update a document</strong></p>
<p>Given the URL of a document (see CR1), how do update the properties of that document? For example, I want to update the existing date property and add a new string property:</p>
<ul>
<li>date = 2009-11-18 (date)</li>
<li>history = “Document date updated” (string)</li>
</ul>
<p>When the document is read (see CR2) after this update, the retrieved information should contain the original title and the above updated date and history values.</p>
<p><strong>CR4: Delete a document</strong></p>
<p>Given the URL of a document (see CR1), how do I delete that document?</p>
<p>Once deleted, it should no longer be possible to read (see CR2) or update (see CR3) the document.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/251/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/251/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/251/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/251/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/251/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/251/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/251/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/251/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/251/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/251/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=251&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2009-11-18T01:45:11Z</updated>
    <category term="General"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://www.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-05-14T06:30:24Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/ikscoverage.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/ikscoverage.html" rel="alternate" type="text/html"/>
    <title>[LOTD] IKS in the press</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
French IT mag <a href="http://www.lemagit.fr/">LeMagIT</a> has published an article about the <a href="http://www.iks-project.eu/">IKS project</a> including quotations from <a href="http://grep.codeconsult.ch/">Bertrand Delacretaz</a>. Bertrand emphasizes the need for concrete results:
</p>
<div class="blockquote">
<p>
pour décoller, les technologies sémantiques ont besoin de cas d'utilisateur concrets
</p>
</div>
<p>
In the comments section Bertrand mentions his tag line for semantic technologies that I can very well relate to:
</p>
<div class="blockquote">
<p>
La sémantique "sous le capot" oui, la sémantique "dans la figure", non
</p>
</div>
<p>
This roughly translates as: "semantics under the hood yes, semantics in your face, no".
</p>
<p>
In <a href="http://www.computerworlduk.com/">Computerworld UK</a> open source blogger <a href="http://www.computerworlduk.com/community/blogs/index.cfm?blogid=14">Glyn Moody</a> has <a href="http://www.computerworlduk.com/community/blogs/index.cfm?entryid=2644&amp;blogid=14">described his first hands impressions from the IKS workshop in Rome</a>. He comes to a similar conclusion:
</p>
<div class="blockquote">
<p>
Paradoxically, semantic search will only ever really take off once it has receded so far into the fabric of computing that people aren't even aware it's there.
</p>
</div></div>
    </summary>
    <updated>2009-11-18T00:00:01Z</updated>
    <category term="iks-project"/>
    <category term="lotd"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-12-28T00:00:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://bdelacretaz.wordpress.com/?p=1338</id>
    <link href="http://grep.codeconsult.ch/2009/11/17/what-makes-apache-tick/" rel="alternate" type="text/html"/>
    <title>What Makes Apache Tick?</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Looking at the diversity of Apache Software Foundation communities, one can see a recipe for failure: people from different cultural backgrounds, different mother tongues, different employers, different timezones…all working together to create some of the best software on the planet? You must be kidding. How can this very loose collage of disparate people pump out [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1338&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><img align="right" alt="apachecon_us_09_twleung.jpg" border="0" height="166" src="http://bdelacretaz.files.wordpress.com/2009/11/apachecon_us_09_twleung.jpg?w=250&amp;h=166" width="250"/>Looking at the diversity of <a href="http://apache.org">Apache Software Foundation</a> communities, one can see a recipe for failure: people from different cultural backgrounds, different mother tongues, different employers, different timezones…all working together to create some of the best software on the planet? You must be kidding. </p>
<p>How can this very loose collage of disparate people pump out dozens of high-quality releases every year, often working better than more structured corporate teams? This “mystery” has been on my mind for a while, and I have identified four drivers that influence the way we use collaboration tools that play a major part in our success. </p>
<p>The first driver is a <em>common vision</em> amongst project members. The Biblical saying, “Without a vision, my people perish” is quite valid for our projects. Both using a central development mailing list for each project, and spending time to collectively define our project’s charter, helps us foster this common vision amongst project members. Every member should have the same answer to the “what are our goals?” question, so it’s important to get them to talk in a central place, where they all get the same information, as opposed to undocumented, one-to-one discussions. </p>
<p>Secondly, providing <em>real-time status updates</em> to project members is key in helping them stay on track. At Apache, this is implemented by the many events generated by our collaboration tools: commit events to indicate code changes, issue tracker events to provide updates about the status of bugs and new features, success/failure events from continuous build systems, and standardized ways of  announcing releases so that other projects are informed. Project members subscribe freely to as few or as many event channels that they want to, so as to stay on top of things in near real-time, and without having to actively ask others about what happened. Status meetings? No need for those, as the information is flowing all the time. </p>
<p>The third success driver lies in enabling <em>real-time help requests</em>. In an immediate crisis of the “we need to deliver this by tomorrow” type, especially when working with a big team, you need to be able to ask for help without necessarily 1) knowing who specifically will help, and 2) bothering others with direct person-to-person requests, especially if they work in a different timezone. The key here is using issue trackers, where one web page stores key data and parts of the dialog that leads to resolving an issue. Posting an issue on the tracker, with sufficiently detailed instructions about how to reproduce the problem, along with attributes such as severity level, affected modules, etc., is the best way to expose a problem to the group quickly and with precision. Using an issue tracker also allows you to quickly and efficiently change priorities as well as re-assign issues and tasks – key elements that make all the difference in a crisis.</p>
<p>Finally, having <em>searchable archives</em> of this information allows new project members, or those returning after a period of absence, to learn what transpired and why things have been done in a certain way. Without self-service archives, new participants would have to talk to everybody to find out about the project’s history, past decisions, conventions, etc., which is neither efficient nor scalable. Most of our archives are automatically built as project activities progress: mailing lists are archived, source code control history is kept forever, and issue trackers write the full history of the project’s micro-decisions.</p>
<p>Combined with Apache’s principles of meritocracy and consensus-based decision making, these four collaboration drivers allow our project teams to work very efficiently, and, in many cases, even more so than structured teams that do not establish those central hubs of information exchange.</p>
<p>Does your project team foster a common vision and provide tools for real-time status updates, real-time help requests and self-service archives to its members? If yes, congratulations: you’re on a good track to becoming as effective as an Apache project!</p>
<p><em>Many thanks to Sally Khudairi for reviewing and copy editing.</em></p>
<div><em>ApacheCon US 2009 picture by<br/>
<a href="http://www.flickr.com/photos/twleung/" rel="cc:attributionurl">Ted Leung</a> / Creative Commons License (<a href="http://creativecommons.org/licenses/by-nc-sa/2.0/" rel="license">CC BY-NC-SA 2.0</a>).</em></div>
<p>See also my <a href="http://grep.codeconsult.ch/2009/04/01/open-source-collaboration-tools-are-good-for-you-relooked-and-live-tomorrow/">Open Source Tools are Good For You</a> presentation, which discusses the tools that Apache projects use to implement this.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1338/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1338/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/bdelacretaz.wordpress.com/1338/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bdelacretaz.wordpress.com/1338/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/bdelacretaz.wordpress.com/1338/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/bdelacretaz.wordpress.com/1338/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/bdelacretaz.wordpress.com/1338/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/bdelacretaz.wordpress.com/1338/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/bdelacretaz.wordpress.com/1338/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bdelacretaz.wordpress.com/1338/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/bdelacretaz.wordpress.com/1338/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bdelacretaz.wordpress.com/1338/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/bdelacretaz.wordpress.com/1338/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bdelacretaz.wordpress.com/1338/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1338&amp;subd=bdelacretaz&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2009-11-17T09:19:57Z</updated>
    <category term="Open Source"/>
    <category term="asf"/>
    <author>
      <name>bdelacretaz</name>
    </author>
    <source>
      <id>http://grep.codeconsult.ch</id>
      <logo>http://0.gravatar.com/blavatar/e6e901bd190e100a6787d0252d1f244f?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://grep.codeconsult.ch/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://grep.codeconsult.ch" rel="alternate" type="text/html"/>
      <link href="http://grep.codeconsult.ch/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://grep.codeconsult.ch/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>cat /dev/brain | egrep -i 'tech|thoughts|noise'</subtitle>
      <title>bertrand's brain grep</title>
      <updated>2010-09-03T03:00:06Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://bdelacretaz.wordpress.com/?p=1330</id>
    <link href="http://grep.codeconsult.ch/2009/11/16/what-does-apache-provide-that-other-code-repositories-dont/" rel="alternate" type="text/html"/>
    <title>What does Apache provide that other code repositories don’t?</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">People thinking about creating an open source project might rightly consider hosting on one of the various hosting services available: Google Code, SourceForge, kenai, bitbucket and github come to mind. Quick and easy, create a repository or request some resources and you’re in business. Incubating a project at the Apache Software Foundation (ASF) takes a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1330&amp;subd=bdelacretaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>People thinking about creating an open source project might rightly consider hosting on one of the various hosting services available: Google Code, SourceForge, kenai, bitbucket and github come to mind. Quick and easy, create a repository or request some resources and you’re in business.</p>
<p><a href="http://incubator.apache.org">Incubating</a> a project at the Apache Software Foundation (ASF) takes a lot more effort than just requesting a hosting space on one of those services, so why would you do that? One can perfectly host code on one of those services with an Apache License, so what’s the difference?</p>
<p>I think the big difference lies in the <em>governance model</em>, and in fact calling the ASF just a <em>code repository</em> is very wrong.  Let’s discuss some key elements of that.</p>
<p>The <a href="http://www.apache.org/foundation/voting.html">Apache voting process</a> has been tried and tested since 1999, or even earlier. This is one of the things that projects coming through the <a href="http://incubator.apache.org">incubator</a> have to learn, led by their <a href="http://incubator.apache.org/incubation/Roles_and_Responsibilities.html#Mentor">mentors</a>. Learning is usually very easy as people quickly see the benefits of those simple no-nonsense rules.</p>
<p>The ASF also provides a well-defined <a href="http://www.apache.org/foundation/how-it-works.html#structure">structure</a> for managing projects, and the foundation as a whole, in a fair and consensus-driven way. One could argue that structure gets in the way, and sometimes it does, but when things go wrong having a well-defined way of getting back on track helps tremendously. And this structure leaves a lot of freedom to the project’s management committee (PMC), there’s a lot of room for adapting a project’s way of working to its community and goals.</p>
<p>Creating an Apache project is certainly not required for all open source projects (and the foundation couldn’t scale to thousands of projects right now anyway), but for the critical infrastructure parts of one’s business (what’s sometimes called “open core”), having an established governance model makes all the difference.</p>
<p>The governance model is just one of the benefits that Apache projects get – there’s also the visibility, brand recognition, nice <a href="http://ci.apache.org/">build services</a>, and other <a href="https://issues.apache.org/">tools</a>, and, last but not least, the many friends that you make along the way! As everybody now knows, there are <a href="http://news.cnet.com/8301-13505_3-10396229-16.html">no jerks at Apache</a>!</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1330/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1330/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/bdelacretaz.wordpress.com/1330/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bdelacretaz.wordpress.com/1330/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/bdelacretaz.wordpress.com/1330/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bdelacretaz.wordpress.com/1330/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/bdelacretaz.wordpress.com/1330/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bdelacretaz.wordpress.com/1330/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/bdelacretaz.wordpress.com/1330/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bdelacretaz.wordpress.com/1330/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1330&amp;subd=bdelacretaz&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2009-11-16T16:46:19Z</updated>
    <category term="Open Source"/>
    <category term="asf"/>
    <author>
      <name>bdelacretaz</name>
    </author>
    <source>
      <id>http://grep.codeconsult.ch</id>
      <logo>http://www.gravatar.com/blavatar/e6e901bd190e100a6787d0252d1f244f?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://grep.codeconsult.ch/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://grep.codeconsult.ch" rel="alternate" type="text/html"/>
      <link href="http://grep.codeconsult.ch/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://grep.codeconsult.ch/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>cat /dev/brain | egrep -i 'tech|thoughts|noise'</subtitle>
      <title>bertrand's brain grep</title>
      <updated>2010-08-26T11:30:05Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-31254910.post-8516550838640378334</id>
    <link href="http://michaelmarth.blogspot.com/feeds/8516550838640378334/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="https://www.blogger.com/comment.g?blogID=31254910&amp;postID=8516550838640378334" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/8516550838640378334?v=2" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/8516550838640378334?v=2" rel="self" type="application/atom+xml"/>
    <link href="http://feedproxy.google.com/~r/CoffeeGems/~3/S8xroH0CGmw/running-itunes-genre-tagger-script-with.html" rel="alternate" type="text/html"/>
    <title>Running the iTunes genre tagger script with OS X Automator</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Due to <a href="http://michaelmarth.blogspot.com/2009/11/python-script-to-set-genre-in-itunes.html">public demand</a> here's a little recipe how to run <a href="http://michaelmarth.blogspot.com/2009/11/python-script-to-set-genre-in-itunes.html">last post's mp3 tagger</a> without using the command line on OS X:<br/><ul><li>Open Automator</li><li>Start a new "Application" project</li><li>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):</li></ul>for f in "$@"<br/>do<br/>   /opt/local/bin/python /Users/michaelmarth/Development/Code/mp3tagger/tag_groupings.py -d "$f"<br/>done<br/><br/>(you will have to adapt the paths to your local setup)<br/><ul><li>Save the application and happily start dropping mp3 folders onto the application's icon.</li></ul><br/><a href="http://img.skitch.com/20091115-xp4nqy4fnhqg72xdhey19nqdwx.jpg"><img alt="" border="0" src="http://img.skitch.com/20091115-xp4nqy4fnhqg72xdhey19nqdwx.jpg" style="cursor: pointer; width: 736px; height: 245px;"/></a><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/31254910-8516550838640378334?l=michaelmarth.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2009-11-15T14:37:08Z</updated>
    <published>2009-11-15T14:30:00Z</published><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://michaelmarth.blogspot.com/2009/11/running-itunes-genre-tagger-script-with.html</feedburner:origlink>
    <author>
      <name>Michael Marth</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/03925861261744910154</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-31254910</id>
      <author>
        <name>Michael Marth</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/03925861261744910154</uri>
      </author>
      <link href="http://michaelmarth.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://michaelmarth.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/31254910/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/CoffeeGems" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>About software development</subtitle>
      <title>Coffee &amp; Gems</title>
      <updated>2010-08-18T21:52:44Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/wjax09.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/wjax09.html" rel="alternate" type="text/html"/>
    <title>Back from W-JAX 09</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
This year's <a href="http://it-republik.de/jaxenter/wjax09/">WJAX</a> in Munich has been (again) a great success. The conference area was crowded up to the maximum capacity of the hotel I guess. Around 150 talks, different special days covering topics like persistence, OSGi, Scala, and the never dying SOA. My two talks about <a href="http://entwickler.com/konferenzen/ext_scripts/v2/php/sessions-popup.php?module=wjax09&amp;id=12314">JCR</a> and <a href="http://entwickler.com/konferenzen/ext_scripts/v2/php/sessions-popup.php?module=wjax09&amp;id=11356">Apache Sling</a> have been well attended, some interesting questions came up and I could spread the interest in these cool technologies. Now looking forward to JAX 2010 :)
</p>


<div id="__ss_2473988" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/cziegeler/jcr-java-content-repositories" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="JCR - Java Content Repositories">JCR - Java Content Repositories</a><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">documents</a> from <a href="http://www.slideshare.net/cziegeler" style="text-decoration: underline;">Carsten Ziegeler</a>.</div></div>


<div id="__ss_2484361" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/cziegeler/osgi-scripting-and-rest-building-webapps-with-apache-sling" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="OSGi, Scripting and REST, Building Webapps With Apache Sling">OSGi, Scripting and REST, Building Webapps With Apache Sling</a><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">documents</a> from <a href="http://www.slideshare.net/cziegeler" style="text-decoration: underline;">Carsten Ziegeler</a>.</div></div></div>
    </summary>
    <updated>2009-11-13T00:00:01Z</updated>
    <category term="jcr"/>
    <category term="sling"/>
    <category term="rest"/>
    <author>
      <name>Carsten Ziegeler</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-12-21T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/iks-pragmatic-view-update.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/iks-pragmatic-view-update.html" rel="alternate" type="text/html"/>
    <title>Update: The IKS semantic engine - a pragmatist's view</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Update to "<a href="http://dev.day.com/microsling/content/blogs/main/iks-pragmatic-view.html">The IKS semantic engine - a pragmatist's view</a>": here are the slides:</p>

<div id="__ss_2492648" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/bdelacretaz/title-the-iks-restful-semantic-engine-lets-get-started" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="Title     The IKS RESTful semantic engine - let's get started!">Title          The IKS RESTful semantic engine - let's get
started!</a><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View
more <a href="http://www.slideshare.net/" style="text-decoration: underline;">documents</a> from <a href="http://www.slideshare.net/bdelacretaz" style="text-decoration: underline;">bdelacretaz</a>.</div></div>

<p>
The presentation went well, and will hopefully lead to a sprint to actually implement something along these lines. The two demos that used UIMA at the <a href="http://www.iks-project.eu/civicrm/event/info">workshop</a> made me think that UIMA should be part of that picture, at least as a plugin for semantic lifting. And I did the presentation in less than 8 minutes out of the 10 that were allocated. Bonus points?</p></div>
    </summary>
    <updated>2009-11-13T00:00:01Z</updated>
    <category term="iks-project"/>
    <author>
      <name>Bertrand Delacretaz</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-12-18T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/ikssearchbenchmark.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/ikssearchbenchmark.html" rel="alternate" type="text/html"/>
    <title>IKS Search Benchmark</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>

	<a href="http://www.iks-project.eu">
	<img align="right" height="111" src="http://dev.day.com/microsling/content/blogs/main/ikssearchbenchmark/images/iks-logo.jpg" width="214"/>
	</a>

<a href="http://www.day.com/cq5">CQ5</a> search comes with some improvements over JCR's search capabilities, e.g. adapting result rankings to what users choose or faceted search. Within the <a href="http://www.iks-project.eu">IKS project</a> <a href="http://grep.codeconsult.ch">Bertrand</a> and I have experimented with another possibility: link-based ranking, i.e. adjusting search results based on the content of link tags. For example: if page A links to page B with the link text "lorem ipsum" then page B should get a higher ranking when a user searches for "lorem ipsum". This is essentially what Google does, but we wanted to apply it to internal links (within the same site) only.
</p>
<p>To give away the results right away: for many web sites the results will probably not improve dramatically, because there are not enough internal links. However, it might help for some projects so our implementation approach is described below in case you want to give it a try in your project.</p>
<p>
In order to extract links from a node we opted for parsing the complete rendered HTML presentation of a node rather than looking only at the Rich Text properties of one node. In that way we could also catch programmatically generated links from templates. So we ended up by setting up a little spider on the publish server that retrieves HTML representations of all pages. The spider is deployed as an OSGi bundle within the server so it gets the locations of all pages from an internal repository query. For each page the HTML is retrieved and parsed. The found links are stored as child nodes below the page that is linked to. In the example from above: if page A links to page B with the link text "lorem ipsum" then page B gets a child node with properties source=A and text="lorem ipsum". Implemented in that way we could basically use the Jackrabbit indexer without further changes.
</p>
<p>
We have also implemented a JCR Observer that catches changes to pages and fixes the corresponding links. Template updates are not caught, yet.
</p>
<p>
The sources are attached to this post. The Java program can be used as a standalone application or deployed as an OSGi bundle. The standalone program takes a couple of optional arguments for running a full upfront spidering, deleting all found link nodes etc. In case you want to give it a try please be aware:
</p>
<ul>
<li><p>The standalone program requires RMI to be enabled on the repository which is not the case by default (in the code port 1235 is used).</p></li>
<li><p>The searches must take into account the new properties of the link nodes. One possibility is to re-configure the Jackrabbit indexing,
which in CQ5 is done in the
crx-quickstart/server/runtime/0/_crx/WEB-INF/classes/indexing_config.xml
file, by adding:<br/>
</p><div class="codesnippet scrollablecodesnippet">
<pre>&lt;index-rule nodeType="nt:unstructured"
  condition="parent::backlinks/@jcr:primaryType=''{http://www.jcp.org/jcr/nt/1.0}unstructured"&gt;
  &lt;property boost="5.0"&gt;linkedText&lt;/property&gt;
&lt;/index-rule&gt;
</pre></div>
<p/></li>
</ul>
<p>The boost factor in this configuration can be adjusted to give links a proper weight relative to the other properties of a node<br/>
For reindexing delete these directories:<br/>
crx-quickstart/repository/repository/index<br/>
crx-quickstart/repository/workspaces/crx.default/index<br/>
crx-quickstart/repository/workspaces/crx.system/index
</p>

<h6 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">Results</h6>

<p>
We tested the approach on the content of our corporate website (a rather small content corpus). Overall, the search results improved slightly, but not much (although we did not spend a lot of time on tweaking the boost factor). As stated above I believe that corporate websites in general will not benefit from link-based ranking very much as the majority of links in them are often reflecting the navigation (i.e. the hierarchical structure of the site) so they provide little additional information. Of course, on the other side there is no harm in using links for search relevance either.
</p>

<h6 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">Alternative approach</h6>

<p>
Marcel Reutegger (the MAN when it comes to JCR searches) gave a lot of great input to our experiment (thanks a lot for this). He also hinted how an alternative implementation could look like: using an output filter, which can process HTML content as it's being generated. In CQ5 the validity of links is already checked that way, so storing them would naturally fit there. Also, he suggested storing the links not below the pages themselves, but in a separate part of the repository. In a background processing job these links could be aggregated and the most relevant key words would eventually be written into the page nodes.
</p></div>
    </summary>
    <updated>2009-11-12T00:00:01Z</updated>
    <category term="iks-project"/>
    <category term="cq5"/>
    <category term="tutorial"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-12-17T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/ignitechicago.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/ignitechicago.html" rel="alternate" type="text/html"/>
    <title>Ignite Chicago</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p> After the <a href="http://dev.day.com/microsling/content/blogs/main/ignitezurich.html">Ignite in Zurich</a>, there came <a href="http://day.com/summit/chicago.html">Ignite in Chicago</a>, where our American customers, prospects, partners, and Day staff met to share information, experiences, to network, and simply have a very good time. The event itself was slightly bigger than the event in Zurich, both in terms of number of participants and available room.  </p> <p> <img src="http://farm3.static.flickr.com/2711/4087044589_c16cb5e832_m_d.jpg"/> </p> <p> <img src="http://farm3.static.flickr.com/2712/4087798950_beb431fcac_m_d.jpg"/> </p> <p style="clear: both;">Ignite was hosted by Day customers, in more than one way: by the <a href="http://cityofchicago.org/">City of Chicago</a> itself, and by the grand <a href="http://www.icchicagohotel.com/">Intercontinental Hotel</a>, of the <a href="http://www.ihg.com">IHG Group</a>, on Chicago's famous shopping avenue, the <a href="http://www.themagnificentmile.com/">Magnificent Mile</a>.  </p> <p> <img src="http://farm3.static.flickr.com/2797/4087811316_1d5165e370_m_d.jpg"/> </p> <p> <img src="http://farm1.static.flickr.com/150/4087822518_69e9caff7f_m_d.jpg"/> </p> <p style="clear: both;"> Again, we had a lot of great presentations, panels, Q&amp;A sessions, as well as informal chats. And the Foreigner concert at the end was the icing on the cake. </p> <p> <img src="http://farm3.static.flickr.com/2536/4087055603_a5320ed814_m_d.jpg"/> </p> <p style="clear: both;"> Be sure to check out the conference <a href="http://search.twitter.com/search?q=%23dayignite">hashtag was #dayignite</a> and here are some Ignite pictures on Flickr, with lots of new coverage from Chicago: </p> <p>     </p>  <p> Looking forward to next year's Day Customer Summit! </p></div>
    </summary>
    <updated>2009-11-11T00:00:01Z</updated>
    <category term="cms"/>
    <category term="cq"/>
    <category term="ignite"/>
    <author>
      <name>Greg Klebus</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-12-02T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-6874149097478073929.post-5216160329595073684</id>
    <link href="http://blog.meschberger.ch/feeds/5216160329595073684/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="https://www.blogger.com/comment.g?blogID=6874149097478073929&amp;postID=5216160329595073684" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/6874149097478073929/posts/default/5216160329595073684" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/6874149097478073929/posts/default/5216160329595073684" rel="self" type="application/atom+xml"/>
    <link href="http://blog.meschberger.ch/2009/10/on-version-numbers.html" rel="alternate" type="text/html"/>
    <title>On Version Numbers</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I have been thinking about using version numbers lately while working on some API extension of the Sling Engine bundle. So here is what I think versions are all about and that we all should be very careful when changing code and assigning versions to it.<br/><br/>On a high level versions have various aspects:<br/><dl><br/><dt>Syntax</dt><br/><dd>There is no global agreement on the correct syntax of versions. I tend to like the OSGi syntax specification: The version has four parts separated by dots. The first three parts are numbers, called the major, minor and micro version. The fourth part is a plain (reduced character set) string which may be used to describe a particular version. Version numbers are compared as you would expect, except that the fourth part is employs case-sensitive string comparison comparing the actual Unicode codepoints of the characters.</dd><br/><dt>Semantic</dt><br/><dd>The semantics of a version define what it means to increment each place of a version. In the world of software development there is even less agreement on the semantics of version numbers than there is agreement on the syntax. The OSGi specification just defines suggested semantics.</dd><br/><dt>Expectations</dt><br/><dd>When seeing product version numbers people tend to have expectations towards the products. For example when Firefox went from 2.x to 3.0 we expected a major change. Likewise when Day upgraded the version number to 5 for the newest version of Communiqué the expectation is correct, that it is a major new version of the product. In fact we completely rewrote Communiqué for the 5.0 release.</dd><br/><dt>Version Items</dt><br/><dd>When it comes to apply version numbers to things there are quite a number of things in a single product, which may be numbered. Take for example Day Communiqué 5. There is a product - the thing you take out of the box and install on your server. Then there are OSGi bundles. Finally there are Java packages shared between the bundles and used by the application scripts.</dd><br/></dl><br/>So here are my definitions of the version number aspects layed out above.<br/><br/><b>Syntax</b><br/>IMHO the Syntax for version numbers as defined in the OSGi Core specification (Section 3.2.4, Version) is good enough and clear for most uses. The nice thing about this specification is that in Section 3.2.5, Version Ranges, a syntax is defined to define ranges of versions. Such ranges are of great use when depending on other items. Most importantly of course this would be list of imported Java packages.<br/><br/><b>Semantics</b><br/>As for the semantics the main problem comes from the fact, that not all versioned items understand version numbers in the same way. For example on a product level, c.f. Day Communiqué, the version number of a release is generally defined by marketing and/or product management.<br/><br/>I will not dive into how product numbers are to be defined. This is outside of my working knowledge and beyond may abilities ;-)<br/><br/>On the OSGi bundle level on the other hand and even more so on the Java package level (for OSGi package exports), the version number is more a call of the developer. Version numbers on this level are intended to convey to other developers something about the evolution of the bundle and/or package.<br/><br/>Let's start with exported Java packages. I tend to attribute the following semantics to the parts of a a version number:<br/><ul><br/><li>Increasing the major version number means the API has been modified in an incompatible way. Mostly this means public classes, interfaces, methods, fields have been removed or renamed. As a consequence code using and implementing the API will break and has to be modified.</li><br/><li>Increasing the minor version number means the API has just been enhanced in a way that is compatible for use. Increasing the minor version number, though, means that code implementing the API might have to be modified to comply with the added API like the definition of new methods.</li><br/><li>Increasing the micro version number means that there have been some bug fixes. Generally, a pure API consisting of just interfaces has little chance for bugs which do not ammount to minor or even major version number increase. If the exported packages of a bundle happen to contain concrete or abstract classes with implementation code, bugs cannot be excluded. As such it is conceivable that a the micro version number of an exported package might be increased.</li><br/><li>As for the qualifier part, as the fourth part of a version number is called by the OSGi specification, this meaning of this part is completely free. On a package export level, I would go as far as to say, it should not generally be used. The qualifier part may be interesting on an OSGi bundle level to create inter-release builds.</li><br/></ul><br/><br/><b>Expectations</b><br/>Peoples expections as it comes to version numbers is not ease to convey. Most people expect different things. But I think one thing is common to all: If there is a version number increase something must have changed.<br/><br/>So, I think to use developers it is important to understand, that we only increase the version number of an item if there is a change -- not sure whether a fixed spelling error in some Java comment is change enough. Again, your mileage may vary if you happen to be product manager for a product to be soled ....<br/><br/><b>Recommendations</b><br/>Based on how I understand the version number parts in terms of exported packages, here are my recommendations for package imports and bundle versions.<br/><ul><br/><li>If you implement the exported API of another bundle, import the API package using a version range of the form [x.y,x.y+1). This means accept any increment in the micro and qualifier parts. But as soon as the minor version number changes, consider this an incompatibility.</li><br/><li>If you use an exported API, import the API package using a version range of the form [x.y,x+1). This means accept any version starting with a minimum number upto the next breaking API chnage identified by a new major version number.</li><br/><li>Don't increase the version number of an API package if nothing in that package has changed at all.</li><br/><li>Bundles should be versions following versioning of exported packages. So if at least one of the exported packages has a major version number increase, the bundle's version should also have a major version number increase. Likewise for the minor number. The use of qualifiers is optional and sometimes helpful.</li><br/><li>Apart from being driven by versioning of exported packages, bundle versions may also be increased depending on the extent of changes in the bundle. For example in the case of a pure implementation bundle, greatly increasing the functionality might give rise to a major version number increase of the bundle.</li><br/><li>If you are using Maven to build your projects, always depend on the lowest version of a dependent module which has the API functionality you need.</li><br/></ul><br/><br/><b>Link</b><br/>The Eclipse site contains a very interesting and IMHO very reality proven text about versioning of products, bundles and packages: <a href="http://wiki.eclipse.org/index.php/Version_Numbering">Version Numbering</a><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/6874149097478073929-5216160329595073684?l=blog.meschberger.ch" width="1"/></div></div>
    </content>
    <updated>2009-11-09T15:21:46Z</updated>
    <published>2009-10-15T11:50:00Z</published>
    <category scheme="http://www.blogger.com/atom/ns#" term="Client"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="OSGi"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="Bundle"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="Package"/>
    <category scheme="http://www.blogger.com/atom/ns#" term="Version"/>
    <author>
      <name>fmeschbe</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/14510099790398523034</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-6874149097478073929</id>
      <author>
        <name>fmeschbe</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/14510099790398523034</uri>
      </author>
      <link href="http://blog.meschberger.ch/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://www.blogger.com/feeds/6874149097478073929/posts/default" rel="self" type="application/atom+xml"/>
      <link href="http://blog.meschberger.ch/" rel="alternate" type="text/html"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <title>fmeschbe's blog</title>
      <updated>2010-08-22T18:41:40Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/lotd20091109.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/lotd20091109.html" rel="alternate" type="text/html"/>
    <title>[LOTD] How Day Software stumbled upon an open source business strategy</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
Day's CMO Kevin Cochrane has been <a href="http://blogs.the451group.com/opensource/2009/11/09/how-day-software-stumbled-upon-an-open-source-business-strategy/">interviewed</a> by Matthew Aslet of the <a href="http://www.the451group.com/">451 group</a> about Day's open source strategy. I particularly liked:
</p>


<div class="blockquote"><p>
While many other vendors have chosen to retain control over their open source projects for commercial reasons, Day opted to relinquish control with the aim of ubiquity.
</p></div>

<p>Full interview <a href="http://blogs.the451group.com/opensource/2009/11/09/how-day-software-stumbled-upon-an-open-source-business-strategy/">here</a>.</p></div>
    </summary>
    <updated>2009-11-09T00:00:01Z</updated>
    <category term="lotd"/>
    <category term="open"/>
    <category term="apache"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-26T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/iks-pragmatic-view.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/iks-pragmatic-view.html" rel="alternate" type="text/html"/>
    <title>The IKS semantic engine - a pragmatist's view</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
<a href="http://www.iks-project.eu">
<img align="right" height="111" src="http://dev.day.com/microsling/content/blogs/main/iks-pragmatic-view/images/iks-logo.jpg" width="214"/>
</a>

As work on the <a href="http://www.iks-project.eu/">IKS project</a> progresses, my (extremely) pragmatic mind 
keeps going back to the <em>how can we make this simpler?</em> question.
  
</p>

<p>
One of the major goals of IKS is to create semantic extensions for content management systems, but what does 
that mean? The exact use cases are still vague, and in such a situation it is too easy to over-engineer 
things, <em>just in case</em>.
</p>

<p>
We have been talking about RESTful interfaces to IKS components for a while now, but what does this mean
exactly? How can we make a concrete step towards defining such interfaces? 
</p>
<p>I'm a big fan of small concrete 
steps that lead us towards pragmatic solutions, so let's try to take one such step. 
</p>

<h6 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">Machine-level use cases</h6>

<p>
Let's start by defining a few simple use cases, at the "machine level": a content management system is the
client, and the IKS <em>semantic engine</em> the server. We have discussed this already within IKS, here's 
a synthetic summary:  

</p><dl>

<dt>Semantic lifting</dt>
<dd>
Let IKS extract semantic information from (multimedia) content: person and place names, structured 
links between content items, etc.
Optionally make this information editable/confirmable by the client system, as a human user
might have to refine the system's suggestions.
<br/>
<em>At the machine interface level, this requires registering content with the IKS semantic
engine, reading the resulting semantically lifted document, and optionally modifying it.</em>  
</dd>

<dt>Classification and auto-tagging</dt>
<dd>
Let IKS suggest categories and/or tags for pieces of multimedia content.
If an author validates the suggestions, inform IKS of what choices were made.
<br/>
<em>From the machine interface point of view, this is very similar to semantic lifting</em>. 
</dd>

<dt>Query building assistance</dt>
<dd>
Let IKS assist users in formulating search queries, interactively.
<br/>
<em>From the machine interface point of view, this is very similar to semantic lifting</em>.
</dd>

<dt>Similarities, correlation</dt>
<dd>
Let IKS find similarities between pieces of multimedia content. The axes on which
those similarities are found can vary: images, for example, can be graphically similar,
or similar in terms of the real world entities that they display.
<br/>
<em>At the machine interface level, this requires registering content with the IKS semantic
engine, and later running queries against this content.</em>  
</dd>

</dl>

<p/>

<p>
This simple list already hides significant complexity, yet those use cases should be understandable by
Joe Author. 
</p>
<p>
Enabling those four use cases could add a lot of value to existing and future content management
systems, depending on the quality of the semantic components. 
</p>

<h6 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">RESTful interface</h6>
<p>
Let's design a RESTful interface based on the machine interactions required to implement
the above use cases. 
</p>
<p>
Remember that, in what follows, <em>client</em> designates a content management system that wants
to use the IKS engine.
</p>

<strong xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" class="h7">Register content with IKS</strong>
<p>
To build knowledge about our content, IKS needs to be able to find it. In RESTful terms this means
providing IKS with an URL that points to said content, so we have:
</p>

<div class="blockquote"><p>
Rule #1: Content is registered with the IKS server by HTTP POST requests, containing lists of URLs
that point to (created or modified) content items. 
</p></div>
<div class="blockquote"><p>
Rule #2: IKS reads content by making HTTP GET requests to registered pieces of content. Those URLs
must return Content-Types that IKS understands. Some Content-Types are preferred and allow IKS to 
better understand the content. 
</p></div>
<p/>

<strong xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" class="h7">Semantic Lifting</strong>
<p>
Once content is registered, the client can request a semantic view of that content from IKS. That view
lists semantic entities that have been extracted from the content.
</p>
<p>
Depending on the IKS implementation, the semantic view can be editable. It is retrieved by a GET request that
contains the IKS identifier (provided by IKS when content is registered) of the content item, and modified 
using an HTTP PUT request.
</p>
<p>
The Content-Type and data formats use existing standards, as far as possible.
</p>
<p>
The semantic view includes IKS-specific metadata, for example to indicate that some parts of the semantic view
are still being computed.
</p>
<div class="blockquote"><p>
Rule #3: The semantic view of a content item is retrieved with a GET request, and if editable can be
modified by a PUT request of the modified version.
</p></div>

<strong xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" class="h7">Semantic queries</strong>
<p>
Semantic queries are implemented using GET methods on various query URLs, that define how the query
is interpreted. 
</p>
<p>
Results are returned with similar Content-Types and data formats as used for semantic lifting.
</p>
<div class="blockquote"><p>
Rule #4: Semantic queries are executed via GET requests, and return the identifiers (URLs) of the 
selected content items, optionally with some contextual info to display on query result pages. 
</p></div>

<strong xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" class="h7">IKS engine status</strong>
<p>
Semantic lifting and indexing operations might take some time, so it's useful for the client to have
information on the engine's status, in machine-readable form.
</p>
<div class="blockquote"><p>
Rule #5: The IKS server reserves part of its URL space for system
status information, and provides status information in a structured format. 
</p></div>

<strong xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" class="h7">Is that it?</strong>
<p>
I think that's it - these simple RESTful interactions should be sufficient to implement
our use cases. 
</p>
<p>
What's left is to define the Content-Types used, and for this we can most certainly use existing
formats, no need to reinvent any wheel here. 
</p>

<h6 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">RESTful IKS framework</h6>
<p>
The proof of the pudding is in the eating, and if we wait too long the pudding might lose its 
taste...so why not start buiding this right away?
</p>
<p>
Purists might (rightly) argue that the above is not a design, just a somewhat vague set of principles. 
Yet, combined with a prototype implementation, this might be a very good way of making a step
in the right direction, and of clarifying requirements and interfaces. 
</p>
<p>
My suggestion for the next steps is as follows:
</p><ol>
<li><p>Implement the above interface, using dummy semantic components.</p></li>
<li><p>Provide system interfaces to integrate actual semantic components (semantic lifting, classification,
auto-tagging, querying) as plugins.</p></li>
<li><p>Researchers can work on the semantic lifting components, and integrate them without requiring
significant changes on the client side.</p></li>
</ol>
<p/>
<h6 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">Conclusion</h6>
<p>
The best way to go forward with this is probably to create an open source project to collaborate on 
this RESTful IKS framework. 
</p>
<p>
Even if that framework is thrown away later as the IKS architecture progresses, if
would allow IKS consortium members to build a much better understanding
of what's actually needed to add "semantic value" to existing and future content management 
systems.    
</p></div>
    </summary>
    <updated>2009-11-09T00:00:01Z</updated>
    <category term="iks-project"/>
    <author>
      <name>Bertrand Delacretaz</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-21T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/apacheconus09slides.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/apacheconus09slides.html" rel="alternate" type="text/html"/>
    <title>Slides from the NoSQL Meetup and ApacheCon US 09</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://us.apachecon.com/c/acus2009/">ApacheCon US 09</a> in Oakland and the <a href="http://www.nosqloakland.org/">NoSQL meetup</a> are over. Find below the slides of the talks given by Day's engineers covering Apache projects <a href="http://sling.apache.org/site/index.html">Sling</a>, <a href="http://jackrabbit.apache.org/">Jackrabbit</a>,  <a href="http://lucene.apache.org/tika/">Tika</a> and <a href="http://poi.apache.org/">POI</a> as well as OSGi.</p>


<div id="__ss_2408369" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/bdelacretaz/jcr-in-10-minutes-2408369" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="JCR In 10 Minutes">Bertrand Delacretaz:  JCR In 10 Minutes</a><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">documents</a> from <a href="http://www.slideshare.net/bdelacretaz" style="text-decoration: underline;">bdelacretaz</a>.</div></div>

<div id="__ss_2383686" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/bdelacretaz/life-in-open-source-communities-apachecon-us-2009" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="Life in Open Source Communities, ApacheCon US 2009">Bertrand Delacretaz: Life in Open Source Communities</a><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">documents</a> from <a href="http://www.slideshare.net/bdelacretaz" style="text-decoration: underline;">bdelacretaz</a>.</div></div>


<div id="__ss_2432056" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/cziegeler/jcr-in-action-apachecon-us-2009" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="JCR In Action (ApacheCon US 2009)">Carsten Ziegeler: JCR In Action</a><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">documents</a> from <a href="http://www.slideshare.net/cziegeler" style="text-decoration: underline;">Carsten Ziegeler</a>.</div></div>


<div id="__ss_2442206" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/cziegeler/embrace-change-embrace-osgi" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="Embrace Change - Embrace OSGi">Carsten Ziegeler: Embrace Change - Embrace OSGi</a><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">documents</a> from <a href="http://www.slideshare.net/cziegeler" style="text-decoration: underline;">Carsten Ziegeler</a>.</div></div>


<div id="__ss_2433501" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/fmeschbe/rapid-jcr-applications-development-with-sling-2433501" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="Rapid JCR Applications Development with Sling">Felix Meschberger: Rapid JCR Applications Development with Sling</a><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">presentations</a> from <a href="http://www.slideshare.net/fmeschbe" style="text-decoration: underline;">Felix Meschberger</a>.</div></div>


<div id="__ss_2440559" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/jukka/mime-magic-with-apache-tika-2440559" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="Mime Magic With Apache Tika">Jukka Zitting: Mime Magic With Apache Tika</a><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">presentations</a> from <a href="http://www.slideshare.net/jukka" style="text-decoration: underline;">Jukka Zitting</a>.</div></div>


<div id="__ss_2427228" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/paolomoz/apache-poi-recipes" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="Apache Poi Recipes">Paolo Mottadelli: Apache Poi Recipes</a><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">documents</a> from <a href="http://www.slideshare.net/paolomoz" style="text-decoration: underline;">Paolo Mottadelli</a>.</div></div></div>
    </summary>
    <updated>2009-11-09T00:00:01Z</updated>
    <category term="apache"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-23T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/boye09.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/boye09.html" rel="alternate" type="text/html"/>
    <title>JBoye Presentation: WCM Trends for 2010</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
Today I had the opportunity to speak at the <a href="http://www.jboye.com/conferences/aarhus09/">JBoye conference in Aarhus</a>. It was a pleasure as every year since the audience and speakers really constitutes a who-is-who of WCM visionaries and insiders. I am definitely looking forward to coming back next year.
</p>
<div id="__ss_2430936" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/uncled/jboye-presentation-wcm-trends-for-2010" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="JBoye Presentation: WCM Trends for 2010">JBoye Presentation: WCM Trends for 2010</a><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">documents</a> from <a href="http://www.slideshare.net/uncled" style="text-decoration: underline;">David Nuescheler</a>.</div></div></div>
    </summary>
    <updated>2009-11-05T00:00:01Z</updated>
    <category term="cms"/>
    <category term="wcm"/>
    <category term="cq5"/>
    <author>
      <name>David Nuescheler</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-19T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/tibtec.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/tibtec.html" rel="alternate" type="text/html"/>
    <title>Ask the community: TibTec</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>

</p>

<div style="border-bottom: 1px dotted rgb(153, 153, 153); padding: 2px;">
<p>
<em>
The Tuberculosis Project project is one of the Sling users registered on the <a href="http://cwiki.apache.org/confluence/pages/viewpage.action?pageId=2852421">Sling user wiki page</a>. This is an interview with developer Audrey Colbrant who worked on the project.
</em>
</p>
</div>

<p>
<b>Audrey, can you please tell us a bit about the TibTec Tuberculosis Project? What are the project's aims and background?</b>

</p><p>
The TB project is developed by <a href="http://www.tibtec.org">Tibtec</a>, a nonprofit technology center based in Dharamsala (India) and directed by M. Phuntsok DORJEE. The aim of the project was to build a system to monitor the tuberculosis among tibetan communities in India, Nepal and Bhutan. Thanks to technology advances in mobile and web computing, it is now possible to design a recording and reporting web portal supporting the WHO DOTS protocol.
</p><p>
The project of monitoring the tuberculosis among tibetan communities in India was born 1 year ago thanks to four actors: the DoH (Department of Health, Tibetan Government in Exile), Tibetan Delek Hospital (Gangchen Kyishong - India), AISPO (Italian Association for Solidarity Of Persons), and the Johns Hopkins University (USA). TibTec is working on a system for the above four actors.
</p><p>
The main goal of the project is to build a simple, low-cost and versatile framework so that communities all over the world could benefit from it. The system could be easily customized for other works as well since it based on open source software.
</p><p>
If you want to take a look at the architecture, follow the <a href="http://tamia.inrialpes.fr:7402/apps/tb_monitoring/images/development/tb_project_architecture.jpg">guide</a>.
</p>

 
<p>
<b>So how did you end up using Sling? Did you compare Sling against some other frameworks?</b>
</p><p>
The implementation of the TB project was part of the master project in computer science of my university.
Jacques Lemordant, researcher in the WAM project at <a href="http://wam.inrialpes.fr">INRIA</a> was in contact with M. Dorjee, CEO of TibTec, since several years.
Together they have defined headlines of the project and chosen the more efficient technologies to be used.
</p>
 
<p>
Sling was chosen because we are very familiar with XML technologies (RELAX NG, XPATH, XSLT...) and hierarchical representation of data.
</p><p>
Another point was the fact that we wanted to access data from Android (Apache http client) and a full REST API was the simplest way to access a JCR and manipulate data represented as trees. XML being very well supported in Android, Sling is a perfect match with Android to design agile mobile web framework.
</p><p>
Sling is also part of a course in mobile and web technologies as the master level of the University Joseph Fourier of Grenoble.
</p><p>
 
</p><p>
<b>Now that you have completed an implementation project with Sling are there any lessons learned you would like to share with the community?</b>
</p><p>
The Sling approach is fairly new and I haven’t seen any other same kind of approach before. The concept is simple but it takes a little bit time to be used to the utilization. So never give up, solutions come slowly with perseverance.
</p>

<p>
<b>If you had one free wish from the Sling committers...</b>
</p><p>
Sling is a very interesting and powerful way to work with resources but difficult to handle for Sling beginners when you have a full and composite website to implement, mostly because of the lack of information on the internet.
</p><p>
The harder thing that gives me a lot of headaches was to find a good syntax to use that changes according to the technology you mix up.
</p><p>
So I think it could be helpful to have more tutorials on the syntax to use in each different case, what is better to do or not, and advice on choices to take in programming (for example I have met choices for protecting the access to the repository; choices about which kind of link is better to use:  reference or path, etc).
</p><p>
It could be also good to finalize all links of this <a href="http://dev.day.com/docs/en/crx/current/administering.html">useful webpage</a>
</p></div>
    </summary>
    <updated>2009-11-04T00:00:01Z</updated>
    <category term="ask the community"/>
    <category term="sling"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-18T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-31254910.post-7900704455924011778</id>
    <link href="http://michaelmarth.blogspot.com/feeds/7900704455924011778/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="https://www.blogger.com/comment.g?blogID=31254910&amp;postID=7900704455924011778" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/7900704455924011778?v=2" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/7900704455924011778?v=2" rel="self" type="application/atom+xml"/>
    <link href="http://feedproxy.google.com/~r/CoffeeGems/~3/_FWOtstoV_0/python-script-to-set-genre-in-itunes.html" rel="alternate" type="text/html"/>
    <title>Python script to set genre in iTunes with Last.fm tags</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">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.<br/><br/><span style="font-size: 180%;">General Strategy</span><br/><br/>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", <span style="font-style: italic;">not</span> 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..<br/><br/>The ID3 field that is exposed in iTunes' UI as "grouping" is defined in the <a href="http://www.id3.org/id3v2.3.0">ID3v2 spec</a> as:<br/><dl><dt style="font-weight: bold;">TIT1</dt><dd>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"). </dd></dl>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 <a href="http://www.id3.org/id3v2.3.0">ID3v2 spec</a> if you consider dabbling with mp3 tags.<br/><br/><span style="font-size: 180%;">Practical Considerations</span><br/><br/>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.<br/><br/>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).<br/><br/>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.<br/><br/><span style="font-size: 180%;">Script</span><br/><br/>To run the script you will need the Python libraries <a href="http://code.google.com/p/mutagen/">mutagen</a> and <a href="http://code.google.com/p/pylast/">pylast</a> installed. Run it with the option<br/>-d directory_with_mp3s<br/>The script will walk along this directory and modify all mp3s it finds. Also, you will need a <a href="http://www.last.fm/api/account">Last.fm API key</a> and set your API_KEY and API_SECRET accordingly in the script.<br/><br/><pre><br/>#!/usr/bin/env python<br/># encoding: utf-8<br/>"""<br/>tag_groupings.py<br/><br/>Created by Michael Marth on 2009-11-02.<br/>Copyright (c) 2009 marth.software.services. All rights reserved.<br/>"""<br/><br/>import sys<br/>import getopt<br/>import pylast<br/>import os.path<br/>from mutagen.id3 import TCON, ID3, TIT1<br/><br/>help_message = '''<br/>Adds ID3 tags to mp3 files for genre and groupings. Tag values are retrieved from Last.FM. Usage:<br/>-d mp3_directory<br/>'''<br/><br/>class Usage(Exception):<br/>   def __init__(self, msg):<br/>       self.msg = msg<br/><br/>all_genres = TCON.GENRES<br/>genre_cache = {}<br/>groupings_cache = {}<br/>API_KEY = "your key here"<br/>API_SECRET = "your secret here"<br/>network = pylast.get_lastfm_network(api_key = API_KEY, api_secret = API_SECRET)<br/><br/>def artist_to_genre(artist):<br/>   if genre_cache.has_key(artist):<br/>       return genre_cache[artist]<br/>   else:<br/>       tags = network.get_artist(artist).get_top_tags()      <br/>       for tag in tags:<br/>           if all_genres.__contains__(tag[0].name.title()):<br/>               genre_cache[artist] = tag[0].name.title()<br/>               print "%20s %s" % (artist,tag[0].name.title())<br/>               return tag[0].name.title()<br/><br/>def artist_to_groupings(artist):<br/>   if groupings_cache.has_key(artist):<br/>       return groupings_cache[artist]<br/>   else:<br/>       tags = network.get_artist(artist).get_top_tags()<br/>       relevant_tags = []<br/>       for tag in tags:<br/>           if int(tag[1]) &gt;= 50:<br/>               relevant_tags.append(tag[0].name.title())<br/>       groupings = ", ".join(relevant_tags)<br/>       groupings_cache[artist] = groupings<br/>       print "%20s %s" % (artist,groupings)<br/>       return groupings<br/><br/>def walk_mp3s():<br/>   for root, dirs, files in os.walk('.'):<br/>       for name in files:<br/>           if name.endswith(".mp3"):<br/>               audio = ID3(os.path.join(root, name))<br/>               artist = audio["TPE1"]<br/>               genre = artist_to_genre(artist[0])<br/>               grouping = artist_to_groupings(artist[0])<br/>               if genre != None:<br/>                   audio["TCON"] = TCON(encoding=3, text=genre)<br/>               if grouping != None:<br/>                   audio["TIT1"] = TIT1(encoding=3, text=grouping)<br/>               audio.save()<br/><br/>def main(argv=None):<br/>   if argv is None:<br/>       argv = sys.argv<br/>   try:<br/>       try:<br/>           opts, args = getopt.getopt(argv[1:], "ho:vd:", ["help", "output="])<br/>       except getopt.error, msg:<br/>           raise Usage(msg)<br/> <br/>       # option processing<br/>       for option, value in opts:<br/>           if option == "-v":<br/>               verbose = True<br/>           if option in ("-h", "--help"):<br/>               raise Usage(help_message)<br/>           if option in ("-o", "--output"):<br/>               output = value<br/>           if option in ("-d"):<br/>               try:<br/>                   os.chdir(value)<br/>               except Exception,e:<br/>                   print "error with directory " + value<br/>                   print e<br/>       walk_mp3s()      <br/> <br/>   except Usage, err:<br/>       print &gt;&gt; sys.stderr, sys.argv[0].split("/")[-1] + ": " + str(err.msg)<br/>       print &gt;&gt; sys.stderr, "\t for help use --help"<br/>       return 2<br/><br/>if __name__ == "__main__":<br/>   sys.exit(main())<br/><br/></pre><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/31254910-7900704455924011778?l=michaelmarth.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2009-11-03T21:22:58Z</updated>
    <published>2009-11-03T18:27:00Z</published><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://michaelmarth.blogspot.com/2009/11/python-script-to-set-genre-in-itunes.html</feedburner:origlink>
    <author>
      <name>Michael Marth</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/03925861261744910154</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-31254910</id>
      <author>
        <name>Michael Marth</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/03925861261744910154</uri>
      </author>
      <link href="http://michaelmarth.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://michaelmarth.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/31254910/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/CoffeeGems" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>About software development</subtitle>
      <title>Coffee &amp; Gems</title>
      <updated>2010-08-18T21:52:44Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://bdelacretaz.wordpress.com/?p=1326</id>
    <link href="http://grep.codeconsult.ch/2009/11/03/jcr-in-15-minutes/" rel="alternate" type="text/html"/>
    <title>JCR in 15 minutes</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">We had a great NoSQL meeting yesterday evening colocated with ApacheCon. Thanks Jukka for organizing! I was in track B for the second part, and found it very interesting to compare three different approaches to non-relational content storage: MarkLogic server, JCR and Pier Fumagalli’s Lucene+DAV technique. I also quite liked Steve Yen’s “horseless carriage” way [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1326&amp;subd=bdelacretaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>We had a great <a href="http://www.nosqloakland.org/">NoSQL meeting</a> yesterday evening colocated with <a href="http://us.apachecon.com">ApacheCon</a>. Thanks Jukka for organizing! </p>
<p>I was in track B for the second part, and found it very interesting to compare three different approaches to non-relational content storage: MarkLogic server, JCR and Pier Fumagalli’s Lucene+DAV technique.</p>
<p>I also quite liked Steve Yen’s <a href="http://blog.northscale.com/northscale-blog/2009/11/attending-nosql-oakland-2009.html">“horseless carriage”</a> way of looking at NoSQL. Defining things by what they are, as opposed to what they are not, sounds like a good idea.</p>
<p>I gave a short talk about JCR, find the slides below. Of course, as usual, they’re not as good as when I’m here to talk about them ;-)</p>
<p/>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1326/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1326/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/bdelacretaz.wordpress.com/1326/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bdelacretaz.wordpress.com/1326/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/bdelacretaz.wordpress.com/1326/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bdelacretaz.wordpress.com/1326/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/bdelacretaz.wordpress.com/1326/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bdelacretaz.wordpress.com/1326/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/bdelacretaz.wordpress.com/1326/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bdelacretaz.wordpress.com/1326/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1326&amp;subd=bdelacretaz&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2009-11-03T18:02:23Z</updated>
    <category term="content"/>
    <category term="jcr"/>
    <author>
      <name>bdelacretaz</name>
    </author>
    <source>
      <id>http://grep.codeconsult.ch</id>
      <logo>http://www.gravatar.com/blavatar/e6e901bd190e100a6787d0252d1f244f?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://grep.codeconsult.ch/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://grep.codeconsult.ch" rel="alternate" type="text/html"/>
      <link href="http://grep.codeconsult.ch/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://grep.codeconsult.ch/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>cat /dev/brain | egrep -i 'tech|thoughts|noise'</subtitle>
      <title>bertrand's brain grep</title>
      <updated>2010-07-30T13:30:04Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-31254910.post-1092470555444988911</id>
    <link href="http://michaelmarth.blogspot.com/feeds/1092470555444988911/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="https://www.blogger.com/comment.g?blogID=31254910&amp;postID=1092470555444988911" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/1092470555444988911?v=2" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/1092470555444988911?v=2" rel="self" type="application/atom+xml"/>
    <link href="http://feedproxy.google.com/~r/CoffeeGems/~3/17AYE6ZZR0I/interviewed-by-internet-briefing-blog.html" rel="alternate" type="text/html"/>
    <title>Interviewed by Internet Briefing Blog</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Reto Hartinger of the <a href="http://www.internet-briefing.ch/">Internet Briefing group</a> has <a href="http://blog.internet-briefing.ch/2009/11/03/nosql/">interviewed me</a> about what I work on these days. The interview is in German.<div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/31254910-1092470555444988911?l=michaelmarth.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2009-11-03T07:18:19Z</updated>
    <published>2009-11-03T07:15:00Z</published><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://michaelmarth.blogspot.com/2009/11/interviewed-by-internet-briefing-blog.html</feedburner:origlink>
    <author>
      <name>Michael Marth</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/03925861261744910154</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-31254910</id>
      <author>
        <name>Michael Marth</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/03925861261744910154</uri>
      </author>
      <link href="http://michaelmarth.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://michaelmarth.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/31254910/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/CoffeeGems" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>About software development</subtitle>
      <title>Coffee &amp; Gems</title>
      <updated>2010-08-18T21:52:44Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/apacheconus09.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/apacheconus09.html" rel="alternate" type="text/html"/>
    <title>NoSQL Meetup and ApacheCon 09 in Oakland</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://us.apachecon.com/c/acus2009/">ApacheCon US 09</a> starts today in Oakland. A couple of Day's engineers will give talks, not just about the usual suspects <a href="http://sling.apache.org/site/index.html">Sling</a> and <a href="http://jackrabbit.apache.org/">Jackrabbit</a>, but also <a href="http://lucene.apache.org/tika/">Tika</a> and <a href="http://poi.apache.org/">POI</a> (details below).</p>

<p>Also, Jukka Zitting has helped organize a <a href="http://www.nosqloakland.org/">NoSQL meetup in Oakland</a> starting tonight where Bertrand Delacretaz will talk about JCR.</p>

<p>
<b><img src="http://dev.day.com/microsling/content/blogs/main/apacheconus09/docroot/bertrand.png" style="float: left; margin-right: 20px; margin-bottom: 10px;"/>Bertrand Delacretaz:</b> <a href="http://us.apachecon.com/c/acus2009/sessions/293">Life in Open Source communities</a>: Open Source communities often seem to have their own unwritten rules of operation and communication, their own jargon and their own etiquette, which sometimes make them appear obscure and closed to outsiders. In this talk, we'll provide recommendations on how to get touch with, and how to join, Open Source communities. Based on ten years of experience in various Open Source projects, we will provide practical information on how to communicate effectively on mailing lists, how to formulate questions in an effective way, how to contribute in ways that add value to the project, and generally how to interact with Open Source communities in ways that are mutually beneficial. This talk will help Open Source beginners get closer to the communities that matter to them, and help more experienced community members understand how to welcome and guide newcomers.
</p>

<p>
<b><img src="http://dev.day.com/microsling/content/blogs/main/apacheconus09/docroot/carsten.png" style="float: left; margin-right: 20px; margin-bottom: 10px;"/>Carsten Ziegeler:</b> <a href="http://us.apachecon.com/c/acus2009/sessions/283">JCR in Action - Content-based Applications with Jackrabbit</a>: The Java Content Repository API (JCR) is the ideal solution to store hierarchical structured content, and to develop content-oriented applications. This session provides a practical introduction to help you get started using JCR in your own application. To demonstrate the basic architecture of such applications, a sample content-based application will be developed during the session. Basic techniques will be explained, including navigation, searching, and observations, using the Apache Jackrabbit project.<br/><br/>

<a href="http://us.apachecon.com/c/acus2009/sessions/307">Embrace OSGi - A Developer's Quickstart</a>: In theory, the first choice for highly modular, dynamic, and extensible applications is OSGi technology. The theory sounds very tempting, but what about the real world? Starting with the basics of OSGi, this session is focused on practical examples, tools, and procedures for a rapid adoption of OSGi in your own projects. Learn how to avoid the typical traps and how to get the most out of OSGi
</p>


<p>
<b><img src="http://dev.day.com/microsling/content/blogs/main/apacheconus09/docroot/felix.png" style="float: left; margin-right: 20px; margin-bottom: 10px;"/>Felix Meschberger:</b> <a href="http://us.apachecon.com/c/acus2009/sessions/284">Rapid JCR applications development with Sling</a>: Apache Sling is an OSGi-based, scriptable applications layer, using REST principles, that runs on top of a JCR content repository. In this talk, we'll see how Sling enables rapid development of JCR-based content applications, by leveraging the JSR 223 scripting framework. We'll also look at the rich set of OSGi components provided by Sling. We will create a simple application from scratch in a few minutes, and explain a more complex multimedia application that does a lot with just a few lines of code. This talk will help you get started with Sling and understand how the different components fit together.
</p>

<p>
<b><img src="http://dev.day.com/microsling/content/blogs/main/apacheconus09/docroot/jukka.png" style="float: left; margin-right: 20px; margin-bottom: 10px;"/>Jukka Zitting:</b> <a href="http://us.apachecon.com/c/acus2009/sessions/334">MIME Magic with Apache Tika</a>: Apache Tika aims to make it easier to extract metadata and structured text content from all kinds of files. Tika is a subproject of Apache Lucene, and leverages libraries like Apache POI and Apache PDFBox to provide a powerful yet simple interface for parsing dozens of document formats. This makes Tika an ideal companion for Apache Lucene, or for any search engine that needs to be able to index metadata and content from many different types of files. This presentation introduces Apache Tika and shows how it's being used in projects like Apache Solr and Apache Jackrabbit. You will learn how to integrate Tika with your application and how to configure and extend Tika to best suit your needs. The presentation also summarizes the key characteristics of the more widely used file formats and metadata standards, and shows how Tika can help deal with that complexity. The audience is expected to have basic understanding of Java programming and MIME media types.
</p>


<p>
<b><img src="http://dev.day.com/microsling/content/blogs/main/apacheconus09/docroot/paolo.jpg" style="float: left; margin-right: 20px; margin-bottom: 10px;"/>Paolo Mottadelli:</b> <a href="http://us.apachecon.com/c/acus2009/sessions/286">Apache POI recipes</a>: The Apache POI project provides Open Source Java APIs for the manipulation of Microsoft Office format files. It was developed to provide OLE2 Compound Document format support. POI support for the new format was necessitated by the proliferation of new Office Open XML (OOXML) documents, due to its standardization. As a result, a common challenge emerged for projects that leverage POI to read and write Excel, Word, and PowerPoint documents: supporting the new format while maintaining backward compatibility with the earlier one. This session provides an overview of how the new POI architecture makes that challenge easier, using the common interfaces package and their double implementation. Participants will also learn about the main new features provided by POI towards support of the new OOXML format. To demonstrate POI's features, this session will also drive through a collection of practical recipes to solve the tough problems of integrating Office documents in your enterprise applications.
</p></div>
    </summary>
    <updated>2009-11-02T00:00:01Z</updated>
    <category term="apache"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-13T00:00:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://bdelacretaz.wordpress.com/?p=1321</id>
    <link href="http://grep.codeconsult.ch/2009/10/30/life-in-open-source-communities-live-at-apachecon/" rel="alternate" type="text/html"/>
    <title>Life in Open Source Communities, live at ApacheCon!</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I have just finished my slides for next week at ApacheCon. Though the topic of how to “survive” in our open source communities has been on my mind for a while, this is a totally new presentation, which is both great (in the blank slate sense) and a lot of work. Having recently read Presentation [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1321&amp;subd=bdelacretaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><img align="right" alt="notmuch.jpg" border="0" height="188" src="http://bdelacretaz.files.wordpress.com/2009/10/notmuch.jpg?w=250&amp;h=188" width="250"/>I have just finished my slides for <a href="http://us.apachecon.com/c/acus2009/sessions/293">next week at ApacheCon</a>. Though the topic of how to “survive” in our open source communities has been on my mind for a while, this is a totally new presentation, which is both great (in the blank slate sense) and a lot of work.</p>
<p><img align="right" alt="cocoon-step.jpg" border="0" height="198" src="http://bdelacretaz.files.wordpress.com/2009/10/cocoon-step.jpg?w=250&amp;h=198" width="250"/>Having recently read <a href="http://www.presentationzen.com/">Presentation Zen</a> (<i>very</i> recommended if you do presentations and/or like beautiful books), I started adding full-screen pictures to the first few slides, and couldn’t stop! The presentation will then consist of me ad-libbing (or more precisely trying to <i>tell stories</i>) on a series of nice pictures grabbed from <a href="http://morguefile.com">morguefile.com</a> (don’t worry about <a href="http://morguefile.com/docs/What_is_a_morguefile">that name</a>).</p>
<p><img align="right" alt="allabout.jpg" border="0" height="187" src="http://bdelacretaz.files.wordpress.com/2009/10/allabout.jpg?w=250&amp;h=187" width="250"/>I’ll post the slides here later, for now they are super secret, so you’ll just get the teasers…images courtesy of morguefile.com (<em>update: slides added now</em>).</p>
<p>Hope to see you next week! In any case I have collected a number of useful links in my <a href="http://delicious.com/bdelacretaz/losc">delicious bookmarks</a>, I’ll point people to them in the presentation.</p>
<p/>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1321/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1321/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/bdelacretaz.wordpress.com/1321/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bdelacretaz.wordpress.com/1321/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/bdelacretaz.wordpress.com/1321/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bdelacretaz.wordpress.com/1321/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/bdelacretaz.wordpress.com/1321/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bdelacretaz.wordpress.com/1321/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/bdelacretaz.wordpress.com/1321/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bdelacretaz.wordpress.com/1321/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1321&amp;subd=bdelacretaz&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2009-10-30T10:18:26Z</updated>
    <category term="ApacheCon"/>
    <category term="Open Source"/>
    <category term="asf"/>
    <category term="conferences"/>
    <author>
      <name>bdelacretaz</name>
    </author>
    <source>
      <id>http://grep.codeconsult.ch</id>
      <logo>http://www.gravatar.com/blavatar/e6e901bd190e100a6787d0252d1f244f?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://grep.codeconsult.ch/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://grep.codeconsult.ch" rel="alternate" type="text/html"/>
      <link href="http://grep.codeconsult.ch/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://grep.codeconsult.ch/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>cat /dev/brain | egrep -i 'tech|thoughts|noise'</subtitle>
      <title>bertrand's brain grep</title>
      <updated>2010-07-21T08:30:03Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/bertrandtelly.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/bertrandtelly.html" rel="alternate" type="text/html"/>
    <title>Bertrand on the telly (brush up your French)</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
Bertrand Delacretaz was interviewed <a href="http://dev.day.com/microsling/content/blogs/main/openworld.html">at the OpenWorld Forum in Paris</a> about the Apache Software Foundation. It is an ASF primer - apparently the ASF and its ways of working are relatively unknown in France.
</p>
<p>
 
</p></div>
    </summary>
    <updated>2009-10-28T00:00:01Z</updated>
    <category term="apache"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-12T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/authorcentric.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/authorcentric.html" rel="alternate" type="text/html"/>
    <title>Author-centric feature scoping and integration</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"> <br/>
<div class="blockquote">
<p>
Won't somebody please  think of the <strike>children</strike> authors?<br/>
(almost <a href="http://www.youtube.com/watch?v=Qh2sWSVRrmo">Helen Lovejoy</a>)
</p>
</div>

<p>
Have you seen the component for multi-variate testing (MVT, aka <a href="http://en.wikipedia.org/wiki/A/B_testing">A/B testing</a>) in the upcoming CQ5.3 release? I saw it demoed by <a href="http://dev.day.com/microsling/content/blogs/main.html?poster=David%20Nuescheler">David</a> at <a href="http://www.day.com/summit">Ignite</a> and was completely blown away: CMS users (authors) can simply drag a couple of alternative banners onto the component right from within their regular editing interface (the CMS will then show the different versions to different users and count the click-through rates so that eventually the best performing banner is determined).
</p><p>
The MVT feature reminded me of two other CQ5 features: personalisation and analytics. All three are truly and seamlessly integrated into the user interface of the authors and they all provide <em>less</em> functionality than full-blown standalone solutions. To give you a concrete example: for each page the editors see right in the site admin (i.e. in their daily user interface) how many views each page got in the last 30 days. Clearly, this is no match for the kinds of reports you get on, say, <a href="http://dev.day.com/microsling/content/blogs/www.google.com/analytics/">Google Analytics</a>, not even the same ballpark. Yet, I still think the authors get something that is valuable for them: they see it right away what is of interest to their audience.
</p>

<p>
<img src="http://dev.day.com/microsling/content/blogs/main/authorcentric/docroot/ana.png" style="float: left; margin-right: 20px; margin-bottom: 10px;"/>
</p>

<p>
(there is <a href="http://www.day.com/day/en/registration/discover.html">screencast available that demonstrates personalisation features from an author's perspective</a>, registration needed)
</p><p>
When I compare this author-centric evaluation of functionality with my usual point of view as a system architect the business value of a feature for an author might be determined by: 
</p><p/><ul>
<li><p>ease of use rather than feature richness and</p></li>
<li><p>seamless integration into the UI</p></li>
</ul><p/><p>
This is probably true for most systems that have non-technical users, but I believe the effect is amplified in CMSs because many CMS users use the system only once in a while rather than regularly.
</p><p>
Of course, this author-centric view on features should not necessarily dictate the underlaying systems architecture especially when you look at a complete content management solution encompassing analytics, personalization etc. The architecture might still be full-stack or best-of-breed and I do not want to postulate one being better than the other. However, I believe that one way of knowing that you got the author's user experience <em>right</em> is when you cannot see the system architecture reflected in the UI anymore. Or to put it the other way round: the UI should not enable you to guess which box which feature is running on.(*)
</p><p>
Thanks to <a href="http://dev.day.com/microsling/content/blogs/main.html?poster=Lars%20Trieloff">Lars</a> for providing discussions and ideas on this post.
</p><p>
(*) This idea is adjacent to a pet subject of mine: the user interface for basic content management (CRUD stuff) should not enable you to guess the underlying content/data schema. Sadly, up to today not few CMSs UIs resemble ERP-style data entry masks.
</p></div>
    </summary>
    <updated>2009-10-28T00:00:01Z</updated>
    <category term="cms"/>
    <category term="cq5"/>
    <category term="ignite"/>
    <category term="ab testing"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-13T00:00:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://bdelacretaz.wordpress.com/?p=1304</id>
    <link href="http://grep.codeconsult.ch/2009/10/27/how-well-does-the-french-speaking-world-know-the-apache-software-foundation/" rel="alternate" type="text/html"/>
    <title>How well does the french-speaking world know the Apache Software Foundation?</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I was at OpenWorldForum in Paris a few weeks ago, together with fellow Apache members Sander Striker and Emmanuel Lécharny. My first impressions (apart from the fact that Paris is always nice – I knew that already) were that the French tend to wear suits and say “vous” (polite form of “you”) instead of “tu” [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1304&amp;subd=bdelacretaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://www.tivipro.tv/chaine_salons.php?id=1804472&amp;id_salon=374&amp;pageIndex=3"><img align="right" alt="emmanuel-tivipro.jpg" border="0" height="152" src="http://bdelacretaz.files.wordpress.com/2009/10/emmanuel-tivipro.jpg?w=200&amp;h=152" width="200"/></a></p>
<p>I was at <a href="http://openworldforum.org">OpenWorldForum</a> in Paris a few weeks ago, together with fellow <a href="http://apache.org">Apache</a> members Sander Striker and Emmanuel Lécharny.</p>
<p>My first impressions (apart from the fact that Paris is always nice – I knew that already) were that the French tend to wear suits and say “vous” (polite form of “you”) instead of “tu” (the familiar form) which I would tend to use in geeky circles. Cultural differences…</p>
<p>But more seriously, how well does the french-speaking world know the Apache Software Foundation? Not well, it seems to me. In most of our discussions people could associate the ASF with the <a href="http://httpd.apache.org">Apache HTTP Server</a> project, but not much more. 2’000 committers? 300 members? Really?</p>
<p><a href="http://www.tivipro.tv/chaine_salons.php?id=1804473&amp;id_salon=374&amp;pageIndex=1"><img align="right" alt="bertrand-tivipro.jpg" border="0" height="151" src="http://bdelacretaz.files.wordpress.com/2009/10/bertrand-tivipro.jpg?w=200&amp;h=151" width="200"/></a>To help improve this, I hope that the ASF can take a more active role in the conference next year, I’ll bring this up next week at <a href="http://us.apachecon.com/c/acus2009/">ApacheCon</a> with our conference people.</p>
<p>In the meantime french-speaking folks are welcome to learn a bit more about it thanks to TiViPRO’s interviews of <a href="http://www.tivipro.tv/chaine_salons.php?id=1804472&amp;id_salon=374&amp;pageIndex=3">Emmanuel</a> and <a href="http://www.tivipro.tv/chaine_salons.php?id=1804473&amp;id_salon=374&amp;pageIndex=1">myself</a>, shot during the conference.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/bdelacretaz.wordpress.com/1304/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/bdelacretaz.wordpress.com/1304/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/bdelacretaz.wordpress.com/1304/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/bdelacretaz.wordpress.com/1304/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/bdelacretaz.wordpress.com/1304/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/bdelacretaz.wordpress.com/1304/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/bdelacretaz.wordpress.com/1304/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/bdelacretaz.wordpress.com/1304/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/bdelacretaz.wordpress.com/1304/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/bdelacretaz.wordpress.com/1304/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=grep.codeconsult.ch&amp;blog=2844102&amp;post=1304&amp;subd=bdelacretaz&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2009-10-27T10:03:32Z</updated>
    <category term="asf"/>
    <author>
      <name>bdelacretaz</name>
    </author>
    <source>
      <id>http://grep.codeconsult.ch</id>
      <logo>http://www.gravatar.com/blavatar/e6e901bd190e100a6787d0252d1f244f?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://grep.codeconsult.ch/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://grep.codeconsult.ch" rel="alternate" type="text/html"/>
      <link href="http://grep.codeconsult.ch/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://grep.codeconsult.ch/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>cat /dev/brain | egrep -i 'tech|thoughts|noise'</subtitle>
      <title>bertrand's brain grep</title>
      <updated>2010-07-16T10:30:03Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=246</id>
    <link href="http://jukkaz.wordpress.com/2009/10/27/nosql-interests/" rel="alternate" type="text/html"/>
    <title>NoSQL interests</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">We’re organizing a NoSQL meetup in Oakland on Monday next week. In addition to helping set the meetup agenda, the “Topics you are interested in” question in the sign up form provides some interesting insight on the current interests of the NoSQL community. Here’s a quick breakdown of the key terms distilled from the 88 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=246&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://www.nosqloakland.org/"><img alt="NoSQL Oakland" class="alignright size-full wp-image-247" height="44" src="http://jukkaz.files.wordpress.com/2009/10/nosqloakland-small.png?w=203&amp;h=44" title="NoSQL Oakland" width="203"/></a>We’re organizing a <a href="http://www.nosqloakland.org/">NoSQL meetup in Oakland</a> on Monday next week. In addition to helping set the meetup agenda, the “Topics you are interested in” question in the <a href="http://spreadsheets.google.com/viewform?formkey=dENwRmlTMlhGZ3lfclJqYW9hVGlkTHc6MA">sign up form</a> provides some interesting insight on the current interests of the NoSQL community. Here’s a quick breakdown of the key terms distilled from the 88 signups we’ve received so far.</p>
<p>Note that the data is biased towards Apache projects due to the meetup being organized at <a href="http://us.apachecon.com/c/acus2009/">ApacheCon US 2009</a>.</p>
<h4 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">Projects</h4>
<p>The following open source projects were mentioned. The list is in alphabetical order, as the data set is too small to make any reasonable ordering by popularity.</p>
<ul>
<li><a href="http://incubator.apache.org/cassandra/">Cassandra</a></li>
<li><a href="http://couchdb.apache.org/">CouchDB</a></li>
<li><a href="http://hadoop.apache.org/">Hadoop</a></li>
<li><a href="http://hadoop.apache.org/hbase/">HBase</a></li>
<li><a href="http://hadoop.apache.org/hdfs/">HDFS</a></li>
<li><a href="http://jackrabbit.apache.org/">Jackrabbit</a></li>
<li><a href="http://lucene.apache.org/">Lucene</a></li>
<li><a href="http://lucene.apache.org/mahout/"> Mahout</a></li>
<li><a href="http://www.danga.com/memcached/">memcached</a></li>
<li><a href="http://www.mongodb.org/">MongoDB</a></li>
<li><a href="http://code.google.com/p/redis/">Redis</a></li>
<li><a href="http://riak.basho.com/">Riak</a></li>
<li><a href="http://code.google.com/p/scalaris/">Scalaris</a></li>
<li><a href="http://sling.apache.org/">Sling</a></li>
<li><a href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a></li>
<li><a href="http://project-voldemort.com/">Voldemort</a></li>
</ul>
<h4 xmlns:atom="http://www.w3.org/2005/Atom" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml">Topics</h4>
<p>Many responses were about the “big data” aspect of the NoSQL movement. Some frequent keywords: distributed storage, large transactional data, consistency, failover, availability, reliability, stability, failure detection, failed node replacement, (petabyte) scalability, consistency levels, storage technology, performance, benchmarks, optimization, backup and recovery, map/reduce</p>
<p>Another common theme were the various database types and the NoSQL “development model”. Keywods: document stores, key/value stores, consistent hashing, graph databases, object databases, persistent queues, content modeling, migration from the relational model, social graphs, streaming, software as a service, offline applications, full text search, natural language processing</p>
<p>Beyond the above big themes, I found it interesting that the following technologies were specifically named: Erlang, Java, WebSimpleDB, WebDAV</p>
<p>In addition to specific topics, many people were asking for case studies or “lessons learned” -type presentations.</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/246/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/246/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/246/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/246/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/246/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/246/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/246/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/246/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/246/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/246/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=246&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2009-10-27T10:01:12Z</updated>
    <category term="General"/>
    <category term="apachecon"/>
    <category term="meetup"/>
    <category term="nosql"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://www.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-04-20T21:30:11Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-31254910.post-5464712224369365710</id>
    <link href="http://michaelmarth.blogspot.com/feeds/5464712224369365710/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="https://www.blogger.com/comment.g?blogID=31254910&amp;postID=5464712224369365710" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/5464712224369365710?v=2" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/5464712224369365710?v=2" rel="self" type="application/atom+xml"/>
    <link href="http://feedproxy.google.com/~r/CoffeeGems/~3/e_11CArD4Ak/colayers-approach-to-collaboration.html" rel="alternate" type="text/html"/>
    <title>Colayer's approach to collaboration software</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Chances are you have not heard of <a href="http://colayer.com/">Colayer</a>, 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.<br/><br/>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 <span style="font-style: italic;">sems </span>in Colayer parlance) just like the forum entries or other texts. Through this mechanism, all communication around one topic stays on one page and <span style="font-weight: bold;">in the same context</span>.<br/><br/>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.<br/><br/>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).<br/><br/><a href="http://1.bp.blogspot.com/_UDN4j-Aji_4/St6yxCgUPwI/AAAAAAAA83g/eUNu84zFTxo/s1600-h/colayer-screen-ColayerScreen.jpg" title="200 -- OK"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5394945959192182530" src="http://1.bp.blogspot.com/_UDN4j-Aji_4/St6yxCgUPwI/AAAAAAAA83g/eUNu84zFTxo/s320/colayer-screen-ColayerScreen.jpg" style="cursor: pointer; width: 320px; height: 240px;"/></a><br/><br/>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.<br/><br/><a href="http://3.bp.blogspot.com/_UDN4j-Aji_4/St6y9SdtmNI/AAAAAAAA83o/eeVGo8KR0PI/s1600-h/colayer-screen-OverviewPage.jpg" title="200 -- OK"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5394946169634658514" src="http://3.bp.blogspot.com/_UDN4j-Aji_4/St6y9SdtmNI/AAAAAAAA83o/eeVGo8KR0PI/s320/colayer-screen-OverviewPage.jpg" style="cursor: pointer; width: 269px; height: 320px;"/></a><br/><br/>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?<br/><br/>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.<div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/31254910-5464712224369365710?l=michaelmarth.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2009-10-24T14:23:21Z</updated>
    <published>2009-10-18T17:59:00Z</published><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://michaelmarth.blogspot.com/2009/10/colayers-approach-to-collaboration.html</feedburner:origlink>
    <author>
      <name>Michael Marth</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/03925861261744910154</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-31254910</id>
      <author>
        <name>Michael Marth</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/03925861261744910154</uri>
      </author>
      <link href="http://michaelmarth.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://michaelmarth.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/31254910/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/CoffeeGems" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>About software development</subtitle>
      <title>Coffee &amp; Gems</title>
      <updated>2010-08-18T21:52:44Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/ignitezurich.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/ignitezurich.html" rel="alternate" type="text/html"/>
    <title>Ignite Zurich</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
<a href="http://www.day.com/summit">Ignite in Zurich</a> was a blast. Lots of good presentations (which I will hopefully be able to share later) and excellent discussions on content management. My favourite quote was from Newsweek's <a href="http://www.day.com/summit/zuerich/agenda.html">Meshach Jackson</a>. Their editors on the CMS selection process:
</p><div class="blockquote"><p>
If you don't select CQ we're all quitting.
</p></div><p/><p>
I also enjoyed what <a href="http://dev.day.com/microsling/content/blogs/main.html?poster=David%20Nuescheler">David Nuescheler</a> had to say about separation of content and layout. The standard CMS architecture thinking goes like this<br/>
a) we need to separate content and layout<br/>
b) therefore, the user interface for the authors cannot look anything like the rendered pages and we will make it look like a database entry mask
</p><p>
David demonstrated that a) simply does not lead to b). Or in his own words:
</p><div class="blockquote"><p>
Separating content and layout does not mean you have to confuse the authors
</p></div><p/><p>
To get a taste of the event: The conference <a href="http://search.twitter.com/search?q=%23dayignite">hashtag was #dayignite</a> and here are some Ignite pictures on Flickr:
</p><p>
   
</p>

<p>
So, in case you missed Ignite Zurich there is still Ignite Chicago coming up...
</p></div>
    </summary>
    <updated>2009-10-19T00:00:01Z</updated>
    <category term="cms"/>
    <category term="cq"/>
    <category term="ignite"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-11T00:00:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=239</id>
    <link href="http://jukkaz.wordpress.com/2009/10/16/putting-poi-on-a-diet/" rel="alternate" type="text/html"/>
    <title>Putting POI on a diet</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The Apache POI team is doing an amazing job at making Microsoft Office file formats more accessible to the open source Java world. One of the projects that benefits from their work is Apache Tika that uses POI to extract text content and metadata from all sorts of Office documents.

However, there’s one problem with POI [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=239&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The <a href="http://poi.apache.org/">Apache POI</a> team is doing an amazing job at making <a href="http://office.microsoft.com/">Microsoft Office</a> file formats more accessible to the open source Java world. One of the projects that benefits from their work is <a href="http://lucene.apache.org/tika/">Apache Tika</a> that uses POI to extract text content and metadata from all sorts of Office documents.</p>
<p><a href="http://poi.apache.org/"><img alt="Apache POI" class="aligncenter size-full wp-image-240" height="126" src="http://jukkaz.files.wordpress.com/2009/10/poi.jpg?w=138&amp;h=126" title="Apache POI" width="138"/></a></p>
<p>However, there’s one problem with POI that I’d like to see fixed: It’s too big.</p>
<p>More specifically, the <a href="http://www.jarvana.com/jarvana/archive-details/org/apache/poi/ooxml-schemas/1.0/ooxml-schemas-1.0.jar">ooxml-schemas jar</a> used by POI for the pre-generated <a href="http://xmlbeans.apache.org/" title="Apache XMLBeans">XMLBeans</a> bindings for the <a href="http://www.ecma-international.org/publications/standards/Ecma-376.htm" title="ECMA-376: Office Open XML File Formats">Office Open XML</a> schemas is taking up over 50% of the 25MB size of the current Tika application. The pie chart below illustrates the relative sizes of the different parser library dependencies of Tika:</p>
<p><img alt="Relative sizes of Tika parser dependencies" class="aligncenter size-full wp-image-241" height="200" src="http://jukkaz.files.wordpress.com/2009/10/tika-pie.png?w=500&amp;h=200" title="Relative sizes of Tika parser dependencies" width="500"/></p>
<p>Both PDF and the Microsoft Office formats are pretty big and complex, so one can expect the relevant parser libraries to be large. But the 14MB size of the ooxml-schemas jar seems excessive, especially since the standard OOXML schema package from which the ooxml-schemas jar is built is only 220KB in size.</p>
<p>Does anyone have good ideas on how to best trim down this OOXML dependency?</p>
<br/>  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/239/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/239/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/239/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/239/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/239/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/239/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/239/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/239/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/239/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/239/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=239&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </content>
    <updated>2009-10-16T22:39:21Z</updated>
    <category term="General"/>
    <category term="apache"/>
    <category term="ooxml"/>
    <category term="poi"/>
    <category term="tika"/>
    <category term="xmlbeans"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://www.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://jukkaz.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-03-30T00:00:10Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/slinguserslist.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/slinguserslist.html" rel="alternate" type="text/html"/>
    <title>[ANN] Sling Users List now available</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
<a href="http://sling.apache.org">Apache Sling</a> keeps on growing up. Today's step: <a href="http://dev.day.com/discussion-groups/content/lists.go/ofqhoicj">Felix Meschberger announced</a> a users mailing list (before there was only one mailing list for developers and users).
The new list is also available in the <a href="http://dev.day.com/discussion-groups/content/lists.html">Discussion Groups section of dev.day.com</a>.
</p>

<p>
If you use Sling please consider adding your project to the Sling users 
<a href="http://cwiki.apache.org/confluence/pages/viewpage.action?pageId=2852421">wiki page</a>.
</p></div>
    </summary>
    <updated>2009-10-07T00:00:01Z</updated>
    <category term="announcements"/>
    <category term="sling"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-09T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/restfuldaydream.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/restfuldaydream.html" rel="alternate" type="text/html"/>
    <title>Re: RESTful daydream #4</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
<a href="http://blog.technologyofcontent.com/justincormack/">Justin Cormack</a> has written a noteable blog post titled <a href="http://blog.technologyofcontent.com/2009/10/restful-daydream-4/">"RESTful daydream #4</a>" (pun intended?) about RESTful content repositories. I disagree with some of what Justin writes about JCR and <a href="http://sling.apache.org/">Sling</a>. However, I completely share his vision about REST's role in content management and I am with him regarding the overall theme of his post.
</p><p>
Essentially, Justin asks for a "web content repository":
</p>
<div class="blockquote">
<p>
The odd thing is that a web content repository alone surely lends itself to a simple REST architecture. Content is after all lots of small resources with relations. [...] It takes content, relates it to other content, and serves it back, with authentication and versioning. Everything else is in other system layers, transforming it and so on. Not simple, but well defined; lower level than JCR + Sling say.
</p></div><p>
Apache Sling provides a RESTful interface onto content, but being a web application framework it provides much more, especially scripting. So I can understand well why Justin dismisses Sling as being too powerful. However, I believe that Jackrabbit's native http layer is pretty much on the mark (Justin also dismisses it <a href="http://blog.technologyofcontent.com/2009/10/restful-daydream-4/#comment-1739">in the comments</a> as being not RESTful. I do not know why.). As far as I know the <a href="http://dev.day.com/microsling/content/blogs/main/jrnativehttp.html">Jackrabbit http remoting layer</a> is quite work-in-progress so one might argue about the details regarding its RESTfulness, but overall it fits what I understand to be a RESTful web content repository.
</p><p>
There is one aspect regarding a <em>web</em> content repository I would like to add to the discussion: I think it is crucial that the representations of resources and be consumed by browsers. HTML forms for writing and presenting resources in JSON should be part of the equation. Adding models or semantics on top of that <strike>will</strike> might do more harm than good.
</p><p>
Do we need a formal standard for web content repositories? From my perspective: not yet. At the moment we still need to learn more, i.e. more repository implementations and users that have built a CMS on top of a web content repository.</p></div>
    </summary>
    <updated>2009-10-07T00:00:01Z</updated>
    <category term="rest"/>
    <category term="cmis"/>
    <category term="jcr"/>
    <category term="sling"/>
    <category term="atom"/>
    <category term="jackrabbit"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-09T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-31254910.post-2729812611935132778</id>
    <link href="http://michaelmarth.blogspot.com/feeds/2729812611935132778/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="https://www.blogger.com/comment.g?blogID=31254910&amp;postID=2729812611935132778" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/2729812611935132778?v=2" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/2729812611935132778?v=2" rel="self" type="application/atom+xml"/>
    <link href="http://feedproxy.google.com/~r/CoffeeGems/~3/qZKGJdQ16Uc/found-out-about-flexeventupdatecomplete.html" rel="alternate" type="text/html"/>
    <title>Found out about FlexEvent.UPDATE_COMPLETE</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Here is a small bit about the asynchronous nature of the Flex layout mechanisms that I learned while slapping together a presales demo yesterday:<br/>
<br/>
When changing properties of <a href="http://livedocs.adobe.com/flex/3/langref/mx/core/UIComponent.html">UIComponents</a> listen for <a href="http://livedocs.adobe.com/flex/3/langref/mx/events/FlexEvent.html#UPDATE_COMPLETE">FlexEvent.UPDATE_COMPLETE</a> events. They get fired when the change is actually done. In my case I needed to get the textWidth of a <a href="http://livedocs.adobe.com/flex/3/langref/mx/controls/Label.html">Label</a> after changing the label text. Right after calling the setter of text the getter of textWidth will still return the old value.<br/>
<br/>
[Some <a href="http://jonathanbranam.net/flex3anatomy/event/updateComplete">background reading</a>]<div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/31254910-2729812611935132778?l=michaelmarth.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2009-10-01T08:45:03Z</updated>
    <published>2009-10-01T08:45:00Z</published><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://michaelmarth.blogspot.com/2009/10/found-out-about-flexeventupdatecomplete.html</feedburner:origlink>
    <author>
      <name>Michael Marth</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/03925861261744910154</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-31254910</id>
      <author>
        <name>Michael Marth</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/03925861261744910154</uri>
      </author>
      <link href="http://michaelmarth.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://michaelmarth.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/31254910/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/CoffeeGems" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>About software development</subtitle>
      <title>Coffee &amp; Gems</title>
      <updated>2010-08-18T21:52:44Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/lotd20091001.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/lotd20091001.html" rel="alternate" type="text/html"/>
    <title>[LOTD] Why JCR is good for Content Management?</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
eXo's Peter Nedonosko discusses on his blog <a href="http://nedonosko.blogspot.com/2009/09/jcr-based-content-management.html">why JCR is good for content management</a>. I could not agree more with his conclusion: it is useful for cms developers.
</p>

<div class="blockquote"><p>
JCR standard is <em>useful</em> for CMS [...]</p>
</div></div>
    </summary>
    <updated>2009-10-01T00:00:01Z</updated>
    <category term="lotd"/>
    <category term="jcr"/>
    <category term="cms"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-09T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-31254910.post-4217157000138135692</id>
    <link href="http://michaelmarth.blogspot.com/feeds/4217157000138135692/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="https://www.blogger.com/comment.g?blogID=31254910&amp;postID=4217157000138135692" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/4217157000138135692?v=2" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/4217157000138135692?v=2" rel="self" type="application/atom+xml"/>
    <link href="http://feedproxy.google.com/~r/CoffeeGems/~3/7eQdyEQ4FwE/talk-at-java-user-group.html" rel="alternate" type="text/html"/>
    <title>Talk at Java User Group</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">Yesterday, I gave a <a href="http://www.jugs.ch/html/events/2009/rest.html">talk at the Java User Group Switzerland</a> (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:<br/><br/><div id="__ss_2094296" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/mmarth/agile-restful-web-development" 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; display: block; text-decoration: underline;" title="Agile RESTful Web Development">Agile RESTful Web Development</a><div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">documents</a> from <a href="http://www.slideshare.net/mmarth" style="text-decoration: underline;">mmarth</a>.</div></div><div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/31254910-4217157000138135692?l=michaelmarth.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2009-09-30T06:12:27Z</updated>
    <published>2009-09-30T06:07:00Z</published><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://michaelmarth.blogspot.com/2009/09/talk-at-java-user-group.html</feedburner:origlink>
    <author>
      <name>Michael Marth</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/03925861261744910154</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-31254910</id>
      <author>
        <name>Michael Marth</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/03925861261744910154</uri>
      </author>
      <link href="http://michaelmarth.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://michaelmarth.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/31254910/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/CoffeeGems" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>About software development</subtitle>
      <title>Coffee &amp; Gems</title>
      <updated>2010-08-18T21:52:44Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/openworld.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/openworld.html" rel="alternate" type="text/html"/>
    <title>[ANN] Talking at openworldforum in Paris this Friday</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>



I'll be talking at <a href="http://openworldforum.org/">Open World
Forum</a> in Paris later this week, presenting a condensed version of
my <a href="http://www.slideshare.net/bdelacretaz/opensource-collaboration-tools-are-good-for-you-2009-edition">Open
Source Collaboration Tools are Good for You</a> talk, this Friday at
13:40 (and no, the topic is not "Coming Soon" as indicated on the <a href="http://openworldforum.org/programme/Floss%20Vision">program</a>
;-)
</p><p>
Later on Friday afternoon, I'll take part in a forum (in french) on <a href="http://openworldforum.org/program/les-forges-open-source-du-futur">the
future of open source forges</a>. I haven't seen the list of
participants yet, but the topic looks promising.
</p><p>
Sander Striker,  Executive Vice President of the <a href="http://apache.org">Apache Software Foundation</a>, will also be
there for a <a href="http://openworldforum.org/program">roundtable</a>
this Thursday after the 16:30 keynote.
</p><p>
And I'll be staying with fellow Apache member Emmanuel Lecharny -
meeting the locals is always nice, and Emmanuel's a city cyclist as
well, so we'll be able to trade city jungle tricks I guess.
</p><p>
The conference looks quite busy with lots of interesting
presentations, roundtables and workshops.
</p>
<p>
Looking forward to it, and make sure to say bonjour if you're around!
</p>
<p>
<img src="http://dev.day.com/microsling/content/blogs/main/openworld/docroot/owf.jpg" style="float: left; margin-right: 20px; margin-bottom: 10px;"/>
</p></div>
    </summary>
    <updated>2009-09-29T00:00:01Z</updated>
    <category term="announcements"/>
    <category term="open"/>
    <category term="tools"/>
    <author>
      <name>Bertrand Delacretaz</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-05T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/cloudcamp.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/cloudcamp.html" rel="alternate" type="text/html"/>
    <title>Data First in Cloud Persistence</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>My colleague <a href="http://twitter.com/keepthebyte/status/4364686938">Cedric Huesler</a> gave a talk "Data First in Cloud Persistence" at yesterday's <a href="http://www.cloudcamp.com/?page_id=1135">CloudCamp in London</a>. Missed it? You'll have another chance next week at the <a href="http://www.cloudcamp-frankfurt.de/">Frankfurt CloudCamp</a>. Meanwhile, here's the slide deck (I <em>love</em> the second slide):
</p>
<div id="__ss_2064686" style="width: 425px; text-align: left;"><a href="http://www.slideshare.net/keepthebyte/data-first-in-cloud-persistance" style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="Data First in Cloud Persistance">Data First in Cloud Persistence</a></div>
<br/><br/></div>
    </summary>
    <updated>2009-09-25T00:00:01Z</updated>
    <category term="data first"/>
    <category term="jcr"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-04T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/ignite092.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/ignite092.html" rel="alternate" type="text/html"/>
    <title>3 weeks to go - next CQ5 at Customer Summit</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div>
<a href="http://www.day.com/summit">
<img src="http://dev.day.com/microsling/content/blogs/main/ignite092/docroot/ignite_logo2.jpg" style="float: left; margin-right: 100px; margin-left: 80px; margin-bottom: 20px;"/>
</a>
</div>
<p>
In 3 weeks from today we are going to kick-off our annual <a href="http://www.day.com/summit">Customer Summit</a> in Zurich (and two weeks later in Chicago). Going through the office in Basel feels like everybody is busy making sure the events are going to be awesome.
</p><p>
The engineering team is putting the final touch on what has been in the making for multiple years - yes - I'm talking about JCR 2.0. It is exciting to witness the implementation of the next generation content infrastructure API and see what it does for  the user facing content applications. The next version of our WCM, DAM and Social Collaboration platform CQ5 - to be unveiled at the Customer Summits - is taking full advantage of <a href="http://jcp.org/en/jsr/detail?id=283">JCR 2.0 (JSR-283)</a>. This for sure is great news for developers. They get an extended rock solid API to build content applications and integration services.
</p><p>
Another mission - with focus to reduce the distance between the author and the consumer (visitor) - resulted in a slew of new CQ5 features. We want content authors to have a better insight on how their content is consumed and provide feedback what worked and what not. With this, we are closing an important loop in providing targeted content to an apparently unknown audience.
</p><p>
If that is not enough, I'm sure you are interested to learn how the City of Chicago, Adobe, New York University (in Chicago), Telecom Italia, Boehringer Ingelheim and Investec (in Zurich) are using the Day products. That's only an excerpt of companies and partners that will participate - we are finalizing the agenda this week and will make it available starting next week.
</p><p>
For all of you already signed-up for the Summit - we are looking forward to share with you the latest awesomeness in Zurich or Chicago. If you haven't - <a href="http://www.day.com/summit">it's not too late</a>.
</p></div>
    </summary>
    <updated>2009-09-24T00:00:01Z</updated>
    <category term="jsr283"/>
    <category term="announcements"/>
    <category term="cq5"/>
    <author>
      <name>Cedric Huesler</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-11-02T00:00:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=235</id>
    <link href="http://jukkaz.wordpress.com/2009/09/23/some-graphics-work-for-a-change/" rel="alternate" type="text/html"/>
    <title>Some graphics work for a change</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I’ve recently spent some effort in improving the look of the Apache Jackrabbit website. I’m no designer, so the results aren’t that great, but it’s been a nice break from the regular project work. And I got to brush up my Photoshop and Gimp skills.
One part of the effort was creating an icon for the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=235&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div class="snap_preview"><br/><p>I’ve recently spent <a href="https://issues.apache.org/jira/browse/JCRSITE-20" title="JCRSITE-20: Site readability improvements">some</a> <a href="http://twitter.com/jukkaz/status/3243226733" title="fancy download button">effort</a> in improving the look of the <a href="http://jackrabbit.apache.org/">Apache Jackrabbit</a> website. I’m no designer, so the results aren’t that great, but it’s been a nice break from the regular project work. And I got to brush up my <a href="http://www.adobe.com/products/photoshop/photoshop/" title="Adobe Photoshop">Photoshop</a> and <a href="http://www.gimp.org/" title="The GNU Image Manipulation Program">Gimp</a> skills.</p>
<p>One part of the effort was <a href="https://issues.apache.org/jira/browse/JCRSITE-24" title="JCRSITE-24: Jackrabbit favicon">creating an icon</a> for the site. Previously the site used the feather icon used as the default on all Apache project sites, but I wanted a Jackrabbit-specific icon that helps me to quickly identify and access Jackrabbit pages among the numerous tabs I usually have open in my browser. The work is a good example of incremental improvements in action:</p>
<p><img alt="Jackrabbit icon steps" class="aligncenter size-full wp-image-236" height="218" src="http://jukkaz.files.wordpress.com/2009/09/jackrabbit-icon-work.png?w=372&amp;h=218" title="Jackrabbit icon steps" width="372"/></p>
<p>I started with a copy of the Jackrabbit logo with nice alpha-layered transparent background. It looked great until I noticed that some browsers lost the smooth alpha layer and instead resulted in a rather badly aliased icon seen above.</p>
<p>The straightforward solution was to add a white background as can be seen in step 2. That worked already pretty well in all browsers.</p>
<p>After a few days of watching the icon I found it a bit too blocky to my taste, so I tried to restore some of the nice transparency effect by rounding the corners a bit. I’m pretty happy with the result.</p>
<p>Of course, if you have design talent and think you can do better, go for it!</p>
  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/235/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/235/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/235/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/235/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/235/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/235/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/235/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/235/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/235/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/235/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=235&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div></div>
    </content>
    <updated>2009-09-23T17:11:59Z</updated>
    <category term="Jackrabbit"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://www.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s.wordpress.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-01-29T23:00:13Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=231</id>
    <link href="http://jukkaz.wordpress.com/2009/09/19/release-time/" rel="alternate" type="text/html"/>
    <title>Release time</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">There’s lots of upcoming release activity at the Apache projects I’m more or less involved with:

The incubating Apache PDFBox project is just about to release the eagerly anticipated 0.8.0 release. I’m expecting to see the release announcement on Tuesday next week. PDFBox is a Java library for working with PDF documents.
Another incubating project, Apache UIMA, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=231&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div class="snap_preview"><br/><p>There’s lots of upcoming release activity at the Apache projects I’m more or less involved with:</p>
<ul>
<li><a href="http://incubator.apache.org/pdfbox/"><img alt="" class="alignright" height="64" src="https://s3.amazonaws.com/bits.ohloh.net/attachments/5981/logo_med.png" title="Apache PDFBox" width="64"/></a>The incubating <a href="http://incubator.apache.org/pdfbox/">Apache PDFBox</a> project is just about to release the <a href="http://jukkaz.wordpress.com/2009/01/23/apache-pdfbox-status-update/" title="Apache PDFBox status update">eagerly anticipated</a> 0.8.0 release. I’m expecting to see the release announcement on Tuesday next week. PDFBox is a Java library for working with PDF documents.</li>
<li><a href="http://incubator.apache.org/uima/"><img alt="" class="alignright" height="64" src="https://s3.amazonaws.com/bits.ohloh.net/attachments/23695/uima-icon_med.png" title="Apache UIMA" width="64"/></a>Another incubating project, <a href="http://incubator.apache.org/uima/">Apache UIMA</a>, is <a href="http://markmail.org/message/p3463oyvgohknxev" title="Marshall Schor: Making good progress to 2.3.0 release, next checkpoint at close of next week">working towards</a> the 2.3.0 release. I’m looking forward to seeing both UIMA and PDFBox graduating from the <a href="http://incubator.apache.org/">Apache Incubator</a> shortly after the respective releases. UIMA is a framework and a set of components for analyzing large volumes of unstructured information.</li>
<li><a href="http://sling.apache.org/"><img alt="" class="alignright" height="64" src="https://s3.amazonaws.com/bits.ohloh.net/attachments/8717/sling_med.png" title="Apache Sling" width="64"/></a>The <a href="http://sling.apache.org/">Apache Sling</a> project is a component-based project like <a href="http://felix.apache.org/">Apache Felix</a>, so there is no clear project-wide release cycle.  Instead Sling is about to start releasing new versions of most of the components changed since the all-inclusive incubator releases. Sling is a JCR-based web framework.</li>
<li><a href="http://lucene.apache.org/tika/"><img alt="" class="alignright" height="64" src="https://s3.amazonaws.com/bits.ohloh.net/attachments/8697/tikaNoText_med.png" title="Apache Tika" width="64"/></a><a href="http://lucene.apache.org/tika/">Apache Tika</a> uses PDFBox for extracting text content from PDF documents. I’m hoping to see a Tika 0.5 release soon with the latest PDFBox dependency and the <a href="https://issues.apache.org/jira/browse/TIKA-275" title="TIKA-275: Parse context">design improvements</a> I’ve been working on. Tika is a toolkit for extracting text and metadata from all kinds of documents.</li>
<li><a href="http://lucene.apache.org/solr/"><img alt="" class="alignright" height="35" src="https://s3.amazonaws.com/bits.ohloh.net/attachments/13297/solr_FC_med.jpg" title="Apache Solr" width="64"/></a><a href="http://lucene.apache.org/solr/">Apache Solr</a> is about to enter <a href="http://markmail.org/message/6mb442fxjtq3dt6m" title="Yonik Seeley: solr 1.4 release schedule">code freeze</a> in preparation for the 1.4 release that will include the “<a href="http://wiki.apache.org/solr/ExtractingRequestHandler" title="ExtractingRequestHandler">Solar Cell</a>” feature based on Tika. Solr is a search server based on Lucene.</li>
<li>The <a href="http://commons.apache.org/io/">Commons IO</a> project has been upgraded to use Java 5 features and I’m starting to <a href="http://markmail.org/message/poqipa3yisit53wt" title="Jukka Zitting: [io] Towards the 2.0 release">push it</a> towards a 2.0 release. Commons IO is a library of Java IO utilities.</li>
<li><a href="http://lucene.apache.org/java/"><img alt="" class="alignright" height="64" src="https://s3.amazonaws.com/bits.ohloh.net/attachments/23787/lucene_med.png" title="Lucene Java" width="64"/></a><a href="http://lucene.apache.org/java/">Lucene Java</a> is <a href="http://markmail.org/message/5vez3yxwhznxaylv" title="Yonik Seeley: Re: Lucene 2.9 RC4 now available for testing">gearing up</a> for the 2.9 release, and will soon <a href="http://markmail.org/message/3v7aj5yhizggoikm" title="DM Smith: Lucene 3.0 and Java 5 (was Re: Finishing Lucene 2.9)">follow up</a> with the 3.0 release. The<a href="https://issues.apache.org/jira/browse/LUCENE-1470" title="LUCENE-1470: Add TrieRangeFilter to contrib"> trie range</a> feature is an especially welcome addition for many use cases. Lucene is a feature-rich high performance search engine.</li>
<li><a href="http://jackrabbit.apache.org/"><img alt="" class="alignright" height="64" src="https://s3.amazonaws.com/bits.ohloh.net/attachments/2233/jlogo64_med.png" title="Apache Jackrabbit" width="64"/></a>And last but not least, <a href="http://jackrabbit.apache.org/">Apache Jackrabbit</a> is <a href="http://markmail.org/message/ced7d6kgdnos6atw" title="Jukka Zitting: Re: Jackrabbit 2.0 release plan">getting ready</a> to release the 2.0 version based on the <a href="http://jcp.org/en/jsr/results?id=4979" title="JSR 283 Final Approval Ballot">recently approved</a> JCR 2.0 standard. Jackrabbit is a feature-complete JCR content repository implementation.</li>
</ul>
<p>I’m hoping to see most of these releases happening in time for the <a href="http://us.apachecon.com/c/acus2009/">ApacheCon US 2009</a> conference in early November.</p>
  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/231/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/231/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/231/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/231/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/231/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/231/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/231/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/231/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/231/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/231/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=231&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div></div>
    </content>
    <updated>2009-09-19T11:02:43Z</updated>
    <category term="ASF"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://www.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s.wordpress.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://jukkaz.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2010-01-14T17:00:14Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/jsr283fab2.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/jsr283fab2.html" rel="alternate" type="text/html"/>
    <title>JSR-283 builds on JSR-170</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div>
	And of course, JSR-283 builds on the work done in JSR-170:
</div>
<div>
	<p>
		 
	</p>
	<table width="440">
		<tbody><tr>
			<td class="num">
				734
			</td>
			<td class="text">
				<span class="unit">issues</span>
			</td>
		</tr>
		<tr>
			<td class="num170">
				 662
			</td>
			<td class="text">
				issues in JSR 170. 
			</td><td>
		</td></tr>
		<tr>
			<td class="num">
				1456
			</td>
			<td class="text">
				<span class="unit">days</span>
			</td>
		</tr>
		<tr>
			<td class="num170">
				 1213
			</td>
			<td class="text">
				days from start to finish of JSR 170.
			</td><td>
		</td></tr>
		<tr>
			<td class="num">
				72
			</td>
			<td class="text">
				<span class="unit">individual members</span> of the expert group
			</td>
		</tr>
		<tr>
			<td class="num170">
				 1/2
			</td>
			<td class="text">
				as many members in the 170 expert group.
			</td><td>
		</td></tr>
		<tr>
			<td class="num">
				43
			</td>
			<td class="text">
				<span class="unit">organizations</span> represented
			</td>
		</tr>
		<tr>
			<td class="num170">
				 1/2
			</td>
			<td class="text">
				as many organizations represented.
			</td><td>
		</td></tr>
		<tr>
			<td class="num">
				277
			</td>
			<td class="text">
				<span class="unit">pages of spec</span>
			</td>
		</tr>
		<tr>
			<td class="num170">
				 297
			</td>
			<td class="text">
				pages in 170. Yet 283 contains so much more! :-)
			</td><td>
		</td></tr>
		<tr>
			<td class="num">
				87
			</td>
			<td class="text">
				<span class="unit">interfaces and classes</span>
			</td>
		</tr>
		<tr>
			<td class="num170">
				 59
			</td>
			<td class="text">
				interfaces and classes in 170.
			</td><td>
		</td></tr>
		<tr>
			<td class="num">
				522
			</td>
			<td class="text">
				<span class="unit">fields and methods</span>
			</td>
		</tr>
		<tr>
			<td class="num170">
				 334
			</td>
			<td class="text">
				fields and methods in 170.
			</td><td>
	</td></tr></tbody></table>
</div>
<br/><br/></div>
    </summary>
    <updated>2009-09-18T00:00:01Z</updated>
    <category term="jsr283"/>
    <category term="jcr"/>
    <category term="standards"/>
    <category term="jackrabbit"/>
    <author>
      <name>Peeter Piegaze</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-10-28T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>tag:blogger.com,1999:blog-31254910.post-2476553882635765085</id>
    <link href="http://michaelmarth.blogspot.com/feeds/2476553882635765085/comments/default" rel="replies" type="application/atom+xml"/>
    <link href="https://www.blogger.com/comment.g?blogID=31254910&amp;postID=2476553882635765085" rel="replies" type="text/html"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/2476553882635765085?v=2" rel="edit" type="application/atom+xml"/>
    <link href="http://www.blogger.com/feeds/31254910/posts/default/2476553882635765085?v=2" rel="self" type="application/atom+xml"/>
    <link href="http://feedproxy.google.com/~r/CoffeeGems/~3/39TgASnqLjc/ruby-script-for-generating-google.html" rel="alternate" type="text/html"/>
    <title>Ruby script for generating Google sitemaps</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">I just wrote a small Ruby script to generate a <a href="https://www.google.com/webmasters/tools/sitemap-list?hl=de&amp;siteUrl=http%3A%2F%2Fdev.day.com%2F">Google sitemap</a> 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)<br/><br/>require 'builder'<br/>htmlfiles = Dir.glob("*.html")<br/>x = Builder::XmlMarkup.new(:target =&gt; $stdout, :indent =&gt; 1)<br/>x.instruct!<br/>x.urlset( "xmlns" =&gt; "http://www.sitemaps.org/schemas/sitemap/0.9" ) {<br/>for file in htmlfiles do<br/>  x.url{x.loc "http://www.example.com/#{file}"; x.lastmod "2009-09-17"; x.changefreq "monthly"; x.priority "0.8"}<br/>end<br/>}<div class="blogger-post-footer"><img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/31254910-2476553882635765085?l=michaelmarth.blogspot.com" width="1"/></div></div>
    </content>
    <updated>2009-09-17T13:05:15Z</updated>
    <published>2009-09-17T12:43:00Z</published><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://michaelmarth.blogspot.com/2009/09/ruby-script-for-generating-google.html</feedburner:origlink>
    <author>
      <name>Michael Marth</name>
      <email>noreply@blogger.com</email>
      <uri>http://www.blogger.com/profile/03925861261744910154</uri>
    </author>
    <source>
      <id>tag:blogger.com,1999:blog-31254910</id>
      <author>
        <name>Michael Marth</name>
        <email>noreply@blogger.com</email>
        <uri>http://www.blogger.com/profile/03925861261744910154</uri>
      </author>
      <link href="http://michaelmarth.blogspot.com/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/>
      <link href="http://michaelmarth.blogspot.com/" rel="alternate" type="text/html"/>
      <link href="http://www.blogger.com/feeds/31254910/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" rel="next" type="application/atom+xml"/>
      <link href="http://feeds.feedburner.com/CoffeeGems" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>About software development</subtitle>
      <title>Coffee &amp; Gems</title>
      <updated>2010-08-18T21:52:44Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/jsr283fab.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/jsr283fab.html" rel="alternate" type="text/html"/>
    <title>JSR-283 passes its final Test</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div><p> </p>
<table width="440">
<tbody><tr><td class="num">734</td><td class="text"><span class="unit">issues</span></td></tr>
<tr><td class="num">1456</td><td class="text"><span class="unit">days</span></td></tr>
<tr><td class="num">72</td><td class="text"><span class="unit">individual members</span> of the expert group</td></tr>
<tr><td class="num">43</td><td class="text"><span class="unit">organizations</span> represented</td></tr>
<tr><td class="num">3</td><td class="text"><span class="unit">ballots</span> of the executive committee of the JCP</td></tr>
<tr><td class="num">41</td><td class="text"><span class="unit">yes</span> votes</td></tr>
<tr><td class="num">0</td><td class="text"><span class="unit">abstentions</span></td></tr>
<tr><td class="num">0</td><td class="text"><span class="unit">no</span> votes</td></tr>
<tr><td class="num">5</td><td class="text"><span class="unit">face-to-face meetings</span></td></tr>
<tr><td class="num">76</td><td class="text"><span class="unit">telephone conferences</span></td></tr>
<tr><td class="num">277</td><td class="text"><span class="unit">pages of spec</span></td></tr>
<tr><td class="num">87</td><td class="text"><span class="unit">interfaces and classes</span></td></tr>
<tr><td class="num">522</td><td class="text"><span class="unit">fields and methods</span></td></tr>
<tr><td class="num">1895</td><td class="text"><span class="unit">testcases</span> in the official TCK</td></tr>
<tr><td class="num">100%</td><td class="text"><span class="unit">signature</span> coverage of the TCK</td></tr> 
<tr><td class="num" style="border-top: black 1px solid; border-bottom: black 3px solid;"><a href="http://jcp.org/en/jsr/detail?id=283">2.0</a></td><td class="text" style="border-top: black 1px solid; border-bottom: black 3px solid;"><span class="unit"><a href="http://jcp.org/en/jsr/detail?id=283">Content Repository for Java Technology API</a></span></td></tr>
</tbody></table>
</div>
<br/><br/></div>
    </summary>
    <updated>2009-09-14T00:00:01Z</updated>
    <category term="jsr283"/>
    <category term="jcr"/>
    <category term="standards"/>
    <category term="jackrabbit"/>
    <author>
      <name>David Nuescheler</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-10-19T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/eweek.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/eweek.html" rel="alternate" type="text/html"/>
    <title>[LOTD] Apache Projects: last 10 years, next 10 years</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://www.eweek.com/c/a/Application-Development/11-Apache-Technologies-that-Have-Changed-Computing-in-the-Last-10-Years-469693/">eWeek  has looked back 10 years</a> of Apache Software Foundation (see also <a href="http://dev.day.com/microsling/content/blogs/main/apachebirthday.html">this interview</a>). They have identified 11 Apache projects that they think have changed computing in the last 10 years (an awesome lineup!) as well as 10 technologies that will change computing in the next 10 years. Amongst the latter: <a href="http://jackrabbit.apache.org/">Apache Jackrabbit</a> and <a href="http://sling.apache.org/site/index.html">Sling</a>.</p></div>
    </summary>
    <updated>2009-09-03T00:00:01Z</updated>
    <category term="link of the day"/>
    <category term="apache"/>
    <category term="sling"/>
    <category term="jackrabbit"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-10-19T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/openjcr.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/openjcr.html" rel="alternate" type="text/html"/>
    <title>OpenJCR</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>A new effort has been started over at <a href="http://www.java.net/">java.net</a> to implement</p>

<div class="blockquote">
<p>
an open source community project building a free and comprehensive next generation content repository defined by the Java Content Repository API specification (JSR-170 and JSR-283)
</p>
</div>

<p>The project is called <a href="https://openjcr.dev.java.net/servlets/ProjectHome">OpenJCR</a>. Its aims are</p>

<div class="blockquote">
<p>
OpenJCR is designed to address large deployments, to provide high performance, to be highly extensible, secure, and easy to deploy in a server or embedded environment.
</p>
</div>

<p>Not much to see so far, but then the project seems to be really young. In any case, it is good to see another JCR open source implementation project popping up.</p></div>
    </summary>
    <updated>2009-09-01T00:00:01Z</updated>
    <category term="open"/>
    <category term="jcr"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-10-07T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/simpcore.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/simpcore.html" rel="alternate" type="text/html"/>
    <title>SimPCoRe: PHP-based content repository</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>
Via <a href="http://twitter.com/georgwaechter/status/3653795739">@georgwaechter</a> I have come across <a href="http://www.simpcore.org/">SimPCoRe</a> which is a content repository for PHP. Judging from the description and <a href="http://groups.google.com/group/simpcore/browse_thread/thread/46638ffb5edfe182">this discussion</a> SimPCoRe does not fully  implement JSR-170, but only a smaller feature set. It does, however, seem to implement the basic ideas and concepts of a (Java) content repository.
</p><p>
It is great to see the ideas and concepts of the "content repository" spreading - be it standards-based or an adaption/evolution or a minimal feature set. Anything that helps with the implementation of better content management systems is a good trend (see also <a href="http://dev.day.com/microsling/content/blogs/main/cambrian.html">this previous post</a>). Especially, given the large amount of PHP-based CMSs I am happy to see more PHP developers working on content repository implementations (others are <a href="https://fosswiki.liip.ch/display/jackalope/Home">Jackalope</a> and <a href="http://flow3.typo3.org/">Flow3</a>).
</p></div>
    </summary>
    <updated>2009-08-31T00:00:01Z</updated>
    <category term="jcr"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-10-01T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/jrnativehttp.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/jrnativehttp.html" rel="alternate" type="text/html"/>
    <title>Jackrabbit 1.6 comes with native http access layer</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><a href="http://jackrabbit.apache.org/">Jackrabbit 1.6</a> has been <a href="http://jackrabbit.apache.org/downloads.html">released</a> a couple of days ago and it comes with a very cool, but somewhat hidden feature: it is now possible to use the Content Repository through http. There is direct read/write access to the repository even from the browser.
</p><p>
Of course, through <a href="http://sling.apache.org/site/index.html">Sling</a> this was <a href="http://sling.apache.org/site/discover-sling-in-15-minutes.html">possible</a> before, but now http-based access is native to the Content Repository itself. However, having Jackrabbit-native http access makes it much easier to use JCR from whichever framework or language you happen to use to write applications. In that sense, I tend to think of this as a game changing feature for Jackrabbit and JCR.
</p><p>
Unfortunately, the name of this access capability is not something one would expect like "RESTful this" or "Web that", but "JCR Remoting". Anyway, to check it out run the Jackrabbit 1.6 standalone server and find the description and some examples at http://localhost:8080/webdav-jcr.jsp
</p><p>
Nodes can be read through a GET request for /path/to/node.json , whole trees can be read in one request through a request to /path/to/node.treedepth.json (which is the format known from Sling). Adding, deleting or moving nodes is possible by sending POSTs in a specific format defined in the tutorials at http://localhost:8080/remoting/write.jsp
</p><p>
When I read the JCR Remoting documentation I got very confused by two concepts: WebDAV extensions and the JCR Remoting Client. Here is what I found out:
</p><p>
The intention of JCR Remoting is to make available the complete JCR functionality. At the moment, not all of that is implemented in the protocol. For this reason WebDAV is used as a fallback (for now). This makes sense, because WebDAV is http-based as well. 
</p><p>
The JCR Remoting Client is a set of Java classes that implement the JCR Remoting protocol and provide clients with a Java-based JCR session. Essentially, this is an alternative to an RMI-based connection to a Java Content Repository. It might be of interest to you if you intend to use Java to connect to the repository, but you can safely ignore it if you do not intend to do so.
</p></div>
    </summary>
    <updated>2009-08-31T00:00:01Z</updated>
    <category term="jackrabbit"/>
    <category term="jcr"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-10-07T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/commercialopensource.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/commercialopensource.html" rel="alternate" type="text/html"/>
    <title>David Nuescheler on Commercial Open Source Software</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p><img src="http://dev.day.com/microsling/content/blogs/main/commercialopensource/docroot/roberto.jpg" style="float: left; margin-right: 20px; margin-bottom: 10px;"/>

Italian open source blogger <a href="http://robertogaloppini.net/about/">Roberto Galoppini</a> has recently joined in the discussion about open source business models that got started by <a href="http://blogs.nuxeo.com/ebarroca/2009/08/commercial-open-source-or-just-a-free-demo.html">Eric Barroca</a> and <a href="http://dirkriehle.com/wp-content/uploads/2009/08/Commercial-Open-Source-v2.pdf">Dirk Riehle</a>. For <a href="http://robertogaloppini.net/2009/08/21/all-open-source-software-is-commercial/">his post</a> Roberto interviewed Day's CTO David Nuescheler and published parts of it. Please find the complete interview below.
</p>

<p><b>On standard participation costs</b></p>
<p><img src="http://dev.day.com/microsling/content/blogs/main/commercialopensource/docroot/david.jpg" style="float: right; margin-left: 20px; margin-bottom: 10px;"/>

It definitely depends on the level of participation in a particular standardization process. Simple participation in an expert group or a technical committee can require only a small effort such as a couple of hours of work per month or week. An active participant in a standardization can easily rack up numerous hours per week ranging up to a couple of FTEs.  When we talk about leading a specification effort, like we did in JSR-170 or JSR-283, there are a number of subject matter experts more or less constantly involved.
</p><p>
The burden on editor or specification lead also varies by standardization body.  With some standardization bodies there is no requirement to produce a testkit to certify or measure compliance of an implementation with a standard.
</p><p>
However, for example in the JCP the specification lead must provide a testkit (TCK) and even a reference implementation the passes 100% of the testkit to prove that the entire specification does not just look good on paper but is completely implementable.  Providing a testkit and a reference implementation certainly makes it much harder to complete a standard but it of course also makes the final result a much more solid specification.
</p><p>
In our specific case we did not really see the standards participation as a cost but much more as a part of a our leading edge research and development efforts that we would incur anyway. The choice that we have is whether to do that research behind closed doors and receive our first input from our customer base once the product is shipped or if we want to discuss these topics with the brightest minds in the industry by leading such a standardization.  We very much view the expert group in a specification as our extended R&amp;D-team that we can leverage for architecture discussions that matter to the entire industry.
</p>

<p><b>On symbiotic costs (aka competition costs within Apache projects)</b></p>

<p>    
We generally feel that through developing most of our infrastructure code in public there are various benefits for us as a commercial vendor.
</p><p>
To ensure that we gained maximum benefit we chose to collaborate with the Apace Software Foundation.  In particular because it is renowned for its clean cut meritocracy and true-spirited open source, from its very liberal licensing to the diversity-oriented community and foundation processes.
</p><p>
Traditionally I think that people view community participation in terms of contributing code patches or feature donations.  In our experience the most valuable contributions from the community comes in completely unexpected forms.  These include the use of a very public active mailing list as a sounding board and self-help archive, issues reporting, the fact that the community is building the software around-the-clock, having a very agile test harness of the latest features and changes in the form of the community and ultimately the prospect of being able to then hire the brightest minds in the industry having seen their great community work on “our technology”.
</p><p>
Most importantly though I think that learning to develop in the “Apache Way” has greatly improved our internal communication skills and has greatly enhanced the overall quality of our products.
</p><p>
We feel that only on rare occasions do we compete against “our” Apache open source projects and we have definitely been able to keep our open source projects very competitive within the open source world.
</p>

<p><b>On code production tracking costs</b></p>

<p>The production of code that ends up in our products happens in various ways already. I would argue that every software vendor leverages open source and closed source libraries. Some vendors may rely more on open source libraries than others.
</p><p>
At Day we believe in producing a lot of our code ourselves. If we find ourselves in a position where we need to develop commodity code that is generally applicable and reusable we try to open source as much as possible.
</p><p>
This results in our active participation in a lot open source projects (see e.g. <a href="http://dev.day.com/microsling/content/blogs/main/opensourceatday.html">here</a>)
</p><p>
Keeping your code open of course also allows to use public, 3rd party tracking tools and statistics about open source projects and allows to compare with peers (e.g. on <a href="http://www.ohloh.net/p/jackrabbit/analyses/latest">Ohloh</a>)
</p></div>
    </summary>
    <updated>2009-08-31T00:00:01Z</updated>
    <category term="open"/>
    <category term="day"/>
    <category term="jcr"/>
    <category term="standards"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-09-29T00:00:01Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://michid.wordpress.com/?p=163</id>
    <link href="http://michid.wordpress.com/2009/08/30/implementing-java-interfaces-and-generics/" rel="alternate" type="text/html"/>
    <title>Implementing Java Interfaces and Generics</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">In an earlier post I asked for an implementation of the following Java interface in Scala: public interface Iterator2 extends java.util.Iterator {} The solution was to use a combination of self types and existential types. However, some comments made me aware of Ticket #1737 where a more general form of the problem is discussed. Given [...]<img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=michid.wordpress.com&amp;blog=2538862&amp;post=163&amp;subd=michid&amp;ref=&amp;feed=1" width="1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>In an earlier <a href="http://michid.wordpress.com/2009/06/19/puzzle-implement-this/">post</a> I asked for an implementation of the following Java interface in Scala:</p>
<pre class="brush: java;">public interface Iterator2 extends java.util.Iterator {}
</pre>
<p>The <a href="http://michid.wordpress.com/2009/06/24/puzzle-implement-this-solution/">solution</a> was to use a combination of self types and existential types. However, some comments made me aware of <a href="http://lampsvn.epfl.ch/trac/scala/ticket/1737">Ticket #1737</a> where a more general form of the problem is discussed. Given the following Java code:</p>
<pre class="brush: java;">public interface A&lt;T&gt; {
    void run(T t);
    T get();
}

public abstract class B implements A {}
</pre>
<p>How could <em>B</em> be implemented in Scala? My previous approach is not sufficient here since for implementing the <em>run()</em> method, one needs to be able to refer to the existential type in <em>run()</em>‘s parameter list: </p>
<pre class="brush: java;">class C extends B {
  this: A[_] =&gt;

  def run(t:???) {} // What should go here for t's type?
  def get = "hello world"
}
</pre>
<p>So what we need is a way to name the existential type used in the self type (that is the type parameter to <em>A</em>) such that we can refer to it in the parameter list of the <em>run()</em> method. Here is my shot:</p>
<pre class="brush: java;">class D {
  type Q = X forSome { type X; }
}

class C extends B {
  this: A[D#Q] =&gt;

  def run(t:D#Q ) {}
  def get: D#Q = "hello world"
}
</pre>
<p>Unfortunately this results in a compilation error with Scala 2.7.5</p>
<pre>error: class C needs to be abstract, since method run in trait A of type (T)Unit is not defined
</pre>
<p>and in a <em>AssertionError</em> for Scala  2.8.0.r18604-b20090830020201</p>
<pre>Exception in thread "main" java.lang.AssertionError: assertion failed: michid.iterator.A[T]
at scala.Predef$.assert(Predef.scala:107)
at scala.tools.nsc.symtab.Types$TypeRef.transform(Types.scala:1417)
at scala.tools.nsc.symtab.Types$TypeRef$$anonfun$baseTypeSeq$3.apply(Types.scala:1588)
...
</pre>
<p>I created <a href="http://lampsvn.epfl.ch/trac/scala/ticket/2091">Ticket #2091</a> for these problems. </p>
<br/>Posted in Uncategorized Tagged: Scala <a href="http://feeds.wordpress.com/1.0/gocomments/michid.wordpress.com/163/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/michid.wordpress.com/163/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/michid.wordpress.com/163/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/michid.wordpress.com/163/"/></a> <a href="http://feeds.wordpress.com/1.0/gofacebook/michid.wordpress.com/163/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/michid.wordpress.com/163/"/></a> <a href="http://feeds.wordpress.com/1.0/gotwitter/michid.wordpress.com/163/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/michid.wordpress.com/163/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/michid.wordpress.com/163/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/michid.wordpress.com/163/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/michid.wordpress.com/163/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/michid.wordpress.com/163/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/michid.wordpress.com/163/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/michid.wordpress.com/163/"/></a> <img alt="" border="0" height="1" src="http://stats.wordpress.com/b.gif?host=michid.wordpress.com&amp;blog=2538862&amp;post=163&amp;subd=michid&amp;ref=&amp;feed=1" width="1"/></div>
    </content>
    <updated>2009-08-30T19:20:42Z</updated>
    <category term="Uncategorized"/>
    <category term="Scala"/>
    <author>
      <name>michid</name>
    </author>
    <source>
      <id>http://michid.wordpress.com</id>
      <logo>http://0.gravatar.com/blavatar/8a44e33f0c0b6ba0377f3633082fb84d?s=96&amp;d=http://s2.wp.com/i/buttonw-com.png</logo>
      <link href="http://michid.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://michid.wordpress.com" rel="alternate" type="text/html"/>
      <link href="http://michid.wordpress.com/osd.xml" rel="search" type="application/opensearchdescription+xml"/>
      <link href="http://michid.wordpress.com/?pushpress=hub" rel="hub" type="text/html"/>
      <subtitle>Hacking Scala</subtitle>
      <title>Michid's Weblog</title>
      <updated>2010-09-03T03:00:23Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://dev.day.com/microsling/content/blogs/main/slingusers.html</id>
    <link href="http://dev.day.com/microsling/content/blogs/main/slingusers.html" rel="alternate" type="text/html"/>
    <title>Are you using Sling?</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>Are you using <a href="http://sling.apache.org/site/index.html">Apache Sling</a> for internal projects or commercial software or anything else? Let the world know and add yourself to the <a href="http://cwiki.apache.org/confluence/pages/viewpage.action?pageId=2852421">wiki page</a> of Sling users that got <a href="http://dev.day.com/discussion-groups/content/lists/sling-dev/2009-08/2009-08-26_Who_is_using_Sling__Ian_Boston.html">just started by Sling committer Ian Boston</a> (the <a href="http://cwiki.apache.org/confluence/pages/viewpage.action?pageId=2852421">wiki page</a> also contains an interesting summary on Sling's impact on the code base of the <a href="http://www.sakaiproject.org/">Sakai project</a>).</p></div>
    </summary>
    <updated>2009-08-27T00:00:01Z</updated>
    <category term="sling"/>
    <author>
      <name>Michael Marth</name>
      <email>dev@day.com</email>
    </author>
    <source>
      <id>http://dev.day.com/microsling/content/blogs/main.html</id>
      <link href="http://dev.day.com/microsling/content/blogs/main.xml" rel="self" type="application/atom+xml"/>
      <link href="http://dev.day.com/microsling/content/blogs/main.html" rel="alternate" type="text/html"/>
      <subtitle>(content goes here) blog</subtitle>
      <title>(content goes here) blog</title>
      <updated>2009-09-25T00:00:01Z</updated>
    </source>
  </entry>

  <entry>
    <id>http://weblogs.goshaky.com/weblogs/alexkli/entry/eclipse_unresolved_compilation_problems_and</id>
    <link href="http://feedproxy.google.com/~r/AlexanderKlimetscheksBlog/~3/qZ2IVKjJYs8/eclipse_unresolved_compilation_problems_and" rel="alternate" type="text/html"/>
    <title>Eclipse unresolved compilation problems vs. Maven</title>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><p>The <a href="http://www.eclipse.org/jdt/core/index.php">Eclipse Java compiler</a> is built so that it almost always creates a valid class file - even if there are problems like unresolved imports. In that case the problematic method will <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=256443">contain a statement throwing an exception</a>, literally:</p><pre>public void myMethod() {<br/>    throw new Error("Unresolved compilation problems: \n\t<br/>                     The method isA(Resource, String) is<br/>                     undefined for the type ResourceUtil");<br/>} </pre><p>The original code of the method gets removed and the class file is <i>valid</i>, although the source is <i>not compilable</i>! This is really weird stuff when you see that error on a running system first and scratch your head how such an exception gets into the system. At least it gets (surprisingly) clearer when you look at the decompiled class file. This "feature" is seen as a good thing by the Eclipse devs, it seems to be required for the incremental compilation style of Eclipse and <a href="http://dev.eclipse.org/newslists/news.eclipse.newcomer/msg17510.html">cannot be disabled</a> apart from completely disabling the Java builder for a project, which turns Eclipse into a not-so-good text editor.</p><p>Anyway, this leads to a really annoying problem in conjunction with our <a href="http://maven.apache.org/">favorite Java build system</a>: if the Maven build and Eclipse share the same output directory (eg. <font class="Apple-style-span" face="'courier new', courier, monospace">target/classes</font>, which is the default if you use <a href="http://maven.apache.org/plugins/maven-eclipse-plugin/eclipse-mojo.html">mvn eclipse:eclipse</a>), a Maven build that creates a jar from those classes will pick them up without noticing that there is a compilation problem. Because the class file is up-to-date compared to its source file, Maven won't recompile it and simply puts it into your jar. Then it gets deployed, executed and your system throws that nasty error. And you wonder <a href="http://stackoverflow.com/questions/1124788/java-unresolved-compilation-problem">"how could a compilation error get unnoticed into a running system?"</a></p><p>The only solution I found is to avoid sharing of the output directory for classes between Maven and Eclipse. To do that with the maven eclipse plugin, use the "outputDirectory" parameter:</p><pre>mvn eclipse:eclipse -DoutputDirectory=target/eclipse-classes</pre><p>That should ensure you don't accidentally run across that problem again.</p><p><b>Update:</b>  As noted by the commenters, always using <font class="Apple-style-span" face="'courier new', courier, monospace">mvn clean</font> as part of your build process helps as well, although that slows down development a bit. For release builds you should always do a <font class="Apple-style-span" face="'courier new', courier, monospace">clean</font>.</p><img height="1" src="http://feeds.feedburner.com/~r/AlexanderKlimetscheksBlog/~4/qZ2IVKjJYs8" width="1"/></div>
    </content>
    <updated>2009-08-21T12:43:23Z</updated>
    <published>2009-08-19T16:39:34Z</published>
    <category label="General" term="/General"/>
    <category scheme="http://rollerweblogger.org/ns/tags/" term="eclipse"/>
    <category scheme="http://rollerweblogger.org/ns/tags/" term="java"/>
    <category scheme="http://rollerweblogger.org/ns/tags/" term="maven"/><feedburner:origlink xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://weblogs.goshaky.com/weblogs/alexkli/entry/eclipse_unresolved_compilation_problems_and</feedburner:origlink>
    <author>
      <name>Alexander Klimetschek</name>
    </author>
    <source>
      <id>http://weblogs.goshaky.com/weblogs/alexkli/feed/entries/atom</id>
      <link href="http://weblogs.goshaky.com/weblogs/alexkli/" rel="alternate" type="text/html"/>
      <link href="http://feeds.feedburner.com/AlexanderKlimetscheksBlog" rel="self" type="application/atom+xml"/>
      <link href="http://pubsubhubbub.appspot.com/" rel="hub" type="text/html"/>
      <subtitle>On Software Design and Development</subtitle>
      <title>Alexander Klimetschek's Blog</title>
      <updated>2009-08-21T12:43:23Z</updated>
    </source>
  </entry>

  <entry xml:lang="en">
    <id>http://jukkaz.wordpress.com/?p=225</id>
    <link href="http://jukkaz.wordpress.com/2009/08/11/apache-jackrabbit-1-6-0-released/" rel="alternate" type="text/html"/>
    <title>Apache Jackrabbit 1.6.0 released</title>
    <summary type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml">The Apache Jackrabbit project has just released Jackrabbit version 1.6.0. This release will most likely be the latest JCR 1.0 -based Jackrabbit 1.x minor release before the upcoming Jackrabbit 2.0 and the upgrade to JCR version 2.0. The purpose goal of this release is to push out as many of the recent Jackrabbit trunk improvements [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=225&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div>
    </summary>
    <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml"><div class="snap_preview"><br/><p>The <a href="http://jackrabbit.apache.org/">Apache Jackrabbit</a> project has just released Jackrabbit version 1.6.0. This release will most likely be the latest JCR 1.0 -based Jackrabbit 1.x minor release before the upcoming Jackrabbit 2.0 and the upgrade to JCR version 2.0. The purpose goal of this release is to push out as many of the recent Jackrabbit trunk improvements as possible so that the number of new things in Jackrabbit 2.0 remains manageable.</p>
<p style="text-align: center;"><a href="http://jackrabbit.apache.org/downloads.html"><img alt="Download Apache Jackrabbit 1.6.0" class="size-full wp-image-226" height="95" src="http://jukkaz.files.wordpress.com/2009/08/jackrabbit-download-1-6-0.png?w=368&amp;h=95" title="Download Apache Jackrabbit 1.6.0" width="368"/></a></p>
<p>The most notable changes and new features in this release are:</p>
<ul>
<li>The RepositoryCopier tool makes it easy to backup and migrate repositories (<a href="https://issues.apache.org/jira/browse/JCR-442">JCR-442</a>). There is also improved support for selectively copying content and version histories between repositories (<a href="https://issues.apache.org/jira/browse/JCR-1972">JCR-1972</a>).</li>
<li>A new WebDAV-based JCR remoting layer has been added to complement the existing JCR-RMI layer <a href="https://issues.apache.org/jira/browse/JCR-1877">(JCR-1877</a>, <a href="https://issues.apache.org/jira/browse/JCR-1958">JCR-1958</a>).</li>
<li>Query performance has been further optimized (<a href="https://issues.apache.org/jira/browse/JCR-1820">JCR-1820</a>, <a href="https://issues.apache.org/jira/browse/JCR-1855">JCR-1855</a> and <a href="https://issues.apache.org/jira/browse/JCR-2025">JCR-2025</a>).</li>
<li>Added support for Ingres and MaxDB/SapDB databases (<a href="https://issues.apache.org/jira/browse/JCR-1960">JCR-1960</a>, <a href="https://issues.apache.org/jira/browse/JCR-1527">JCR-1527</a>).</li>
<li>Session.refresh() can now be used to synchronize a cluster node with changes from the other nodes in the cluster (<a href="https://issues.apache.org/jira/browse/JCR-1753">JCR-1753</a>).</li>
<li>Unreferenced version histories are now automatically removed once all the contained versions have been removed (<a href="https://issues.apache.org/jira/browse/JCR-134">JCR-134</a>).</li>
<li>Standalone components like the JCR-RMI layer and the OCM framework have been moved to a separate <a href="http://jackrabbit.apache.org/commons/">JCR Commons</a> subproject of Jackrabbit, and are not included in this release. Updates to those components will be distributed as separate releases.</li>
<li>Development preview: There are even more <a href="http://jcp.org/en/jsr/summary?id=283">JSR 283</a> features in Jackrabbit 1.6 than were included in the 1.5 version. These new features are accessible through special “jsr283″ interfaces in the Jackrabbit API. Note that none of these features are ready for production use, and will be replaced with final JCR 2.0 versions in Jackrabbit 2.0.</li>
</ul>
<p>This release is the result of contributions from <a href="https://issues.apache.org/jira/secure/ConfigureReport.jspa?versionId=12313459&amp;issueStatus=all&amp;selectedProjectId=10591&amp;reportKey=com.sourcelabs.jira.plugin.report.contributions:contributionreport&amp;Next=Next" title="Jira contribution report for Jackrabbit 1.6.0">quite a few people</a>. Thanks to everyone involved, this is open source in action!</p>
  <a href="http://feeds.wordpress.com/1.0/gocomments/jukkaz.wordpress.com/225/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/jukkaz.wordpress.com/225/"/></a> <a href="http://feeds.wordpress.com/1.0/godelicious/jukkaz.wordpress.com/225/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/jukkaz.wordpress.com/225/"/></a> <a href="http://feeds.wordpress.com/1.0/gostumble/jukkaz.wordpress.com/225/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/jukkaz.wordpress.com/225/"/></a> <a href="http://feeds.wordpress.com/1.0/godigg/jukkaz.wordpress.com/225/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/jukkaz.wordpress.com/225/"/></a> <a href="http://feeds.wordpress.com/1.0/goreddit/jukkaz.wordpress.com/225/" rel="nofollow"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/jukkaz.wordpress.com/225/"/></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=jukkaz.wordpress.com&amp;blog=52630&amp;post=225&amp;subd=jukkaz&amp;ref=&amp;feed=1"/></div></div>
    </content>
    <updated>2009-08-11T15:11:03Z</updated>
    <category term="JCR"/>
    <category term="Jackrabbit"/>
    <author>
      <name>Jukka Zitting</name>
    </author>
    <source>
      <id>http://jukkaz.wordpress.com</id>
      <logo>http://www.gravatar.com/blavatar/61b91d1104160eee551653d13013e4cc?s=96&amp;d=http://s.wordpress.com/i/buttonw-com.png</logo>
      <link href="http://jukkaz.wordpress.com/feed/" rel="self" type="application/atom+xml"/>
      <link href="http://jukkaz.wordpress.com" rel="alternate" type="text/html"/>
      <subtitle>Software craftmanship</subtitle>
      <title>Jukka Zitting</title>
      <updated>2009-12-07T09:00:12Z</updated>
    </source>
  </entry>
</feed>
