<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en-US">
  <id>http://emmanuelbernard.com/blog/</id>
  <title>No Relation To</title>
  <author>
    <name>Emmanuel Bernard</name>
  </author>
  <updated>2013-03-26T00:00:00Z</updated>
  
  <link href="http://emmanuelbernard.com/blog/" rel="alternate" type="text/html" />
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/NoRelationTo" /><feedburner:info uri="norelationto" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <id>http://emmanuelbernard.com/blog/2013/03/26/making-the-best-of-google-authenticator-for-one-time-passwords/</id>
    <title>Making the best of Google Authenticator for One Time Passwords</title>
    <updated>2013-03-26T00:00:00Z</updated>
    <published>2013-03-26T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/4e-fzsUzV-0/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      You can't reorder tokens on Google Authenticator nor edit the associated
      description? Read on.
      
      I use one time passwords everywhere I can. It's a little hassle but increases
      security by a whole lot. And the good thing is that more and more providers
      offer this:
      
      
      GMail
      Google Apps
      Dropbox
      Amazon Web Services
      Your company if they are not too dinosaur-y
      
      
      
      Go use one time passwords aka two factor authentication, you will thank me
      later.
      
      I looked around on iOS and the most well known soft token application that
      supports both time based and event based tokens is Google Authenticator.
      Except that Google Authenticator's UI is really crap and buggy.
      
      The edit button does not seem...
    </summary>
    <content type="html">
      &lt;p&gt;You can't reorder tokens on Google Authenticator nor edit the associated
      description? Read on.&lt;/p&gt;
      
      &lt;p&gt;I use &lt;strong&gt;one time passwords&lt;/strong&gt; everywhere I can. It's a little hassle but increases
      security by a whole lot. And the good thing is that more and more providers
      offer this:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;GMail&lt;/li&gt;
      &lt;li&gt;Google Apps&lt;/li&gt;
      &lt;li&gt;Dropbox&lt;/li&gt;
      &lt;li&gt;Amazon Web Services&lt;/li&gt;
      &lt;li&gt;Your company if they are not too dinosaur-y&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;&lt;strong&gt;Go use one time passwords aka two factor authentication&lt;/strong&gt;, you will thank me
      later.&lt;/p&gt;
      
      &lt;p&gt;I looked around on iOS and the most well known soft token application that
      supports both time based and event based tokens is Google Authenticator.
      Except that &lt;strong&gt;Google Authenticator's UI is really crap and buggy&lt;/strong&gt;.&lt;/p&gt;
      
      &lt;p&gt;The edit button does not seem to function properly and nothing happens most of
      the time. The trick is to &lt;strong&gt;go to Legal information then back&lt;/strong&gt;. You can now &lt;strong&gt;press
      the edit button and voilà! Things work&lt;/strong&gt;. You can now:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;reorder the list properly&lt;/li&gt;
      &lt;li&gt;edit the name under each token&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;That made my life much easier.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2013/03/26/making-the-best-of-google-authenticator-for-one-time-passwords/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2013/03/24/multiple-email-aliases-in-ios/</id>
    <title>Multiple email aliases in iOS</title>
    <updated>2013-03-24T00:00:00Z</updated>
    <published>2013-03-24T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/tcdEGnvxz2c/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I have tons of email identities. Depending on which hat I am wearing, I use one
      alias or another. Most are behind my GMail address. It is easy enough to create
      and use multiple aliases in the GMail web client or even in Mac OS X's Mail app.
      But until recently I thought it was impossible with iOS Mail app.
      
      It turns out it is possible but requires a bit of cheating. First off, instead
      of setting up your GMail account as GMail, set it up as IMAP. I already do
      that as I never give my GMail address (in case I change provider).  Once...
    </summary>
    <content type="html">
      &lt;p&gt;I have tons of email identities. Depending on which hat I am wearing, I use one
      alias or another. Most are behind my GMail address. It is easy enough to create
      and use multiple aliases in the GMail web client or even in Mac OS X's Mail app.
      But until recently &lt;strong&gt;I thought it was impossible with iOS Mail app&lt;/strong&gt;.&lt;/p&gt;
      
      &lt;p&gt;It turns out it is possible but requires a bit of cheating. First off, &lt;strong&gt;instead
      of setting up your GMail account as GMail, set it up as IMAP&lt;/strong&gt;. I already do
      that as I never give my GMail address (in case I change provider).  Once setup,
      go in Note or any other editor and type the &lt;strong&gt;list of comma separated email
      aliases&lt;/strong&gt; (including your primary address) and copy this line. For example:&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;scooby@doo.fr, scooby.doo@worldwildlife.org, scooby.doo@gmail.com&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;Then go to &lt;strong&gt;Setting -&gt; Mail, Contacts, Calendars&lt;/strong&gt; and select the email account
      you are interested in. In the &lt;strong&gt;Email field, remove the address and paste the
      list of comma separated email addresses&lt;/strong&gt;. This whole gymnastic is necessary
      because iOS does not let you add commas in an email field.&lt;/p&gt;
      
      &lt;p&gt;Now you are good to go, &lt;strong&gt;when you create an email, you can change the email
      address with any of the aliases&lt;/strong&gt;. Note that the last email in the list will be
      the default email (experienced on iOS 6.1.3).&lt;/p&gt;
      
      &lt;p&gt;I found the tip on &lt;a href="http://www.imore.com/daily-tip-set-gmail-alias"&gt;iMore&lt;/a&gt;, they
      describe a more step-by-step explanation with some screen shot if you get lost.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2013/03/24/multiple-email-aliases-in-ios/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2013/01/09/google-drive-the-good-and-the-ugly/</id>
    <title>Google Drive - the good and the ugly</title>
    <updated>2013-01-09T00:00:00Z</updated>
    <published>2013-01-09T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/7p0CeT1Ti9k/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Google Drive is a bit confusing at first
      but the Dropbox like feature works reasonably well.
      They have a desktop client that works pretty much like the Dropbox
      client and syncs your local directory with the cloud.
      
      This is quite handy when your friends have maxed out their Dropbox
      quota: Google Drive gives you 5 GB free.
      Images you store on Google Plus and files you store on Google
      Drive count against your quota. The Google Drive documents do not though.
      
      Not everything is rosy in the Google Drive land though.
      
      Trash or no trash
      
      Data in your trash is counted as used space. It took me a while to...
    </summary>
    <content type="html">
      &lt;p&gt;&lt;a href="http://drive.google.com/"&gt;Google Drive&lt;/a&gt; is a bit confusing at first
      but the &lt;a href="http://db.tt/JXQsjMt"&gt;Dropbox&lt;/a&gt; like feature works reasonably well.
      They have a desktop client that works pretty much like the Dropbox
      client and syncs your local directory with the cloud.&lt;/p&gt;
      
      &lt;p&gt;This is quite handy when your friends have maxed out their Dropbox
      quota: Google Drive gives you 5 GB free.
      Images you store on Google Plus and files you store on Google
      Drive count against your quota. The Google Drive documents do not though.&lt;/p&gt;
      
      &lt;p&gt;Not everything is rosy in the Google Drive land though.&lt;/p&gt;
      
      &lt;h2&gt;Trash or no trash&lt;/h2&gt;
      
      &lt;p&gt;Data in your trash is counted as used space. It took me a while to figure
      that out and I could not get why my free space was lower that it should
      have.
      I don't think other services do that.&lt;/p&gt;
      
      &lt;h2&gt;Bugs&lt;/h2&gt;
      
      &lt;p&gt;When you delete a non empty directory and then try to remove it from the trash, well
      nothing happens. Someone has forgotten to write the recursive part of the
      algorithm :)
      You have to go in each subdirectory and remove files and empty directories.&lt;/p&gt;
      
      &lt;h2&gt;Simplistic client and speed&lt;/h2&gt;
      
      &lt;p&gt;It seems to me that Dropbox syncs faster than Google Drive but I have not
      properly benched them so that might be subjective.&lt;/p&gt;
      
      &lt;p&gt;What is for sure is that the sync up cues on Google Drive are too simplistic.
      It tells you synchronization happens and that's it. Dropbox tells you how many
      files are uploaded and downloaded, what is the speed rate for each as well
      as the estimated time it will take. It's not gimmicky, it shows progress
      to the user.&lt;/p&gt;
      
      &lt;p&gt;Overall, I tend to stick with &lt;a href="http://db.tt/JXQsjMt"&gt;Dropbox&lt;/a&gt; despite the fact
      that it is twice as expensive per GB.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2013/01/09/google-drive-the-good-and-the-ugly/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/11/23/thou-shalt-be-binary-compatible/</id>
    <title>Thou shalt be binary compatible</title>
    <updated>2012-11-23T00:00:00Z</updated>
    <published>2012-11-23T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/XStrvfLInt0/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I learned some new tricks today thanks to Gunnar around backward compatibilities
      in Java.
      
      There is compatibility and compatibility
      
      In Bean Validation, we need to fix a mistake I made. One easy solution is to create
      a sub-interface and return that sub-interface.
      
      //API
      public interface Contract {
          public Result testMe();
          public Result testMeMore();
      
          public static interface Result {
              void doIt();
          }
      }
      
      //client code
      Contract contract = new ContractImpl();
      contract.testMeMore().doIt();
      
      
      In our example, I need to add a new method to results coming from testMeMore().
      I thought of this approach:
      
      //API
      public interface Contract {
      ...
    </summary>
    <content type="html">
      &lt;p&gt;I learned some new tricks today thanks to Gunnar around backward compatibilities
      in Java.&lt;/p&gt;
      
      &lt;h2&gt;There is compatibility and compatibility&lt;/h2&gt;
      
      &lt;p&gt;In Bean Validation, we need to fix a mistake I made. One easy solution is to create
      a sub-interface and return that sub-interface.&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;//API&amp;#x000A;public interface Contract {&amp;#x000A;    public Result testMe();&amp;#x000A;    public Result testMeMore();&amp;#x000A;&amp;#x000A;    public static interface Result {&amp;#x000A;        void doIt();&amp;#x000A;    }&amp;#x000A;}&amp;#x000A;&amp;#x000A;//client code&amp;#x000A;Contract contract = new ContractImpl();&amp;#x000A;contract.testMeMore().doIt();&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;In our example, I need to add a new method to results coming from &lt;code&gt;testMeMore()&lt;/code&gt;.
      I thought of this approach:&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;//API&amp;#x000A;public interface Contract {&amp;#x000A;    public Result testMe();&amp;#x000A;    public ResultMore testMeMore();&amp;#x000A;&amp;#x000A;    public static interface Result {&amp;#x000A;        void doIt();&amp;#x000A;    }&amp;#x000A;&amp;#x000A;    public static interface ResultMore extends Result {&amp;#x000A;        void doItAgain();&amp;#x000A;    }&amp;#x000A;}&amp;#x000A;&amp;#x000A;//client code&amp;#x000A;Contract contract = new ContractImpl();&amp;#x000A;contract.testMeMore().doIt();&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;This approach is source compatible: if I recompile the client code,
      things will work perfectly. But it's not backward compatible at the
      binary level.&lt;/p&gt;
      
      &lt;p&gt;If you don't recompile the client code and simply update the API jar,
      you will get a nasty exception&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;Exception in thread "main" java.lang.NoSuchMethodError: com.jboss.test.Contract.testMeMore()Lcom/jboss/test/Contract$Result;&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;That's because the contract is now &lt;code&gt;com.jboss.test.Contract.testMeMore()Lcom/jboss/test/Contract$ResultMore&lt;/code&gt;
      and even if &lt;code&gt;Result&lt;/code&gt; is a super interface, Java does not let go with it.&lt;/p&gt;
      
      &lt;p&gt;And since application deployed in Java EE 6 are supposed to work out of the box for
      Java EE 7, we can't do that. Note that testing binary compatibilities is not
      trivial.&lt;/p&gt;
      
      &lt;h2&gt;Use the erasure hack, Luke&lt;/h2&gt;
      
      &lt;p&gt;The what? It turns out the Java designers already had this problem when they
      introduced the generics type system. You can solve the problem by using
      intersection types.&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;//API&amp;#x000A;public interface Contract {&amp;#x000A;    public Result testMe();&amp;#x000A;    public &amp;lt;T extends Result &amp;amp; ResultMore&amp;gt; T testMeMore();&amp;#x000A;&amp;#x000A;    public static interface Result {&amp;#x000A;        void doIt();&amp;#x000A;    }&amp;#x000A;&amp;#x000A;    public static interface ResultMore extends Result {&amp;#x000A;        void doItAgain();&amp;#x000A;    }&amp;#x000A;}&amp;#x000A;&amp;#x000A;//client code&amp;#x000A;Contract contract = new ContractImpl();&amp;#x000A;contract.testMeMore().doIt();&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;Because generic types are erased by their most left upper bounds which is
      &lt;code&gt;Result&lt;/code&gt; in our case, things work out smoothly.&lt;/p&gt;
      
      &lt;p&gt;By the way, you can reproduce this ad nauseam.&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;//API&amp;#x000A;public interface Contract {&amp;#x000A;    public Result testMe();&amp;#x000A;    public &amp;lt;T extends Result &amp;amp; ResultMore &amp;amp; ResultUltimate&amp;gt; T testMeMore();&amp;#x000A;&amp;#x000A;    public static interface Result {&amp;#x000A;        void doIt();&amp;#x000A;    }&amp;#x000A;&amp;#x000A;    public static interface ResultMore extends Result {&amp;#x000A;        void doItAgain();&amp;#x000A;    }&amp;#x000A;&amp;#x000A;    public static interface ResultUltimate extends Result {&amp;#x000A;        void doItForEver();&amp;#x000A;    }&amp;#x000A;&amp;#x000A;}&amp;#x000A;&amp;#x000A;//client code&amp;#x000A;Contract contract = new ContractImpl();&amp;#x000A;contract.testMeMore().doItAgain();&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;h2&gt;Conclusion&lt;/h2&gt;
      
      &lt;p&gt;Now the big question is, should we use this trick in Bean Validation to solve
      &lt;a href="http://beanvalidation.org/proposals/BVAL-221/"&gt;this problem&lt;/a&gt;.
      What's your take on it?&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/11/23/thou-shalt-be-binary-compatible/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/10/31/no-more-java-preferences-for-you/</id>
    <title>No more Java Preferences for you!</title>
    <updated>2012-10-31T00:00:00Z</updated>
    <published>2012-10-31T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/rfWh9R4NV60/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Java on Max OS X is a moving target to say the least since stewardship
      has moved from Apple to Oracle. I had a lot of trouble to make Eclipse
      run on my machine making me feel like a customer of
      The Soup Nazi in Seinfeld.
      
      Let me explain some changes.
      
      The failure
      
      I tried to run Eclipse Juno on my machine and got the following encouraging
      error
      
      The JVM shared library /Library/Java/JavaVirtualMachines/openjdk-1.7-x86_64
      does not contain the JNI_CreateJavaVM symbol
      
      Eclipse always uses the system default JVM on Mac OS X and as far as I know
      you can't change that. In theory that's not a big deal, you just have to...
    </summary>
    <content type="html">
      &lt;p&gt;Java on Max OS X is a moving target to say the least since stewardship
      has moved from Apple to Oracle. I had a lot of trouble to make Eclipse
      run on my machine making me feel like a customer of
      &lt;a href="http://en.wikipedia.org/wiki/The_Soup_Nazi"&gt;The Soup Nazi&lt;/a&gt; in Seinfeld.&lt;/p&gt;
      
      &lt;p&gt;Let me explain some changes.&lt;/p&gt;
      
      &lt;h2&gt;The failure&lt;/h2&gt;
      
      &lt;p&gt;I tried to run &lt;em&gt;Eclipse Juno&lt;/em&gt; on my machine and got the following encouraging
      error&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;p&gt;The JVM shared library /Library/Java/JavaVirtualMachines/openjdk-1.7-x86_64
      does not contain the JNI_CreateJavaVM symbol&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;Eclipse always uses the system default JVM on Mac OS X and as far as I know
      you can't change that. In theory that's not a big deal, you just have to change
      the default JVM to use via the &lt;em&gt;Java Preferences&lt;/em&gt; application.&lt;/p&gt;
      
      &lt;h2&gt;No more Java Preferences application&lt;/h2&gt;
      
      &lt;p&gt;Apple recently removed the &lt;em&gt;Java Preferences&lt;/em&gt; application from Mac OS X
      as they deemed it to be useless. In a sort of twisted way - aka we don't
      care about developers - they were right.&lt;/p&gt;
      
      &lt;p&gt;It has been replaced in the Java Oracle distribution by a panel in
      &lt;em&gt;System Preferences&lt;/em&gt; under the &lt;em&gt;Other&lt;/em&gt; category. Well except that
      this panel only deals with Oracle JVMs. So if you happen to have
      OpenJDK or any other JVM installed, you can not choose (or "unchoose")
      them.&lt;/p&gt;
      
      &lt;p&gt;The side effect for me was that OpenJDK was selected as the default JVM
      and this created this user friendly error when starting Eclipse.&lt;/p&gt;
      
      &lt;p&gt;Hats off to &lt;a href="http://blog.hgomez.net"&gt;Henri Gomez&lt;/a&gt; for helping me find a
      way out. You basically need to
      go to &lt;code&gt;/Library/Java/JavaVirtualMachines&lt;/code&gt; and remove OpenJDK&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;sudo rm -fR openjdk-1.7-x86_64&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;In my case I actually moved it somewhere else.
      What if I want to use OpenJDK too? &lt;strong&gt;F**k you!&lt;/strong&gt; told me Orapple.&lt;/p&gt;
      
      &lt;p&gt;The combination of:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;Apple stopping bundling the JVM&lt;/li&gt;
      &lt;li&gt;Oracle coming up with an Oracle only replacement&lt;/li&gt;
      &lt;li&gt;Apple removing a useful tool&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;makes the open JDK community at large feel quite unwelcome. So much for
      an open source project and community where both Apple and Oracle
      are major stakeholders.&lt;/p&gt;
      
      &lt;p&gt;By the way that's not the only glitch I've experienced when moving from the
      Apple VM to Oracle VM. &lt;code&gt;JAVA_HOME&lt;/code&gt; now points to the JDK instead of the JRE.&lt;/p&gt;
      
      &lt;p&gt;Anyways, moving along.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/10/31/no-more-java-preferences-for-you/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/10/31/installing-po2xml-on-mac-os-x/</id>
    <title>Installing po2xml and xml2pot on Mac OS X</title>
    <updated>2012-10-31T00:00:00Z</updated>
    <published>2012-10-31T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/K4ipadXKkwg/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Hibernate documentation system uses po2xml and xml2pot to build translations.
      Unfortunately, Homebrew does not have a formula for it and I
      don't think I have the knowledge to work on such thing.
      
      The solution is to install Macport. There is a nice UI
      installer. Make sure to chose the one specific
      to your Max OS X version.
      
      MacPort does change your .bash_profile. Because I want to give
      Homebrew's executable priority, I make sure to put Macport
      changes after homebrew in the PATH variables.
      
      Update Macport
      
      sudo port -v selfupdate
      
      
      Then install po2xml. Unfortunately, po2xml does not come as standalone
      package, you have to install all of KDE
      
      sudo port install kdesdk4
      
      
      Then wait for...
    </summary>
    <content type="html">
      &lt;p&gt;Hibernate documentation system uses po2xml and xml2pot to build translations.
      Unfortunately, Homebrew does not have a formula for it and I
      don't think I have the knowledge to work on such thing.&lt;/p&gt;
      
      &lt;p&gt;The solution is to install Macport. There is a nice UI
      &lt;a href="http://www.macports.org/install.php"&gt;installer&lt;/a&gt;. Make sure to chose the one specific
      to your Max OS X version.&lt;/p&gt;
      
      &lt;p&gt;MacPort does change your &lt;code&gt;.bash_profile&lt;/code&gt;. Because I want to give
      Homebrew's executable priority, I make sure to put Macport
      changes after homebrew in the &lt;code&gt;PATH&lt;/code&gt; variables.&lt;/p&gt;
      
      &lt;p&gt;Update Macport&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;sudo port -v selfupdate&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;Then install po2xml. Unfortunately, po2xml does not come as standalone
      package, you have to install all of KDE&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;sudo port install kdesdk4&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;Then wait for freaking ever for everything to compile. By the way, source
      packaging is not eco-friendly. Think about the amount of CPU needed every
      time you update some package...&lt;/p&gt;
      
      &lt;p&gt;Once that is done, add po2xml and xml2pot to your path&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;PATH=$PATH:/Applications/MacPorts/KDE4/po2xml.app/Contents/MacOS&amp;#x000A;PATH=$PATH:/Applications/MacPorts/KDE4/xml2pot.app/Contents/MacOS&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;And you are good to go!&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/10/31/installing-po2xml-on-mac-os-x/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/08/04/unable-to-update-git-from-homebrew/</id>
    <title>Unable to update git from homebrew</title>
    <updated>2012-08-04T00:00:00Z</updated>
    <published>2012-08-04T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/fiTxfIJrlpM/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I have had problems on one machine to upgrade Git from Homebrew.
      Let me first tell you how to fix the problem and then what homebrew is
      about.
      
      The problem
      
      The problem appeared when I tried to upgrade git
      
      brew upgrade git
      
      
      It turned out to be much more complicated than I anticipated to
      find the problem. The exact error message was:
      
      Error: Failed executing: make prefix=/usr/local/Cellar/git/1.7.11.3 CC=/usr/bin/clang CFLAGS=-Os\ -w\ -pipe\ -march=native\ -Qunused-arguments\ -mmacosx-version-min=10.7 LDFLAGS=-L/usr/local/lib install (git.rb:49)
      These existing issues may help you:
          https://github.com/mxcl/homebrew/issues/8643
          https://github.com/mxcl/homebrew/issues/10544
          https://github.com/mxcl/homebrew/issues/11481
          https://github.com/mxcl/homebrew/issues/12344
          https://github.com/mxcl/homebrew/issues/12814
          https://github.com/mxcl/homebrew/issues/13850
      Otherwise, this may...
    </summary>
    <content type="html">
      &lt;p&gt;I have had problems on one machine to upgrade Git from &lt;a href="http://mxcl.github.com/homebrew/"&gt;Homebrew&lt;/a&gt;.
      Let me first tell you how to fix the problem and then what homebrew is
      about.&lt;/p&gt;
      
      &lt;h2&gt;The problem&lt;/h2&gt;
      
      &lt;p&gt;The problem appeared when I tried to upgrade git&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;brew upgrade git&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;It turned out to be much more complicated than I anticipated to
      find the problem. The exact error message was:&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;Error: Failed executing: make prefix=/usr/local/Cellar/git/1.7.11.3 CC=/usr/bin/clang CFLAGS=-Os\ -w\ -pipe\ -march=native\ -Qunused-arguments\ -mmacosx-version-min=10.7 LDFLAGS=-L/usr/local/lib install (git.rb:49)&amp;#x000A;These existing issues may help you:&amp;#x000A;    https://github.com/mxcl/homebrew/issues/8643&amp;#x000A;    https://github.com/mxcl/homebrew/issues/10544&amp;#x000A;    https://github.com/mxcl/homebrew/issues/11481&amp;#x000A;    https://github.com/mxcl/homebrew/issues/12344&amp;#x000A;    https://github.com/mxcl/homebrew/issues/12814&amp;#x000A;    https://github.com/mxcl/homebrew/issues/13850&amp;#x000A;Otherwise, this may help you fix or report the issue:&amp;#x000A;    https://github.com/mxcl/homebrew/wiki/bug-fixing-checklist&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;My environment was listed as:&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;==&amp;gt; Build Environment&amp;#x000A;HOMEBREW_VERSION: 0.9.2&amp;#x000A;HEAD: 53d5bfb44e8644eff1693b2a734f079d10b53043&amp;#x000A;CPU: dual-core 64-bit penryn&amp;#x000A;OS X: 10.7.4-x86_64&amp;#x000A;Xcode: 4.3.3&amp;#x000A;CLT: 4.3.0.0.1.1249367152&amp;#x000A;X11: 2.6.4 @ /usr/X11&amp;#x000A;CC: /usr/bin/clang&amp;#x000A;CXX: /usr/bin/clang++ =&amp;gt; /usr/bin/clang&amp;#x000A;LD: /usr/bin/clang&amp;#x000A;CFLAGS: -Os -w -pipe -march=native -Qunused-arguments -mmacosx-version-min=10.7&amp;#x000A;CXXFLAGS: -Os -w -pipe -march=native -Qunused-arguments -mmacosx-version-min=10.7&amp;#x000A;CPPFLAGS: -isystem /usr/local/include&amp;#x000A;LDFLAGS: -L/usr/local/lib&amp;#x000A;MACOSX_DEPLOYMENT_TARGET: 10.7&amp;#x000A;MAKEFLAGS: -j2&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;And the last line before the error outputs were&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;/usr/bin/clang -isystem /usr/local/include -Os -w -pipe -march=native -Qunused-arguments -mmacosx-version-min=10.7 -I. -DUSE_ST_TIMESPEC -DNO_GETTEXT  -DHAVE_DEV_TTY -DXDL_FAST_HASH -DSHA1_HEADER='&amp;lt;openssl/sha.h&amp;gt;'  -DNO_MEMMEM -DSHELL_PATH='"/bin/sh"' -o git-daemon -L/usr/local/lib  daemon.o libgit.a xdiff/lib.a  -lz  -liconv  -lcrypto -lssl &amp;#x000A;Undefined symbols for architecture x86_64:&amp;#x000A;  "_iconv_open", referenced from:&amp;#x000A;Undefined symbols for architecture x86_64:&amp;#x000A;  "_iconv_open", referenced from:&amp;#x000A;      _reencode_string in libgit.a(utf8.o)&amp;#x000A;      _reencode_string in libgit.a(utf8.o)&amp;#x000A;  "_iconv", referenced from:&amp;#x000A;  "_iconv", referenced from:&amp;#x000A;      _reencode_string in libgit.a(utf8.o)&amp;#x000A;      _reencode_string in libgit.a(utf8.o)&amp;#x000A;  "_iconv_close", referenced from:&amp;#x000A;  "_iconv_close", referenced from:&amp;#x000A;      _reencode_string in libgit.a(utf8.o)&amp;#x000A;      _reencode_string in libgit.a(utf8.o)&amp;#x000A;ld: symbol(s) not found for architecture x86_64&amp;#x000A;ld: symbol(s) not found for architecture x86_64&amp;#x000A;clang: error: linker command failed with exit code 1 (use -v to see invocation)&amp;#x000A;clang: error: linker command failed with exit code 1 (use -v to see invocation)&amp;#x000A;make: *** [git-daemon] Error 1&amp;#x000A;make: *** Waiting for unfinished jobs....&amp;#x000A;make: *** [git-credential-store] Error 1&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;It turned out that libiconv was the culprit. Simply uninstall it:&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;brew remove libiconv&amp;#x000A;brew prune&amp;#x000A;brew cleanup&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;Then run &lt;code&gt;brew upgrade git&lt;/code&gt; again and things should work now.&lt;/p&gt;
      
      &lt;p&gt;I found the inspiration &lt;a href="https://gist.github.com/3195360"&gt;here&lt;/a&gt;.&lt;/p&gt;
      
      &lt;h2&gt;What is homebrew anyways&lt;/h2&gt;
      
      &lt;p&gt;Homebrew is a very easy to use and maintain package manager for
      Mac OS X environments. Anytime you want to install one of those
      unix-y tools, Homebrew is your friend.&lt;/p&gt;
      
      &lt;p&gt;Passed the initial installation, Homebrew is as simple to use as&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;brew install *something*&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;and you are good to go. Keeping versions up-to-date are very easy too&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;# update brew itself&amp;#x000A;brew update&amp;#x000A;# update tools installed with brew    &amp;#x000A;brew upgrade&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;For example here are a few things I have installed and maintain with
      Homebrew (aka brew for the friends).&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;git&lt;/li&gt;
      &lt;li&gt;keychain&lt;/li&gt;
      &lt;li&gt;mvim&lt;/li&gt;
      &lt;li&gt;mongodb&lt;/li&gt;
      &lt;li&gt;postgresql&lt;/li&gt;
      &lt;li&gt;rsync&lt;/li&gt;
      &lt;li&gt;unison&lt;/li&gt;
      &lt;li&gt;wget&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;That also includes some Java tools:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;gradle&lt;/li&gt;
      &lt;li&gt;maven&lt;/li&gt;
      &lt;li&gt;jboss-as&lt;/li&gt;
      &lt;li&gt;ceylon&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;Homebrew does not install as a privileged user - it is actually discouraged.
      That makes it a bit picky when permissions are not right.&lt;/p&gt;
      
      &lt;p&gt;I have been using &lt;a href="http://academic.cleardefinition.com/2011/01/06/quickie-fix-usrlocal-permissions-for-homebrew-on-mac-os-x/"&gt;this trick&lt;/a&gt; quite regularly with success.&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;ruby -e "$(curl -fsSL https://gist.github.com/raw/768518/fix_homebrew.rb)"&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;Enjoy&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/08/04/unable-to-update-git-from-homebrew/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/08/01/i-succumbed-to-the-cult-of-vi/</id>
    <title>I succumbed to the Cult of vi</title>
    <updated>2012-08-01T00:00:00Z</updated>
    <published>2012-08-01T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/PoeJQH2ZEdM/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I think I am seriously regressing as I grow older.
      
      I mentioned in the past moving from the popular, dynamic and UI
      based blog system Wordpress to the Ruby based static generator
      Awestruct. I also mentioned moving to Git
      and enjoying my command line more and more.
      On a tangential note, I do enjoy writing my verb in a pure textual
      form thanks to Markdown and use Git as my backup
      and memory system if you will.
      
      I think the natural evolution for me was to move to one of those
      archaic editors like vi or emacs... And I tried vi... and I
      can't say I liked it at first.
      
      Why...
    </summary>
    <content type="html">
      &lt;p&gt;I think I am seriously regressing as I grow older.&lt;/p&gt;
      
      &lt;p&gt;I mentioned in the past moving from the popular, dynamic and UI
      based blog system Wordpress to the Ruby based static generator
      &lt;a href="http://emmanuelbernard.com/blog/2011/07/08/awestruct-building-dynamic-static-web-sites/"&gt;Awestruct&lt;/a&gt;. I also mentioned moving to &lt;a href="http://emmanuelbernard.com/blog/2012/05/15/pro-tip-git-rebase/"&gt;Git&lt;/a&gt;
      and enjoying my &lt;a href="http://emmanuelbernard.com/blog/2012/02/28/customize-titles-of-your-terminal-window/"&gt;command line&lt;/a&gt; more and more.
      On a tangential note, I do enjoy writing my verb in a pure textual
      form thanks to &lt;a href="http://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt; and use Git as my backup
      and memory system if you will.&lt;/p&gt;
      
      &lt;p&gt;I think the natural evolution for me was to move to one of those
      archaic editors like &lt;em&gt;vi&lt;/em&gt; or emacs... And I tried &lt;em&gt;vi&lt;/em&gt;... and I
      can't say I liked it at first.&lt;/p&gt;
      
      &lt;h2&gt;Why oh why move to &lt;em&gt;vi&lt;/em&gt;?&lt;/h2&gt;
      
      &lt;p&gt;Emacs never attracted me, I have only ten fingers after all and
      there is only so much flexibility in my hands.
      &lt;em&gt;vi&lt;/em&gt; has the immense benefit of literally be available everywhere
      you &lt;code&gt;ssh&lt;/code&gt; in. I have always been acquainted with &lt;em&gt;vi&lt;/em&gt;: use &lt;code&gt;i&lt;/code&gt; to type
      and &lt;code&gt;ESC :q!&lt;/code&gt; if things go crazy.&lt;/p&gt;
      
      &lt;p&gt;Long time vimers keep claiming that once you get it, it's awesome.
      Since I have been proved wrong on Git - I thought Mercurial was
      better at that Git UX was an abomination for bearded people - I was
      rather curious.&lt;/p&gt;
      
      &lt;p&gt;A recent discussion with my friends of &lt;a href="http://lescastcodeurs.com"&gt;Les Cast Codeurs&lt;/a&gt;
      fame convinced me to try once again to jump on the bandwagon.&lt;/p&gt;
      
      &lt;h2&gt;So far not so bad&lt;/h2&gt;
      
      &lt;p&gt;In the beginning I felt that I was slow and that every line of text
      was draining a third of my energy for the day. And that was more than
      a feeling.&lt;/p&gt;
      
      &lt;p&gt;But it's really growing on me and this blog post is an attempt to
      understand why really. Yes reader, you're my private therapist.&lt;/p&gt;
      
      &lt;p&gt;I love good UIs but to be honest, for text documents, you don't
      really need it. I use &lt;a href="http://code.google.com/p/macvim/"&gt;MacVim&lt;/a&gt; with a decent set of coloring
      and syntax highlighting and I am happy with it. The key is that
      &lt;em&gt;vi&lt;/em&gt; is extremely powerful to fine-edit text and that even if hard
      to learn, you feel that there is something you can gain.&lt;/p&gt;
      
      &lt;h2&gt;What's bad about &lt;em&gt;vi&lt;/em&gt;&lt;/h2&gt;
      
      &lt;p&gt;For beginners or casual users, &lt;em&gt;vi&lt;/em&gt; the most horrible piece of user
      experience ever built. There is no visual or otherwise cue in case
      you don't know how to do something, no way to navigate menus to figure
      what can be done. You even need to be an accomplished &lt;em&gt;vi&lt;/em&gt; user and sort
      of already know what you do to begin to make sense of the help system.&lt;/p&gt;
      
      &lt;p&gt;But let's pretend you used Google and know enough to play around.
      Let's face it auto completion is very important in Java. Most of the time
      Java developers don't need doc, the API and auto completion are here to
      guide them. I often resort to Google for an API in Ruby or JavaScript,
      never in Java.&lt;/p&gt;
      
      &lt;p&gt;Now what's interesting is that IntelliJ IDEA (my Java editor) has a
      &lt;a href="http://code.google.com/p/macvim/"&gt;vi plugin&lt;/a&gt;, so does Eclipse. So you can use your &lt;em&gt;vi&lt;/em&gt; way of editing
      but still benefit from auto completion and code navigation.&lt;/p&gt;
      
      &lt;p&gt;The &lt;em&gt;vi&lt;/em&gt; plugin for IntelliJ is not perfect. It sometimes stops working and
      you need to close and reopen your file, and it has the tendency to override
      some common shortcuts (Command click for code navigation for example). But for
      the most part it works. I think in 2 weeks of use, I gave up the &lt;em&gt;vi&lt;/em&gt; mode twice.
      Not bad!&lt;/p&gt;
      
      &lt;p&gt;The other thing that's bad with &lt;em&gt;vi&lt;/em&gt; is that there is no native project
      view to navigate from one file to another in a project. I'm used to
      &lt;code&gt;Command-N&lt;/code&gt; in IntelliJ IDEA to open a Java class with a few camel case
      friendly keystrokes.&lt;/p&gt;
      
      &lt;p&gt;Vi has plugins to mimic that - &lt;em&gt;vi&lt;/em&gt; has plugins for everything by the way
      including ASCII diagram drawing tools. I have installed &lt;a href="http://www.vim.org/scripts/script.php?script_id=1658"&gt;NERDTree&lt;/a&gt; and
      &lt;a href="https://wincent.com/products/command-t/"&gt;Command-T&lt;/a&gt; so far but I don't feel it's sufficient. The visual reminder of
      the file hierarchy is quite useful in an IDE.&lt;/p&gt;
      
      &lt;p&gt;Likewise, copy / pasting especially between non &lt;em&gt;vi&lt;/em&gt; apps is not entirely
      fluid to me but I suspect it's a matter of training.&lt;/p&gt;
      
      &lt;h2&gt;What made me click&lt;/h2&gt;
      
      &lt;p&gt;There is no magic trick, you need to train your brain and your fingers to &lt;em&gt;vi&lt;/em&gt;.
      But there are two things that were key to make me understand how to use &lt;em&gt;vi&lt;/em&gt;:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;stay in insert mode (sort of the normal mode of any other editor) for
      the shortest period of time. Text manipulation is mostly done in command
      mode. So always come back to command mode.&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;vi&lt;/em&gt; is very regular, operations are made of an action and a move.
      The action describes what you want to do, and the move is about
      what the action will influence. On top of that, you can add a multiplier
      to repeat the operation several times.&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;So when you learn a new move or a new action, you can compound them to the
      ones you know already and create new operations for free.&lt;/p&gt;
      
      &lt;p&gt;After a while you like the game. Plus it's very easy to Google a given action
      and find how to do it efficiently.&lt;/p&gt;
      
      &lt;p&gt;The arrow vs &lt;code&gt;hjkl&lt;/code&gt; for navigation was essentially a non problem. I use what
      I am comfortable with: I started with arrows but I use almost exclusively
      &lt;code&gt;hjkl&lt;/code&gt; to move now as it makes my hand move less on the keyboard.
      Likewise, I use the mouse when I feel like moving around a lot. That might
      change down the road.&lt;/p&gt;
      
      &lt;p&gt;It has been roughly two weeks of coding and writing in &lt;em&gt;vi&lt;/em&gt; mode and I am
      now feeling that when I move back to a classic editor, I don't feel as efficient
      as I thought I was. I'm even tempted to say that I feel a bit more efficient now in
      &lt;em&gt;vi&lt;/em&gt;.&lt;/p&gt;
      
      &lt;p&gt;A lot of the efficiency comes from the powerful search tools. It turns out to be very
      efficient to navigate around text or code using small searches.&lt;/p&gt;
      
      &lt;h2&gt;Resources and conclusion&lt;/h2&gt;
      
      &lt;ul&gt;
      &lt;li&gt;a stackoverflow question on &lt;a href="http://stackoverflow.com/a/1220118/200911"&gt;the philosophy of &lt;em&gt;vi&lt;/em&gt; commands&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;the thought process of someone &lt;a href="http://stevelosh.com/blog/2010/09/coming-home-to-vim/"&gt;moving back to &lt;em&gt;vi&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;everything you need to know on &lt;a href="http://tedlogan.com/techblog3.html"&gt;tabulation and indenting in &lt;em&gt;vi&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;graphical &lt;a href="http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html"&gt;cheat sheet&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;If you want to make the jump, I recommend you:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;print the cheat sheets and keep them in front of you&lt;/li&gt;
      &lt;li&gt;read a few blogs on the philosophy of &lt;em&gt;vi&lt;/em&gt;&lt;/li&gt;
      &lt;li&gt;take the time to configure your (graphical) &lt;em&gt;vi(m)&lt;/em&gt; environment&lt;/li&gt;
      &lt;li&gt;jump and stick to it for most of your work&lt;/li&gt;
      &lt;li&gt;use a &lt;em&gt;vi&lt;/em&gt; plugin for your IDE: it is good to force you to use &lt;em&gt;vi&lt;/em&gt; without losing
      auto completion and co you need&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;That's all I have, it's not a tutorial on &lt;em&gt;vi&lt;/em&gt;, more my thoughts on the process.
      I'll keep you posted if I have more interesting things to say on the subject.
      Oh and of course this blog entry has been written in &lt;em&gt;vi&lt;/em&gt; :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/08/01/i-succumbed-to-the-cult-of-vi/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/06/21/instacast-podcast-app-for-ios/</id>
    <title>Instacast - Podcast App for iOS</title>
    <updated>2012-06-21T00:00:00Z</updated>
    <published>2012-06-21T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/jZ5lPOCQPFM/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Executive summary: I went for Instacast and so far I'm happy about it.
      
      In its grandiose lack of thinking, Apple has decided that when syncing an iOS with iCloud
      it no longer copies podcast episodes from your iTunes library when you sync up.
      
      They sort of know that a podcast is refreshed regularly so they added a get new episode button
      that brings you to the iTunes Store on your iOS. You then have to manually remember which episode
      you have read and which one you want to listen to. On top of that the default is to stream them.
      To download, you have to press...
    </summary>
    <content type="html">
      &lt;blockquote&gt;&lt;p&gt;Executive summary: I went for Instacast and so far I'm happy about it.&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;In its grandiose lack of thinking, Apple has decided that when syncing an iOS with iCloud
      it no longer copies podcast episodes from your iTunes library when you sync up.&lt;/p&gt;
      
      &lt;p&gt;They sort of know that a podcast is refreshed regularly so they added a &lt;code&gt;get new episode&lt;/code&gt; button
      that brings you to the iTunes Store on your iOS. You then have to manually remember which episode
      you have read and which one you want to listen to. On top of that the default is to stream them.
      To download, you have to press the arrow button for long enough but not too long.&lt;/p&gt;
      
      &lt;p&gt;In short, horrible experience!&lt;/p&gt;
      
      &lt;p&gt;So I looked around to find an actual podcast application that would fill these needs:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;maintain my list of podcast subscriptions&lt;/li&gt;
      &lt;li&gt;import my old list from the iOS Music app&lt;/li&gt;
      &lt;li&gt;share my subscriptions via iCloud and allow for export&lt;/li&gt;
      &lt;li&gt;download new episodes when available automatically&lt;/li&gt;
      &lt;li&gt;can be played in the background&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;Two seem to be considered better than the others, &lt;a href="http://vemedio.com/products/instacast"&gt;&lt;strong&gt;Instacast&lt;/strong&gt;&lt;/a&gt; and
      &lt;a href="http://www.downcastapp.com/"&gt;&lt;strong&gt;Downcast&lt;/strong&gt;&lt;/a&gt; which
      are $2 each. I went for Instacast as it is considered the more Apple-ish one in
      design - I mean the good one. Downcast is more feature rich from what I have
      read.&lt;/p&gt;
      
      &lt;p&gt;So far I like it, most podcasts could be imported, though one by one by clicking the Music
      icon and selecting the podcasts. 3 or 4 had some URL import error but I could easily find
      them from their search engine. Podcasts made by yours truly are also listed. That's a decent
      clue of a deep catalog.&lt;/p&gt;
      
      &lt;p&gt;All in all, don't hesitate to switch, you won't regret it. The only sad part is that I now
      need two different apps to listen to my music, audiobooks and podcasts.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/06/21/instacast-podcast-app-for-ios/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/06/14/migrating-a-wordpress-blog-to-awestruct/</id>
    <title>Migrating a Wordpress blog to Awestruct</title>
    <updated>2012-06-14T00:00:00Z</updated>
    <published>2012-06-14T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/y_GFpfii_Gg/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      As I said earlier, I moved my blog from a Wordpress instance to
      Awestruct, a framework for creating static HTML sites and blogs.
      
      The process is roughly made of these steps:
      
      
      Move comments to Disqus or another hosted service
      Initialize Awestruct's structure
      Import the blog posts from Wordpress to Awestruct
      Add the necessary Awestruct extensions
      Write the correct redirect rules
      
      
      
      Moving comments to a hosted service
      
      Because Awestruct is a static HTML generator, you need to use a hosted service
      like IntenseDebate or Disqus. I personally use Disqus.
      The import process is easy and involve installing a Disqus plugin in your Wordpress
      instance.
      
      Initialize Awestruct's structure
      
      Awestruct has a decent getting started section but...
    </summary>
    <content type="html">
      &lt;p&gt;As I said &lt;a href="http://emmanuelbernard.com/blog/2012/04/10/the-perfect-storm-creates-new-website-and-blog/"&gt;earlier&lt;/a&gt;, I moved my blog from a Wordpress instance to
      &lt;a href="http://awestruct.org"&gt;Awestruct&lt;/a&gt;, a framework for creating static HTML sites and blogs.&lt;/p&gt;
      
      &lt;p&gt;The process is roughly made of these steps:&lt;/p&gt;
      
      &lt;ol&gt;
      &lt;li&gt;Move comments to Disqus or another hosted service&lt;/li&gt;
      &lt;li&gt;Initialize Awestruct's structure&lt;/li&gt;
      &lt;li&gt;Import the blog posts from Wordpress to Awestruct&lt;/li&gt;
      &lt;li&gt;Add the necessary Awestruct extensions&lt;/li&gt;
      &lt;li&gt;Write the correct redirect rules&lt;/li&gt;
      &lt;/ol&gt;
      
      
      &lt;h2&gt;Moving comments to a hosted service&lt;/h2&gt;
      
      &lt;p&gt;Because Awestruct is a static HTML generator, you need to use a hosted service
      like &lt;a href="http://intensedebate.com/"&gt;IntenseDebate&lt;/a&gt; or &lt;a href="http://disqus.com/"&gt;Disqus&lt;/a&gt;. I personally use Disqus.
      The import process is easy and involve installing a Disqus plugin in your Wordpress
      instance.&lt;/p&gt;
      
      &lt;h2&gt;Initialize Awestruct's structure&lt;/h2&gt;
      
      &lt;p&gt;Awestruct has a decent &lt;a href="http://awestruct.org/getting_started/"&gt;getting started&lt;/a&gt; section but I find the easiest
      approach is to fork an existing Awestruct example and change what you want. You can take
      &lt;a href="https://github.com/emmanuelbernard/emmanuelbernard.com/"&gt;my website source&lt;/a&gt; as an example if you want.&lt;/p&gt;
      
      &lt;h2&gt;Import blog posts&lt;/h2&gt;
      
      &lt;p&gt;I wanted to keep my old content and get rid of the Wordpress instance. In Wordpress,
      export your blog content (&lt;code&gt;Tools-&amp;gt;Export&lt;/code&gt;, all content). The XML file will be used
      to create the various blog entries in Awestruct.&lt;/p&gt;
      
      &lt;p&gt;The import script is available &lt;a href="https://github.com/emmanuelbernard/emmanuelbernard.com/blob/master/_bin/import"&gt;here&lt;/a&gt; and takes the Wordpress xml file
      and the output directory. In my case my blog is at &lt;a href="http://emmanuelbernard.com/blog/"&gt;http://emmanuelbernard.com/blog/&lt;/a&gt;&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;./_bin/import ~/Downloads/wordpress-export.xml ./blog&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;Edit it to reference your previous blog URL. With that the script
      will make sure local images, PDF etc are properly imported as well instead of
      simply referenced.&lt;/p&gt;
      
      &lt;p&gt;For each blog entry, a &lt;code&gt;.erb&lt;/code&gt; file is created.&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;p&gt;Note that the import process might fail. Don't worry, simply read the error message and
      try and fix the xml file and run the import process again. In my case, I needed to add
      an empty line right before &lt;code&gt;&amp;lt;/pre&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;/blockquote&amp;gt;&lt;/code&gt; elements. After a few stop and go
      you will have your data fully imported.&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;h2&gt;Add the necessary Awestruct extensions&lt;/h2&gt;
      
      &lt;p&gt;Blogs in Awestruct are build by a few extensions:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;&lt;code&gt;Posts&lt;/code&gt;: creates the blog structure and pages based on the content of a directory&lt;/li&gt;
      &lt;li&gt;&lt;code&gt;Paginator&lt;/code&gt; (optional): paginate the blog entries&lt;/li&gt;
      &lt;li&gt;&lt;code&gt;Tagger&lt;/code&gt; (optional): generate the tag structure and pages&lt;/li&gt;
      &lt;li&gt;&lt;code&gt;TagCloud&lt;/code&gt; (optional): generate a tag cloud&lt;/li&gt;
      &lt;li&gt;&lt;code&gt;Atomizer&lt;/code&gt;: generate the atom feed&lt;/li&gt;
      &lt;li&gt;&lt;code&gt;Disqus&lt;/code&gt;: add the Disqus integration to your site&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;Check out &lt;a href="https://github.com/emmanuelbernard/emmanuelbernard.com/"&gt;my website source&lt;/a&gt; for an example. Note that at the time of writing,
      I use some custom versions of these extensions but these changes are being pushed to Awestruct.&lt;/p&gt;
      
      &lt;h2&gt;Write the correct redirect rules&lt;/h2&gt;
      
      &lt;p&gt;If your URL structure has changed either because of a relative URL change, because you move
      to a new (sub)domain or both, you will need to write 301 redirect rules:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;old links spread on the internet will still work&lt;/li&gt;
      &lt;li&gt;people registered to your old feed will not get lost&lt;/li&gt;
      &lt;li&gt;Google will understand you moved your blog, reindex it and remove the old references&lt;/li&gt;
      &lt;li&gt;Disqus will move your comments from the old blog to the new blog&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;In my .htaccess file, you can see 5 main redirections:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;redirect / from the old domain to the new domain&lt;/li&gt;
      &lt;li&gt;redirect the old feed to the new feed&lt;/li&gt;
      &lt;li&gt;redirect old posts to new posts (with a regexp or manual)&lt;/li&gt;
      &lt;li&gt;redirect category urls to the new tag urls&lt;/li&gt;
      &lt;li&gt;redirect anything else to the new blog&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;Let's look at the file&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;RewriteEngine on&amp;#x000A;RewriteCond %{HTTP_HOST} ^blog.emmanuelbernard.com$&amp;#x000A;&amp;#x000A;# Old feed redirected&amp;#x000A;RewriteRule feed/ http://emmanuelbernard.com/blog/feed.atom [R=301,L]&amp;#x000A;&amp;#x000A;# Redirect 2012/04/07/something to http://emmanuelbernard.com/blog/2012/04/07/something&amp;#x000A;RewriteRule ([0-2][0-9][0-9][0-9])/([0-1][0-9])/([0-3][0-9])/([^/]+)/ http://emmanuelbernard.com/blog/$1/$2/$3/$4/ [R=301,L]&amp;#x000A;&amp;#x000A;# Redirect category/slug to http://emmanuelbernard.com/tags/slug&amp;#x000A;RewriteRule category/([^/]+)/ http://emmanuelbernard.com/blog/tags/$1/ [R=301,L]&amp;#x000A;&amp;#x000A;# Top level url redurect&amp;#x000A;RewriteRule ^/?$ http://emmanuelbernard.com/blog/ [R=301,L]&amp;#x000A;&amp;#x000A;# Manual redirect form old URL scheme yyyy/mm to new blog&amp;#x000A;RewriteRule 2007/01/activerecord-pattern-so-what[/]? http://emmanuelbernard.com/blog/2007/01/07/activerecord-pattern-so-what/ [R=301,L]&amp;#x000A;# ...&amp;#x000A;&amp;#x000A;# Redirect anything else to new blog&amp;#x000A;RewriteRule ^(.*)$ http://emmanuelbernard.com/blog/&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;Because my old url scheme was &lt;code&gt;yyyy/mm/slug&lt;/code&gt; and the new one is &lt;code&gt;yyyy/mm/dd/slug&lt;/code&gt;,
      I could not write a regexp based redirect rules. But I used a small Ruby script
      to convert the old URLs to the new URLs based on the content of my Awestruct blog
      directory. Check out the &lt;a href="https://github.com/emmanuelbernard/emmanuelbernard.com/blob/master/_bin/htaccess-generator.rb"&gt;script here&lt;/a&gt;.&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;#!/usr/bin/env ruby&amp;#x000A;#&amp;#x000A;# Generate a htaccess rule for each old blog entry from&amp;#x000A;# http://blog.emmanuelbernard.com/yyyy/mm/slug to http://emmanuelbernard.com/blog/yyyy/mm/dd/slug&amp;#x000A;# Has to be manual as the day is unknown in the URL&amp;#x000A;#&amp;#x000A;Dir.foreach("../blog") { |file| &amp;#x000A;    if (file =~ /(20[0-1][0-9])-([0-1][0-9])-([0-3][0-9])-([^\/]+).html.erb/)&amp;#x000A;        result = "RewriteRule " &amp;lt;&amp;lt; $1 &amp;lt;&amp;lt; "/" &amp;lt;&amp;lt; $2 &amp;lt;&amp;lt; "/" &amp;lt;&amp;lt; $4 &amp;lt;&amp;lt; "[/]?"&amp;#x000A;        result = result &amp;lt;&amp;lt; " http://emmanuelbernard.com/blog/"&amp;#x000A;        result = result &amp;lt;&amp;lt; $1 &amp;lt;&amp;lt; "/" &amp;lt;&amp;lt; $2 &amp;lt;&amp;lt; "/" &amp;lt;&amp;lt; $3 &amp;lt;&amp;lt; "/" &amp;lt;&amp;lt; $4 &amp;lt;&amp;lt; "/ [R=301,L]"&amp;#x000A;        puts result&amp;#x000A;    end&amp;#x000A;}&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;h2&gt;Publish&lt;/h2&gt;
      
      &lt;p&gt;Publish your Awestruct website on your server and test :)&lt;/p&gt;
      
      &lt;p&gt;The final step is to ask Disqus to listen to the 301 redirects to attach the old comments to the new
      Blog entries. It's in &lt;code&gt;Admin -&amp;gt; Migrate tools -&amp;gt; Redirect Crawler&lt;/code&gt;.&lt;/p&gt;
      
      &lt;p&gt;And voilà! You have a fully upgraded blog :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/06/14/migrating-a-wordpress-blog-to-awestruct/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/06/11/flash-gordon-et-le-permis-a-points/</id>
    <title>Flash Gordon et le permis à points</title>
    <updated>2012-06-11T00:00:00Z</updated>
    <published>2012-06-11T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/cnZyipsauJM/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      C'est l'histoire de Flash Gordon qui allait tranquillement chez des amis et qui rencontre un radar fixe :
      clic-clac Kodak, 1 point et 68 €, circuler, y a rien à voir.
      
      Merci les amis pour habiter si loin. Du coup, je me suis renseigné sur les contraventions routières et
      leurs sanctions en France. Voici le tableau complet mais je voulais vous lister les
      quelques unes qui m'ont amusé:
      
      B.I. sans I.T.T. par manquement délibéré à une obligation de sécurité - 1500 € et suspension de permis de 3 ans
      
      On ne dit pas ce que B.I. sans I.T.T. veut dire mais c'est 1500€ et suspensions de...
    </summary>
    <content type="html">
      &lt;p&gt;C'est l'histoire de Flash Gordon qui allait tranquillement chez des amis et qui rencontre un radar fixe&amp;nbsp;:
      clic-clac Kodak, 1 point et 68 €, circuler, y a rien à voir.&lt;/p&gt;
      
      &lt;p&gt;Merci les amis pour habiter si loin. Du coup, je me suis renseigné sur les contraventions routières et
      leurs sanctions en France. Voici le &lt;a href="http://www2.securiteroutiere.gouv.fr/IMG/pdf/sric3_tableau_contraventions_et_sanctions_mars_2007.pdf"&gt;tableau complet&lt;/a&gt; mais je voulais vous lister les
      quelques unes qui m'ont amusé:&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;p&gt;B.I. sans I.T.T. par manquement délibéré à une obligation de sécurité - 1500 € et suspension de permis de 3 ans&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;On ne dit pas ce que B.I. sans I.T.T. veut dire mais c'est 1500€ et suspensions de permis de 3 ans.
      Pour votre culture personnelle: &lt;em&gt;blessures involontaires sans incapacité temporaire totale&lt;/em&gt;.&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;p&gt;Transport, détention, usage d'appareil destiné à déceler ou perturber les contrôles - 1500 €, 2 points, 3 ans&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;On comprend les discussions de Coyote et &lt;a href="http://www.abonentendeur.com/"&gt;A Bon Entendeur&lt;/a&gt; pour ne pas tomber dans cette catégorie :)&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;p&gt;Circulation de véhicule sur une barrière de dégel - 1500 € et 3 ans&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;En bon parisien, je ne savais pas ce qu'était une barrière de dégel. D'apres &lt;a href="http://fr.wikipedia.org/wiki/Barri%C3%A8re_de_d%C3%A9gel"&gt;Wikipedia&lt;/a&gt;, c'est une
      interdiction de circulation temporaire sur une route donnée pour les gros tonnages en cas de dégel. L'idée est
      de préserver la chaussée fragilisée par le dégel non homogène.&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;p&gt;Conduite en état alcoolique (≥0,10mg/l et &amp;lt;0,4mg/l dans l'air expiré ou ≥0,2g/l et &amp;lt;0,8g/l dans le sang)
      par conducteur d'un véhicule de transport en commun - 135 €, 6 points, 3 ans&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;Ça rassure, le niveau d'alcoolémie d'un conducteur d'engin publique est en plus drastique.&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;p&gt;Circulation de nuit ou par visibilité insuffisante sans éclairage - 135 €, 4 points, 3 ans&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;Batman, fait gaffe!&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;p&gt;Circulation à gauche sur chaussée à double sens - 135 €, 3 points, 3 ans&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;Reine Mère ou pas, on roule à droite en France.&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;p&gt;Accélération par conducteur sur le point d'être dépassé - 135 €, 2 points, 3 ans&lt;/p&gt;
      
      &lt;p&gt;Refus de serrer à droite par conducteur sur le point d'être dépassé - 135 €&lt;/p&gt;
      
      &lt;p&gt;Circulation sur bande d'arrêt d'urgence - 35 €, 3 points, 3 ans&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;Si vous êtes un gros con voire juste un gros boulet, c'est l'amende&amp;nbsp;!&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;p&gt;Circulation sur bande centrale séparative d'autoroute - 135 €, 2 points, 3 ans&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;A mon avis, ce conducteur là cumule avec l'alcoolémie.&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;p&gt;Distribution d'imprimé ou d'objet au conducteur ou à l'occupant d'un véhicule circulant
      sur une voie publique - 135 €&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;L'histoire de dit pas si la pénalité vaut si on distribue de dehors ou de dedans.&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;p&gt;Circulation d'un véhicule non équipé de dispositifs de freinage conformes - 68 €&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;Si vous roulez sans freins, c'est moins pénalisé que l'excès de vitesse en dessous de 20 km/h.&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;p&gt;Non acquittement du péage d'un ouvrage routier - 35 €&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;Ça devient rentable...&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;p&gt;Contraventions commises par les piétons - 4 €&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;Faites comme moi, roulez en trottinette !&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/06/11/flash-gordon-et-le-permis-a-points/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/06/05/how-to-control-virtualbox-instancesfrom-the-command-line/</id>
    <title>How to control VirtualBox instances from the command line</title>
    <updated>2012-06-05T00:00:00Z</updated>
    <published>2012-06-05T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/Z99c9KLZSJo/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I got tired of using the graphical interface of VirtualBox to start and stop my VM.
      After a little googling, I have found a very neat script that lets you control everything
      from the command line.
      
      The script is detailed on Carlos Acosta's blog and you can download it directly here.
      One neat thing is that the VM is run headless. One less visual pollution floating around.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;I got tired of using the graphical interface of VirtualBox to start and stop my VM.
      After a little googling, I have found a very neat script that lets you control everything
      from the command line.&lt;/p&gt;
      
      &lt;p&gt;The script is detailed on &lt;a href="http://oracleexamples.wordpress.com/2011/08/12/virtualbox-script-to-control-virtual-machines/"&gt;Carlos Acosta's blog&lt;/a&gt; and you can download it directly &lt;a href="http://db.tt/lE2g7lZ"&gt;here&lt;/a&gt;.
      One neat thing is that the VM is run headless. One less visual pollution floating around.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/06/05/how-to-control-virtualbox-instancesfrom-the-command-line/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/05/15/pro-tip-git-rebase/</id>
    <title>Pro tip on git rebase -i</title>
    <updated>2012-05-15T00:00:00Z</updated>
    <published>2012-05-15T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/oR4d6N9_kTs/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Here is a small tip to improve your efficiency when using dynamic rebasing in Git.
      
      I do my work on topic branches that are forked of master. Before I push my work for review
      via a GitHub pull request, I like to clean it up a bit by:
      
      
      reordering some commits
      squashing some commits together
      rewriting commit messages
      
      
      
      Nothing fancy but it helps improve history readability.
      
      You can of course do that by using git rebase -i and most examples show
      how you can go back in time a couple of commits.
      
      git rebase -i HEAD^4 #go back 4 commits ago
      
      
      There is a nicer and more efficient to do...
    </summary>
    <content type="html">
      &lt;p&gt;Here is a small tip to improve your efficiency when using dynamic rebasing in Git.&lt;/p&gt;
      
      &lt;p&gt;I do my work on topic branches that are forked of &lt;code&gt;master&lt;/code&gt;. Before I push my work for review
      via a GitHub pull request, I like to clean it up a bit by:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;reordering some commits&lt;/li&gt;
      &lt;li&gt;squashing some commits together&lt;/li&gt;
      &lt;li&gt;rewriting commit messages&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;Nothing fancy but it helps improve history readability.&lt;/p&gt;
      
      &lt;p&gt;You can of course do that by using &lt;code&gt;git rebase -i&lt;/code&gt; and most examples show
      how you can go back in time a couple of commits.&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;git rebase -i HEAD^4 #go back 4 commits ago&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;There is a nicer and more efficient to do that when you work on topic branches&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;git rebase -i master&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;That's it. Pretty stupid but, since you can put any Git object reference, why not use
      the object where you started to fork off? The rebase will show you all commits between
      master and your branch.&lt;/p&gt;
      
      &lt;p&gt;If you are on a Mac, I highly recommend using &lt;a href="http://gitx.frim.nl/"&gt;GitX&lt;/a&gt; or one of his forks.
      In particular, you can amend the last commit and graphically select what should be
      staged and unstaged.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/05/15/pro-tip-git-rebase/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/05/09/setting-global-variables-intellij/</id>
    <title>Setting global environment variables in IntelliJ IDEA and other test config goodies</title>
    <updated>2012-05-09T00:00:00Z</updated>
    <published>2012-05-09T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/WEl8SKHtKcw/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      When you run a test from IntelliJ idea, you can customize some of
      the settings by selecting the list of tests and click Edit Configurations.
      From there you can change things like:
      
      
      under which module classpath the test is run
      the working directory the test should run from
      virtual machine parameters
      specific environment variables to use
      
      
      
      In Hibernate OGM, we use the same test site for all NoSQL solutions. Changing the
      module classpath is useful in this situation. We also let you refine via an environment
      variable which hostname runs say MongoDB.
      
      Unfortunately in Mac OS X, graphic applications do not inherit your .bash_profile config. I know, stupid,
      but what can...
    </summary>
    <content type="html">
      &lt;p&gt;When you run a test from IntelliJ idea, you can customize some of
      the settings by selecting the list of tests and click &lt;code&gt;Edit Configurations&lt;/code&gt;.
      From there you can change things like:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;under which module classpath the test is run&lt;/li&gt;
      &lt;li&gt;the working directory the test should run from&lt;/li&gt;
      &lt;li&gt;virtual machine parameters&lt;/li&gt;
      &lt;li&gt;specific environment variables to use&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;In Hibernate OGM, we use the same test site for all NoSQL solutions. Changing the
      module classpath is useful in this situation. We also let you refine via an environment
      variable which hostname runs say MongoDB.&lt;/p&gt;
      
      &lt;p&gt;Unfortunately in Mac OS X, graphic applications do not inherit your &lt;code&gt;.bash_profile&lt;/code&gt; config. I know, stupid,
      but what can you do against the Empire? Workaround!&lt;/p&gt;
      
      &lt;p&gt;You can set environment variables from each test but it gets tedious quickly. Alternatively, you can set
      an environment variable globally in IntelliJ - what they call parent environment variables.
      Go to &lt;code&gt;Preferences&lt;/code&gt; and search for &lt;code&gt;Path Variables&lt;/code&gt;.
      Set your global environment variables here and you are good to go. Note that you can ask a test not to
      inherit these global variables if you want to - in the test configuration.&lt;/p&gt;
      
      &lt;hr /&gt;
      
      &lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;br /&gt;
      It turns out I was wrong. Paths Variables is not where global environment variables can be set. If you
      know where, please let me know.&lt;/p&gt;
      
      &lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt;&lt;br /&gt;
      To set an environment variable visible by applications in Mac OS X, use&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;launchctl setenv MYPATH myvar&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;then restart your IDE (you might need to log out and back in as well).&lt;/p&gt;
      
      &lt;p&gt;Thanks &lt;a href="http://twitter.com/aagahi"&gt;@aagahi&lt;/a&gt; for the info. This is not great as it's remote from my IDE but at least that works.
      BTW, &lt;code&gt;launchctl&lt;/code&gt; is supposed to set the data in &lt;code&gt;/etc/lanuchd.conf&lt;/code&gt; or &lt;code&gt;$HOME/.launchd.conf&lt;/code&gt;. Not on my
      system. If anyone knows where the data is put, I'm interested.&lt;/p&gt;
      
      &lt;hr /&gt;
      
      &lt;p&gt;Notes to JetBrains:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;your environment variable UI is plain counter productive: either give us a text free area or make tabs and co working&lt;/li&gt;
      &lt;li&gt;an option to inherit the &lt;code&gt;.bash_profile&lt;/code&gt; configuration would be awesome :)&lt;/li&gt;
      &lt;/ul&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/05/09/setting-global-variables-intellij/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/04/27/dog-vs-cat-diary/</id>
    <title>Dog vs Cat diary</title>
    <updated>2012-04-27T00:00:00Z</updated>
    <published>2012-04-27T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/Vg-NqSpVZv8/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      This is not new by any means but I recently saw this joke. As a recent dog owner
      I must admit I found it too true to not laugh.
      
      Excerpts from a dog's diary
      
      8:00 am - Dog food! My favorite thing!
      9:30 am - A car ride! My favorite thing!
      9:40 am - A walk in the park! My favorite thing!
      10:30 am - Got rubbed and petted! My favorite thing!
      12:00 pm - Lunch! My favorite thing!
      1:00 pm - Played in the yard! My favorite thing!
      3:00 pm - Wagged my tail! My favorite thing!
      5:00 pm - Milk bones! My favorite thing!
      7:00 pm - Got to...
    </summary>
    <content type="html">
      &lt;p&gt;This is not new by any means but I recently saw this joke. As a recent dog owner
      I must admit I found it too true to not laugh.&lt;/p&gt;
      
      &lt;h2&gt;Excerpts from a dog's diary&lt;/h2&gt;
      
      &lt;p&gt;8:00 am - Dog food! My favorite thing!&lt;br /&gt;
      9:30 am - A car ride! My favorite thing!&lt;br /&gt;
      9:40 am - A walk in the park! My favorite thing!&lt;br /&gt;
      10:30 am - Got rubbed and petted! My favorite thing!&lt;br /&gt;
      12:00 pm - Lunch! My favorite thing!&lt;br /&gt;
      1:00 pm - Played in the yard! My favorite thing!&lt;br /&gt;
      3:00 pm - Wagged my tail! My favorite thing!&lt;br /&gt;
      5:00 pm - Milk bones! My favorite thing!&lt;br /&gt;
      7:00 pm - Got to play ball! My favorite thing!&lt;br /&gt;
      8:00 pm - Wow! Watched TV with the people! My favorite thing!&lt;br /&gt;
      11:00 pm - Sleeping on the bed! My favorite thing!&lt;/p&gt;
      
      &lt;h2&gt;Excerpts from a Cat's diary&lt;/h2&gt;
      
      &lt;p&gt;Day 983 of my captivity.&lt;/p&gt;
      
      &lt;p&gt;My captors continue to taunt me with bizarre little dangling objects.
      They dine lavishly on fresh meat, while the other inmates and I are fed hash or some sort of
      dry nuggets. Although I make my contempt for the rations perfectly clear, I nevertheless must eat something
      in order to keep up my strength. The only thing that keeps me going is my dream of escape.
      In an attempt to disgust them, I once again vomit on the carpet.&lt;/p&gt;
      
      &lt;p&gt;Today I decapitated a mouse and dropped its headless body at their feet. I had hoped this would strike fear
      into their hearts, since it clearly demonstrates what I am capable of. However, they merely made condescending
      comments about what a "good little hunter" I am. Bastards!&lt;/p&gt;
      
      &lt;p&gt;There was some sort of assembly of their accomplices tonight. I was placed in solitary confinement for the duration of the event.
      However, I could hear the noises and smell the food. I overheard that my confinement was due to the power of "allergies".
      I must learn what this means, and how to use it to my advantage. Today I was almost successful in an attempt to assassinate
      one of my tormentors by weaving around his feet as he was walking. I must try this again tomorrow but at the top of the stairs.&lt;/p&gt;
      
      &lt;p&gt;I am convinced that the other prisoners here are flunkies and snitches. The dog receives special privileges. He is regularly released
      and seems to be more than willing to return. He is obviously retarded. The bird has got to be an informant. I observe him
      communicate with the guards regularly. I am certain that he reports my every move. My captors have arranged protective custody
      for him in an elevated cell, so he is safe, for now...&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/04/27/dog-vs-cat-diary/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/04/26/bash-script-to-expand-file-templates/</id>
    <title>Bash script to expand file templates</title>
    <updated>2012-04-26T00:00:00Z</updated>
    <published>2012-04-26T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/8r_wQHMGlRc/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I am working on pushing all my "dotfiles" into a Git repo. Some contains passwords
      or other private data. It took me longer than expected to write an expander script
      in bash. So here it is.
      
      Properties are stored as Java properties.
      
      gittoken=123456789012345ab3bc
      backup_destination=emmanuel@devnull.com:./backup
      
      
      The template uses the $placeholder syntax.
      
      # .gitconfig file
      [user]
          name = Emmanuel Bernard
      [github]
          user = emmanuelbernard
          token = $gittoken 
      [alias]
          co = checkout
          undo = reset --hard
          cb = checkout -b
          br = branch
          cp = cherry-pick
      [random]
        ...
    </summary>
    <content type="html">
      &lt;p&gt;I am working on pushing all my "dotfiles" into a Git repo. Some contains passwords
      or other private data. It took me longer than expected to write an expander script
      in bash. So here it is.&lt;/p&gt;
      
      &lt;p&gt;Properties are stored as Java properties.&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;gittoken=123456789012345ab3bc&amp;#x000A;backup_destination=emmanuel@devnull.com:./backup&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;The template uses the &lt;code&gt;$placeholder&lt;/code&gt; syntax.&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;# .gitconfig file&amp;#x000A;[user]&amp;#x000A;    name = Emmanuel Bernard&amp;#x000A;[github]&amp;#x000A;    user = emmanuelbernard&amp;#x000A;    token = $gittoken &amp;#x000A;[alias]&amp;#x000A;    co = checkout&amp;#x000A;    undo = reset --hard&amp;#x000A;    cb = checkout -b&amp;#x000A;    br = branch&amp;#x000A;    cp = cherry-pick&amp;#x000A;[random]&amp;#x000A;    complex-backup-link = $backup_destination&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;The script is used like&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;./properties-expander.sh &amp;lt;properties file&amp;gt; &amp;lt;template&amp;gt; &amp;lt;destination&amp;gt;&amp;#x000A;&amp;#x000A;# For example&amp;#x000A;./properties-expander.sh ~/secret.properties ~/templates/gitconfig ~/.gitconfig&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;The script itself is fairly compact though some parts were fairly tricky
      - thanks &lt;a href="http://stackoverflow.com"&gt;stackoverflow&lt;/a&gt; :) :&lt;/p&gt;
      
      &lt;pre&gt;&lt;code&gt;#!/bin/bash&amp;#x000A;#&amp;#x000A;# Released under the WTFPL license version 2 http://sam.zoy.org/wtfpl/&amp;#x000A;# Copyright (c) 2012 Emmanuel Bernard&amp;#x000A;# -----&amp;#x000A;# Usage: properties-expander.sh &amp;lt;properties file&amp;gt; &amp;lt;template&amp;gt; &amp;lt;destination&amp;gt;&amp;#x000A;#&amp;#x000A;# Properties file:&amp;#x000A;#   PROPERTY1=value1&amp;#x000A;#   PROPERTY2=value2&amp;#x000A;&amp;#x000A;#help&amp;#x000A;if [[ $# -ne 3 ]]; then &amp;#x000A;  echo "properties-expander.sh &amp;lt;properties file&amp;gt; &amp;lt;template&amp;gt; &amp;lt;destination&amp;gt;"&amp;#x000A;  exit 0;&amp;#x000A;fi&amp;#x000A;&amp;#x000A;echo Expanding $2 to $3 with properties from $1&amp;#x000A;&amp;#x000A;#read each line including the last one&amp;#x000A;while IFS=$'\n' read -r line || [[ -n "$line" ]]; do&amp;#x000A;    #get the property name before the first =&amp;#x000A;    property=${line%%=*}&amp;#x000A;    #get the value after the first =&amp;#x000A;    value=${line#*=}&amp;#x000A;&amp;#x000A;    #find a suitable separation character as the value might contain /&amp;#x000A;    candidates='/:.|@#%^&amp;amp;;,!~abcABC'  # candidates for separation character&amp;#x000A;    char=$(echo "$candidates" | tr -d "$line")  &amp;#x000A;    char=${char:0:1}   # choose the first candidate that doesn't appear in the user input&amp;#x000A;&amp;#x000A;    if [ -z "$char" ]    # this test checks for exhaustion of the candidate character set&amp;#x000A;    then&amp;#x000A;        echo "Unusable user input: $line"&amp;#x000A;        exit 1&amp;#x000A;    fi&amp;#x000A;&amp;#x000A;    #add regexp rule&amp;#x000A;    SEDEXEC="s${char}\$$property${char}$value${char}g;$SEDEXEC"&amp;#x000A;done &amp;lt; $1&amp;#x000A;&amp;#x000A;SEDEXEC="sed -e '$SEDEXEC' $2 &amp;gt; $3"&amp;#x000A;eval $SEDEXEC&amp;#x000A;&lt;/code&gt;&lt;/pre&gt;
      
      &lt;p&gt;For simplicity, I have put the script in a GitHub &lt;a href="https://gist.github.com/2500305"&gt;gist&lt;/a&gt;. Please fork, improve and
      give me feedback :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/04/26/bash-script-to-expand-file-templates/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/04/12/what-design-philosophy-for-your-projects/</id>
    <title>What design philosophy for your projects?</title>
    <updated>2012-04-12T00:00:00Z</updated>
    <published>2012-04-12T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/N5kGQZns3ME/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      We had a hotted debate recently in the Hibernate Validator team on a given feature.
      As a result, we started to write down our design philosophy for the library.
      This is still a work in progress but here it is (original here):
      
      The goal of these projects is to improve developer productivity and ease of use.
      
      When adding a feature, we ask this pool of questions:
      
      
      Does it feel like the right way of doing things?
      If it is not we tend to wait till the idea matures
      Can it be done with an existing construct with similar or less complexity?
      Several ways of doing things is counter...
    </summary>
    <content type="html">
      &lt;p&gt;We had a hotted debate recently in the Hibernate Validator team on a given feature.
      As a result, we started to write down our design philosophy for the library.
      This is still a work in progress but here it is (&lt;a href="https://community.jboss.org/wiki/DesignPhilosophyOfTheHibernateProjects"&gt;original here&lt;/a&gt;):&lt;/p&gt;
      
      &lt;p&gt;The goal of these projects is to improve developer productivity and ease of use.&lt;/p&gt;
      
      &lt;p&gt;When adding a feature, we ask this pool of questions:&lt;/p&gt;
      
      &lt;blockquote&gt;&lt;ol&gt;
      &lt;li&gt;Does it feel like the right way of doing things?&lt;br /&gt;
      If it is not we tend to wait till the idea matures&lt;/li&gt;
      &lt;li&gt;Can it be done with an existing construct with similar or less complexity?&lt;br /&gt;
      Several ways of doing things is counter productive&lt;/li&gt;
      &lt;li&gt;Is this feature wrong?&lt;br /&gt;
      Does it encourage bad practice for example?&lt;/li&gt;
      &lt;li&gt;Is this a popular request?&lt;/li&gt;
      &lt;li&gt;Is this feature useful?&lt;br /&gt;
      That is the reason for asking "What's your use case?"&lt;/li&gt;
      &lt;li&gt;Is it the most readable approach?&lt;/li&gt;
      &lt;li&gt;Is the feature designed consistently with the rest of the library?&lt;/li&gt;
      &lt;/ol&gt;
      
      
      &lt;p&gt;None of these questions should slow down innovation but we want high quality libraries. Keeping them both useful and simple is a
      constant battle against the easier way of adding features ad nauseum. The team believes it is his responsibility to be the
      guardian of these principles. We are here to make the world a better place, not give food to guideline writers.&lt;/p&gt;&lt;/blockquote&gt;
      
      &lt;p&gt;What do you think? And what are your design philosophies?&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/04/12/what-design-philosophy-for-your-projects/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/04/11/feedback-on-twitter-bootstrap/</id>
    <title>Feedback on Twitter Bootstrap</title>
    <updated>2012-04-11T00:00:00Z</updated>
    <published>2012-04-11T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/mfSarfklRbE/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Everyone and his dog is in love with Twitter Bootstrap, so I figured I would give it a try and
      build my website with it.
      
      What is Twitter Bootstrap
      
      Twitter Bootstrap is a HTML(5), CSS and JavaScript toolkit offering a grid based scaffolding and a set of
      UI components to quickly get started. And best of all it does not look bad :)
      
      It is not too difficult to get into it. While it will not really revolutionize people already familiar with
      Blueprint CSS and CSS in general, it does however bring a set of standardized components
      that tend to bring good practice to your website:
      
      
      nice styling...
    </summary>
    <content type="html">
      &lt;p&gt;Everyone and his dog is in love with &lt;a href="http://github.com/bootstrap/"&gt;Twitter Bootstrap&lt;/a&gt;, so I figured I would give it a try and
      build my website with it.&lt;/p&gt;
      
      &lt;h2&gt;What is Twitter Bootstrap&lt;/h2&gt;
      
      &lt;p&gt;Twitter Bootstrap is a HTML(5), CSS and JavaScript toolkit offering a grid based scaffolding and a set of
      UI components to quickly get started. And best of all it does not look bad :)&lt;/p&gt;
      
      &lt;p&gt;It is not too difficult to get into it. While it will not really revolutionize people already familiar with
      &lt;a href="http://blueprintcss.org/"&gt;Blueprint CSS&lt;/a&gt; and CSS in general, it does however bring a set of standardized components
      that tend to bring good practice to your website:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;nice styling for common constructs like code, tables, inputs etc&lt;/li&gt;
      &lt;li&gt;nice set of sprited icons for various elements&lt;/li&gt;
      &lt;li&gt;good looking buttons and labels&lt;/li&gt;
      &lt;li&gt;nice navigation tools like breadcrumbs, pagination, and of course nav bars&lt;/li&gt;
      &lt;li&gt;good largely spaced headline styles&lt;/li&gt;
      &lt;li&gt;closable alert and informative messages&lt;/li&gt;
      &lt;li&gt;progress bar&lt;/li&gt;
      &lt;li&gt;and many more things both static and dynamic&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;h3&gt;Responsive design&lt;/h3&gt;
      
      &lt;p&gt;One very interesting feature is built-in support for responsive design. By combining the grid scaffolding
      and a bit of JavaScript magic, the content of the page adjusts itself to look best for your browser
      size. That's particularly useful to make a website that looks nice for both big screens and smartphones.&lt;/p&gt;
      
      &lt;p&gt;Check it out, change the size of your browser's window and you will see how the website reacts.
      It's not perfect and cannot match a dedicated website but that's pretty good.&lt;/p&gt;
      
      &lt;h2&gt;Using it&lt;/h2&gt;
      
      &lt;p&gt;Understanding how Twitter Bootstrap works and how to use it is relatively easy and quick.
      The documentation is pretty good and driven by examples. It could use a few extra
      examples here and there though.&lt;/p&gt;
      
      &lt;p&gt;It is not exempt of bugs but overall things are working as expected. I stumbled upon several bugs
      but most of them were fixed in their latest version (2.0.3). I am unfortunately stuck on version 2.0.1.
      Does it work on Internet Explorer? Good question, I don't have a IE installed to check it out.
      If my website looks like crap and you are using Internet Explorer, then the answer is no.&lt;/p&gt;
      
      &lt;p&gt;Twitter Bootstrap is built using &lt;a href="http://lesscss.org/"&gt;Less&lt;/a&gt;. I unfortunately use &lt;a href="http://sass-lang.com/"&gt;SCSS&lt;/a&gt; and had to use
      a port that has not upgraded to 2.0.3 yet.&lt;/p&gt;
      
      &lt;h2&gt;The curse&lt;/h2&gt;
      
      &lt;p&gt;Now the big problem with Twitter Bootstrap is that pretty much all websites using it look alike.
      The most defining element is the nav bar that unfortunately is one of the main signature component
      of a website. Some themes exist, otherwise you will have to use Less or their
      &lt;a href="http://twitter.github.com/bootstrap/download"&gt;Boostrap customizer&lt;/a&gt; to get something more unique. I am also not a big fan of their
      default font style and size which I changed personally.&lt;/p&gt;
      
      &lt;h2&gt;Verdict&lt;/h2&gt;
      
      &lt;p&gt;Overall it was a good experience and the UI components at my disposal helped me make a better
      website. Yes my site look like many Twitter Bootstrap sites out there ; though I took the extra
      time to customize it more than the average Joe. It is hopefully different enough :)&lt;/p&gt;
      
      &lt;p&gt;If you want to explore Twitter Bootstrap with a practical example, check out my website
      &lt;a href="https://github.com/emmanuelbernard/emmanuelbernard.com"&gt;source code&lt;/a&gt;.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/04/11/feedback-on-twitter-bootstrap/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/04/10/the-perfect-storm-creates-new-website-and-blog/</id>
    <title>The perfect storm creates new website and blog</title>
    <updated>2012-04-10T00:00:00Z</updated>
    <published>2012-04-10T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/P4FD9cenabA/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I have been fed up with Wordpress for a while now. Having to upgrade the core
      plus an average of 4 plugins every time I went to blog was too much. And I
      am not even mentioning the security risk or the fact that some services
      flag wordpress installs as malicious websites...
      
      I have been wanting to migrate the blog to Awestruct for a while
      but frankly got lazy. My core website was already generated with Awestruct
      and I wanted to give Twitter Bootstrap a try. Twitter Bootstrap
      is a CSS / javascript / HTML 5 toolkit to get started quickly.
      
      So I started with that and moved...
    </summary>
    <content type="html">
      &lt;p&gt;I have been fed up with Wordpress for a while now. Having to upgrade the core
      plus an average of 4 plugins every time I went to blog was too much. And I
      am not even mentioning the security risk or the fact that some services
      flag wordpress installs as malicious websites...&lt;/p&gt;
      
      &lt;p&gt;I have been wanting to migrate the blog to &lt;a href="http://awestruct.org"&gt;Awestruct&lt;/a&gt; for a while
      but frankly got lazy. My core website was already generated with Awestruct
      and I wanted to give &lt;a href="http://twitter.github.com/bootstrap/"&gt;Twitter Bootstrap&lt;/a&gt; a try. Twitter Bootstrap
      is a CSS / javascript / HTML 5 toolkit to get started quickly.&lt;/p&gt;
      
      &lt;p&gt;So I started with that and moved my main website to use Twitter Bootstrap.
      While I was at it, I have  refreshed both content and style to get:&lt;/p&gt;
      
      &lt;ul&gt;
      &lt;li&gt;less chatty pages: especially the home page&lt;/li&gt;
      &lt;li&gt;better page titles&lt;/li&gt;
      &lt;li&gt;add a section on what projects I work on&lt;/li&gt;
      &lt;/ul&gt;
      
      
      &lt;p&gt;And boom, I decided to go all in and also update my blog, importing them from
      Wordpress. I'll give my feedback on both Twitter Bootstrap and moving a blog
      in a later post. But let me tell you, the actual content migration was the
      easy part. Realizing after the fact that a couple of 301 redirects were
      mandatory for Google to be happy was an interesting experience :)&lt;/p&gt;
      
      &lt;p&gt;Anyways, let me know what you think of &lt;a href="http://emmanuelbernard.com"&gt;the website and blog refresh&lt;/a&gt;.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/04/10/the-perfect-storm-creates-new-website-and-blog/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/02/28/customize-titles-of-your-terminal-window/</id>
    <title>Customize titles of your terminal window</title>
    <updated>2012-02-28T00:00:00Z</updated>
    <published>2012-02-28T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/IqvyNnMHvDg/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      If you are like me, you use many many tabs in your command line terminal. By the way, iTerm2 is a very nice improvement over the vanilla OS X Terminal app.
      
      To recognize tabs, I like to display the name of the current directory and add the directory it is contained in if more space are left. Open your .bash_profile or .profile file and add the following
      
      function local_dir_and_within {
      __LAST="${PWD##*/}"
      
      __IN="${PWD%/*}"
      
      __IN="${__IN/#$HOME/~}"
      
      TITLE_TAB="$__LAST in $__IN"
      
      echo -n $TITLE_TAB
      
      }
      
      export PROMPT_COMMAND='echo -ne "\033]0;$(local_dir_and_within)\007"'
      
      
      Your tab title will now look like hibernate-search in ~/code.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;If you are like me, you use many many tabs in your command line terminal. By the way, &lt;a href="http://www.iterm2.com"&gt;iTerm2&lt;/a&gt; is a very nice improvement over the vanilla OS X Terminal app.
      &lt;/p&gt;
      &lt;p&gt;To recognize tabs, I like to display the name of the current directory and add the directory it is contained in if more space are left. Open your &lt;code&gt;.bash_profile&lt;/code&gt; or &lt;code&gt;.profile&lt;/code&gt; file and add the following
      &lt;/p&gt;
      &lt;blockquote&gt;function local_dir_and_within {
      &lt;p&gt;__LAST=&amp;quot;${PWD##*/}&amp;quot;
      &lt;/p&gt;
      &lt;p&gt;__IN=&amp;quot;${PWD%/*}&amp;quot;
      &lt;/p&gt;
      &lt;p&gt;__IN=&amp;quot;${__IN/#$HOME/~}&amp;quot;
      &lt;/p&gt;
      &lt;p&gt;TITLE_TAB=&amp;quot;$__LAST in $__IN&amp;quot;
      &lt;/p&gt;
      &lt;p&gt;echo -n $TITLE_TAB
      &lt;/p&gt;
      &lt;p&gt;}
      &lt;/p&gt;
      &lt;p&gt;export PROMPT_COMMAND=&amp;#39;echo -ne &amp;quot;\033]0;$(local_dir_and_within)\007&amp;quot;&amp;#39;
      &lt;/p&gt;
      &lt;/blockquote&gt;
      &lt;p&gt;Your tab title will now look like &lt;code&gt;hibernate-search in ~/code&lt;/code&gt;.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/02/28/customize-titles-of-your-terminal-window/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/02/28/configuring-virtualbox-guests-to-access-the-internet-and-be-accessible-from-the-host/</id>
    <title>Configuring VirtualBox guests to access the internet and be accessible from the host</title>
    <updated>2012-02-28T00:00:00Z</updated>
    <published>2012-02-28T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/BJoD9ADazyU/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I recently had to create a VirtualBox virtual machine hosting Fedora 16. It took me a little while to achieve both
      
        access the internet from the Fedora 16 guest
        reach the Fedora 16 guest from the host (say via SSH).
      
      It's relatively straightforward if you know the details.
      To get access to the internet from the guest, you need to enable the NAT network adaptor.
      
        On your (shutdown) VM, open up settings-&gt;Network
        In adapter 1, enable network adapter and use attached to NAT
      
      To get access to the guest VM, we need to give it a static IP and...
    </summary>
    <content type="html">
      &lt;p&gt;I recently had to create a VirtualBox virtual machine hosting Fedora 16. It took me a little while to achieve both&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;access the internet from the Fedora 16 guest&lt;/li&gt;
        &lt;li&gt;reach the Fedora 16 guest from the host (say via SSH).&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;It's relatively straightforward if you know the details.&lt;/p&gt;
      &lt;p&gt;To get access to the internet from the guest, you need to enable the NAT network adaptor.&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;On your (shutdown) VM, open up settings-&amp;gt;Network&lt;/li&gt;
        &lt;li&gt;In adapter 1, enable network adapter and use attached to NAT&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;To get access to the guest VM, we need to give it a static IP and be accessible to the host.&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;On VirtualBox, open up (general) preferences -&amp;gt; network&lt;/li&gt;
        &lt;li&gt;Add a host-only network (if none exist)&lt;/li&gt;
        &lt;li&gt;Configure the host-only network with an IP address (eg &lt;code&gt;192.168.56.1&lt;/code&gt;)&lt;/li&gt;
        &lt;li&gt;Optionally enable the DHCP server and make sure to leave room for static addresses (eg by setting lower address bound to &lt;code&gt;192.168.56.101&lt;/code&gt;&lt;/li&gt;
        &lt;li&gt;On the guest VM settings -&amp;gt; Network, active a second adapter and use attached to Host-only Adapter with the name of the network you have defined globally (usually &lt;code&gt;vboxnet0&lt;/code&gt;)&lt;/li&gt;
        &lt;li&gt;Make sure to note down the MAC address (visible in the advanced section)&lt;/li&gt;
        &lt;li&gt;Boot your guest VM and add the network interface&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;In Fedora 16, to add a network interface, create a file &lt;code&gt;ifcfg-eth1&lt;/code&gt; in &lt;code&gt;/etc/sysconfig/network-scripts&lt;/code&gt; (or an alternative ethn name).&lt;/p&gt;
      &lt;p&gt;Fill it up with&lt;/p&gt;
      &lt;blockquote&gt;
        &lt;p&gt;DEVICE="eth1"&lt;br /&gt;
      &lt;/p&gt;&lt;p&gt;  HWADDR="08:00:27:0B:74:DE"&lt;br /&gt;
      &lt;/p&gt;
      &lt;p&gt;  BOOTPROTO="static"&lt;br /&gt;
      &lt;/p&gt;
      &lt;p&gt;  IPADDR=192.168.56.100&lt;br /&gt;
      &lt;/p&gt;
      &lt;p&gt;  NETMASK=255.255.255.0&lt;br /&gt;
      &lt;/p&gt;
      &lt;p&gt;  ONBOOT="yes"&lt;br /&gt;
      &lt;/p&gt;
      &lt;p&gt;  NM_CONTROLLED="yes"&lt;/p&gt;
      
      &lt;/blockquote&gt;
      &lt;p&gt;Make sure to change &lt;code&gt;DEVICE&lt;/code&gt; if you use a different ethn name. Make sure to replace &lt;code&gt;HWADDR&lt;/code&gt; with the MAC address that you copied from adapter 2. Finally, make sure the static address is not within the range of DHCP addresses. I my example &lt;code&gt;192.168.56.100&lt;/code&gt; would do fine. Reboot for good measure, you should be able to access the guest from the host at &lt;code&gt;192.168.56.100&lt;/code&gt;. You can even edit your host's &lt;code&gt;/etc/hosts&lt;/code&gt; and add the following line&lt;/p&gt;
      &lt;blockquote&gt;
      &lt;p&gt;
      &lt;/p&gt;&lt;p&gt;192.168.56.100 my-guest
      &lt;/p&gt;
      
      &lt;/blockquote&gt;
      &lt;p&gt;In my case, I can then SSH into the guest using &lt;code&gt;ssh emmanuel@my-guest&lt;/code&gt;&lt;/p&gt;
      &lt;p&gt;That's pretty much basic stuff but a working example always helps :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/02/28/configuring-virtualbox-guests-to-access-the-internet-and-be-accessible-from-the-host/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2012/02/13/in-search-for-a-2560x1600-display/</id>
    <title>In search for a 2560x1600 display</title>
    <updated>2012-02-13T00:00:00Z</updated>
    <published>2012-02-13T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/aC4AsSgOvJ0/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I have been using a Samsung SyncMaster 305T+ 30" monitor for 4.5 years now and have been very very happy with the screen real estate. Yes two monitors are nice but a big massive one wins for me. Anyways, it's failing me. The screen blinks more and more - luckily I'm epileptic - often and a few straps that used to display true back now are dark green. It won't last long. I am looking for a replacement.
      
      I have a MacBook Pro with a mini DisplayPort but pre thunderbolt (by a couple of month...). I am quite interested in the Apple...
    </summary>
    <content type="html">
      &lt;p&gt;I have been using a Samsung SyncMaster 305T+ 30" monitor for 4.5 years now and have been very very happy with the screen real estate. Yes two monitors are nice but a big massive one wins for me. Anyways, it's failing me. The screen blinks more and more - luckily I'm epileptic - often and a few straps that used to display true back now are dark green. It won't last long. I am looking for a replacement.
      &lt;/p&gt;
      &lt;p&gt;I have a MacBook Pro with a mini DisplayPort but pre thunderbolt (by a couple of month...). I am quite interested in the Apple Thunderbolt Display:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;it has the resolution I'm looking for,&lt;/li&gt;
      	&lt;li&gt;great ports (USB, Firewire, Ethernet)&lt;/li&gt;
      	&lt;li&gt;it's a breathe to dock a MacBook Pro&lt;/li&gt;
      	&lt;li&gt;good reviews&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;There is one catch, it won't work on my current MacBook Pro - i tried. And that sucks big time. I can't justify buying a new MacBook Pro to secure a future proof screen and I could not find a way to make this Thunderbolt monitor work on a mini DisplayPort computer (no adapter, no nothing). Which means Apple will force me in the past :(
      &lt;/p&gt;
      &lt;p&gt;The alternatives I have are:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;the Dell U3011 (30", 2560x1600, DisplayPort, DVI, HDMI)&lt;/li&gt;
      	&lt;li&gt;the HP ZR30w (30", 2560x1600, DisplayPort, DVI)&lt;/li&gt;
      	&lt;li&gt;the Apple LED Cinema Display (27", 2560x1600,mini DisplayPort, MagSafe power adaptor)&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;It seems to me the best option is the Apple Cinema Display. Despite the smaller screen, it's the same resolution, it's cheaper (by 200 to 400 euros) and I will have less cable to plug my laptop to. The sad thing is I'm not sure it will work on future Thunderbolt MacbookPro, let alone if I need to plug other Thunderbolt accessories in between, and for sure it will be inconvenient compared to a nice and well connected Apple Thunderbolt Display. And spending that much money on previous generation when the next gen is the same price really pisses me off.
      &lt;/p&gt;
      &lt;p&gt;Do I have any other alternatives? I looked for refurbished or second hand Apple Cinema Display (27", mini DisplayPort) but could not find any around Paris.
      &lt;/p&gt;
      &lt;p&gt;By the way, 4.5 years ago for a 30" 2560x1600 monitor, I paid the same price or less than what these beasts sell for today. Granted, these are new technology and new panels (IPS) but at constant size and resolution, price has not drop a penny. Where the hell have Moore's law corollaries gone? Oh and is 4.5 years old for a screen?&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2012/02/13/in-search-for-a-2560x1600-display/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2011/10/28/itunes-vs-incoming-connection-and-vpn-vapors-fixes-for-unapple-behaviors/</id>
    <title>iTunes vs incoming connection and VPN vapors: fixes for unApple behaviors</title>
    <updated>2011-10-28T00:00:00Z</updated>
    <published>2011-10-28T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/YGm8ZFPCQKU/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I've just found solutions to two nagging problems I had on Mac OS X.
      
      iTunes and incoming connection requests
      Some times ago, iTunes has started to ask me every time it launches "Do you want the application “iTunes.app” to accept incoming network connections?". It gets quickly annoying.
      
      There is a very simple solution. Move iTunes.app (from /Applications) to your trash, download iTunes and install it. The first time you start it, iTunes will ask you to change your firewall settings. Do so and you will be good to go.
      
      If you want to know the tiny details, somehow your iTunes package got changed or...
    </summary>
    <content type="html">
      &lt;p&gt;I've just found solutions to two nagging problems I had on Mac OS X.
      &lt;/p&gt;
      &lt;h3&gt;iTunes and incoming connection requests&lt;/h3&gt;
      &lt;p&gt;Some times ago, iTunes has started to ask me every time it launches "Do you want the application “iTunes.app” to accept incoming network connections?". It gets quickly annoying.
      &lt;/p&gt;
      &lt;p&gt;There is a very simple solution. Move iTunes.app (from /Applications) to your trash, &lt;a href="http://www.apple.com/itunes/download/"&gt;download iTunes&lt;/a&gt; and install it. The first time you start it, iTunes will ask you to change your firewall settings. Do so and you will be good to go.
      &lt;/p&gt;
      &lt;p&gt;If you want to know the tiny details, somehow your iTunes package got changed or corrupted and the firewall was not trusting iTunes anymore.
      &lt;/p&gt;
      &lt;h3&gt;VPN connection after sleep&lt;/h3&gt;
      &lt;p&gt;Another problem I had was that after the laptop goes to sleep, it is sometimes impossible to reconnect to a VPN. If that happens, you need to restart the right daemon. Open a terminal and run
      &lt;/p&gt;
      &lt;blockquote&gt;
      &lt;p&gt;sudo launchctl stop com.apple.racoon
      &lt;/p&gt;
      &lt;p&gt;sudo launchctl start com.apple.racoon
      &lt;/p&gt;
      &lt;/blockquote&gt;
      &lt;p&gt;You are now able to connect to your VPN again.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2011/10/28/itunes-vs-incoming-connection-and-vpn-vapors-fixes-for-unapple-behaviors/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2011/10/26/what-to-do-when-gradle-raises-unexpected-noclassdeffoundexception/</id>
    <title>What to do when Gradle raises unexpected NoClassDefFoundException</title>
    <updated>2011-10-26T00:00:00Z</updated>
    <published>2011-10-26T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/iIfbhvdMUmA/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I have just lost an hour thanks to some obscure bug in Gradle caching mechanism.
      
      If all of the sudden, Gradle raises Frankenstein errors at you like
      
      $ gradle clean build
      :buildSrc:compileJava UP-TO-DATE
      
      :buildSrc:compileGroovy
      
      Note: /Users/manu/projects/notbackedup/git/core/buildSrc/src/main/groovy/org/hibernate/gradle/testing/database/DatabaseMatrixPlugin.java uses unchecked or unsafe operations.
      
      Note: Recompile with -Xlint:unchecked for details.
      
      &gt;&gt;&gt; a serious error occurred: hudson/util/DBAllocation
      
      &gt;&gt;&gt; stacktrace:
      
      java.lang.NoClassDefFoundError: hudson/util/DBAllocation
      
      at java.lang.Class.getDeclaredMethods0(Native Method)
      
      at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
      
      at java.lang.Class.getDeclaredMethods(Class.java:1791)
      
      at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:318)
      
      at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:263)
      
      at org.codehaus.groovy.ast.ClassNode.getInterfaces(ClassNode.java:341)
      
      at org.codehaus.groovy.ast.ClassNode.declaresInterface(ClassNode.java:929)
      
      at org.codehaus.groovy.ast.ClassNode.implementsInterface(ClassNode.java:909)
      
      at org.codehaus.groovy.ast.ClassNode.isDerivedFromGroovyObject(ClassNode.java:899)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.isGroovyObject(AsmClassGenerator.java:2752)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.visitPropertyExpression(AsmClassGenerator.java:2728)
      
      at org.codehaus.groovy.ast.expr.PropertyExpression.visit(PropertyExpression.java:55)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.visitAndAutoboxBoolean(AsmClassGenerator.java:4122)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.makeCallSite(AsmClassGenerator.java:2182)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.makeCall(AsmClassGenerator.java:2019)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.makeCall(AsmClassGenerator.java:2005)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.makeInvokeMethodCall(AsmClassGenerator.java:1990)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.visitMethodCallExpression(AsmClassGenerator.java:2342)
      
      at org.codehaus.groovy.ast.expr.MethodCallExpression.visit(MethodCallExpression.java:75)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.visitBooleanExpression(AsmClassGenerator.java:1959)
      
      at org.codehaus.groovy.ast.expr.BooleanExpression.visit(BooleanExpression.java:40)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.visitIfElse(AsmClassGenerator.java:913)
      
      at org.codehaus.groovy.ast.stmt.IfStatement.visit(IfStatement.java:41)
      
      at org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:35)
      
      at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:165)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.visitBlockStatement(AsmClassGenerator.java:738)
      
      at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:69)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.visitIfElse(AsmClassGenerator.java:921)
      
      at org.codehaus.groovy.ast.stmt.IfStatement.visit(IfStatement.java:41)
      
      at org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:35)
      
      at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:165)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.visitBlockStatement(AsmClassGenerator.java:738)
      
      at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:69)
      
      at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:101)
      
      at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:112)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.visitStdMethod(AsmClassGenerator.java:626)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.visitConstructorOrMethod(AsmClassGenerator.java:601)
      
      at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:123)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.visitMethod(AsmClassGenerator.java:696)
      
      at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1039)
      
      at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:50)
      
      at org.codehaus.groovy.classgen.AsmClassGenerator.visitClass(AsmClassGenerator.java:276)
      
      at org.codehaus.groovy.control.CompilationUnit$12.call(CompilationUnit.java:748)
      
      at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:942)
      
      at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:519)
      
      at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:497)
      
      at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:474)
      
      at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:453)
      
      at org.codehaus.groovy.tools.FileSystemCompiler.compile(FileSystemCompiler.java:67)
      
      at org.codehaus.groovy.tools.FileSystemCompiler.doCompilation(FileSystemCompiler.java:180)
      
      at org.codehaus.groovy.tools.FileSystemCompiler.commandLineCompile(FileSystemCompiler.java:148)
      
      at...
    </summary>
    <content type="html">
      &lt;p&gt;I have just lost an hour thanks to some obscure bug in Gradle caching mechanism.
      &lt;/p&gt;
      &lt;p&gt;If all of the sudden, Gradle raises Frankenstein errors at you like
      &lt;/p&gt;
      &lt;blockquote&gt;$ gradle clean build
      &lt;p&gt;:buildSrc:compileJava UP-TO-DATE
      &lt;/p&gt;
      &lt;p&gt;:buildSrc:compileGroovy
      &lt;/p&gt;
      &lt;p&gt;Note: /Users/manu/projects/notbackedup/git/core/buildSrc/src/main/groovy/org/hibernate/gradle/testing/database/DatabaseMatrixPlugin.java uses unchecked or unsafe operations.
      &lt;/p&gt;
      &lt;p&gt;Note: Recompile with -Xlint:unchecked for details.
      &lt;/p&gt;
      &lt;p&gt;&amp;gt;&amp;gt;&amp;gt; a serious error occurred: hudson/util/DBAllocation
      &lt;/p&gt;
      &lt;p&gt;&amp;gt;&amp;gt;&amp;gt; stacktrace:
      &lt;/p&gt;
      &lt;p&gt;java.lang.NoClassDefFoundError: hudson/util/DBAllocation
      &lt;/p&gt;
      &lt;p&gt;at java.lang.Class.getDeclaredMethods0(Native Method)
      &lt;/p&gt;
      &lt;p&gt;at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
      &lt;/p&gt;
      &lt;p&gt;at java.lang.Class.getDeclaredMethods(Class.java:1791)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.vmplugin.v5.Java5.configureClassNode(Java5.java:318)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.ClassNode.lazyClassInit(ClassNode.java:263)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.ClassNode.getInterfaces(ClassNode.java:341)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.ClassNode.declaresInterface(ClassNode.java:929)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.ClassNode.implementsInterface(ClassNode.java:909)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.ClassNode.isDerivedFromGroovyObject(ClassNode.java:899)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.isGroovyObject(AsmClassGenerator.java:2752)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.visitPropertyExpression(AsmClassGenerator.java:2728)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.expr.PropertyExpression.visit(PropertyExpression.java:55)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.visitAndAutoboxBoolean(AsmClassGenerator.java:4122)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.makeCallSite(AsmClassGenerator.java:2182)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.makeCall(AsmClassGenerator.java:2019)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.makeCall(AsmClassGenerator.java:2005)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.makeInvokeMethodCall(AsmClassGenerator.java:1990)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.visitMethodCallExpression(AsmClassGenerator.java:2342)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.expr.MethodCallExpression.visit(MethodCallExpression.java:75)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.visitBooleanExpression(AsmClassGenerator.java:1959)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.expr.BooleanExpression.visit(BooleanExpression.java:40)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.visitIfElse(AsmClassGenerator.java:913)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.stmt.IfStatement.visit(IfStatement.java:41)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:35)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:165)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.visitBlockStatement(AsmClassGenerator.java:738)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:69)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.visitIfElse(AsmClassGenerator.java:921)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.stmt.IfStatement.visit(IfStatement.java:41)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.CodeVisitorSupport.visitBlockStatement(CodeVisitorSupport.java:35)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitBlockStatement(ClassCodeVisitorSupport.java:165)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.visitBlockStatement(AsmClassGenerator.java:738)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:69)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClassCodeContainer(ClassCodeVisitorSupport.java:101)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitConstructorOrMethod(ClassCodeVisitorSupport.java:112)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.visitStdMethod(AsmClassGenerator.java:626)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.visitConstructorOrMethod(AsmClassGenerator.java:601)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitMethod(ClassCodeVisitorSupport.java:123)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.visitMethod(AsmClassGenerator.java:696)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.ClassNode.visitContents(ClassNode.java:1039)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.ast.ClassCodeVisitorSupport.visitClass(ClassCodeVisitorSupport.java:50)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.classgen.AsmClassGenerator.visitClass(AsmClassGenerator.java:276)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.control.CompilationUnit$12.call(CompilationUnit.java:748)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:942)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:519)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:497)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:474)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:453)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.tools.FileSystemCompiler.compile(FileSystemCompiler.java:67)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.tools.FileSystemCompiler.doCompilation(FileSystemCompiler.java:180)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.tools.FileSystemCompiler.commandLineCompile(FileSystemCompiler.java:148)
      &lt;/p&gt;
      &lt;p&gt;at org.codehaus.groovy.tools.FileSystemCompiler.main(FileSystemCompiler.java:162)
      &lt;/p&gt;
      &lt;p&gt;Caused by: java.lang.ClassNotFoundException: hudson.util.DBAllocation
      &lt;/p&gt;
      &lt;p&gt;at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
      &lt;/p&gt;
      &lt;p&gt;at java.security.AccessController.doPrivileged(Native Method)
      &lt;/p&gt;
      &lt;p&gt;at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
      &lt;/p&gt;
      &lt;p&gt;at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
      &lt;/p&gt;
      &lt;p&gt;at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:696)
      &lt;/p&gt;
      &lt;p&gt;at groovy.lang.GroovyClassLoader.loadClass(GroovyClassLoader.java:793)
      &lt;/p&gt;
      &lt;p&gt;at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
      &lt;/p&gt;
      &lt;p&gt;... 52 more
      &lt;/p&gt;
      &lt;p&gt;FAILURE: Build failed with an exception.
      &lt;/p&gt;
      &lt;p&gt;* What went wrong:
      &lt;/p&gt;
      &lt;p&gt;Execution failed for task ':compileGroovy'.
      &lt;/p&gt;
      &lt;p&gt;Cause: Forked groovyc returned error code: 1
      &lt;/p&gt;
      &lt;p&gt;* Try:
      &lt;/p&gt;
      &lt;p&gt;Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
      &lt;/p&gt;
      &lt;p&gt;BUILD FAILED
      &lt;/p&gt;
      &lt;/blockquote&gt;
      &lt;p&gt;Simply nuke the Gradle cache from your project. I don't know if they are supposed to be in a standard location but for Hibernate the following commands did the trick
      &lt;/p&gt;
      &lt;blockquote&gt;rm -fR .gradle
      &lt;p&gt;rm -fR buildSrc/.gradle
      &lt;/p&gt;
      &lt;/blockquote&gt;
      &lt;p&gt;I wonder what will happen first, tools just working or world peace :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2011/10/26/what-to-do-when-gradle-raises-unexpected-noclassdeffoundexception/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2011/09/15/packt-open-source-awards-and-some-reflections-on-cmses/</id>
    <title>Packt Open Source Awards and some reflections on CMSes</title>
    <updated>2011-09-15T00:00:00Z</updated>
    <published>2011-09-15T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/c0VhS-RQIZg/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Packt Publishing, a fairly known technical book publisher is organizing an Open Source Awards contest. Some of the categories are interesting like mobile toolkit and libraries, business applications (always tough for OSS software), Javascript libs and multimedia. It's funny to see the categories evolve over time. Back in my days, it used to be best Java Middleware framework, best database tool etc.
      
      Votes start soon (sept 19th) and end oct 31st. Go cast your vote, it's always nice for an (open source) team to receive such a prize. And no I don't think any JBoss framework is contending.
      
      One of the category...
    </summary>
    <content type="html">
      &lt;p&gt;Packt Publishing, a fairly known technical book publisher is organizing an Open Source Awards contest. Some of the categories are interesting like mobile toolkit and libraries, business applications (always tough for OSS software), Javascript libs and multimedia. It's funny to see the categories evolve over time. Back in my days, it used to be best Java Middleware framework, best database tool etc.
      &lt;/p&gt;
      &lt;p&gt;Votes start soon (sept 19th) and end oct 31st. &lt;a href="https://www.packtpub.com/open-source-awards-home"&gt;Go cast your vote&lt;/a&gt;, it's always nice for an (open source) team to receive such a prize. And no I don't think any JBoss framework is contending.
      &lt;/p&gt;
      &lt;p&gt;One of the category is Open Source CMS. Two of the big contenders in this space are Drupal and Joomla!. I have been involved in setting up Joomla! for my friend and... wife. I've got to admit that if I had to do it again, I would use something like &lt;a href="https://github.com/mojombo/jekyll#readme"&gt;Jekyll&lt;/a&gt; or &lt;a href="http://awestruct.org/"&gt;Awestruct&lt;/a&gt; (my current favorite in this category). The website targeted was fairly simple but very quickly she ran into limitations and badly generated HTML (at least not customizable enough from a CSS point of view). She is a marketing person, so if she has decided that the picture, menu, color, text need to be that way, it must be that way. Teaching her Markdown and a few extra HTML tag is trivial. Heck she even learnt how to hack some CSS sheets. The big limitation is of course the lack of ready to use templates. That's about the main issues for simple solutions like Jekyll or Awestruct.
      &lt;/p&gt;
      &lt;p&gt;Next time you deploy a CMS, consider a simpler HTML generator and see if it could fit your needs.
      &lt;/p&gt;
      &lt;p&gt;PS: My wife's website is at &lt;a href="http://innora.fr"&gt;Innora.fr&lt;/a&gt;.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2011/09/15/packt-open-source-awards-and-some-reflections-on-cmses/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2011/08/26/openworldforum-et-osdc-a-paris/</id>
    <title>OpenWorldForum et OSDC à Paris</title>
    <updated>2011-08-26T00:00:00Z</updated>
    <published>2011-08-26T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/UE20gFIrvzI/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      If you are in Paris Sept 22th-24th, don't miss the OpenWorldForum and the Open Source Developer Conference. This is one of the too few big events in Paris around our work and it's free.
      
      I will personally be there to talk about Hibernate OGM and be part of a panel on Code and Cloud. I've put more information on my professional blog.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;If you are in Paris Sept 22th-24th, don't miss the &lt;a href="http://openworldforum.org/"&gt;OpenWorldForum&lt;/a&gt; and the &lt;a href="http://osdc.fr/"&gt;Open Source Developer Conference&lt;/a&gt;. This is one of the too few big events in Paris around our work and it's free.
      &lt;/p&gt;
      &lt;p&gt;I will personally be there to talk about Hibernate OGM and be part of a panel on Code and Cloud. I've put more information on my &lt;a href="http://in.relation.to/Bloggers/HibernateOGMAndRedHatAtTheOpenWorldForumAndOSDC"&gt;professional blog&lt;/a&gt;.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2011/08/26/openworldforum-et-osdc-a-paris/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2011/08/19/how-to-install-an-apple-keynote-theme/</id>
    <title>How to install an Apple Keynote theme</title>
    <updated>2011-08-19T00:00:00Z</updated>
    <published>2011-08-19T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/68q9UkhLjGA/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      It is surprisingly hard to find on da internet how to install an Apple Keynote theme (and make it work).
      
      Follow this procedure:
      
      
      	retrieve the .kth file (that's the keynote extension for templates)
      	alternatively open the .key file containing the theme you are interested in
      	double click on it or open the file in Keynote
      	In the File menu, click on Save Theme...
      
      The file will be stored in ~/Library/Application Support/iWork/Keynote/Themes.
      
      This technique is known to work for Keynote '09 (5.1) on Mac OS X 10.6 (Snow Leopard).
      ...
    </summary>
    <content type="html">
      &lt;p&gt;It is surprisingly hard to find on &lt;em&gt;da internet&lt;/em&gt; how to install an Apple Keynote theme (and make it work).
      &lt;/p&gt;
      &lt;p&gt;Follow this procedure:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;retrieve the &lt;code&gt;.kth&lt;/code&gt; file (that's the keynote extension for templates)&lt;/li&gt;
      	&lt;li&gt;alternatively open the &lt;code&gt;.key&lt;/code&gt; file containing the theme you are interested in&lt;/li&gt;
      	&lt;li&gt;double click on it or open the file in Keynote&lt;/li&gt;
      	&lt;li&gt;In the &lt;code&gt;File&lt;/code&gt; menu, click on &lt;code&gt;Save Theme...&lt;/code&gt;&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;The file will be stored in &lt;code&gt;~/Library/Application Support/iWork/Keynote/Themes&lt;/code&gt;.
      &lt;/p&gt;
      &lt;p&gt;This technique is known to work for Keynote '09 (5.1) on Mac OS X 10.6 (Snow Leopard).&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2011/08/19/how-to-install-an-apple-keynote-theme/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2011/07/09/headset-worth-using-klipsch-image-s4i/</id>
    <title>Headset worth using: Klipsch Image S4i</title>
    <updated>2011-07-09T00:00:00Z</updated>
    <published>2011-07-09T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/B_ME-1vZXds/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I'm a big headset consumer. The average lifespan is around 3 months regardless of the price I pour into it. The way I wear them out is simple: I leave my iPhone in my jeans front pocket whether I'm walking or sitting. The base of the wire linked to the connector breaks.
      
      It is so true that I always travel with two headsets in case one fails. And yes once both failed on me and I had to buy some at the airport. Funnily enough, that's when I've discovered Klipsch and more specifically the Klipsch Image S4i.
      
      
       
      
      Here are my unconditional...
    </summary>
    <content type="html">
      &lt;p&gt;I'm a big headset consumer. The average lifespan is around 3 months regardless of the price I pour into it. The way I wear them out is simple: I leave my iPhone in my jeans front pocket whether I'm walking or sitting. The base of the wire linked to the connector breaks.
      &lt;/p&gt;
      &lt;p&gt;It is so true that I always travel with two headsets in case one fails. And yes once both failed on me and I had to buy some at the airport. Funnily enough, that's when I've discovered Klipsch and more specifically the &lt;a href="http://www.amazon.com/gp/product/B00365EB3I/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=siteperso-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399369&amp;amp;creativeASIN=B00365EB3I"&gt;Klipsch Image S4i&lt;/a&gt;.
      &lt;/p&gt;
      &lt;div style="float: left; width: 150px;"&gt;
      &lt;a href="http://www.amazon.com/gp/product/B00365EB3I/ref=as_li_ss_il?ie=UTF8&amp;amp;tag=siteperso-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399369&amp;amp;creativeASIN=B00365EB3I"&gt;&lt;img src="http://ws.assoc-amazon.com/widgets/q?_encoding=UTF8&amp;amp;Format=_SL110_&amp;amp;ASIN=B00365EB3I&amp;amp;MarketPlace=US&amp;amp;ID=AsinImage&amp;amp;WS=1&amp;amp;tag=siteperso-20&amp;amp;ServiceVersion=20070822" alt="" border="0" /&gt;&lt;/a&gt; &lt;img src="http://www.assoc-amazon.com/e/ir?t=&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B00365EB3I&amp;amp;camp=217145&amp;amp;creative=399369" alt="" border="0" height="1" width="1" style="border: none !important; margin: 0px !important;" /&gt;
      &lt;/div&gt;
      &lt;p&gt;Here are my unconditional requirements:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;they must isolate from the outside world sounds (in-ear)&lt;/li&gt;
      	&lt;li&gt;they must have a remote control compatible with iPhones&lt;/li&gt;
      	&lt;li&gt;they must have a microphone for phone calls&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;The Klipsch Image S4i is one of the most comfortable headsets I have ever had. Their oval shaped ear inserts are fantastic. Also, they survived 11 months of intensive usage (that's about 600 hours in my case): a durability record for me.
      &lt;/p&gt;
      &lt;p&gt;What I like in them:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;price: for this level of quality and comfort, this is a good price point&lt;/li&gt;
      	&lt;li&gt;comfort: they are very comfortable in your ears even for long periods of time&lt;/li&gt;
      	&lt;li&gt;durability: real-life tested ;)&lt;/li&gt;
      	&lt;li&gt;no friction noise from the wire: some headsets propagate the friction noise that the wire makes when moving on your cloths: that's extremely annoying. This is not the case here.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;What I don't like:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;the remote is a bit too far from your mouth and too heavy (hint: Apple gets it right)&lt;/li&gt;
      	&lt;li&gt;the clip to attach the wire to your cloths is cheaply designed and I lost it eventually&lt;/li&gt;
      	&lt;li&gt;the wire length is a bit too long for my usage&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;I won't discuss sound quality because frankly, my ears are not good enough to really appreciate and report on it. Check out other reviews for this kind of info. That being said, this model generally has good reviews.
      &lt;/p&gt;
      &lt;p&gt;That's it. If you have the same kind of criteria that I have, definitively give it a shot.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2011/07/09/headset-worth-using-klipsch-image-s4i/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2011/07/08/its-flattering-google-but-im-not-that-smart/</id>
    <title>It's flattering Google but I'm not that smart</title>
    <updated>2011-07-08T00:00:00Z</updated>
    <published>2011-07-08T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/8PWEAG_HsbQ/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Google grossly overestimates my knowledge in linguistic.
      
      
      ...
    </summary>
    <content type="html">
      &lt;p&gt;Google grossly overestimates my knowledge in linguistic.
      &lt;/p&gt;
      &lt;a href="http://blog.emmanuelbernard.com/wordpress/wp-content/uploads/2011/07/google-asian-language.png"&gt;&lt;img src="http://blog.emmanuelbernard.com/wordpress/wp-content/uploads/2011/07/google-asian-language.png" alt="" height="286" title="google-asian-language" width="1322" class="aligncenter size-full wp-image-203" /&gt;&lt;/a&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2011/07/08/its-flattering-google-but-im-not-that-smart/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2011/07/08/awestruct-building-dynamic-static-web-sites/</id>
    <title>Awestruct: building dynamic static web sites</title>
    <updated>2011-07-08T00:00:00Z</updated>
    <published>2011-07-08T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/ThoPRyGObKs/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I've been wanting to update my personal site for a while as it was done in iWeb and Apple is basically killing the product. Through discussions at Red Hat, I tried Awestruct, a tool to generate static web sites while still benefitting from templating, blog support and other kind of neat automations.
      
      Awestruct is a project started and lead by Bob McWhirter, a JBoss fellow known amongst other things for the awesomeness of his project names. Let me tell you this tool is fantastic. It is a ruby based tool that generates a fully static website (.html, .css and resource files)...
    </summary>
    <content type="html">
      &lt;p&gt;I've been wanting to update my personal site for a while as it was done in iWeb and Apple is basically killing the product. Through discussions at Red Hat, I tried &lt;a href="http://awestruct.org/"&gt;Awestruct&lt;/a&gt;, a tool to generate static web sites while still benefitting from templating, blog support and other kind of neat automations.
      &lt;/p&gt;
      &lt;a href="http://awestruct.org/"&gt;Awestruct&lt;/a&gt; is a project started and lead by &lt;a href="http://bob.mcwhirter.org/"&gt;Bob McWhirter&lt;/a&gt;, a JBoss fellow known amongst other things for the awesomeness of his project names. Let me tell you this tool is fantastic. It is a ruby based tool that generates a fully static website (.html, .css and resource files) based on:
      &lt;ul&gt;
      	&lt;li&gt;content written in a few available markup languages (Markdown is one, haml is another)&lt;/li&gt;
      	&lt;li&gt;layouts letting you template the structure of your website&lt;/li&gt;
      	&lt;li&gt;style via Sass, a superset of CSS that ends up generating .css files&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;I am not a web savvy guy. I know HTML a bit and CSS half a bit. Actually, I know that the best resource on the web is &lt;a href="http://www.w3schools.com/"&gt;w3Schools.com&lt;/a&gt; and that's it. I was able to redo my website in about half a day from downloading Awestruct to deploying the generated site. The beauty is that I can now add pages very easily in an extremely consistent look.
      &lt;/p&gt;
      &lt;p&gt;Another useful part is Awestruct extensions and helpers. While the site is a static website, any content you can generate based on some structured data can end up as a part of your website:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;a blog (ie take elements in a directory and render them as blog entries including the rss feed)&lt;/li&gt;
      	&lt;li&gt;display a tag cloud and generate the list of pages per tag&lt;/li&gt;
      	&lt;li&gt;display the list of your project releases&lt;/li&gt;
      	&lt;li&gt;your own extension (if you know some Ruby, you should be good)&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;Now add some dust of Javascript and you can add things like
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;Google Analytics integration with one line of config&lt;/li&gt;
      	&lt;li&gt;Comments support on your static website thanks to the javascript integration with &lt;a href="http://intensedebate.com/"&gt;IntenseDebase&lt;/a&gt;.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;What I like about Awestruct is that the good libraries are picked for you (Haml, Compass-style etc) but the killer features are two-fold:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;you can tell it to deploy and it will rsync the new website for you in one simple command (it has profiles too like dev, staging and production)&lt;/li&gt;
      	&lt;li&gt;you can store everything in Git&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;Now you have a Git stored, simply deployable, easily customizable and templated website. With a bit of scripting you could get people pushing content in Git and get the website automatically generated and published. Heck you can even generate content automatically as part of a project release and script that (my dream!).
      &lt;/p&gt;
      &lt;p&gt;Awestruct sites are in the middle between fully dynamic sites reading stuffs from a datasource and purely static pages manually edited. It's kind of a dynamic static website.
      &lt;/p&gt;
      &lt;p&gt;The only feature I miss is a search engine but one could imagine:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;generating index pages during the website construction (/index/emmanuel.html, /index/hibernate.html ...)&lt;/li&gt;
      	&lt;li&gt;get some piece of Javascript that read queries and do n intersection of the content stored in all matching indexes&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;Bob, got some free time?&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2011/07/08/awestruct-building-dynamic-static-web-sites/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2011/06/20/on-the-value-of-informal-votes-on-the-internet-my-biais-is-bigger-than-yours/</id>
    <title>On the value of informal votes on the internet: my biais is bigger than yours</title>
    <updated>2011-06-20T00:00:00Z</updated>
    <published>2011-06-20T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/so4IapCy2pM/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Have you ever seen someone working on project (or company) A asking to vote for A in an internet driven vote? It always makes me feel awkward when someone does this. I rarely vote even if I *do* like the project. Of course, I do ask for votes even less frequently (trying to be consistent here ;) ). To me, it is like cheating. I'm not sure where this feeling comes from, very likely how I've been raised. I want to win in a fair race :)
      
      Which leads to a second problem. Should we trust votes on the internet?
      
      They come...
    </summary>
    <content type="html">
      &lt;p&gt;Have you ever seen someone working on project (or company) A asking to vote for A in an internet driven vote? It always makes me feel awkward when someone does this. I rarely vote even if I *do* like the project. Of course, I do ask for votes even less frequently (trying to be consistent here ;) ). To me, it is like cheating. I'm not sure where this feeling comes from, very likely how I've been raised. I want to win in a fair race :)
      &lt;/p&gt;
      &lt;p&gt;Which leads to a second problem. Should we trust votes on the internet?
      &lt;/p&gt;
      &lt;p&gt;They come in diverse forms:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;vote for a technology in an award contest&lt;/li&gt;
      	&lt;li&gt;up vote a link on DZone or Digg&lt;/li&gt;
      	&lt;li&gt;up vote an answer on StackOverflow (awesome site BTW, I wish all support forums were like that)&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;In a non biased environment, the vote at stake resolves itself in an organic way within a given community and thus is closer to a result that would have been run on the full targeted corpus. But if one of the contender reaches to his community and asks to vote for his product, the vote does not reflect the natural interest of the product but more the power of the contender on his community (like a bot master sending a command for all the bot slaves to vote). Let's be a bit less cynical and call this marketing power. All in all, this is not the result we are interested in.
      &lt;/p&gt;
      &lt;p&gt;Even when no competition is at stake, bias is right around the corner. How many times have you had to argue the merits of a vote result posted to a biased community and getting the marketing guy answering "I know but that''s the best we can do and we will treat this results essentially at face value"? I'm pushing here but you get the idea.
      &lt;/p&gt;
      &lt;p&gt;A better voting system would:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;properly define the corpus (community) targeted&lt;/li&gt;
      	&lt;li&gt;ignore votes from outside the corpus (ie Grand'ma voting for &lt;a href="http://in.relation.to/Bloggers/HibernateOGMBirthAnnouncement"&gt;Hibernate OGM&lt;/a&gt; because his grand-son worked on the project)&lt;/li&gt;
      	&lt;li&gt;inform the whole corpus of the vote at stake&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;StackOverflow's voting system is quite close to this though if you consider that most people monitor questions under a given set of tags and that a tag is quite close to a corpus (community). Also, the sheer number of questions makes it less likely to (ab)use the power of your crowd, at least on average. I'm sure though that questions of the style "what's the best product for..." are biased.
      &lt;/p&gt;
      &lt;p&gt;I'm not sure how to properly define a system that would ensure such organic voting system (let's call it the green vote), but that would be a nice little project. A few ideas:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;people register to the voting system&lt;/li&gt;
      	&lt;li&gt;they list the communities they belong to (Java, Hibernate, Programmers etc)&lt;/li&gt;
      	&lt;li&gt;they are not authorized to vote for x weeks (to avoid "hot questions")&lt;/li&gt;
      	&lt;li&gt;questions on a given subject targeting a community are run through a random subset of the valid community members&lt;/li&gt;
      	&lt;li&gt;people not voting to enough questions are excluded out of the community (is that a necessary rule?)&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;Such a system would have a few interesting properties
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;it would be mainly unbiased&lt;/li&gt;
      	&lt;li&gt;results would be comparable over time (ie could see the evolution of a community toward a subject&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;WDYT?
      &lt;/p&gt;
      &lt;p&gt;Note that binary vote (vote for one candidate/solution only) is less than optimal in itself but that's another topic.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2011/06/20/on-the-value-of-informal-votes-on-the-internet-my-biais-is-bigger-than-yours/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2011/02/11/universite-du-si-2011-des-places-a-prix-plus-sympa-pour-certains-geeks/</id>
    <title>Universite du SI 2011 - des places a prix (plus) sympa pour certains geeks</title>
    <updated>2011-02-11T00:00:00Z</updated>
    <published>2011-02-11T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/qmaeNbzeQjM/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Vous m'avez déjà entendu parler de cette conférence en France qui est un TED à la française pour les Geeks et les Boss (pour vous rafraichir la mémoire, cliquer donc ici). L'édition 2011 couvre quatre thèmes:
      
      
      	autrement: inspirations issues d’autres domaines (ex: sciences, architecture, médical), éditeurs de jeux vidéo, grands du Web, Big Mashups, DevOps.
      	techniquement: cloud en pratique, virtuoses du code, Big Data, architectures événementielles, architectures mobiles, HTML5 vs propriétaire.
      	humainement: impacts sociétaux de l'IT, dynamique d’animation, facteurs humains, efficacité personnelle, transition vers l’agile et le Lean.
      	prochainement: prospective, évolution de nos métiers par secteur, interfaces futuristes, informatique à la vitesse de la...
    </summary>
    <content type="html">
      &lt;p&gt;Vous m'avez déjà entendu parler de cette conférence en France qui est un TED à la française pour les Geeks et les Boss (pour vous rafraichir la mémoire, &lt;a href="http://blog.emmanuelbernard.com/2010/07/retour-sur-luniversite-du-si-2010-geek-et-boss-une-equipe-qui-gagne/"&gt;cliquer donc ici&lt;/a&gt;). L'édition 2011 couvre quatre thèmes:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;autrement: inspirations issues d’autres domaines (ex: sciences, architecture, médical), éditeurs de jeux vidéo, grands du Web, Big Mashups, DevOps.&lt;/li&gt;
      	&lt;li&gt;techniquement: cloud en pratique, virtuoses du code, Big Data, architectures événementielles, architectures mobiles, HTML5 vs propriétaire.&lt;/li&gt;
      	&lt;li&gt;humainement: impacts sociétaux de l'IT, dynamique d’animation, facteurs humains, efficacité personnelle, transition vers l’agile et le Lean.&lt;/li&gt;
      	&lt;li&gt;prochainement: prospective, évolution de nos métiers par secteur, interfaces futuristes, informatique à la vitesse de la lumière, mariage du Web et de la TV.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;Ca se passera le 28 et 29 juin 2011, pour plus d'info, aller voir &lt;a href="http://goo.gl/Rg2wH"&gt;leur site&lt;/a&gt;.
      &lt;/p&gt;
      &lt;p&gt;Le grand classique, c'est évidemment, le thème autrement. Hautement inspirant, je recommande. Mais j'avoue que mon faible pour cette année, c'est humainement. D'ailleurs &lt;a href="http://lescastcodeurs.com"&gt;Les Cast Codeurs&lt;/a&gt; ont proposé une session pour ce thème. Pas sûr que l'on soit acceptés, vu que c'est, en apparence, hors de nos sentiers battus et qu'il y aura à coup sûr du beau monde mais qui ne tente rien n'a rien. En parlant du thème humainement, je vous conseille &lt;a href="http://www.ted.com/talks/amber_case_we_are_all_cyborgs_now.html"&gt;cette petite video d'Amber Case&lt;/a&gt;, une cyberantropologiste.
      &lt;/p&gt;
      &lt;p&gt;Mais bon voilà, l'USI ce n'est pas donné. Octo fait un rabais conséquent sur un nombre limité de places pour des geeks qui n'en veulent: 1000€ HT au lieu de 1950€ HT. C'est sûr, c'est plus qu'un ticket de ciné, mais je vous assure qu'on s'en souvient plus longtemps ;)
      &lt;/p&gt;
      &lt;p&gt;Si vous êtes intéressé par ce rabais, contactez-moi à commentaire &lt;a href="http://fr.wikipedia.org/wiki/Arrobase"&gt;arobase&lt;/a&gt; lescastcodeurs.com. Le nombre de places est limité, donc ne trainez pas trop.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2011/02/11/universite-du-si-2011-des-places-a-prix-plus-sympa-pour-certains-geeks/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2011/01/04/script-to-hot-switch-jdk-versions-in-mac-os-x/</id>
    <title>Script to hot switch JDK versions in Mac OS X terminals</title>
    <updated>2011-01-04T00:00:00Z</updated>
    <published>2011-01-04T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/57Kg85qEg2E/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Personal note.
      
      Here is a script that lets you switch your JDK version in a terminal window. It also has auto completion.
      
      Put the script in a file and add
      
      source filename
      in ~/.profile or ~/.bash_profile and you will be able to call setjdk and use autocompletion (with &lt;tab&gt;) from the command line.
      
      emmanuel@computer $ setjdk 1.&lt;tab&gt;
      emmanuel@computer $ setjdk 1.5
      
      
      Original version at codehaus.
      
      #!/bin/bash
      function defaultjdk {
      
      local vmdir=/System/Library/Frameworks/JavaVM.framework/Versions
      
      local ver=${1?Usage: defaultjdk }
      
      [ -z "$2" ] || error="Too many arguments"
      
      [ -d $vmdir/$ver ] || error="Unknown JDK version: $ver"
      
      [ "$(readlink $vmdir/CurrentJDK)" != "$ver" ] || error="JDK already set to $ver"
      
      if [ -n "$error" ]; then
      
      echo $error
      
      return 1
      
      fi
      
      echo -n "Setting default JDK...
    </summary>
    <content type="html">
      &lt;p&gt;Personal note.
      &lt;/p&gt;
      &lt;p&gt;Here is a script that lets you switch your JDK version in a terminal window. It also has auto completion.
      &lt;/p&gt;
      &lt;p&gt;Put the script in a file and add
      &lt;/p&gt;
      &lt;blockquote&gt;source filename&lt;/blockquote&gt;
      &lt;p&gt;in ~/.profile or ~/.bash_profile and you will be able to call setjdk and use autocompletion (with &amp;lt;tab&amp;gt;) from the command line.
      &lt;/p&gt;
      &lt;blockquote&gt;emmanuel@computer $ setjdk 1.&amp;lt;tab&amp;gt;
      &lt;p&gt;emmanuel@computer $ setjdk 1.5
      &lt;/p&gt;
      &lt;/blockquote&gt;
      &lt;p&gt;Original version &lt;a href="http://docs.codehaus.org/display/ninja/setjdk"&gt;at codehaus&lt;/a&gt;.
      &lt;/p&gt;
      &lt;blockquote&gt;#!/bin/bash
      &lt;p&gt;function defaultjdk {
      &lt;/p&gt;
      &lt;p&gt;local vmdir=/System/Library/Frameworks/JavaVM.framework/Versions
      &lt;/p&gt;
      &lt;p&gt;local ver=${1?Usage: defaultjdk }
      &lt;/p&gt;
      &lt;p&gt;[ -z "$2" ] || error="Too many arguments"
      &lt;/p&gt;
      &lt;p&gt;[ -d $vmdir/$ver ] || error="Unknown JDK version: $ver"
      &lt;/p&gt;
      &lt;p&gt;[ "$(readlink $vmdir/CurrentJDK)" != "$ver" ] || error="JDK already set to $ver"
      &lt;/p&gt;
      &lt;p&gt;if [ -n "$error" ]; then
      &lt;/p&gt;
      &lt;p&gt;echo $error
      &lt;/p&gt;
      &lt;p&gt;return 1
      &lt;/p&gt;
      &lt;p&gt;fi
      &lt;/p&gt;
      &lt;p&gt;echo -n "Setting default JDK &amp;amp; HotSpot to $ver ... "
      &lt;/p&gt;
      &lt;p&gt;if [ "$(/usr/bin/id -u)" != "0" ]; then
      &lt;/p&gt;
      &lt;p&gt;SUDO=sudo
      &lt;/p&gt;
      &lt;p&gt;fi
      &lt;/p&gt;
      &lt;p&gt;$SUDO /bin/rm /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
      &lt;/p&gt;
      &lt;p&gt;$SUDO /bin/ln -s $ver /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
      &lt;/p&gt;
      &lt;p&gt;echo Done.
      &lt;/p&gt;
      &lt;p&gt;}
      &lt;/p&gt;
      &lt;p&gt;function setjdk {
      &lt;/p&gt;
      &lt;p&gt;local vmdir=/System/Library/Frameworks/JavaVM.framework/Versions
      &lt;/p&gt;
      &lt;p&gt;local ver=${1?Usage: setjdk }
      &lt;/p&gt;
      &lt;p&gt;[ -d $vmdir/$ver ] || {
      &lt;/p&gt;
      &lt;p&gt;echo Unknown JDK version: $ver
      &lt;/p&gt;
      &lt;p&gt;return 1
      &lt;/p&gt;
      &lt;p&gt;}
      &lt;/p&gt;
      &lt;p&gt;echo -n "Setting this terminal's JDK to $ver ... "
      &lt;/p&gt;
      &lt;p&gt;export JAVA_HOME=$vmdir/$ver/Home
      &lt;/p&gt;
      &lt;p&gt;PATH=$(echo $PATH | tr ':' '\n' | grep -v $vmdir | tr '\n' ':')
      &lt;/p&gt;
      &lt;p&gt;export PATH=$JAVA_HOME/bin:$PATH
      &lt;/p&gt;
      &lt;p&gt;java -version
      &lt;/p&gt;
      &lt;p&gt;}
      &lt;/p&gt;
      &lt;p&gt;function _setjdk_completion (){
      &lt;/p&gt;
      &lt;p&gt;COMPREPLY=()
      &lt;/p&gt;
      &lt;p&gt;local vmdir=/System/Library/Frameworks/JavaVM.framework/Versions
      &lt;/p&gt;
      &lt;p&gt;local cur=${COMP_WORDS[COMP_CWORD]//\\\\/}
      &lt;/p&gt;
      &lt;p&gt;local options=$(cd $vmdir; ls | grep 1. | tr '\n' ' ')
      &lt;/p&gt;
      &lt;p&gt;COMPREPLY=($(compgen -W "${options}" ${cur}))
      &lt;/p&gt;
      &lt;p&gt;}
      &lt;/p&gt;
      &lt;p&gt;complete -F _setjdk_completion -o filenames setjdk
      &lt;/p&gt;
      &lt;p&gt;complete -F _setjdk_completion -o filenames defaultjdk
      &lt;/p&gt;
      &lt;/blockquote&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2011/01/04/script-to-hot-switch-jdk-versions-in-mac-os-x/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/12/07/mac-os-x-and-intellij-crashes/</id>
    <title>Mac OS X and IntelliJ crashes</title>
    <updated>2010-12-07T00:00:00Z</updated>
    <published>2010-12-07T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/glR_CatZqXc/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I've struggled in the past several weeks with repeated crashes from IntelliJ IDEA on Mac OS X. I suspect it started right after the upgrade to 1.6.5 and the latest Java VM update.
      It seems it was cause by a couple of things.
      
      Job scheduler crash 
      If your crash report shows something like
      Thread 55 Crashed: Java: JobScheduler pool 1/2
      This is a bug in the garbage collector. You need to pass an additional VM option to fix it
      -XX:-ReduceInitialCardMarks
      Open /Applications/IntelliJ IDEA x.y.z.app/Contents/Info.plist and update the VMOption key
      &lt;key&gt;VMOptions&lt;/key&gt;
      &lt;string&gt;-XX:-ReduceInitialCardMarks -Xms128m -Xmx512m -XX:MaxPermSize=250m -ea -Xbootclasspath/a:../lib/boot.jar&lt;/string&gt;
      
      Font corrupted 
      Not sure if that was related to the previous issue but...
    </summary>
    <content type="html">
      &lt;div id="_mcePaste"&gt;I've struggled in the past several weeks with repeated crashes from IntelliJ IDEA on Mac OS X. I suspect it started right after the upgrade to 1.6.5 and the latest Java VM update.&lt;/div&gt;
      &lt;p&gt;It seems it was cause by a couple of things.
      &lt;/p&gt;
      &lt;strong&gt;Job scheduler crash &lt;/strong&gt;
      &lt;div id="_mcePaste"&gt;If your crash report shows something like&lt;/div&gt;
      &lt;pre&gt;Thread 55 Crashed: Java: JobScheduler pool 1/2&lt;/pre&gt;
      &lt;div id="_mcePaste"&gt;This is a bug in the garbage collector. You need to pass an additional VM option to fix it&lt;/div&gt;
      &lt;pre&gt;-XX:-ReduceInitialCardMarks&lt;/pre&gt;
      &lt;div id="_mcePaste"&gt;Open &lt;em&gt;/Applications/IntelliJ IDEA x.y.z.app/Contents/Info.plist&lt;/em&gt; and update the &lt;em&gt;VMOption&lt;/em&gt; key&lt;/div&gt;
      &lt;pre&gt;&amp;lt;key&amp;gt;VMOptions&amp;lt;/key&amp;gt;&amp;#x000A;&amp;lt;string&amp;gt;-XX:-ReduceInitialCardMarks -Xms128m -Xmx512m -XX:MaxPermSize=250m -ea -Xbootclasspath/a:../lib/boot.jar&amp;lt;/string&amp;gt;&lt;/pre&gt;
      &lt;strong&gt;Font corrupted &lt;/strong&gt;
      &lt;div id="_mcePaste"&gt;Not sure if that was related to the previous issue but I initially had crashes with a different report involving directly the Garbage Collector (GC). My IntelliJ IDEA was using the &lt;em&gt;Inconsolata&lt;/em&gt; font which apparently was somehow corrupted.&lt;/div&gt;
      &lt;p&gt;Removing fonts from &lt;em&gt;~/Library/Fonts&lt;/em&gt; solved the issue. What you can do is move them to a different directory and slowly re-inject them to find the culprit.
      &lt;/p&gt;
      &lt;p&gt;I am quite happy all this is behind me. I chose:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;A Java VM&lt;/li&gt;
      	&lt;li&gt;On Mac OS X&lt;/li&gt;
      	&lt;li&gt;with IntelliJ IDEA&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;to precisely avoid this kind of bad experience and time waste :) Back to normal.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/12/07/mac-os-x-and-intellij-crashes/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/11/07/autumn-photo-in-bruges/</id>
    <title>Autumn Photo in Bruges</title>
    <updated>2010-11-07T00:00:00Z</updated>
    <published>2010-11-07T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/El6CPYAs_eI/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I've spent my Sunday working on the backlog of my pictures. I'm far from done but this one really stroke me.
      
      I took the picture last month in Bruges, Belgium with a Panasonic Lumix DMC-LX3 (more metadata information here for the curious).
      
      
      I don't think the camera made a big difference as the light was easy that day and I shot from 100-150 meters. This is nevertheless a great compact camera and Gavin did a nice review of it.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;I've spent my Sunday working on the backlog of my pictures. I'm far from done but this one really stroke me.
      &lt;/p&gt;
      &lt;p&gt;I took the picture last month in Bruges, Belgium with a Panasonic Lumix DMC-LX3 (&lt;a href="http://www.flickr.com/photos/27291554@N02/5154314015/meta/"&gt;more metadata information here&lt;/a&gt; for the curious).
      &lt;/p&gt;
      &lt;p style="text-align: center;"&gt;&lt;a target="_blank" href="http://blog.emmanuelbernard.com/wordpress/wp-content/uploads/2010/11/P1020052.jpg"&gt;&lt;img src="http://blog.emmanuelbernard.com/wordpress/wp-content/uploads/2010/11/P1020052.jpg" alt="The Painting Or Not" height="809" width="1080" class="aligncenter" /&gt;&lt;/a&gt;&lt;/p&gt;
      &lt;p&gt;I don't think the camera made a big difference as the light was easy that day and I shot from 100-150 meters. This is nevertheless a great compact camera and &lt;a href="http://in.relation.to/Bloggers/PanasonicDMCLX3"&gt;Gavin did a nice review of it&lt;/a&gt;.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/11/07/autumn-photo-in-bruges/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/10/18/dedicace-des-auteurs-francais-ce-samedi-au-monde-en-tique-paris/</id>
    <title>Dedicace des auteurs Français ce samedi au Monde En Tique (Paris)</title>
    <updated>2010-10-18T00:00:00Z</updated>
    <published>2010-10-18T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/kBknAfoHBW8/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Le samedi 23 octobre à partir de 15h et jusqu'à 18h, Antonio Goncalves, Arnaud Héritier et moi allons faire une après-midi dédicace au Monde En Tique à Paris, la librairie spécialisée (dans l'informatique notamment).
      
       
      [caption id="" align="alignnone" width="416" caption="Vu dans les cast codeurs !!!!"][/caption]
      
      L'idée est de faire une petite après midi entre geek tendance Java. Que vous achetiez un livre ou pas, venez nous rendre visite histoire de papoter. Il parait qu'il y aura peut être à boire.
      
      On ne fait pas exactement ça pour l'argent. A part Antonio qui va se payer une nouvelle Ferrari, Arnaud et moi espérons pouvoir...
    </summary>
    <content type="html">
      &lt;p&gt;Le samedi 23 octobre à partir de 15h et jusqu'à 18h, Antonio Goncalves, Arnaud Héritier et moi allons faire une après-midi dédicace &lt;a href="http://www.lmet.fr"&gt;au Monde En Tique&lt;/a&gt; à Paris, la librairie spécialisée (dans l'informatique notamment).
      &lt;/p&gt;
      &lt;strong&gt; &lt;/strong&gt;
      &lt;p&gt;[caption id="" align="alignnone" width="416" caption="Vu dans les cast codeurs !!!!"]&lt;img src="http://agoncal.files.wordpress.com/2010/10/dedicace.jpg" alt="Vu dans les cast codeurs !!!!" height="166" title="Vu dans les cast codeurs !!!!" width="416" /&gt;[/caption]
      &lt;/p&gt;
      &lt;p&gt;L'idée est de faire une petite après midi entre geek tendance Java. Que vous achetiez un livre ou pas, venez nous rendre visite histoire de papoter. Il parait qu'il y aura peut être à boire.
      &lt;/p&gt;
      &lt;p&gt;On ne fait pas exactement ça pour l'argent. A part Antonio qui va se payer une nouvelle Ferrari, Arnaud et moi espérons pouvoir rembourser notre ticket aller-retour sur Paris (va falloir vendre au moins 4 à 10 livres ;) ). Les livres* en dédicace** seront:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;Java EE 6 seconde edition (Antonio, Apress)&lt;/li&gt;
      	&lt;li&gt;Hibernate Search in Action (Emmanuel, Manning)&lt;/li&gt;
      	&lt;li&gt;Maven (Arnaud, Pearson) - le seul en Français&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;Bref, passez nous voir.
      &lt;/p&gt;
      &lt;p&gt;(*) Le livre dédicacé est très tendance pour la saison de Noël 2010, profitez-en!
      &lt;/p&gt;
      &lt;p&gt;(**) Une dédicace offerte pour un livre acheté.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/10/18/dedicace-des-auteurs-francais-ce-samedi-au-monde-en-tique-paris/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/08/25/to-tor-or-a-tort/</id>
    <title>To Tor or à Tort</title>
    <updated>2010-08-25T00:00:00Z</updated>
    <published>2010-08-25T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/LcA8tiBWkO4/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Last night, I read some articles about Tor. Tor is an anonymous network that redirects your communications securely and anonymously across the Tor network before entering the public internet. It prevents people from finding who / where you are and from spying on your internet connection. The idea is that the communication between you and say the web site you want to look at is encrypted and passes via a few other machines running the Tor network. It looks like the last person on the Tor network is surfing the web site you are looking at.
      
      Long story short, it's a...
    </summary>
    <content type="html">
      &lt;p&gt;Last night, I read some articles about &lt;a href="http://www.torproject.org/"&gt;Tor&lt;/a&gt;. Tor is an anonymous network that redirects your communications securely and anonymously across the Tor network before entering the public internet. It prevents people from finding who / where you are and from spying on your internet connection. The idea is that the communication between you and say the web site you want to look at is encrypted and passes via a few other machines running the Tor network. It looks like the last person on the Tor network is surfing the web site you are looking at.
      &lt;/p&gt;
      &lt;p&gt;Long story short, it's a tool emphasizing anonymity and protecting people's freedom, privacy and confidentiality (quite useful when you are a dissident in a not so open country).
      &lt;/p&gt;
      &lt;p&gt;I did install Tor so that my machine ran as a Tor relay and exit node. A Tor relay relays the data flow from one Tor node to another. An exit node is the bridge between the Tor network and the real internet: in my previous example that's the last guy that appears to look at the website you are surfing.
      &lt;/p&gt;
      &lt;em&gt;Why did I do that?&lt;/em&gt;
      &lt;p&gt;Good question. I was curious first and doing my part to keep the world good is something I try to do from time to time.
      &lt;/p&gt;
      &lt;em&gt;What happened?&lt;/em&gt;
      &lt;p&gt;That's the sad part. I let the node run all night and when I tried to use my connection in the morning I had a couple of bad surprises:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;Google thought I was a bot trying to run automated queries and abusing the system. Consequently, every search I was doing was guarded by a captcha (annoying).&lt;/li&gt;
      	&lt;li&gt;freenode (IRC) must have thought I was a bad guy cause I could not log onto #hibernate-dev #jboss-dev and co&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;I suspect some people were abusing the system and hid themselves behind Tor and I was their gateway to the internet. That left a bad taste in my mouth, I've disabled my Tor relay.
      &lt;/p&gt;
      &lt;p&gt;End of experience.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/08/25/to-tor-or-a-tort/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/08/25/intellijs-live-template/</id>
    <title>IntelliJ's Live Template</title>
    <updated>2010-08-25T00:00:00Z</updated>
    <published>2010-08-25T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/QspB_Cpxf2s/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      If you remember, I like to write my getters this way (long story here)
      
      public String getName() { return this.name; }
      public void setName(String name) { this.name = name; }
      private String name;
      
      I have been doing it manually for a while but it turns out IntelliJ has a super nice feature for that: Live Templating which allows you to use parameterized and contextual templates to generate code.
      
      Go to your Settings-&gt;Live Templating and create a new one.
      
      Add this template:
      
      public $TYPE$ get$UpperName$() { return $lowername$; }
      public void set$UpperName$($TYPE$ $lowername$) { this.$lowername$ = $lowername$; }
      private $TYPE$ $lowername$;
      
      Then edit the variables:
      
      
      	TYPE: the expression should be classNameComplete() to...
    </summary>
    <content type="html">
      &lt;p&gt;If you remember, I like to write my getters this way (&lt;a href="http://blog.emmanuelbernard.com/2010/03/getter-setter-generation-in-java/"&gt;long story here&lt;/a&gt;)
      &lt;/p&gt;
      &lt;pre&gt;public String getName() { return this.name; }&amp;#x000A;public void setName(String name) { this.name = name; }&amp;#x000A;private String name;&lt;/pre&gt;
      &lt;p&gt;I have been doing it manually for a while but it turns out IntelliJ has a super nice feature for that: Live Templating which allows you to use parameterized and contextual templates to generate code.
      &lt;/p&gt;
      &lt;p&gt;Go to your Settings-&amp;gt;Live Templating and create a new one.
      &lt;/p&gt;
      &lt;p&gt;Add this template:
      &lt;/p&gt;
      &lt;pre&gt;public $TYPE$ get$UpperName$() { return $lowername$; }&amp;#x000A;public void set$UpperName$($TYPE$ $lowername$) { this.$lowername$ = $lowername$; }&amp;#x000A;private $TYPE$ $lowername$;&lt;/pre&gt;
      &lt;p&gt;Then edit the variables:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;&lt;em&gt;TYPE&lt;/em&gt;: the expression should be &lt;em&gt;classNameComplete(&lt;/em&gt;) to refer to the class name context&lt;/li&gt;
      	&lt;li&gt;&lt;em&gt;lowername&lt;/em&gt;: the expression should be &lt;em&gt;decapitalize(UpperName).&lt;/em&gt; Also tick &lt;em&gt;skip if defined&lt;/em&gt; to not have to validate the computed value (this saves you one key stroke).&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;I've named my Live Template "get". When I type "get" and TAB, I am asked to type the property type (which is suggested). The second variable asked is the capitalized property name. Then the Live Template infers the rest (decapitalize my property name to fill up &lt;em&gt;lowername&lt;/em&gt;).
      &lt;/p&gt;
      &lt;p&gt;Pretty nice feature!&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/08/25/intellijs-live-template/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/07/11/retour-sur-luniversite-du-si-2010-geek-et-boss-une-equipe-qui-gagne/</id>
    <title>Retour sur l'Universite du SI 2010: geek et boss une equipe qui gagne</title>
    <updated>2010-07-11T00:00:00Z</updated>
    <published>2010-07-11T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/iYZE2z_NUw0/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      J'ai eu la chance d'aller à l'université du SI où Guillaume, Vincent et moi avons animé la session live du podcast Les Cast Codeurs (ça devrait arriver bientôt dans votre iTunes, j'attends toujours le fichier son d'Octo). Qu'ai-je retenu de l'USI? Je vais me limiter volontairement aux deux choses qui m'ont le plus frappé.
      Geek et boss: pas une frontière, un gouffre... et pourtant
      Ce qui ma frappé, c'est que les geeks et les boss vivent dans des mondes complètements différents, des réalités alternatives presque. C'était particulièrement visible pendant les sessions questions / réponses des keynotes où le micro passe du développeur...
    </summary>
    <content type="html">
      &lt;p&gt;J'ai eu la chance d'aller à l'&lt;a href="http://www.universite-du-si.com"&gt;université du SI&lt;/a&gt; où Guillaume, Vincent et moi avons animé la session live du podcast &lt;a href="http://lescastcodeurs.com"&gt;Les Cast Codeurs&lt;/a&gt; (ça devrait arriver bientôt dans votre iTunes, j'attends toujours le fichier son d'Octo). Qu'ai-je retenu de l'USI? Je vais me limiter volontairement aux deux choses qui m'ont le plus frappé.&lt;/p&gt;
      &lt;p&gt;&lt;b&gt;Geek et boss: pas une frontière, un gouffre... et pourtant&lt;/b&gt;&lt;/p&gt;
      &lt;p&gt;Ce qui ma frappé, c'est que les geeks et les boss vivent dans des mondes complètements différents, des réalités alternatives presque. C'était particulièrement visible pendant les sessions questions / réponses des keynotes où le micro passe du développeur Java au DSI Renault. Vous aller me dire, on le sait déjà que les DSI ne comprennent rien à la technique. OK mais il y a plus.&lt;/p&gt;
      &lt;p&gt;M'étant (re)pris une claque avec cette (re)révélation, j'y a réfléchi et j'ai passé du temps à comparer les points de vue pendant ces deux jours. Bien que vivant dans des mondes parallèles, le geek a besoin du boss et le boss a besoin du geek. Aussi bizarre que cela paraisse, c'est presque une symbiose. Comme un animal et son parasite qui le protège de je ne sais quelle autre bactérie (je ne dirais pas qui est le parasite de l'autre). Il y a de l'espoir cependant: au fur et a mesure de ces deux jours, on a vu décrire des techniques et des points de vues qui essayaient de faire parler/interagir les différents niveaux en proposant un langage et terrain commun, en ajoutant des boucles de retour rapides etc (hiérarchies râteau, méthodes itératives, reconsidération de la responsabilité...).&lt;/p&gt;
      &lt;p&gt;Il y a encore beaucoup de choses a inventer, de progrès à faire. C'est un énorme chantier, particulièrement pour les sociétés françaises. Celles qui prendront le pli gagneront en compétitivité, les autre iront pleurer auprès du gouvernement contre les grands méchants de l'étranger qui leur volent leur clients.&lt;/p&gt;
      &lt;p&gt;&lt;b&gt;Les keynotes: pour penser plus loin&lt;/b&gt;&lt;/p&gt;
      &lt;p&gt;Une bonne keynote doit présenter quelque chose qui va au delà du thème de la conference, qui fait réfléchir, change les perspectives et fait mal à la tête. L'USI a mis la barre très haut avec 8 keynotes! Toutes n'étaient pas à mon goût mais 6 sur les 8 étaient du gros calibre, voir du gros gros calibre.&lt;br /&gt;&lt;/p&gt;
      &lt;p&gt;Celle qui m'a mis le cul par terre c'est la keynote de &lt;a href="http://en.wikipedia.org/wiki/Juan_Enriquez"&gt;Juan Enriquez&lt;/a&gt;. Ce monsieur est une pointure en science de la vie et un business man averti. Il a trempé de près ou de loin dans beaucoup des dernières avancées clés en biologie et notamment la récente annonce de la première cellule entièrement synthétique (pour traduire: l'homme a crée la vie a partir de 0).&lt;/p&gt;
      &lt;p&gt;Juan nous a donne la vision d'un monde:&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;où les usines de chimie étaient obsolètes: une vache génétiquement modifiée génère la molécule anti-cancéreuse qui va bien dans son lait en beaucoup moins de place et de pollution&lt;/li&gt;
        &lt;li&gt;où les matières synthétiques ne sont pas dérivées du pétrole mais générées par des cellules&lt;/li&gt;
        &lt;li&gt;où les donnees génétiques sont du code, les cellules des microprocesseurs et les généticiens des développeurs: geek power!&lt;br /&gt;&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;La vie est la prochaine plate-forme, le vrai post-silicone. Oublier le cloud computing, le cloud computing est l'étape intermédiaire pour nous apprendre à faire du développement massivement distribué. Là où l'informatique silicone manipule des 0 et des 1, le bio développeur manipule des A,C,G,T.&lt;/p&gt;
      &lt;p&gt;Quelques chiffres clés:&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;100,000 milliards de cellules (10^14) dans le corps humain&lt;/li&gt;
        &lt;li&gt;6 milliards de bits dans le génome humain contenu dans chaque cellule (715 Mo)&lt;/li&gt;
        &lt;li&gt;donc le corps humain contient 68.187.713.623 To ou 63,5 Zetta octets (pour info au dessus il y a yotta et puis plus rien :) )&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;Une fois que le "hardware" sera peaufiné, il nous suffira d'écrire l'assembleur Vie, et la GVM Genetic Virtual Machine. L'expression code smell prendra tout son sens. Cela ouvre des perspectives totalement bluffantes! Cette perspective et cette vision de Juan Enriquez était tellement soufflante que je me suis dit "je veux bosser pour lui".&lt;/p&gt;
      &lt;p&gt;Une petite déception d'ailleurs puisqu'à part moi, les autres questions dans l'assemblée étaient négatives ou pessimistes: Quid de l'utilisation en tant qu'arme? Quid des risques de ceci et cela? Quid des règlementations à mettre en place? etc. On reconnait bien la mentalité française :(&lt;/p&gt;
      &lt;p&gt;L'USI est un mini &lt;a href="http://ted.com"&gt;TED&lt;/a&gt; dédié a l'IT. Le format geek / boss et les sessions de 20 minutes fonctionnent bien. Un grand merci aux USI boys and girls qui ont tout organisé et avec un peu de chance, à l'année prochaine :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/07/11/retour-sur-luniversite-du-si-2010-geek-et-boss-une-equipe-qui-gagne/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/05/31/git-how-my-life-has-improved-since-last-month-when-i-used-svn/</id>
    <title>Git: how my life has improved since last month when I used SVN</title>
    <updated>2010-05-31T00:00:00Z</updated>
    <published>2010-05-31T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/u9Y2EG_TqhY/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I've switched from SVN to Git (more git-svn actually) close to a month ago and that had to be a leap of faith. Rationally convincing someone that a DVCS is better is pretty hard because overall the life in SVN land is not that bad or does not appear to be. Note that I am using git-svn so I don't benefit from all the power of DVCSes. While nothing replace actually trying it, I thought it was worth the time to explain what I like about this new tool to help people jump too.
      
      This is not a post on why...
    </summary>
    <content type="html">
      &lt;p&gt;I've switched from SVN to Git (more git-svn actually) close to a month ago and that had to be a leap of faith. Rationally convincing someone that a DVCS is better is pretty hard because overall the life in SVN land is not that bad or does not appear to be. Note that I am using git-svn so I don't benefit from all the power of DVCSes. While nothing replace actually trying it, I thought it was worth the time to explain what I like about this new tool to help people jump too.
      &lt;/p&gt;
      &lt;p&gt;This is not a post on why merging is superior in Git compared to SVN (this is something you need to experience), it's a post on how Git is making my life easier.
      &lt;/p&gt;
      &lt;p&gt;This post is split is a few sections:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;some intro&lt;/li&gt;
      	&lt;li&gt;how to import a SVN repo into Git (feel free to skip this tutorial of you are interested in what I liked in Git compared to SVN)&lt;/li&gt;
      	&lt;li&gt;use case: multitasking in isolation&lt;/li&gt;
      	&lt;li&gt;use case: backporting bug fixes&lt;/li&gt;
      	&lt;li&gt;use case: writing better commits and commit histories&lt;/li&gt;
      	&lt;li&gt;resources&lt;/li&gt;
      &lt;/ul&gt;
      &lt;strong&gt;General&lt;/strong&gt;
      &lt;p&gt;If I had to summarize, Git gives me more freedom than SVN. I am not constrained by the tool in any way:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;it can follow whatever workflow I want&lt;/li&gt;
      	&lt;li&gt;it is fast&lt;/li&gt;
      	&lt;li&gt;as a net result my commits are clearer&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;I't hard for me to say that but since the move I do enjoy committing stuffs (I know, that's pretty scary).
      &lt;/p&gt;
      &lt;strong&gt;The bootstrap&lt;/strong&gt;
      &lt;p&gt;Here is a small tutorial section for people willing to import a project from SVN to Git and keep a bridge between the two. Due to a bug in git-svn for https imports, I am using Git 1.6.5.1 and not the 1.7.1 version.
      &lt;/p&gt;
      &lt;pre&gt;mkdir project; cd project;&amp;#x000A;git svn init --trunk=my/svn/repo/project/trunk/ \&amp;#x000A;             --tags=my/svn/repo/project/tags \&amp;#x000A;             --branches=my/svn/repo/project/branches \&amp;#x000A;             my/svn/repo/project&lt;/pre&gt;
      &lt;p&gt;You can optionally create a file containing a conversion between SVN logins and the committers names and email addresses
      &lt;/p&gt;
      &lt;pre&gt;jdoe = John Doe &amp;lt;jdoe@foo.com&amp;gt;&amp;#x000A;agaulois = Asterix &amp;lt;asterix@gaule.fr&amp;gt;&lt;/pre&gt;
      &lt;p&gt;In the logs, every time git-svn finds agaulois, it converts it to Asterix &amp;lt;asterix@gaule.fr&amp;gt;. If you want to do that, you need to create this file. Don't be afraid to miss a couple of logins, if you do, git-svn will stop and ask you to add it. In your Git repository directory, run
      &lt;/p&gt;
      &lt;pre&gt;git config svn.authorsfile ~/dir/myauthors.txt&lt;/pre&gt;
      &lt;p&gt;The next step is to fetch all the information. This is long, very long. The good news is that you can stop it and restart later.
      &lt;/p&gt;
      &lt;pre&gt;git svn fetch&lt;/pre&gt;
      &lt;p&gt;Once that is done, you are good to go. To update your Git repo with the new commits from SVN do
      &lt;/p&gt;
      &lt;pre&gt;git svn rebase&lt;/pre&gt;
      &lt;p&gt;To commit your set of local commits to SVN, do
      &lt;/p&gt;
      &lt;pre&gt;git svn dcommit&lt;/pre&gt;
      &lt;p&gt;Many people, especially in the open source community, consider DVCS as a bad thing because it encourages committers to keep their work locally and not share with others. In reality, it does not. People who share frequently will continue to do so, people who don't still don't and should be fired. Same as usual. In practice for me, I dcommit every 4 to 6 hours.
      &lt;/p&gt;
      &lt;p&gt;I do recommend to import one SVN project per Git repository. You will typically get several Git repos per SVN repo. The rule is import the biggest unit that you tag / branch in isolation in SVN. For example, for Hibernate, I've several Git repos:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;Hibernate Core (which contains all the modules)&lt;/li&gt;
      	&lt;li&gt;Hibernate Validator&lt;/li&gt;
      	&lt;li&gt;Hibernate Search&lt;/li&gt;
      	&lt;li&gt;JPA API&lt;/li&gt;
      	&lt;li&gt;Bean Validation API&lt;/li&gt;
      	&lt;li&gt;Bean Validation TCK&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;All of these have generally independent release cycles and version numbers. Apparently it is possible to aggregate Git repositories via the notion of superproject but I have not tried.
      &lt;/p&gt;
      &lt;p&gt;One golden rule: you cannot share a Git repository and pull changes back with someone else AND use it to commit in a SVN repository. That will be a mess because git-svn rewrites the commit unique identifiers. Forget sharing repos when you use git-svn unless you are abandoning SVN and are doing a one time import.
      &lt;/p&gt;
      &lt;strong&gt;Multitasking in Isolation&lt;/strong&gt;
      &lt;p&gt;The absolute coolest feature is the ability to work in total isolation on a given topic for very cheap. I am not necessarily talking about the ability to work offline on an island (though that's nice). I am talking about the ability to work on several subjects in parallel without complex settings.
      &lt;/p&gt;
      &lt;p&gt;Let's take an example. I was working on a new feature for Hibernate Search's query DSL. I branched &lt;em&gt;master&lt;/em&gt; to &lt;em&gt;dsl&lt;/em&gt; and started to work, including committing small chunks of work (more on this later). While working on it, I found a bug in the existing query engine. No problem, I literally stopped working on the new feature, put stuff aside (git stash). created a new branch off &lt;em&gt;master&lt;/em&gt; named &lt;em&gt;bug123&lt;/em&gt; and fixed the bug. When I was done with the bug fix, I applied it on &lt;em&gt;master&lt;/em&gt; and the &lt;em&gt;dsl&lt;/em&gt; branch and resumed my work there. There is the workflow:
      &lt;/p&gt;
      &lt;pre&gt;git checkout -b dsl #create the dsl branch and move to it&amp;#x000A;#work work commit work commit work&amp;#x000A;git stash #put not yet committed stuff aside&amp;#x000A;git checkout master&amp;#x000A;&amp;#x000A;git checkout -b bug123 #create bug fix branch&amp;#x000A;#work work #fix bug 123&amp;#x000A;git commit&amp;#x000A;git rebase master #apply commits of master on bug123 (not necessary in this case as I did nothing in master)&amp;#x000A;&amp;#x000A;git checkout master&amp;#x000A;git merge bug123 #merge bug123 and master&amp;#x000A;git branch -d bug123 #delete the useless branch&amp;#x000A;&amp;#x000A;git checkout dsl&amp;#x000A;git rebase master # apply commits of bug123&amp;#x000A;git stash pop #reapply uncommitted changes&amp;#x000A;#work&lt;/pre&gt;
      &lt;p&gt;It looks like a lot of operations but, it's very fluid and very fast!
      &lt;/p&gt;
      &lt;p&gt;What's the benefit? I've fixed a bug in isolation of my new feature even if the same files where impacted. I've committed the bug fix isolated: I can easily reapply it to maintenance branches (see below). Had I used SVN, I would have fixed the bug and committed "new feature + bug fix 123". I would not have backported the fix to our maintenance branch nor would have my co-workers because of the complexity to separate the new feature from the bug fix. In Git the process is so smooth that I even use it to bug fix typos in comments in isolation from my main work.
      &lt;/p&gt;
      &lt;p&gt;I should point out that switching branch is super fast and done in the same directory. You IDE quickly refreshes and you are ready to work in the same IDE window. For me that's a big plus over having to checkout a maintenance branch in a separate directory, set up my IDE and open a second IDE window to work in a different context of the same project: I work on five different projects on average, I can't afford a proliferation of IDE windows. With Git, the context switching comes with much less friction and saves me a lot of time.
      &lt;/p&gt;
      &lt;strong&gt;Backporting bug fixes&lt;/strong&gt;
      &lt;p&gt;In SVN land, to backport a bug, I either:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;generate the patch off of the SVN commit, and apply it on a checkout of the maintenance branch&lt;/li&gt;
      	&lt;li&gt;manually read the commit diff and select which change I want to apply (generally because somebody has committed the fix alongside a new feature or because it has committed the feature in 7 isolated commits)&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;In the first scenario (the easiest), it involves
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;generating the patch&lt;/li&gt;
      	&lt;li&gt;saving it as a file&lt;/li&gt;
      	&lt;li&gt;optionally checking out the maintenance branch (ie get a coffee)&lt;/li&gt;
      	&lt;li&gt;opening my new IDE window&lt;/li&gt;
      	&lt;li&gt;apply the patch&lt;/li&gt;
      	&lt;li&gt;commit the change with a log message&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;In Git, you:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;checkout the maintenance branch (2s)&lt;/li&gt;
      	&lt;li&gt;run the cherry-pick command (git cherry-pich sha1) over the commit or commits you want to copy from the main branch (logs are copied automatically though you can change them if needed)&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;So easy you actually do it :)
      &lt;/p&gt;
      &lt;strong&gt;Writing better commits and commit histories
      &lt;/strong&gt;
      &lt;p&gt;A feature I do like is the ability to uncommit things and rewrite / rearrange them. This is something you only do on the commits you have not yet shared (in my case not yet pushed to SVN). That looks like a stupid and useless feature but it turns out I use it all the time:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;I can commit an unstable work, explore a couple of approaches and come back if needed&lt;/li&gt;
      	&lt;li&gt;I can fix a typo or bad log message&lt;/li&gt;
      	&lt;li&gt;I can simplify the commit history by merging two or more commits (I typically merge commits I used as unstable checkpoints)&lt;/li&gt;
      	&lt;li&gt;These operations typically require 5 seconds or less&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;The net effect of being able to do that is:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;I write better log messages&lt;/li&gt;
      	&lt;li&gt;I commit more often / in smaller pieces, making my changes more readable&lt;/li&gt;
      	&lt;li&gt;If the pieces happen to be too small I merge them before synching with SVN&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;You can also do some more micro surgery. If you are changing code and realize that these are really two or three sets of changes and should be committed separately (changes from the the same file potentially). You can literally select which file / which line to commit. The tool GitX let's you do that very easily.
      &lt;/p&gt;
      &lt;p&gt;Git can do that because it does not track files, it tracks changes. You can stage some changes for commit (two new files and changes in three files), continue working on the same set of files and commit the state as defined when you initially staged it. Your subsequent changes can then be committed later. This is a subtle difference of approach (content management vs file management) but now that I have used it, I like it better. As a consequence, if you change a file, these changes won't be committed automatically next time you commit. You need to include them (that's what the &lt;em&gt;-a&lt;/em&gt; option is for when you run &lt;em&gt;git commit&lt;/em&gt;).
      &lt;/p&gt;
      &lt;strong&gt;Resources&lt;/strong&gt;
      &lt;p&gt;I absolutely recommend you to read Pro Git:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;that's a top quality book&lt;/li&gt;
      	&lt;li&gt;use case oriented&lt;/li&gt;
      	&lt;li&gt;and it's also available for free online &lt;a href="http://progit.org"&gt;http://progit.org&lt;/a&gt; (though go buy it too, it's well deserved)&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;Aside from that, I do use
      &lt;/p&gt;
      &lt;pre&gt;git help &lt;em&gt;command&lt;/em&gt;&lt;/pre&gt;
      &lt;p&gt;very often, their documentation is pretty good. Otherwise, Google is your friend, there are many resources out there.
      &lt;/p&gt;
      &lt;p&gt;I don't need / miss additional tools to work with Git. The command line is good enough and often less confusing (IntelliJ's integration confused me, so I don't use it unless I need to compare files). I do like to use &lt;a href="http://gitx.frim.nl/"&gt;GitX&lt;/a&gt; a graphical tool for two purposes:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;it displays branches and commits graphically&lt;/li&gt;
      	&lt;li&gt;it lets you easily stage specific lines of a file for later commit (the micro surgery tool)&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;That's it folks,
      &lt;/p&gt;
      &lt;p&gt;I hope you enjoyed the read and that I've encouraged you to give it a try. git-svn made the try a no brainer really. I've lost probably 16 hours to learn, try and understand Git. I'm confident I will get them back within the next three to four months (my ROI is covered :) ). You can also try it on any directory, I am now using Git to keep a revision history of all my presentations. Remember, no need to set up a server or anything complex. Run &lt;em&gt;git init&lt;/em&gt; and you are good to go.
      &lt;/p&gt;
      &lt;p&gt;Disclaimer: this is not a thorough comparison, just the feedback of a one month old user.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/05/31/git-how-my-life-has-improved-since-last-month-when-i-used-svn/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/05/04/no-meeting-always-beats-meeting/</id>
    <title>"No meeting" always beats "Meeting"</title>
    <updated>2010-05-04T00:00:00Z</updated>
    <published>2010-05-04T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/kj8bA6Ra9A4/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I was chatting with a colleague on a feature that is loooooooong overdue and proposed to kill a meeting and use the time saved to write the damn thing.
      
      He replied to me
      
      Believe me, I would like to drop a meeting, not sure which one.
      To which I replied
      
      That's easy, anyone of them :)
      and gave my thoughts on meetings.
      
      If there is a need for bi-weekly meetings to integrate XXX and XXX, we've got a problem that meetings can't solve.
      
      I have a radical take on meetings, especially regularly scheduled meetings:
      
      
      	assuming n persons in the meeting you waste most of the time n-2 people's...
    </summary>
    <content type="html">
      &lt;p&gt;I was chatting with a colleague on a feature that is loooooooong overdue and proposed to kill a meeting and use the time saved to write the damn thing.
      &lt;/p&gt;
      &lt;p&gt;He replied to me
      &lt;/p&gt;
      &lt;blockquote&gt;Believe me, I would like to drop a meeting, not sure which one.&lt;/blockquote&gt;
      &lt;p&gt;To which I replied
      &lt;/p&gt;
      &lt;blockquote&gt;That's easy, anyone of them :)&lt;/blockquote&gt;
      &lt;p&gt;and gave my thoughts on meetings.
      &lt;/p&gt;
      &lt;p&gt;If there is a need for bi-weekly meetings to integrate XXX and XXX, we've got a problem that meetings can't solve.
      &lt;/p&gt;
      &lt;p&gt;I have a radical take on meetings, especially regularly scheduled meetings:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;assuming n persons in the meeting you waste most of the time n-2 people's time (and if n&amp;gt;10, it's likely n-1 people's time)&lt;/li&gt;
      	&lt;li&gt;people tend to not prepare meetings. They instead think about the issue at stake while in the meeting and thus wasting n-1 people's time. Force people to write ideas in a (somewhat short) email, and that will force them to think about the issue more deeply and synthesize.&lt;/li&gt;
      	&lt;li&gt;a need for a regular scheduled meeting is a sign of lack of trust, lack of natural communication and/or lack of proper task isolation: in any case, better treat the problem at the source than patching with a meeting.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;The key to open source success is multiple but one big component is extreme resource/time stress. This constraint leads to:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;very focused teams&lt;/li&gt;
      	&lt;li&gt;limited need for sync-up style communication (hence the usual small core team)&lt;/li&gt;
      	&lt;li&gt;proper separation of tasks to limit waste&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;I am not against communication, I am against communication wasting time (the asymptotic version being pure noise). I favor 1-1 communication personally as the most efficient brain-picking strategy.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/05/04/no-meeting-always-beats-meeting/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/04/01/automatically-lock-your-computer-when-you-go-away/</id>
    <title>Automatically lock your computer when you go away</title>
    <updated>2010-04-01T00:00:00Z</updated>
    <published>2010-04-01T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/JkBZXanQXbo/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      If you are like me, your colleagues like to pown you when you leave your laptop unlocked. Here is a super easy solution to lock your Mac automatically when you leave it: if your cellphone is out of bluetooth range, lock your computer. Easy, efficient.
      
      Here is how to do it:
      
      
      	Download Proximity: this application does detect bluetooth devices and lets you launch scripts upon detection or absence of detection (download page here).
      	Copy Proximity.app in /Applications
      	Start the Proximity.app and open its preference panel (the application adds itself to the menu bar next to your clock)
      	Reduce the device monitoring to 30s or so...
    </summary>
    <content type="html">
      &lt;p&gt;If you are like me, your colleagues like to pown you when you leave your laptop unlocked. Here is a super easy solution to lock your Mac automatically when you leave it: if your cellphone is out of bluetooth range, lock your computer. Easy, efficient.
      &lt;/p&gt;
      &lt;p&gt;Here is how to do it:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;Download &lt;a href="http://code.google.com/p/reduxcomputing-proximity/"&gt;Proximity&lt;/a&gt;: this application does detect bluetooth devices and lets you launch scripts upon detection or absence of detection (download page &lt;a href="http://code.google.com/p/reduxcomputing-proximity/downloads/list"&gt;here&lt;/a&gt;).&lt;/li&gt;
      	&lt;li&gt;Copy Proximity.app in /Applications&lt;/li&gt;
      	&lt;li&gt;Start the Proximity.app and open its preference panel (the application adds itself to the menu bar next to your clock)&lt;/li&gt;
      	&lt;li&gt;Reduce the device monitoring to 30s or so (less time for your colleagues to mess around)&lt;/li&gt;
      	&lt;li&gt;Add the device (the device needs to be linked with your computer bluetooth, you can do that in System Preference)&lt;/li&gt;
      	&lt;li&gt;Add an AppleScript that will be run when your cellphone goes out of range (see below)&lt;/li&gt;
      	&lt;li&gt;Optionally add an AppleScript that will be run when your cellphone goes back in range&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;The AppleScript to lock your computer is pretty simple. Create a file name out-of-range.scpt and add:
      &lt;/p&gt;
      &lt;pre&gt;-- out-of-range.scpt&amp;#x000A;&amp;#x000A;tell application "ScreenSaverEngine" to activate&lt;/pre&gt;
      &lt;p&gt;You can do many more things in these AppleScripts like:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;change your Adium and Skype status&lt;/li&gt;
      	&lt;li&gt;unlock your screen when you come back in range&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;This &lt;a href="http://www.technocrat.ca/?p=44"&gt;other blog entry&lt;/a&gt; has a fairly compete setting example. I personally purposely do not unlock the screen when I come back in range. It's safer to ask for the password explicitly incase someone... borrows your cellphone.
      &lt;/p&gt;
      &lt;p&gt;Unlike some more complex apps, Proximity is pretty simple and does not let you decide at which range a bluetooth device is considered out-of-range. The good thing is that it is pretty soft on your cellphone battery.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/04/01/automatically-lock-your-computer-when-you-go-away/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/03/31/book-review-jboss-as-5-development-by-francesco-marchioni/</id>
    <title>Book review: JBoss AS 5 Development by Francesco Marchioni</title>
    <updated>2010-03-31T00:00:00Z</updated>
    <published>2010-03-31T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/etfFBlHIhuk/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I've been reading JBoss AS 5 Development by Francesco Marchioni published by Packt Publishing. I must say that I quite enjoyed the book because it is complementing my knowledge perfectly.
      
      I know Java EE 5 and 6 quite well, I've been working on it, promoting it, yada yada yada. But when it comes to details on how to configure JBoss AS beyond the standard and the EE programmatic model, my knowledge leaves a lot to be desired.
      
      Good for:
      If you want to know how to:
      
      
      	change the HTTP port
      	create two independent clusters on a single network
      	customize the thead pools of your HTTP requests,...
    </summary>
    <content type="html">
      &lt;p&gt;I've been reading &lt;a href="https://www.packtpub.com/jboss-as-5-development/book"&gt;JBoss AS 5 Development&lt;/a&gt; by Francesco Marchioni published by Packt Publishing. I must say that I quite enjoyed the book because it is complementing my knowledge perfectly.
      &lt;/p&gt;
      &lt;p&gt;I know Java EE 5 and 6 quite well, I've been working on it, promoting it, yada yada yada. But when it comes to details on how to configure JBoss AS beyond the standard and the EE programmatic model, my knowledge leaves a lot to be desired.
      &lt;/p&gt;
      &lt;strong&gt;Good for:&lt;/strong&gt;
      &lt;p&gt;If you want to know how to:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;change the HTTP port&lt;/li&gt;
      	&lt;li&gt;create two independent clusters on a single network&lt;/li&gt;
      	&lt;li&gt;customize the thead pools of your HTTP requests, EJB 3 components etc&lt;/li&gt;
      	&lt;li&gt;tweak the transaction manager&lt;/li&gt;
      	&lt;li&gt;secure your JBoss AS installation&lt;/li&gt;
      	&lt;li&gt;etc&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;This book is a gold mine. Using the index or the table of content, you will reach the information in a minute.
      &lt;/p&gt;
      &lt;p&gt;If you want to know how the JBoss Tools can help you:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;create an application&lt;/li&gt;
      	&lt;li&gt;deploy / undeploy apps&lt;/li&gt;
      	&lt;li&gt;add new components, pages&lt;/li&gt;
      	&lt;li&gt;etc&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;This book will give you nice how-tos that will hold your hands from tooling installation to configuration and wizard usage.
      &lt;/p&gt;
      &lt;p&gt;Francesco also explains the basics of the EE programmatic model. This is quite handy as it helps you to kink a configuration trick to an application behavior: all configurations are described with how they impact your application behavior and what it means if you change them.
      &lt;/p&gt;
      &lt;strong&gt;Not good for:&lt;/strong&gt;
      &lt;p&gt;If you are looking for a book that explain the Java EE programmatic model and development practice in detail, this is not the book for you. You're better off looking at Seam in Action or any other EE targeted book.
      &lt;/p&gt;
      &lt;p&gt;I will keep the book next to me when I develop and deploy on JBoss AS. Finding the right config or tuning will be much faster than a reckless Google search :) Reading this book, you feel that Francesco uses every bits of JBoss AS, loves it and wants to share his knowledge. Keep going :)
      &lt;/p&gt;
      &lt;p&gt;Disclosure: Swati from Packt Publishing sent me the book for free. I stand by what I said in this blog though.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/03/31/book-review-jboss-as-5-development-by-francesco-marchioni/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/03/17/getter-setter-generation-in-java/</id>
    <title>Getter / Setter generation in Java</title>
    <updated>2010-03-17T00:00:00Z</updated>
    <published>2010-03-17T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/zSCAhr_aqgA/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Eclipse or IntelliJ typically generate getters and setters this way:
      
      public class Month {
      
          private String name;
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      }
      
      And we all complain because that consumes a lot of screen space (9 lines). Provided that the trio attribute / getter / setter really represents a unique property, why not generate it that way?
      
      public class Month {
      
         ...
    </summary>
    <content type="html">
      &lt;p&gt;Eclipse or IntelliJ typically generate getters and setters this way:
      &lt;/p&gt;
      &lt;pre&gt;public class Month {&amp;#x000A;&amp;#x000A;    private String name;&amp;#x000A;&amp;#x000A;    public String getName() {&amp;#x000A;        return name;&amp;#x000A;    }&amp;#x000A;&amp;#x000A;    public void setName(String name) {&amp;#x000A;        this.name = name;&amp;#x000A;    }&amp;#x000A;}&lt;/pre&gt;
      &lt;p&gt;And we all complain because that consumes a lot of screen space (9 lines). Provided that the trio attribute / getter / setter really represents a unique property, why not generate it that way?
      &lt;/p&gt;
      &lt;pre&gt;public class Month {&amp;#x000A;&amp;#x000A;    public String getName() { return this.name; }&amp;#x000A;    public void setName(String name) { this.name = name; }&amp;#x000A;    private String name;&amp;#x000A;&amp;#x000A;}&lt;/pre&gt;
      &lt;p&gt;That's much more compact (3 lines, ie a third of what we had) and put all related constructs as a single block. You can also mutualize the JavaDoc for free :)
      &lt;/p&gt;
      &lt;p&gt;What do you think?
      &lt;/p&gt;
      &lt;p&gt;Oh and please don't tell me about Scala, Groovy or Fantom, we all know Java should have had first-class properties. But that's life.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/03/17/getter-setter-generation-in-java/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/02/28/podcast-part-i-recording/</id>
    <title>Podcast part I: recording</title>
    <updated>2010-02-28T00:00:00Z</updated>
    <published>2010-02-28T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/wHJrCZFDgWg/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I have been producing podcasts for almost a year now, primarily at Les Cast Codeurs (a French podcast on Java) but also helped a bit on JBoss Community Asylum Podcast.
      
      I have been wanting to share my knowledge and experience for a little while now. I'll split that in three parts:
      
      
      	recording
      	mixing
      	publishing
      
      First things first then, for today the recording.
      
      The material
      Microphone
      I use the Snowball from Blue Microphones and am very very happy with it. The sound is great, I can also carry it with me to do interviews as it has an option for 360° recording. It plugs into my USB port, is...
    </summary>
    <content type="html">
      &lt;p&gt;I have been producing podcasts for almost a year now, primarily at &lt;a href="http://lescastcodeurs.com"&gt;Les Cast Codeurs&lt;/a&gt; (a French podcast on Java) but also helped a bit on &lt;a href="http://asylum.jboss.org"&gt;JBoss Community Asylum Podcast&lt;/a&gt;.
      &lt;/p&gt;
      &lt;p&gt;I have been wanting to share my knowledge and experience for a little while now. I'll split that in three parts:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;recording&lt;/li&gt;
      	&lt;li&gt;mixing&lt;/li&gt;
      	&lt;li&gt;publishing&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;First things first then, for today the recording.
      &lt;/p&gt;
      &lt;strong&gt;The material&lt;/strong&gt;
      &lt;em&gt;Microphone&lt;/em&gt;
      &lt;p&gt;I use the &lt;a href="http://www.bluemic.com/snowball/"&gt;Snowball&lt;/a&gt; from Blue Microphones and am very very happy with it. The sound is great, I can also carry it with me to do interviews as it has an option for 360° recording. It plugs into my USB port, is self powered and looks gorgeous on my desk ;)
      &lt;/p&gt;
      &lt;p&gt;But in all reality, any USB microphone will do. For a long time I have been using the &lt;a href="http://www.amazon.com/Plantronics-Foldable-USB-Optimized-470/dp/B000VVXO7E"&gt;Plantronics 470 USB&lt;/a&gt;. The nice thing about this model is that it's foldable and fits nicely in a traveler's bag. Note that my version has a small bug: sometimes, after an hour or so of recording, the sound gets mangled. What I need to do is to unplug and replug the USB dongle. Hopefully, this annoying bug is no more in recent versions.
      &lt;/p&gt;
      &lt;em&gt;Skype&lt;/em&gt;
      &lt;p&gt;If you can, all meet in the same room to record your podcast. First, it's nice to see people but more importantly, it will make the mixing work much much easier (see next post).
      &lt;/p&gt;
      &lt;p&gt;If you cannot, no problem, Skype is indeed surprisingly good to produce podcast. Just make sure everyone is on a decent connection and preferably on ethernet rather than WiFi. Oh and do not start the video, that will save some bandwidth and audio quality.
      &lt;/p&gt;
      &lt;strong&gt;Recording&lt;/strong&gt;
      &lt;em&gt;Recording strategy&lt;/em&gt;
      &lt;p&gt;There are two schools here.
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;Record the sound on one computer: basically the sound coming out of Skype&lt;/li&gt;
      	&lt;li&gt;Record each podcast speaker locally (while speaking on skype) and mix the tracks together down the road.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;The former is good in that it reduces the amount of mixing you have to do down the road. But it has a few drawbacks:
      &lt;/p&gt;
      &lt;ul&gt;
      	&lt;li&gt;the sound quality won't be as good as the second approach as you are dependent on Skype's instant quality. While it's easy to recover missing words from a conversation while *into* it, it's quite tedious when you are listening to a podcast.&lt;/li&gt;
      	&lt;li&gt;people tend to speak at the same time on skype. Since you don't have instant visual feedback, it's quite common to speak at the same time create a lovely cacophony.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p&gt;You can record the Skype flux with tools like &lt;a href="http://www.rogueamoeba.com/audiohijackpro/"&gt;Audio Hijack Pro&lt;/a&gt; (on Mac, $32). There are free alternatives but simplicity is key for me and avoid mistakes (like not recording).
      &lt;/p&gt;
      &lt;p&gt;The second approach (ie. recording each local voice while speaking on skype) is pretty easy to set up but requires everyone to record locally. The easiest solution is to download &lt;a href="http://audacity.sourceforge.net/"&gt;Audacity&lt;/a&gt; (free and open source) and ask everyone to click on the record button.
      &lt;/p&gt;
      &lt;p&gt;Right before starting the podcast, make sure to have a common signal to sync the various tracks. I usually count down (3, 2, 1) and everybody say zero at the same time. And voilà, I've got my mark. Also ask everybody to stay silent for a couple of seconds: that will come handy during the mixing phase.
      &lt;/p&gt;
      &lt;p&gt;I personally ask everyone to record locally. I also record my Skype flux as a backup. It's quite painful to have to re-record a podcast, so better avoid it.
      &lt;/p&gt;
      &lt;p&gt;PS: if someone can record the sound coming from Skype AND the local sound from my mic in the same file via Audio Hijack Pro, let me know. I know it's possible but for some reason it does not work for me (not a huge problem as it's not my workflow).
      &lt;/p&gt;
      &lt;em&gt;Recording format&lt;/em&gt;
      &lt;p&gt;Make sure to record in a non destructive format like WAV or AIFF. The reason is that you will apply a bunch of mixing tricks down the road and getting the real bits are going to help. The size is going to be roughly 700 MB per hour and per person.
      &lt;/p&gt;
      &lt;p&gt;What you can do to cut down the hard drive and bandwidth bill is to use the FLAC format that is a non-descructive compressed audio format. I personally use &lt;a href="http://sbooth.org/Max/"&gt;Max&lt;/a&gt; a free audio converter tool for Mac OS to convert my WAV or AIIF into FLAC. One hour of recording then goes down to 200 MB (around 4 times the MP3 equivalent). Audacity also can record in FLAC nateively in the latest beta version.
      &lt;/p&gt;
      &lt;em&gt;Backup&lt;/em&gt;
      &lt;p&gt;If you use the local recording approach, do yourself a favor, create a &lt;a href="https://www.dropbox.com/referrals/NTY5MjMxODk"&gt;Dropbox account&lt;/a&gt;. It's free for up to 2 GB, it's a breeze to share files with others even my mother can do it: Dropbox materialized itself as a local directory synchronized in the cloud and subdirectories are sharable. The link I gave is a referral link and you get an extra 250 MB free if you use it.
      &lt;/p&gt;
      &lt;p&gt;Anyway, all the podcast participants must send you their audio file. Make sure to back them up right away (yes I know I'm paranoid). One solution is to leave them on Dropbox while you are mixing them on a different copy.
      &lt;/p&gt;
      &lt;strong&gt;Other&lt;/strong&gt;
      &lt;p&gt;That's pretty much it for the technical side of it. Make sure to have fun when doing your podcast. You'll be happier, people will notice the more natural tone and you will be more popular.
      &lt;/p&gt;
      &lt;p&gt;Another trick is regularity: record your podcast regularly. It could be once a week, once every two weeks, once a month. That will set your listeners expectations. Make sure not to overestimate your commitment: one a month is big enough. As you will see in the mixing blog post, it's a lot of work especially when you are a beginner. It's not unheard of to spend 6 or 7 times the final podcast length to record and publish it.
      &lt;/p&gt;
      &lt;p&gt;The second part will be about Mixing your podcast.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/02/28/podcast-part-i-recording/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/02/22/jsf-days-2010-tomorrow-and-wednesday/</id>
    <title>JSF Days 2010 Tomorrow and Wednesday</title>
    <updated>2010-02-22T00:00:00Z</updated>
    <published>2010-02-22T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/CYsZvvJnGLw/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      If the gods of French and German strikes allow me, I will be speaking at the JSF Days conference organized by Irian.
      
      I will first talk about Hibernate Search and how the magic of approximation works in Full-text search and the next day I will cover Bean Validation and how it integrates in the Java ecosystem and JBoss AS 6 Milestone 2.
      
      Come and say hi if you are in the Vienna area.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;If the gods of French and German strikes allow me, I will be speaking at the &lt;a href="http://jsfdays.irian.at/main/index.jsf"&gt;JSF Days conference&lt;/a&gt; organized by Irian.
      &lt;/p&gt;
      &lt;p&gt;I will first talk about Hibernate Search and how the magic of approximation works in Full-text search and the next day I will cover Bean Validation and how it integrates in the Java ecosystem and &lt;a href="http://www.jboss.org/jbossas"&gt;JBoss AS 6&lt;/a&gt; Milestone 2.
      &lt;/p&gt;
      &lt;p&gt;Come and say hi if you are in the Vienna area.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/02/22/jsf-days-2010-tomorrow-and-wednesday/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/02/10/migrating-from-blogger-esp-ftp-to-wordpress/</id>
    <title>Migrating from Blogger (esp FTP) to Wordpress</title>
    <updated>2010-02-10T00:00:00Z</updated>
    <published>2010-02-10T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/5ttLHxvMquk/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I am one of the "few" that have been let down by Blogger. They no longer support FTP export which makes it a no go for me.
      
      I've decided to move over to a self hosted Wordpress. It was a very easy process overall, this blog summarizes the few steps needed.
      
      1. Install Wordpress
      The first step is to install Wordpress. My provider offers a very easy install via SimpleScript.
      
      I have personally installed Wordpress in a subdirectory of my blog site to avoid messing with the existing files.
      
      2. Find a theme you like
      Moving along, nothing to see here. Pick and chose from the...
    </summary>
    <content type="html">
      &lt;p&gt;I am one of the "few" that have been &lt;a href="http://blogger-ftp.blogspot.com/2010/01/deprecating-ftp.html"&gt;let down&lt;/a&gt; by Blogger. They no longer support FTP export which makes it a no go for me.
      &lt;/p&gt;
      &lt;p&gt;I've decided to move over to a self hosted Wordpress. It was a very easy process overall, this blog summarizes the few steps needed.
      &lt;/p&gt;
      &lt;strong&gt;1. Install Wordpress&lt;/strong&gt;
      &lt;p&gt;The first step is to install Wordpress. My provider offers a very easy install via SimpleScript.
      &lt;/p&gt;
      &lt;p&gt;I have personally installed Wordpress in a subdirectory of my blog site to avoid messing with the existing files.
      &lt;/p&gt;
      &lt;strong&gt;2. Find a theme you like&lt;/strong&gt;
      &lt;p&gt;Moving along, nothing to see here. Pick and chose from the theme explorer in the admin console of Wordpress.
      &lt;/p&gt;
      &lt;strong&gt;3. Move your Blogger blog from FTP publishing to&lt;/strong&gt; &lt;em&gt;&lt;strong&gt;myrandomblog&lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;.blogspot.com publishing&lt;/strong&gt;
      &lt;p&gt;For the import to work, you need to expose your Blogger blog as a blogger hosted website. Don't worry, since your blog is already published, your users will still be able to access it while you are messing around.
      &lt;/p&gt;
      &lt;strong&gt;4. Create a user (optionally)&lt;/strong&gt;
      &lt;p&gt;By default, the user is &lt;em&gt;admin&lt;/em&gt; but you can create a dedicated user (in my case &lt;em&gt;emmanuel&lt;/em&gt;).
      &lt;/p&gt;
      &lt;strong&gt;5. Import your posts and comments&lt;/strong&gt;
      &lt;p&gt;In the Wordpress admin console, go to Tools, select import, Blogger, the specific blog you want to import (in this case &lt;em&gt;myrandomblog&lt;/em&gt;), and click. You can optionally associate your posts to a user in Wordpress ( hence step 4. :) )
      &lt;/p&gt;
      &lt;strong&gt;6. Adjust the .htaccess (if in a subdirectory)&lt;/strong&gt;
      &lt;p&gt;In the root directory of your website create an .htaccess file if you don't have one already and add the following rule.
      &lt;/p&gt;
      &lt;blockquote&gt;DirectoryIndex index.php wordpress/index.php
      &lt;p&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;
      &lt;/p&gt;
      &lt;p&gt;RewriteEngine On
      &lt;/p&gt;
      &lt;p&gt;#point to the wordpress directory
      &lt;/p&gt;
      &lt;p&gt;RewriteBase /wordpress/
      &lt;/p&gt;
      &lt;p&gt;RewriteCond %{REQUEST_FILENAME} !-f
      &lt;/p&gt;
      &lt;p&gt;RewriteCond %{REQUEST_FILENAME} !^atom.xml$
      &lt;/p&gt;
      &lt;p&gt;RewriteCond %{REQUEST_FILENAME} !^feed$
      &lt;/p&gt;
      &lt;p&gt;RewriteRule . /wordpress/index.php [L]
      &lt;/p&gt;
      &lt;p&gt;&amp;lt;/IfModule&amp;gt;
      &lt;/p&gt;
      &lt;/blockquote&gt;
      &lt;strong&gt;7. Adjust your feed to point to Feedburner (optional)&lt;/strong&gt;
      &lt;p&gt;If you use feedburner and want your feeds to point to the feedburner feed, install FD Feedburner Plugin (from the Wordpress admin console, select Plugins-&amp;gt; add new
      &lt;/p&gt;
      &lt;p&gt;Then burn your feed in feedburner (or reburn it if you already have a feedburner feed). The URL to burn is typically blog.mywebsite.com/feed
      &lt;/p&gt;
      &lt;p&gt;Copy your feedburner feed URL in the Feedburner plugin configuration (you can reach it form the Plugins menu).
      &lt;/p&gt;
      &lt;p&gt;Note, you can also burn your comments feed using the same solution.
      &lt;/p&gt;
      &lt;strong&gt;8. Redirect your old feed to the Wordpress feed&lt;/strong&gt;
      &lt;p&gt;Blogger publishes your feed in &lt;em&gt;atom.xml&lt;/em&gt; by default (unless you have overridden that in the publishing panel). Let's redirect the old feed to the new feed, you don't want to lose your existing followers, do you?
      &lt;/p&gt;
      &lt;p&gt;In your &lt;em&gt;.htaccess&lt;/em&gt; file, add the following line
      &lt;/p&gt;
      &lt;blockquote&gt;Redirect permanent /atom.xml /feed&lt;/blockquote&gt;
      &lt;p&gt;You might have noticed that one of the RewriteCond rules is about the &lt;em&gt;atom.xm&lt;/em&gt;l file. If your feed is publicly available to a different file, change that as well.
      &lt;/p&gt;
      &lt;strong&gt;9. Do not delete your old .html files (optional)&lt;/strong&gt;
      &lt;p&gt;I've decided not to delete the old .html files that were pushed by Blogger. My reason was to let old references to still work. It's up to you.
      &lt;/p&gt;
      &lt;p&gt;And you are done. Happy blogging :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/02/10/migrating-from-blogger-esp-ftp-to-wordpress/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2010/02/09/le-parisjug-deux-ans-apres/</id>
    <title>Le ParisJUG deux ans après</title>
    <updated>2010-02-09T00:00:00Z</updated>
    <published>2010-02-09T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/UawAadJrMks/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      For people who either don't speak French or are not in Paris tomorrow, skip this post, it's useless to you :)
      
      Le ParisJUG a maintenant deux ans. Difficile de se rappeler Paris sans un JUG vivant et actif. Difficile de se rappeler la France sans ses 437.654 JUGs. Merci à Antonio et toute l'équipe pour avoir initié cette aventure.
      
      La soirée d'anniversaire est aujourd'hui mardi 9 février 2010 à 18:45. Venez nous rejoindre pour une soirée qui célébrera l'open source français avec Sacha Labourey (voir plus ;) ) en guest star. On est déjà au moins 348, donc un de plus, un...
    </summary>
    <content type="html">
      &lt;p&gt;For people who either don't speak French or are not in Paris tomorrow, skip this post, it's useless to you :)
      &lt;/p&gt;
      &lt;p&gt;Le &lt;a href="http://parisjug.org"&gt;ParisJUG&lt;/a&gt; a maintenant deux ans. Difficile de se rappeler Paris sans un JUG vivant et actif. Difficile de se rappeler la France sans ses 437.654 JUGs. Merci à Antonio et toute l'équipe pour avoir initié cette aventure.
      &lt;/p&gt;
      &lt;p&gt;La soirée d'anniversaire est aujourd'hui mardi 9 février 2010 à 18:45. Venez nous rejoindre pour une soirée qui célébrera l'open source français avec Sacha Labourey (voir plus ;) ) en guest star. On est déjà au moins 348, donc un de plus, un de moins ;) Inscription gratuite mais nécessaire &lt;a href="http://parisjug.org/xwiki/bin/view/Meeting/20100209"&gt;ici&lt;/a&gt;.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2010/02/09/le-parisjug-deux-ans-apres/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2009/10/13/hit-the-road-jack/</id>
    <title>Hit the road Jack</title>
    <updated>2009-10-13T00:00:00Z</updated>
    <published>2009-10-13T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/j2RDJ5YHbFM/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Now that I am done with my what took a lot of my time recently, I will be on the road for pretty much the whole month of november all over Europe to spread the word.First and foremost, I will inaugurate the new MarsJUG (in Marseille) on October 15th. I will be talking about Hibernate Search and how to implement clever full-text search engines using approximations (phonetic approximation etc).I will also be speaking in Munich at the W-JAX conference on November 10th and 11th. This time I will cover:  Bean Validation (JSR-303) and Hibernate Validator 4 (just released) ...
    </summary>
    <content type="html">
      &lt;p&gt;Now that I am done with my &lt;a href="http://in.relation.to/Bloggers/HibernateValidator4Unleashed"&gt;what took a lot of my time recently&lt;/a&gt;, I will be on the road for pretty much the whole month of november all over Europe to spread the word.&lt;/p&gt;&lt;p&gt;First and foremost, I will inaugurate the new &lt;a href="http://www.marsjug.org/"&gt;MarsJUG&lt;/a&gt; (in Marseille) on October 15th. I will be talking about Hibernate Search and how to implement clever full-text search engines using approximations (phonetic approximation etc).&lt;/p&gt;&lt;p&gt;I will also be speaking in Munich at the &lt;a href="http://it-republik.de/jaxenter/wjax09/"&gt;W-JAX&lt;/a&gt; conference on November 10th and 11th. This time I will cover:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;Bean Validation (JSR-303) and Hibernate Validator 4 (just released)&lt;/li&gt;  &lt;li&gt;What's new in Java Persistence 2.0. I will spend a good chunk of it to explain the new type-safe Criteria API&lt;/li&gt;  &lt;li&gt;Hibernate Search and how to do full-text searches with Hibernate-based applications&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Next in line is Devoxx where I will give a university talk on Hibernate Search. If you want to know everything about Hibernate Search, this is the time! This is November 17th in the afternoon. This is an interesting format (3 hours), where i will cover a bunch of what is in my book &lt;a href="http://www.amazon.com/dp/1933988649?tag=hsia-20&amp;amp;camp=213381&amp;amp;creative=390973&amp;amp;linkCode=as4&amp;amp;creativeASIN=1933988649&amp;amp;adid=12TS2185Z8X14AKT175F&amp;amp;"&gt;Hibernate Search in Action&lt;/a&gt; and do a handful of demonstrations.&lt;/p&gt;&lt;p&gt;Last but not least, I will be speaking at &lt;a href="http://www.alphacsp.com/web/guest/javaedge-2009/about"&gt;JavaEdge '09&lt;/a&gt; on November 16th in Israel. This time about Bean Validation and Hibernate 4.&lt;/p&gt;&lt;p&gt;If you come by these cities at the right time, come and join me! Between one of these conferences is my birthday :o)&lt;/p&gt;&lt;p&gt;&lt;b&gt;Edit:&lt;/b&gt; I forgot that I will be speaking at the &lt;a href="http://www.parisjug.org"&gt;ParisJUG&lt;/a&gt; on &lt;a href="http://www.parisjug.org/xwiki/bin/view/Meeting/20091208"&gt;December 8th&lt;/a&gt; about Bean Validation. Right after a healthy debate on Spring vs EE 6 (I heard that extra medics and blood supply have been planned)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2009/10/13/hit-the-road-jack/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2009/09/24/jboss-community-asylum-a-new-podcast-with-bits-of-me-in-it/</id>
    <title>JBoss Community Asylum - a new podcast with bits of me in it</title>
    <updated>2009-09-24T00:00:00Z</updated>
    <published>2009-09-24T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/2JjWtCKC0ew/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Remember my French podcast Les Cast Codeurs? (Doing well, thank you for asking) Well apparently, I did not have enough and started a new one. In English this time.JBoss Community Asylum. A podcast on, by and about the JBoss Community and its gazilllllllion projects and ideas. It's available here and the iTunes link is here. Basically, instead of blaming people about the lack of podcasts on the great tech at jboss.org, Max R. Andersen (JBoss Tools), Michael Neale (Drools + cloud thingies) and me have decided to give it a shot. You will get the latest news on from the...
    </summary>
    <content type="html">
      &lt;p&gt;&lt;a href="http://blog.emmanuelbernard.com/2009/04/les-cast-codeurs-podcast-is-born.html"&gt;Remember&lt;/a&gt; my French podcast &lt;a href="http://lescastcodeurs.com/"&gt;Les Cast Codeurs&lt;/a&gt;? (Doing well, thank you for asking) Well apparently, I did not have enough and started a new one. In English this time.&lt;/p&gt;&lt;p&gt;JBoss Community Asylum. A podcast on, by and about the JBoss Community and its gazilllllllion projects and ideas. It's available &lt;a href="http://asylum.libsyn.com/"&gt;here&lt;/a&gt; and the iTunes link is &lt;a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=332953048"&gt;here&lt;/a&gt;. Basically, instead of blaming people about the lack of podcasts on the great tech at jboss.org, Max R. Andersen (JBoss Tools), Michael Neale (Drools + cloud thingies) and me have decided to give it a shot. You will get the latest news on from the JBoss sphere and we will likely interview folks about their projects.&lt;/p&gt;&lt;p&gt;Let us know what you think and how you would like it to evolve. It's a low-key bottom-up approach so anything's possible.&lt;/p&gt;&lt;p&gt;PS: I made progress, I am not the sound engineer this time, yeah!&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2009/09/24/jboss-community-asylum-a-new-podcast-with-bits-of-me-in-it/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2009/08/10/book-review-dependency-injection-by-dhanji-prasanna/</id>
    <title>Book review: Dependency Injection by Dhanji Prasanna</title>
    <updated>2009-08-10T00:00:00Z</updated>
    <published>2009-08-10T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/R7y_cd1ROwU/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Over the last few days, I have been reading Dependency Injection by Dhanji Prasanna published by Manning. I must admit, this is a much easier task than writing Hibernate Search in Action ;)Summary first: very easy to read, a gold mine of knowledge and tips on a subject that is essential to the life of today's Java developers. Go buy it and keep it around your desk.Let's quickly talk about the book structure. The book walks you gently through the DI (Dependency Injection) subject:  why do you need DI, what does it solves concretely in application developments  what...
    </summary>
    <content type="html">
      &lt;p&gt;Over the last few days, I have been reading &lt;a href="http://www.manning.com/affiliate/idevaffiliate.php?id=952_154"&gt;Dependency Injection&lt;/a&gt; by Dhanji Prasanna published by &lt;a href="http://www.manning.com/affiliate/idevaffiliate.php?id=952"&gt;Manning&lt;/a&gt;. I must admit, this is a much easier task than writing &lt;a href="http://www.amazon.com/dp/1933988649?tag=hsia-20&amp;amp;camp=213381&amp;amp;creative=390973&amp;amp;linkCode=as4&amp;amp;creativeASIN=1933988649&amp;amp;adid=12TS2185Z8X14AKT175F&amp;amp;"&gt;Hibernate Search in Action&lt;/a&gt; ;)&lt;/p&gt;&lt;p&gt;Summary first: very easy to read, a gold mine of knowledge and tips on a subject that is essential to the life of today's Java developers. Go buy it and keep it around your desk.&lt;/p&gt;&lt;p&gt;Let's quickly talk about the book structure. The book walks you gently through the DI (Dependency Injection) subject:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;why do you need DI, what does it solves concretely in application developments&lt;/li&gt;  &lt;li&gt;what is injection, what are the main concepts&lt;/li&gt;  &lt;li&gt;using DI to improve application modularity&lt;/li&gt;  &lt;li&gt;object scoping and how to approach that with DI solutions&lt;/li&gt;  &lt;li&gt;best practices learnt with tears and blood&lt;/li&gt;  &lt;li&gt;and a small concrete application showing how to use Guice as your DI container&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If you are a beginner, this book will explain to you how and why using DI. If you are an expert and use DI on a daily basis, this book will help you rethink what you have taken for granted in DI-land and learn a handful of new tricks and design patterns.&lt;/p&gt;&lt;p&gt;I consider DI and the notion of scope (aka context) to be an essential knowledge to any Java developers. This will become even more pressing with the soon arrival of JSR-330 (Dependency Injection for Java) and JSR-299 (Context and Dependency Injection for the EE platform aka Web Beans) and their inclusion in Java EE 6.&lt;/p&gt;&lt;p&gt;Just like you had to learn polymorphism, you need to learn DI and context management as this is an essential tool for proper component design and application modularization.&lt;/p&gt;&lt;p&gt;The only gotcha is that this book comes right before the finalization of the two JSRs and hence does not cover them. Don't be too afraid though, all the core concepts covered by these specifications are thoroughly explained in this book. The problem / solution approach used by Dhanji will perfectly complement your knowledge of the DI JSRs.&lt;/p&gt;&lt;p&gt;My advice is to keep this book on your desk when you develop (next to &lt;a href="http://www.amazon.com/dp/1933988649?tag=hsia-20&amp;amp;camp=213381&amp;amp;creative=390973&amp;amp;linkCode=as4&amp;amp;creativeASIN=1933988649&amp;amp;adid=12TS2185Z8X14AKT175F&amp;amp;"&gt;Hibernate Search in Action&lt;/a&gt; mine of course ;) ), you will save yourself the burden of learning the best design approaches the hard way.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2009/08/10/book-review-dependency-injection-by-dhanji-prasanna/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2009/07/07/lies-damned-lies-and-statistics-ee-edition/</id>
    <title>Lies, damned lies, and statistics: EE edition</title>
    <updated>2009-07-07T00:00:00Z</updated>
    <published>2009-07-07T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/3yOEVgpm33I/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I came across some figures regarding downloads of Glassfish and JBoss AS that really puzzled me. Basically Glassfish was downloaded 700.000 times a month (end of '08) while JBoss AS was only downloaded around 115.000 times a month at the same. My first reaction was "Well done to you, Sun!" and then I realized that the gap was too good to be true. Let's have a look at these numbers.For JBoss AS, the Sun team has only counted the direct number of downloads out of SourceForge. That's public knowledge by the way, go there for the JBoss stats.For Glassfish (according...
    </summary>
    <content type="html">
      &lt;p&gt;I came across some figures regarding downloads of Glassfish and JBoss AS that really puzzled me. Basically Glassfish was downloaded 700.000 times a month (end of '08) while JBoss AS was only downloaded around 115.000 times a month at the same. My first reaction was "Well done to you, Sun!" and then I realized that the gap was too good to be true. Let's have a look at these numbers.&lt;/p&gt;&lt;p&gt;For JBoss AS, the Sun team has only counted the direct number of downloads out of SourceForge. That's public knowledge by the way, go there for the &lt;a href="http://sourceforge.net/project/stats/detail.php?group_id=22866&amp;amp;ugn=jboss&amp;amp;mode=12months&amp;amp;type=prdownload"&gt;JBoss stats&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;For Glassfish (&lt;a href="http://blogs.sun.com/pelegri/entry/glassfish_download_stats_jan_2009"&gt;according to this&lt;/a&gt;), downloads numbers (not public BTW) come from:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;JDK bundles&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://java.sun.com/javaee/downloads/?intcmp=1282?userOsIndex=2&amp;amp;userOsId=mac_intel&amp;amp;userOsName=Mac%20OS%20X%20%28Intel%29"&gt;Java EE SDK&lt;/a&gt;&lt;/li&gt;  &lt;li&gt;&lt;a href="http://www.netbeans.org/downloads/index.html"&gt;NetBeans Bundles&lt;/a&gt; (when downloading NetBeans, apparently you automatically get GF bundled)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Surprisingly, no stats on the direct number of downloads from the &lt;a href="https://glassfish.dev.java.net/public/downloadsindex.html"&gt;Glassfish project page&lt;/a&gt;. Let's analyze that a bit.&lt;/p&gt;&lt;p&gt;JDK bundles is the thing downloaded even by my grand'ma by accident. I can tell you right there, she has never ever used Glassfish ( nor JBoss ;) ). How many times, did I download the whole enchilada while I just wanted the plain old JDK!&lt;/p&gt;&lt;p&gt;Java EE SDK. This one is hard. Of course, people interested in EE will go download this package. Are they interested in GF? Hard to say. On the other hand providing a SDK without runtime will do no good.&lt;/p&gt;&lt;p&gt;NetBeans. I'm surprised at the popularity of NB, but there it is. Are all NB users actually GF users? BTW NB also comes with a JDK bundle but I don't know if this bundle also bundle GF :)&lt;/p&gt;&lt;p&gt;Let's call this strategy the Russian doll statistic generation strategy. Frankly, that's not very honest for your users and customers to use this strategy and then compare apple to oranges with your competition. When someone downloads JBoss AS, for sure he did not do it by accident (thanks to SourceForce's sense of UI :) )&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So we have two strategies here, JBoss could start playing the Russian doll statistics generation strategy and we can be pretty good at it:&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;include JBoss AS in Fedora and count it&lt;/li&gt;  &lt;li&gt;include JBoss AS in RHEL and count it (Dell, IBM and the like are pretty good at delivering RHEL on their hardware)&lt;/li&gt;  &lt;li&gt;include JBoss AS in IcedTea and count it&lt;/li&gt;  &lt;li&gt;include JBoss AS in JBoss Tools and count it&lt;/li&gt;  &lt;li&gt;include JBoss AS Core in JBoss ESB, Portal etc etc and count it&lt;br /&gt;&lt;/li&gt;  &lt;li&gt;include the number of downloads from our maven repository (with the number of times you have to nuke your local repo that will be a big hit :) )&lt;/li&gt;  &lt;li&gt;I've only added a few ideas but for sure our marketing guys can be more productive&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Of course we won't do that. An alternative strategy would be for the Glassfish team to only display their direct download numbers (the one they fail to display) and stop using bogus charts in their public and private slides.&lt;/p&gt;&lt;p&gt;On a side note, I find it disappointing that open source projects don't keep their stats open and preferably via a third party provider like SourceForge. Granted the SF stats are somewhat flaky but it keeps everyone honest with their own (lack of) success.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Disclaimer: I am not saying Glassfish is not a success, I am quite happy to have them as &lt;a href="http://en.wikipedia.org/wiki/Coopetition"&gt;coopetitors&lt;/a&gt; on the server market in general and Java EE in particular.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2009/07/07/lies-damned-lies-and-statistics-ee-edition/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2009/06/22/having-problems-with-adium-and-yahoo-im/</id>
    <title>Having problems with Adium and Yahoo IM?</title>
    <updated>2009-06-22T00:00:00Z</updated>
    <published>2009-06-22T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/Y-0GTiSOCxs/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Yahoo has changed its login protocol, breaking a number of third party IM clients including Adium.The Adium team has released 1.3.5.rc1 which solves the issue. Check it out. If you use Adium 1.4 beta, upgrade to beta7.Hope this will save you some time.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;Yahoo has changed its login protocol, breaking a number of third party IM clients including Adium.&lt;/p&gt;&lt;p&gt;The Adium team has released 1.3.5.rc1 which solves the issue. &lt;a href="http://adium.im/blog/2009/06/adium-135rc1/"&gt;Check it out&lt;/a&gt;. If you use Adium 1.4 beta, upgrade to beta7.&lt;/p&gt;&lt;p&gt;Hope this will save you some time.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2009/06/22/having-problems-with-adium-and-yahoo-im/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2009/04/30/java-generics-end-of-mystery/</id>
    <title>Java generics end of mystery</title>
    <updated>2009-04-30T00:00:00Z</updated>
    <published>2009-04-30T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/6-4pcd5CvdE/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Remember my puzzlement in front of http://blog.emmanuelbernard.com/2009/04/java-generics-mystery.html?  I usually try to make sense of the unknown type by looking at what should be allowed when two incompatible types are used as the unknown type, and then using the generic type using the unknown type as a reference to a known type to see what incorrect things can be done through the reference. If the assignment your questioning was allowed, you would be able to add two incompatible ConstraintValidators to the validatedAddresses as in: class Address {} class Person {} // A set of ConstraintValidator for Address Set&lt;ConstraintValidator&lt;Address&gt;&gt; validatedAddresses =...
    </summary>
    <content type="html">
      &lt;p&gt;Remember my puzzlement in front of &lt;a href="http://blog.emmanuelbernard.com/2009/04/java-generics-mystery.html"&gt;http://blog.emmanuelbernard.com/2009/04/java-generics-mystery.html&lt;/a&gt;?&lt;/p&gt;&lt;blockquote&gt;  &lt;p&gt;I usually try to make sense of the unknown type by looking at what should be allowed when two incompatible types are used as the unknown type, and then using the generic type using the unknown type as a reference to a known type to see what incorrect things can be done through the reference. If the assignment your questioning was allowed, you would be able to add two incompatible ConstraintValidators to the validatedAddresses as in:&lt;br /&gt;&lt;br /&gt; class Address {}&lt;br /&gt; class Person {}&lt;br /&gt;&lt;br /&gt; // A set of ConstraintValidator for Address&lt;br /&gt; Set&amp;lt;ConstraintValidator&amp;lt;Address&amp;gt;&amp;gt; validatedAddresses =&lt;br /&gt;     new HashSet&amp;lt;ConstraintValidator&amp;lt;Address&amp;gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt; // A set of ConstraintValidator of a single unknown type (*)&lt;br /&gt; Set&amp;lt;ConstraintValidator&amp;lt;?&amp;gt;&amp;gt; validatedThings = validatedAddresses;&lt;br /&gt;&lt;br /&gt; ConstraintValidator&amp;lt;Address&amp;gt; a;&lt;br /&gt; ConstraintValidator&amp;lt;Person&amp;gt; p;&lt;br /&gt;&lt;br /&gt; // A ConstraintValidator of unknown type, ? = Address&lt;br /&gt; ConstraintValidator&amp;lt;?&amp;gt; thingA = a;&lt;br /&gt;&lt;br /&gt; // A ConstraintValidator of unknown type, ? = Person&lt;br /&gt; ConstraintValidator&amp;lt;?&amp;gt; thingP = p;&lt;br /&gt;&lt;br /&gt; // This would be allowed if (*) was a valid assignment, which puts a ConstraintValidator&amp;lt;Person&amp;gt; in a set of ConstraintValidator&amp;lt;Address&amp;gt;&lt;br /&gt;&lt;br /&gt; validatedThings.add(thingP);&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;What I missed initially is that I cannot add new (and potentially heterogeneous) elements in Set&amp;lt;?&amp;gt; or Set&amp;lt;? extends X&amp;gt;, but I am free to add elements in Set&amp;lt;X&amp;lt;?&amp;gt;&amp;gt;:&lt;/p&gt;&lt;blockquote&gt;&lt;br /&gt; Set&amp;lt;A&amp;lt;?&amp;gt;&amp;gt; c1 = new HashSet&amp;lt;A&amp;lt;?&amp;gt;&amp;gt;();&lt;br /&gt;c1.add( new A&amp;lt;B&amp;gt;() );&lt;br /&gt;c1.add( new A&amp;lt;C&amp;gt;() );&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt; Set&amp;lt;? extends A&amp;lt;?&amp;gt;&amp;gt; c1 = new HashSet&amp;lt;A&amp;lt;?&amp;gt;&amp;gt;();&lt;br /&gt;c1.add( new A&amp;lt;B&amp;gt;() ); &amp;lt;-- compilation error&lt;br /&gt;c1.add( new A&amp;lt;C&amp;gt;() ); &amp;lt;-- compilation error&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;While the first example compiles, the second does not.&lt;/p&gt;&lt;p&gt;So to answer my initial mystery, I need to use the &amp;lt;? extends X&amp;lt;?&amp;gt;&amp;gt; approach (thanks Vivien for pointing that out).&lt;/p&gt;&lt;blockquote&gt;  &lt;p&gt;Set&amp;lt;? extends ConstraintValidator&amp;lt;?&amp;gt;&amp;gt; valiatedThings = ...;&lt;/p&gt;&lt;/blockquote&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2009/04/30/java-generics-end-of-mystery/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2009/04/29/java-generics-mystery/</id>
    <title>Java generics mystery</title>
    <updated>2009-04-29T00:00:00Z</updated>
    <published>2009-04-29T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/OG7KnQev0ec/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Here is a puzzle for Generics gurus.Can somebody explain why  Set&lt;Address&gt; addresses = new HashSet&lt;Address&gt;();Set&lt;?&gt; things = addresses;compiles but  Set&lt;ConstraintValidator&lt;Address&gt;&gt; validatedAddresses =     new HashSet&lt;ConstraintValidator&lt;Address&gt;&gt;();Set&lt;ConstraintValidator&lt;?&gt;&gt; validatedThings =    validatedAddresses;does not compile?More specifically, the assignment on the second line breaks.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;Here is a puzzle for Generics gurus.&lt;/p&gt;&lt;p&gt;Can somebody explain why&lt;/p&gt;  &lt;p&gt;&lt;blockquote&gt;&lt;p&gt;Set&amp;lt;Address&amp;gt; addresses = new HashSet&amp;lt;Address&amp;gt;();&lt;br /&gt;Set&amp;lt;?&amp;gt; things = addresses;&lt;/p&gt;&lt;p /&gt;&lt;/blockquote&gt;&lt;p&gt;compiles but&lt;/p&gt;&lt;blockquote&gt;  &lt;p&gt;Set&amp;lt;ConstraintValidator&amp;lt;Address&amp;gt;&amp;gt; validatedAddresses = &lt;br /&gt;    new HashSet&amp;lt;ConstraintValidator&amp;lt;Address&amp;gt;&amp;gt;();&lt;br /&gt;Set&amp;lt;ConstraintValidator&amp;lt;?&amp;gt;&amp;gt; validatedThings =&lt;br /&gt;    validatedAddresses;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;does not compile?&lt;/p&gt;&lt;p&gt;More specifically, the assignment on the second line breaks.&lt;/p&gt;
      &lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2009/04/29/java-generics-mystery/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2009/04/20/oracle-is-buying-sun-best-quotes-of-the-day/</id>
    <title>Oracle is buying Sun: best quotes of the day</title>
    <updated>2009-04-20T00:00:00Z</updated>
    <published>2009-04-20T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/vcEGPy0bp8Y/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Alex Miller: "Next version of Java will be Java SE 7.0.0.0.17832"Emmanuel Bernard: "The day an Oracle swallows the Sun and in front the Business Machine. No kidding it's a Titans fight."Max Andersen: Thinking when Orsun will introduce a String in Java that says null == ""Alexis MP: "Checking my blog posts tagged with "oracle". No need to MarcF' them ;)"Bruno Georges: "yes, this came out of the Blue :-)"Stomp Rasta: "There'll have Java SE 7 Lite (300 MB) and Java SE 7 Full (600 MB). And we'll have to pay for each VM installed."Add your own...
      ...
    </summary>
    <content type="html">
      &lt;p&gt;&lt;span style="font-style: italic;" class="Apple-style-span"&gt;Alex Miller&lt;/span&gt;: "Next version of Java will be Java SE 7.0.0.0.17832"&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic;" class="Apple-style-span"&gt;Emmanuel Bernard&lt;/span&gt;: "The day an Oracle swallows the Sun and in front the Business Machine. No kidding it's a Titans fight."&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic;" class="Apple-style-span"&gt;Max Andersen&lt;/span&gt;: Thinking when Orsun will introduce a String in Java that says null == ""&lt;/p&gt;&lt;p&gt;&lt;span style="font-style: italic;" class="Apple-style-span"&gt;Alexis MP&lt;/span&gt;: "&lt;span style="font-family:&amp;apos;Lucida Grande&amp;apos;;"&gt;Checking my blog posts tagged with "oracle". No need to MarcF' them ;)"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:&amp;apos;Lucida Grande&amp;apos;;"&gt;&lt;span style="font-style: italic;" class="Apple-style-span"&gt;Bruno Georges&lt;/span&gt;: "yes, this came out of the Blue :-)"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:&amp;apos;Lucida Grande&amp;apos;;"&gt;&lt;span style="font-style: italic;" class="Apple-style-span"&gt;Stomp Rasta&lt;/span&gt;: "There'll have Java SE 7 Lite (300 MB) and Java SE 7 Full (600 MB). And we'll have to pay for each VM installed."&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Add your own...&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2009/04/20/oracle-is-buying-sun-best-quotes-of-the-day/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2009/04/14/les-cast-codeurs-podcast-is-born/</id>
    <title>Les Cast Codeurs Podcast is born</title>
    <updated>2009-04-14T00:00:00Z</updated>
    <published>2009-04-14T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/W4TXO8ufGOM/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I have just started a new podcast with a few French open source activists. All about Java, all in French. If you know French, read on ; otherwise, well... learn :)Les Cast Codeurs Podcast est dans les bacs!Le podcast en français dans le code sur Java par Emmanuel Bernard (JBoss, Hibernate), Guillaume Laforge (SpringSource, Groovy), Antonio Goncalves (freelance, auteur), Vincent Massol (XWiki, Maven).Restez informés sur les sujets brûlants de l'industrie Java. Plongez sur un sujet précis avec l'interview de l'épisode. Supportez les radotages de vos hôtes.Ecoutez-nous et faites passer le message autour de vous !web: http://lescastcodeurs.comitunes: http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=312239675podcast syndication: http://lescastcodeurs.com/podcast-rssblog feed:...
    </summary>
    <content type="html">
      &lt;p&gt;I have just started a new podcast with a few French open source activists. All about Java, all in French. If you know French, read on ; otherwise, well... &lt;a href="http://www.google.com/search?q=learn+french"&gt;learn&lt;/a&gt; :)&lt;/p&gt;&lt;p&gt;Les Cast Codeurs Podcast est dans les bacs!&lt;/p&gt;&lt;p&gt;Le podcast en français dans le code sur Java par Emmanuel Bernard (JBoss, Hibernate), Guillaume Laforge (SpringSource, Groovy), Antonio Goncalves (freelance, auteur), Vincent Massol (XWiki, Maven).&lt;/p&gt;&lt;p&gt;Restez informés sur les sujets brûlants de l'industrie Java. Plongez sur un sujet précis avec l'interview de l'épisode. Supportez les radotages de vos hôtes.&lt;/p&gt;&lt;p&gt;Ecoutez-nous et faites passer le message autour de vous !&lt;/p&gt;&lt;p&gt;web: &lt;a href="http://lescastcodeurs.com/"&gt;http://lescastcodeurs.com&lt;/a&gt;&lt;br /&gt;itunes: &lt;a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=312239675"&gt;http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=312239675&lt;/a&gt;&lt;br /&gt;podcast syndication: &lt;a href="http://lescastcodeurs.com/podcast-rss"&gt;http://lescastcodeurs.com/podcast-rss&lt;/a&gt;&lt;br /&gt;blog feed: &lt;a href="http://lescastcodeurs.com/feed/"&gt;http://lescastcodeurs.com/feed/&lt;/a&gt;&lt;br /&gt;feedback: &lt;a href="mailto:commentaire@lescastcodeurs.com"&gt;commentaire@lescastcodeurs.com&lt;/a&gt;&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2009/04/14/les-cast-codeurs-podcast-is-born/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2009/04/03/podcast-on-bean-validation-lastest-pfd/</id>
    <title>Podcast on Bean Validation lastest PFD</title>
    <updated>2009-04-03T00:00:00Z</updated>
    <published>2009-04-03T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/qbShLQQNqnE/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I have recently been interviewed by Kenneth Rimple for the Chariot TechCast.  In this podcast, we speak to JBoss's Emmanuel Bernard on the future of validation using JSR-303, the Bean Validation framework. JSR-303 aims to provide an annotation-driven mechanism to mark plain old java beans with annotations, such as @NotNull, @Min, @Max, and can support custom validation annotations as well.  JSR-303 is part of the Java EE 6 suite of JSRs and will be used automatically out of the box by frameworks such as JSF 2.0. Emmanuel also goes into some detail about the current state of Hibernate...
    </summary>
    <content type="html">
      &lt;p&gt;I have recently been interviewed by Kenneth Rimple for the &lt;a href="http://techcast.chariotsolutions.com/"&gt;Chariot TechCast&lt;/a&gt;.&lt;/p&gt;&lt;blockquote&gt;  &lt;p&gt;In this podcast, we speak to JBoss's Emmanuel Bernard on the future of validation using JSR-303, the Bean Validation framework. JSR-303 aims to provide an annotation-driven mechanism to mark plain old java beans with annotations, such as &lt;span style="font-style: italic;" class="Apple-style-span"&gt;@NotNull&lt;/span&gt;, &lt;span style="font-style: italic;" class="Apple-style-span"&gt;@Min&lt;/span&gt;, &lt;span style="font-style: italic;" class="Apple-style-span"&gt;@Max&lt;/span&gt;, and can support custom validation annotations as well.&lt;/p&gt;  &lt;p&gt;JSR-303 is part of the Java EE 6 suite of JSRs and will be used automatically out of the box by frameworks such as JSF 2.0. Emmanuel also goes into some detail about the current state of Hibernate Search.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;You can listen to it &lt;a href="http://techcast.chariotsolutions.com/index.php?post_id=449889"&gt;here&lt;/a&gt; or register to &lt;a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=276488929"&gt;iTunes&lt;/a&gt;.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2009/04/03/podcast-on-bean-validation-lastest-pfd/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2009/02/02/go-us/</id>
    <title>Go us</title>
    <updated>2009-02-02T00:00:00Z</updated>
    <published>2009-02-02T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/O5QjgF__clg/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I am usually not the kind of person that likes patting one another on the back. I am always prompt to point out what's left to be done rather that what has been done. But reading Sacha's newsletter to our customer made me proud.JBoss AS 5 has had record downloads. People were eager to get AS 5 out, so were we.A fully TCK compliant OpenJDK based Java SE 6 made it into Red Hat Enterprise Linux 5.3. As far as I know, this is the first fully Open Source Java SE implementation certified against the TCK (might be wrong, so...
    </summary>
    <content type="html">
      &lt;p&gt;I am usually not the kind of person that likes patting one another on the back. I am always prompt to point out what's left to be done rather that what has been done. But reading Sacha's newsletter to our customer made me proud.&lt;/p&gt;&lt;p&gt;JBoss AS 5 has had &lt;a href="http://dandreadis.blogspot.com/2009/01/66000-jboss-as-5-downloads-and-counting.html"&gt;record downloads&lt;/a&gt;. People were eager to get AS 5 out, so were we.&lt;/p&gt;&lt;p&gt;A fully TCK compliant OpenJDK based Java SE 6 made it into Red Hat Enterprise Linux 5.3. As far as I know, this is the first fully Open Source Java SE implementation certified against the TCK (might be wrong, so don't quote me on that).&lt;/p&gt;&lt;p&gt;JSR 299 (ex Web Beans, newly named Java Contexts and Dependency Injection) is now in its &lt;a href="http://in.relation.to/10507.lace"&gt;latest public draft review&lt;/a&gt;. Gavin and the EG have worked *&lt;strong&gt;very*&lt;/strong&gt; hard to address the EE 6 expert group concerns and pave the road to include this technology in Java EE 6.&lt;/p&gt;&lt;p&gt;The JSR-299 reference implementation is in pretty good shape and &lt;a href="http://in.relation.to/Bloggers/WebBeans100ALPHA2Released"&gt;releases steadily&lt;/a&gt;. I am personally impressed by the quality of the reference guide (&lt;a href="http://docs.jboss.org/webbeans/reference/1.0.0.ALPHA2/en-US/"&gt;alpha 2 here&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jboss.org/resteasy/?sc_cid=70160000000Hh3dAAC"&gt;RESTEasy&lt;/a&gt;, the JBoss JAX-RS implementation is now fully certified and has reached 1.0. I know &lt;a href="http://bill.burkecentral.com/"&gt;Bill Burke&lt;/a&gt; has been waiting to grab and pass the TCK for a long time.&lt;/p&gt;&lt;p&gt;Bean Validation public draft is &lt;a href="http://in.relation.to/Bloggers/BeanValidationJSR303PublicDraftGiveUsFeedback"&gt;out&lt;/a&gt;. I also worked very hard too, damn it! ;) We had a lot of positive feedbacks from you guys in our &lt;a href="http://forum.hibernate.org/viewforum.php?f=26"&gt;forum&lt;/a&gt;. If you want to look at the cutting edge, I release spec snapshots quite regularly on the hibernate-dev mailing list. The latest work includes finalized JPA and JSF integration, type-safe constraint validators, XML support and clearer names.&lt;/p&gt;&lt;p&gt;Also the reference implementation is &lt;a href="http://forum.hibernate.org/viewtopic.php?t=991154&amp;amp;"&gt;developped in the open&lt;/a&gt;. We hope to get a first milestone release this week or the next one: we did add cool new features you requested in the spec recently (like type-safe validators) and we want to have them in the RI.&lt;/p&gt;&lt;p&gt;A little while ago, Navin released &lt;a href="http://jbosscache.blogspot.com/2009/01/new-years-present-from-jbcs.html"&gt;JBoss Cache Searchable 1.0 GA&lt;/a&gt; which is based on Hibernate Search. Good stuff: a full-text searchable distributed object cache.&lt;/p&gt;&lt;p&gt;A cool project named &lt;a href="http://jboss.org/community/docs/DOC-10680"&gt;JBoss Negociation&lt;/a&gt; brings desktop Single Sign On to web apps. Basically, by login to your Windows 2000/XP machine that is secured by an Active Directory and then go to any of the kerberos aware web applications that are hosted by your company in the network, you will have seamless SSO. Their latest GA is &lt;a href="http://www.jboss.com/index.html?module=bb&amp;amp;op=viewtopic&amp;amp;p=4205964#4205964"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;That's just my selection of January news. Who said JBoss was sleeping ;) Alright, enough self congratulation and back to work.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2009/02/02/go-us/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2009/01/26/jbug-munich-java-persistence-2-and-bean-validation/</id>
    <title>JBUG Munich: Java Persistence 2 and Bean Validation</title>
    <updated>2009-01-26T00:00:00Z</updated>
    <published>2009-01-26T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/M8rKwU-1hqc/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Next week, I will be at the JBug in Munich presenting Java Persistence 2 and Bean Validation. If you are around Monday 2nd, come swing by. The JBug Munich website is here for details.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;Next week, I will be at the JBug in Munich presenting Java Persistence 2 and Bean Validation. If you are around Monday 2nd, come swing by. The JBug Munich website is &lt;a href="http://www.jbug-munich.org/"&gt;here&lt;/a&gt; for details.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2009/01/26/jbug-munich-java-persistence-2-and-bean-validation/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2009/01/24/devnexus-human-friendly-conference-march-10-11-in-atlanta/</id>
    <title>DevNexus: human friendly conference March 10-11 in Atlanta</title>
    <updated>2009-01-24T00:00:00Z</updated>
    <published>2009-01-24T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/znjzDCVYkIU/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I will be speaking at DevNexus. This small conference is a spin off the Atlanta Java User Group.Here are a few things I like about the conference personally:  There is around 10 presentations over two days, so you will be able to see all / most of them.  The price is very reasonable ($150 for early birds), $185 regular price.  The size is reasonable, so interacting with speakers is natural.  Atlanta in March is very nice.  ahem, I will be speaking there, ahem.I will personally speak about our experience in scaling Hibernate in big environments...
    </summary>
    <content type="html">
      &lt;p&gt;I will be speaking at &lt;a href="http://www.devnexus.com/"&gt;DevNexus&lt;/a&gt;. This small conference is a spin off the Atlanta Java User Group.&lt;/p&gt;&lt;p&gt;Here are a few things I like about the conference personally:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;There is around 10 presentations over two days, so you will be able to see all / most of them.&lt;/li&gt;  &lt;li&gt;The price is very reasonable ($150 for early birds), $185 regular price.&lt;/li&gt;  &lt;li&gt;The size is reasonable, so interacting with speakers is natural.&lt;/li&gt;  &lt;li&gt;Atlanta in March is very nice.&lt;/li&gt;  &lt;li&gt;ahem, I will be speaking there, ahem.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I will personally speak about our experience in scaling Hibernate in big environments and how SaaS vendors can face the challenge. I will also discuss Hibernate Shards and Hibernate Search with regard to scalability. And there are nine other speakers at the conference, so check their &lt;a href="http://www.devnexus.com/"&gt;website&lt;/a&gt;.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2009/01/24/devnexus-human-friendly-conference-march-10-11-in-atlanta/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2009/01/16/how-to-install-git-and-git-svn-on-mac-os-x/</id>
    <title>How to install Git and git-svn on Mac OS X</title>
    <updated>2009-01-16T00:00:00Z</updated>
    <published>2009-01-16T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/r-8PQEKXGtg/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      It's hard to find good Google links for installing git-svn on Mac OS X. Here is my piece.  Install port: download it at http://darwinports.com and run the installer  run sudo port install subversion-perlbindings (it takes a while as the installer download the internet)  run sudo port install git-core +svn (don't forget +svn or you will have to uninstall git-core and reinstall it)You are ready to use git svn command. git-svn does not work but git svn does: that's because git-svn is not in your PATH. If you want to make git-svn work, add /opt/local/libexex/git-core to it (thanks...
    </summary>
    <content type="html">
      &lt;p&gt;It's hard to find good Google links for installing git-svn on Mac OS X. Here is my piece.&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;Install port: download it at &lt;a href="http://darwinports.com/"&gt;http://darwinports.com&lt;/a&gt; and run the installer&lt;/li&gt;  &lt;li&gt;run &lt;em&gt;sudo port install subversion-perlbindings&lt;/em&gt; (it takes a while as the installer download the internet)&lt;/li&gt;  &lt;li&gt;run &lt;em&gt;sudo port install git-core +svn&lt;/em&gt; (don't forget +svn or you will have to uninstall git-core and reinstall it)&lt;/li&gt;&lt;/ul&gt;You are ready to use &lt;em&gt;git svn &lt;span style="font-style: normal;"&gt;command.&lt;/span&gt;&lt;/em&gt; &lt;em&gt;git-svn&lt;/em&gt; does not work but &lt;em&gt;git svn&lt;/em&gt; does: that's because git-svn is not in your PATH. If you want to make &lt;em&gt;git-svn&lt;/em&gt; work, add &lt;em&gt;/opt/local/libexex/git-core&lt;/em&gt; to it (thanks Randall for the tip).&lt;br /&gt;&lt;br /&gt;From there, have a look at &lt;a href="http://www.viget.com/extend/effectively-using-git-with-subversion/"&gt;http://viget.com/extend/effectively-using-git-with-subversion&lt;/a&gt; for a quick tutorial.
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2009/01/16/how-to-install-git-and-git-svn-on-mac-os-x/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/12/10/answering-questions-at-javaranch-free-books/</id>
    <title>Answering questions at JavaRanch + free books</title>
    <updated>2008-12-10T00:00:00Z</updated>
    <published>2008-12-10T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/90BD3WPsx4U/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I am doing a session on Hibernate Search all this week at JavaRanch. Manning will give away free books of Hibernate Search in Action for the occasion.If you have questions on Hibernate Search, express yourself :)
      ...
    </summary>
    <content type="html">
      &lt;p&gt;I am doing a session on Hibernate Search all this week at JavaRanch. Manning will give away free books of Hibernate Search in Action for the occasion.&lt;/p&gt;&lt;p&gt;If you have questions on Hibernate Search, &lt;a href="http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=forum&amp;amp;f=78"&gt;express yourself&lt;/a&gt; :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/12/10/answering-questions-at-javaranch-free-books/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/12/05/jboss-as-5-is-out-hibernate-search-3-1-devoxx-is-warming-up-and/</id>
    <title>JBoss AS 5 is out, Hibernate Search 3.1, Devoxx is warming up and</title>
    <updated>2008-12-05T00:00:00Z</updated>
    <published>2008-12-05T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/4-_TlJw0fLk/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Great news this week:  JBoss AS 5 is out. Congratulations to Dimitris and the many people in and out of JBoss who contributed to it. Hibernate Search 3.1 is out. A lot of good stuffs like performance improvements at indexing and querying time and some cool new features like the analyzer declaration framework (allowing declarative phonetic, synonym, n-gram indexing and searches) Devoxx is very close. Come see the JBoss folks and topics and come to the Seam meetup after the BOF of course :)Also, on the Bean Validation (JSR 303) side, I am finalizing the last changes in the...
    </summary>
    <content type="html">
      &lt;p&gt;Great news this week:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;&lt;a href="http://dandreadis.blogspot.com/2008/12/jbossas-500ga-released.html"&gt;JBoss AS 5 is out&lt;/a&gt;. Congratulations to Dimitris and the many people in and out of JBoss who contributed to it.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://in.relation.to/Bloggers/HibernateSearch31IsOutPerformanceRobustnessAndNewFeaturesOnTheMenu"&gt;Hibernate Search 3.1 is out&lt;/a&gt;. A lot of good stuffs like performance improvements at indexing and querying time and some cool new features like the analyzer declaration framework (allowing declarative phonetic, synonym, n-gram indexing and searches)&lt;/li&gt;&lt;br /&gt; &lt;li&gt;&lt;a href="http://www.devoxx.com/display/JV08/Home"&gt;Devoxx&lt;/a&gt; is very close. Come see the &lt;a href="http://in.relation.to/Bloggers/JBossAtDevoxx"&gt;JBoss folks and topics&lt;/a&gt; and come to the &lt;a href="http://devoxx.com/display/JV08/Seam+meetup"&gt;Seam meetup&lt;/a&gt; after the BOF of course :)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Also, on the Bean Validation (JSR 303) side, I am finalizing the last changes in the spec for the public draft. We made a lot of progress in the last two weeks on various subjects including type-safe groups and JPA / JSF / EE integration (with the finalized draft, I will officially contact the EE expert group). Stay tuned, hopefully the draft should be out in a week or two.&lt;/p&gt;&lt;p&gt;Finally, &lt;a href="http://www.manning.com/affiliate/idevaffiliate.php?id=952_117_1_24"&gt;Hibernate Search in Action&lt;/a&gt; is supposed to be released in final PDF monday (still not believing in it till I see that one ;) ).&lt;/p&gt;&lt;p&gt;Great week on my side. See you at Devoxx for a drink or two.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/12/05/jboss-as-5-is-out-hibernate-search-3-1-devoxx-is-warming-up-and/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/12/01/hibernate-search-3-1-refcard/</id>
    <title>Hibernate Search 3.1 RefCard</title>
    <updated>2008-12-01T00:00:00Z</updated>
    <published>2008-12-01T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/cSRlGPMO02Q/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      DZone has a nice Hibernate Search 3.1 6-pages ref card. It is packed with:The list of annotations and their descriptions  Hibernate Search's main APIs  Lucene's most useful query types  Quick examples involving mappings and API usage (including the new analyzer declaration framework)It's free but you need to register.Speaking of the devil. John and I have given back our last edits for Hibernate Search in Action. So we are still on target for releasing the book in december. I personally still can't believe I am done, so I will play the St Thomas and will wait till I...
    </summary>
    <content type="html">
      &lt;p&gt;DZone has a nice Hibernate Search 3.1 6-pages &lt;a href="http://refcardz.dzone.com/refcardz/getting-started-with-hibernate"&gt;ref card&lt;/a&gt;. It is packed with:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The list of annotations and their descriptions&lt;/li&gt;  &lt;li&gt;Hibernate Search's main APIs&lt;/li&gt;  &lt;li&gt;Lucene's most useful query types&lt;/li&gt;  &lt;li&gt;Quick examples involving mappings and API usage (including the new analyzer declaration framework)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;It's free but you need to register.&lt;/p&gt;&lt;p&gt;Speaking of the devil. John and I have given back our last edits for &lt;a href="http://www.manning.com/affiliate/idevaffiliate.php?id=952_117_1_24"&gt;Hibernate Search in Action&lt;/a&gt;. So we are still on target for releasing the book in december. I personally still can't believe I am done, so I will play the St Thomas and will wait till I can touch the paper :)&lt;/p&gt;&lt;p&gt;You can get the paper book at &lt;a href="http://www.amazon.com/dp/1933988649?tag=hsia-20&amp;amp;camp=213381&amp;amp;creative=390973&amp;amp;linkCode=as4&amp;amp;creativeASIN=1933988649&amp;amp;adid=0DPGJP19RWX70HJRSKQF&amp;amp;"&gt;Amazon&lt;/a&gt; or on the Manning website. Manning also offers the &lt;a href="http://www.manning.com/affiliate/idevaffiliate.php?id=952_117_1_24"&gt;PDF&lt;/a&gt; version.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/12/01/hibernate-search-3-1-refcard/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/10/07/book-review-and-nhibernate-search/</id>
    <title>Book review and NHibernate Search</title>
    <updated>2008-10-07T00:00:00Z</updated>
    <published>2008-10-07T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/BBLJ7jHENdY/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Ayende, one of the active bees behind the NHibernate portfolio, has a nice review of Hibernate Search in Action on his blog.By the way, Ayende has ported Hibernate Search to .net : NHibernate.Search. I don't think there is documentation specific to the project but the Hibernate Search documentation is just as useful.I don't know Ayende personally, but I can only admire someone that blogs more that I can tweet and still have a full time job :)
      ...
    </summary>
    <content type="html">
      &lt;p&gt;Ayende, one of the active bees behind the NHibernate portfolio, has a nice review of &lt;a href="http://www.manning.com/affiliate/idevaffiliate.php?id=952_117_1_24"&gt;Hibernate Search in Action&lt;/a&gt; on &lt;a href="http://ayende.com/Blog/archive/2008/09/02/Review-Hibernate-Search-in-Action.aspx"&gt;his blog&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;By the way, Ayende has ported Hibernate Search to .net : &lt;a href="http://www.google.com/search?client=safari&amp;amp;rls=en-us&amp;amp;q=NHibernate.Search&amp;amp;ie=UTF-8&amp;amp;oe=UTF-8"&gt;NHibernate.Search&lt;/a&gt;. I don't think there is documentation specific to the project but the Hibernate Search documentation is just as useful.&lt;/p&gt;&lt;p&gt;I don't know Ayende personally, but I can only admire someone that blogs more that I can &lt;a href="http://twitter.com/emmanuelbernard"&gt;tweet&lt;/a&gt; and still have a full time job :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/10/07/book-review-and-nhibernate-search/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/09/11/hibernate-search-book-preview-final-review-hitting-where-it-hurts-for-the-better/</id>
    <title>Hibernate Search book preview final review: hitting where it hurts for the better</title>
    <updated>2008-09-11T00:00:00Z</updated>
    <published>2008-09-11T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/E6N8H9PCnnY/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      We just had our third review of Hibernate Search in Action. Receiving this feedback has been a humble experience. Lot's of good reviews (good) and some critical ones (even better). Every imperfection we left aside came back in the spot lights of our reviewers.Based on this feedback, we have been working hard the last two weeks to improve a lot the manuscript:  clearer code transcripts with more inline annotations  better separation between different parts of the same example (Hibernate API versus Java Persistence API)  the code has been updated to the latest Hibernate Search version and cleaned...
    </summary>
    <content type="html">
      &lt;p&gt;We just had our third review of &lt;a href="http://www.manning.com/affiliate/idevaffiliate.php?id=952_117_1_24"&gt;Hibernate Search in Action&lt;/a&gt;. Receiving this feedback has been a humble experience. Lot's of good reviews (good) and some critical ones (even better). Every imperfection we left aside came back in the spot lights of our reviewers.&lt;/p&gt;&lt;p&gt;Based on this feedback, we have been working hard the last two weeks to improve a lot the manuscript:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;clearer code transcripts with more inline annotations&lt;/li&gt;  &lt;li&gt;better separation between different parts of the same example (Hibernate API versus Java Persistence API)&lt;/li&gt;  &lt;li&gt;the code has been updated to the latest Hibernate Search version and cleaned up a lot (no more warning, same comments as in the book)&lt;/li&gt;&lt;li&gt;the code now contains README files for easier navigation, ant scripts, Eclipse and IntelliJ descriptors&lt;/li&gt;  &lt;li&gt;a nice appendix summarizing all annotations, Hibernate Search APIs and Lucene Query classes&lt;/li&gt;  &lt;li&gt;added an index: I wish I could plug Hibernate Search on the book, that one was painful&lt;/li&gt;  &lt;li&gt;added a section on testing (mocking, in-memory integration testing, performance testing)&lt;/li&gt;  &lt;li&gt;better explanation on how query and analyzer are interwoven&lt;/li&gt;  &lt;li&gt;add the Explanation API description&lt;/li&gt;  &lt;li&gt;clearer introduction for each chapter&lt;/li&gt;  &lt;li&gt;much more references than before making book navigation easier&lt;/li&gt;  &lt;li&gt;all references in the book are up to date. No more Chapter XX ;)&lt;/li&gt;  &lt;li&gt;improvements on the clustering chapter&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The code is almost ready for prime time, we will publish it as soon as we find the right vehicle for it.&lt;/p&gt;&lt;p&gt;Thanks to all our reviewers. While I am not sure I appreciate the recent sleep depravation, this definitely improved the book a lot.&lt;/p&gt;&lt;p&gt;As usual, you can get the preview version electronically at &lt;a href="http://www.manning.com/affiliate/idevaffiliate.php?id=952_117_1_24"&gt;Manning&lt;/a&gt;, it has all the chapters and I hope to get the latest changes uploaded soon.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/09/11/hibernate-search-book-preview-final-review-hitting-where-it-hurts-for-the-better/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/08/29/jarinspector-on-mac-os-x/</id>
    <title>JarInspector on Mac OS X</title>
    <updated>2008-08-29T00:00:00Z</updated>
    <published>2008-08-29T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/-DPE98lKFWA/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      There is a tiny little utility that let's you inspect JAR/WAR/EAR files on the Mac OS platform. The software is available here. Install it. To open a JAR, simply right click and chose JarInspector as the application. I personally did not set JarInspector as my default .jar application to let the default JAR launcher kicks in but I have been very close to.Amongst the useful features:  navigate in your jars recursively  edit/view files (useful for MANIFEST.MF)  decompile a class  find a file/class by nameBy the way, this utility also opens zip files.Enjoy.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;There is a tiny little utility that let's you inspect JAR/WAR/EAR files on the Mac OS platform. The software is available &lt;a href="http://www.codeland.org/"&gt;here&lt;/a&gt;. Install it. To open a JAR, simply right click and chose JarInspector as the application. I personally did not set JarInspector as my default .jar application to let the default JAR launcher kicks in but I have been very close to.&lt;/p&gt;&lt;p&gt;Amongst the useful features:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;navigate in your jars recursively&lt;/li&gt;  &lt;li&gt;edit/view files (useful for MANIFEST.MF)&lt;/li&gt;  &lt;li&gt;decompile a class&lt;/li&gt;  &lt;li&gt;find a file/class by name&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;By the way, this utility also opens zip files.&lt;/p&gt;&lt;p&gt;Enjoy.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/08/29/jarinspector-on-mac-os-x/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/08/21/top-5-reasons-why-out-of-office-messages-are-wrong/</id>
    <title>Top 5 reasons why Out Of Office messages are wrong</title>
    <updated>2008-08-21T00:00:00Z</updated>
    <published>2008-08-21T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/J41oPlf8mtw/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I have always been annoyed quite a bit by automatic Out of Office messages. This summer was no exception. So here are my top reasons for not doing it.  Nobody cares about your trip is Egypt really! If I am sending you an email, I am not on vacations. Do you really want to piss me off?  Email is an asynchronous media. Nobody should expect a synchronous response. If you don't answer a message, a) you are not there b) you don't care: in both cases, there is no point in knowing you are having a good time...
    </summary>
    <content type="html">
      &lt;p&gt;I have always been annoyed quite a bit by automatic Out of Office messages. This summer was no exception. So here are my top reasons for not doing it.&lt;/p&gt;&lt;ol&gt;  &lt;li&gt;Nobody cares about your trip is Egypt really! If I am sending you an email, I am not on vacations. Do you really want to piss me off?&lt;/li&gt;  &lt;li&gt;Email is an asynchronous media. Nobody should expect a synchronous response. If you don't answer a message, a) you are not there b) you don't care: in both cases, there is no point in knowing you are having a good time with uncle Bobby  by the lake.&lt;/li&gt;  &lt;li&gt;You pollute mailing lists. When someone, who probably don't even know you, send a message to a mailing list you are a member of, what do you think happen? He receives your vacations post card. Oh and since you are not the only one, he receives vacations cards from 20 other bozos as well.&lt;/li&gt;  &lt;li&gt;People forget to disable the out of office message. When you receive a message claiming a person is meant to be back 4 days ago, you wonder if he has been fired or is dead.&lt;/li&gt;  &lt;li&gt;Don't reply or send emails when you are in Out of Office Reply. There is nothing more frustrating than being asked a question by mail, reply within 5 minutes and receive a message like "I will not have access to my emails this week"&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Please don't overuse this tool. If you need to set that kind of message, it means your organization has flaws.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/08/21/top-5-reasons-why-out-of-office-messages-are-wrong/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/08/11/hibernate-search-in-action-all-chapters-written/</id>
    <title>Hibernate Search in Action: all chapters written</title>
    <updated>2008-08-11T00:00:00Z</updated>
    <published>2008-08-11T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/HLYcQ-FYuO4/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      That's now official, I handed over the last chapter to the publisher yesterday. All chapters will be available to the early access program in the next few days. The journey is not finished yet. A lot of reviewing and correction are at sight. If you have feedback, now is the time :)The last last few chapters out cover:  Hibernate Search filters  Performance  Cluster and scalabilityFilters are a neat feature allowing to apply cross cutting restrictions on Lucene queries: you might want to filter to the latest month item creations or filter according to the security level the...
    </summary>
    <content type="html">
      &lt;p&gt;That's now official, I handed over the last chapter to the publisher yesterday. All chapters will be available to the &lt;a href="http://www.manning.com/affiliate/idevaffiliate.php?id=952_117_1_24"&gt;early access program&lt;/a&gt; in the next few days. The journey is not finished yet. A lot of reviewing and correction are at sight. If you have feedback, now is the time :)&lt;/p&gt;&lt;p&gt;The last last few chapters out cover:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;Hibernate Search filters&lt;/li&gt;  &lt;li&gt;Performance&lt;/li&gt;  &lt;li&gt;Cluster and scalability&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Filters are a neat feature allowing to apply cross cutting restrictions on Lucene queries: you might want to filter to the latest month item creations or filter according to the security level the user is granted. Filters do just that in a declarative fashion: enable one or more of them by their names.&lt;/p&gt;&lt;p&gt;The chapter of performance is a mix of existing content and new content focused around performance at various stages: indexing and searching. It also includes an explanation about index sharding.&lt;/p&gt;&lt;p&gt;The last chapter describes problems that arise when you try to cluster Lucene and how Hibernate Search addresses them. We primarily describe the asynchronous clustering approach implemented out of the box in Hibernate Search (using JMS). The chapter also describes how to customize Hibernate Search to your own clustering strategy to meet your architectural needs.&lt;/p&gt;&lt;p&gt;Now off to the correction marathon :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/08/11/hibernate-search-in-action-all-chapters-written/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/08/06/remotely-send-and-consume-messages-with-jms-in-jboss-as-5-0/</id>
    <title>Remotely send and consume messages with JMS in JBoss AS 5.0</title>
    <updated>2008-08-06T00:00:00Z</updated>
    <published>2008-08-06T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/sGmcZddbtZk/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      This tutorial will show you how to create a queue in JBoss AS 5 (which uses JBoss Messaging 1.4.1), send a message to a remote queue and listen to the queue using a Message Driven Bean.I have been playing with JMS queues and MDBs in JBoss AS 5 today to complete the clustering chapter of Hibernate Search in Action and went through more bumps than I should have. Let me share what I've learnt. Disclaimer, I am a JMS noob: this tutorial will go only over the basic concepts. In particular, I will not cover subjects like security, message persistence...
    </summary>
    <content type="html">
      &lt;p&gt;This tutorial will show you how to create a queue in JBoss AS 5 (which uses JBoss Messaging 1.4.1), send a message to a remote queue and listen to the queue using a Message Driven Bean.&lt;/p&gt;&lt;p&gt;I have been playing with JMS queues and MDBs in JBoss AS 5 today to complete the clustering chapter of &lt;a href="http://www.manning.com/affiliate/idevaffiliate.php?id=952_117_1_24"&gt;Hibernate Search in Action&lt;/a&gt; and went through more bumps than I should have. Let me share what I've learnt. Disclaimer, I am a JMS noob: this tutorial will go only over the basic concepts. In particular, I will not cover subjects like security, message persistence and so on. This tutorial can be partly reused by Hibernate Search users using clustering (just ignore the part when we send and consume messages as Hibernate Search does that under the hood).&lt;/p&gt;&lt;p&gt;First of all, get a fresh version of JBoss AS 5.0 (currently in Release Candidate 1) &lt;a href="http://www.jboss.org/jbossas/downloads/"&gt;here&lt;/a&gt;. We will launch two instances of JBoss AS in parallel. If you are lucky enough, run them in two different machines (virtual image or not). If you are not, you will have to remap a few ports to avoid any conflict and this is what I will just describe now.&lt;/p&gt;&lt;p&gt;Go to &lt;em&gt;JBOSS_HOME/serve&lt;/em&gt;&lt;em&gt;r&lt;/em&gt; and copy the &lt;em&gt;default&lt;/em&gt; directory as &lt;em&gt;master&lt;/em&gt;.&lt;/p&gt;&lt;blockquote&gt;  &lt;p&gt;cp -r default master&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;We now have two versions of the JBoss configuration. &lt;em&gt;default&lt;/em&gt; will contain our slave instance configuration and &lt;em&gt;master&lt;/em&gt; will contain our master instance configuration. Let's now change the default ports on the &lt;em&gt;master&lt;/em&gt; configuration. In the master directory, open each file described and change the following ports&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;&lt;em&gt;conf/jboss-service.xml&lt;/em&gt; from port 1099 to 1199 (JNDI)&lt;/li&gt;  &lt;li&gt;&lt;em&gt;conf/jboss-service.xml&lt;/em&gt; from port 8083 to 8084 (WebServices)&lt;/li&gt;  &lt;li&gt;&lt;em&gt;conf/jboss-service.xml&lt;/em&gt; from port 1098 to 1097 (RMI)&lt;/li&gt;  &lt;li&gt;&lt;em&gt;conf/jboss-service.xml&lt;/em&gt; from port 4446 to 4447 (Remoting)&lt;/li&gt;  &lt;li&gt;&lt;em&gt;deploy/ejb3-connectors-service.xml&lt;/em&gt; from port 3873 to 3874&lt;/li&gt;  &lt;li&gt;&lt;em&gt;deploy/jbossweb.sar/server.xml&lt;/em&gt; from 8080 to 8081 (HTTP)&lt;/li&gt;  &lt;li&gt;&lt;em&gt;deploy/jbossweb.sar/server.xml&lt;/em&gt; from 8009 to 8010 (Apache connector)&lt;/li&gt;  &lt;li&gt;&lt;em&gt;deploy/http-invoker.sar/META-INF/jboss-service.xml&lt;/em&gt; from port 8080 to 8081&lt;/li&gt;  &lt;li&gt;&lt;em&gt;deploy/jmx-remoting.sar/META-INF/jboss-service.xml&lt;/em&gt; from port 1090 to 1091&lt;/li&gt;  &lt;li&gt;&lt;em&gt;deploy/messaging/remoting-bisocket-service.xml&lt;/em&gt; from port 4457 to 4458&lt;/li&gt;  &lt;li&gt;&lt;em&gt;deploy/remoting-service.xml&lt;/em&gt; from port 4444 to 4443&lt;/li&gt;  &lt;li&gt;&lt;em&gt;deploy/remoting-service.xml&lt;/em&gt; from port 4445 to 4442&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This step is only required if you use the same server to run both instances. There is an alternative and more elegant approach described &lt;a href="http://wiki.jboss.org/wiki/ConfiguringMultipleJBossInstancesOnOneMachine"&gt;here&lt;/a&gt; (thanks &lt;a href="http://twitter.com/julienviet/"&gt;Julien&lt;/a&gt; for tweeting me the answer after I did all the hard work :) )&lt;/p&gt;&lt;p&gt;You need to make sure JBoss Messaging has a different &lt;em&gt;ServerPeerID&lt;/em&gt; between different instances. Update &lt;em&gt;deploy/messaging/messaging-service.xml&lt;span style="font-style: normal;"&gt;, and set&lt;/span&gt; ServerPeerID &lt;span style="font-style: normal;"&gt;to 1 (the&lt;/span&gt; default &lt;span style="font-style: normal;"&gt;configuration uses 0)&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;We will now create the queue in the master instance. Open &lt;em&gt;deploy/messaging/destinations-service.xml&lt;span style="font-style: normal;"&gt;, and add the following fragment&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;  &lt;p&gt;&lt;span style="color: rgb(42, 0, 255);   font-family:Monaco;font-size:11px;" class="Apple-style-span"&gt;&lt;span&gt;&lt;span style="color: rgb(0, 128, 128);" class="Apple-style-span"&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#3f7f7f;"&gt;mbean &lt;/span&gt;&lt;span style="color:#7f007f;"&gt;code&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;"org.jboss.jms.server.destination.QueueService"&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#2a00ff;"&gt;      &lt;span style="color:#7f007f;"&gt;name&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;"jboss.messaging.destination:service=Queue,name=hibernatesearch"&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color:#2a00ff;"&gt;      &lt;span style="color:#7f007f;"&gt;xmbean-dd&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;"xmdesc/Queue-xmbean.xml"&amp;gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;      &lt;span style="color: rgb(0, 128, 128);" class="Apple-style-span"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#3f7f7f;"&gt;depends &lt;/span&gt;&lt;span style="color:#7f007f;"&gt;optional-attribute-name&lt;/span&gt;=&lt;span style="color:#2a00ff;"&gt;"ServerPeer"&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(0, 128, 128);" class="Apple-style-span"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;jboss.messaging:service=ServerPeer&amp;lt;/&lt;span style="color:#008080;"&gt;&lt;span style="color:#3f7f7f;"&gt;depends&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(0, 128, 128);" class="Apple-style-span"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;      &lt;span style="color: rgb(0, 128, 128);" class="Apple-style-span"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#3f7f7f;"&gt;depends&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(0, 128, 128);" class="Apple-style-span"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;jboss.messaging:service=PostOffice&amp;lt;/&lt;span style="color:#008080;"&gt;&lt;span style="color:#3f7f7f;"&gt;depends&amp;amp;&lt;/span&gt;&lt;span&gt;&lt;span style="color: rgb(0, 128, 128);" class="Apple-style-span"&gt;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco"&gt;&lt;span style="color:#008080;"&gt;&lt;span style="color: rgb(63, 127, 127); " class="Apple-style-span"&gt;&amp;lt;/mbean&lt;/span&gt;&lt;span style="" class="Apple-style-span"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;A queue is an MBean object, you can refine it's configuration as explained in the &lt;a href="http://www.jboss.org/file-access/default/members/jbossmessaging/freezone/docs/userguide-1.4.1.Beta1/html_single/index.html#conf.destination.queue"&gt;JBoss Messaging documentation&lt;/a&gt;. As a start, you can simply copy the fragment and replace &lt;strong&gt;hibernatesearch&lt;/strong&gt; by the name of your queue. The queue will be available in JNDI under &lt;em&gt;queue/hibernatesearch&lt;/em&gt; (this can be overridden if needed). If you start the master instance of JBoss AS (go to &lt;em&gt;JBOSS_HOME/bin&lt;/em&gt; and launch &lt;em&gt;./run.sh -c master&lt;/em&gt;), you should see the following lines in the console&lt;/p&gt;&lt;blockquote&gt;  &lt;p&gt;19:27:46,403 INFO [QueueService] Queue[/queue/hibernatesearch] started, fullSize=200000, pageSize=2000, downCacheSize=2000&lt;/p&gt;&lt;/blockquote&gt;The next step is to publish a message from the default JBoss AS instance into the queue. Here is a simple servlet doing so:&lt;blockquote&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#7f0055;"&gt;&lt;span style=" white-space: pre;color:#000000;"&gt;&lt;span style=" white-space: normal;color:#646464;"&gt;@Override&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#7f0055;"&gt;public&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;void&lt;/span&gt; doGet(HttpServletRequest request, HttpServletResponse response)&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#7f0055;"&gt;    throws&lt;/span&gt; ServletException, IOException {&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;    QueueConnectionFactory factory;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;    Queue queue;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#7f0055;"&gt;    try&lt;/span&gt; {&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;        Properties jndiProps = &lt;span style="color:#7f0055;"&gt;new&lt;/span&gt; Properties();&lt;span style="color:#000000;" /&gt;&lt;/p&gt;&lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#000000;"&gt;        jndiProps.setProperty(&lt;/span&gt;"java.naming.provider.url"&lt;span style="color:#000000;"&gt;,&lt;/span&gt; "jnp://localhost:1199"&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;        InitialContext initialContext = &lt;span style="color:#7f0055;"&gt;new&lt;/span&gt; InitialContext( jndiProps );&lt;/p&gt;&lt;p style="font: 11.0px Monaco"&gt;        factory = (QueueConnectionFactory) initialContext.lookup( &lt;span style="color:#2a00ff;"&gt;"/ConnectionFactory"&lt;/span&gt; );&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;        queue = (Queue) initialContext.lookup( &lt;span style="color:#2a00ff;"&gt;"queue/hibernatesearch"&lt;/span&gt; );&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;    }&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#7f0055;"&gt;    catch&lt;/span&gt; (NamingException e) {&lt;/p&gt;  &lt;p style="font: 11.0px Monaco; color:#2a00ff;"&gt;&lt;span style="color:#7f0055;"&gt;        throw&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;new&lt;/span&gt; &lt;span style="color:#000000;"&gt;Exception(&lt;/span&gt; "Unable to lookup queue"&lt;span style="color:#000000;"&gt;, e );&lt;/span&gt;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;    }&lt;/p&gt;&lt;p style="font: 11.0px Monaco"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;    QueueConnection cnn;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;    QueueSender sender;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;    QueueSession session;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#7f0055;"&gt;    try&lt;/span&gt; {&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;        cnn = factory.createQueueConnection();&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;        session = cnn.createQueueSession( &lt;span style="color:#7f0055;"&gt;false&lt;/span&gt;, QueueSession.AUTO_ACKNOWLEDGE );&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="font: 11.0px Monaco"&gt;        TextMessage message = session.createTextMessage();&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;        message.setText(&lt;span style="color:#2a00ff;"&gt;"Pass it along"&lt;/span&gt;);&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;        sender = session.createSender( queue );&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;        sender.send( message );&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;        session.close();&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;    }&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#7f0055;"&gt;    catch&lt;/span&gt; (JMSException e) {&lt;/p&gt;  &lt;p style="font: 11.0px Monaco; color:#2a00ff;"&gt;&lt;span style="color:#7f0055;"&gt;        throw&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;new&lt;/span&gt; &lt;span style="color:#000000;"&gt;Exception(&lt;/span&gt; "Unable to send message to JMS queue"&lt;span style="color:#000000;"&gt;, e );&lt;/span&gt;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;    }&lt;/p&gt;  &lt;p style="font: 11.0px Monaco; color:#7f0055;"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="color:#7F0055;"&gt;    finally &lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#7f0055;"&gt;        try&lt;/span&gt; {&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#7f0055;"&gt;            if&lt;/span&gt; (cnn != &lt;span style="color:#7f0055;"&gt;null&lt;/span&gt;) cnn.close();&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;        }&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#7f0055;"&gt;        catch&lt;/span&gt; ( JMSException e ) {&lt;/p&gt;  &lt;p style="font: 11.0px Monaco; color:#2a00ff;"&gt;&lt;span style="color:#000000;"&gt;            log.warn(&lt;/span&gt; "Unable to close JMS connection"&lt;span style="color:#000000;"&gt;, e );&lt;/span&gt;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;        }&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;    }&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;}&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;A few things are noticeable here:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;we override the JNDI URL to point to the master JNDI host and port: if you run the master instance on a different machine (without remapping ports), the URL will look like &lt;em&gt;jnp://master.host:1099&lt;/em&gt;.&lt;/li&gt;  &lt;li&gt;to look up the factory we use &lt;em&gt;/ConnectionFactory&lt;/em&gt;. Do not use &lt;em&gt;java:/ConnectionFactory&lt;/em&gt; as this value points to your local instance (I lost a few hours here, thanks Clebert for the hand!). If you want to change this name, open deploy/messaging/connection-factories-service.xml and add a new binding under the &lt;em&gt;JNDIBindings&lt;/em&gt; attribute.&lt;/li&gt;  &lt;li&gt;always close your connection in a finally block to avoid connection leaks&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;On the master side, you can deploy a MDB (a trivial task with EJB 3 as no deployment descriptor is needed).&lt;/p&gt;&lt;blockquote&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#646464;"&gt;@MessageDriven&lt;/span&gt;(activationConfig = {&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#646464;"&gt;    @ActivationConfigProperty&lt;/span&gt;(propertyName=&lt;span style="color:#2a00ff;"&gt;"destinationType"&lt;/span&gt;, propertyValue=&lt;span style="color:#2a00ff;"&gt;"javax.jms.Queue"&lt;/span&gt;),&lt;/p&gt;  &lt;p style="font: 11.0px Monaco; color:#2a00ff;"&gt;&lt;span style="color:#646464;"&gt;    @ActivationConfigProperty&lt;/span&gt;&lt;span style="color:#000000;"&gt;(propertyName=&lt;/span&gt;"destination"&lt;span style="color:#000000;"&gt;, propertyValue=&lt;/span&gt;"queue/hibernatesearch"&lt;span style="color:#000000;"&gt;),&lt;/span&gt;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#646464;"&gt;    @ActivationConfigProperty&lt;/span&gt;(propertyName=&lt;span style="color:#2a00ff;"&gt;"DLQMaxResent"&lt;/span&gt;, propertyValue=&lt;span style="color:#2a00ff;"&gt;"1")&lt;/span&gt;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;} )&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#7f0055;"&gt;public&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;class&lt;/span&gt; MDBPassOnController &lt;span style="color:#7f0055;"&gt;implements&lt;/span&gt; MessageListener {&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#7f0055;"&gt;    private&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;final&lt;/span&gt; Logger log = LoggerFactory.getLogger( MDBPassOnController.&lt;span style="color:#7f0055;"&gt;class&lt;/span&gt; );&lt;/p&gt;&lt;br /&gt;&lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#7f0055;"&gt;    public&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;void&lt;/span&gt; onMessage(Message message) {&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;&lt;span style="color:#7f0055;"&gt;        if&lt;/span&gt; ( !( message &lt;span style="color:#7f0055;"&gt;instanceof&lt;/span&gt; TextMessage ) ) {&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;            log.error( &lt;span style="color:#2a00ff;"&gt;"Incorrect message type: {}"&lt;/span&gt;, message.getClass() );&lt;/p&gt;  &lt;p style="font: 11.0px Monaco; color:#7f0055;"&gt;            return&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;        }&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;        TextMessage textMessage = (TextMessage) message;&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;        System.&lt;span style="color:#0000c0;"&gt;out&lt;/span&gt;.println( textMessage.getText() );&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;    }&lt;/p&gt;  &lt;p style="font: 11.0px Monaco"&gt;}&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The new embedded console (to come with JBoss AS 5 final) based on a stripped down version of &lt;a href="http://www.jboss.com/products/jbosson"&gt;JBoss ON&lt;/a&gt; will make some of these steps much easier but now that you have gone the roots way, don't you feel stronger? :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/08/06/remotely-send-and-consume-messages-with-jms-in-jboss-as-5-0/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/07/11/breaking-news-apple-inc-acquires-twitter/</id>
    <title>*Breaking* news: Apple Inc acquires Twitter...</title>
    <updated>2008-07-11T00:00:00Z</updated>
    <published>2008-07-11T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/wB_30uARlYE/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      ... and uses it as their iTunes Store infrastructure. Now it's broke!I updated my iPhone firmware this morning *as requested by Apple* and the process is hung because the iTunes Store is down. I now have a totally bricked legit iPhone: no call, no text. Great!Apple, I am very angry at you. Why are you penalizing your legit customers by not allowing the phone to be activated without your blessing. People who want, will jailbreak it anyway. Please this is the 21st century, be smarter.PS: sorry Twitter to pick on you. I love your service, and it helped me to...
    </summary>
    <content type="html">
      &lt;p&gt;... and uses it as their iTunes Store infrastructure. Now it's broke!&lt;/p&gt;&lt;p&gt;I updated my iPhone firmware this morning *as requested by Apple* and the process is hung because the iTunes Store is down. I now have a totally bricked legit iPhone: no call, no text. Great!&lt;/p&gt;&lt;p&gt;Apple, I am very angry at you. Why are you penalizing your legit customers by not allowing the phone to be activated without your blessing. People who want, will jailbreak it anyway. Please this is the 21st century, be smarter.&lt;/p&gt;&lt;p&gt;PS: sorry Twitter to pick on you. I love your service, and it helped me to discover &lt;a href="http://summize.com/search?q=&amp;amp;ands=itunes+down&amp;amp;phrase=&amp;amp;ors=&amp;amp;nots=&amp;amp;tag=&amp;amp;lang=all&amp;amp;from=&amp;amp;to=&amp;amp;ref=&amp;amp;near=&amp;amp;within=15&amp;amp;units=mi&amp;amp;since=2008-07-11&amp;amp;until=2008-07-11&amp;amp;rpp=15"&gt;I was not stuck alone in this madness&lt;/a&gt;. &lt;a href="http://summize.com"&gt;Summize&lt;/a&gt; is a totally awesome pulse checker.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/07/11/breaking-news-apple-inc-acquires-twitter/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/05/29/two-third-of-hibernate-search-in-action-out/</id>
    <title>Two third of Hibernate Search in Action out!</title>
    <updated>2008-05-29T00:00:00Z</updated>
    <published>2008-05-29T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/HEmJE2DTD60/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      We have just pushed another set of chapters for Hibernate Search in Action and reached the symbolic limit of 2/3. Yoohoo! We have also enhanced some of the existing chapters based on the feedbacks we received and the perseverance of our editor. They have just shipped as part of the early access program available in ebook format. I am very happy with the new chapters especially the description of analyzers in chapter 5.I describe the use of Hibernate Search and the new Solr integration (coming up in Hibernate Search 3.1) to enable synonym, phonetic, n-gram and snowball search. Snowball is...
    </summary>
    <content type="html">
      &lt;p&gt;We have just pushed another set of chapters for Hibernate Search in Action and reached the symbolic limit of 2/3. Yoohoo! We have also enhanced some of the existing chapters based on the feedbacks we received and the perseverance of our editor. They have just shipped as part of the early access program &lt;a href="http://www.manning.com/affiliate/idevaffiliate.php?id=952_117_1_24"&gt;available in ebook format&lt;/a&gt;. I am very happy with the new chapters especially the description of analyzers in chapter 5.&lt;/p&gt;&lt;p&gt;I describe the use of Hibernate Search and the new Solr integration (coming up in Hibernate Search 3.1) to enable synonym, phonetic, n-gram and snowball search. Snowball is an algorithm that deduces the root of a word enabling searches for words of the same family: work, working, worker will all be reduced to the same root (called stemmer). The chapter both aims at demystifying analyzers and providing a concrete approach on how to use them. I really enjoyed writing it, I hope you will like reading it.&lt;/p&gt;&lt;p&gt;Beyond analyzers, here is a small list of the subjects I am personally happy with in the book:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;the introduction gives you a nice picture of what search is, why it matters nowadays and how it can be implemented in todays applications&lt;/li&gt;  &lt;li&gt;custom bridges: chapter 4 gives some nice examples of custom bridges including how to write one for composite identifiers&lt;/li&gt;  &lt;li&gt;mapping associations has always been a confusing subject for beginners. Chapter 4 comes with some nice diagrams that should clarify this topic&lt;/li&gt;  &lt;li&gt;chapter 5 explores when and how to use synchronous indexing, asynchronous indexing and clustered indexing (through JMS) and describes what is going on under the hood&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;We (and by we, I mean &lt;a href="http://thediningphilosopher.blogspot.com/"&gt;John&lt;/a&gt;) also have finished the Lucene dedicated content. While Hibernate Search hides the gory details of indexing and searching, its let you use all the flexibility of Lucene queries. Understanding Lucene is key and we have added the necessary knowledge you need for your daily work with Hibernate Search.&lt;/p&gt;&lt;p&gt;Let us know what you think and, of course, &lt;a href="http://www.manning.com/affiliate/idevaffiliate.php?id=952_117_1_24"&gt;go buy the e-book&lt;/a&gt; :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/05/29/two-third-of-hibernate-search-in-action-out/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/05/01/jsr-303-interviews/</id>
    <title>JSR 303 interviews</title>
    <updated>2008-05-01T00:00:00Z</updated>
    <published>2008-05-01T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/mQjcGAvivIE/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I have been talking, writing, preaching Bean Validation in the past six months.A few interesting links came up recently:The list of blog entries I wrote. Probably the most palatable content but long.An interview with Dick Wall and Carl Quinn from the Javaposse I did at Javapolis 07 (newly renamed Javoxx) . I hated to listen to myself, hopefully you won't. The interview also covers Hibernate Search, Seam and Web Beans.An article published by InfoQ that goes beyond the standard set of questions on JSR 303Many thanks to Dick and Charles for setting the interviews up.Free bonus: a very interesting talk...
    </summary>
    <content type="html">
      &lt;p&gt;I have been talking, writing, preaching &lt;a href="http://jcp.org/en/jsr/detail?id=303"&gt;Bean Validation&lt;/a&gt; in the past six months.&lt;br /&gt;A few interesting links came up recently:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The &lt;a href="http://in.relation.to/tag/Bean+Validation+Sneak+Peek"&gt;list of blog entries&lt;/a&gt; I wrote. Probably the most palatable content but long.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;An &lt;a href="http://javaposse.com/index.php?post_id=331881"&gt;interview&lt;/a&gt; with Dick Wall and Carl Quinn from the Javaposse I did at Javapolis 07 (newly renamed &lt;a href="http://javoxx.com"&gt;Javoxx&lt;/a&gt;) . I hated to listen to myself, hopefully you won't. The interview also covers Hibernate Search, Seam and Web Beans.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;An &lt;a href="http://www.infoq.com/articles/emmanuel_bernard_interview"&gt;article&lt;/a&gt; published by InfoQ that goes beyond the standard set of questions on JSR 303&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Many thanks to Dick and Charles for setting the interviews up.&lt;br /&gt;&lt;br /&gt;Free bonus: a very interesting &lt;a href="http://lifehacker.com/385296/where-you-find-the-time"&gt;talk&lt;/a&gt; about free time and participation in a post TV-only age. No relation to Java, not by me, so surely very interesting :o)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/05/01/jsr-303-interviews/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/04/30/timemachine-backs-up-too-much/</id>
    <title>TimeMachine backs up too much?</title>
    <updated>2008-04-30T00:00:00Z</updated>
    <published>2008-04-30T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/9IkyNk4x_FA/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I just discovered the reason why TimeMachine was backing up so much data. I forgot to exclude my Maven and Ivy repositories :o)Here is a good tip to discover which files are backed up. You need to have the Developer Tools installed.When TimeMachine backs upLaunch /Developer/Applications/InstrumentsSelect File ActivityOpen the default target combo box and attach the backupd process.Start recordingEnjoy the list.I wish there were a less geeky solution.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;I just discovered the reason why TimeMachine was backing up so much data. I forgot to exclude my Maven and Ivy repositories :o)&lt;br /&gt;&lt;br /&gt;Here is a good tip to discover which files are backed up. You need to have the Developer Tools installed.&lt;br /&gt;&lt;br /&gt;When TimeMachine backs up&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Launch /Developer/Applications/Instruments&lt;/li&gt;&lt;li&gt;Select File Activity&lt;/li&gt;&lt;li&gt;Open the default target combo box and attach the backupd process.&lt;/li&gt;&lt;li&gt;Start recording&lt;/li&gt;&lt;li&gt;Enjoy the list.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I wish there were a less geeky solution.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/04/30/timemachine-backs-up-too-much/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/04/24/why-would-you-pay-for-jboss-products/</id>
    <title>Why would you pay for JBoss products?</title>
    <updated>2008-04-24T00:00:00Z</updated>
    <published>2008-04-24T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/QOm8zhI1Psc/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Andy posted some of the reasons why you would want to use the JBoss subscription based platforms rather than the .org projects. During this exercise, he hinted some of the reasons why JBoss moved from a model where the community version was supported to a model where an enterprise platform is supported. He did not go far enough in his explication for my taste.One of the fundamental reason (other than the financial one) for such a split is that supporting all the community releases do not work in the long run. Some customers want 5+ years of support on a...
    </summary>
    <content type="html">
      &lt;a href="http://www.jboss.org/feeds/post/why_adopt_jboss_enterprise_platforms"&gt;Andy&lt;/a&gt; posted some of the reasons why you would want to use the JBoss subscription based platforms rather than the .org projects. During this exercise, he hinted some of the reasons why JBoss moved from a model where the community version was supported to a model where an enterprise platform is supported. He did not go far enough in his explication for my taste.&lt;br /&gt;&lt;br /&gt;One of the fundamental reason (&lt;a href="http://www.thedelphicfuture.org/search?q=proprietary+distribution"&gt;other than the financial one&lt;/a&gt;) for such a split is that supporting all the community releases do not work in the long run. Some customers want 5+ years of support on a product line and it is simply impossible to support every single community release for 5 years.&lt;br /&gt;&lt;br /&gt;There are two main strategies from here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;slow down the release cycle and freeze innovation to match the 5 years customers&lt;/li&gt;&lt;li&gt;leave the community projects release early, release often, innovate like crazy and fork them to do an Enterprise pace version&lt;/li&gt;&lt;/ul&gt;The first model is not viable: it can work great for proprietary software but is fatal for open source software.&lt;br /&gt;In the second model, an enterprise version is created every n community versions. This is where the support, packaging, service and advanced QA is provided. Packaging and QA are the ice on the cake, the five year support is really the meat (assuming a meat cake with ice is good :) )&lt;br /&gt;&lt;br /&gt;Speaking of QA, yes deep internal QA is important and leverage bugs upfront but I trust the community QA more than any internal QA (more hands, more eyes, more time). I wish &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=49087"&gt;good luck to MySQL&lt;/a&gt; on their enterprise only features (semi-closed or closed source) but I think that will lower the quality of these particular features (less eyes, less hands, less time): my bet would simply to use the MySQL Enterprise version but not the "select" features. As &lt;a href="http://sacha.labourey.com/2007/04/24/new-development-distribution-and-support-model-for-jboss/"&gt;Sacha like to say&lt;/a&gt;, in the JBoss Entreprise versions we remove features, we don't add them: unstable or experimental features are removed from the enterprise version. It's about less not more.&lt;br /&gt;&lt;br /&gt;Generally speaking the support problem is interesting and usually kicks a company around its 5th birthday. The wannabee Platform as a Service contenders will face the same problem... in 5 years.  "What do you mean the cloud where my data lives is too old??? Which version of the Cloud are you at?"
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/04/24/why-would-you-pay-for-jboss-products/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/04/24/productivity-tools/</id>
    <title>Productivity tools</title>
    <updated>2008-04-24T00:00:00Z</updated>
    <published>2008-04-24T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/_R6MbhU2DOw/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      With my regular job(s), the Hibernate Search book and a life going on at the same time, I had to find ways to boost my productivity.Here is a list of some tools I am using in no particular order:ThinkingRock (ad the GTD methodology): I am reading Getting Things Done by David Allen and ThinkingRock is the best tool I have found to help you follow the methodology. GTD is all about putting all your thoughts somewhere, organize them and decide what will be the next action on each of them. Some sort of superpower todo list, but one you actually...
    </summary>
    <content type="html">
      &lt;p&gt;With my regular job(s), the &lt;a href="http://manning.com/bernard/"&gt;Hibernate Search book&lt;/a&gt; and a life going on at the same time, I had to find ways to boost my productivity.&lt;br /&gt;&lt;br /&gt;Here is a list of some tools I am using in no particular order:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.thinkingrock.com.au/"&gt;ThinkingRock&lt;/a&gt; (ad the GTD methodology): I am reading Getting Things Done by David Allen and ThinkingRock is the best tool I have found to help you follow the methodology. GTD is all about putting all your thoughts somewhere, organize them and decide what will be the next action on each of them. Some sort of superpower todo list, but one you actually use.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://freemind.sourceforge.net/wiki/index.php/Main_Page"&gt;FreeMind&lt;/a&gt;: it's a software implementing the concept of &lt;a href="http://en.wikipedia.org/wiki/Mind_map"&gt;Mind Mapping&lt;/a&gt;. It's a fantastic tool to organize your ideas on a given subject. Despite it's clumsy interface, I use it extensively to organize each chapter of the book. I also use it to build presentations.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.omnigroup.com/applications/omnioutliner/"&gt;OmniOutliner&lt;/a&gt;: a fantastic outliner tool. It somewhat competes with FreeMind but keep things a bit more organized and the interface is very efficient.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.omnigroup.com/applications/omnigraffle/"&gt;OmniGraffle&lt;/a&gt;: every diagram in the book is done with OmniGraffle. Fantastic tool, very productive and makes very nice diagrams without effort. Microsoft Visio but done well.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jetbrains.com/idea/"&gt;IntelliJ IDEA&lt;/a&gt;: I switched from Eclipse back in the dark days of annotations. I tried to come abck a couple of times, but I am too much of a happy user to jump back.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.apple.com/iwork/keynote/"&gt;Keynote&lt;/a&gt;: Powerpoint without the useful features and annoying glitches.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;no email: I try to avoid unread emails, when I open my inbox, I process all emails and put some todos if needed in ThinkingRock. If I read an email and keep it unread, I will process it over and over. annoying&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.keepassx.org/"&gt;KeepassX&lt;/a&gt;: Some people keep all your passwords in a text file. This is efficient and cross-platform. I keep mine in KeepassX: it's a bit more secure, it has a search box and open the websites for you. There is a &lt;a href="http://keepass.info/"&gt;Windows&lt;/a&gt; version as well (the original version indeed). The file is readable by both versions AFAIR.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.apple.com/macosx/"&gt;Mac OS X&lt;/a&gt;: a ton of tiny little details&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.apple.com/timecapsule/"&gt;Time Machine + Time Capsule&lt;/a&gt;: A software + hardware solution to seamlessly backup your data on a Mac. Not so much a productivity tool as no major catastrophe has happened so far but that's the first time I do backup my data consistently. I don't even have to think about it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.xmlmind.com/xmleditor/"&gt;XMLEditor XMLMind&lt;/a&gt;: my part of the book is written in docbook as I find it more productive and easier to focus on the content rather than the style. XMLMind is the best Wysiwyg editor for Docbook (could be better but the best I've found so far). I use the pro version simply because it has on the fly autocorrect feature. It's expensive for a tiny little feature but it is worth the time it saves me.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.selenic.com/mercurial/wiki/"&gt;Hg (Mercurial)&lt;/a&gt;: I am not using this tool yet but I am very curious about Distributed SCM. I wonder if it would help me integrate patches quicker and make the contributor's life easier (it's for another post I guess)&lt;/li&gt;&lt;li&gt;No TV: pretty obvious. I check the news on &lt;a href="http://news.google.com/"&gt;Google News&lt;/a&gt; and &lt;a href="http://lemonde.fr/"&gt;Le Monde&lt;/a&gt; ; I rent DVDs when I feel like it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/reader/view/"&gt;Google Reader&lt;/a&gt;: I don't run after the tech news, they are waiting for me on Google Reader. so when I have some spare time, I go read a couple of entries.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I hope you will find some interesting gems, feel free to share your favorite productivity tool as well. In a future blog entry, I will talk about how I waste the time I hardly gained :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/04/24/productivity-tools/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/03/18/mac-os-x-leopard-and-internet-downloads/</id>
    <title>Mac OS X Leopard and internet downloads</title>
    <updated>2008-03-18T00:00:00Z</updated>
    <published>2008-03-18T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/Na9gebT8e10/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      If Leopard asks you if "you are sure you want to open this application which was downloaded from the web" every single time, read further.I installed Mac OS X Leopard yesterday. Leopard started to warn me about applications downloaded from the Internet. Every single time I open them (not only the first time) I have to confirm it's a safe app.I first thought Apple believed I was both stupid (can't take care of my security) and with huge memory issues (yes I am trying to open this troyan app 8 times in a row, thank you for reminding me I...
    </summary>
    <content type="html">
      &lt;p&gt;If Leopard asks you if "you are sure you want to open this application which was downloaded from the web" every single time, read further.&lt;br /&gt;&lt;br /&gt;I installed Mac OS X Leopard yesterday. Leopard started to warn me about applications downloaded from the Internet. Every single time I open them (not only the first time) I have to confirm it's a safe app.&lt;br /&gt;&lt;br /&gt;I first thought Apple believed I was both stupid (can't take care of my security) and with huge memory issues (yes I am trying to open this troyan app 8 times in a row, thank you for reminding me I forgot).&lt;br /&gt;&lt;br /&gt;Apparently, this is a small bug. If you download an application with one user account but do not open it with the same account, the security flag is never lift up. To work around that, log on your original account, open all you downloaded apps (27 for me, the dock was a nice christmas tree :) ), accept the security warning for all of them. Next time you open one of them, the security warning will not appear, pfffeu!&lt;br /&gt;&lt;br /&gt;Another tip for free. If, like me, you want your old iLife applications back after a clean OS install, go download &lt;a href="http://www.charlessoft.com/"&gt;Pacifist&lt;/a&gt;, extract the i&lt;span style="font-style: italic;"&gt;Thing&lt;/span&gt; packages from the Tiger CDs and install them.&lt;br /&gt;&lt;br /&gt;It was nevertheless the smoothest clean reinstall experience I've ever had (&lt;a href="http://www.bombich.com/software/ccc.html"&gt;Carbon Copy Cloner&lt;/a&gt; and the Migration Assistant are fantastic).&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/03/18/mac-os-x-leopard-and-internet-downloads/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/03/12/phillys-search/</id>
    <title>Philly's search</title>
    <updated>2008-03-12T00:00:00Z</updated>
    <published>2008-03-12T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/znBMG1TSv3U/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I will be at the Philadelphia's Emerging Technologies for the Enterprise conference speaking about Hibernate Search on March 27th (Thursday).The conference has some interesting talks around the new wave of development frameworks (Seam, Rails and so on). There is even a Battle of the frameworks! a Rountable Debate which sounds very promising. I will definitely try to sneak into it ;)Come by and say hi. If people are interested we could have a chat about the future of Hibernate Search as we are shaping it as we speak (or you can show up on the hibernate dev list if you...
    </summary>
    <content type="html">
      &lt;p&gt;I will be at the Philadelphia's &lt;a href="http://phillyemergingtech.com/"&gt;Emerging Technologies for the Enterprise&lt;/a&gt; conference speaking about Hibernate Search on March 27th (Thursday).&lt;br /&gt;The conference has some interesting talks around the new wave of development frameworks (Seam, Rails and so on). There is even a &lt;a href="http://www.phillyemergingtech.com/abstracts.php#frameworks"&gt;Battle of the frameworks! a Rountable Debate&lt;/a&gt; which sounds very promising. I will definitely try to sneak into it ;)&lt;br /&gt;Come by and say hi. If people are interested we could have a chat about the future of Hibernate Search as we are shaping it as we speak (or you can show up on the hibernate dev list if you don't like Philly ;) ).&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/03/12/phillys-search/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/03/07/hibernate-annotations-and-entitymanager-fix-athlon/</id>
    <title>Hibernate Annotations and EntityManager fix-athlon</title>
    <updated>2008-03-07T00:00:00Z</updated>
    <published>2008-03-07T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/llIRsWZKZg8/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Hibernate Annotations 3.3.1.CR1 and Hibernate EntityManager 3.3.2.CR1 are available for download here. I have done a fix-athlon in the last few days to ready them for JBoss AS 5.There is a ton of bug fixes especially in the Java Persistence scanning area and in edge mapping supports.Some minor new features have been added as well (transparent integration with the latest Hibernate Search collection events, @Any, @NaturalId).Check the changelogs here and here.Unless huge bugs are discovered, these versions will be embedded in the next JBoss AS 5 release.Go try them.
      ...
    </summary>
    <content type="html">
      &lt;a href="http://annotations.hibernate.org"&gt;Hibernate Annotations&lt;/a&gt; 3.3.1.CR1 and &lt;a href="http://entitymanager.hibernate.org"&gt;Hibernate EntityManager&lt;/a&gt; 3.3.2.CR1 are available for download &lt;a href="http://www.hibernate.org/6.html"&gt;here&lt;/a&gt;. I have done a fix-athlon in the last few days to ready them for JBoss AS 5.&lt;br /&gt;There is a ton of bug fixes especially in the Java Persistence scanning area and in edge mapping supports.&lt;br /&gt;Some minor new features have been added as well (transparent integration with the latest &lt;a href="http://search.hibernate.org"&gt;Hibernate Search&lt;/a&gt; collection events, @Any, @NaturalId).&lt;br /&gt;&lt;br /&gt;Check the changelogs &lt;a href="http://opensource.atlassian.com/projects/hibernate/browse/ANN?report=com.atlassian.jira.plugin.system.project:changelog-panel"&gt;here&lt;/a&gt; and &lt;a href="http://opensource.atlassian.com/projects/hibernate/browse/EJB?report=com.atlassian.jira.plugin.system.project:changelog-panel"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Unless huge bugs are discovered, these versions will be embedded in the next JBoss AS 5 release.&lt;br /&gt;&lt;br /&gt;Go try them.
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/03/07/hibernate-annotations-and-entitymanager-fix-athlon/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/02/27/lucene-users-2-3-migrate-to-lucene-2-3-1/</id>
    <title>Lucene users (2.3): migrate to Lucene 2.3.1</title>
    <updated>2008-02-27T00:00:00Z</updated>
    <published>2008-02-27T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/JFnFjZIFJCo/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      In some specific cases, Lucene 2.3.0 can corrupt your index. It happens in very specific cases:you use autoCommit=false on IndexWriteror multiple                 threads are adding documents where some have term-vector enabled                 fields and some don'tThese particular situations do not occur in the regular use of Hibernate Search, but upgrading to Lucene 2.3.1 works fine, so go upgrade, you won't be bitten later. Native Lucene users should upgrade as well.Here...
    </summary>
    <content type="html">
      &lt;p&gt;In some specific cases, Lucene 2.3.0 can corrupt your index. It happens in very specific cases:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;you use autoCommit=false on IndexWriter&lt;br /&gt;&lt;/li&gt;&lt;li&gt;or multiple                 threads are adding documents where some have term-vector enabled                 fields and some don't&lt;/li&gt;&lt;/ul&gt;These particular situations do not occur in the regular use of Hibernate Search, but upgrading to Lucene 2.3.1 works fine, so go upgrade, you won't be bitten later. Native Lucene users should upgrade as well.&lt;br /&gt;&lt;br /&gt;Here is the official Lucene team announcement&lt;br /&gt;&lt;br /&gt;&lt;h3 class="boxed"&gt;&lt;blockquote&gt;&lt;h3 class="boxed"&gt;Lucene Java 2.3.1 available&lt;/h3&gt; &lt;p&gt;                 This release contains fixes for serious bugs in 2.3.0 that could cause                 index corruptions in &lt;b&gt;autoCommit=false mode&lt;/b&gt; or in cases where multiple                 threads are adding documents where &lt;b&gt;some have term-vector enabled                 fields and some don't&lt;/b&gt;.  The autoCommit option was added to IndexWriter                 with release 2.2.0. If not explicitly set to false, the IndexWriter                 runs in autoCommit=true mode.               &lt;/p&gt; &lt;p&gt;                 See          &lt;a href="http://svn.apache.org/repos/asf/lucene/java/tags/lucene_2_3_1/CHANGES.txt"&gt;CHANGES.txt&lt;/a&gt;                 for a detailed listing of changes.               &lt;/p&gt; &lt;p&gt;                 2.3.1 does not contain any new features, API or file format changes,                 which makes it fully compatible to 2.3.0.               &lt;/p&gt; &lt;p&gt; &lt;b&gt;                 We would like to encourage everyone who is currently using Lucene Java 2.3.0                 to upgrade to 2.3.1 to prevent possible index corruptions!                &lt;/b&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;b&gt; &lt;/b&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Lucene is available at &lt;a href="http://www.apache.org/dyn/closer.cgi/lucene/java/"&gt;apache.org&lt;/a&gt;.&lt;/h3&gt;&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/02/27/lucene-users-2-3-migrate-to-lucene-2-3-1/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/02/26/hibernate-search-in-action-book/</id>
    <title>Hibernate Search in Action book</title>
    <updated>2008-02-26T00:00:00Z</updated>
    <published>2008-02-26T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/wakcHFtmibc/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I am very please to announce that a book on Hibernate Search is on its way. John Griffin and I are co-authoring Hibernate Search in Action from Manning.The goal of this book is to give a good practical understanding of Hibernate Search and guide people through the steps of adding full text search capability into their Hibernate based application.  The book also covers the necessary Lucene knowledge you need to use Hibernate Search on a daily basis.An early version of the book is already available through the MEAP program. Five chapters are already out there. If you are interested,...
    </summary>
    <content type="html">
      &lt;a href="http://www.manning.com/bernard/bernard_cover150.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://www.manning.com/bernard/bernard_cover150.jpg" alt="" border="0" style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 239px; height: 300px;" /&gt;&lt;/a&gt;I am very please to announce that a book on &lt;a href="http://search.hibernate.org"&gt;Hibernate Search&lt;/a&gt; is on its way. John Griffin and I are co-authoring &lt;a href="http://www.manning.com/bernard/"&gt;Hibernate Search in Action&lt;/a&gt; from Manning.&lt;br /&gt;&lt;br /&gt;The goal of this book is to give a good practical understanding of Hibernate Search and guide people through the steps of adding full text search capability into their Hibernate based application.  The book also covers the necessary Lucene knowledge you need to use Hibernate Search on a daily basis.&lt;br /&gt;&lt;br /&gt;An &lt;a href="http://www.manning.com/bernard/"&gt;early version of the book&lt;/a&gt; is already available through the MEAP program. Five chapters are already out there. If you are interested, give it a try, we welcome your feedback!
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/02/26/hibernate-search-in-action-book/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/01/29/springsources-strategy/</id>
    <title>SpringSource's strategy</title>
    <updated>2008-01-29T00:00:00Z</updated>
    <published>2008-01-29T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/-iDOQ5yyTzM/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      It has been interesting to follow the recent communications made by Rod Johnson as you can transparently read SpringSource's strategy. I wanted to blog about it during the last vacations but never fully finished the entry (they were vacations after all). Some elements are outdated now (including SpringSource acquiring covalent) but here it goes just refreshed with links.Rod Johnson has been quite aggressive against JBoss AS in the last few weeks. It did not really bother me per se but the move is interesting. While it is well known that some JBoss folks and some Interface21 folks has been having...
    </summary>
    <content type="html">
      &lt;p&gt;It has been interesting to follow the &lt;a href="http://blog.springsource.com/main/author/rodj/"&gt;recent communications&lt;/a&gt; made by Rod Johnson as you can transparently read SpringSource's strategy. I wanted to blog about it during the last vacations but never fully finished the entry (they were vacations after all). Some elements are outdated now (including SpringSource acquiring covalent) but here it goes just refreshed with links.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Rod Johnson has been quite aggressive &lt;a href="http://blog.springsource.com/main/2007/12/24/is-it-a-tomcat-or-the-elephant-in-the-room/"&gt;against&lt;/a&gt; JBoss AS in the &lt;a href="http://blog.springsource.com/main/2008/01/16/the-power-of-adoption-why-no-company-is-big-enough-to-deny-developers-what-they-want/"&gt;last few weeks&lt;/a&gt;. It did not really bother me per se but the move is interesting. While it is well known that some JBoss folks and some Interface21 folks has been having tensions in the past, it came to a surprise that Rod joins the arena. Since Rod does not attack people for emotional reasons contrary to &lt;a href="http://bill.burkecentral.com/"&gt;other folks&lt;/a&gt;, let's try a guess what's going on.&lt;br /&gt;&lt;br /&gt;Interface21 (now SpringSource) received VC funding last year. Don't be naive, VC do transform a company, they are seeking for quick returns on their investment. Interface21 was mainly a consulting oriented company (in term of business) around the Spring portfolio. While this is a very steady and nobel business, it cannot provide the ROI VC people want to get: SpringSource's strategy had to be adjusted, the most obvious, safe and well defined solution is to follow the JBoss Inc model: go for the support money.&lt;br /&gt;&lt;br /&gt;Well, to sell support, you need runtime. Unfortunately for SpringSource, Spring as a framework is not appealing enough for customers to jump into the support model. I think SpringSource did some interesting partnership / support deals with the folks at IBM, BEA and possibly Oracle (something JBoss never really did well because of the direct competition), but the only reasonable way to scale up the business is to have and support your own runtime. By the way, you can see the partnership going on in Rod's blogs, his tone is very sympathetic to IBM, BEA and Sun (I will come back to Sun later on). Generally speaking, the broader your platform is, the more likely you will be able to sell support. So SpringSource needs a platform to "sell and support".&lt;br /&gt;&lt;br /&gt;Writing your own proprietary set of platform API is not so much &lt;a href="http://www.apple.com/macbookair/"&gt;in the air&lt;/a&gt; (to unquote Steve Jobs). That's why SpringSource joined the JCP and &lt;a href="http://blog.interface21.com/main/2007/07/03/java-ee-6-gets-it-right/"&gt;started to bless Sun and the Java EE 6 efforts, especially the profile effort&lt;/a&gt;. They need a &lt;a href="http://en.wikipedia.org/wiki/Mini-Me"&gt;mini-EE&lt;/a&gt; they can reach implementation-wise. If I were SpringSource, I would then try and get the smallest web-ish profile as possible out of the Java EE expert group, implement it and then raise the Java EE compliant flag to sell supports.&lt;br /&gt;&lt;br /&gt;Side note on profiles. While everybody agrees Java EE needs some profile, I am sure nobody agrees on what to put in which profile: every application has different needs. What people really need is an ability to deploy and buy infrastructure components a la carte (whether it be one vendor or several) with the warranty of well defined API / SPI so that the whole platform keep a coherent vision freeing the customer from any integration work (component integration or programmatic model integration). Nothing a rigid profiling set can do. But that is a hard job.&lt;br /&gt;&lt;br /&gt;Back to the main story. Even with the smallest possible Java EE profile, SpringSource is lacking some important pieces, the first one being the servlet container. And here comes the reason why Rod has been trying to not so subtly sent the message that &lt;a href="http://blog.springsource.com/main/2007/12/24/is-it-a-tomcat-or-the-elephant-in-the-room/"&gt;JBoss AS is crap (I summarize here) and Tomcat is great&lt;/a&gt;. The only obvious choice for SpringSource is Tomcat. They need to enter the platform/runtime by the low end and gain market share (as in support market share). I would not be surprised if SpringSource announce a fully supported platform effort based on Tomcat and Spring at it's core. Of course, they need to hire some of the key contributors of Tomcat to gain some credibility. Let's imagine this done, the first competition they think they will face is JBoss AS, so seeing Rod poopooing on JBoss AS and EJB 3 is not a surprise. The first competition they will face though is people that do not want support for Tomcat: JBoss has been offering Tomcat support for a long time but not surprisingly monetizing Tomcat never succeeded. Most applications deployed on Tomcat do not want need (of course exceptions apply). Maybe Tomcat + Spring will be the silver bullet but I seriously doubt it for a bunch of reasons.  The second biggest competition will probably be their own ecosystem. When you start to compete with them, your partners tend to be pissed, that's life. Ask Larry about that.&lt;br /&gt;&lt;br /&gt;By the way, Rod does not seem to know that JBoss uses an enhanced version of Tomcat as a web container named JBoss Web. Remy (Tomcat) and Mladen (Apache httpd) sat down and wrote a native integration between Tomcat and APR to make this server the best of both Tomcat and Apache httpd. Maybe he wants to check it out and fork it :) Oh, one more thing, anybody that has been charged by an elephant tend to smile at the cat vs elephant analogy.&lt;br /&gt;&lt;br /&gt;Tomcat + Spring will still be a weak platform, SpringSource will have to beef it up with some additional components:&lt;br /&gt;- a persistence framework (and no Spring is not a persistence framework :) )&lt;br /&gt;- a transaction manager&lt;br /&gt;- a messaging system&lt;br /&gt;- maybe some webservices thingy stuffs&lt;br /&gt;&lt;br /&gt;and a few more components. They probably will also have to announce a developer tooling strategy around that.&lt;br /&gt;I will only comment on the persistence piece of their platform as I know the field quite well. They can technically chose between Hibernate, OpenJPA, and Toplink. Hibernate would be the smartest move for them and the most aligned with their customer base but this probably will be a tough call for Rod. The two alternative strategie are Toplink (aka EclipseLink) and OpenJPA. If I were them, I guess I would go for OpenJPA as a second choice but they will have to invest R&amp;amp;D in the pieces that differenciate OpenJPA from Kodo.&lt;br /&gt;&lt;br /&gt;Rod, please be more open with your strategy. I always liked Marc Fleury's own way to tell everyone what strategy he was following and what will be the next moves. To everyone, including the competition :)&lt;br /&gt;&lt;br /&gt;Good luck anyway, I am eager to have competition in this field as I think JBoss AS, Seam, Web Beans and the technologies around them (JPA, EJB 3, JSF and so on) are more appealing to the next leap forward.&lt;/blockquote&gt;&lt;br /&gt;Usual disclamer, this represents my own thoughts not necessarily my current, past, future, potential employer, etc etc.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/01/29/springsources-strategy/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2008/01/29/paris-jug/</id>
    <title>Paris JUG</title>
    <updated>2008-01-29T00:00:00Z</updated>
    <published>2008-01-29T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/Hzm1cXjo0F8/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      For the fellows based in Paris or nearby, a new Java User Group has been formed. I expect lots of good content from this user group thanks to some cross-pollination with the OSSGTP group and the industry knowledge of the two founders.The first meeting is planned for February 12th, check out the announcement here.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;For the fellows based in Paris or nearby, a new &lt;a href="http://www.parisjug.org/"&gt;Java User Group&lt;/a&gt; has been formed. I expect lots of good content from this user group thanks to some cross-pollination with the &lt;a href="http://www.ossgtp.org"&gt;OSSGTP&lt;/a&gt; group and the industry knowledge of the two founders.&lt;br /&gt;The first meeting is planned for February 12th, check out the announcement &lt;a href="http://www.parisjug.org/communication/inauguration.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2008/01/29/paris-jug/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/11/14/candid-10000-feet-thoughts-about-android/</id>
    <title>Candid 10,000 feet thoughts about Android</title>
    <updated>2007-11-14T00:00:00Z</updated>
    <published>2007-11-14T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/7yf_hQOBjSA/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Android is the new mobile platform developed by Google. They released the SDK yesterday. Basically a Linux kernel, a mobile optimized virtual machine running Java, and a set of API to play with the phone.First of all, the usual disclaimer. I am not a mobile developer, I am not much of a UI developer, but I am a Java developer and mobile consumer. Anyway, I'll give you some of my thoughts.Android is yet another platform. We already had Symbian, Palm OS, Windows Mobile, Java ME, Mac OS X, you name it. So yet another platform to support when writing a...
    </summary>
    <content type="html">
      &lt;a href="http://www.openhandsetalliance.com/android_overview.html"&gt;Android&lt;/a&gt; is the new mobile platform developed by Google. They released the &lt;a href="http://code.google.com/android/"&gt;SDK&lt;/a&gt; yesterday. Basically a Linux kernel, a mobile optimized virtual machine running Java, and a set of API to play with the phone.&lt;br /&gt;&lt;br /&gt;First of all, the usual disclaimer. I am not a mobile developer, I am not much of a UI developer, but I am a Java developer and mobile consumer. Anyway, I'll give you some of my thoughts.&lt;br /&gt;&lt;br /&gt;Android is yet another platform. We already had Symbian, Palm OS, Windows Mobile, Java ME, Mac OS X, you name it. So yet another platform to support when writing a mobile app, year!&lt;br /&gt;&lt;br /&gt;Sounds pretty bad for Sun and Java ME. I don't know the specific deal that Sun did with Google for embedding the Java technology into Android but I hope it's a good one for Sun because Java ME will suffer from the Android platform:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;it's "Java" enough for people to think twice before writing a Java ME app&lt;/li&gt;&lt;li&gt;it's not Java ME, it's not Java SE, it's a subset of Java SE, so practically a different platform to target&lt;/li&gt;&lt;li&gt;it's not a Java VM, so no need to pay any IP-related royalties to Sun&lt;br /&gt;&lt;/li&gt;&lt;li&gt;it's not the Sun's Java ME virtual machine, so no need to pay Sun some license fee&lt;/li&gt;&lt;/ul&gt;Last grief. From the &lt;a href="http://www.youtube.com/watch?v=1FJHYqE0RDg"&gt;live demo&lt;/a&gt; you can watch on Youtube (especially minute 3:32), they have a long way to go before having a UI as responsive as the iPhone at least in the screen touch area. Plus they probably don't have multi touch events yet ;p&lt;br /&gt;&lt;br /&gt;That being said, it seems to be a smart move from Google in three ways:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;it's a free platform for any mobile constructor (quite appealing)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the notion of &lt;a href="http://code.google.com/android/intro/anatomy.html"&gt;intent&lt;/a&gt; allows the user to replace one application with another in a very sleek way (sort of the loose coupling dream made true), making Android potentially an open platform even for the user&lt;br /&gt;&lt;/li&gt;&lt;li&gt;they leverage all the Java developer base&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Plus you can define your UI declaratively (XML), that's a smart move too.&lt;br /&gt;&lt;br /&gt;So Android is a very open platform, but don't forget one thing: it's so open that your phone carrier can lock it down as much as it wants :)&lt;br /&gt;&lt;br /&gt;As an iPhone user, I'm relieved a bit, my investment is worthwhile.
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/11/14/candid-10000-feet-thoughts-about-android/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/10/11/welcome-to-g2one/</id>
    <title>Welcome to G2One</title>
    <updated>2007-10-11T00:00:00Z</updated>
    <published>2007-10-11T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/fdqNQCxNr48/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Yesterday was the official public birth of G2One, a new company dedicated to Groovy and Grails training, consulting and support. I am happy to see Guillaume (Groovy lead) and Graeme (Grails lead) jumping into the Professional OpenSource bandwagon. Good luck to you guys, it is as stressful as exciting :)Speaking of it, I will be speaking Wednesday 17th to the Grails eXchange.One talk about Hibernate in general and what is cooking up for the next releases and another one about Hibernate Search (hopefully I will get my demo ported on Grails :) )
      ...
    </summary>
    <content type="html">
      &lt;p&gt;Yesterday was the official public birth of &lt;a href="http://www.g2one.com/"&gt;G2One&lt;/a&gt;, a new company dedicated to &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; and &lt;a href="http://grails.codehaus.org/"&gt;Grails&lt;/a&gt; training, consulting and support. I am happy to see &lt;a href="http://glaforge.free.fr/weblog/index.php?itemid=223"&gt;Guillaume&lt;/a&gt; (Groovy lead) and &lt;a href="http://graemerocher.blogspot.com/"&gt;Graeme&lt;/a&gt; (Grails lead) jumping into the &lt;a href="http://www.jboss.org/company/pos"&gt;Professional OpenSource&lt;/a&gt; bandwagon. Good luck to you guys, it is as stressful as exciting :)&lt;br /&gt;&lt;br /&gt;Speaking of it, I will be speaking Wednesday 17th to the Grails eXchange.&lt;br /&gt;&lt;a alt="grails,groovy,java ee, grails exchange" href="http://www.grails-exchange.com/pcd/1001" title="Emmanuel Bernard at Grails eXchange 2007"&gt;&lt;img vspace="5" align="middle" src="http://www.grails-exchange.com/custom/images/Grails-exchange-im-speaking-@-280-84.jpg" alt="groovy, grails, java ee, grails exchange" border="0" title="Emmanuel Bernard at Grails eXchange 2007" hspace="5" /&gt;&lt;/a&gt;&lt;br /&gt;One talk about Hibernate in general and what is cooking up for the next releases and another one about &lt;a href="http://search.hibernate.org/"&gt;Hibernate Search&lt;/a&gt; (hopefully I will get my demo ported on Grails :) )&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/10/11/welcome-to-g2one/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/09/04/release-candidate-for-hibernate-search-3-0-0/</id>
    <title>Release Candidate for Hibernate Search 3.0.0</title>
    <updated>2007-09-04T00:00:00Z</updated>
    <published>2007-09-04T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/mHd3apxk2RA/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Release Candidate for Hibernate Search 3.0.0Hibernate Search 3.0.0.CR1 is now out. This release is mainly the last bits of new features and polishing before the final version. The next cycle will be dedicated to bug fixes (of any bug that pops up), as well as test suite and documentation improvements.Thanks to Hardy for the new getting started section (this should ease the path for newcomers), and to John for hammering the last features we wanted in the GA version.The next version should be the GA release unless some complex bugs are discovered.Check the changelogs for a detailed change list.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;Release Candidate for Hibernate Search 3.0.0&lt;br /&gt;&lt;br /&gt;Hibernate Search 3.0.0.CR1 is now out. This release is mainly the last bits of new features and polishing before the final version. The next cycle will be dedicated to bug fixes (of any bug that pops up), as well as test suite and documentation improvements.&lt;br /&gt;&lt;br /&gt;Thanks to Hardy for the new getting started section (this should ease the path for newcomers), and to John for hammering the last features we wanted in the GA version.&lt;br /&gt;&lt;br /&gt;The next version should be the GA release unless some complex bugs are discovered.&lt;br /&gt;&lt;br /&gt;Check the &lt;a href="http://opensource.atlassian.com/projects/hibernate/browse/HSEARCH?report=com.atlassian.jira.plugin.system.project:changelog-panel"&gt;changelogs&lt;/a&gt; for a detailed change list.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/09/04/release-candidate-for-hibernate-search-3-0-0/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/08/07/podcast-about-hibernate-shards/</id>
    <title>Podcast about Hibernate Shards</title>
    <updated>2007-08-07T00:00:00Z</updated>
    <published>2007-08-07T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/EDk1dIM-IXU/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Max Ross and Maulik Shah from the Hibernate Shards team at Google got interviewed by the Google Developer Podcast.It's a nice and easy access 30 mins introduction of Hibernate Shards: how does it work, where does it come from, what are Hibernate Shards do's and don'ts, what's the secret plan to take over the world... Insightful. One of the cool stuffs they added in the latest beta is support for Hibernate Annotations.If you want to know what shards is all about or if your DB starts to feel the heat, go get your headset.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;Max Ross and Maulik Shah from the &lt;a href="http://shards.hibernate.org/"&gt;Hibernate Shards&lt;/a&gt; team at Google got interviewed by the &lt;a href="http://google-code-updates.blogspot.com/2007/08/google-developer-podcast-episode-six.html"&gt;Google Developer Podcast&lt;/a&gt;.&lt;br /&gt;It's a nice and easy access 30 mins introduction of Hibernate Shards: how does it work, where does it come from, what are Hibernate Shards do's and don'ts, what's the secret plan to take over the world... Insightful. One of the cool stuffs they added in the latest beta is support for Hibernate Annotations.&lt;br /&gt;If you want to know what shards is all about or if your DB starts to feel the heat, go get your headset.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/08/07/podcast-about-hibernate-shards/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/08/01/innovation-in-the-log-space-yawn/</id>
    <title>Innovation in the Log space, yawn...</title>
    <updated>2007-08-01T00:00:00Z</updated>
    <published>2007-08-01T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/nxWUlekCOZ4/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Steve and I had a discussion yesterday about loggers. I know what you're thinking: hasn't log been a solved problem for years now? Plus it's boring ;)That's why usually, when a discussion starts on the subject, I tend to carefully not listen. But because it's Steve, and because he has some specific requirement for the next Hibernate Core version, I decided to ignore my own rule.It turned out to be much more interesting than what I expected. Here are some news for people, like me, that stopped listening to the log crowd when the rule was use log4j and when...
    </summary>
    <content type="html">
      &lt;p&gt;Steve and I had a discussion yesterday about loggers. I know what you're thinking: hasn't log been a solved problem for years now? Plus it's boring ;)&lt;br /&gt;That's why usually, when a discussion starts on the subject, I tend to carefully not listen. But because it's Steve, and because he has some specific requirement for the next Hibernate Core version, I decided to ignore my own rule.&lt;br /&gt;&lt;br /&gt;It turned out to be much more interesting than what I expected. Here are some news for people, like me, that stopped listening to the log crowd when the rule was use log4j and when you can't use commons-logging.&lt;br /&gt;&lt;br /&gt;I was pleasantly surprised by &lt;a href="http://slf4j.org/"&gt;slf4j&lt;/a&gt;. I know, it's yet another facade and the name is awful. But this project has 2 features that really caught my attention.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Parameterized log&lt;/span&gt;&lt;br /&gt;Isn't it very annoying to have to do&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;if ( log.isDebugEnabled() ) {&lt;br /&gt;    log.debug("My dummy " + object1 + " and expensive " + object2  + " concatenation");&lt;br /&gt;}&lt;/blockquote&gt;&lt;/pre&gt;&lt;br /&gt;because the object's toString() method are expensive?&lt;br /&gt;&lt;br /&gt;slf4j solves that by using parameterized logs&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;log.debug("My dummy {} and expensive {} concatenation", object1, object2);&lt;/blockquote&gt;&lt;/pre&gt;&lt;br /&gt;Very elegant and just as efficient as the previous form. Now because slf4j supports JDK 1.3, the API cannot use varargs, which means that for 3 or more parameters you will have to write&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;log.debug("My dummy {} and expensive {} concatenation {}", new Object[] { object1, object2, object 3 });&lt;/blockquote&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;instead of the much more elegant&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;log.debug("My dummy {} and expensive {} concatenation {}", object1, object2, object3);&lt;/blockquote&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Damn slow movers! I guess most of the time you have 1 or 2 arguments so the pain should be minimal, or you could write you own facade, sigh&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Static binding&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once I understood what it meant, I liked it. Basically to switch from one underlying logger to another, you will replace slf4j-mylogger1.jar by slf4j-mylogger2.jar: the slf4j engine is statically bound to an implementation.&lt;br /&gt;OMG! This means I cannot change my logger implementation by hot deploying a config file! Oh, wait a minute, it's useless anyway.&lt;br /&gt;The good side is that classloader hells are behind us.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Ultimate Uber Cool solution&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The ultimate solution is actually what Gavin came up with in Seam. So instead of doing&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;private static final Log log = LogFactory.getLog(CreateOrderAction.class);&lt;br /&gt;       &lt;br /&gt;public Order createOrder(User user, Product product, int quantity) {&lt;br /&gt;    if ( log.isDebugEnabled() ) {&lt;br /&gt;        log.debug("Creating new order for user: " + user.username() +&lt;br /&gt;            " product: " + product.name()&lt;br /&gt;            + " quantity: " + quantity);&lt;br /&gt;    }&lt;br /&gt;    return new Order(user, product, quantity);&lt;br /&gt;}&lt;/blockquote&gt;&lt;/pre&gt;&lt;br /&gt;you end up with&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;@Logger private Log log;&lt;br /&gt;       &lt;br /&gt;public Order createOrder(User user, Product product, int quantity) {&lt;br /&gt;    log.debug("Creating new order for user: #{user.username} product: #{product.name} quantity: #0", quantity);&lt;br /&gt;    return new Order(user, product, quantity);&lt;br /&gt;}&lt;/blockquote&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Notice the parameterized logs, the log injection (yes the framework is smart enough to guess the category, doh!), and the contextual parameters injection.&lt;br /&gt;&lt;br /&gt;But such solution is not accessible to library developers until someone decides to push that into the JDK. &lt;br /&gt;OK I'm done for logs for another 5 years time :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/08/01/innovation-in-the-log-space-yawn/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/06/22/hibernate-at-jazoon07/</id>
    <title>Hibernate at Jazoon'07</title>
    <updated>2007-06-22T00:00:00Z</updated>
    <published>2007-06-22T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/1XMhSxiugmU/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I will be at Jazoon (Zurich) to talk about Hibernate Search on Tuesday. I'll hang around Monday and Tuesday, so feel free to pass by the JBoss booth for a chat.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;I will be at &lt;a href="http://jazoon.com/"&gt;Jazoon&lt;/a&gt; (Zurich) to talk about &lt;a href="http://jazoon.com/en/conference/presentationdetails.html?type=sid&amp;amp;detail=825"&gt;Hibernate Search&lt;/a&gt; on Tuesday. I'll hang around Monday and Tuesday, so feel free to pass by the JBoss booth for a chat.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/06/22/hibernate-at-jazoon07/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/06/15/hibernate-search-cool-but-is-it-the-right-approach-year-baby/</id>
    <title>Hibernate Search - cool, but is it the right approach? Year baby!</title>
    <updated>2007-06-15T00:00:00Z</updated>
    <published>2007-06-15T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/RNrweDygUU8/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Sanjiv Jivan wrote a blog entry questioning the "point" of Hibernate Search. He missed some critical steps in his argumentation, that I am willing to correct. I started to answer on his blog, but the answer being fairly long, I opted for a blog entry.I think Sanjiv failed to understand which population Hibernate Search is targeting.Hibernate Search is about ORM. If you don't use Hibernate, if you don't use JPA, forget about Hibernate Search, it's not for you.His main point is, why use Hibernate Search instead of a straight Lucene + Database (I'm assuming JDBC) solution? Five years before he...
    </summary>
    <content type="html">
      &lt;p&gt;Sanjiv Jivan wrote a &lt;a href="http://jroller.com/page/sjivan?entry=hibernate_search_cool_but_is"&gt;blog entry&lt;/a&gt; questioning the "point" of Hibernate Search. He missed some critical steps in his argumentation, that I am willing to correct. I started to answer on his blog, but the answer being fairly long, I opted for a blog entry.&lt;br /&gt;&lt;br /&gt;I think Sanjiv failed to understand which population Hibernate Search is targeting.&lt;br /&gt;Hibernate Search is about ORM. If you don't use Hibernate, if you don't use JPA, forget about Hibernate Search, it's not for you.&lt;br /&gt;&lt;br /&gt;His main point is, &lt;span style="font-style: italic;"&gt;why use Hibernate Search instead of a straight Lucene + Database (I'm assuming JDBC) solution?&lt;/span&gt; Five years before he could have asked, &lt;span style="font-style: italic;"&gt;why use an ORM rather than a straight JDBC access?&lt;/span&gt; Because it does for you and optimize 90% of the job and let you focus on the 10% that is hard.&lt;br /&gt;I won't explain why an ORM is usually (but not always) a good approach (everybody got that nowadays), so let's focus on a different question: considering that Hibernate is used in a given application, should we go for plain Lucene and JDBC layer as Sanjiv suggests or should we go for Hibernate Search? Should we go for 2 different set of APIs / programmatic model and model representation, or should we go for one unified model?&lt;br /&gt;&lt;br /&gt;Let's see each of Sanjiv's concerns one at a time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Why Hibernate Search rather than plain Lucene and JDBC?&lt;/span&gt;&lt;br /&gt;Out of the box, setting up a plain Lucene and JDBC solution requires to write the bridge. Lucene has it's own world, the DB an other one. Your code has to bind them together (write the optimized JDBC routine + optimized Lucene index routine). It can be long, painful and buggy.&lt;br /&gt;I doubt Sanjiv had to do it before, he would not talk like that :) Hibernate Search does the binding for you in your Hibernate backed application.&lt;br /&gt;People are attracted by Hibernate Search because it lowers the barrier of entry to Lucene in a project by a great deal. This opens the Search capabilities to a lot of applications that would not  have considered it with only plain Lucene in their hands.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Hibernate (Search) does not play well with massive indexing&lt;/span&gt;&lt;br /&gt;Sanjiv claims that the initial indexing (or reindexing) is slow (he hasn't tried actually) and memory consuming.&lt;br /&gt;Have a second look at the Hibernate Search reference documentation, the massive indexing procedure explicitly helps you to control the amount of memory spent.&lt;br /&gt;In Lucene, one good rule of thumb is use as much memory as possible to minimize IO access. So yes, the more memory you'll spend the more efficient your hibernate Search massive indexing will be. You have to think about the global system, not only a subpart.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Event based indexing should not be used&lt;/span&gt;&lt;br /&gt;Next Sanjiv tries to show that the event based indexing is wrong and that one should always use batch indexing. The honest answer is it depends.&lt;br /&gt;Hibernate Search does not constraint to index things per transaction (it's a pluggable strategy), and I never said that indexing &lt;span style="font-weight: bold;"&gt;at&lt;/span&gt; commit time was important. &lt;span style="font-weight: bold;"&gt;Not&lt;/span&gt; indexing &lt;span style="font-weight: bold;"&gt;before commit&lt;/span&gt; time is critical (think about rollbacks).&lt;br /&gt;As a matter of fact, the clustered mode (JMS mode) explicitly does not index at commit time, it delegates the work for later (and to someone else). The overhead of sending a message for later indexing (I'm not speaking of actual Lucene operations here) is minimal.&lt;br /&gt;What do we gain? The usual on the fly vs batch mode benefits: no batch window, more homogeneous CPU consumption on systems, not having to take care of a batch job. I don't know about you, but the less batch jobs I have in my systems, the better I sleep.&lt;br /&gt;By the way, is batch mode supported with Hibernate Search? Absolutely. Who likes to avoid batch jobs when possible, most of the developers and ops guys I  have met. When you need to use them, do it ; when you don't stop the masochism.&lt;br /&gt;&lt;br /&gt;To justify that batch mode should rules, Sanjiv used the data mining and star / snow schema as an example. These are a very specific kind of applications where ORM are almost never used. They could be, with some adjustments tot he ORM, but that's another story, maybe my next project :) Anyway, this is out of the scope of Hibernate Search, see the very first point.&lt;br /&gt;&lt;br /&gt;I agree that JMS is highly over engineered and should be simplified in Java EE6, but come on, setting up a Queue is only a few clicks in a graphical console... it's not too bad. Don't tell me JMS is too hard (Hibernate Search does the JMS calls by the way, not you).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Hibernate Search does not support third party modifications in the database&lt;/span&gt;&lt;br /&gt;It's actually a fairly known problem to people who use 2nd level cache in ORMs, has 2nd level cache been banned from our toolbox? clearly no. But once again Hibernate Search works fine in a batch mode. So this should solve Sanjiv's concerns.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Annotation based indexing definition is not flexible&lt;/span&gt;&lt;br /&gt;Is that an inflexible approach? How practical would it be to change them on the fly? Changing which elements are indexed, or how would require to reindex the whole set of data. Quite possible, but definitely something that is not so useful on the fly. As for boosting, I do set my field boosting at query time, I find it more flexible than index time boosting, so I never had the issue Sanjiv is describing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Why using Hibernate Search query API?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Why not using straight Lucene queries an APIs, it's all about text in the end?&lt;/span&gt;&lt;br /&gt;The nice thing about the Hibernate Search is that it's really easy to replace a HQL query by a Lucene query: just replace the Query object and you're done, the rest of the code remains unchanged. Because is that simple, people tend to use Hibernate Search and Lucene queries in a more widespread number of usecases, and not simply for a Yahoo-like search screen (we always talk about Google, let's switch for a while ;) ):&lt;br /&gt;- save some DB CPU cycles and distribute it to cheaper machines&lt;br /&gt;- efficient multi word queries&lt;br /&gt;- wildcards&lt;br /&gt;- etc&lt;br /&gt;Here is a use case that is clearly not about plain text:&lt;br /&gt;"increase visibility of all books where 'Paris Hilton' is mentioned and double the increase if 'prison' is also present"&lt;br /&gt;&lt;br /&gt;Hibernate Search queries can return either managed objects or projected properties (retrieving only a subset of the data). When to use what?&lt;br /&gt;Sometimes, you use property projections rather than object retrieval in HQL queries either for ease of use or performance reasons, It's more convinient to play with the objects, but you pick up the best tool for the job. I would say the same kind of rules can be applied with Hibernate Search between a regular query and a field projection.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Hibernate Search not suitable for high volume websites&lt;/span&gt;&lt;br /&gt;I love this one. I did design high volume websites backed by Lucene. I know what you gain, I know what you lose. Hibernate Search is full of best practices. The Hibernate Search clustering support is a good example of architecture that an architect could mimic to scale with Lucene (up and out). But it's not the only one, it depends on the use case, that's why Hibernate Search does not impose an architecture, that's why I prefer libraries over off-the-shelves products.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;I would recommend this off-the-shelves solution?&lt;/span&gt;&lt;br /&gt;DBSight or Solr (which I know better) are interesting solutions indeed, but not for the same kind of projects, or at least not for the same integration strategy. We are comparing a library versus a black box. BTW DBSight has a 3-minutes install demo. I could not beat them, it took me 15 mins on stage at JavaOne ( but I walk and talk a lot :) )&lt;br /&gt;I have never been a big fan of black boxes nicely integrated in my IT system, but if I had to choose such a solution I would also give the Google Search Appliance a try, the Google Mini is fairly cheap.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anyway, Hibernate Search has been developed with practical solutions for practical problems, not theoretical considerations. Giving it a shot is the only way to judge.&lt;br /&gt;Damn long post, sorry about that :(&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/06/15/hibernate-search-cool-but-is-it-the-right-approach-year-baby/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/06/12/got-a-macbook-pro-better-consider-this-upgrade/</id>
    <title>Got a MacBook (Pro), better consider this upgrade</title>
    <updated>2007-06-12T00:00:00Z</updated>
    <published>2007-06-12T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/lffbh-wyHvg/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Last night my battery and my MacBook Pro decided not to talk to each other anymore. The battery was full but as soon as I unplugged the AC, the laptop shut down immediately, fairly useless ;-)Have a look at Apple's support case MacBook Battery Update.This patch apparently prevent the synchronization failure to happen, saving you a WFT moment and few hours of downtime.I have been fairly impressed by the Genius bar support. It took me 1h to figure it out the problem in the morning (The Apple support website roughly described my problem), I made an appointment right away, another...
    </summary>
    <content type="html">
      &lt;p&gt;Last night my battery and my MacBook Pro decided not to talk to each other anymore. The battery was full but as soon as I unplugged the AC, the laptop shut down immediately, fairly useless ;-)&lt;br /&gt;&lt;br /&gt;Have a look at Apple's support case &lt;a href="http://www.apple.com/support/macbook_macbookpro/batteryupdate/"&gt;MacBook Battery Update&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.apple.com/support/downloads/batteryupdate12.html"&gt;This patch&lt;/a&gt; apparently prevent the synchronization failure to happen, saving you a WFT moment and few hours of downtime.&lt;br /&gt;&lt;br /&gt;I have been fairly impressed by the Genius bar support. It took me 1h to figure it out the problem in the morning (The Apple support website roughly described my problem), I made an appointment right away, another hour later I had my new battery operational (travel time included).&lt;br /&gt;&lt;br /&gt;At least, they don't argue with you and don't ask if you know how to turn the power on. It's a big plus compared to other support organizations.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/06/12/got-a-macbook-pro-better-consider-this-upgrade/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/06/06/hibernate-search-freshly-baked-features/</id>
    <title>Hibernate Search freshly baked features</title>
    <updated>2007-06-06T00:00:00Z</updated>
    <published>2007-06-06T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/aZ81m5RHKHs/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I had to release Hibernate Search Beta3 early after we discovered a fairly severe bug in Beta2. But I had time to inject some new features. After those introduced in Beta2, that a fairly good week :)batch size limit on object indexingIf you don't pay attention when initially indexing (or reindexing) your data, you may face out of memory exceptions. The old solution was to execute indexing in several smaller transactions, but the code ended up being fairly complex. Here is the new solution:hibernate.search.worker.batch_size=5000int batchSize=5000;//scroll will load objects as neededScrollableResults results = fullTextSession.createCriteria( Email.class )    .scroll( ScrollMode.FORWARD_ONLY...
    </summary>
    <content type="html">
      &lt;p&gt;I had to release &lt;a href="http://search.hibernate.org/"&gt;Hibernate Search&lt;/a&gt; Beta3 early after we discovered a fairly severe bug in Beta2. But I had time to inject some new features. After &lt;a href="http://blog.hibernate.org/cgi-bin/blosxom.cgi/2007/05/31#HSearch-3.0.0.Beta2"&gt;those introduced in Beta2&lt;/a&gt;, that a fairly good week :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;batch size limit on object &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;indexing&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;If you don't pay attention when initially indexing (or reindexing) your data, you may face out of memory exceptions. The old solution was to execute indexing in several smaller transactions, but the code ended up being fairly complex. Here is the new solution:&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;hibernate.search.worker.batch_size=5000&lt;br /&gt;&lt;br /&gt;int batchSize=5000;&lt;br /&gt;//scroll will load objects as needed&lt;br /&gt;ScrollableResults results = fullTextSession.createCriteria( Email.class )&lt;br /&gt;    .scroll( ScrollMode.FORWARD_ONLY );&lt;br /&gt;int index = 0;&lt;br /&gt;while( results.next() ) {&lt;br /&gt;    index++;&lt;br /&gt;    fullTextSession.index( results.get(0) ); //index each element&lt;br /&gt;    if (index % batchSize == 0) s.clear(); //clear every batchSize&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;/pre&gt;wrap that into one transaction and you are good to go.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Native Lucene&lt;/span&gt;&lt;br /&gt;The APIs were never officially published (until beta3), but Hibernate Search lets you fall back to native Lucene when needed. All the needed APIs are held by SearchFactory.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;DirectoryProvider provider = searchFactory.getDirectoryProvider(Order.class);&lt;br /&gt;org.apache.lucene.store.Directory directory = provider.getDirectory();&lt;/blockquote&gt;&lt;/pre&gt;This one is the brute force and gives you access to the Lucene Directory containing Orders. A smarter way, if you intend to execute a search query, is to use the ReaderProvider&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;DirectoryProvider clientProvider = searchFactory.getDirectoryProvider(Client.class);&lt;br /&gt;IndexReader reader = searchFactory.getReaderProvider().openReader(clientProvider);&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt;   //do read-only operations on the reader&lt;br /&gt;}&lt;br /&gt;finally {&lt;br /&gt;   readerProvider.closeReader(reader);&lt;br /&gt;}&lt;/blockquote&gt;&lt;/pre&gt;Smarter because you share the same IndexReaders as Hibernate Search, hence avoid the unnecessary IndexReader opening and warm up.&lt;br /&gt;&lt;br /&gt;Finally you can optimize a Lucene Index (roughly a defragmentation)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;blockquote&gt;SearchFactory searchFactory = fullTextSession.getSearchFactory();&lt;br /&gt;searchFactory.optimize(Order.class);&lt;br /&gt;//or searchFactory.optimize();&lt;/blockquote&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/06/06/hibernate-search-freshly-baked-features/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/06/06/from-a-bug-blooms-a-thousand-features/</id>
    <title>From a Bug blooms a thousand Features</title>
    <updated>2007-06-06T00:00:00Z</updated>
    <published>2007-06-06T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/IX1UFCCd7bI/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      When a severe bug hits a product, you have to fix and release quickly (at least I feel I have to). But, especially in the beta phase, it's fairly humiliating to release with one single ticket resolution.Call it pride, pair pressure, ego, unwillingness to face reality, teenager knee jerk, I just can't release a beta with one single lonely closed ticket.This is what happened on Hibernate Search. Beta2 introduced a severe bug in object retrievals. So I ended up coding a few new features, fixing a few additional annoyances to hide the obvious.That's one of the things I like in...
    </summary>
    <content type="html">
      &lt;p&gt;When a severe bug hits a product, you have to fix and release quickly (at least I feel I have to). But, especially in the beta phase, it's fairly humiliating to release with one single ticket resolution.&lt;br /&gt;&lt;br /&gt;Call it pride, pair pressure, ego, unwillingness to face reality, teenager knee jerk, I just can't release a beta with one single lonely closed ticket.&lt;br /&gt;&lt;br /&gt;This is what happened on Hibernate Search. Beta2 introduced a severe bug in object retrievals. So I ended up coding &lt;a href="http://blog.emmanuelbernard.com/2007/06/hibernate-search-freshly-baked-features.html#links"&gt;a few new features&lt;/a&gt;, fixing a few additional annoyances to hide the obvious.&lt;br /&gt;&lt;br /&gt;That's one of the things I like in the Software as a Service model, transparent bug fixing, but that's another story.&lt;br /&gt;&lt;br /&gt;Obviously, such aggressive release cycles can only work as long as a Product Manager don't look over your shoulder.&lt;br /&gt;&lt;br /&gt;Who said bugs were a bad thing? ;-)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/06/06/from-a-bug-blooms-a-thousand-features/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/05/22/lucene-feedback-from-atlassian-jira-and-confluence/</id>
    <title>Lucene feedback from Atlassian JIRA and Confluence</title>
    <updated>2007-05-22T00:00:00Z</updated>
    <published>2007-05-22T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/2cMu99KnyNk/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Mike Cannon-Brookes from Atlassian has posted (some moons ago) two interesting presentations related to Lucene and Atlassian's feedbacks from Confluence and JIRA.My favorite is the first one: Lucene: Generic Data Indexing. It's a nice introduction to the benefits of Full Text search engines, as well as the gotchas you will face.I found their use of FilterQuery as a cross-cutting concern implementation for security fairly interesting.The first presentation also quickly address some of the indexing strategies (synchronous / asynchronous) depending on the product requirements. Mike goes a bit deeper in the second one by describing some clustering solutions and the one...
    </summary>
    <content type="html">
      &lt;p&gt;Mike Cannon-Brookes from Atlassian has posted (some moons ago) &lt;a href="http://blogs.atlassian.com/rebelutionary/archives/2007/04/my_serverside_java_symposium_2007_presen.html"&gt;two interesting presentations&lt;/a&gt; related to Lucene and Atlassian's feedbacks from Confluence and JIRA.&lt;br /&gt;&lt;br /&gt;My favorite is the first one: &lt;span style="font-style: italic;"&gt;Lucene: Generic Data Indexing&lt;/span&gt;. It's a nice introduction to the benefits of Full Text search engines, as well as the gotchas you will face.&lt;br /&gt;I found their use of FilterQuery as a cross-cutting concern implementation for security fairly interesting.&lt;br /&gt;&lt;br /&gt;The first presentation also quickly address some of the indexing strategies (synchronous / asynchronous) depending on the product requirements. Mike goes a bit deeper in the second one by describing some clustering solutions and the one they choose.&lt;br /&gt;&lt;br /&gt;JIRA has gone very far in its use of Lucene, I am not sure I would have gone that far, but that's definitively a very interesting extreme use case, and very successful :)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/05/22/lucene-feedback-from-atlassian-jira-and-confluence/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/05/16/demo-of-jboss-seam-dvd-store-powered-by-hibernate-search/</id>
    <title>Demo of JBoss Seam DVD Store powered by Hibernate Search</title>
    <updated>2007-05-16T00:00:00Z</updated>
    <published>2007-05-16T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/Re74ITf3bak/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Many asked me if the DVD Store demo powered by Hibernate Search that I ran at JavaOne was available online.The answer is not yet, but it will. My plan is to package it nicely and release it when the beta 2 of Hibernate Search is out.This will hopefully happen fairly soon. JavaOne being behind us, I can focus back on the code base.I had some very interesting discussions with some of you about Lucene and the features you need, it's good to see the community growing around the project.
      ...
    </summary>
    <content type="html">
      &lt;p&gt;Many asked me if the DVD Store demo powered by Hibernate Search that I ran at JavaOne was available online.&lt;br /&gt;The answer is not yet, but it will. My plan is to package it nicely and release it when the beta 2 of Hibernate Search is out.&lt;br /&gt;This will hopefully happen fairly soon. JavaOne being behind us, I can focus back on the code base.&lt;br /&gt;&lt;br /&gt;I had some very interesting discussions with some of you about Lucene and the features you need, it's good to see the community growing around the project.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/05/16/demo-of-jboss-seam-dvd-store-powered-by-hibernate-search/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/05/09/hibernate-search-and-jsr-303-at-javaone/</id>
    <title>Hibernate Search and JSR-303 at JavaOne</title>
    <updated>2007-05-09T00:00:00Z</updated>
    <published>2007-05-09T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/v2IQc_WOUZI/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I will be presenting Hibernate Search at JavaOne.I will be demoing a live migration of the JBoss Seam DVD Store application from a classic SQL based search engine onto Hibernate Search with Google-like search capabilities. If your user pressures you for a decent and useful search feature or your DBA asks you not to kill the database perfs, you might want to take a look at it.It's Friday at 10h50:TS-4746 - Hibernate Search: Googling Your Java Technology-Based Persistent Domain ModelI will also give an update on JSR-303 Bean Validation (and Hibernate Validator) about the goals, the expectations and where it...
    </summary>
    <content type="html">
      &lt;p&gt;I will be presenting &lt;a href="http://search.hibernate.org"&gt;Hibernate Search&lt;/a&gt; at JavaOne.&lt;br /&gt;&lt;br /&gt;I will be demoing a live migration of the JBoss Seam DVD Store application from a classic SQL based search engine onto Hibernate Search with Google-like search capabilities. If your user pressures you for a decent and useful search feature or your DBA asks you not to kill the database perfs, you might want to take a look at it.&lt;br /&gt;&lt;br /&gt;It's Friday at 10h50:&lt;br /&gt;TS-4746 - Hibernate Search: Googling Your Java Technology-Based Persistent Domain Model&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I will also give an update on JSR-303 Bean Validation (and Hibernate Validator) about the goals, the expectations and where it fits in the Java ecosystem, with a demo too ;-)&lt;br /&gt;&lt;br /&gt;Friday again at 14h50 ( 2:50 PM in our local hosts language ;-) )&lt;br /&gt;TS-4112 - Declarative Programming: Tighten Enterprise JavaBeans (EJB) 3.0 and JSR 303 Beans Validation&lt;br /&gt;&lt;br /&gt;See you there&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/05/09/hibernate-search-and-jsr-303-at-javaone/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/04/22/hibernate-search-talk-at-jax-07/</id>
    <title>Hibernate Search talk at JAX '07</title>
    <updated>2007-04-22T00:00:00Z</updated>
    <published>2007-04-22T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/tCz0YHm6t98/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      One feature request for Hibernate Search has been surprisingly pretty popular: support for indexed embedded collections and hence correlated queries involving collections.This is no longer a request and is available in SVN :-)Imagine a Movie having a list of Actors, the following query is now possible:give me the movie talking about Central Intelligence Agency and having one of the Baldwins in the castingor in Lucene languagedescription:"Central Intelligence Agency" authors.name:BaldwinOf course the drawback is to potentially increase drastically the size of your index. So use it when the collection size is under control.I am going to talk about Hibernate Search at...
    </summary>
    <content type="html">
      &lt;p&gt;One feature &lt;a href="http://opensource.atlassian.com/projects/hibernate/browse/HSEARCH-40"&gt;request&lt;/a&gt; for Hibernate Search has been surprisingly pretty popular: support for indexed embedded collections and hence correlated queries involving collections.&lt;br /&gt;This is no longer a request and is available in SVN :-)&lt;br /&gt;&lt;br /&gt;Imagine a Movie having a list of Actors, the following query is now possible:&lt;br /&gt;&lt;blockquote&gt;give me the movie talking about Central Intelligence Agency and having one of the Baldwins in the casting&lt;br /&gt;&lt;/blockquote&gt;or in Lucene language&lt;br /&gt;&lt;blockquote&gt;description:"Central Intelligence Agency" authors.name:Baldwin&lt;/blockquote&gt;Of course the drawback is to potentially increase drastically the size of your index. So use it when the collection size is under control.&lt;br /&gt;&lt;br /&gt;I am going to talk about Hibernate Search at the &lt;a href="http://jax.de/konferenzen/jax07/index_eng.php"&gt;JAX 07&lt;/a&gt; conference in Wiesbaden on Tuesday. Let's have a beer if you are around.&lt;br /&gt;&lt;br /&gt;By the way, I think De Niro did a not so great job on this movie, too much is suggested (probably too many details too fast). I know that was the intend, but he went too far in my opinion.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/04/22/hibernate-search-talk-at-jax-07/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/03/26/licensing-and-trademark/</id>
    <title>Licensing and trademark</title>
    <updated>2007-03-26T00:00:00Z</updated>
    <published>2007-03-26T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/zNQzpXHU_9Y/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      There has been lots of turmoils last week on two not so related subjects. Let's clarify them a bit.LGPL rights and dutyLot's have been said about this license, and lot's of people out there don't understand the rights and duty of this license.GoalFrom the GNU LGPL Preambule:The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.The goal is to guaranty freedom (of speech) to...
    </summary>
    <content type="html">
      &lt;p&gt;There has been lots of turmoils last week on two not so related subjects. Let's clarify them a bit.&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;LGPL rights and duty&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lot's have been said about this license, and lot's of people out there don't understand the rights and duty of this license.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Goal&lt;/li&gt;&lt;/ul&gt;From the GNU LGPL Preambule:&lt;br /&gt;&lt;blockquote&gt;The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--&lt;span style="font-weight: bold;"&gt;to make sure the software is free for all its users&lt;/span&gt;.&lt;br /&gt;&lt;/blockquote&gt;The goal is to guaranty freedom (of speech) to he users of a given software.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Can I use a verbatim copy of a LGPL library in my software? What about my code license? What if I distribute my software?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;You can use a verbatim (unmodified) copy of an LGPL library in your code and distribute your application. Your application can use any license (commercial or open source), in other words your code does not fall into the LGPL license. The library remains LGPL of course.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Can I modify the library? What happens then?&lt;/li&gt;&lt;/ul&gt; You can modify the LGPL library, any modification has to be LGPL. If you distribute those modifications, you have to comply with the LGPL and distribute the modified source code as well. In other words, a user of yours will be able to see the code changes and do whatever it pleases him with it provided that he follows the LGPL rules.&lt;br /&gt;Your application (aside from those modifications) does not fall into the LGPL license.&lt;br /&gt;&lt;br /&gt;It is usually admitted (while not required), as a courtesy, to provide (all) your modifications to everybody (not only the third party you distribute your application to). It usually doesn't matter in the end, because any of your application users will be able to freely redistribute for free the modifications you made on the LGPL library. There is nothing you can do about it.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Goal (once again)&lt;/li&gt;&lt;/ul&gt; The goal is to be sure that any change to an LGPL library will remain LGPL, be contributed back to the community, and never be hidden in a closed source program.&lt;br /&gt;&lt;br /&gt;Check the &lt;a href="http://www.gnu.org/licenses/lgpl.html"&gt;LGPL license&lt;/a&gt; for more info.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Trademarks&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;A trademark includes          any word, name, symbol, or device, or any combination, used, or intended          to be used, in commerce to identify and distinguish the goods of one manufacturer          or seller from goods manufactured or sold by others, and to indicate the          source of the goods. In short, a trademark is a brand name.&lt;a href="http://www.uspto.gov/web/offices/tac/tmfaq.htm#DefineTrademark"&gt;[1]&lt;/a&gt;&lt;/blockquote&gt;A trademark does not prevent you from providing a service based on a given product. It restricts and organize, however, the way you can use a given (combination of) word.&lt;br /&gt;(Protection of) Trademarks is actually a fairly common practice, including in the Open Source world, to name a few&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Red Hat Inc and JBoss Inc (&lt;a href="http://www.redhat.com/about/companyprofile/trademark/"&gt;trademark information&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The Apache Software Foundation (&lt;a href="http://www.apache.org/foundation/licence-FAQ.html#Marks"&gt;trademark FAQ&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The Mozilla foundation (&lt;a href="http://www.mozilla.org/foundation/trademarks/policy.html"&gt;trademark policy&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;All of them, at one time or an other, have made sure their trademark is enforced.&lt;br /&gt;&lt;br /&gt;Why?&lt;br /&gt;For all of them, to protect the brand, to protect the message the brand is pushing.&lt;br /&gt;&lt;br /&gt;That is the reason why I changed the name Hibernate Lucene to &lt;a href="http://search.hibernate.org/"&gt;Hibernate Search&lt;/a&gt;, it violated the ASF trademark, so I went ahead and fixed it.&lt;br /&gt;&lt;br /&gt;To clarify the turmoil with Hibernate, please check the clarification by Mark Webbing. It's in the comments &lt;a href="http://bill.dudney.net/roller/bill/entry/1"&gt;here&lt;/a&gt; but I will reproduce it for clarity.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;I am writing to clarify the issues raised by the publication of Ms. Robertson's communication on behalf of Red Hat. First, the letter is not placed into the context of the situation it was addressing. That presents the opportunity for misinterpretation. At the same time, I would agree that the letter is less than precise in defining what has been done wrong and the corrective action that is required. Ultimately, that is my fault as the person in charge of trademark enforcement at Red Hat.&lt;br /&gt;&lt;br /&gt;Contrary to Gavin's statements above, you cannot offer HIBERNATE Training or JBOSS Training. This is an improper use of Red Hat trademarks in that the marks are being used (a) either as nouns or (b) to promote a good or service that is directly branded with Red Hat owned marks. What is permissable, and I am sure this is what Gavin meant, is that you are permitted to offer HIBERNATE(R) Object Relational Mapping Software Training or, as another example, JBoss(R) Application Server Training. Here the marks are being applied to the goods in a proper manner and it is clear that the training is being provided for that branded technology, not by the brand owner. As a further common courtesy, it would also be appropriate for those properly using the marks in this manner to make clear that they are not in anyway associated with Red Hat or its JBoss Division.&lt;br /&gt;&lt;br /&gt;With that clarification I hope I have resolved the confusion and/or discontent around this issue. More extensive information on the permitted uses of Red Hat marks can be found at http://www.redhat.com/about/companyprofile/trademark/&lt;br /&gt;&lt;br /&gt;I would also ask, as a courtesy to Ms. Robertson, that the party who posted her letter please indicate that they were the party posting the letter, not Ms. Robertson.&lt;br /&gt;&lt;br /&gt;My apologies for any confusion that has been caused.&lt;br /&gt;&lt;br /&gt;Mark Webbink&lt;br /&gt;Deputy General Counsel&lt;br /&gt;Red Hat, Inc.&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Sidenote&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Contrary to some claims, you don't have to have a @jboss.com address to contribute to JBoss projects (I mean commit access). All you have to do is being accepted by the community and the project lead (as any open source project), and sign a &lt;a href="http://labs.jboss.com/portal/con?noproject=true"&gt;contributor agreement&lt;/a&gt; (in a similar manner an ASF contributor agreement is signed). To name Hibernate, I can count at least twice as many active contributors not having a @jboss.com address than  having one  :-)&lt;br /&gt;&lt;br /&gt;By the way, I am not a lawyer, so take my words as is etc etc. My dog knows a dog who knows a lawyer, but I am not sure that qualifies me ;-)&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/03/26/licensing-and-trademark/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/03/08/google-guice-ioc-revisited/</id>
    <title>Google Guice: IoC revisited</title>
    <updated>2007-03-08T00:00:00Z</updated>
    <published>2007-03-08T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/6gnYVmwVpks/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      Google has made public his IoC container. It's all annotations based, no more strings, no more XML.Some key concepts:Avoid string based injection which are error prone and hard to refactor@Inject actually inject :-)@ImplementedBy(ServiceImpl.class). A service can have a default implementation, use by default when no wiring is explicit. The actual implementation is easily identified, including by your IDE...Injection through custom annotations (even parameterized): useful when you need to bind 2 services implementations and use one or the other. Also useful to bind constants: Guice allows you to bind a constant to an annotation.Scoping: injections are scoped, and you can create...
    </summary>
    <content type="html">
      &lt;p&gt;Google has made public his IoC container. It's all annotations based, no more strings, no more XML.&lt;br /&gt;&lt;br /&gt;Some key concepts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Avoid string based injection which are error prone and hard to refactor&lt;br /&gt;&lt;/li&gt;&lt;li&gt;@Inject actually inject :-)&lt;/li&gt;&lt;li&gt;@ImplementedBy(ServiceImpl.class). A service can have a default implementation, use by default when no wiring is explicit. The actual implementation is easily identified, including by your IDE...&lt;/li&gt;&lt;li&gt;Injection through custom annotations (even parameterized): useful when you need to bind 2 services implementations and use one or the other. Also useful to bind constants: Guice allows you to bind a constant to an annotation.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Scoping: injections are scoped, and you can create you own scope (transaction). Inner scopes can see outer scopes.&lt;/li&gt;&lt;li&gt;Because it's Bob Lee: Guice has integration with AOP Alliance is supported&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Here are some examples:&lt;br /&gt;Basic injection&lt;br /&gt;&lt;blockquote&gt;     public class Client {&lt;br /&gt;  private final Service service;&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;@Inject&lt;/span&gt;&lt;br /&gt;  public Client(Service service) {&lt;br /&gt; this.service = service;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void go() {&lt;br /&gt; service.go();&lt;br /&gt;}&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Default for autowiring&lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;@ImplementedBy(ServiceImpl.class)&lt;/span&gt;&lt;br /&gt;public interface Service {&lt;br /&gt; void go();&lt;br /&gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Custom annotations&lt;br /&gt;&lt;span style="font-family:Courier New;" /&gt;&lt;blockquote&gt;&lt;span style="font-family:Courier New;"&gt;bind(Service.class)&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;      .annotatedWith(Blue.class)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;br /&gt;  .to(BlueService.class);&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;br /&gt;&lt;/span&gt;     @Inject&lt;br /&gt;void injectService(&lt;span style="font-weight: bold;"&gt;@Blue&lt;/span&gt; Service     service) {&lt;br /&gt; ...&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;What I really like:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Annotation based, easy to read and concise&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Injection on methods (not only setters)&lt;/li&gt;&lt;li&gt;@ImplementedBy: Most services, they are implemented one and only one time.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I remember the old days of Pico vs Spring vs Avalon. I'm happy to see innovation flowing again in this field. Some took for granted that Spring was the only way, then come annotations. &lt;a href="http://labs.jboss.com/portal/jbossseam"&gt;JBoss Seam&lt;/a&gt; and its annotation based stateful injection / outjection, and now &lt;a href="http://code.google.com/p/google-guice/"&gt;Google Guice&lt;/a&gt;: both share some of the interesting concepts I described earlier. Component injection is revisited and it's good.&lt;br /&gt;&lt;br /&gt;Now remember, IoC is not application development, it's at best a part of it :-). To me, the programmation model with the biggest/homogeneous picture is JBoss Seam.&lt;/blockquote&gt;&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/03/08/google-guice-ioc-revisited/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/02/28/hibernate-seam-team-meetup-in-san-fransisco/</id>
    <title>Hibernate + Seam team meetup in San Fransisco</title>
    <updated>2007-02-28T00:00:00Z</updated>
    <published>2007-02-28T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/gIMbs_yFxKE/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      This is a pretty rare event, (almost) all the Hibernate + Seam team will be together in San Fransisco end of this week.We organize a meetup on Friday (March 2nd) at 7 PMLevende Lounge1710 Mission St. @ DuboceSan Francisco, CA 94103Phone: 415.864.5585http://www.levendesf.com/Please drop me an email (emmanuel # hibernate.org) if you intend to come to this event. There is usually a cover charge for this place on a Friday night, so we need to get people's names on the door list. 
      ...
    </summary>
    <content type="html">
      &lt;p&gt;This is a pretty rare event, (almost) all the Hibernate + Seam team will be together in San Fransisco end of this week.&lt;br /&gt;&lt;br /&gt;We organize a meetup on Friday (March 2nd) at 7 PM&lt;br /&gt;&lt;br /&gt;&lt;span class="postbody"&gt;Levende Lounge&lt;br /&gt;1710 Mission St. @ Duboce&lt;br /&gt;San Francisco, CA 94103&lt;br /&gt;Phone: 415.864.5585&lt;br /&gt;&lt;br /&gt;http://www.levendesf.com/&lt;br /&gt;&lt;br /&gt;Please drop me an email (emmanuel # hibernate.org) &lt;/span&gt;&lt;span class="postbody"&gt;if you intend to come to this event. There is usually a cover charge for this place on a Friday night, so we need to get people's names on the door list. &lt;/span&gt;&lt;span class="postbody" /&gt;&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/02/28/hibernate-seam-team-meetup-in-san-fransisco/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/02/06/svn-false-promises/</id>
    <title>SVN: false promises</title>
    <updated>2007-02-06T00:00:00Z</updated>
    <published>2007-02-06T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/V_VmQEmkc-k/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I've had to do a massive project refactoring. To be more specific, I had to split Hibernate Annotations in several pieces and make Hibernate Validator and Hibernate Search independent projects (stay tuned). Of course, I wanted to keep track of my changes history.Supposedly, SVN is greater than CVS in this area, it can keep track of object renaming and copying without loosing tracks.I've never had such troubles in a long time. A few tricks: - IntelliJ package renaming is great but don't try to do too much in one commit: nothing is more annoying than a cryptic version control error...
    </summary>
    <content type="html">
      &lt;p&gt;I've had to do a massive project refactoring. To be more specific, I had to split Hibernate Annotations in several pieces and make Hibernate Validator and Hibernate Search independent projects (stay tuned). Of course, I wanted to keep track of my changes history.&lt;br /&gt;Supposedly, SVN is greater than CVS in this area, it can keep track of object renaming and copying without loosing tracks.&lt;br /&gt;&lt;br /&gt;I've never had such troubles in a long time. A few tricks:&lt;br /&gt; - IntelliJ package renaming is great but don't try to do too much in one commit: nothing is more annoying than a cryptic version control error after a complex refactoring.&lt;br /&gt; - &lt;span style="font-family: courier new;"&gt;svn move&lt;/span&gt; of complex structure does not seems to work properly in local move: prefer using the &lt;span style="font-family: courier new;"&gt;svn move url1 url2&lt;/span&gt;. For the record, SVN ended up moving part of my tree without any complaints :-(&lt;br /&gt; - don't expect to update a directory and move/rename it, SVN will actually prevent you to do so (at least the complex one I had)&lt;br /&gt;&lt;br /&gt;So I ended up branching, committing my package renaming, doing server side &lt;span style="font-family: courier new;"&gt;svn move&lt;/span&gt; of my packages around the different projects. I wish I could have done that in an atomic way with no branching.&lt;br /&gt;&lt;br /&gt;I'm not a SVN expert, but I usually don't expect my tools to require a PhD in version control, and a driver license to use them. There are huge rooms for improvements here. Think users :-)&lt;br /&gt;&lt;br /&gt;For me SVN is not really better than CVS (except the local diff/revert).&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/02/06/svn-false-promises/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/01/24/groovy-annotations/</id>
    <title>Groovy Annotations</title>
    <updated>2007-01-24T00:00:00Z</updated>
    <published>2007-01-24T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/SmZBqz1am6c/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      I have been hammering (nicely) Guillaume for a long time now to get Annotations support in Groovy.Thanks to Alexandru Popescu, this is now an official work in progress, and one that progress well :-)I am thrilled by the possibilities to combine JavaEE (or any modern annotation based framework) and Groovy. If you wondered about the dynamic language you wanted to use, don't anymore.Like the Hibernate team when we worked on the Java Persistence certification, the Groovy team must have been very frustrated to focus on Groovy 1.0 and not being able to innovate as fast as they did. They are...
    </summary>
    <content type="html">
      &lt;p&gt;I have been hammering (nicely) Guillaume for a long time now to get Annotations support in Groovy.&lt;br /&gt;Thanks to Alexandru Popescu, this is now an official &lt;a href="http://www.nabble.com/Initial-annotation-support-is-in-SVN-trunk-tf3050970.html"&gt;work in progress&lt;/a&gt;, and &lt;a href="http://www.nabble.com/Re%3A--groovy-dev--Re%3A-Initial-annotation-support-is-in-SVN-trunk-tf3065822.html"&gt;one that progress well&lt;/a&gt; :-)&lt;br /&gt;I am thrilled by the possibilities to combine JavaEE (or any modern annotation based framework) and Groovy. If you wondered about the dynamic language you wanted to use, don't anymore.&lt;br /&gt;&lt;br /&gt;Like the Hibernate team when we worked on the Java Persistence certification, the Groovy team must have been very frustrated to focus on Groovy 1.0 and not being able to innovate as fast as they did. They are now back on track.&lt;br /&gt;&lt;br /&gt;Give a try to Groovy SVN trunk and enjoy.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/01/24/groovy-annotations/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/01/12/to-copy-a-file-in/</id>
    <title>To copy a file in ...</title>
    <updated>2007-01-12T00:00:00Z</updated>
    <published>2007-01-12T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/8xbMKrAnczk/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      ... Javaprivate static void copyFile(File srcFile, File destFile)        throws IOException {   FileInputStream is = null;   FileOutputStream os = null;   try {       is = new FileInputStream(srcFile);       FileChannel iChannel = is.getChannel();       os = new FileOutputStream( destFile, false );       FileChannel oChannel = os.getChannel();       oChannel.transferFrom( iChannel, 0, srcFile.length() );   }   finally {     ...
    </summary>
    <content type="html">
      &lt;p&gt;... Java&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;private static void copyFile(File srcFile, File destFile) &lt;br /&gt;       throws IOException {&lt;br /&gt;   FileInputStream is = null;&lt;br /&gt;   FileOutputStream os = null;&lt;br /&gt;   try {&lt;br /&gt;       is = new FileInputStream(srcFile);&lt;br /&gt;       FileChannel iChannel = is.getChannel();&lt;br /&gt;       os = new FileOutputStream( destFile, false );&lt;br /&gt;       FileChannel oChannel = os.getChannel();&lt;br /&gt;       oChannel.transferFrom( iChannel, 0, srcFile.length() );&lt;br /&gt;   }&lt;br /&gt;   finally {&lt;br /&gt;       if (is != null) is.close();&lt;br /&gt;       if (os != null) os.close();&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;... Groovy&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;static void copyFile(File source, File destination) {&lt;br /&gt;   def reader = source.newReader()&lt;br /&gt;   destination.withWriter { writer -&gt;&lt;br /&gt;       writer &amp;lt;&amp;lt; reader&lt;br /&gt;   }&lt;br /&gt;   reader.close()&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;... Groovy with a salt of Ant&lt;blockquote&gt;&lt;pre&gt;static void copyFile(File source, File destination) {&lt;br /&gt;   new AntBuilder().copy(file:'$source.canonicalPath', &lt;br /&gt;                         tofile:'$destination.canonicalPath')&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;... in shell&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;cp source destination&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/01/12/to-copy-a-file-in/</feedburner:origLink></entry>
  <entry>
    <id>http://emmanuelbernard.com/blog/2007/01/07/activerecord-pattern-so-what/</id>
    <title>ActiveRecord pattern, so what?</title>
    <updated>2007-01-07T00:00:00Z</updated>
    <published>2007-01-07T00:00:00Z</published>
    <link href="http://feedproxy.google.com/~r/NoRelationTo/~3/6XeTfAKO09k/" rel="alternate" type="text/html" />
    <author>
      <name>Emmanuel Bernard</name>
    </author>
    <summary>
      The Active Record pattern has a lot of publicity recently thanks to the Ruby On Rails and Grails wave. A definition could be: an object that encapsulates both data and behavior (ie a database row and it's data access logic).A bit of historyI was asked recently my thoughts about this pattern. First of all, if someone still remembers EJB 1.0 and 2.x Entity Beans, this was a perfect example of the Active Record Pattern... and a successful failure. Some of the reasons for this failure was the tight link between the data and it's access logic: Serialization issue, data tight...
    </summary>
    <content type="html">
      &lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/Active_record"&gt;Active Record&lt;/a&gt; pattern has a lot of publicity recently thanks to the Ruby On Rails and &lt;a href="http://grails.codehaus.org/"&gt;Grails &lt;/a&gt;wave. A definition could be: an object that encapsulates both data and behavior (ie a database row and it's data access logic).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A bit of history&lt;/span&gt;&lt;br /&gt;I was asked recently my thoughts about this pattern. First of all, if someone still remembers EJB 1.0 and 2.x Entity Beans, this was a perfect example of the Active Record Pattern... and a successful failure. Some of the reasons for this failure was the tight link between the data and it's access logic: Serialization issue, data tight to a persistent technology etc etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Statically typed languages&lt;/span&gt;&lt;br /&gt;To me the ActiveRecord pattern is not well suited for statically typed languages like Java, hence the raise of another pattern : DAO (aka DAL in the .net world). It prevents the hard link between the persistence technology and the actual data representation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Dynamic languages&lt;/span&gt;&lt;br /&gt;Dynamic languages (and to a certain extend AOP) have the nice ability to decorate an object with additional features on the fly, without linking it "the hard way": you can then easily reuse your domain classes out of the persistence context.&lt;br /&gt;Grails uses such a behavior to add CRUD operations transparently to your domain model (with quite complex Querying capabilities).&lt;br /&gt;One still face a problem, what if the application developer needs to add a more complex persistence operation (esp a query), he will end up "hard-coding" the function to the domain object and we're back to the issue faced by statically typed languages... unless you create a DAO object. But then, your persistence operations will be split between your implicit domain model methods and your DAO: another code smell.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Dynamic DAO&lt;/span&gt;&lt;br /&gt;As you can see, I'm not keen on the ActiveRecord pattern (out of simple applications), but I really love the simplicity of &lt;a href="http://grails.codehaus.org/GORM"&gt;GORM&lt;/a&gt; (the Grails way). The solution is a dynamic DAO. &lt;a href="http://www.jboss.com/products/seam"&gt;JBoss Seam &lt;/a&gt;already generates very simple yet powerful DAOs benefiting from Java Generics. If you combine that with a dynamic language, you can have the best of both worlds.&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;pre&gt;class UserProcess {&lt;br /&gt;@In UserDao userDao;&lt;br /&gt;&lt;br /&gt;void create(String firstname, String lastname) {&lt;br /&gt;  if (userDao.countByFirstnameAndLastname(firstname, lastname) == 0) {&lt;br /&gt;    def user = new User( "Emmanuel", "Bernard" )&lt;br /&gt;    userDao.save user&lt;br /&gt;  }&lt;br /&gt;  else {&lt;br /&gt;    throw new UserAlreadyExistException()&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Note that &lt;span style="font-style: italic;"&gt;countByFirstnameAndLastname&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;save &lt;/span&gt;can be dynamic methods à la GORM.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;I'm not a big fan of the ActiveRecord. For static languages, I would use the DAO approach. For dynamic languages, I did not make up my mind but a DAO on steroids seems very promising.&lt;/p&gt;
    </content>
  <feedburner:origLink>http://emmanuelbernard.com/blog/2007/01/07/activerecord-pattern-so-what/</feedburner:origLink></entry>
</feed>
