<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-32302284</id><updated>2012-01-17T18:45:48.617+01:00</updated><title type='text'>All the colors of Java and so on</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default?start-index=101&amp;max-results=100'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>102</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-32302284.post-8514650437737830785</id><published>2012-01-17T18:28:00.003+01:00</published><updated>2012-01-17T18:45:48.624+01:00</updated><title type='text'>Use Spring 3 Expression Language (spEL) to get an Integer from an environment variable</title><content type='html'>Today, I played with Spring Batch. As you probably know, in a classic XML Spring config file, you can use ${my.property} to inject a system property in a bean attribute. That's quite simple.&lt;br /&gt;&lt;br /&gt;But, in a JPA item reader (Spring Batch users should understand that), you cannot use this old syntax to inject values in your HQL query (using a parameterValues property). So, I decided to test the fabulously complicated spEL. A wonderful idea...&lt;br /&gt;&lt;br /&gt;So, my problem is to get an Integer value from an argument passed to my JVM with something  -Dmy.prop=value. Of course, if I don't have any JVM param, I want to have a default value.&lt;br /&gt;&lt;br /&gt;Here is the solution :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 51, 0);font-family:courier new;" &gt;#{(T(java.lang.Integer).parseInt(systemProperties['process.past.days']?:0))}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So, let's explain it :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;#{(systemProperties['process.past.days'])}&lt;/span&gt; is required to retrieve a system property called process.past.days&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;#{(systemProperties['process.past.days']?:0)}&lt;/span&gt; is required if you want to set 0 as default value... but... it's horrible... system properties are Strings!!! So, let's parse it.&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;#{(T(java.lang.Integer).parseInt(...))}&lt;/span&gt; is required to convert your String to an Integer&lt;/li&gt;&lt;/ol&gt;Waoooh! I did it!&lt;br /&gt;&lt;br /&gt;My conclusion is that spEL is powerfull but too complicated. How could we maintain that in a few months or years?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-8514650437737830785?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/8514650437737830785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=8514650437737830785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8514650437737830785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8514650437737830785'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2012/01/use-spring-3-expression-language-spel.html' title='Use Spring 3 Expression Language (spEL) to get an Integer from an environment variable'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-5344959922730717933</id><published>2011-12-31T09:41:00.002+01:00</published><updated>2011-12-31T09:47:50.573+01:00</updated><title type='text'>Colorify your Eclipse</title><content type='html'>Yesterday, while I was watching a video about the Play! framework, I realized that I was contemplating TextMate's colors. So, after some googlings, I discovered a "color plugin" which changes the text theme (it doesn't concern the overall look and feel but just the text apparence here). It is so nice so I put here the update-site url :&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://eclipse-color-theme.github.com/update"&gt;http://eclipse-color-theme.github.com/update &lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-5344959922730717933?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/5344959922730717933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=5344959922730717933' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5344959922730717933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5344959922730717933'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/12/colorify-your-eclipse.html' title='Colorify your Eclipse'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-1943652090339229260</id><published>2011-12-14T17:21:00.003+01:00</published><updated>2011-12-14T17:31:35.829+01:00</updated><title type='text'>Spring saved my day on an UTF-8 encoding problem</title><content type='html'>I'm working on Jasig CAS (an SSO server) and I had an issue with special chars. For example, it was impossible to log in with a password like &amp;amp;é"'(-.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I checked my jsp file :it was encoded in UTF-8&lt;/li&gt;&lt;li&gt;I checked the encoding directive (&amp;lt;%@ page contentType="text/html; charset=UTF-8" %&amp;gt;) : OK&lt;/li&gt;&lt;/ul&gt;The idea was to force the request encoding with something like :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;request.setCharacterEncoding("UTF-8");&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But I was in Spring MVC and I didn't want an ugly hack. Fortunately, Spring saved my day with a builtin servlet filter to declare in the web.xml.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;&amp;lt;filter&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;&amp;lt;filter-name&amp;gt;characterEncodingFilter&amp;lt;/filter-name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;    &amp;lt;filter-class&amp;gt;org.springframework.web.filter.CharacterEncodingFilter&amp;lt;/filter-class&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;    &amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;        &amp;lt;param-name&amp;gt;encoding&amp;lt;/param-name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;        &amp;lt;param-value&amp;gt;UTF-8&amp;lt;/param-value&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;    &amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;    &amp;lt;init-param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;        &amp;lt;param-name&amp;gt;forceEncoding&amp;lt;/param-name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;        &amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;    &amp;lt;/init-param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;&amp;lt;/filter&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;&amp;lt;filter-mapping&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;    &amp;lt;filter-name&amp;gt;characterEncodingFilter&amp;lt;/filter-name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;    &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-family:courier new;" &gt;&amp;lt;/filter-mapping&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-1943652090339229260?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/1943652090339229260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=1943652090339229260' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1943652090339229260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1943652090339229260'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/12/spring-saved-my-day-on-utf-8-encoding.html' title='Spring saved my day on an UTF-8 encoding problem'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-4979122714247924453</id><published>2011-11-18T16:41:00.002+01:00</published><updated>2011-11-18T16:44:00.762+01:00</updated><title type='text'>Ubuntu 11.10 with classic gnome shell (like gnome 2)</title><content type='html'>I discovered that there's a port of gnome indicator applet which allows to have Ubuntu 11.10 with a gnome 3 which looks like gnome 2. It could be nice if you don't like gnome-shell.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.webupd8.org/2011/11/indicator-applet-ported-to-gnome-3-can.html"&gt;http://www.webupd8.org/2011/11/indicator-applet-ported-to-gnome-3-can.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-4979122714247924453?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/4979122714247924453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=4979122714247924453' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4979122714247924453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4979122714247924453'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/11/ubuntu-1110-with-classic-gnome-shell.html' title='Ubuntu 11.10 with classic gnome shell (like gnome 2)'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-161032928967652082</id><published>2011-11-16T17:54:00.001+01:00</published><updated>2011-11-16T17:56:17.592+01:00</updated><title type='text'>Common Linux shell commands</title><content type='html'>&lt;a title="View Terminal Cheat Sheet V5 on Scribd" href="http://www.scribd.com/doc/63355696/Terminal-Cheat-Sheet-V5" style="margin: 12px auto 6px auto; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;"&gt;Terminal Cheat Sheet V5&lt;/a&gt;&lt;iframe class="scribd_iframe_embed" src="http://www.scribd.com/embeds/63355696/content?start_page=1&amp;view_mode=list&amp;access_key=key-2i0yy59b1oocvjekwkkw" data-auto-height="true" data-aspect-ratio="1.2938689217759" scrolling="no" id="doc_59738" width="100%" height="600" frameborder="0"&gt;&lt;/iframe&gt;&lt;script type="text/javascript"&gt;(function() { var scribd = document.createElement("script"); scribd.type = "text/javascript"; scribd.async = true; scribd.src = "http://www.scribd.com/javascripts/embed_code/inject.js"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(scribd, s); })();&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-161032928967652082?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/161032928967652082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=161032928967652082' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/161032928967652082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/161032928967652082'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/11/common-linux-shell-commands.html' title='Common Linux shell commands'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-7959095151463623369</id><published>2011-11-10T11:53:00.002+01:00</published><updated>2011-11-10T12:12:13.109+01:00</updated><title type='text'>Kill Oracle session after a JVM was killed</title><content type='html'>For the moment, I'm playing with Spring Batch. In development, it appends that I need to kill my JVM. The problem is that C3P0 is not allowed to acquire another connection on Oracle on next restart. It's just because the previous one is still there. If you have an Oracle account with the required privileges, the you can see your old session in v$session and destroy it :&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;select * from v$session&lt;/li&gt;&lt;li&gt;alter system kill session 'sid,serial#'&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-7959095151463623369?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/7959095151463623369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=7959095151463623369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7959095151463623369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7959095151463623369'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/11/kill-oracle-session-after-jvm-was.html' title='Kill Oracle session after a JVM was killed'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-8819673640603063381</id><published>2011-11-01T08:30:00.001+01:00</published><updated>2011-11-01T08:33:02.779+01:00</updated><title type='text'>Ubuntu 11.10 : how to disable the startup sound</title><content type='html'>The quickest way is to simply rename the login sound file from a terminal :&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;/li&gt;&lt;li&gt;mv /usr/share/sounds/ubuntu/stereo/desktop-login.ogg /usr/share/sounds/ubuntu/stereo/desktop-login.ogg.disabled &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-8819673640603063381?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/8819673640603063381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=8819673640603063381' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8819673640603063381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8819673640603063381'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/11/ubuntu-1110-how-to-disable-startup.html' title='Ubuntu 11.10 : how to disable the startup sound'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-4388136228956369310</id><published>2011-10-30T01:16:00.002+02:00</published><updated>2011-10-30T01:18:37.033+02:00</updated><title type='text'>Ubuntu 11.10 : install OpenJDK</title><content type='html'>&lt;span class="Apple-style-span" style="color: rgb(17, 17, 17); font-family: 'Droid Sans', 'Lucida Grande', Tahoma, sans-serif; font-size: 13px; line-height: 20px; background-color: rgb(255, 255, 255); "&gt;Open a terminal (Ctrl+Alt+T) and execute the following command ;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(17, 17, 17); font-family: 'Droid Sans', 'Lucida Grande', Tahoma, sans-serif; line-height: 20px; background-color: rgb(255, 255, 255); font-size: small; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(17, 17, 17); font-family: 'Droid Sans', 'Lucida Grande', Tahoma, sans-serif; line-height: 20px; background-color: rgb(255, 255, 255); font-size: small; "&gt;sudo apt-get install openjdk-7-jdk&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-4388136228956369310?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/4388136228956369310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=4388136228956369310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4388136228956369310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4388136228956369310'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/10/install-openjdk-on-ubuntu-1110.html' title='Ubuntu 11.10 : install OpenJDK'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-1761407136709606740</id><published>2011-10-27T23:00:00.005+02:00</published><updated>2011-10-31T15:14:07.693+01:00</updated><title type='text'>Ubuntu 11.10 and ATI radeon problem : fan always on</title><content type='html'>Since I migrated my laptop (HP 4720s)  to Ubuntu 11.10 with gnome-shell, I have the following issue :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the open source ATI drivers works well but my fan is always spinning&lt;/li&gt;&lt;li&gt;the additional drivers proposed by Ubuntu don't work and make gnome-shell unusable&lt;/li&gt;&lt;li&gt;the drivers (11.9) from AMD is very slow&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;So, for the moment, the best deal for me is to keep the open source drivers. DON'T INSTALL ANY OTHER DRIVER THAN THE ONCE INSTALLED BY DEFAULT. What we will do is to  underclock the GPU to keep the temperature acceptable and avoid any problems with the fan. Let's open a terminal :&lt;div&gt;&lt;ul&gt;&lt;li&gt;echo -e '#!/bin/sh\necho low &amp;gt; /sys/class/drm/card0/device/power_profile' | sudo tee /etc/init.d/ati-power-save&lt;/li&gt;&lt;li&gt;sudo chmod +x /etc/init.d/ati-power-save&lt;/li&gt;&lt;li&gt;sudo update-rc.d ati-power-save defaults 99&lt;/li&gt;&lt;/ul&gt;By the way, we will increase FPS by disabling vertical sync.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;echo 'export vblank_mode=0' | sudo tee -a /etc/environment&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Reboot and enjoy the silence!&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-1761407136709606740?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/1761407136709606740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=1761407136709606740' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1761407136709606740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1761407136709606740'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/10/ubuntu-1110-ati-radeon-deal.html' title='Ubuntu 11.10 and ATI radeon problem : fan always on'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-8024011356036134452</id><published>2011-10-21T23:37:00.005+02:00</published><updated>2011-11-09T14:52:38.418+01:00</updated><title type='text'>Ubuntu 11.10 : you should try gnome-shell</title><content type='html'>Ubuntu 11.10 is provided with Unity, the graphical user interface from Canonical. Compared to the previous release (Ubuntu 11.04), you can now swith to Gnome Shell. But, why should you swith from Unity to Gnome Shell that you could consider as very similar? My opinion is that Gnome Shell is more pragmatic and beautiful than Unity. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, how to activate Gnome Shell ?&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Go to the software center and activate the patner repositories in the software sources&lt;/li&gt;&lt;li&gt;In a terminal, run sudo apt-get install gnome-shell&lt;/li&gt;&lt;li&gt;Activate it by default with sudo /usr/lib/lightdm/lightdm-set-defaults -s gnome-shell&lt;/li&gt;&lt;li&gt;Reboot and enjoy!&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Now that you have almost a prefect shell, you should install some addons :&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;sudo apt-get install ubuntu-restricted-extras (for flash, java and dvd features)&lt;/li&gt;&lt;li&gt;enable dvd decryption with sudo sh /usr/share/doc/libdvdread4/install-css.sh&lt;/li&gt;&lt;li&gt;sudo apt-get update&lt;/li&gt;&lt;li&gt;sudo apt-get install chromium-browser&lt;/li&gt;&lt;li&gt;sudo apt-get remove firefox&lt;/li&gt;&lt;li&gt;sudo apt-get install smplayer&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;A good thing is also to enable numlock on lightdm : &lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;sudo apt-get install numlockx&lt;/li&gt;&lt;li&gt;echo 'greeter-setup-script=/usr/bin/numlockx on' | sudo tee -a /etc/lightdm/lightdm.conf&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;That's all for my default config.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-8024011356036134452?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/8024011356036134452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=8024011356036134452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8024011356036134452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8024011356036134452'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/10/ubuntu-1110-you-should-try-gnome-shell.html' title='Ubuntu 11.10 : you should try gnome-shell'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-7398793462785536823</id><published>2011-09-13T10:31:00.001+02:00</published><updated>2011-09-13T10:32:46.152+02:00</updated><title type='text'>Another Software Crasftmen Club</title><content type='html'>I found it today and I read some interesting stuffs about SCRUM and software development :&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://elegantcode.com/"&gt;http://elegantcode.com/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-7398793462785536823?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/7398793462785536823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=7398793462785536823' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7398793462785536823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7398793462785536823'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/09/another-software-crasftmen-club.html' title='Another Software Crasftmen Club'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-4301807833259373651</id><published>2011-09-12T11:02:00.004+02:00</published><updated>2011-09-12T11:09:47.143+02:00</updated><title type='text'>PL/SQL interroperability</title><content type='html'>My company uses an ERP mainly developed in PL/SQL. And we need to deal with external systems. Today, I found a project. It could really help :&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;meta equiv="content-type" content="text/html; charset=utf-8"&gt;&lt;a href="http://code.google.com/p/plsql-utils/"&gt;http://code.google.com/p/plsql-utils/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-4301807833259373651?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/4301807833259373651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=4301807833259373651' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4301807833259373651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4301807833259373651'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/09/plsql-interroperability.html' title='PL/SQL interroperability'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-2807210005440587333</id><published>2011-07-12T17:18:00.001+02:00</published><updated>2011-07-12T17:20:09.172+02:00</updated><title type='text'>Java Persistence Performance Blog</title><content type='html'>I found this today : &lt;a href="http://java-persistence-performance.blogspot.com/"&gt;http://java-persistence-performance.blogspot.com/&lt;/a&gt;. It has some good tips about JPA tuning.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-2807210005440587333?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/2807210005440587333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=2807210005440587333' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/2807210005440587333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/2807210005440587333'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/07/java-persistence-performance-blog.html' title='Java Persistence Performance Blog'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-599877547650821802</id><published>2011-05-30T11:29:00.002+02:00</published><updated>2011-05-30T11:32:07.917+02:00</updated><title type='text'>Recover your disk after a WUBI crash</title><content type='html'>This is what I had today. After some two weeks long holidays, my Ubuntu distrib installed with WUBI refused to start. This is the solution I found to get back my files :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 51, 0);"&gt;sudo fdisk -l&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 51, 0);"&gt;sudo mkdir /win&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 51, 0);"&gt;sudo mount /dev/sdxy /win&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 51, 0);"&gt;sudo mkdir /vdisk&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 51, 0);"&gt;sudo mount -o loop /win/ubuntu/disks/root.disk /vdisk&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Source : &lt;a href="http://neosmart.net/forums/showthread.php?t=5004"&gt;http://neosmart.net/forums/showthread.php?t=5004&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-599877547650821802?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/599877547650821802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=599877547650821802' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/599877547650821802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/599877547650821802'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/05/recover-your-disk-after-wubi-crash.html' title='Recover your disk after a WUBI crash'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-4691279219760179078</id><published>2011-05-14T19:42:00.002+02:00</published><updated>2011-05-14T19:49:02.540+02:00</updated><title type='text'>A Java VNC Server implementation</title><content type='html'>I found this code today and I really have to test it.&lt;br /&gt;&lt;br /&gt;Sources are here : &lt;a href="http://ramshacking.blogspot.com/2009/07/server-class-for-vnc.html"&gt;http://ramshacking.blogspot.com/2009/07/server-class-for-vnc.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family: courier new;"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import java.awt.AWTException;&lt;br /&gt;import java.awt.Image;&lt;br /&gt;import java.awt.Rectangle;&lt;br /&gt;import java.awt.Robot;&lt;br /&gt;import java.awt.Toolkit;&lt;br /&gt;import java.awt.image.BufferedImage;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStreamReader;&lt;br /&gt;import java.io.ObjectOutputStream;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.net.ServerSocket;&lt;br /&gt;import java.net.Socket;&lt;br /&gt;import java.net.SocketException;&lt;br /&gt;import javax.swing.ImageIcon;&lt;br /&gt;import javax.swing.JOptionPane;&lt;br /&gt;import java.awt.event.*;&lt;br /&gt;&lt;br /&gt;public class JVNCserver{&lt;br /&gt;&lt;br /&gt;private final int WIDTH = Toolkit.getDefaultToolkit().getScreenSize().width;&lt;br /&gt;private final int HEIGHT = Toolkit.getDefaultToolkit().getScreenSize().height;&lt;br /&gt;private final Rectangle screenRect = new Rectangle(0, 0, WIDTH, HEIGHT);&lt;br /&gt;public Socket socket;&lt;br /&gt;public ServerSocket s;&lt;br /&gt;private CaptureThread capturethread;&lt;br /&gt;private CaptureEvents captureevents;&lt;br /&gt;private Robot robot;&lt;br /&gt;private ObjectOutputStream out;&lt;br /&gt;private BufferedReader in;&lt;br /&gt;private BufferedImage i;&lt;br /&gt;Image image;&lt;br /&gt;&lt;br /&gt;public static void main(String arg[])&lt;br /&gt;{&lt;br /&gt;JVNCserver s = new JVNCserver();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public JVNCserver()&lt;br /&gt;{&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;s = new ServerSocket(1166);&lt;br /&gt;socket = s.accept();&lt;br /&gt;System.out.println("Server Started");&lt;br /&gt;out = new ObjectOutputStream(socket.getOutputStream());&lt;br /&gt;in = new BufferedReader(new InputStreamReader(socket.getInputStream()));&lt;br /&gt;robot = new Robot();&lt;br /&gt;capturethread = new CaptureThread();&lt;br /&gt;captureevents = new CaptureEvents();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;catch(Exception e)&lt;br /&gt;{&lt;br /&gt;JOptionPane.showMessageDialog(null,"server is stop");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void sendImage() throws IOException&lt;br /&gt;{&lt;br /&gt;i = robot.createScreenCapture(screenRect);&lt;br /&gt;image = i.getScaledInstance(WIDTH, HEIGHT-60, Image.SCALE_SMOOTH); out.writeObject(new ImageIcon(image));&lt;br /&gt;i.flush();&lt;br /&gt;image.flush();&lt;br /&gt;out.flush();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private class CaptureThread implements Runnable&lt;br /&gt;{&lt;br /&gt;private volatile boolean keepRunning;&lt;br /&gt;Thread thread;&lt;br /&gt;CaptureThread()&lt;br /&gt;{&lt;br /&gt;thread = new Thread(this,"Capture Thread");&lt;br /&gt;keepRunning = true;&lt;br /&gt;thread.start();&lt;br /&gt;}&lt;br /&gt;public void run()&lt;br /&gt;{&lt;br /&gt;while (keepRunning)&lt;br /&gt;{&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;sendImage();&lt;br /&gt;Thread.currentThread().sleep(8000);&lt;br /&gt;//Thread.currentThread().sleep(20000);&lt;br /&gt;}&lt;br /&gt;catch(InterruptedException e1)&lt;br /&gt;{ System.out.println("Thread Stop"); }&lt;br /&gt;catch (IOException ex) { ex.printStackTrace(); }&lt;br /&gt;catch(Exception e) {&lt;br /&gt;JOptionPane.showMessageDialog(null,"server is stoped"); } } }&lt;br /&gt;public void stopRunning() { keepRunning = false; } }&lt;br /&gt;&lt;br /&gt;private class CaptureEvents implements Runnable {&lt;br /&gt;private volatile boolean keepRunning;&lt;br /&gt;Thread thread;&lt;br /&gt;private int HY = HEIGHT / 2;&lt;br /&gt;int y;&lt;br /&gt;CaptureEvents()&lt;br /&gt;{&lt;br /&gt;thread = new Thread(this,"Capture Events");&lt;br /&gt;keepRunning = true;&lt;br /&gt;thread.start();&lt;br /&gt;}&lt;br /&gt;public void run()&lt;br /&gt;{&lt;br /&gt;while (keepRunning)&lt;br /&gt;{&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;if (in!=null)&lt;br /&gt;{&lt;br /&gt;String e = (String)in.readLine();&lt;br /&gt;if (e!=null)&lt;br /&gt;{ //System.out.println(e);&lt;br /&gt;int eventType = Integer.parseInt(e.substring(0, e.indexOf("")));&lt;br /&gt;int arg1 = Integer.parseInt(e.substring(e.indexOf("")+1, e.lastIndexOf("")));&lt;br /&gt;int arg2 = Integer.parseInt(e.substring(e.lastIndexOf("")+1));&lt;br /&gt;//System.out.println(arg1+"-"+arg2);&lt;br /&gt;if(eventType==JVNCconstant.CLOSE) { keepRunning = false; in.close(); out.close(); return; }&lt;br /&gt;if(arg2 &lt; y =" arg2"&gt; HY) y = arg2 + 21;&lt;br /&gt;if (eventType == JVNCconstant.MOUSE_MOVE) robot.mouseMove(arg1,y);&lt;br /&gt;else if (eventType == JVNCconstant.MOUSE_PRESS)&lt;br /&gt;{ robot.mousePress(InputEvent.BUTTON1_MASK); }&lt;br /&gt;else if (eventType==JVNCconstant.MOUSE_RELEASE) robot.mouseRelease(InputEvent.BUTTON1_MASK);&lt;br /&gt;else if(eventType== JVNCconstant.MOUSE_WHEEL) robot.mouseWheel(arg1);&lt;br /&gt;else if(eventType == JVNCconstant.KEY_PRESS_EVENTS)&lt;br /&gt;{&lt;br /&gt;switch(arg1)&lt;br /&gt;{&lt;br /&gt;case KeyEvent.VK_ENTER: robot.keyPress(KeyEvent.VK_ENTER); break;&lt;br /&gt;case KeyEvent.VK_F1: robot.keyPress(KeyEvent.VK_F1); break;&lt;br /&gt;case KeyEvent.VK_ESCAPE: robot.keyPress(KeyEvent.VK_ESCAPE); break; } } } }&lt;br /&gt;else&lt;br /&gt;System.out.println("In empty"); //Thread.currentThread().sleep(50); } /*catch(InterruptedException e) { System.out.println("Thread Stop"); }*/ catch(SocketException ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(null,"Client is stopped"); break; } catch (IOException ex) { ex.printStackTrace(); } catch(Exception e) { JOptionPane.showMessageDialog(null,"Server is stop"); } } } public void stopRunning() { keepRunning = false; } }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-4691279219760179078?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/4691279219760179078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=4691279219760179078' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4691279219760179078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4691279219760179078'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/05/java-vnc-server-implementation.html' title='A Java VNC Server implementation'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-1440518043022072465</id><published>2011-04-26T11:07:00.007+02:00</published><updated>2011-04-29T18:22:26.283+02:00</updated><title type='text'>VMWare is not the only one to virtualize desktops</title><content type='html'>Today, as I was looking for some information about Ubuntu 11.04, I discovered Edubuntu weblive. This solution allows to open a real linux session over internet. Just go here and enjoy this revolution : &lt;a href="http://www.edubuntu.org/weblive"&gt;http://www.edubuntu.org/weblive&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;By the way, I had to understand what kind of technology there is under weblive. I first found Stephane Graber's blog : &lt;a href="http://www.stgraber.org/"&gt;http://www.stgraber.org&lt;/a&gt;. Then, I understood that it's a Linux terminal server with a FreeNX java agent. I realized how it is a real concurrent of the vmware solution.&lt;br /&gt;&lt;br /&gt;If (like me), you want to "virtualize" desktops in your company, you have to :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;understand how LTSP Cluster works (&lt;a href="https://www.ltsp-cluster.org/"&gt;https://www.ltsp-cluster.org&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;understand what is LTSP of course (&lt;a href="http://ltsp.org/"&gt;http://ltsp.org/&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;know things about the open source freenx implementation (&lt;a href="http://code.google.com/p/neatx/"&gt;http://code.google.com/p/neatx/&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;have a look to this lauchpad link : &lt;a href="https://launchpad.net/%7Eweblive-dev"&gt;https://launchpad.net/~weblive-dev&lt;/a&gt;&lt;/li&gt;&lt;li&gt;understand what is LXC (&lt;a href="http://lxc.sourceforge.net/"&gt;http://lxc.sourceforge.net/)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;If you have legacy Microsoft applications such as Outlook, Office or specific IE webapps, there's a video showing an integration sample : &lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/8OEs2AWFTWc&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=fr_FR&amp;amp;feature=player_embedded&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/8OEs2AWFTWc&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=fr_FR&amp;amp;feature=player_embedded&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;If you want to see who implemented LSTP, go here : &lt;a href="http://sourceforge.net/apps/mediawiki/ltsp/index.php?title=Ltsp_SuccessStories"&gt;http://sourceforge.net/apps/mediawiki/ltsp/index.php?title=Ltsp_SuccessStories&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-1440518043022072465?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/1440518043022072465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=1440518043022072465' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1440518043022072465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1440518043022072465'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/04/vmware-is-not-only-one-to-virtualize.html' title='VMWare is not the only one to virtualize desktops'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-9029340738034961164</id><published>2011-03-03T19:39:00.004+01:00</published><updated>2011-03-03T19:41:01.339+01:00</updated><title type='text'>A french article to understand JGroups</title><content type='html'>&lt;div&gt;As I had some troubles while I was integrating an eh-cache distributed by jgroups, I found this :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://jetoile.blogspot.com/2010/12/jgroups-tour-d.html"&gt;http://jetoile.blogspot.com/2010/12/jgroups-tour-d.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-9029340738034961164?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/9029340738034961164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=9029340738034961164' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/9029340738034961164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/9029340738034961164'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/03/french-article-in_03.html' title='A french article to understand JGroups'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-512256204773922524</id><published>2011-02-21T11:00:00.005+01:00</published><updated>2011-02-21T11:19:28.867+01:00</updated><title type='text'>Maven war overlay and debugging</title><content type='html'>I'm currently working on a project which uses the maven war overlay feature. In such condition, I didn't succeed to start my a Tomcat instance from Eclipse WTP. That's because the war is built to late in the maven process and the Maven integration with WTP never calls the appropriate building step. Thus, I decided to start my server from the command line. With 'war overlay', I need to do :&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;mvn tomcat:run-war&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But, what about debugging? Here I found two solutions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Solution 1 : the standard mode&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just use :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;span class="Apple-style-span" &gt;mvnDebug tomcat:run-war&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But it's a pre-configured solution and you should want to precise some specific options according to your environment.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Solution 2 : customize your debugging options&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is very simple.&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Ensure that you correctly declared your JAVA_HOME&lt;/li&gt;&lt;li&gt;Set the debugging options which will be used by the JVM&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For example :&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;export MAVEN_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000"&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then, just start your server with mvn tomcat:run-war&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-512256204773922524?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/512256204773922524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=512256204773922524' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/512256204773922524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/512256204773922524'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2011/02/maven-war-overlay-and-debugging.html' title='Maven war overlay and debugging'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-7510788683406952026</id><published>2010-12-21T11:53:00.007+01:00</published><updated>2010-12-21T12:33:27.189+01:00</updated><title type='text'>High-Performance Oracle JDBC Programming</title><content type='html'>IMPORTANT NOTE : I'm not the author of this post. Ths original location is here : &lt;a href="http://blog.csdn.net/hakunamatata2008/archive/2009/05/13/4175764.aspx"&gt;http://blog.csdn.net/hakunamatata2008/archive/2009/05/13/4175764.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;High-Performance Oracle JDBC Programming&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Learn how to improve performance of Oracle-driven JDBC programs by leveraging connection and statement pooling features.&lt;br /&gt;&lt;br /&gt;By Yuli Vasiliev&lt;br /&gt;&lt;br /&gt;Published April 2009&lt;br /&gt;&lt;br /&gt;Using pooling techniques such as connection pooling and statement pooling can significantly improve performance of database-intensive applications, because it enables the reuse of objects that would otherwise need to be created from scratch, at the expense of time and resources.&lt;br /&gt;&lt;br /&gt;Reusing database connection objects representing physical database connections utilized by an application can result in significant performance gains, provided that the application interacts with the database intensively, frequently re-establishing connections with the same parameters. On the other hand, you won’t benefit from using a connection pool if your application connects to its underlying database only rarely. In practice, though, many database-intensive applications can benefit from utilizing a connection pool, provided that the pool’s settings, such as those that put a limit on the maximum and minimum number of connections allowed, are optimized for that particular application.&lt;br /&gt;&lt;br /&gt;Like connection pooling, statement pooling is a technique for improving application performance. You can achieve additional performance gains by pooling statements that are executed multiple times in the course of a run of your program. It’s important to realize, though, that statement pooling is not a silver bullet for performance problems. If you cache every single statement without distinguishing how many times it is executed in your program, you are unlikely to achieve any performance improvement. In fact, caching the statements that are issued only once during program execution may actually degrade performance, due to the overhead associated with putting and then keeping such statements in the cache.&lt;br /&gt;&lt;br /&gt;This article shows you how to take advantage of pooling connections and statements to improve performance of data-intensive Java DataBase Connectivity (JDBC) programs interacting with Oracle Database via the Oracle JDBC thin driver. In particular, it looks at the Oracle Universal Connection Pool (UCP) for JDBC, which provides a full-featured connection pool implementation for caching JDBC connections. Finally it discusses how you might benefit from statement pooling, utilizing features specific to Oracle’s JDBC drivers as well as the new JDBC 4.0 methods added to the Statement interface and available in Oracle JDBC drivers supporting Java Development Kit (JDK) 1.6 and later versions.&lt;br /&gt;Setting Up Your Working Environment&lt;br /&gt;&lt;br /&gt;To follow the examples in this article, in addition to having access to an Oracle database, you’ll need to have the following software components installed on your development machine (see "Downloads" portlet for links:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;JDK 1.6&lt;/li&gt;&lt;li&gt;Oracle JDBC thin driver supporting JDK 1.6&lt;/li&gt;&lt;li&gt;    Oracle Universal Connection Pool library&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The Oracle JDBC thin driver is a Type IV JDBC driver, meaning that it’s platform-independent and does not require any extra Oracle software on the client side to interact with an Oracle database. So you can download the JAR file containing the classes of an appropriate thin driver version from the JDBC Driver Downloads page and then install the driver on your machine without having to install/upgrade any other Oracle software. To install the driver, you simply need to copy its JAR files to your local file system and then include paths to these JARs to the CLASSPATH environment variable. For example, you might include the following paths:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;ORACLE_HOME/jdbc/lib/ojdbc6.jar&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ORACLE_HOME/jlib/orai18n.jar&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you have an Oracle database installed on your machine, the thin driver has been installed with your Oracle Database installation. However, because the thin driver does not depend on any additional Oracle software, you can easily upgrade to the latest release of the driver by using appropriate JAR files that can be found on the JDBC Driver Downloads page.&lt;br /&gt;&lt;br /&gt;UCPis a new feature included in Oracle Database 11g, starting with release 11.1.0.7. This feature is also available in Oracle Application Server, beginning with Oracle Application Server 11gRelease 1. If you’re using older software that doesn’t ship the JAR file for UCP(it’s called ucp.jar) or you want to upgrade to the latest UCPrelease, you can pick up ucp.jar from the Oracle Database UCP Downloads page. This package contains UCP’s classes for inclusion in the classpath to enable the feature. The path included might look like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;ORACLE_HOME/ucp/lib/ucp.jar&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Caching JDBC Connections with UCP&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you’re developing a database-intensive application, you might benefit from using a connection pool, which enables you to reuse connections rather than create a new one each time it is requested. Connection pooling conserves resources required for creating new database connections and improves your application performance, because creating a new connection is always a performance-intensive operation.&lt;br /&gt;&lt;br /&gt;The Oracle Universal Connection Pool for JDBC represents a full-featured implementation of a connection pool caching JDBC connections. UCP is a very useful feature, in that it lets you reuse connection objects, thus speeding the process of obtaining a connection and saving resources associated with opening new database connections.&lt;br /&gt;&lt;br /&gt;Suppose you want to create aUCP JDBC connection pool to reuse connections established to the HR/HR Oracle Database sample schema. The following program, representing a simple example of aUCP JDBC connection pool in action, shows how you might achieve this. Here you first create a pool-enabled data source instance and then set up the connection and pool properties. Once you’ve done that, you borrow a connection from the pool and then use that connection to interact with the database. Finally, you close the connection, returning it to the pool.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;*A simple example illustrating aUCP JDBC connection in action&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;*/&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java.sql.*;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import oracle.ucp.jdbc.PoolDataSourceFactory;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import oracle.ucp.jdbc.PoolDataSource;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public class UcpConnection {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; public static void main(String args[]) throws SQLException {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   //Creating a pool-enabled data source&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   //Setting connection properties of the data source&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   pds.setUser("hr");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   pds.setPassword("hr");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   //Setting pool properties&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   pds.setInitialPoolSize(5);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   pds.setMinPoolSize(5);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   pds.setMaxPoolSize(10);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   //Borrowing a connection from the pool&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   Connection conn = pds.getConnection();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   System.out.println("\nConnection borrowed from the pool");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   //Checking the number of available and borrowed connections&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   int avlConnCount = pds.getAvailableConnectionsCount();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   System.out.println("\nAvailable connections: " + avlConnCount);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   int brwConnCount = pds.getBorrowedConnectionsCount();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   System.out.println("\nBorrowed connections: " + brwConnCount);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   //Working with the connection&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   Statement stmt = conn.createStatement();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   ResultSet rs = stmt.executeQuery("select user from dual");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   while(rs.next())&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    System.out.println("\nConnected as: "+rs.getString(1));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   rs.close();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   //Returning the connection to the pool&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   conn.close();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   conn=null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   System.out.println("\nConnection returned to the pool");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   //Checking the number of available and borrowed connections again&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   avlConnCount = pds.getAvailableConnectionsCount();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   System.out.println("\nAvailable connections: " + avlConnCount);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   brwConnCount = pds.getBorrowedConnectionsCount();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   System.out.println("\nBorrowed connections: " + brwConnCount);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  catch(SQLException e)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   System.out.println("\nAn SQL exception occurred : " + e.getMessage());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;An important thing to notice here is what’s happening when a connection is closed. The output of the above program illustrates that closing a connection borrowed from a UCP JDBC connection pool actually returns that connection to the pool, where it becomes available for the next connection request.&lt;br /&gt;&lt;br /&gt;Here is what the program output should look like:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;Connection borrowed from the pool&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Available connections: 4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Borrowed connections: 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Connected as: HR&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Connection returned to the pool&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Available connections: 5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Borrowed connections: 0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Borrowing a Connection with JNDI&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Instead of creating a pool-enabled data source on the fly, as you did in the preceding example, you can create it in advance and bind it to a Java Naming and Directory Interface (JNDI) context and a logical name. Once you’ve registered a data source with JNDI, you can get an instance of it by performing a JNDI lookup, specifying the JNDI name to which the data source is bound.&lt;br /&gt;&lt;br /&gt;Suppose you want to register a pool-enabled data source designed to reuse connections to the HR/HR database schema, associating this data source with logical name jdbc/HRPool in the JNDI tree. To do this, you must create a PoolDataSource object representing the above data source, set its properties, and then register it with a JNDI naming service. This can be done with the following Java program:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;*An example of how you can register&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;* a pool-enabled data source with JNDI&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import oracle.ucp.jdbc.PoolDataSourceFactory;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import oracle.ucp.jdbc.PoolDataSource;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import javax.naming.*; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java.util.Hashtable; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public class JNDIRegister { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public static void main(String argv[]) { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    try { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      //Creating a pool-enabled data source instance and setting its properties &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      pds.setUser("hr");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      pds.setPassword("hr");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      pds.setInitialPoolSize(5);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      pds.setMinPoolSize(5);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      pds.setMaxPoolSize(10);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      //Registering the data source with JNDI&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      Hashtable env = new Hashtable(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory"); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      Context ctx = new InitialContext(env); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      ctx.bind("jdbc/HRPool", pds);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    catch (Exception e) { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      System.out.println(e); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    } &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  } &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;   &lt;br /&gt;&lt;br /&gt;Before you can run this program, you have to set up Sun's file system JNDI service provider, which can be downloaded from here. Make sure to add the following JAR files to the classpath to be able to run the above program:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 102);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;install_dir/sun/lib/fs/fscontext.jar;install_dir/sun/lib/fs/providerutil.jar&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After you run the above program, you can utilize the jdbc/HRPool pool-enabled data source in your Java applications, whether they be JavaServer Pages, servlets, or standalone applications. The following is a standalone Java application utilizing this data source:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;*An example of a JNDI lookup for&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;* a pool-enabled data source &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java.sql.*; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import oracle.ucp.jdbc.PoolDataSource;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import javax.naming.*; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java.util.Hashtable; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public class JNDILookup {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public static void main(String argv[]) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    PoolDataSource pds;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    //Performing a lookup for a pool-enabled data source registered in JNDI tree&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    try { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      Hashtable env = new Hashtable(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      Context ctx = new InitialContext(env); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      pds = (PoolDataSource) ctx.lookup("jdbc/HRPool"); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    catch (NamingException eName) { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      System.out.println("Cannot look up " +  "jdbc/HRPool" + ": " +eName); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       return; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    //Borrowing a connection from the data source returned by the JNDI lookup&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    try { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      Connection conn = pds.getConnection(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      Statement stmt = conn.createStatement();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      ResultSet rs = stmt.executeQuery("select user from dual");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      while(rs.next())&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        System.out.println("\nConnected as: "+rs.getString(1));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if (conn != null) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        conn.close(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    } &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    catch (SQLException eSQL) { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      System.out.println("Cannot obtain a connection: " + eSQL); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    } &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    return; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The first thing you do in the above program is to initialize the JNDI context, which is then used to perform a JNDI lookup for the jdbc/HROracle pool-enabled data source. Next you borrow a connection from the data source instance returned by the JNDI lookup and use it to issue a query against the database.&lt;br /&gt;&lt;br /&gt;As you no doubt have realized, the approach discussed in this section simplifies the process of using connection pools. Registering a pool-enabled data source once and then obtaining an instance of it with a JNDI lookup when needed eliminates the need to set up the connection pool properties each time you initialize it. You just obtain a pool instance with the properties defined in advance.&lt;br /&gt;High Availability and Performance&lt;br /&gt;&lt;br /&gt;It’s important to emphasize that UCP supports new JDBC 4.0 high-availability and performance features, such as pool refreshing and connection validating, that are not related to Oracle Real Application Clusters (RAC) and therefore do not require an Oracle RAC database.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Validate connection&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Furthermore, UCP provides the ability to validate connections on borrow. Validating connections on borrow is a useful technique, because it enables you to check whether a connection is still valid before you start using it. To help with this problem, a  UCP JDBC connection pool instance has the ValidateConnectionOnBorrow property of type Boolean, which you need to set to true with the setValidateConnectionOnBorrow method:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;pds.setValidateConnectionOnBorrow(true);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then you need to specify an SQL statement you want to be issued to make sure that the connection is still valid. You can do this with the setSQLForValidateConnection method:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;pds.setSQLForValidateConnection("select user from dual");&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;When utilizing an Oracle JDBC driver, though, there is no need to set the SQLForValidateConnection property&lt;/span&gt;—the pool will perform an internal ping to test the validity of the connection being borrowed.&lt;br /&gt;&lt;br /&gt;Verifying connections on borrow is a good thing, but what if a connection becomes stale after it has been successfully validated on borrow? Is there any way to verify a connection after it has been borrowed? To address this issue, the JDBC 4.0 specification added the isValid method to the Connection interface, enabling you to test the validity of a connection when you want to.&lt;br /&gt;&lt;br /&gt;Taking it one step further, UCP for JDBC provides the oracle.ucp.jdbc.ValidConnection interface, which includes two methods: isValid and setInvalid. These methods can be especially useful when utilized in conjunction with a retry mechanism implemented with recursion or iteration (looping). For instance, you might implement a method that will borrow and then utilize a connection, making a recursive call to itself in case the connection has become stale and consequently the operation cannot be completed. An important thing to keep in mind when implementing such a recursive mechanism is that it must provide the ability to limit the number of recursive calls to be made and that each new recursive call must reduce that number, thus preventing the possibility of endless looping.&lt;br /&gt;&lt;br /&gt;The following is a simple program providing an example of how you might use the oracle.ucp.jdbc.ValidConnection interface methods in conjunction with a retry mechanism based on recursion.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;*An example of validating connections on borrow;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;*this also shows the use of the ValidConnection interface's methods:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;*isValid and setInvalid methods in combination with a retry mechanism&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java.sql.*; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import oracle.ucp.jdbc.PoolDataSource;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import oracle.ucp.jdbc.ValidConnection;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import javax.naming.*; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java.util.Hashtable; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public class ConnectionValidating {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public static void main(String argv[]) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    PoolDataSource pds;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    //Looking up for the jdbc/HRPool pool-enabled data source registered in JNDI tree&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    //for actual code see the JNDI lookup example &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    //discussed in the Borrowing a Connection with JNDI section earlier&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    try { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      //Instructing the pool to validate connections on borrow&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      pds.setValidateConnectionOnBorrow(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      //Calling the getUser method that borrows a connection from the pool&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      //limiting the number of recursive calls to 3&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      System.out.println("\nConnected as :"+getUser(pds, 3));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    catch (SQLException eSQL) { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      System.out.println("\nSQLException: " + eSQL); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      return; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  //This method borrows a connection from the pool and will make a recursive call &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  //if it turns out that the borrowed connection has become unusable&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  private static String getUser (PoolDataSource pds, int recursiveCalls) throws SQLException {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Connection conn = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Statement stmt = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    ResultSet rs = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    String user = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    try {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      //Borrowing a connection from the pool&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      conn = pds.getConnection(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      //Working with the connection&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      stmt =  conn.createStatement();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      rs = stmt.executeQuery("select user from dual");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      while(rs.next())&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        user = rs.getString(1);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if (conn != null)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        conn.close();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    } &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    catch (SQLException eSQL) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if (recursiveCalls &gt; 0 &amp;amp;&amp;amp; !((ValidConnection) conn).isValid()) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          System.out.println("\nConnection is no longer valid: " + eSQL);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          //Calling setInvalid often leads to an exception&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          //so it's a wise idea to put it in a separate try block&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          try {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            ((ValidConnection) conn).setInvalid();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          } catch (SQLException conEx) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            System.out.println("\nInvalidating failed: " + conEx); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          conn.close();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          conn = null; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          System.out.println("\nRetrying to obtain a new connection");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          //making a recursive call to getUser in an attempt to obtain a valid connection&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          //the number of recursive calls allowed is reduced by 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          user = getUser(pds, recursiveCalls - 1);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       } else {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          System.out.println("\nSQLException: " + eSQL);  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    finally {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       return user; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }     &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In this example, the getUser method calls itself from within the catch clause of the try/catch statement implemented in this same method. Here, you limit the number of allowed recursive calls to three. If it fails to obtain a valid connection three times in a row, you stop trying and get out.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;High-availability features&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aside from the generic high-availability and performance features discussed above, UCP for JDBC can be integrated with Oracle RAC features such as Fast Connection Failover (FCF) and Runtime Connection Load Balancing, making it easier to manage connections to an Oracle RAC database.&lt;br /&gt;&lt;br /&gt;The following snippet illustrates how you can enable FCF when using a UCP JDBC connection pool managing connections to an Oracle RAC database. Note that using FCF requires you to add the Oracle Notification Service library (ons.jar) to an application’s classpath. The Oracle Notification Service library is shipped as part of Oracle Database, starting with Oracle Database 10g.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   //Creating a pool-enabled data source&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   //Setting pool properties&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   //Setting a RAC-specific URL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    pds.setURL(&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      "jdbc:oracle:thin:@" +&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      "(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=ON)" +&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      "(ADDRESS=(PROTOCOL=TCP)" +&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      "(HOST=rachost1)(PORT=1521))" +&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      "(ADDRESS=(PROTOCOL=TCP)" +&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      "(HOST=rachost2)(PORT=1521)))" +&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      "(CONNECT_DATA=(SERVICE_NAME=orcl)))");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    pds.setUser("usr");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    pds.setPassword("pswd");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    pds.setMinPoolSize(10);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    pds.setMaxPoolSize(20);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    //Configuring remote ONS subscription&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    pds.setONSConfiguration("nodes=rachost1:4200,rachost2:4200");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    // Enabling Fast Connection Failover&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    pds.setFastConnectionFailoverEnabled(true);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once you have a connection pool set up and FCF enabled, you can borrow a connection from the pool and create queries on it as you would in a non- RAC-specific program.&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;Connection conn = pds.getConnection();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   Statement stmt = conn.createStatement();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   ResultSet rs = null;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then you can implement a retry mechanism that will check a connection for validity after a RAC-down event triggers  UCP FCF actions, trying again to connect to surviving RAC instances in case the connection has become stale. The following snippet illustrates how this could be implemented within a while loop.&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;boolean retry = true;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    while(retry)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        //Getting a RAC connection from the pool&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        conn = pds.getConnection();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        // Executing a query on the connection.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        rs = stmt.executeQuery("select user from dual");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        rs.next();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        System.out.println("\nConnected as : " + rs.getString(1));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        //Setting retry to false to exit the loop&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        retry = false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      catch (SQLException eSQL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        System.out.println("\nSQLException: " + eSQL);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        // Checking connection usability after a RAC-down event triggers  UCP FCF actions&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        if (conn == null || !((ValidConnection) conn).isValid())&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          //Closing the connection&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            conn.close();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          catch (SQLException eClose)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            System.out.println("\nException arose when closing connection: " + eClose);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          //Setting retry to true to try again&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          retry = true;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      Thread.sleep(1000);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If a connection has been successfully borrowed from the pool and the statement execution has not triggered an exception, there is no need to retry the operation and therefore the execution flow will jump out of the loop. Otherwise, it will try to reconnect and will then perform the statement execution again.&lt;br /&gt;Optimizing Connection Pools&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Optimize pooling behavior with parameters and callbacks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The UCP JDBC connection pool provides a set of properties you can use to optimize pooling behavior. For example, you can regulate the pool size, setting the properties controlling the initial, maximum, and minimum pool size. In the preceding sections, you have seen how you can set up these properties.&lt;br /&gt;&lt;br /&gt;Aside from the properties controlling the pool size, there are properties controlling stale connections. For example, you can set up the pool’s &lt;span style="font-weight: bold;"&gt;MaxConnectionReuseTime&lt;/span&gt; property, thus configuring a maximum connection reuse time. In some environments, you may find it useful to have connections removed from the pool after a connection has been borrowed a certain number of times. You can do this by setting up the &lt;span style="font-weight: bold;"&gt;MaxConnectionReuseCount&lt;/span&gt; property.&lt;br /&gt;&lt;br /&gt;You can set up the &lt;span style="font-weight: bold;"&gt;AbandonConnectionTimeout&lt;/span&gt; property to instruct the pool to reclaim borrowed connections after a connection has not been used for a certain amount of time. Also, you can set up the &lt;span style="font-weight: bold;"&gt;TimeToLiveConnectionTimeout&lt;/span&gt; property, limiting how long a borrowed connection may be used before it is reclaimed by the pool.&lt;br /&gt;&lt;br /&gt;If you anticipate that the pool may run out of connections at some point, you can set the &lt;span style="font-weight: bold;"&gt;ConnectionWaitTimeout&lt;/span&gt; property to the number of seconds an application request waits for a connection when no connections are available in the pool. Also, there is the InactiveConnectionTimeout property, which enables you to specify how long an available connection can remain unborrowed before it is removed from the pool.&lt;br /&gt;&lt;br /&gt;Another interesting property is &lt;span style="font-weight: bold;"&gt;TimeoutCheckInterval&lt;/span&gt;, with which you can set up the timeout check interval, controlling how often the timeout properties discussed above will be enforced. By default, this property is set to 30, meaning that the timeout check cycle runs every 30 seconds.&lt;br /&gt;&lt;br /&gt;All the optimization features discussed so far in this section require you to set a certain property to an appropriate value in order to get the effect you want, but to enable the connection harvesting feature, which is used to ensure a certain number of available connections in the pool, you need to use a mechanism that’s a bit more complicated. This feature is explained in the rest of this section by example.&lt;br /&gt;&lt;br /&gt;Let’s say you set up the pool’s size properties as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       pds.setInitialPoolSize(10);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       pds.setMaxPoolSize(20);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With &lt;span style="font-weight: bold;"&gt;initialPoolSize&lt;/span&gt; set to 10, you will have 10 connections upon initializing the connection pool. Next, with the following code, you enable the connection harvesting feature, thus making the pool’s connections harvestable:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;pds.setConnectionHarvestTriggerCount(5);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;pds.setConnectionHarvestMaxCount(2);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The properties set above instruct the pool to reclaim two borrowed connections when the number of available connections in the pool drops to five. Let’s now create an array of five connection  objects that can be then used to hold five connections borrowed from the pool:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;//Creating an array of connection objects&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  Connection[] conn = new Connection[5]; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before populating the above array with connections, though, you need to create an array of callback objects, each of which will be registered with a connection. A callback object must be an instance of a custom implementation of the &lt;span style="font-weight: bold;"&gt;ConnectionHarvestingCallback&lt;/span&gt; abstract interface. A simple implementation is shown a little later in this section.&lt;br /&gt;&lt;br /&gt;With the following code, you create an array of five CustConnectionHarvestingCallback objects:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;//Creating an array of callback objects&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   CustConnectionHarvestingCallback[] callbk = new CustConnectionHarvestingCallback[5];&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;In the following loop, you borrow four connections from the pool and also create four callback objects, each of which is registered with a connection:&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;//Borrowing four connections from the pool&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       for (int i = 0; i &lt;&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         conn[i] = pds.getConnection();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         //Registering the callback object with each connection&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         callbk[i] = new CustConnectionHarvestingCallback(conn[i]); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         ((HarvestableConnection) conn[i]).registerConnectionHarvestingCallback(callbk[i]);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before you borrow the fifth connection to trigger harvesting, you can disable harvesting on a certain connection for testing purposes. You might recall that you specified two borrowed connections to be returned to the pool when the number of available connections drops to five. By default, the connection harvest feature will harvest those two connections that were borrowed first. Thus, in this example, conn[0] and conn[1] will be harvested. By setting conn[0] as nonharvestable, however, you make it harvest conn[1] and conn[2].&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;//Setting conn[0] as nonharvestable &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    ((HarvestableConnection) conn[0]).setConnectionHarvestable(false);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let’s now trigger harvesting by borrowing the fifth connection from the pool.&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;//Borrowing the fifth connection to trigger harvesting&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    conn[4] = pds.getConnection();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    callbk[4] = new CustConnectionHarvestingCallback(conn[4]);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    ((HarvestableConnection) conn[4]).registerConnectionHarvestingCallback(callbk[4]);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Recall from the discussion of the timeout check interval earlier in this section that this interval is set to 30 by default. What this means in this example is that harvesting will not be triggered immediately but within a 30-second interval.&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;// Waiting for harvesting to happen&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Thread.sleep(30000);&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;To make sure everything has worked as planned, you might want to check through the connections to see which ones have been closed and returned to the pool:&lt;br /&gt;&lt;br /&gt;  &lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;//Checking connections&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    for (int i = 0; i &lt;&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      System.out.println("Connection " + i + " returned to the pool - " + conn[i].isClosed());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The above should generate output showing that conn[1] and conn[2] have been closed and therefore returned to the pool whereas the other three are still in the borrowed state.&lt;br /&gt;&lt;br /&gt;Finally, here is how you might implement the ConnectionHarvestingCallback abstract interface so that its cleanup method closes the connection being harvested:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;class CustConnectionHarvestingCallback implements ConnectionHarvestingCallback&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     private Connection conn = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     public CustConnectionHarvestingCallback(Connection conn)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       this.conn = conn;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     public boolean cleanup()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       try {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         conn.close();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       catch (Exception e) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         return false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       return true;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The above is a simple example of a ConnectionHarvestingCallback abstract interface implementation. In a real-world application, you might want to use a more complicated implementation. In particular, you might need to implement more-complex logic in the cleanup method, such as rolling back the transaction associated with the connection being harvested, before closing that connection.&lt;br /&gt;&lt;br /&gt;As you have learned in this section, there are several UCP JDBC connection pool properties you can use to optimize pooling behavior. So, it's often a good idea to experiment with pool settings to find the combination that best fits the needs of your application.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Statement Pooling&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This recommendation may seem obvious, but the importance of statement pooling in data-intensive applications cannot be overstated. Oracle JDBC drivers support explicit and implicit statement caching, enabling you to cache prepared and callable statements. Implicit caching doesn’t require you to take any special action to send statements to and retrieve them from a cache—a prepared or callable statement automatically goes to the cache when you invoke the close method of that statement object. The next time you create this statement on this same connection, it will be retrieved from the cache rather than being created from scratch. If implicit caching is turned on, a statement object will be reused from the cache when the following conditions are met:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The SQL string used in the statement is equal to one held in the cache.&lt;/li&gt;&lt;li&gt;    The statement type is also the same, meaning prepared or callable.&lt;/li&gt;&lt;li&gt;    The scrollable type of the result set generated by the statement is also the same, meaning forward-only or scrollable.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Although Oracle JDBC drivers are designed with the supposition that implicit caching is enabled, this feature is not turned on by default. To enable implicit caching on the connection, you can set the &lt;span style="font-weight: bold;"&gt;implicitCachingEnabled&lt;/span&gt; property of the corresponding OracleConnection object to true and set the &lt;span style="font-weight: bold;"&gt;statementCacheSize&lt;/span&gt; property to a positive integer. This can be done as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;conn.setImplicitCachingEnabled(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  conn.setStatementCacheSize(10);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;When using aUCP JDBC connection pool, you can enable statement caching by setting maxStatements property to a positive integer:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;pds.setMaxStatements(10); &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you do this, statement caching will be enabled for each connection within the pool. The following program provides a simplified example of how you can use statement pooling, taking advantage of connection pooling at the same time:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;*An example of statement pooling in action&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java.sql.*; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import oracle.ucp.jdbc.PoolDataSource;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import oracle.jdbc.OracleConnection;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import oracle.jdbc.OraclePreparedStatement;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import javax.naming.*; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;import java.util.Hashtable; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public class StatementPooling {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  public static void main(String argv[]) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    PoolDataSource pds;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    //Looking up for the jdbc/HRPool pool-enabled data source registered in the JNDI tree&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    //for actual code, see the JNDI lookup example &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    //discussed in the Borrowing a Connection with JNDI section earlier&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  ...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    try {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      //Enabling statement caching for the pool's connections &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      pds.setMaxStatements(10); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      //Borrowing a connection from the pool&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      OracleConnection conn = (OracleConnection) pds.getConnection(); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      //Checking whether the implicit statement caching is enabled&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if (conn.getImplicitCachingEnabled())&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        System.out.println("\nimplicit caching enabled"); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      else&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        System.out.println("\nimplicit caching disabled");           &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      //Looping through calls to the getRegion private class method that executes a prepared statement&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      for (int i = 1; i &lt;&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        System.out.println("\n" + getRegion(conn, i));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      //Returning the connection to the pool&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if (conn != null) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        conn.close();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        conn = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    } &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    catch (SQLException eSQL) { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      System.out.println("Cannot obtain a connection: " + eSQL); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    } &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  //This method creates, executes, and then closes a prepared statement&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  private static String getRegion (OracleConnection conn, int region_id ) throws SQLException {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    OraclePreparedStatement stmt = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    ResultSet rs = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    String region = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    String sql = "SELECT * FROM regions WHERE region_id = ?";   &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    try {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      stmt = (OraclePreparedStatement)conn.prepareStatement(sql);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      stmt.setInt(1, region_id);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      rs = stmt.executeQuery();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      rs.next();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      region = rs.getString("REGION_NAME");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    } &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    catch (SQLException eSQL) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      System.out.println("\nSQLException: " + eSQL); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    //this code is executed under all circumstances &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    finally {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if (rs != null)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        rs.close ();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      if (stmt != null)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        //if implicit caching is enabled, the statement is not actually closed&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        //but is sent to the cache&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        stmt.close ();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      return region;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As you can see, the getRegion method of the class shown above creates, executes, and then closes a prepared statement, returning the query result to the calling code. This method is called repeatedly in a loop running in the main method, making implicit statement caching possible. In this example, you enabled implicit caching when you called the &lt;span style="font-weight: bold;"&gt;setMaxStatements&lt;/span&gt; method of the connection pool instance. So calling the close method of the prepared statement in the getRegion method will actually cache the statement instead of closing it, thus letting the program reuse it on the second and subsequent calls to getRegion. To make sure it works as expected, you can add the following code to the getRegion method, putting it right after the call to the prepareStatement method of the OracleConnection object:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      //Checking the creation state of the prepared statement&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      int creationState = stmt.creationState();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      switch(creationState) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        case 0:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          System.out.println("\nCreation state: new");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          break;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        case 1:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          System.out.println("\nCreation state: from the implicit cache");   &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          break;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        case 2:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          System.out.println("\nCreation state: from the explicit cache"); &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          break;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;      }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you now execute the program, you should see that the prepared statement’s creation status is new only upon the first call to getRegion—all subsequent getRegion calls reuse the statement cached implicitly.&lt;br /&gt;&lt;br /&gt;Being able to enable statement caching for every statement on every connection within the pool is a start, but how you can you apply this technique selectively, disabling caching statements on a certain pooled connection or even disabling caching for a certain statement?&lt;br /&gt;&lt;br /&gt;If you recall from the discussion at the beginning of this section, you can use an OracleConnection implicitCachingEnabled property to enable or disable statement caching for that particular connection. For example, you may have enabled statement caching for each connection within the pool and may then disable it on a particular connection as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;conn.setImplicitCachingEnabled(false);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As for disabling or enabling caching on particular statements, you can take advantage of the new JDBC 4.0 methods added to the Statement interface. In particular, to make a statement object poolable or not poolable, you can use its setPoolable method, passing in true or false, respectively. To check out the current poolable state of a statement object, you can use the isPoolable method of that object. Here is how you might prevent a particular prepared statement from going to the implicit cache:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 51, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;if(stmt.isPoolable())&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       stmt.setPoolable(false);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It’s interesting to note here that if implicit caching is not enabled on the connection, an attempt to enable it for a particular statement with setPoolable(true) won’t force the desired effect. Although the poolable property of a statement object is set to true by default, you still need to first turn implicit caching on for the connection or the entire connection pool, as described at the beginning of this section.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In this article, you learned how to take advantage of connection and statement pooling, utilizing outstanding Oracle-specific JDBC features as well as the standard JDBC 4.0 features. In particular, you looked at the Oracle Universal Connection Pool for JDBC, a new Oracle Database 11g feature providing a connection pool implementation for caching JDBC connections. Then you learned how to take advantage of statement pooling, utilizing features specific to Oracle’s JDBC drivers as well as the new JDBC 4.0 methods added to the Statement interface.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Yuli Vasiliev is a software developer, freelance author, and consultant currently specializing in open source development, Java technologies, databases, and SOA. He is the author of Beginning Database-Driven Application Development in Java EE: Using GlassFish (Apress, 2008).&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-7510788683406952026?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/7510788683406952026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=7510788683406952026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7510788683406952026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7510788683406952026'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2010/12/high-performance-oracle-jdbc.html' title='High-Performance Oracle JDBC Programming'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-5457075273108017943</id><published>2010-12-21T10:15:00.032+01:00</published><updated>2010-12-22T12:02:46.984+01:00</updated><title type='text'>Replace your C3P0 or DBCP by Oracle pool (UCP)</title><content type='html'>&lt;div&gt;&lt;b&gt;Introduction : ODS or UCP?&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I've been using DBCP and C3P0 for a long time. But, a few months ago, I started to have problems with them. For example, sometimes, no way to get any connection to my database (while it's still possible with my Oracle SQL Developer). So, I decided to look at the code of C3P0. What a surprise! Even if it's a very common pool for a lot of projects (such as Hibernate), it seems to be dead. No more development, code complicated with sub projects, no Maven integration (...ok, ok, even if you hate Maven, you have to admit that it is very efficient to modify the code of mavenized projects...). Thus, I looked for a new pool. Of course, I found the recent &lt;a href="http://people.apache.org/~fhanik/tomcat/jdbc-pool.html"&gt;tomcat jdbc pool&lt;/a&gt;. But I finally decided to work with Oracle pool just because I only have Oracle databases.&lt;br /&gt;&lt;br /&gt;So, this post is my history with Oracle pool.&lt;br /&gt;&lt;br /&gt;When you look for pool features on Oracle doc website, you find to ways to implement it :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Oracle DataSource pool (also called ODS) and included in the driver jar file&lt;/li&gt;&lt;li&gt;Oracle Universal Connection Pool (UCP), which is packaged in its own jar file (ucp.jar)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;ODS : the old way&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;First of all, ODS is the old way. Its interfaces are still usable BUT deprecated. See it by yourself by looking at the code of OracleConnectionCacheImpl. This class contains tuning parameters. This a an example of my Spring configuration with ODS :&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="OracleNativePoolParent" class="oracle.jdbc.pool.OracleDataSource"&lt;br /&gt;destroy-method="close" lazy-init="true" &amp;gt;&lt;br /&gt;&amp;lt;property name="user" value="****" /&amp;gt;&lt;br /&gt;&amp;lt;property name="password" value="****" /&amp;gt;&lt;br /&gt;&amp;lt;property name="serverName" value="****" /&amp;gt;&lt;br /&gt;&amp;lt;property name="databaseName" value="****" /&amp;gt;&lt;br /&gt;&amp;lt;property name="driverType" value="thin" /&amp;gt;&lt;br /&gt;&amp;lt;property name="networkProtocol" value="tcp" /&amp;gt;&lt;br /&gt;&amp;lt;property name="portNumber" value="1521" /&amp;gt;&lt;br /&gt;&amp;lt;property name="connectionCachingEnabled" value="true" /&amp;gt;&lt;br /&gt;&amp;lt;property name="connectionCacheProperties"&amp;gt;&lt;br /&gt; &amp;lt;props merge="default"&amp;gt;&lt;br /&gt;  &amp;lt;prop key="InitialLimit"&amp;gt;1&amp;lt;/prop&amp;gt;&lt;br /&gt;  &amp;lt;prop key="MinLimit"&amp;gt;1&amp;lt;/prop&amp;gt;&lt;br /&gt;  &amp;lt;prop key="MaxLimit"&amp;gt;10&amp;lt;/prop&amp;gt;&lt;br /&gt; &amp;lt;/props&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;property name="maxStatements" value="400" /&amp;gt;&lt;br /&gt;&amp;lt;property name="loginTimeout" value="20" /&amp;gt;&lt;br /&gt;&amp;lt;property name="connectionProperties"&amp;gt;&lt;br /&gt; &amp;lt;props merge="default"&amp;gt;&lt;br /&gt;  &amp;lt;prop key="AutoCommit"&amp;gt;false&amp;lt;/prop&amp;gt;&lt;br /&gt; &amp;lt;/props&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;UCP : you should use it instead of ODS&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Now, let's switch to UCP. Curiously, We need to use a factory to obtain an instance of this pool. This is my Spring configuration :&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean id="OracleNativePoolParent" class="oracle.ucp.jdbc.PoolDataSourceFactory" factory-method="getPoolDataSource" lazy-init="true" &amp;gt;&lt;br /&gt;&amp;lt;property name="connectionFactoryClassName" value="oracle.jdbc.pool.OracleDataSource"/&amp;gt;&lt;br /&gt;&amp;lt;property name="user" value="****" /&amp;gt;&lt;br /&gt;&amp;lt;property name="password" value="****" /&amp;gt;&lt;br /&gt;&amp;lt;property name="URL" value="jdbc:oracle:thin:@myServer:1521:myDB" /&amp;gt;&lt;br /&gt;&amp;lt;property name="connectionWaitTimeout" value="30" /&amp;gt;&lt;br /&gt;&amp;lt;property name="minPoolSize" value="1"/&amp;gt;&lt;br /&gt;&amp;lt;property name="maxPoolSize" value="10"/&amp;gt;&lt;br /&gt;&amp;lt;property name="inactiveConnectionTimeout" value="3600"/&amp;gt;&lt;br /&gt;&amp;lt;property name="validateConnectionOnBorrow" value="true"/&amp;gt;&lt;br /&gt;&amp;lt;property name="maxStatements" value="400"/&amp;gt;&lt;br /&gt;&amp;lt;property name="connectionProperties"&amp;gt;&lt;br /&gt; &amp;lt;props merge="default"&amp;gt;&lt;br /&gt;  &amp;lt;prop key="AutoCommit"&amp;gt;false&amp;lt;/prop&amp;gt;&lt;br /&gt; &amp;lt;/props&amp;gt;&lt;br /&gt;&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Driver Oracle 11g blocked on startup&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While initializing your pool, you have to wait 5 minutes then get an exception? Don't panic. It's just a little but with Sun Java on Linux OS. Add this JVM parameter : &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;-Djava.security.egd=file:///dev/urandom&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;More informations here : &lt;a href="http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/"&gt;http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;Even if I didn't find all the options I had with C3P0, UCP seems to be efficient for me. I think that it's a best choice to work with Oracle database because it is officially supported. But, there's still a negative point. As I don't have the source code, it will be very difficult to qualify bugs and to understand advanced parameters (and I think that the official documentation is not exhaustive at all). &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-5457075273108017943?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/5457075273108017943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=5457075273108017943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5457075273108017943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5457075273108017943'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2010/12/replace-your-c3p0-or-dbcp-by-oracle.html' title='Replace your C3P0 or DBCP by Oracle pool (UCP)'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-312881737763675033</id><published>2010-09-10T14:26:00.003+02:00</published><updated>2010-09-10T14:31:57.146+02:00</updated><title type='text'>My new best business site</title><content type='html'>I found it while I was surfing on the JDuchess french site. This site (and of course its author) aims to give the keys to self-teaching of the art of business.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thanks to Mathilde Lemée (&lt;a href="http://www.java-freelance.fr/"&gt;http://www.java-freelance.fr/&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://personalmba.com/best-business-books/"&gt;http://personalmba.com/best-business-books/&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-312881737763675033?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/312881737763675033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=312881737763675033' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/312881737763675033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/312881737763675033'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2010/09/my-new-best-business-site.html' title='My new best business site'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-7810419094254601332</id><published>2010-09-09T11:55:00.003+02:00</published><updated>2010-09-09T12:18:28.951+02:00</updated><title type='text'>My AJP connector is sick!!!</title><content type='html'>Today, I had a problem between my Apache balancer and my Tomcat cluster. A virtual machine that was hosting two Tomcats was frozen. Something was wrong in my config and the Apache didn't show these Tomcats in error in the jk_status web interface. After a few minutes, I realized that the uriworkermap file was not configure on 'balancer' but directly on 'tomcat1' (one of the two Tomcats that were down). &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, I concluded that the Apache jk doesn't do any test on a worker if it isn't mapped with an uri.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But let'go back to my virtual machine that was frozen. It was not completely dead and a telnet 8010 was responding. Thus, my first conclusion was that I had a problem with my Apache. BAD WAY!!! The telnet was not efficient. I demonstrated that with a tiny perl script found on the net made to simulate an ajp ping. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can use the script as this : time ./ajp_ping.pl server:8009&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Many thanks to the author of this script. I don't have the link to his post anymore.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is the script content :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;#!/usr/bin/perl -w&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;use warnings;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;use strict;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;use Socket;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;my ($remote, $port) = split /:/, shift @ARGV, 2;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;if (! $remote) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;    $remote = 'localhost';&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;print "remote = $remote\n";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;if (! $port) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;    $port = 8009;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;print "port = $port\n";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;my ($iaddr, $paddr, $proto);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;# If the port has anything other than numbers, we're assuming it is an&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;# /etc/services name.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;if ($port =~ /\D/) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;    $port = getservbyname $port, 'tcp' ;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;die "Bad port, stopped" unless $port;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;print "port = $port\n";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;$iaddr = inet_aton($remote) || die "No host: $remote, stopped";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;print "iaddr = $iaddr\n";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;$paddr = sockaddr_in($port, $iaddr) || die "sockaddr: $!, stopped";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;print "paddr = $paddr\n";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;# Grab the number for TCP out of /etc/protocols.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;$proto = getprotobyname 'tcp' ;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;print "proto = $proto\n";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;my $sock;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;# PF_INET and SOCK_STREAM are constants imported by the Socket module.  They&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;# are the same as what is defined in sys/socket.h.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;socket $sock, PF_INET, SOCK_STREAM, $proto || die "socket: $!, stopped";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;print "sock = $sock\n";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;print "BEFORE CONNECT\n";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;connect $sock, $paddr  || die "connect: $!, stopped";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;print "AFTER CONNECT\n";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;# This is the ping packet.  For detailed documentation, see&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;# http://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;# I stole the exact byte sequence from&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;# http://sourceforge.net/project/shownotes.php?group_id=128058&amp;amp;release_id=438456&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;# instead of fully understanding the packet structure.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;my $ping = pack 'C5'    # Format template.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;    , 0x12, 0x34        # Magic number for server-&gt;container packets.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;    , 0x00, 0x01        # 2 byte int length of payload.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;    , 0x0A              # Type of packet. 10 = CPing.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;my @ping_values = unpack 'C5', $ping;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;print "ping_values = " , join ' ', @ping_values , "\n";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;# This is the expected pong packet.  That is, this is what Tomcat sends back&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;# to indicate that it is operating OK.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;my $expected = pack 'C5'    # Format template.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;    , 0x41, 0x42            # Magic number for container-&gt;server packets.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;    , 0x00, 0x01            # 2 byte int length of payload.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;    , 0x09                  # Type of packet. 9 = CPong reply.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;syswrite $sock, $ping || die "syswrite: $!, stopped";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;my $pong;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;$pong = 'empty';&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;print "BEFORE READ\n";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;sysread $sock, $pong, 5 || die "read: $!, stopped";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;print "AFTER READ\n";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;my @pong_values = unpack 'C5', $pong;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;print "pong_values = " , join ' ', @pong_values , "\n";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;close $sock || die "close: $!, stopped";&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;exit 0;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-7810419094254601332?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/7810419094254601332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=7810419094254601332' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7810419094254601332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7810419094254601332'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2010/09/my-ajp-connector-is-sick.html' title='My AJP connector is sick!!!'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-1016831824731874492</id><published>2010-08-18T09:55:00.002+02:00</published><updated>2010-08-18T10:09:00.221+02:00</updated><title type='text'>Tomcat and the web.xml's webapprootkey</title><content type='html'>I n my company, I have to deal with many Spring based applications deployed on a Tomcat cluster.  For each one, we set a property 'webapprootkey' in the web.xml file to avoid errors on startup. Today, I decided to dig about that (... erratum... I decided to tell Google to dig about that). Thus, I found this excellent post.&lt;br /&gt;&lt;a href="http://groups.google.com/group/riotfamily/browse_thread/thread/9a0edf69575d3ab6?pli=1"&gt;&lt;br /&gt;http://groups.google.com/group/riotfamily/browse_thread/thread/9a0edf69575d3ab6?pli=1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-family: courier new;"&gt;&lt;/span&gt;&lt;blockquote style="font-style: italic; font-family: courier new;"&gt;Hi all,&lt;br /&gt;&lt;br /&gt;when deploying two applications build from the riot  skeleton within  the same Tomcat servlet container, you get an  IllegalStateException: Web app root system property already set to   different value: 'webapp.root' =  [/Users/joe/Workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/webapps/webapp-A/]  instead of  [/Users/joe/Workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/webapps/webapp-B/]  - Choose unique  values for the 'webAppRootKey'  context-param in your  web.xml files!&lt;br /&gt;&lt;br /&gt;I will try to explain where this comes from and  how to circumvent it,  but first the quick fix for the impatient reader:  Place a context  parameter named 'webAppRootKey' in every project's  web.xml and assign  a value to it, that is unique for every of your  projects like the  project name itself.&lt;br /&gt;&lt;br /&gt;The webAppRootKey context  parameter is introduced by Spring. Along  with the WebAppRootListener  it allows exposing the web applications  root directory as a system  property. The value of the context  parameter 'webAppRootKey' names the  system property to use. If the  context parameter 'webAppRootKey' is not  set in the application's  web.xml, Spring chooses the default value  'app.root'. While some  servlet containers like Resin do isolate each  web application's  system properties, others like Tomcat do not. And  that's what the  former mentioned IllegalStateException is telling us:   The system  property 'app.root' already contains the root directory of  the first  web application when Spring tries to assign the root  directoty of the  second application to it.&lt;br /&gt;&lt;br /&gt;Ok, that's the background information. A deeper look into the  web.xml  tells us, that there ist no WebAppRootListener configured. Why  does  this initialisation take place anyway? The stack trace from the   exception reveals the culprit: The Log4jConfigListener also tries to   set the webAppRootKey, because this is an interesting mechanism for  the  Spring/Log4j integration. It allows log and config file locations   relative to the web applications root directory. The   Log4jConfigListener supports three init parameters at the servlet  context level: 'log4jConifgLocation', 'log4jRefreshInterval' and  'log4jExposeWebAppRoot'. See JavaDocs for more informations.&lt;br /&gt;&lt;br /&gt;But, none of these parameters are set in the riot project skeleton's   web.xml and none of the Log4jWebConfigureres features are used by the   riot project skeleton. As long as you do stay with default log4j  setup,  the Log4jConfigListener is superflous.&lt;br /&gt;&lt;br /&gt;At the end there are three possible solutions for the initial problem:&lt;br /&gt;&lt;br /&gt;(1) Provide any of your applications with a unique 'webAppRootKey'.&lt;br /&gt;(2) Set the servlet context parameter 'log4jExposeWebAppRoot' to  'false'. This eliminates the use of log file locations relative to  the web application's root directory but still allows a log4j config  location outside the classpath.&lt;br /&gt;(3) Remove the 'Log4jConfigListener' from your application's web.xml.&lt;br /&gt;&lt;br /&gt;What do you think is the best solution and should be incorporated  into the riot skeleton project?&lt;br /&gt;&lt;br /&gt;-alf&lt;br /&gt;&lt;br /&gt;Alf Werder&lt;br /&gt;&lt;br /&gt;Technische Leitung&lt;br /&gt;Head of Engineering&lt;br /&gt;&lt;br /&gt;http://www.glonz.com&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-1016831824731874492?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/1016831824731874492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=1016831824731874492' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1016831824731874492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1016831824731874492'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2010/08/tomcat-and-webxmls-webapprootkey.html' title='Tomcat and the web.xml&apos;s webapprootkey'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-7130967941106054476</id><published>2010-07-22T15:38:00.002+02:00</published><updated>2010-07-22T15:41:28.033+02:00</updated><title type='text'>rpmdb: Lock table is out of available locker entries</title><content type='html'>This is what to do to fix this kind of problem :&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: georgia, serif; font-size: 14px; color: rgb(85, 85, 85); font-style: italic; "&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;tar cvzf rpmdb-backup.tar.gz /var/lib/rpm&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rm /var/lib/rpm/__db.00*&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rpm --rebuilddb&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;rpm -qa | sort&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The first line is to backup your database&lt;/div&gt;&lt;div&gt;The second to remove locks&lt;/div&gt;&lt;div&gt;The third to rebuild your database&lt;/div&gt;&lt;div&gt;The fourth to check if all is ok&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-7130967941106054476?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/7130967941106054476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=7130967941106054476' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7130967941106054476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7130967941106054476'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2010/07/rpmdb-lock-table-is-out-of-available.html' title='rpmdb: Lock table is out of available locker entries'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-204018726835366616</id><published>2010-05-20T10:36:00.001+02:00</published><updated>2010-05-20T10:37:52.107+02:00</updated><title type='text'>Marco read the matrix for Oracle I/O</title><content type='html'>&lt;div&gt;Marco sent to me this excellent (EXCELLENT!!) link. As always, this is not a presentation for rabbits!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://www.pythian.com/news/392/pythian-goodies-oracle-disk-io-basics/"&gt;http://www.pythian.com/news/392/pythian-goodies-oracle-disk-io-basics/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-204018726835366616?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/204018726835366616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=204018726835366616' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/204018726835366616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/204018726835366616'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2010/05/marco-read-matrix-for-oracle-io.html' title='Marco read the matrix for Oracle I/O'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-1094262170140487254</id><published>2010-03-12T18:00:00.000+01:00</published><updated>2010-03-12T18:01:09.019+01:00</updated><title type='text'>Detect intrusion attacks on Linux</title><content type='html'>grep "Invalid" /var/log/auth.log | grep -i ssh | awk '{a[$1$2]++}END{for (i in a){print i " " a[i]}}'&lt;br /&gt;&lt;br /&gt;Thanks Marco!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-1094262170140487254?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/1094262170140487254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=1094262170140487254' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1094262170140487254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1094262170140487254'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2010/03/detect-intrusion-attacks-on-linux.html' title='Detect intrusion attacks on Linux'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-6228334398693878734</id><published>2010-02-23T21:08:00.003+01:00</published><updated>2010-02-23T21:18:10.018+01:00</updated><title type='text'>How to fix mouse click problem on flash player 64 bits with Ubuntu 9.10</title><content type='html'>I just write here some informations I found on the web. On my Linux Ubuntu 9.10 64 bits, the flash plugin sometimes doesn't register mouse clicks. To fix it, edit the following file by doing :&lt;div&gt;&lt;span class="Apple-style-span"   style="  color: rgb(51, 51, 51); line-height: 18px; font-family:Verdana, sans-serif;font-size:13px;"&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;sudo gedit /usr/lib/nspluginwrapper/noarch/npviewer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;and add this export&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  color: rgb(136, 85, 34); line-height: 16px; font-family:'courier new';font-size:13px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;export GDK_NATIVE_WINDOWS=1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;like this&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;#!/bin/sh&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;#&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;#  nsplugin viewer wrapper script...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;OS="`uname -s`"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;ARCH="`uname -m`"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;NPW_LIBDIR="/usr/lib/nspluginwrapper"&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;export GDK_NATIVE_WINDOWS=1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;if test -z "$TARGET_OS"; then&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enjoy!&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-6228334398693878734?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/6228334398693878734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=6228334398693878734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/6228334398693878734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/6228334398693878734'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2010/02/how-to-fix-mouse-click-problem-on-flash.html' title='How to fix mouse click problem on flash player 64 bits with Ubuntu 9.10'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-7721756376297535422</id><published>2010-02-19T11:33:00.002+01:00</published><updated>2010-02-19T11:38:13.996+01:00</updated><title type='text'>An awesome Lego robot</title><content type='html'>&lt;div&gt;Be careful, this is an awesome video! You can also observe that the programmer is using an Acer netbook. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/eaRcWB3jwMo&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=fr_FR&amp;amp;feature=player_embedded&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/eaRcWB3jwMo&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=fr_FR&amp;amp;feature=player_embedded&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-7721756376297535422?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/7721756376297535422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=7721756376297535422' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7721756376297535422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7721756376297535422'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2010/02/awesome-lego-robot.html' title='An awesome Lego robot'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-7821076085389758219</id><published>2010-02-09T14:43:00.002+01:00</published><updated>2010-02-09T14:44:53.196+01:00</updated><title type='text'>A possible future for our personal computers</title><content type='html'>&lt;object width="446" height="326"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;param name="bgColor" value="#ffffff"&gt; &lt;param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/PranavMistry_2009I-medium.flv&amp;amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/PranavMistry-2009I.embed_thumbnail.jpg&amp;amp;vw=432&amp;amp;vh=240&amp;amp;ap=0&amp;amp;ti=685&amp;amp;introDuration=16500&amp;amp;adDuration=4000&amp;amp;postAdDuration=2000&amp;amp;adKeys=talk=pranav_mistry_the_thrilling_potential_of_sixthsense_tec;year=2009;theme=a_taste_of_tedindia;theme=design_like_you_give_a_damn;theme=what_s_next_in_tech;theme=new_on_ted_com;theme=the_creative_spark;theme=tales_of_invention;theme=ted_under_30;event=TEDIndia+2009;&amp;amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;"&gt;&lt;embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgcolor="#ffffff" allowfullscreen="true" flashvars="vu=http://video.ted.com/talks/dynamic/PranavMistry_2009I-medium.flv&amp;amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/PranavMistry-2009I.embed_thumbnail.jpg&amp;amp;vw=432&amp;amp;vh=240&amp;amp;ap=0&amp;amp;ti=685&amp;amp;introDuration=16500&amp;amp;adDuration=4000&amp;amp;postAdDuration=2000&amp;amp;adKeys=talk=pranav_mistry_the_thrilling_potential_of_sixthsense_tec;year=2009;theme=a_taste_of_tedindia;theme=design_like_you_give_a_damn;theme=what_s_next_in_tech;theme=new_on_ted_com;theme=the_creative_spark;theme=tales_of_invention;theme=ted_under_30;event=TEDIndia+2009;" width="446" height="326"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-7821076085389758219?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/7821076085389758219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=7821076085389758219' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7821076085389758219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7821076085389758219'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2010/02/possible-future-for-our-personal.html' title='A possible future for our personal computers'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-2586657572506258140</id><published>2010-01-04T17:36:00.002+01:00</published><updated>2010-01-04T17:42:57.600+01:00</updated><title type='text'>PHP Tips : converting legacy content into UTF-8</title><content type='html'>Today, we have encoding problems with legacy apps written in PHP. After some discussions and some googlings, I found this interesting post :&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.sitepoint.com/blogs/2008/09/10/issues-with-cultural-integration/"&gt;http://www.sitepoint.com/blogs/2008/09/10/issues-with-cultural-integration/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can read in it :&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Latin1 on the inside, utf-8 on the outside&lt;/li&gt;&lt;li&gt;Embed utf-8 within latin1&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;I copied-pasted just a few lines of code :&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;// declare that the output will be in utf-8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;header("Content-Type: text/html; charset=utf-8");&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;// open an output buffer, capturing all output&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;ob_start('output_handler');&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;// when the script ends, the buffer is piped through this functions, encoding it from latin1 to utf-8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;function output_handler($buffer) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;  return utf8_encode($buffer);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span"  style="color:#006600;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Excellent!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-2586657572506258140?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/2586657572506258140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=2586657572506258140' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/2586657572506258140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/2586657572506258140'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2010/01/php-tips-converting-legacy-content-into.html' title='PHP Tips : converting legacy content into UTF-8'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-3910886603663236868</id><published>2009-12-10T23:14:00.002+01:00</published><updated>2009-12-10T23:16:47.393+01:00</updated><title type='text'>30 Eclipse plugins</title><content type='html'>As I was surfing on eclipse.org, I found this link which contains a selection a plugins. I've already tried someone which are very interesting. So, do like me : enhance your Eclipse!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ajaxline.com/best-eclipse-plugins"&gt;http://www.ajaxline.com/best-eclipse-plugins&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-3910886603663236868?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/3910886603663236868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=3910886603663236868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/3910886603663236868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/3910886603663236868'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/12/30-eclipse-plugins.html' title='30 Eclipse plugins'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-1385887871953766876</id><published>2009-10-24T23:18:00.001+02:00</published><updated>2009-10-24T23:21:12.420+02:00</updated><title type='text'>A script I found to install Flash on Ubuntu 9.10 64bits</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;#!/bin/bash&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;# Script  created by&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;# Romeo-Adrian Cioaba romeo.cioaba@spotonearth.com&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;# Super minor updates by jason.melton[at]gmail[dot]com&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;# Updates by Alejandro Cuervo 3[at]cuervo[dot]net&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;# more very minor updates by damien[at]groovey[dot]com&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;# Released under GPL&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;echo "Closing Firefox"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo killall -9 firefox&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;echo "Downloading and instaling Getlibs for required libraries"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;wget http://www.boundlesssupremacy.com/Cappy/getlibs/getlibs-all.deb&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo dpkg -i getlibs-all.deb&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;echo "Removing previous installs of flash:"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo apt-get remove -y --purge flashplugin-nonfree gnash gnash-common mozilla-plugin-gnash swfdec-mozilla libflashsupport nspluginwrapper&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo rm -f /usr/lib/mozilla/plugins/*flash*&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo rm -f ~/.mozilla/plugins/*flash*&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo rm -f /usr/lib/firefox/plugins/*flash*&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo rm -f /usr/lib/firefox-addons/plugins/*flash*&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo rm -rfd /usr/lib/nspluginwrapper&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;echo "Installing ia32-libs and nspluginwrapper"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo apt-get install ia32-libs nspluginwrapper&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;echo "Getting libs"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo getlibs -p libcurl3&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo getlibs -p libnss3-1d&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo getlibs -p libnspr4-0d&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;echo "Installing Flash Player 10"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;cd ~&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;wget http://fpdownload.macromedia.com/get/flashplayer/current/install_flash_player_10_linux.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;tar zxvf install_flash_player_10_linux.tar.gz&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo mv libflashplayer.so /usr/lib/mozilla/plugins/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo nspluginwrapper -i /usr/lib/mozilla/plugins/libflashplayer.so&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;echo "Linking the libraries so that firefox can see them."&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo ln -sf /usr/lib/nspluginwrapper/plugins/npwrapper.libflashplayer.so /usr/lib/mozilla/plugins/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo ln -sf /usr/lib/nspluginwrapper/plugins/npwrapper.libflashplayer.so /usr/lib/firefox-addons/plugins/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;echo "Done :-)"&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;echo "You may re-start Firefox now"&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-1385887871953766876?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/1385887871953766876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=1385887871953766876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1385887871953766876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1385887871953766876'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/10/script-i-found-to-install-flash-on.html' title='A script I found to install Flash on Ubuntu 9.10 64bits'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-6525972297270303673</id><published>2009-10-20T17:39:00.003+02:00</published><updated>2009-10-20T17:42:38.986+02:00</updated><title type='text'>Functional Programming For The Rest of Us</title><content type='html'>Today, Marco gave me a link to a post made to understand  what is functional programming (you know that Microsoft F# is arriving?) :&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.defmacro.org/ramblings/fp.html"&gt;http://www.defmacro.org/ramblings/fp.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thanks Marco!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-6525972297270303673?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/6525972297270303673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=6525972297270303673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/6525972297270303673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/6525972297270303673'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/10/functional-programming-for-rest-of-us.html' title='Functional Programming For The Rest of Us'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-1995875692013306497</id><published>2009-10-19T13:08:00.002+02:00</published><updated>2009-10-19T13:12:20.636+02:00</updated><title type='text'>Domain Driven Design Quickly in french</title><content type='html'>Good news for french readers! Guillaume Lebur translated this excellent book. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.infosaurus.fr/public/docs/DDDViteFaitPartie1.pdf"&gt;http://blog.infosaurus.fr/public/docs/DDDViteFaitPartie1.pdf&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-1995875692013306497?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/1995875692013306497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=1995875692013306497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1995875692013306497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1995875692013306497'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/10/domain-driven-design-quickly-in-french.html' title='Domain Driven Design Quickly in french'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-8533767377360778064</id><published>2009-10-02T21:45:00.039+02:00</published><updated>2009-10-15T15:11:30.932+02:00</updated><title type='text'>I realized I was a "ScrumButt" Master</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_N271C0FJSQg/Stb_1A8P0rI/AAAAAAAAAL0/GkYgnHcad2c/s1600-h/Photo_100209_002.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_N271C0FJSQg/Stb_1A8P0rI/AAAAAAAAAL0/GkYgnHcad2c/s320/Photo_100209_002.jpg" alt="" id="BLOGGER_PHOTO_ID_5392778890073592498" border="0" /&gt;&lt;/a&gt;I've just finished the two days long training session to be a Scrum Master. These two days were lead by &lt;a href="http://jeffsutherland.com/"&gt;Jeff Sutherland&lt;/a&gt; (in collaboration with &lt;a href="http://www.xebia.fr/"&gt;Xebia France&lt;/a&gt;) . Of course, don't imagine that you will be great a Scrum Master at the end of the session. As Jeff said, were you a good driver just after obtaining youri driving license?&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;In this post, I will try to summarize notes I took during the course. It's not exhaustive but it wil give you a global idea of what is Scrum and what should do a Scrum Master.&lt;br /&gt;&lt;br /&gt;But, before starting, let's return to the title of this post : "I realized I was a ScrumButt Master". Humm... what's that? Jeff said something very interesting . He asked people about who had already tried Scrum. Many ones in the assistance raised their hand. So, why were they here? ... Ok, let's do another test : can you give me the average velocity of your team? Only two answers iin allt the room. And that's why I was here. As many people, I tried Scrum but not entirely. This is commonly called "ScrumButt" (don't ask me about the two "t", I don't know). And that's why I failed my first Scrum project. Without using all concepts, it smells Scrum, it has got the color of Scrum but it's not Scrum. You see?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;Sorry for non-french people, I will continue this article in my mother tongue (which is definitely not Java!).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Après nous avoir demandé de présenter notre voisin, Jeff a fait un rapide sondage histoire de savoir qui travaillait déjà en Scrum (ou, en tout cas, qui avait l'impression d'en faire comme je l'ai dit plus haut...). Il a ensuite reventilé les tables pour avoir des groupes homogènes. C'est un des principes de Scrum : l'équipe ne doit pas comporter de personne qui se démarque. Jeff entend gagner en productivité avec une équipe moyenne.    &lt;/div&gt;&lt;p style="margin-bottom: 0cm; font-weight: bold; color: rgb(0, 153, 0); text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm; font-weight: bold; color: rgb(153, 153, 153); text-align: center;font-family:courier new;"&gt;&lt;span style="font-size:130%;"&gt;Scrum, c'est quoi?&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Première étape de la formation : présentation du &lt;b&gt;« framework » &lt;/b&gt;Scrum.  Signalons le tout de suite : pour Jeff, Scrum n'est pas une méthode mais plutôt un cadre de travail pour gagner en performance. Bizarre tout de même, j'ai beau faire le tour de la question, ça ressemble pas mal à de la méthode tout ça. Enfin, on ne va pas chipoter sur les mots. Bref, voici un condensé de ce fameux « framework » :&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; color: rgb(204, 102, 0); text-align: justify;"&gt;Les acteurs :&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Le &lt;b&gt;Product Owner&lt;/b&gt;. En bon  français, c'est le chef produit. Enfin... c'est celui qui veut  faire faire quelque chose et qui sait ce que ce quelque chose doit  faire.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Le &lt;b&gt;Scrum Master&lt;/b&gt;. Il anime  l'équipe. &lt;b&gt;Il est là pour s'assurer que tous les membres  travaillent vers le même objectif.&lt;/b&gt; Ce n'est donc pas un  « chef » d'équipe dans le sens hiérarchique mais un  animateur. Cela peut vous choquer mais c'est dingue le nombre de CdP  que j'ai croisés dans ma vie professionnelle qui se  prenaient pour des petits chefs... Pourtant, même armé de son  diagramme de Gantt, le chef de projet n'est-il pas avant tout au  service de son équipe? Et Scrum est assez clair sur le sujet car  &lt;b&gt;l'équipe est autogérée&lt;/b&gt;.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Le reste de &lt;b&gt;l'équipe&lt;/b&gt;  projet. Je dit bien « le reste » parce que le Scrum  Master en fait partie. Typiquement dans le cadre d'un projet de  développement, il développe 50% de son temps. Il est donc  pleinement impliqué et ne se contente pas de poser des jalons et de  vérifier qu'ils sont respectés! D'autre part, l'équipe (Scrum  Master inclut donc) a un rendement optimal si elle est composée de &lt;b&gt;5  à 7 membres&lt;/b&gt;. Au delà, cette productivité s'effondre. Et le  mythe du mois-homme dans tout ça? Où il est le bébé fait en un  mois par neuf femmes???&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Accessoirement, Jeff a insisté  sur la nécessité d'avoir un recours à un DBA dans les projets de  développement. Il a aussi rappelé qu'un bon architecte est un  architecte qui code! Et oui, il doit montrer à l'équipe que ce  qu'il a conçu tient la route.&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; color: rgb(204, 102, 0); text-align: justify;"&gt;Comment est découpé le projet dans le temps :&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Le &lt;b&gt;Sprint&lt;/b&gt;. Tout Scrum  tourne autour de ça. Un sprint est une unité de découpage  temporel du projet avant lequel tout le monde se met d'accord sur ce  qui va être fait, pendant lequel l'équi et à la fin duquel l'équipe remet au Product  Owner un livrable. Un projet Scrum est composé d'une succession de  Sprints. Là, vous devez commencer à sentir la différence avec du  projet ordinaire ; &lt;b&gt;Scrum impose de livrer tout au long du projet  et non pas à la fin&lt;/b&gt;. Dans la pratique, on fait souvent des  Sprints de deux semaines. Mais tout est possible. Pendant la  formation, Jeff nous a fait faire des Sprints de 3 minutes!&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Le &lt;b&gt;Planning Meeting&lt;/b&gt;. Cette  réunion se fait avec toute l'équipe projet + le Product Owner.  L'objectif est de savoir ce que l'équipe va devoir réaliser pour  le Sprint à venir.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;La &lt;b&gt;Démo&lt;/b&gt; : A chaque fin de  Sprint, l'équipe doit montrer au Product Owner ce qu'elle a  réalisé. Seules les tâches totalement terminées font partie de  la démo. La notion de « terminé » est vraiment  importante. Par principe, on ne retravaille pas sur ce qui a été  livré dans un Sprint précédent donc, autant bien soigner son code  dès le début. Rework is Baaaaad. M...kay....&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;La &lt;b&gt;Retrospective&lt;/b&gt;.  Petit  test : cela fait combien de temps que vous n'avez pas fait de  débriefing après un projet? Humm... vous aussi... Et bien en  Scrum, on le fait tout le temps! Bref, après la démo, l'équipe fait un point sur ce qui  s'est bien ou mal passé histoire de pouvoir s'améliorer au  prochain Sprint.   &lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Le &lt;b&gt;Daily Meeting &lt;/b&gt;ou  « Stand-up meeting » ou « appelez le comme vous  voulez du moment que cela ne dépasse pas 15 minutes ». Ce  point équipe quotidien permet à chaque membre de décrire ce qu'il a  fait la veille et ce qu'il compte faire aujourd'hui. Généralement,  ces micros réunions se font debout  (ça évite que les  participants « s'installent » dans la réunion).&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; color: rgb(204, 102, 0); text-align: justify;"&gt;Les outils du Scrummer :&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_N271C0FJSQg/StcZzIJrYII/AAAAAAAAAMk/Nejo0tJvHEM/s1600-h/userstory.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 120px;" src="http://1.bp.blogspot.com/_N271C0FJSQg/StcZzIJrYII/AAAAAAAAAMk/Nejo0tJvHEM/s200/userstory.jpg" alt="" id="BLOGGER_PHOTO_ID_5392807444951556226" border="0" /&gt;&lt;/a&gt;&lt;b&gt;Un paquet de Post-It&lt;/b&gt; (on ne rigole pas) pour  rédiger les « &lt;b&gt;User Stories&lt;/b&gt; ». Les User Stories sont les  fonctionnalités attendues. Habituellement, chaque « User  Story » est donc notée sur un Post-It collé au mur. Jeff a  insisté : pas d'Excel!  Chaque fiche comprend :   &lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-weight: normal;"&gt;L'&lt;/span&gt;&lt;b&gt;objectif   recherché&lt;/b&gt; (le « ça doit faire quoi »)&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Le « &lt;b&gt;How to demo&lt;/b&gt; ».   Comment tester que cela fonctionne. OBLIGATOIRE! Une fonctionnalité   non testable est une fonctionnalité non livrable!&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Un chiffre pour indiquer sa   priorité par rapport aux autres fonctionnalités. C'est la   « &lt;b&gt;Business Value&lt;/b&gt; ». Pensez toujours à ce qui va   rapporter le plus de valeur à votre business!     &lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Un nombre de points indiquant sa charge  de réalisation (Courez tout de suite lire la section sur   le planning poker pour découvrir illico comment on la   calcule, vous ne serez pas déçu). Ces points s'appellent des   &lt;b&gt;Sprint Points&lt;/b&gt;. Au fait, vous avez vu? On ne compte pas en temps comme d'habitude mais de Sprint Points. On verra plus tard comment estimer en temps la valeur d'un Sprint Point.&lt;/p&gt;  &lt;/li&gt;&lt;/ul&gt;  &lt;p style="margin-bottom: 0cm;"&gt;Afin de toujours s'assurer qu'une User  Story est pertinente, Jeff nous a donné l'acronyme INVEST.  Ainsi,  une User Story doit être :&lt;/p&gt;  &lt;ul style="font-style: italic; color: rgb(102, 102, 102);"&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Independant&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Negotiate&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Valuable&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Estimable&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Small&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Testable&lt;/p&gt;  &lt;/li&gt;&lt;/ul&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_N271C0FJSQg/StcBPoChe8I/AAAAAAAAAL8/iS3Oy7Mt5QA/s1600-h/post-its.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 216px; height: 320px;" src="http://1.bp.blogspot.com/_N271C0FJSQg/StcBPoChe8I/AAAAAAAAAL8/iS3Oy7Mt5QA/s320/post-its.jpg" alt="" id="BLOGGER_PHOTO_ID_5392780446757125058" border="0" /&gt;&lt;/a&gt;&lt;b&gt;Un bout de mur pour coller les  Post-Its&lt;/b&gt;. L'espace de collage est découpé en zones bien  distinctes pour y accueillir :&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Le &lt;b&gt;Product Backlog&lt;/b&gt; : il   comprend l'ensemble des User Stories du projet. Il est créé par   le Product Owner qui les priorise en fonction de leur « Business   Value ». L'idée sera bien sûr de réaliser en premier les   fiches apportant le plus de valeur métier tout en tenant compte bien sûr de leur complexité de réalisation.&lt;br /&gt;&lt;/p&gt;   &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Le &lt;b&gt;Sprint Backlog&lt;/b&gt;. En bon    français, c'est quoi qu'est ce qu'on va livrer à la fin du Sprint   :) Lors de la réunion de planificaction du Sprint, on pioche dans   les Post-Its du Product Backlog.&lt;/p&gt;  &lt;/li&gt;&lt;/ul&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;Un tableau ou un paperboard  &lt;/b&gt;pour y tracer le &lt;b&gt;BurnDown Chart.&lt;/b&gt; C'est un outil très  puissant et très simple à réaliser. Il permet de suivre le  « reste à faire » du projet et de voir si l'équipe se  porte bien. Prenez votre  Product Backlog et faites le total des Sprint Points des User  Stories. Reportez le sur votre graphique en ordonnées. En abscisse,  mettez les Sprints. A chaque fin de Sprint, recalculez de nombre de  points restants à faire et reportez le sur le graphique. Et ainsi  de suite... Vous avez votre BurnDown Chart. Comment l''interprêter? Si votre courbe est linéaire, c'est que l'équipe  travaille de façon homogène. Vous pouvez en plus avoir une idée  précise de la date de fin de projet. Si la courbe fléchit, oh la  la alerte rouge... il passer en &lt;a href="http://scalingsoftwareagility.wordpress.com/2008/10/19/jeff-sutherland%e2%80%99s-sprint-emergency-landing-procedure/"&gt;Emergency Sprint Procedure&lt;/a&gt;&lt;br /&gt;&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_N271C0FJSQg/StcaLEpuuUI/AAAAAAAAAMs/KhBUCt4-4cM/s1600-h/burndownchart.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 190px;" src="http://4.bp.blogspot.com/_N271C0FJSQg/StcaLEpuuUI/AAAAAAAAAMs/KhBUCt4-4cM/s320/burndownchart.jpg" alt="" id="BLOGGER_PHOTO_ID_5392807856329111874" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; color: rgb(204, 102, 0); text-align: justify;"&gt;Les indicateurs du projet :&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;La &lt;b&gt;vélocité de l'équipe&lt;/b&gt;.  C'est sa capacité à produire. En outre, c'est le nombre de  Spring Points qu'elle est capable de réaliser en un Sprint. Donc,  plus vous connaissez votre équipe, plus vous savez combien de  points elle peut réaliser en comparaison avec les Sprints  précédents. On appelle ça le « yesterday's weather ». Par conséquent, évitez de faire rentrer/sortir des  ressources en cours de projet; ça casse toute l'estimation de  vélocité. Je vous ai préparé une petite section sur « Comment  calculer la vélocité de son équipe » plus loin.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Le &lt;b&gt;BurnDown Chart&lt;/b&gt;. Je ne  reviens pas dessus. Ce graph synthétise pas mal de choses : le  reste à faire, le durée du projet, l'état de santé de l'équipe,  etc...&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Le « Rework ». Sur  l'un des BurnDown Charts que Jeff nous a présenté, il a fait  apparaître le coût du code non conforme qui doit être repris.  Cela permet de conserver un oeil sur la qualité des Sprints  précédents. En principe, &lt;span style="font-weight: bold;"&gt;le « rework » doit rester  faible&lt;/span&gt; car l'une des règles d'or de Scrum est de &lt;span style="font-weight: bold;"&gt;ne pas négocier  sur la qualité&lt;/span&gt;. Négligence de la qualité = rework. Rework =  surcoût.   &lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Le stress de l'équipe. Et oui, il  faut y penser. Jeff nous a conseillé de &lt;span style="font-weight: bold;"&gt;ne pas charger à plus de  70% de leur capacité les membres de l'équipe&lt;/span&gt; et à veiller à ce  qu'ils ne fassent pas trop d'heures. En effet, stress ou fatique =  rework. Rework = surcoût, etc..., etc...&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Enfin, j'en ai fini pour la présentation générale du « framework » Scrum. Place au jeu à préssent.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: center;"&gt;&lt;span style="color: rgb(153, 153, 153); font-weight: bold;font-family:courier new;font-size:130%;"  &gt;Le planning Poker&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_N271C0FJSQg/Stb-_lmfTlI/AAAAAAAAALs/ikzg24kk8Ic/s1600-h/Photo_100209_006.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_N271C0FJSQg/Stb-_lmfTlI/AAAAAAAAALs/ikzg24kk8Ic/s320/Photo_100209_006.jpg" alt="" id="BLOGGER_PHOTO_ID_5392777972201508434" border="0" /&gt;&lt;/a&gt;C'est l'un des temps forts pour moi de cette formation. L'objectif est d'&lt;b&gt;estimer la réalisation de chaque User Story&lt;/b&gt;. Seule l'équipe joue; pas le Product Owner. Première étape, distribution des cartes. Chaque joueur  a en main une série de carte dont les chiffres sont une adaptation libre de la &lt;b&gt;suite de Fibonacci&lt;/b&gt;. On place une User Story au milieu de la table. Chacun met une carte indiquant son estimation de charge. On retourne toutes les cartes et on compare les résultats. Si il y a &lt;b&gt;moins de 3 points d'écart&lt;/b&gt; entre les cartes, la charge de la User Story sera la moyenne de toutes les cartes. Si il y a &lt;b&gt;plus de 3 points d'écart&lt;/b&gt;, c'est que l'objectif de la User Story n'est pas compris par toute l'équipe. Dans ce cas, on en discute puis on revote. Et ainsi de suite.... Cela peut paraître étrange mais c'est terriblement efficace.  &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;  &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;A la fin de notre exercice, toute la table était d'accord sur le chiffrage et sur ce qu'elle allait faire. Le planning Poker est un bel exemple de travail d'équipe. J'ai beaucoup apprécié.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p  style="margin-bottom: 0cm; font-weight: bold; color: rgb(153, 153, 153); text-align: center;font-family:courier new;"&gt;&lt;span style="font-size:130%;"&gt;Calculer la valeur d'un Sprint Point en jours,&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm; font-weight: bold; color: rgb(153, 153, 153); text-align: center;font-family:courier new;"&gt;&lt;span style="font-size:130%;"&gt; heures, minutes, secondes...&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Ah, c'est bien beau de faire du poker et de distribuer des Sprint Points mais il y a bien un moment où il va falloir convertir tout ça en temps; notamment pour savoir combien de Sprint Points vous allez pouvoir espérer réaliser pendant un Sprint. Voilà ce que nous a appris Jeff sur le sujet :&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Prenez votre plus petite User Story (celle qui est estimée à 1) et découpez la en tâches toutes petites. Toute l'équipe estime alors en temps la charge pour réaliser toutes ces « pitites » tâches. Faites la somme de tout ça et Bingo! Vous avez la valeur d'un Sprint Point.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Je ne vous cache pas que je suis un peu sceptique sur la méthode de calcul. Prendre le plus petit pour l'extrapoler au plus grand... Bon, de toute façon, comme je ne sais pas comment faire autrement, je vais m'en tenir à cela pour le moment.  &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p  style="margin-bottom: 0cm; font-weight: bold; color: rgb(153, 153, 153); text-align: center;font-family:courier new;"&gt;&lt;span style="font-size:130%;"&gt;Calculer la vélocité de l'équipe&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Pour rappel, la vélocité de l'équipe est le nombre de Sprint Points qu'elle peut réaliser dans un Sprint. Ca peut paraître bête à rappeler mais &lt;b&gt;la vélocité peut changer d'un Sprint à l'autre&lt;/b&gt;. Pourquoi? Tout simplement en fonction des congés ou indisponibilité des uns et des autres.  &lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Bon, commençons simplement. Dès lors qu'on connait la durée d'un Sprint, la taille de l'équipe et la valeur en temps d'un Sprint Point, le calcul le plus simple est le suivant :&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;div style="text-align: justify; font-family: courier new;"&gt; &lt;/div&gt;&lt;div style="text-align: justify; font-family: courier new;"&gt; &lt;/div&gt;&lt;p  style="margin-bottom: 0cm; text-align: left; color: rgb(0, 102, 0);font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;Vélocité brute de fonderie = &lt;/span&gt;&lt;span style="font-size:85%;"&gt;nombre de jours-homme sur le Sprint / valeur en temps d'un Sprint Point&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify; font-family: courier new;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Jusque là, tout va bien. Maintenant, Jeff nous a précisé que l&lt;span style="font-weight: bold;"&gt;e Scrum Master ne doit pas être considéré comme développant à plus de 50%&lt;/span&gt;. Donc, pour une équipe de 5 personnes, seuls 4,5 sont prix en compte.&lt;/p&gt;&lt;div style="text-align: justify; font-family: courier new; color: rgb(0, 102, 0);"&gt;  &lt;/div&gt;&lt;p  style="margin-bottom: 0cm; text-align: justify; color: rgb(0, 102, 0);font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;Nombre de JH corrigé = durée du Sprint x (nombre de personnes dans l'équipe - 0.5)&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Ensuite, il a rajouté deux choses : soit le ScrumMaster connait l'équipe est dans ce cas, il en connait déjà sa vélocité (le « &lt;b&gt;yesterday's weather&lt;/b&gt; » comme on dit dans l'métier...), soit l'équipe est nouvelle et, dans ce cas, on applique des ratios de facto.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; color: rgb(204, 102, 0); text-align: justify;"&gt;Cas 1 : l'équipe est nouvelle&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Jeff nous propose d'appliquer deux ratios simples. &lt;b&gt;Pour le premier Sprint, on plafonne la vélocité à 60% de sa valeur théorique. Pour le second, on passe à 70% et dès le troisième, on est à 100%&lt;/b&gt;.&lt;/p&gt;&lt;p  style="margin-bottom: 0cm; text-align: justify; color: rgb(0, 102, 0);font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;Vélocité théorique = &lt;/span&gt;&lt;span style="font-size:85%;"&gt;nombre de JH corrigé&lt;/span&gt;&lt;span style="font-size:85%;"&gt; / valeur en temps d'un Sprint Point&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm; text-align: justify; color: rgb(0, 102, 0);font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;Vélocité Sprint 1 = velocité théorique - 40%&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm; text-align: justify; color: rgb(0, 102, 0);font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;Vélocité Sprint 2 = vélocité théorique - 30%&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;span style="color: rgb(0, 102, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;Vélocité dès le Sprint 3 = vélocité théorique&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; font-style: italic; color: rgb(153, 153, 153); text-align: justify;"&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm; font-style: italic; color: rgb(153, 153, 153); text-align: justify;"&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;     &lt;style type="text/css"&gt;  &lt;!--   @page { margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;/div&gt;&lt;div style="text-align: justify; color: rgb(102, 102, 102);"&gt; &lt;/div&gt;&lt;div style="text-align: justify; color: rgb(102, 102, 102);"&gt;&lt;blockquote&gt;  &lt;/blockquote&gt;&lt;/div&gt;&lt;p style="margin-bottom: 0cm; font-style: italic; color: rgb(102, 102, 102); text-align: justify;"&gt;Exemple : une équipe de 5 personnes sur des sprints de 2 semaines. La valeur d'1 point est de 1,5 jours. Je pense ne charger le ScrumMaster qu'à 50%.&lt;/p&gt;&lt;p style="margin-bottom: 0cm; font-style: italic; color: rgb(102, 102, 102); text-align: justify;"&gt;Vélocité théorique = 4,5 x 5 x 2 / 1,5  = 30&lt;/p&gt;&lt;p style="margin-bottom: 0cm; font-style: italic; color: rgb(102, 102, 102); text-align: justify;"&gt;Vélocité Sprint 1 = 30 - 40% = 18&lt;/p&gt;&lt;p style="margin-bottom: 0cm; font-style: italic; color: rgb(102, 102, 102); text-align: justify;"&gt;Vélocité Sprint 2 = 30 - 30% = 21&lt;/p&gt;&lt;p style="margin-bottom: 0cm; font-style: italic; color: rgb(102, 102, 102); text-align: justify;"&gt;Vélocité dès le Sprint 3 = vélocité théorique = 30&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style="margin-bottom: 0cm; color: rgb(204, 102, 0); text-align: justify;"&gt;Cas 2 : l'équipe a de la bouteille (yesterday's weather)&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Dans le cas d'une équipe dont la vélocité est connue, il suffit d'appliquer une règle de 3 pour calculer la vélocité du Sprint à venir en fonction du nombre de jours-homme travaillés. Et voilà que j'introduit un nouveau terme : le &lt;span style="font-weight: bold;"&gt;Focus Factor&lt;/span&gt;.&lt;/p&gt;&lt;p  style="margin-bottom: 0cm; text-align: justify; color: rgb(0, 102, 0);font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm; text-align: justify; color: rgb(0, 102, 0);font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;Focus Factor = &lt;/span&gt;&lt;span style="font-size:85%;"&gt;                vélocité précédente / nombre de JH réalisés &lt;/span&gt;&lt;/p&gt;&lt;p  style="margin-bottom: 0cm; text-align: justify; color: rgb(0, 102, 0);font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;Vélocité prochain Sprint = nombre de JH prochain Sprint x Focus Factor&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm; text-align: justify; font-style: italic; color: rgb(102, 102, 102);"&gt;Exemple : Reprenons l'équipe de 5 personnes précédente. Le nombre de points réalisés dans le Sprint précédent où les semaines étaient complètes est de 30. Imaginons maintenant que, dans le Sprint à venir, il y a un jour férié. Le nombre de jours-homme à venir sera de 4,5 x 5 + 4,5 x 4 = 40,5. Si pour 45 jours-homme, la vélocité était de 30, alors pour 40,5, elle sera de 40,5 x 30 / 45 = 27.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Enfin, tout ça n'est jamais qu'une règle de 3....  Scrum reste avant tout du bon sens avec un peu de bling-bling dessus.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; font-weight: bold; color: rgb(0, 153, 0); text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p  style="margin-bottom: 0cm; font-weight: bold; color: rgb(153, 153, 153); text-align: center;font-family:courier new;"&gt;&lt;span style="font-size:130%;"&gt;Que faire quand le projet dérape ?&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;C'est une question qui est revenue souvent pendant les deux jours de formation. A cette question, Jeff propose de faire les choses suivantes (dans l'ordre) :&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;ol style="text-align: justify;"&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Trouver ce qui ne va pas. Pour  cela, Jeff nous a fait travailler sur le « &lt;a href="http://curiouscat.com/management/a3.cfm"&gt;&lt;b&gt;Toyota A3  Process&lt;/b&gt;&lt;/a&gt; ». Dans la pratique, l'exercice qu'il nous a  demandé consiste à mettre à plat un problème sur une feuille A3  organisée en zones bien distinctes. Chaque zone permet d'aller peu  plus loin dans la résolution du problème. Une autre technique est  celle du « &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/5_Whys"&gt;5 whys&lt;/a&gt; &lt;/b&gt;». En gros, une personne  expose ce qui ne va pas et on lui demande « pourquoi »  jusqu'à temps qu'elle remonte à la source du problème. Quoi qu'il  en soit, je crois que Jeff a bien été clair : en Scrum , pour être  efficace, il faut éliminer tous les obstacles (quitte à aller au  conflit!). « &lt;b&gt;Remove impediments, remove impediments, remove  impediments!&lt;/b&gt; »&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Trouver quelqu'un pour tester.&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Retirer la User Story du Sprint&lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Si aucune solution ci dessus n'est  satisfaisante, annuler le Sprint!&lt;/p&gt; &lt;/li&gt;&lt;/ol&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Parmi les questions posées par Jeff, il y a eu la suivante : que faire si le Product Owner ne vient jamais au réunions? Réponse : trouver un autre Product Owner. Sachez aussi qu'il peut se faire représenter par un tiers (appelé « proxy »).&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Autre question concernant le Product Owner : que faire si plusieurs Product Owners travaillent sur le projet? (C'est en effet parfois nécessaire lorqu'un Product Owner seul n'est pas suffisant pour fournir assez de matière à l'équipe de développement). Dans ce cas, il faut impérativement un Chief Product Owner neutre pour éviter les conflits d'intérêt.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_N271C0FJSQg/Stca68ZWSsI/AAAAAAAAAM0/ALyeVHYfom0/s1600-h/Photo_100209_024.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_N271C0FJSQg/Stca68ZWSsI/AAAAAAAAAM0/ALyeVHYfom0/s200/Photo_100209_024.jpg" alt="" id="BLOGGER_PHOTO_ID_5392808678746639042" border="0" /&gt;&lt;/a&gt;Que faire si l'équipe fait plus de 10% de support? Avouez que ça vous en bouche un coin ça. Contrairement au Waterfall, Scrum intègre directement les élements perturbateurs de la vraie vie tels que le support. Et Jeff a été assez clair sur le sujet. Il dit : &lt;span style="font-weight: bold;"&gt;dans la pratique, il faut considérer que l'équipe ne travaille réellement qu'à 50% sur le projet. Dans ces 50%, il y a 30% de « new », 10% de « old » (maintenance) et 10% de support&lt;/span&gt;. Si les 10% de maintenance ou de support sont dépassés, le Sprint doit être annulé, les problèmes consignés dans une liste des points bloquants (« impediments list ») et le Sprint doit être replanifié.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Que faire si, dans l'équipe, un membre travaille énormément, refuse de venir aux réunions sous prétexte qu'il fait déjà les ¾ du projet à lui tout seul? Réponse : le sortir de l'équipe. Scrum s'appuie sur la notion d'équipe. Si quelqu'un ne joue pas le jeu, il pénalise l'équipe et réduit sa vélocité. Même s'il est très bon!&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; font-weight: bold; color: rgb(0, 153, 0); text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p  style="margin-bottom: 0cm; font-weight: bold; color: rgb(153, 153, 153); text-align: center;font-family:courier new;"&gt;&lt;span style="font-size:130%;"&gt;Aidez votre Product Owner, il vous le rendra!&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;b&gt;Le Product Owner est indispensable&lt;/b&gt;; alors, autant en prendre soin.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;L'équipe de développement peut l'aider à préparer le Sprint suivant à hauteur de 10% de son temps. Pour que les Sprint s'enchainent, il faut bien de toute façon que le Product Backlog soit à jour. Ainsi, à la moitié du Sprint, commencez à aider votre Product Owner à préparer le Product Backlog pour le Sprint suivant.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Pour sa part, le Product Owner doit vous assister en particulier sur la première moitié du Sprint pour comprendre dans le détail les User Stories.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;N'oubliez pas qu'une User Story « gros grain » peut être découpée en plus petites User Stories du moment qu'elle n'est pas dans le Sprint Backlog en cours. Cela peut notamment permettre de boucher les trous lorsqu'il reste de la place dans le Sprint Backlog en réunion de planification.&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Pour rappel : le Product Owner n'a pas le droit de modifier les User Stories du Sprint Backlog! Paroles de Jeff. En revanche, il peut changer une User Story non réalisée du Product Backlog par une autre de poids équivalent (nombre de Spring Points). C'est le concept « &lt;b&gt;change for free &lt;/b&gt;» de Scrum.&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p  style="margin-bottom: 0cm; font-weight: bold; color: rgb(153, 153, 153); text-align: center;font-family:courier new;"&gt;&lt;span style="font-size:130%;"&gt;Mise en pratique : le XP Game&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_N271C0FJSQg/StcC3jrauwI/AAAAAAAAAMU/3DdvKPiHqEU/s1600-h/Photo_100209_019.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_N271C0FJSQg/StcC3jrauwI/AAAAAAAAAMU/3DdvKPiHqEU/s320/Photo_100209_019.jpg" alt="" id="BLOGGER_PHOTO_ID_5392782232292866818" border="0" /&gt;&lt;/a&gt;Ces deux jours de formation se sont terminés par un XP Game; histoire de mettre en pratique un peu de ce qu'on avait vu jusque là. Le jeu était assez amusant. Pour commencer, il a fallu estimer tout un tas de tâches à réaliser (gonfler des ballons, faire des chapeaux en papier, des châteaux de cartes, etc...). Ensuite, nous avons fait nos réunions de planification pour déterminer ce qu'on allait mettre dans chaque Sprint à venir de façon à obtenir une « Business Value » maximale. en un temps restreint  Puis, place au Sprint, suivi des demos et retrospective. Le tout avec un zeste de concurrence car Jeff comptabilise les Business Points obtenus pour chaque équipe. Autant dire qu'on s'est bien lâchés. A la fin, il y avait des ballons partout au sol et surtout la preuve par l'exemple que toute la théorie Scrum fonctionne. Et oui, on a tenu la vélocité calculée et nos estimations étaient juste. Par dessus tout, j'ai vraiment eu le sentiment de travailler en équipe dans un objectif commun. C'est probablement un point fort de Scrum : ramener l'esprit d'équipe en entreprise.  &lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt; &lt;/div&gt;&lt;p  style="margin-bottom: 0cm; font-weight: bold; color: rgb(153, 153, 153); text-align: center;font-family:courier new;"&gt;&lt;span style="font-size:130%;"&gt;Pour conclure&lt;/span&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;  &lt;/div&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Une très bonne formation même si j'ai senti qu'elle avait du mal à décoller la première demie journée. Au final, je crois que tout le monde aurait bien voulu repartir avec Jeff dans sa valise. Pour preuve, les deux jours se sont terminés par une séance photo avec la star de Scrum. Alors que conclure si ce n'est vous conseiller de suivre cette formation...&lt;/p&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Thanks a lot Jeff.&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;Pour aller plus loin :&lt;br /&gt;&lt;/p&gt;&lt;a href="http://www.infoq.com/resource/news/2007/06/scrum-xp-book/en/resources/ScrumAndXpFromTheTrenches_French.pdf"&gt;http://www.infoq.com/resource/news/2007/06/scrum-xp-book/en/resources/ScrumAndXpFromTheTrenches_French.pdf&lt;/a&gt;&lt;p style="margin-bottom: 0cm; text-align: justify;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-8533767377360778064?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/8533767377360778064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=8533767377360778064' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8533767377360778064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8533767377360778064'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/10/i-realized-i-was-scrumbutt-master.html' title='I realized I was a &quot;ScrumButt&quot; Master'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_N271C0FJSQg/Stb_1A8P0rI/AAAAAAAAAL0/GkYgnHcad2c/s72-c/Photo_100209_002.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-7305987691341589334</id><published>2009-09-24T16:34:00.005+02:00</published><updated>2009-09-24T17:26:19.890+02:00</updated><title type='text'>Use exotic Maven repositories with your local mirror</title><content type='html'>This is a little tip you must know if you have an "in-house" maven repository mirros (such as Artifactory) and if you want to access to an exotic one.&lt;br /&gt;&lt;br /&gt;What's an exotic repository? My definition of that is a repository hosted by a developer isolated somewhere on the web. Of course, it's not a mirror of the official one. By the way, you should not declare it on you "in-house" mirror but simply write the following lines in your pom.xml :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;repositories&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &amp;lt;repository&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        &amp;lt;id&amp;gt;violet.repo&amp;lt;/id&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        &amp;lt;name&amp;gt;Violet's Maven repository (public access)&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        &amp;lt;url&amp;gt;http://violet.sourceforge.net/maven2/repo/&amp;lt;/url&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;    &amp;lt;/repository&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;/repositories&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, imagine you try to retrieve an artefact. Muupp... error! You miss to declare an exclusion in your settings.xml to inform Maven that it should not use your local mirror to get it. Thus, this is an example of what to do :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;" &gt;&amp;lt;mirrors&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;" &gt;    &amp;lt;mirror&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;" &gt;        &amp;lt;id&amp;gt;artifactory&amp;lt;/id&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;" &gt;        &amp;lt;mirrorof&amp;gt;*,!violet,!wicketstuff,!google&amp;lt;/mirrorof&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;" &gt;        &amp;lt;url&amp;gt;http://localserver:8080/artifactory/repo&amp;lt;/url&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;" &gt;        &amp;lt;name&amp;gt;Artifactory&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;" &gt;       &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;" &gt;&amp;lt;/mirror&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 102, 0);font-family:courier new;" &gt;&amp;lt;/mirrors&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You understood the "!" character? M...kay... That's all for today.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-7305987691341589334?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/7305987691341589334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=7305987691341589334' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7305987691341589334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7305987691341589334'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/09/use-exotic-maven-repositories-with-your.html' title='Use exotic Maven repositories with your local mirror'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-2355813824371398798</id><published>2009-09-24T15:03:00.002+02:00</published><updated>2009-09-24T15:05:46.330+02:00</updated><title type='text'>Want to trace network activity of your Microsoft Windows platform?</title><content type='html'>A good starting point is Fiddler :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fiddler2.com"&gt;http://www.fiddler2.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Of course, it's free.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-2355813824371398798?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/2355813824371398798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=2355813824371398798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/2355813824371398798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/2355813824371398798'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/09/want-to-trace-network-activity-of-your.html' title='Want to trace network activity of your Microsoft Windows platform?'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-4650784832304193614</id><published>2009-09-20T22:17:00.002+02:00</published><updated>2009-09-20T22:31:22.629+02:00</updated><title type='text'>Speed Up your FireFox on Linux</title><content type='html'>You can't imagine how Firefox loves to write temporary files. I realized it on my Acer Aspire One with its ugly 8GB SSD. An excellent tip I read on the web consists in mounting a directory in memory and configuring FF to use it.&lt;br /&gt;&lt;br /&gt;Let's go :&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;sudo gedit /etc/fstab&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;Add the following line :&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;In Firefox, open this internal URL :&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;about:config&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/em&gt;Right click to add a new string entry :&lt;br /&gt;&lt;br /&gt;&lt;strong style="font-weight: normal; font-style: italic; color: rgb(0, 153, 0);"&gt;browser.cache.disk.parent_directory&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Set its value to&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);"&gt;/tmp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Reboot your machine and appreciate...&lt;br /&gt;&lt;br /&gt;Of course, this tip is certainly portable on Microsoft Windows with softwares like RamDrive even if I presented it on Linux.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-4650784832304193614?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/4650784832304193614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=4650784832304193614' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4650784832304193614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4650784832304193614'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/09/speed-up-your-firefox-on-linux.html' title='Speed Up your FireFox on Linux'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-103727062936378789</id><published>2009-09-10T16:36:00.002+02:00</published><updated>2009-09-10T16:44:04.138+02:00</updated><title type='text'>Installing an Apache Tomcat cluster</title><content type='html'>I'm currently reviewing some scripts to install a Tomcat cluster. A nice way to do that is to have a common Tomcat installation and the minimum needed for each node. There's a an excellent introduction on the subject by Filip Kanik :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.springsource.com/webinar/large-scale-tomcat-deployments"&gt;http://www.springsource.com/webinar/large-scale-tomcat-deployments&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then, you will find here an example of the run.sh file introduced by Filip :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sirinsevinc.wordpress.com/2009/07/20/deploying-multiple-tomcat-instances/"&gt;http://sirinsevinc.wordpress.com/2009/07/20/deploying-multiple-tomcat-instances/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-103727062936378789?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/103727062936378789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=103727062936378789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/103727062936378789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/103727062936378789'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/09/installing-apache-tomcat-cluster.html' title='Installing an Apache Tomcat cluster'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-6504653992777801987</id><published>2009-07-27T18:03:00.002+02:00</published><updated>2009-07-27T18:11:47.227+02:00</updated><title type='text'>Where is my Tomcat Adapter for WTP in Eclipse 3.5 (Galileo) ?</title><content type='html'>I downloaded Galileo a few days ago. But, when I tried to test my webapp on my favourite Tomcat, I discovered that it missed the corresponding adapter. Wooo... After some searches (thanks to Google), I found the easiest way to install it and (by the way) all the other adapters. From the WTP update site (&lt;a href="http://download.eclipse.org/webtools/updates/"&gt;http://download.eclipse.org/webtools/updates/&lt;/a&gt;), select and install &lt;span style="color: rgb(0, 102, 0);"&gt;JST Server Adapters&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;That's all!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-6504653992777801987?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/6504653992777801987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=6504653992777801987' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/6504653992777801987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/6504653992777801987'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/07/where-is-my-tomcat-adapter-for-wtp-in.html' title='Where is my Tomcat Adapter for WTP in Eclipse 3.5 (Galileo) ?'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-4954015483613779618</id><published>2009-06-30T15:10:00.002+02:00</published><updated>2009-06-30T15:29:26.479+02:00</updated><title type='text'>Move a project from an SVN repository to another one</title><content type='html'>Today, I need to move a project from a first subversion repository to a second one. To do that, you need to have an access to your SVN server.&lt;br /&gt;&lt;br /&gt;So, we will use the following commands :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;svnadmin dump&lt;/span&gt; to backup the repositories (I insist on 'repositories'. I think it's important to have backups of all repos before doing such operations)&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;svndumpfilter&lt;/span&gt; to reduce the backup scope to a single project because the dump can only be done on the entire SVN repository&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;svnadmin load&lt;/span&gt; (I think you can guess what this wonderful command does)&lt;/li&gt;&lt;/ul&gt;To understand this commands, it's important to know that svnadmin uses standard inputs and outputs. Thus, we can combine commands with pipes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Let's save our project (with all its history, tags, branches...)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;svnadmin dump /home/subversion/svn/repo/ | svndumpfilter include myproject &gt; svn.myproject.dump&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now, let's backup our target repository :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;svnadmin dump /home/subversion/svn/new_repo/ &gt; svn.new_repo.dump&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And let's import the project on this target repository :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;cat svn.myproject.dump | svnadmin load /home/subversion/svn/new_repo/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Important note :&lt;/span&gt; when you use svndumpfilter, the keyword you give to the filter is only a prefix. That's very important because if you have similar project names, you must excluse the ones you don't want like that :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(0, 102, 0);"&gt;cat svn.myproject.dump | svndumpfilter exclude myproject2 &gt; svn.myprojectonly.dump&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Wow, that's all!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-4954015483613779618?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/4954015483613779618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=4954015483613779618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4954015483613779618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4954015483613779618'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/06/move-project-from-svn-repository-to.html' title='Move a project from an SVN repository to another one'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-2376303454748641475</id><published>2009-06-17T15:26:00.001+02:00</published><updated>2009-06-17T15:43:40.542+02:00</updated><title type='text'>Modify your host networking interface with Virtual Box OSE 2.0.4</title><content type='html'>In the previous post, I talked about how to start a Windows XP image downloaded from Microsoft to be able to test your web application with Internet Explorer.&lt;br /&gt;&lt;br /&gt;On Ubuntu 8.04 and Virtual Box OSE (Open Source Edition) 2.0.4, there are some fixes to do before being able to work with the hosted mode network interface.&lt;br /&gt;&lt;br /&gt;I took the following instructions from the french Ubuntu forum (&lt;a href="http://forum.ubuntu-fr.org/viewtopic.php?id=217680"&gt;http://forum.ubuntu-fr.org/viewtopic.php?id=217680&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;1) install bridge-utils and uml-utilities (sudo apt-get)&lt;br /&gt;2) add the vboxusers usergroup to your user :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;$ sudo usermod -a -G vboxusers &lt;your_login&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;3) Create a bridge by modifying you /etc/network/interfaces file&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;For DHCP conf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;$ sudo gedit /etc/network/interfaces&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;auto eth0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;iface eth0 inet manual&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;auto breth0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;iface breth0 inet dhcp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;   bridge_ports eth0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;# The loopback network interface&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;auto lo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;iface lo inet loopback&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;For static IP conf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;$ sudo gedit /etc/network/interfaces&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;auto eth0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;iface eth0 inet manual&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;auto breth0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;iface breth0 inet static&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;   bridge_ports eth0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;   address 192.168.0.2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;   netmask 255.255.255.0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;   gateway 192.168.0.1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;# The loopback network interface&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;auto lo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;iface lo inet loopback&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note that your dns should be declared in the /etc/resolv.conf file.&lt;br /&gt;&lt;br /&gt;4) Add your virual interfaces toAjouter vos interfaces virtuelles dans le fichier : /etc/vbox/interfaces&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;$ sudo gedit /etc/vbox/interfaces&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;# Each line should be of the format :&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;# &lt;interface&gt; &lt;user&gt; [&lt;bridge&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;vbox0 &lt;your_login&gt; breth0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;vbox1 &lt;your_login&gt; breth0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;vbox2 &lt;your_login&gt; breth0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;5) Reboot (startup is longer due to this new interfaces)&lt;br /&gt;&lt;br /&gt;6) Open your virtual box settings. Go to network pârameters, Select host interface and declare the following parameters :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;Interface Name : vbox0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;Setup Application : /etc/network/if-pre-up.d/virtualbox-ose&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;Terminate Application : /etc/network/if-post-down.d/virtualbox-ose&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-2376303454748641475?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/2376303454748641475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=2376303454748641475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/2376303454748641475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/2376303454748641475'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/06/modify-your-host-networking-interface.html' title='Modify your host networking interface with Virtual Box OSE 2.0.4'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-8481883244984475444</id><published>2009-06-17T11:02:00.000+02:00</published><updated>2009-06-17T12:39:40.861+02:00</updated><title type='text'>Internet Explorer free under Ubuntu Linux with VirtualBox</title><content type='html'>This is a title I found on a blog (http://www.railsgeek.com/). You all know this kind of crisis when delivering a web application developed on your favourite Linux with FireFox : your piece of software crashes on Internet Explorer. You also know how it's difficult to have a IE quickly running on your Ubuntu. Perhaps you tested IE4Linux but it's an old projet. Thanks to Microsoft (yes, I can say this), you have a solution from now.&lt;br /&gt;&lt;br /&gt;1) Go to the Microsoft download website : &lt;a href="http://www.microsoft.com/downloads"&gt;http://www.microsoft.com/downloads&lt;/a&gt;&lt;br /&gt;2) Enter 'vpc images' in the search text field&lt;br /&gt;3) You will have an answer titled :&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;IE App Compat VHD &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(102, 102, 102);"&gt;VPC Hard Disk Images for testing websites with different Internet Explorer versions on Windows XP and Windows Vista&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;4) Click on the link and download an image (I took IE7-XPSP3.exe)&lt;br /&gt;5) Rename it with the rar extension (ie IE7-XPSP3.rar) and unrar it&lt;br /&gt;6) Install VirtualBox with Synaptic. This excellent software is able to read Microsoft Virtual PC image disk (VHD)&lt;br /&gt;7) The first time you start your Windows, you will probably have a blue screen on processr.sys. So, restart in safe mode with the command prompt.&lt;br /&gt;8) Find and rename processr.sys&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 102, 102);font-family:courier new;" &gt;cd \WINDOWS\system32\drivers&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(102, 102, 102);"&gt;ren processr.sys processr.old &lt;/span&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;9) Reboot and install the Virtual Guest Additions&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(204, 102, 0);"&gt;Ultimate note : after guest additions installation, my VBox crashed and refused to restart due to a problem when accessing to the disk image. To fix this, I found the following solution which consists on converting de Virtual PC disk image to a VMWare one using QEMU like this : &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; color: rgb(102, 102, 102);"&gt;qemu-img convert XP\ SP3\ with\ IE7\ 2009-Apr.vhd -O vmdk XPSP3.vmdk&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-8481883244984475444?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/8481883244984475444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=8481883244984475444' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8481883244984475444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8481883244984475444'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/06/internet-explorer-free-under-ubuntu.html' title='Internet Explorer free under Ubuntu Linux with VirtualBox'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-2180991736598700087</id><published>2009-06-11T17:44:00.000+02:00</published><updated>2009-06-11T17:47:50.579+02:00</updated><title type='text'>In love with my linux shell</title><content type='html'>Just a tiny link to a really interesting website which concentrate common and useful linux command lines :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.commandlinefu.com"&gt;http://www.commandlinefu.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks Marco for this URL!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-2180991736598700087?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/2180991736598700087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=2180991736598700087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/2180991736598700087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/2180991736598700087'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/06/in-love-with-my-linux-shell.html' title='In love with my linux shell'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-7109001830219784339</id><published>2009-06-02T10:46:00.000+02:00</published><updated>2009-06-02T10:48:51.487+02:00</updated><title type='text'>An easy way to export java classpath on linux</title><content type='html'>Simple but powerful, you just need to be in your lib folder and type :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;export CLASSPATH=$(pwd)/*&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That's all!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-7109001830219784339?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/7109001830219784339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=7109001830219784339' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7109001830219784339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7109001830219784339'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/06/easy-way-to-export-java-classpath-on.html' title='An easy way to export java classpath on linux'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-6830954741275811778</id><published>2009-04-10T02:14:00.000+02:00</published><updated>2009-04-10T17:05:32.202+02:00</updated><title type='text'>Zenika Wicket Contest / Concours Wicket Zenika</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-style: italic;"&gt;It's exceptional but I wrote this post in french. It's about a contest which proposed to developed a tiny Apache Wicket project with another framework. I tried to implement it with SmartGWT.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bon et bien voilà : je livre mon appli ZenContact migrée en GWT. Je vous préviens, je ne vais pas trop mâcher mes mots. &lt;a href="http://blog.zenika.com/index.php?post/2009/03/10/Concours-D%C3%A9velopper-une-application-web-en-Wicket3"&gt;L'objectif du concours est assez clair &lt;/a&gt;: refaire une petite appli de gestion de contacts réalisée à l'occasion d'une présentation Wicket au Paris JUG; le tout avec un petit défi en plus car cette présentation menée par Zenika n'a duré qu'une heure.&lt;br /&gt;&lt;br /&gt;Bref, devant l'enthousiasme général, j'ai entrepris de la refaire en GWT. Et comme il fallait aller vite, j'ai choisi de m'appuyer sur des outils et API pour avoir le moins à coder possible. Je fixe rapidement la stack de travail : Eclipse 3.4, Maven 2, SmartGWT. Bon, c'est parti! New maven project -&gt; template gwt. Je teste l'application générée par le plugin Maven. Jusque là tout est OK. Un bonheur.&lt;br /&gt;&lt;br /&gt;Je n'ai jamais travaillé avec SmartGWT mais ça a l'air assez riche. Je garde toujours firefox en arrière plan avec la démo de l'API. Je copie-colle des bouts de code et en 3 heures j'ai mon formulaire, mon tableau éditable, le drag and drop, le date picker  et tout le reste. Pas mal... Je décide d'arrêter là pour le premier jour.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(0, 153, 0);font-size:78%;" &gt;Le code du tableau triable/editable avec drag and drop : impressionnant non?&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);font-size:78%;" &gt;&lt;span style="font-family: courier new;"&gt;contactGrid = new ListGrid();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;contactGrid.setWidth(300);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;contactGrid.setHeight(224);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;contactGrid.setAlternateRecordStyles(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;contactGrid.setShowAllRecords(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;contactGrid.setCanReorderRecords(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;contactGrid.setCanDragRecordsOut(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;contactGrid.setDragDataAction(DragDataAction.COPY);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;contactGrid.setDataSource(this.datasource);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;contactGrid.setAutoFetchData(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;contactGrid.setCanEdit(true);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;contactGrid.setEditEvent(ListGridEditEvent.DOUBLECLICK);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;contactGrid.setEditByCell(true);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le lendemain, je passe à l'intégration des pages de l'application Wicket d'origine dont je reprends les 3 fichiers html. Premier problème : j'ai trois pages. Ca fait 3 modules GWT. Pour rappel, pour les petites applications  GWT, tout se met dans un seul et même module. Tant pis, je conserve les pages; ça sera l'occasion de me lancer dans la communication entre modules, je ne l'ai jamais fait. Pour cela, j'opte pour une solution pipotesque qui consiste par passer par un cookie. En principe, tout doit rouler car j'ai repéré que SmartGWT travaille tout en JavascriptObject transformables en chaines JSON. Vous voyez  où je veux en venir... Et c'est là que les ennuis commencent. Impossible de convertir simplement ma datasource. Je commence à chercher dans la documentation SmartGWT... ah, j'oubliais : il n'y en a pas en dehors de la démo! Je regarde donc du côté de l'API. Le moins que l'on puisse dire, c'est que ça ne manque pas de méthodes. C'est riche, très riche, tellement riche que je ne sais pas quoi en faire. Les petits tours dans le code source me refroidissent vite fait car SmartGWT utilise JSNI à outrance dans la mesure où il ne fait que du wrapping de javascript. Après quelques heures, je trouve la solution. Fin de l'épisode du jour.&lt;br /&gt;&lt;br /&gt;Je laisse le projet de côté pendant quelques jours avant de m'y remettre pour le packager. Je reteste quand même vite fait avant. Et là : deuxième problème. Mon tableau n'affiche plus de données. Bizarre. Je m'arrache les cheveux à coup de debugger. Tout a l'air correct.... Je n'y comprends rien. Je recherche du côté de la démo de SmartGWT et me rends finalement compte d'une ligne récurrente dans pas mal d'exemples de code. Un « setAutoFetchData(true) ». Je teste mon code avec ça : bingo! Ca marche! Je réalise à présent qu'en plus d'être trop riche, SmartGWT n'est pas dans un état fini. Je m'imagine dans un contexte de production à chercher ce genre de bug... Bon,avec tout ça, je n'ai pas eu le temps de packager. J'arrête les frais pour aujourd'hui.&lt;br /&gt;&lt;br /&gt;De retour sur le code, je redécouvre GWT (je n'en fait plus depuis quelques mois). Pour rappel, 1 module compilé = 1 emplacement pour les fichiers générés. Mais avec mes trois pages, ça ne va pas du tout. Par exemple, WelcomePage.html se retrouve dans tous les répertoires et, comme les liens entre les pages restent relatifs à chaque module, je ne peux pas passer d'un module à l'autre. Bref, je recherche comment faire sur le forum GWT et implémente une petite solution assez simple me permettant de ne travailler qu'avec un seul module.&lt;br /&gt;&lt;br /&gt;Enfin, c'est fini! L'application n'est pas complètement bouclée  mais je n'irai pas plus loin. Il est d'ailleurs temps d'écrire mes conclusions sur le projet.&lt;br /&gt;&lt;br /&gt;Tout d'abord, j'ai été impressionné par les progrès d'intégration des développements GWT dans Eclipse. Cela est clairement dû à l'intégration Maven. Et oui, Maven, on peut dire ce qu'on veut dessus mais c'est tout de même l'esperanto de l'IDE.&lt;br /&gt;Ensuite, j'ai été surpris par la rapidité de prise en main de SmartGWT. La démo est bien faite même si le code source montré n'est pas complet et qu'il faut vite télécharger la suite. Ce framework propose des fonctionnalités très poussées. C'est très agréable... au début seulement. Rapidement, on voit bien que l'API est trop riche. Ca part dans tout les sens. Elle n'est pas guidante et c'est dommage car le code produit au final est plutôt satisfaisant. Cela provoque une courbe de développement chaotique. Au premier bug, c'est l'explosion du temps de développement et la chute de cheveux assurée. Et par dessus cela, comme on est sous GWT, le temps de compilation est (très long) et chaque test devient un calvaire.&lt;br /&gt;&lt;br /&gt;Alors, quid de la solution GWT par rapport à la version Wicket? Et bien vous l'aurez compris,  je déconseille l'utilisation de SmartGWT pour le moment. L'API n'est pas mature. Elle a toutefois l'intérêt d'être très bling-bling pour les démos. Pour ce qui est de GWT, l'intérêt se situe sur son orientation « client centric ». Et oui, l'application dans sa version actuelle tourne sur un simple serveur Apache lorsque Wicket demande un Tomcat. Mais quelle lenteur ce compilateur Javascript/Java! Finalement, cette expérience confirme l'avis que m'était fait sur ces deux frameworks :&lt;br /&gt;GWT est un excellent framework pour les applications à  interactivité utilisateur forte. Ses capacités de manipulations des objets DOM et de gestion des évènements du navigateur sont excellentes.&lt;br /&gt;Dans le cas d'une application de gestion classique, Wicket est un choix bien plus judicieux. L'utilisation des « Model », la gestion des conversations, le développement loin de javascript (qui est quand même un vrai langage de merde!), l'intégration Spring, l'internationalisation, le code source clair sont autant de points qui font du développement avec Wicket un vrai bonheur.&lt;br /&gt;&lt;br /&gt;Pour finir en quelques mots : Wicket c'est une Renault. Ca marche plutôt bien au quotidien. GWT, c'est une Ferrari. C'est beau une Ferrari. La super éclate le week-end. Mais pour aller chercher le pain, ce n'est pas forcément le mieux.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Télécharger le projet compilé (à dézipper + trouver le WelcomePage.html) : &lt;a href="http://alexandre.de.pellegrin.googlepages.com/zencontact_gwt.zip"&gt;zencontact_gwt.zip&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;Télécharger le code source : &lt;a href="http://pages.google.com/edit/alexandre.de.pellegrin/zencontact_gwt_src.zip"&gt;zencontact_gwt_src.zip&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-6830954741275811778?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/6830954741275811778/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=6830954741275811778' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/6830954741275811778'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/6830954741275811778'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/04/zenika-wicket-contest-concours-wicket.html' title='Zenika Wicket Contest / Concours Wicket Zenika'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-8708774107046076190</id><published>2009-04-08T13:05:00.000+02:00</published><updated>2009-04-08T13:11:04.919+02:00</updated><title type='text'>Why can I access to port 8080 only from localhost on Ubuntu?</title><content type='html'>To achieve the previous post, I had some problems today to access to my tomcat server from another machine. Ping OK but telnet 8080 KO... Humm, this smells firewall rules. Bingo! I didn't considered iptables as a firewall but it's one!&lt;br /&gt;&lt;br /&gt;So, if you are in a secure network area, you can disable it temporarily with the following command :&lt;br /&gt;&lt;pre style="font-family: courier new;"&gt;&lt;span style="font-size:85%;"&gt;sudo iptables -F&lt;/span&gt;&lt;/pre&gt;You can go further by reading this how-to page : &lt;a href="https://help.ubuntu.com/community/IptablesHowTo"&gt;https://help.ubuntu.com/community/IptablesHowTo&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-8708774107046076190?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/8708774107046076190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=8708774107046076190' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8708774107046076190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8708774107046076190'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/04/why-can-i-access-to-port-8080-only-from.html' title='Why can I access to port 8080 only from localhost on Ubuntu?'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-1632291657857300214</id><published>2009-04-07T17:11:00.000+02:00</published><updated>2009-04-08T09:58:40.748+02:00</updated><title type='text'>TCP Port 80 blocked on Ubuntu</title><content type='html'>While working on project, I had to bind my Tomcat to port 80 (instead of deploying an Apache and configuring its mod_jk). But, as you should know, Unix systems contains default security rules. Ports below 1024 are only allowed to the root user. Humm... it was time to work with iptables!&lt;br /&gt;&lt;br /&gt;The following commands would show you how to add a rule to redirect request on port 80 to port 8080 and how to remove this rule.&lt;br /&gt;&lt;br /&gt;Adding a rule :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;sudo iptables -t nat -I OUTPUT --src 0/0 --dst [YOUR_IP_HERE] -p tcp --dport 80 -j REDIRECT --to-ports 8080&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Saving it :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:85%;" &gt;sudo iptables-save&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Listing rules :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:85%;" &gt;sudo iptables -t nat --line-numbers -n -L&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This will show rules ordered by REDIRECT, PREROUTING, POSTROUTING and&lt;br /&gt;OUTPUT. Each line start wil a number.&lt;br /&gt;&lt;br /&gt;Deleting a rule :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;sudo iptables -t nat -D [REDIRECT, PREROUTING, POSTROUTING or OUTPUT] number&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ex : &lt;span style="font-family: courier new;font-size:85%;" &gt;sudo iptables -t nat -D OUTPUT 1&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-1632291657857300214?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/1632291657857300214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=1632291657857300214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1632291657857300214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1632291657857300214'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/04/tcp-port-80-blocked-on-ubuntu.html' title='TCP Port 80 blocked on Ubuntu'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-4121650582079195789</id><published>2009-02-06T11:14:00.000+01:00</published><updated>2009-02-06T11:22:13.429+01:00</updated><title type='text'>Why is agile software development like teenage sex?</title><content type='html'>Today, Romain Gauthier (OCTO Technology, for the moment) sent me a funny post on Agile development. I really like Agile methods but it's so funny that I had to paste it here :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Why is agile software development like teenage sex?&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;It's on everyone's mind all the time.&lt;/li&gt;&lt;li&gt;Everyone is talking about it all the time.&lt;/li&gt;&lt;li&gt;Everyone thinks everyone else is doing it.&lt;/li&gt;&lt;li&gt;Almost no one is really doing it.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;The few who are doing it are:&lt;/span&gt;&lt;br /&gt;&lt;ul style="font-style: italic;"&gt;&lt;li&gt;doing it poorly&lt;/li&gt;&lt;li&gt;hopeful it will be better next time&lt;/li&gt;&lt;li&gt;not practicing it safely&lt;/li&gt;&lt;/ul&gt;Unfortunately, it sticks to reality... Bahhh, Romain, I hate you. You tried to shake me but I will continue to promote SCRUM.&lt;br /&gt;&lt;br /&gt;Source : &lt;span dir="ltr" id=":r3"&gt;&lt;/span&gt;&lt;a href="http://dnicolet1.tripod.com/agile/index.blog?entry_id=1877790"&gt;http://dnicolet&lt;wbr&gt;1.tripod.com/ag&lt;wbr&gt;ile/index.blog?&lt;wbr&gt;entry_id=187779&lt;wbr&gt;0&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-4121650582079195789?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/4121650582079195789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=4121650582079195789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4121650582079195789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4121650582079195789'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/02/why-is-agile-software-development-like.html' title='Why is agile software development like teenage sex?'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-4615617481075773701</id><published>2009-02-03T09:58:00.000+01:00</published><updated>2009-02-03T10:08:01.466+01:00</updated><title type='text'>How your XML parser can detect encoding?</title><content type='html'>I've just fined a tiny article which describe how XML parsers detect document encoding. I hope you already know this but it always good to read it again. In a few words, parsers use the first document characters which are the same in all xml document and try different ways to read them and evaluate encoding.&lt;br /&gt;&lt;pre&gt;&lt;a href="http://www.xfront.com/specifying-encoding/index.html"&gt;http://www.xfront.com/specifying-encoding/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-4615617481075773701?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/4615617481075773701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=4615617481075773701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4615617481075773701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4615617481075773701'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/02/how-your-xml-parser-can-detect-encoding.html' title='How your XML parser can detect encoding?'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-444910049670337878</id><published>2009-02-02T23:31:00.000+01:00</published><updated>2009-02-02T23:35:58.639+01:00</updated><title type='text'>Stay hungry, Stay foolish!</title><content type='html'>&lt;div&gt;&lt;object width="480" height="381"&gt;&lt;param name="movie" value="http://www.dailymotion.com/swf/k3jURF2xamjarxDza7&amp;amp;related=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.dailymotion.com/swf/k3jURF2xamjarxDza7&amp;amp;related=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="480" height="381"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.dailymotion.com/video/x5m47b_vostfr-steve-jobs-stanford-commence_news"&gt;[VOSTFR] Steve Jobs Stanford Commencement Speech, 2005&lt;/a&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Thanks Mister Jobs! I think that I will listen to you over and over.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-444910049670337878?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/444910049670337878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=444910049670337878' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/444910049670337878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/444910049670337878'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/02/stay-hungry-stay-foolish.html' title='Stay hungry, Stay foolish!'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-8248677183623054841</id><published>2009-01-22T10:13:00.000+01:00</published><updated>2009-01-22T10:27:24.663+01:00</updated><title type='text'>Maven best practices</title><content type='html'>Today, my friend Marco sent me a great blog entry on Maven best practices. In a few words, it says :&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Automate Snapshot Deployment by integrating your project in a CI system (like Hudson)&lt;/li&gt;&lt;li&gt;Isolate Local Repositories using use -Dmaven.repo.local=xxxx option to define the unique local repositories for each build.&lt;/li&gt;&lt;li&gt;Regularly Purge Local Repositories (mvn dependency:purge-local-repository)&lt;/li&gt;&lt;li&gt;Enable Batch Mode with the -B option to reduce log size&lt;/li&gt;&lt;li&gt;Enable Full Stack Traces (-e) when there's a build error&lt;/li&gt;&lt;li&gt;Print Test Failures to Standard Output (in your settings.xml : &lt;properties&gt;&lt;surefire.usefile&gt;true&lt;/surefire.useFile&gt;&lt;/properties&gt;)&lt;/li&gt;&lt;li&gt;Always check for Snapshots (-U option); useful when your project is split in modules and libraries. This ensures you always have the last dependency library release on your project.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Click here to see the full post : &lt;a href="http://blogs.sonatype.com/people/2009/01/maven-continuous-integration-best-practices/"&gt;http://blogs.sonatype.com/people/2009/01/maven-continuous-integration-best-practices/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks Marco!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-8248677183623054841?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/8248677183623054841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=8248677183623054841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8248677183623054841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8248677183623054841'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/01/maven-best-practices.html' title='Maven best practices'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-141396548270462167</id><published>2009-01-06T11:45:00.000+01:00</published><updated>2009-01-06T11:54:29.089+01:00</updated><title type='text'>Making Eclipse look better on Ubuntu</title><content type='html'>I started today to find the simplest way to make my Eclipse look better on Ubuntu. I've got a laptop (so, I'm used to work with an LCD screen). Here is my solution :&lt;br /&gt;&lt;br /&gt;Step 1 : install the ttf-liberation package&lt;br /&gt;Step 2 : open your system-&gt;preferences-&gt;apparence menu. Go to the font tab and change fonts like that :&lt;br /&gt;&lt;br /&gt;Application/Document/Desktop font: Liberation Sans, size 9&lt;br /&gt;Window title font: Liberation Sans Bold, size 10&lt;br /&gt;Fixed with font: Liberation Mono, 10&lt;br /&gt;&lt;br /&gt;Select the LCD screen optimization features (including in the User Details options).&lt;br /&gt;&lt;br /&gt;That's all!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-141396548270462167?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/141396548270462167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=141396548270462167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/141396548270462167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/141396548270462167'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2009/01/making-eclipse-look-better-on-ubuntu.html' title='Making Eclipse look better on Ubuntu'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-3523068672469060656</id><published>2008-11-26T09:40:00.000+01:00</published><updated>2008-11-26T09:43:44.121+01:00</updated><title type='text'>Spelling API</title><content type='html'>Today, my friend Marco gave me a great API which can help on auto completion forms. This spelling API is based on a ternary tree and seems to be a good entry point to build a search engine.&lt;br /&gt;&lt;br /&gt;Thanks Marco!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jaspell.sourceforge.net/"&gt;http://jaspell.sourceforge.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-3523068672469060656?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/3523068672469060656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=3523068672469060656' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/3523068672469060656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/3523068672469060656'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2008/11/spelling-api.html' title='Spelling API'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-5519801165821196475</id><published>2008-11-24T11:48:00.000+01:00</published><updated>2008-11-24T11:52:43.946+01:00</updated><title type='text'>GWT widgets showroom</title><content type='html'>I haven't published any post about GWT for a long time. Today, I found a website showing GWT widgets, panels, listeners... in action. It's great when you have to make choice between two kinds of panel; this site allow you to see their behaviors.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://examples.roughian.com/"&gt;http://examples.roughian.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-5519801165821196475?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/5519801165821196475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=5519801165821196475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5519801165821196475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5519801165821196475'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2008/11/gwt-widgets-showroom.html' title='GWT widgets showroom'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-3520030650276135735</id><published>2008-11-03T14:40:00.000+01:00</published><updated>2008-11-03T14:51:43.576+01:00</updated><title type='text'>Let's talk about design patterns</title><content type='html'>Do you know the difference between Adapter and Decorator patterns?&lt;br /&gt;&lt;br /&gt;These two patterns are made to wrap objects. Humm... Same goals? Not exactly. On the first hand, the Adapter pattern is used to transform your class interface contract to another one. In the real world, you use it to "adapt" your code to an external piece of code you need.&lt;br /&gt;&lt;br /&gt;In the other hand, with the decorator pattern, your class keeps its interface contract. You just wrap your code to bring some new features. For example, you decorate a class to integrate a counter on method calls and perform a performance test.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-3520030650276135735?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/3520030650276135735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=3520030650276135735' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/3520030650276135735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/3520030650276135735'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2008/11/lets-talk-about-design-patterns.html' title='Let&apos;s talk about design patterns'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-5111132885325238515</id><published>2008-10-24T17:48:00.000+02:00</published><updated>2008-10-24T17:49:46.259+02:00</updated><title type='text'>Oracle quick start guide</title><content type='html'>Just a link to an Oracle quick start guide to remember :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.exforsys.com/tutorials/oracle-9i.html"&gt;http://www.exforsys.com/tutorials/oracle-9i.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-5111132885325238515?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/5111132885325238515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=5111132885325238515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5111132885325238515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5111132885325238515'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2008/10/oracle-quick-start-guide.html' title='Oracle quick start guide'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-5001995020843347533</id><published>2008-10-24T11:15:00.001+02:00</published><updated>2011-06-29T10:26:38.401+02:00</updated><title type='text'>IntelliJ shortcuts vs Eclipse shortcuts</title><content type='html'>Recently, I started to work with IntelliJ. But, honestly, after several years with Eclipse, it's hard to be effective because of key shortcuts which are different between the two IDEs. A little request on Google and I found this (great!)  :&lt;br /&gt;&lt;br /&gt;&lt;table style="border: medium none ; border-collapse: collapse;" class="MsoTableGrid" border="1" cellpadding="0" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td style="border: 1pt solid windowtext; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/td&gt; &lt;td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;&lt;strong&gt;Eclipse shortcut&lt;/strong&gt;&lt;/td&gt; &lt;td style="border-style: solid solid solid none; border-color: windowtext windowtext windowtext -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;&lt;strong&gt;IntelliJ Shortcut&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Navigate a Java Type&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;CTRL + ALT + T&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;CTRL + N&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Navigate a Resource&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;CTRL + ALT + R&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;CTRL + SHIFT +N&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Last Modified Source&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;ALT + Left arrow&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;CTRL + ALT + left arrow&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Debug&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;F11&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Shift + F9&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Open Declaration&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;F3&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;CTRL + SHIFT + B&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Open Hierarchy&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;F4&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;CTRL + H&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Organize Imports&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;CRTL + SHIFT + O&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;CTRL + ALT + O&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Find&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;CTRL + F&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;CTRL + F&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Find Again/ previous&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;F3 / SHIFT + F3&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;F3 / SHIFT + F3&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Step Into&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;F5&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;F7&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Step Over&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;F6&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;F8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Step Out&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;F7&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Shift + F8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Resume&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;F8&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;F9&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;To find impl of an abstract Method&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;?&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Ctrl + Alt + B&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td style="border-style: none solid solid; border-color: -moz-use-text-color; border-width: medium 1pt 1pt; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;To find usage&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;CTRL + SHIFT + G&lt;/td&gt; &lt;td style="border-style: none solid solid none; border-color: -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0in 5.4pt; width: 2.05in;" valign="top" width="197"&gt;Alt + F7&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-5001995020843347533?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/5001995020843347533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=5001995020843347533' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5001995020843347533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5001995020843347533'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2008/10/intellij-shortcuts-vs-eclipse-shortcuts.html' title='IntelliJ shortcuts vs Eclipse shortcuts'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-2287189711055481577</id><published>2008-10-23T00:43:00.000+02:00</published><updated>2008-10-23T00:52:01.129+02:00</updated><title type='text'>Let's SCRUM</title><content type='html'>Yes, it's time to start a new project. A classic fact is that user specifications are not yet completely defined. Humm, but I need to start the project. The only solution will be to be agile. So, let's SCRUM. It's the first time for me. I read some docs from the past but I never really tried it.  Thus, I spent this evening reading charts, blogs, etc... I also found a good french video preformed by a SCRUM senior (having 4,000 hours flying on agile projects) :&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;object width="420" height="339"&gt;&lt;param name="movie" value="http://www.dailymotion.com/swf/k3ULJBVkOF2PAmAz7X" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;embed src="http://www.dailymotion.com/swf/k3ULJBVkOF2PAmAz7X" type="application/x-shockwave-flash" width="420" height="339" allowFullScreen="true" allowScriptAccess="always"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.dailymotion.com/swf/k3ULJBVkOF2PAmAz7X"&gt;Planification et gestion de projet informatique : SCRUM&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;i&gt;par &lt;a href="http://www.dailymotion.com/intellicore"&gt;intellicore&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-2287189711055481577?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/2287189711055481577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=2287189711055481577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/2287189711055481577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/2287189711055481577'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2008/10/lets-scrum.html' title='Let&apos;s SCRUM'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-1189424031463092628</id><published>2008-10-20T23:10:00.000+02:00</published><updated>2008-10-20T23:32:20.001+02:00</updated><title type='text'>Google App Engine will support Java</title><content type='html'>Excellent news! There was an empty place on the web : it was barely impossible to find free hosting for java applications. The main reason is certainly due to the runtime heavyweight. For example,  a java apps consume a lot of cpu and i/o charges on JVM startup. Another reason is the total cost ownership of java servers. Let me try a little comparison : if a PHP engine is like a old car (not really powerful but strong for many usages and maintenance free), a Java engine is like a Ferrari : really performant but really horrible to manage, to tune, to maintain, etc... Now imagine that you're at the head of a low cost rental company. What should you prefer : offering PHP cheap engine or Ferrari ones? You see what I mean... But, in the other hand, what's a frustration for millions of java  developers like me! I was forced to program in PHP for my webapps. (and I'm really not a  PHP killer). Hopefully, graceful to Google, you will be able to have online apps using Google App Engine!!! So great, So nice, So... there's no word! Of course, I hope you will use GWT for your frontend...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-1189424031463092628?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/1189424031463092628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=1189424031463092628' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1189424031463092628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1189424031463092628'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2008/10/google-app-engine-will-support-java.html' title='Google App Engine will support Java'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-6390398401827215576</id><published>2008-08-14T14:44:00.000+02:00</published><updated>2008-08-14T14:54:36.654+02:00</updated><title type='text'>Database design</title><content type='html'>Database design is often made by programmers. This is common mistake . Only a few developers know internal db structure  and mechanisms. Let's doing a tiny test :&lt;br /&gt;1) Describe me what's an hash table?&lt;br /&gt;2) Give two link of indexes and when it should be used?&lt;br /&gt;3) What about isolation transaction levels?&lt;br /&gt;OK, OK, I stop here.&lt;br /&gt;&lt;br /&gt;Although db design should be done by specialists, it's never to late to improve our knowledges. Thanks to my friend Marco, I put here a link to a website which published db models. From know, before designing your model, don't forget to check if a similar one already exists.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.databaseanswers.org/"&gt;http://www.databaseanswers.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-6390398401827215576?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/6390398401827215576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=6390398401827215576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/6390398401827215576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/6390398401827215576'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2008/08/database-design.html' title='Database design'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-5000616428313348275</id><published>2008-06-26T22:25:00.000+02:00</published><updated>2008-06-26T22:28:19.320+02:00</updated><title type='text'>GWT : the unofficial Wiki</title><content type='html'>Let's continue in our GWT investigations... I've just found the "unofficial" wiki. It here :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://google.wikia.com/wiki/Google_Web_Toolkit"&gt;http://google.wikia.com/wiki/Google_Web_Toolkit&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-5000616428313348275?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/5000616428313348275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=5000616428313348275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5000616428313348275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5000616428313348275'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2008/06/gwt-unofficial-wiki.html' title='GWT : the unofficial Wiki'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-1391053680014727710</id><published>2008-04-28T11:46:00.000+02:00</published><updated>2008-04-28T11:48:28.651+02:00</updated><title type='text'>A french GWT tutorial</title><content type='html'>Today, I found a post on a blog written like a tutorial. It covers from the installation to deployment on a server.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jl2tho.blogspot.com/2007/09/tutorial-gwt-g0.html"&gt;http://jl2tho.blogspot.com/2007/09/tutorial-gwt-g0.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-1391053680014727710?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/1391053680014727710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=1391053680014727710' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1391053680014727710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/1391053680014727710'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2008/04/french-gwt-tutorial.html' title='A french GWT tutorial'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-4126877745241243852</id><published>2008-04-21T10:31:00.000+02:00</published><updated>2008-04-21T10:31:57.658+02:00</updated><title type='text'>An introduction to GWT</title><content type='html'>I found a PPT introducing GWT. Since it is based on Bruce Johnson and Didier Girard presentations, don't hesitate to read it :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devhive.blogspot.com/2008/04/presentation-introduction-lessons.html"&gt;DevHive :: The Swarm Development Platform: Presentation: Introduction + Lessons Learned Using Google Web Toolkit (GWT)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-4126877745241243852?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://devhive.blogspot.com/2008/04/presentation-introduction-lessons.html' title='An introduction to GWT'/><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/4126877745241243852/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=4126877745241243852' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4126877745241243852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4126877745241243852'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2008/04/introduction-to-gwt.html' title='An introduction to GWT'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-6885462475472907286</id><published>2008-03-13T17:16:00.000+01:00</published><updated>2008-03-13T17:18:15.230+01:00</updated><title type='text'>The Tomcat French Corner</title><content type='html'>Here is a link on french documentation about Tomcat 5.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www-igm.univ-mlv.fr/%7Edr/XPOSE2003/tomcat/tomcat.php"&gt;http://www-igm.univ-mlv.fr/~dr/XPOSE2003/tomcat/tomcat.php&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-6885462475472907286?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/6885462475472907286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=6885462475472907286' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/6885462475472907286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/6885462475472907286'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2008/03/tomcat-french-corner.html' title='The Tomcat French Corner'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-2232682731019212962</id><published>2008-02-06T02:03:00.000+01:00</published><updated>2008-02-06T02:12:16.611+01:00</updated><title type='text'>Feeling sad with Eclipse on Linux</title><content type='html'>Humm, something is broken : my trust in Eclipse quality.&lt;br /&gt;&lt;br /&gt;I recently installed an Ubuntu 7.10 on my laptop. Then I added Eclipse 3.3 with Sun Java 6. After several days (weeks...), it tastes unstable. Not Ubuntu! (Of course)... but Eclipse. Here is a list of problems I encountered :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;problem with VCS (when comparing files with a repository for example)&lt;/li&gt;&lt;li&gt;problem with auto-imports (so I have to use "Reorganize imports" instead&lt;/li&gt;&lt;li&gt;problem with Java and Debug perspectives that change views positions by itself&lt;/li&gt;&lt;li&gt;something, Eclipse goes slowly during a few seconds (???)&lt;/li&gt;&lt;li&gt;and... the ugly big fonts they use that make my 17 inches screen looking like a 15 inches one.&lt;/li&gt;&lt;/ul&gt;So, I hope Eclipse 3.4 will fix that (or I will go back to the Win32 version. Hopefully VMWare exists)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-2232682731019212962?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/2232682731019212962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=2232682731019212962' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/2232682731019212962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/2232682731019212962'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2008/02/feeling-sad-with-eclipse-on-linux.html' title='Feeling sad with Eclipse on Linux'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-836106153749244789</id><published>2007-12-06T15:16:00.000+01:00</published><updated>2007-12-06T15:21:41.469+01:00</updated><title type='text'>Make beautiful presentations</title><content type='html'>It's always the same headache : you have to make a presentation and want it to look professional. Don't worry, pick up a PowerPoint template on Microsoft site :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://office.microsoft.com/en-us/templates/default.aspx"&gt;http://office.microsoft.com/en-us/templates/default.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-836106153749244789?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/836106153749244789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=836106153749244789' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/836106153749244789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/836106153749244789'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2007/12/make-beautifull-presentation.html' title='Make beautiful presentations'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-7201167316140739173</id><published>2007-11-05T11:48:00.000+01:00</published><updated>2007-11-05T11:54:10.559+01:00</updated><title type='text'>13949712720901ForOSX (we want Java 6 on MacOS X)</title><content type='html'>Last week, Apple publishede a new release of its famous MacOS. But... why?.... don't uderstand... where is Java 6? It seems to be an Apple decision not to include Java on its new platform. By the way, Henry Story invited all blogger to put an entry in their blog to protest against this situation.&lt;br /&gt;&lt;br /&gt;So  : 13949712720901ForOSX&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.sun.com/bblfish/entry/vote_for_java6_on_leopard"&gt;http://blogs.sun.com/bblfish/entry/vote_for_java6_on_leopard&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.javalobby.org/java/forums/t103042.html"&gt;http://www.javalobby.org/java/forums/t103042.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-7201167316140739173?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/7201167316140739173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=7201167316140739173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7201167316140739173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7201167316140739173'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2007/11/13949712720901forosx-we-want-java-6-on.html' title='13949712720901ForOSX (we want Java 6 on MacOS X)'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-998819869092632154</id><published>2007-06-13T18:03:00.001+02:00</published><updated>2007-06-13T18:13:17.044+02:00</updated><title type='text'>Debugging with Samuraï</title><content type='html'>Samuraï is a piece of software starting with Java Web Start and reading Core dumps.&lt;br /&gt;&lt;br /&gt;So when you're application is frozen, run a kill -3 [pid] to obtain a core dump and drag'n drop it into Samuraï. This will help you to qualify bugs.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://yusuke.homeip.net/samurai/?english"&gt;http://yusuke.homeip.net/samurai/?english&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-998819869092632154?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/998819869092632154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=998819869092632154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/998819869092632154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/998819869092632154'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2007/06/debugging-with-samura.html' title='Debugging with Samuraï'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-5041541547306332894</id><published>2007-05-30T14:10:00.000+02:00</published><updated>2007-05-30T14:12:41.721+02:00</updated><title type='text'>A mapping framework...</title><content type='html'>I've just discovered a new mapping framework with many possibilities for mapping beeans to beans or maps to beans or anything else.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dozer.sourceforge.net/"&gt;http://dozer.sourceforge.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-5041541547306332894?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/5041541547306332894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=5041541547306332894' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5041541547306332894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5041541547306332894'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2007/05/mapping-framework.html' title='A mapping framework...'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-7564118100774862281</id><published>2007-04-16T15:19:00.000+02:00</published><updated>2007-04-16T15:27:05.271+02:00</updated><title type='text'>ITIL : new ideas, new directions...</title><content type='html'>I spoke with a friend who tells me about ITIL. ITIL agregates best practices in computer sciences (not only technical, but management, financial...). I think I will have a close study on it. So, I added two interesting links (the first one is in french, sorry for english people)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.itsmf.fr/"&gt;http://www.itsmf.fr/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span chatdir="1"&gt;&lt;/span&gt;&lt;a href="http://www.itil.co.uk/" onclick="return top.js.OpenExtLink(window,event,this)" target="_blank"&gt;http://www.itil&lt;wbr&gt;.co.uk/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-7564118100774862281?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/7564118100774862281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=7564118100774862281' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7564118100774862281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/7564118100774862281'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2007/04/new-ideas-new-directions.html' title='ITIL : new ideas, new directions...'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-5157982060668912519</id><published>2007-04-03T14:54:00.000+02:00</published><updated>2007-04-03T14:59:16.103+02:00</updated><title type='text'>Technical video presentations</title><content type='html'>My friend Marc Godin sent me a link on a website publishing technical présentation videos. I'm sorry but you will probably have to stop watching Desperate Housewifes!&lt;br /&gt;&lt;br /&gt;So, that's it :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.parleys.com"&gt;http://www.parleys.com&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-size:-1;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-5157982060668912519?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/5157982060668912519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=5157982060668912519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5157982060668912519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/5157982060668912519'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2007/04/technical-video-presentations.html' title='Technical video presentations'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-8012247672307069149</id><published>2007-02-02T17:19:00.000+01:00</published><updated>2007-02-02T17:26:03.584+01:00</updated><title type='text'>Agile project management</title><content type='html'>Here is an article (in french about a project management approach). I just read a few words about it but it seems to be interesting. My opinion is that a project manager has to be a "real" member of his team and not upon it. When I was team leader, I tried to be like that : a "real" member. In fact, this project was good and work was efficient. It was a "real" team.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.valtech-mag.com/mag/fr/1.html"&gt;http://www.valtech-mag.com/mag/fr/1.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-8012247672307069149?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/8012247672307069149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=8012247672307069149' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8012247672307069149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8012247672307069149'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2007/02/agile-project-management.html' title='Agile project management'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-4018303387872730318</id><published>2007-01-21T00:39:00.000+01:00</published><updated>2007-01-21T00:49:01.633+01:00</updated><title type='text'>Managing text encoding in Java properties files</title><content type='html'>Something interesting when you write a software is to translate it. Java has this feature embedded. You simply have to write properties files and use a resource bundle to extract texts in your program. Consult ResourceBundle class javadoc for more information about how to proceed.&lt;br /&gt;&lt;br /&gt;Something else very ineresting in about properties file encoding. Java specification supposes this sort of files to be written in ISO-8859-1. Oops! What about translating my software into japaneese?  No problem, you cas use "unicode" codes in your files.&lt;br /&gt;&lt;br /&gt;For exemple, to translate é, replace it by \u00E9 in your properties file. You can consult www.encoding.org for more informations aboiut encodings.&lt;br /&gt;&lt;br /&gt;Thus, if you want to retreive characters codes,  I propose you think  excellent web page (in french) :&lt;br /&gt;&lt;a href="http://hapax.qc.ca/conversion.fr.html"&gt;http://hapax.qc.ca/conversion.fr.html &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-4018303387872730318?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/4018303387872730318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=4018303387872730318' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4018303387872730318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4018303387872730318'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2007/01/managing-text-encoding-in-java.html' title='Managing text encoding in Java properties files'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-8650180121079285459</id><published>2007-01-03T15:04:00.000+01:00</published><updated>2007-01-03T15:06:14.606+01:00</updated><title type='text'>Speed up Microsoft Windows XP explorer</title><content type='html'>Something very boring : Microsoft Windows XP explorer inspects zip files. This could really decrease performaces.&lt;br /&gt;&lt;br /&gt;So ...&lt;br /&gt;&lt;p&gt;If you want to turn of WindowsXP showing Zip files as folders,&lt;br /&gt;just run:&lt;/p&gt;  &lt;p&gt;&lt;i&gt;regsvr32 /u zipfldr.dll&lt;/i&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-8650180121079285459?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/8650180121079285459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=8650180121079285459' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8650180121079285459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/8650180121079285459'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2007/01/speed-up-microsoft-windows-xp-explorer.html' title='Speed up Microsoft Windows XP explorer'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-3207855691307309753</id><published>2007-01-02T17:42:00.000+01:00</published><updated>2007-01-02T17:43:31.087+01:00</updated><title type='text'>An excellent article on functional programming</title><content type='html'>&lt;a href="http://www.defmacro.org/ramblings/fp.html"&gt;http://www.defmacro.org/ramblings/fp.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks Marco!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-3207855691307309753?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/3207855691307309753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=3207855691307309753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/3207855691307309753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/3207855691307309753'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2007/01/excellent-article-on-functional.html' title='An excellent article on functional programming'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-4445749250200795206</id><published>2007-01-02T11:53:00.000+01:00</published><updated>2007-01-02T11:59:40.650+01:00</updated><title type='text'>Calendar OGNL expression for Luntbuild</title><content type='html'>Wow, that's my first message with year that I started with Luntbuild. I looked for an ognl expression to preform build only in a specific time range.&lt;br /&gt;&lt;br /&gt;So, after reading the documentation and surfing on forums, I found the class OGNLHelper on Luntbuild CVS repository. Bingo!&lt;br /&gt;&lt;br /&gt;Here is a exemple of a expression that returns true in a specific time range :&lt;br /&gt;(system.getHour() in {0,1,2,3,4,5,6})&lt;br /&gt;&lt;br /&gt;In this example, build will be done betwenn midnight and 6:00am.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-4445749250200795206?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/4445749250200795206/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=4445749250200795206' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4445749250200795206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/4445749250200795206'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2007/01/calendar-ognl-expression-for-luntbuild.html' title='Calendar OGNL expression for Luntbuild'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-116522654871160217</id><published>2006-12-04T10:53:00.000+01:00</published><updated>2006-12-04T11:05:38.543+01:00</updated><title type='text'>How to force decimal separator char upon java region code?</title><content type='html'>Java application could be run on any compliant platform. And that's great. But, when you provide it to your customer, you don't know the region code of his server. For exemple, you don't know if is configured to work in english or french.&lt;br /&gt;&lt;br /&gt;By the way, let's take the previous example. In franch, decimal separator char is ',' (comma). In english, it is '.' (dot). When prensenting data to end user, you probably want to ensure that the decimal separator char is the right. So, you can for it usiing DecimalFormat.&lt;br /&gt;&lt;br /&gt;Let's see it in the following code :&lt;br /&gt;&lt;br /&gt;public class AfficheurDecimal {&lt;br /&gt;&lt;br /&gt;public AfficheurDecimal() {&lt;br /&gt;testerReste(100);&lt;br /&gt;testerReste(0);&lt;br /&gt;testerReste(12354.12854);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void testerReste(double reste) {&lt;br /&gt;if (reste != 0) {&lt;br /&gt;DecimalFormat formatEntier = new DecimalFormat("0.00");&lt;br /&gt;DecimalFormatSymbols symbols = formatEntier.getDecimalFormatSymbols();&lt;br /&gt;symbols.setDecimalSeparator(',');&lt;br /&gt;formatEntier.setDecimalFormatSymbols(symbols);&lt;br /&gt;String msg = "Il reste " + formatEntier.format(reste) + " à ventiler";&lt;br /&gt;System.out.println(msg);&lt;br /&gt;}&lt;br /&gt;if (reste == 0) {&lt;br /&gt;System.out.println("Pas de reste");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Auteur : a.depellegrin&lt;br /&gt;&lt;br /&gt;* Définition :&lt;br /&gt;&lt;br /&gt;* @param args&lt;br /&gt;*/&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;new AfficheurDecimal();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;That's all!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-116522654871160217?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/116522654871160217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=116522654871160217' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116522654871160217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116522654871160217'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/12/how-to-force-decimal-separator-char.html' title='How to force decimal separator char upon java region code?'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-116341518494065996</id><published>2006-11-13T11:45:00.000+01:00</published><updated>2006-11-13T11:53:04.950+01:00</updated><title type='text'>Multibase application could be like in the song : it's just an illusion</title><content type='html'>Today, my friend and excellent architect Marc Godin told me something very interesting that sumarize an illusion that java introduced with its virtual machine. He said :&lt;br /&gt;&lt;br /&gt;&lt;span chatdir="1"&gt;&lt;span style="font-style: italic; font-family: times new roman;"&gt;"L'adhérence a la base de donnée est à acter comme celle à la JVM"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sorry, it's in french. BTW, the text tells that you had to choose your database as you chose you JVM.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-116341518494065996?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/116341518494065996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=116341518494065996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116341518494065996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116341518494065996'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/11/multibase-application-could-be-like-in.html' title='Multibase application could be like in the song : it&apos;s just an illusion'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-116281831047912562</id><published>2006-11-06T14:04:00.000+01:00</published><updated>2006-11-06T14:05:10.500+01:00</updated><title type='text'>Testing frameworks</title><content type='html'>A good repository :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.opensourcetesting.org"&gt;http://www.opensourcetesting.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-116281831047912562?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/116281831047912562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=116281831047912562' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116281831047912562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116281831047912562'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/11/testing-frameworks.html' title='Testing frameworks'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-116247835480776758</id><published>2006-11-02T15:36:00.000+01:00</published><updated>2006-11-02T15:42:38.660+01:00</updated><title type='text'>Special caracters in HTML</title><content type='html'>Something very usefull :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.commentcamarche.net/html/htmlcarac.php3"&gt;http://www.commentcamarche.net/html/htmlcarac.php3&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-116247835480776758?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/116247835480776758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=116247835480776758' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116247835480776758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116247835480776758'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/11/special-caracters-in-html.html' title='Special caracters in HTML'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-116230622716062262</id><published>2006-10-31T15:47:00.000+01:00</published><updated>2006-10-31T16:45:54.466+01:00</updated><title type='text'>Why primitive types are unprecises? the unacceptable explaination...</title><content type='html'>Another excellent article by Brian Goetz on numerical java data type storing. It's just a question of IEEE 754. So, don't expect to work with primitive types in Java for finacial applications. Such a pity! My old Casio FX-7000 is more powerfull than my computer.&lt;br /&gt;&lt;br /&gt;Financial programs represents a major part of softwares all over the world. If you want my opinion, its unacceptable to have to work with wrapped types!!!&lt;br /&gt;&lt;br /&gt;James Goslin, any solution? You're welcome if you have one.&lt;br /&gt;&lt;a href="http://www-128.ibm.com/developerworks/java/library/j-jtp0114/"&gt;&lt;br /&gt;http://www-128.ibm.com/developerworks/java/library/j-jtp0114/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-116230622716062262?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/116230622716062262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=116230622716062262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116230622716062262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116230622716062262'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/10/why-primitive-types-are-unprecises.html' title='Why primitive types are unprecises? the unacceptable explaination...'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-116195954075136090</id><published>2006-10-27T16:26:00.000+02:00</published><updated>2006-10-27T16:32:20.766+02:00</updated><title type='text'>Open ESB</title><content type='html'>Great news,&lt;br /&gt;&lt;br /&gt;I just learnt that Sun launched an open source ESB project with a tool suite for NetBeans. This fact of having developped graphical tools to design processes and mappings is a very (VERY)  important point in my point of view. Something tells me that, if the product is well done, the situation will be harder for webMethods in several months.&lt;br /&gt;&lt;br /&gt;I will publish my Violet UML Editor as quickly as possible to investigate on it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.netbeans.org/kb/55/bpel_gsg_project.html"&gt;http://www.netbeans.org/kb/55/bpel_gsg_project.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://open-esb.dev.java.net/"&gt;http://open-esb.dev.java.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-116195954075136090?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/116195954075136090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=116195954075136090' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116195954075136090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116195954075136090'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/10/open-esb.html' title='Open ESB'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-116116580821673645</id><published>2006-10-18T12:00:00.000+02:00</published><updated>2006-10-18T12:03:28.243+02:00</updated><title type='text'>Oracle error codes</title><content type='html'>Just a list with Oracle error codes :&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;&lt;span style="font-size: 10pt; font-family: Arial;"&gt;&lt;a href="http://www.oracle.com/pls/db92/db92.error_search"&gt;http://www.oracle.com/pls/db92/db92.error_search&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-116116580821673645?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/116116580821673645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=116116580821673645' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116116580821673645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116116580821673645'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/10/oracle-error-codes.html' title='Oracle error codes'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-116067158318812652</id><published>2006-10-12T18:40:00.000+02:00</published><updated>2006-10-12T18:46:23.210+02:00</updated><title type='text'>Searching files on unix</title><content type='html'>Want to find files and perform massives operations on them, here are tws sample commands for unix platforms :&lt;br /&gt;&lt;br /&gt;find -name "[filename]"&lt;br /&gt;&lt;br /&gt;find -name "[filename]" -exec [command] '{}' \;&lt;br /&gt;&lt;br /&gt;where [filename] and [command] should be replaced by real values. [command] is another unix command to execute on each file found. The file found is represented by '{}' in the command to execute. \; indicates to end of the command.&lt;br /&gt;&lt;br /&gt;Ex : find -name "*.tmp" -exec rm '{}' \; -&gt; deletes all tmp files.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-116067158318812652?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/116067158318812652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=116067158318812652' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116067158318812652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116067158318812652'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/10/searching-files-on-unix.html' title='Searching files on unix'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-116006218581253167</id><published>2006-10-05T17:26:00.000+02:00</published><updated>2006-10-05T17:29:45.826+02:00</updated><title type='text'>CVS activity : extract history for a user and from a date</title><content type='html'>cvs -d :pserver:[user]@[server]:/[repository] log -d "&gt;2006-09-28" -w[user]&lt;br /&gt;&lt;br /&gt;where&lt;br /&gt;[user] is the username&lt;br /&gt;[server] your server location&lt;br /&gt;[repository] the CVS repositpry url&lt;br /&gt;&lt;br /&gt;Of course, don't forget to change the date!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-116006218581253167?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/116006218581253167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=116006218581253167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116006218581253167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/116006218581253167'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/10/cvs-activity-extract-history-for-user.html' title='CVS activity : extract history for a user and from a date'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-115979564805174319</id><published>2006-10-02T15:25:00.000+02:00</published><updated>2006-10-02T15:27:28.063+02:00</updated><title type='text'>Hibernate 3 and Oracle 9i cursors : how does it work?</title><content type='html'>Here is a post I found on the hibernate forum. It explains why cursors opened are not released on session.close()  :&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-family: times new roman;" class="postbody"&gt;OK. Here's the result of this thread:&lt;br /&gt;&lt;br /&gt;For the environment, JDK1.4.2_01, Oracle 9i server, oracle 9i jdbc driver (ojdbc14.jar) and oci connection to the database (not thin driver);&lt;br /&gt;&lt;br /&gt;There's &lt;span style="text-decoration: underline;"&gt;no&lt;/span&gt; problem with hibernate's prep stmt cache nor with Oracle Jdbc driver with regard to cursors remaining open after Session.close().&lt;br /&gt;&lt;br /&gt;Every Session.iterate() and Session.load() calls cause a prep stmt to be created on the server side. And after you close the session with Session.close(), hibernate explicitly calls appropriate driver methods to close the resultsets and prepared statements.&lt;br /&gt;&lt;br /&gt;However, after you close the session, you won't see the cursors de-allocated (or closed) on the server side. While it seems to be a bug, it actually is not. The driver maintains a list of prep statements and open cursors in its memory and as soon as you re-use the same connection by opening a session on that very same connection, you'll see that the previous cursors and prep statements will go away.&lt;br /&gt;&lt;br /&gt;To check this behaviour, open a session, run a few Sesson.load(), Session.iterate() methods and then call Session.close(). Run the below query and you'll see that the cursors are still there (in the statistic 'opened cursors current').&lt;br /&gt;&lt;br /&gt;select n.*,s.* from v$sesstat s, v$statname n where s.statistic#=n.statistic# and sid=23 and n.name like '%cursor%'&lt;br /&gt;&lt;br /&gt;However, in the same program, after the above calls, if you &lt;br /&gt;call SessionFactory.getSession() and grab the same jdbc connection from the pool; &lt;br /&gt;as soon as you call Session.load() or Session.iterate(), you'll see that the number of open cursors will be 0 or decrease dramatically. This means that the jdbc driver is smart enough to track the status of the cursor and prep stmt and reports the closed cursors in the next round-trip to the database, hence reducing network round-trips, which is a good thing for performance.&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;Bulent Erdemir&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-115979564805174319?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/115979564805174319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=115979564805174319' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115979564805174319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115979564805174319'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/10/hibernate-3-and-oracle-9i-cursors-how.html' title='Hibernate 3 and Oracle 9i cursors : how does it work?'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-115954288480824849</id><published>2006-09-29T17:07:00.000+02:00</published><updated>2006-09-29T17:14:44.826+02:00</updated><title type='text'>Java primitive types</title><content type='html'>Just to remember... nothing more :&lt;br /&gt;&lt;br /&gt;&lt;table&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;byte&lt;/td&gt;           &lt;td&gt;Short numerical from -128 to +127&lt;/td&gt;           &lt;td&gt;1 byte&lt;/td&gt;         &lt;/tr&gt;         &lt;tr&gt;           &lt;td&gt;short&lt;/td&gt;           &lt;td&gt;Short numerical from -32768 to +32767&lt;/td&gt;           &lt;td&gt;2 bytes&lt;/td&gt;         &lt;/tr&gt;         &lt;tr&gt;           &lt;td&gt;int&lt;/td&gt;           &lt;td&gt;Numerical from -2 147 483 648 to +2 147 483 647&lt;/td&gt;           &lt;td&gt;4 bytes&lt;/td&gt;         &lt;/tr&gt;         &lt;tr&gt;           &lt;td&gt;long&lt;/td&gt;           &lt;td&gt;Long numerical from -2&lt;sup&gt;63&lt;/sup&gt; to +2&lt;sup&gt;63&lt;/sup&gt; -1&lt;/td&gt;           &lt;td&gt;8 bytes&lt;/td&gt;         &lt;/tr&gt;         &lt;tr&gt;           &lt;td&gt;float&lt;/td&gt;           &lt;td&gt;Decimal from -1.4 * 10&lt;sup&gt;-45&lt;/sup&gt; to +3.4 * 10&lt;sup&gt;38&lt;/sup&gt;&lt;/td&gt;           &lt;td&gt;4 bytes&lt;/td&gt;         &lt;/tr&gt;         &lt;tr&gt;           &lt;td&gt;double&lt;/td&gt;           &lt;td&gt;Long decimal from 4.9 * 10&lt;sup&gt;-324&lt;/sup&gt; to +1.7 * 10&lt;sup&gt;308&lt;/sup&gt;&lt;/td&gt;           &lt;td&gt;8 bytes&lt;/td&gt;         &lt;/tr&gt;         &lt;tr&gt;           &lt;td&gt;char&lt;/td&gt;           &lt;td&gt;Unicode character (65536 possible characters)&lt;/td&gt;           &lt;td&gt;2 bytes&lt;/td&gt;         &lt;/tr&gt;         &lt;tr&gt;           &lt;td&gt;boolean&lt;/td&gt;           &lt;td&gt;Boolean (true or false)&lt;/td&gt;           &lt;td&gt;1 byte&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-115954288480824849?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/115954288480824849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=115954288480824849' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115954288480824849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115954288480824849'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/09/java-primitive-types.html' title='Java primitive types'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-115934463935296067</id><published>2006-09-27T10:09:00.000+02:00</published><updated>2006-09-27T10:10:39.363+02:00</updated><title type='text'>Let's work in full screen mode</title><content type='html'>One of the greats features offered by Java is its capability to switch in full screen mode. The following article is a sun's tutorial on this subject :&lt;br /&gt;&lt;a href="http://java.sun.com/docs/books/tutorial/extra/fullscreen/index.html"&gt;&lt;br /&gt;http://java.sun.com/docs/books/tutorial/extra/fullscreen/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To illustrate how it is benefit to use this mode, I want to opposite it to web based applications that impose the display of unusefull navigator toolbars (taking 25% of the screen workspace).&lt;br /&gt;&lt;br /&gt;I will implement full screen mode in Violet UML Editor.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-115934463935296067?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/115934463935296067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=115934463935296067' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115934463935296067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115934463935296067'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/09/lets-work-in-full-screen-mode.html' title='Let&apos;s work in full screen mode'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-115865565318109224</id><published>2006-09-19T10:45:00.000+02:00</published><updated>2006-09-19T10:47:33.193+02:00</updated><title type='text'>EAI, ESB and SOA news</title><content type='html'>when I was young, I developped on webMethods platform. Since this périod, I feel that writing java code is a prehistoric way of programming.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ebizq.net/"&gt;http://www.ebizq.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-115865565318109224?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/115865565318109224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=115865565318109224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115865565318109224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115865565318109224'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/09/eai-esb-and-soa-news.html' title='EAI, ESB and SOA news'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-115588955922609767</id><published>2006-08-18T10:23:00.000+02:00</published><updated>2006-08-18T10:25:59.236+02:00</updated><title type='text'>Monitoring tools for Sun Java SE 6</title><content type='html'>Here is a good article flying over tools that are usefull to monitor JVM 1.6 :&lt;br /&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/J2SE/monitoring/"&gt;&lt;br /&gt;http://java.sun.com/developer/technicalArticles/J2SE/monitoring/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-115588955922609767?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/115588955922609767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=115588955922609767' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115588955922609767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115588955922609767'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/08/monitoring-tools-for-sun-java-se-6.html' title='Monitoring tools for Sun Java SE 6'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-115530051425799900</id><published>2006-08-11T14:45:00.000+02:00</published><updated>2006-08-16T18:19:26.406+02:00</updated><title type='text'>Monitoring the GC on JVM 1.4</title><content type='html'>As JConsole is provided with Java 1.5, Marco sent me a link to open source software that monitors the GC, using the jvm "verbosegc" option.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tagtraum.com/gcviewer.html"&gt;http://www.tagtraum.com/gcviewer.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-115530051425799900?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/115530051425799900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=115530051425799900' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115530051425799900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115530051425799900'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/08/monitoring-gc-on-jvm-14.html' title='Monitoring the GC on JVM 1.4'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-115530025447071271</id><published>2006-08-11T14:41:00.000+02:00</published><updated>2006-08-11T14:44:14.480+02:00</updated><title type='text'>Understanding the garbage collector</title><content type='html'>Here is a good article (in french) by Romain Guy explaining how the Sun's JVM garbage collector works and how it is possible to set the GC mode&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gfx.developpez.com/tutoriel/java/gc/"&gt;http://gfx.developpez.com/tutoriel/java/gc/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-115530025447071271?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/115530025447071271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=115530025447071271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115530025447071271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115530025447071271'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/08/understanding-garbage-collector.html' title='Understanding the garbage collector'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-115522514649551425</id><published>2006-08-10T17:48:00.000+02:00</published><updated>2006-08-11T16:18:35.946+02:00</updated><title type='text'>Memory dumps are usefull</title><content type='html'>Here is a JVM option very interesting :&lt;br /&gt;-XX:+HeapDumpOnOutOfMemoryError usefull to identify memory leak responsability&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-115522514649551425?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/115522514649551425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=115522514649551425' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115522514649551425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115522514649551425'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/08/memory-dumps-are-usefull.html' title='Memory dumps are usefull'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-115520513469710155</id><published>2006-08-10T12:13:00.000+02:00</published><updated>2006-08-10T12:18:54.706+02:00</updated><title type='text'>Sun's JVM options : the (big) list</title><content type='html'>I just put this link (thanks to Marco) :&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.sun.com/roller/resources/watt/jvm-options-list.html"&gt;http://blogs.sun.com/roller/resources/watt/jvm-options-list.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I 'll make no comment about the difficulty to tune a virtual machine. Oh.. I would said just a few words : prefer design and don't hope you will tune your quick development that has been quickly deployed in production under preasure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-115520513469710155?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/115520513469710155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=115520513469710155' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115520513469710155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115520513469710155'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/08/suns-jvm-options-big-list.html' title='Sun&apos;s JVM options : the (big) list'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-115520179110514237</id><published>2006-08-10T11:15:00.000+02:00</published><updated>2006-08-10T12:10:33.400+02:00</updated><title type='text'>Inside the Sun's JVM memory</title><content type='html'>Yesterday, my manager asked me about a problem concerning the eden space memory. So, this is a summary of JVM's memory management.&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Heap Size&lt;/strong&gt;&lt;br /&gt;The allocation of memory for the JVM is specified using -X options when starting ColdFusion&lt;/p&gt;   &lt;p&gt;&lt;strong&gt;JVM option    Meaning &lt;/strong&gt;&lt;br /&gt;-Xms        initial java heap size&lt;br /&gt;-Xmx        maximum java heap size&lt;br /&gt;-Xmn        the size of the heap for the young generation&lt;br /&gt;&lt;/p&gt;   &lt;p&gt;&lt;span style="font-style: italic;"&gt;(extended options)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;-XX:MaxPermSize maximum permanent generation size (for creating object instances)&lt;br /&gt;&lt;/p&gt; &lt;p&gt;For efficient garbage collection, the -Xmn value should be lower than the -Xmx value.&lt;/p&gt;   &lt;p style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;Heap size does not determine the amount of memory your process uses&lt;/strong&gt;&lt;br /&gt;If you monitor your java process with an OS tool like top or taskmanager, you may see the amount of memory you use exceed the amount you have specified for -Xmx. -Xmx limits the java heap size, java will allocate memory for other things, including a stack for each thread. It is not unusual for the total memory consumption of the VM to exceed the value of -Xmx.&lt;/p&gt;   &lt;p&gt;&lt;strong&gt;Garbage collection&lt;/strong&gt;&lt;br /&gt;There are essentially two GC threads running. One is a very lightweight thread which does "little" collections primarily on the Eden (a.k.a. Young) generation of the heap. The other is the Full GC thread which traverses the entire heap when there is not enough memory left to allocate space for objects which get promoted from the Eden to the older generation(s).&lt;br /&gt;If there is a memory leak or inadequate heap allocated, eventually the older generation will start to run out of room causing the Full GC thread to run (nearly) continuously. Since this process "stops the world", ColdFusion won't be able to respond to requests and they'll start to back up.&lt;br /&gt;The amount allocated for the Eden generation is the value specified with -Xmn. The amount allocated for the older generation is the value of -Xmx minus the -Xmn. Generally, you don't want the Eden to be too big or it will take too long for the GC to look through it for space that can be reclaimed.&lt;br /&gt;&lt;a href="http://java.sun.com/docs/hotspot/gc1.4.2/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/p&gt;   &lt;p&gt;&lt;strong&gt;Stack size&lt;/strong&gt;&lt;br /&gt;Each thread in the VM get's a stack. The stack size will limit the number of threads that you can have, too big of a stack size and you will run out of memory as each thread is allocated more memory than it needs.&lt;br /&gt;&lt;strong&gt;JVM option    Meaning &lt;/strong&gt;&lt;br /&gt;-Xss        the stack size for each thread&lt;br /&gt;-Xss determines the size of the stack: -Xss1024k. If the stack space is too small, eventually you will see an exception class java.lang.StackOverflowError . &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-115520179110514237?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/115520179110514237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=115520179110514237' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115520179110514237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115520179110514237'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/08/inside-suns-jvm-memory.html' title='Inside the Sun&apos;s JVM memory'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-115514976981332282</id><published>2006-08-09T20:53:00.000+02:00</published><updated>2006-08-09T20:57:26.913+02:00</updated><title type='text'>How to monitor your application</title><content type='html'>I just found an article about how to use the JConsole that is included in Java SE 1.5. The article also presents in a few words the JMX phylosophy.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html"&gt;http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-115514976981332282?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/115514976981332282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=115514976981332282' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115514976981332282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115514976981332282'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/08/how-to-monitor-your-application.html' title='How to monitor your application'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-115513891231089415</id><published>2006-08-09T17:52:00.000+02:00</published><updated>2006-08-16T18:18:55.523+02:00</updated><title type='text'>SwingWeb 1.0 : a new swing to web bridge framework</title><content type='html'>Wooh! It's a great day. There's a new framework that allows to publish a swing application on the web. I just put the link here but I will write another message about it. This is really great.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://swingweb.sourceforge.net/swingweb/"&gt;http://swingweb.sourceforge.net/swingweb/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-115513891231089415?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/115513891231089415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=115513891231089415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115513891231089415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115513891231089415'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/08/swingweb-10-new-swing-to-web-bridge.html' title='SwingWeb 1.0 : a new swing to web bridge framework'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-115502928824940564</id><published>2006-08-08T11:21:00.000+02:00</published><updated>2006-08-08T11:28:08.256+02:00</updated><title type='text'>Batch processing in Hibernate</title><content type='html'>&lt;span style="font-family: arial;"&gt;I read this article that is very interesting (thank you very much Marco) :&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;div class="" style="padding: 10px; font-family: arial;"&gt;Suppose you need to insert 200,000 records into a database in Hibernate. You'll need to adjust the following settings:  &lt;pre&gt;&lt;code&gt;&lt;br /&gt;//set the JDBC batch size (it is fine somewhere between 20-50)&lt;br /&gt;hibernate.jdbc.batch_size 30&lt;br /&gt;&lt;br /&gt;//disable second-lavel cache&lt;br /&gt;hibernate.cache.use_second_level_cache false&lt;br /&gt;&lt;br /&gt;//and now do your job like this&lt;br /&gt;Session S=SF.openSession(); //SF = SessionFactory object&lt;br /&gt;Transaction T=S.beginTransaction();&lt;br /&gt; &lt;br /&gt;for (int i=0;i&lt;200000;i++)&lt;br /&gt;   {&lt;br /&gt;   record r=new record(...);&lt;br /&gt;   S.save(record);&lt;br /&gt;   if(i % 30==0)&lt;br /&gt;           { //30, same as the JDBC batch size&lt;br /&gt;           //flush a batch and release memory&lt;br /&gt;           session.flush();&lt;br /&gt;           session.clear();&lt;br /&gt;           }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;//clean &lt;br /&gt;T.commit();&lt;br /&gt;S.close();&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;div class="articleDek" style="margin-left: 10px; margin-bottom: 10px; font-family: arial; font-style: italic;"&gt;(Author : Anghel  Leonard)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-115502928824940564?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/115502928824940564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=115502928824940564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115502928824940564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115502928824940564'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/08/batch-processing-in-hibernate.html' title='Batch processing in Hibernate'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-32302284.post-115495713857159200</id><published>2006-08-07T15:23:00.000+02:00</published><updated>2006-08-07T15:45:50.320+02:00</updated><title type='text'>Debugging application servers</title><content type='html'>&lt;span style="font-family:arial;"&gt;Today, I found a great article that explain how to debug remotly several application servers.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jroller.com/page/gursesl/cleanfulltext/remote_application_debugging_with_weblogic"&gt;Follow this link&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/32302284-115495713857159200?l=javacolors.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javacolors.blogspot.com/feeds/115495713857159200/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=32302284&amp;postID=115495713857159200' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115495713857159200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/32302284/posts/default/115495713857159200'/><link rel='alternate' type='text/html' href='http://javacolors.blogspot.com/2006/08/debugging-application-servers.html' title='Debugging application servers'/><author><name>Alexandre de Pellegrin</name><uri>http://www.blogger.com/profile/18345600939574473154</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
