<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;A0EEQnczeyp7ImA9WxBbEEk.&quot;"><id>tag:blogger.com,1999:blog-37306137</id><updated>2010-03-08T13:00:03.983+01:00</updated><title>From Java to Java EE (through C# .NET)</title><subtitle type="html">This blog is dedicated to all Java (and C# nowadays) developers. I'm trying try to present my everyday problems I encounter developing complicated systems and my solutions to these problems. Java EE topics are also covered (JMS, JAAS, JCE, TIBCO EMS, Tomcat, etc.) This blog extends it's subject range also to Agile Software Development frameworks like Scrum and XP (eXtreme Programming).</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.bielu.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>130</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/FromJavaToJavaEe" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="fromjavatojavaee" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/3.0/" /><entry gd:etag="W/&quot;A0EEQncyeSp7ImA9WxBbEEk.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-6634821089577839590</id><published>2010-03-08T13:00:00.002+01:00</published><updated>2010-03-08T13:00:03.991+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-08T13:00:03.991+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="video" /><category scheme="http://www.blogger.com/atom/ns#" term="Eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="Mylyn" /><title>Creating Mylyn Connector Plugin - part 1</title><content type="html">Quite recently I struggled with my company's internal bug tracker, especially lack of Mylyn integration in Eclipse. The easiest way to make it work was just to develop it :) I started with &lt;a href="http://wiki.eclipse.org/Mylyn_Integrator_Reference"&gt;Mylyn/Integrator Reference&lt;/a&gt; but as usual Eclipse documentation sucks (I used to develop a lot of SWT/JFace applications and the best documentation I found was outside of Eclipse). It's too short, too shallow and most of all written by/to people who knows Mylyn APIs and architecture quite well. As far as I understand someone who wants just to integrate Mylyn with some bug tracker doesn't have to have this kind of knowledge, but I also understand that Mylyn guys don't really have time for stuff like this.&lt;br /&gt;
&lt;br /&gt;
Anyway, I also found very short tutorial (&lt;a href="http://jvliet.blogspot.com/2007/02/creating-mylar-connector-plugin-for.html"&gt;http://jvliet.blogspot.com/2007/02/creating-mylar-connector-plugin-for.html&lt;/a&gt;) explaining in a bit more details how to create Eclipse PDT project etc. But this tutorial doesn't explain all the tiny details that made me spend many hours wondering HTF it should all work together.&lt;br /&gt;
&lt;br /&gt;
In this short series of posts I'll try to give you much simpler tutorial (for morons like me) how to start new Mylyn Connector Plugin even if you're new to Eclipse Plug-in Development. &lt;b&gt;I'll save your time!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
OK - let's start. First video shows how to checkout Eclipse Mylyn and Trac packages (only packages required for connector development reference). In all tutorials authors say that you should take Trac Connector as example but they never point to concrete CVS repository and CVSROOT directory. I do:&lt;br /&gt;
&lt;br /&gt;
&lt;embed allowfullscreen="true" allowscriptaccess="always" height="400" src="http://blip.tv/play/AYHLkk8A" type="application/x-shockwave-flash" width="490"&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;br /&gt;
Second video shows how to create new Mylyn connector project and make it visible in the new Mylyn Connection wizard (I took icons from Trac for simplicity - you can/should use your own). All steps in this tutorial are MANDATORY - if you miss something I'm 99.9% sure it will not work: &lt;br /&gt;
&lt;br /&gt;
&lt;embed src="http://blip.tv/play/AYHLqCEA" type="application/x-shockwave-flash" width="490" height="400" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;br /&gt;
&lt;br /&gt;
Enjoy and stay tuned for more videos in the upcoming weeks...&lt;br /&gt;
&lt;br /&gt;
PS. I used Eclipse 3.5 (Galileo): &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/__TpWDBZjanA/S5PHiep1niI/AAAAAAAANeU/WMWgV_Wz60s/s1600-h/eclipse.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/__TpWDBZjanA/S5PHiep1niI/AAAAAAAANeU/WMWgV_Wz60s/s320/eclipse.PNG" /&gt;&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/37306137-6634821089577839590?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/l1SKk5OcLZA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/6634821089577839590/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=6634821089577839590" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/6634821089577839590?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/6634821089577839590?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2010/03/creating-mylyn-connector-plugin-part-1.html" title="Creating Mylyn Connector Plugin - part 1" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/__TpWDBZjanA/S5PHiep1niI/AAAAAAAANeU/WMWgV_Wz60s/s72-c/eclipse.PNG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CkACQXk6fip7ImA9WxBWEUU.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-3108171889285142328</id><published>2010-02-03T08:06:00.002+01:00</published><updated>2010-02-03T08:06:00.716+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-03T08:06:00.716+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="commercial" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>JavaOne is dead?</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/__TpWDBZjanA/S2iLrJEKt-I/AAAAAAAANTw/neSzk3wRkvk/javaone.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/__TpWDBZjanA/S2iLrJEKt-I/AAAAAAAANTw/neSzk3wRkvk/javaone.png" /&gt;&lt;/a&gt;&lt;/div&gt;I was just looking for the information regarding JavaOne 2010 and found some worrisome blog posts:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.javaworld.com/community/?q=node/3040"&gt;Was JavaOne 2009 the last?&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://explodingpixels.wordpress.com/2009/12/03/javaone-2010/"&gt;JavaOne 2010?&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.adam-bien.com/roller/abien/entry/javaone_2010_seems_like_it"&gt;JavaONE 2010? Seems Like It Will Take Place&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
According to the Moscone Center &lt;a href="http://www.moscone.com/site/do/event/list?nav.type=0&amp;amp;nav.filter=1006&amp;amp;nav.base=0912"&gt;website&lt;/a&gt; JavaOne 2010 is already scheduled between 22nd - 25th of June 2010.&lt;br /&gt;
&lt;br /&gt;
I hope to go there this year! Keep your fingers crossed for my dept's budget :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-3108171889285142328?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/RiQ0_GieeIY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/3108171889285142328/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=3108171889285142328" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3108171889285142328?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3108171889285142328?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2010/02/javaone-is-dead.html" title="JavaOne is dead?" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></entry><entry gd:etag="W/&quot;CUQCQXY4eCp7ImA9WxBWEU0.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-8075347190960569782</id><published>2010-02-02T10:33:00.002+01:00</published><updated>2010-02-02T10:36:00.830+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-02T10:36:00.830+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="buzz" /><category scheme="http://www.blogger.com/atom/ns#" term="tool" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Memory Leak Protection in Tomcat 7 - fwd</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://java.dzone.com/articles/memory-leak-protection-tomcat"&gt;&lt;img src="http://www.dzone.com/sites/all/files/20845.jpg" style="margin-right: 5px; width: 200px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture (c) DZone&lt;/div&gt;&lt;/div&gt;I'm just forwarding you to a &lt;a href="http://java.dzone.com/articles/memory-leak-protection-tomcat"&gt;good article&lt;/a&gt; on memory leaks protection implementation in the upcoming Apache Tomcat 7.&lt;br /&gt;
&lt;br /&gt;
This article is a in a form of short (but quite comprehensive) interview with:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Mark Thomas, a Senior Software Engineer with SpringSource and committer for Apache Tomcat&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Mark points directly to SVN repository where you can actually see how the mechanism he's describing works under the hood.&lt;br /&gt;
&lt;br /&gt;
Mark also mentions about other new features that will be available in new Tomcat 7 (which should be released in &lt;i&gt;alpha&lt;/i&gt; in Feb 2010).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-8075347190960569782?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/o4Wk06MmHok" height="1" width="1"/&gt;</content><link rel="related" href="http://java.dzone.com/articles/memory-leak-protection-tomcat" title="Memory Leak Protection in Tomcat 7 - fwd" /><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/8075347190960569782/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=8075347190960569782" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/8075347190960569782?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/8075347190960569782?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2010/02/memory-leak-protection-in-tomcat-7-fwd.html" title="Memory Leak Protection in Tomcat 7 - fwd" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CUUMQ38_fyp7ImA9WxBWEU0.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-5457953459380283794</id><published>2010-02-01T16:59:00.004+01:00</published><updated>2010-02-02T10:34:42.147+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-02T10:34:42.147+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><title>How to ensure your IE toolbar buttons are always visible?</title><content type="html">Some time ago I encountered a wall while developing add-on for Internet Explorer. I wanted my add-on's button to be always visible after installation process, similarly to &lt;a href="http://delicious.com/help/installie"&gt;delicious&lt;/a&gt; stuff.&lt;br /&gt;
&lt;br /&gt;
Problem seems to be quite simple - just check Browser Helper Object's (BHO) options and set some flag (aside of this subject I will tell you that developing pure BHO is a nightmare). In fact there is no such option. Internet Explorer seemed not extensible to this extent. Also finding something in the Internet appeared to be impossible. What the hell? Delicious guys made it!&lt;br /&gt;
&lt;br /&gt;
After quite long searching I was very close to give up and resign from this "feature". But my sixth sense (yes, you should use it a lot while working with Microsoft) was telling me - "check the registry". So I did, and it was a bull's eye shot.&lt;br /&gt;
&lt;br /&gt;
The thing you have to do is to increase the width of Tool Band Width of Internet Explorer (my NSIS script contains this):&lt;br /&gt;
&lt;pre&gt;WriteRegDWORD HKCU "Software\Microsoft\Internet Explorer\CommandBar" "ToolBandWidth" 800
&lt;/pre&gt;It's very very primitive but it's the only solution I found to work. You just have to provide the desired width in pixels (decimal value) you'd like IE toolbar to be. Don't worry - you can put there even a value of 3000 - IE is smart enough not to extend the toolbar more than needed i.e. if you put a value of 1000 and your buttons need only 500 pixels IE will automatically adjust toolbar width to 500px.&lt;br /&gt;
&lt;br /&gt;
This solution works but has also a big disadvantage. As you can see I write information to the registry for HKCU (HKEY_CURRENT_USER), so if you are installing the add-on with user Administrator, only this user will have Tool Band enlarged. If you open IE with another user she will probably not see your add-on button(s) (applies to IE7 and IE8).&lt;br /&gt;
&lt;br /&gt;
Until now I couldn't find a better way - did you?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-5457953459380283794?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/VppXlJiZOPI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/5457953459380283794/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=5457953459380283794" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/5457953459380283794?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/5457953459380283794?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2010/02/how-to-ensure-your-ie-toolbar-buttons.html" title="How to ensure your IE toolbar buttons are always visible?" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;AkcEQX4zfip7ImA9WxBQF0Q.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-2574752153966453252</id><published>2010-01-18T08:00:00.004+01:00</published><updated>2010-01-18T08:00:00.086+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-18T08:00:00.086+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="buzz" /><category scheme="http://www.blogger.com/atom/ns#" term="commercial" /><category scheme="http://www.blogger.com/atom/ns#" term="book review" /><title>Tomcat 6 Developer's Guide - book review</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://www.packtpub.com/tomcat-6-developers-guide/book"&gt;&lt;img src="https://www.packtpub.com/images/full/1847197280.jpg" style="margin-right: 5px; width: 150px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture (c) Packt Publishing&lt;/div&gt;&lt;/div&gt;Few days ago I received brand new &lt;a href="http://www.packtpub.com/tomcat-6-developers-guide/book"&gt;"Tomcat 6 Developer's Guide"&lt;/a&gt; book which I’ll try to review shortly here. The book is best described in few sentences by the author himself:&lt;br /&gt;
&lt;blockquote&gt;"While Tomcat is one of the most popular servlet containers, its inner workings still remain a mystery to many developers. If you only have a superficial familiarity of how this container actually functions, much of its power remains untapped and underutilized. [...]"&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
Before I start let me just mention that I’m experienced Java and Java EE developer and have worked with Tomcat server (with breaks) since version 4.x (year 2003). This means that I know how to develop, deploy, monitor and tune web applications in this web server. I also worked a little bit with Tomcat internals like custom class loaders. Despite that, this book gave me even more information and knowledge. With this book I was able not only to understand how Tomcat works internally but also where and how I could improve it or basically modify internal components for my needs. &lt;br /&gt;
&lt;br /&gt;
Let’s start the review here - first of all I’d like to say that the author &lt;a href="http://www.packtpub.com/author_view_profile/id/381"&gt;Damodar Chetty&lt;/a&gt; meets his goals in this book. He states in the preface that this book is not for web developers who want to learn how to write Java Servlet / JSP applications and how to deploy them in Tomcat container. I totally agree with the author – this book will not teach you that. This book is for people who want to know how Tomcat works internally in order to tune it or modify it for specific needs.&lt;br /&gt;
&lt;br /&gt;
The author promises to go deep inside Tomcat’s architecture and implementation in order to better understand what’s under the hood, how it works and how you can improve or monitor it. I can assure you that this goal is met. This book describes in detail also other aspects of Java EE environment that are not directly connected to the Tomcat container but on which its implementation is based.&lt;br /&gt;
&lt;br /&gt;
In this book Damodar Chetty firstly describes Tomcat’s high-level architecture and then breaks them down up to basic Java classes. This way he makes the whole complex architecture easy to understand. The author describes all Tomcat’s components one by one which is reflected in the &lt;a href="http://www.packtpub.com/article/tomcat-6-developers-guide-table-of-contents"&gt;Table of Contents&lt;/a&gt;. I think the author’s intention here was to make the reader read the book from cover to cover. I think so, because if you just want to learn about one particular component it will be a bit difficult to understand all the references to the previous sections. In my opinion this book should be read entirely to make every aspect clear, otherwise you will need to go back in the book and search for previously explained subjects, which is not easy.&lt;br /&gt;
This book is definitely component-oriented rather than how-to- or problem-oriented, so if you have a concrete problem or question regarding Tomcat you may have problems finding answer in this book.&lt;br /&gt;
&lt;br /&gt;
All topics are difficult and in my opinion this book is for experienced Java and Java EE developers and administrators. In this field the book fully satisfied me. More so, many topics like "URLs and protocol handlers", "Java class loading" or "Implementing a custom class loader" may be very useful out of the scope of Tomcat server.&lt;br /&gt;
&lt;br /&gt;
What I like in this book’s style is that all, even most complex subjects are explained in a clear way. Every complex component is broken down into pieces that are more easy to explain and understand. This book is also very concise in the source code examples. This makes it more time-consuming to read but on the other hand it forces the reader to understand the subject rather to copy-paste included source code. This aspect again makes this book accessible for experienced developers who know Java and Java EE environments pretty well and are able to start developing their own examples from the textual description.&lt;br /&gt;
&lt;br /&gt;
This book does not promise to cover all the subjects around Tomcat but few of them are really missing in my opinion. Despite full description of how Tomcat is built and how it works I really miss chapters describing how to configure load-balancer for Tomcat or a cluster of Tomcat web servers. I know there are many books or Internet resources that cover these subjects but it would be just nice to have it here. I also realize that load-balancers and clustering components are not core Tomcat components and maybe this is the reason why they are not covered in this book.&lt;br /&gt;
&lt;br /&gt;
To summarize, I think "Tomcat 6 Developer's Guide" book is a really good one and describes Tomcat web server in a pretty detailed fashion. Please note again that you will not learn from this book how to develop web applications using Java Servlet and JSP technologies. You will learn how to effectively use and also modify tomcat internals for you specific needs. You need to be experienced Java / Java EE developer to fully understand all the topics and successfully apply knowledge from this book. I would basically recommend you reading full description of this book available &lt;a href="http://www.packtpub.com/tomcat-6-developers-guide/book#indetail"&gt;here&lt;/a&gt; before buying it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-2574752153966453252?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/V9YrAQYF2ok" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/2574752153966453252/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=2574752153966453252" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/2574752153966453252?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/2574752153966453252?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2010/01/tomcat-6-developers-guide-book-review.html" title="Tomcat 6 Developer's Guide - book review" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;D0EBSH46fCp7ImA9WxBRGU4.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-8104640354175442837</id><published>2009-12-21T11:32:00.005+01:00</published><updated>2010-01-08T08:27:39.014+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-08T08:27:39.014+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="buzz" /><category scheme="http://www.blogger.com/atom/ns#" term="commercial" /><title>Tomcat 6 Developer's Guide is here</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://www.packtpub.com/tomcat-6-developers-guide/book"&gt;&lt;img src="https://www.packtpub.com/images/full/1847197280.jpg" style="margin-right: 5px; width: 150px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture (c) Packt Publishing&lt;/div&gt;&lt;/div&gt;Few days ago I was contacted by Amit Sharma (Marketing Research Executive at Packt Publishing) who asked me if I can review their new book &lt;a href="http://www.packtpub.com/tomcat-6-developers-guide/book"&gt;Tomcat 6 Developer's Guide&lt;/a&gt;. It was published just few days ago and sound interesting, so I agreed.&lt;br /&gt;
&lt;br /&gt;
I expect the book to be rather for advanced users who want to dig in into Tomcat's architecture and more tricky configurations (e.g. SSL and load balancing with Apache front-end, clustering, security realms for Single Sign-In like Kerberos or Windows NTLM).&lt;br /&gt;
&lt;br /&gt;
My short review of the book will follow shortly (in mid Jan 2010). Stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-8104640354175442837?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/kJ_EQBI-3xI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/8104640354175442837/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=8104640354175442837" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/8104640354175442837?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/8104640354175442837?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/12/tomcat-6-developers-guide-is-here.html" title="Tomcat 6 Developer's Guide is here" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C0IDQnoyeip7ImA9WxBSE0Q.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-3912050850865087090</id><published>2009-12-16T18:51:00.001+01:00</published><updated>2009-12-21T11:32:53.492+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-21T11:32:53.492+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="buzz" /><category scheme="http://www.blogger.com/atom/ns#" term="Spring" /><title>Spring 3.0 goes public</title><content type="html">Here it is &lt;a href="http://www.springsource.com/download"&gt;http://www.springsource.com/download&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Spring 3.0 is here and I hope it will serve Java developers as good as the previous releases. Spring Framework used to be &lt;i&gt;de facto&lt;/i&gt; Java EE standard and I believe it will remain so for the next couple of years:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;For some very recent news, Spring 3.0 GA is compatible with Java EE 6 final in terms of runtime environments now (e.g. on GlassFish v3 as released last week) and supports JPA 2.0 final already (e.g. using EclipseLink 2.0). We also support the newly introduced &lt;a href="http://java.sun.com/javaee/6/docs/api/javax/annotation/ManagedBean.html" onclick="javascript:urchinTracker('/outbound/java.sun.com');"&gt;@ManagedBean&lt;/a&gt; (JSR-250 v1.1) annotation for component scanning now, which nicely complements our &lt;a href="http://java.sun.com/javaee/6/docs/api/javax/inject/Inject.html" onclick="javascript:urchinTracker('/outbound/java.sun.com');"&gt;@Inject&lt;/a&gt; (JSR-330) support for annotation-driven dependency injection.&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
More details in these posts:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://blog.springsource.com/2009/12/16/spring-framework-3-0-goes-ga/?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+Interface21TeamBlog+%28SpringSource+Team+Blog%29"&gt;Spring Framework 3.0 goes GA&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.springsource.org/node/2266"&gt;Spring 3.0.0 is Now Available&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-3912050850865087090?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/xO8HAcS-cqo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/3912050850865087090/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=3912050850865087090" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3912050850865087090?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3912050850865087090?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/12/spring-30-goes-public.html" title="Spring 3.0 goes public" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CEQFQ3g9eCp7ImA9WxBUEUo.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-535842915964543183</id><published>2009-09-29T13:56:00.003+02:00</published><updated>2010-02-26T09:18:32.660+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-26T09:18:32.660+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title>Server timeout for maven release:perform or site:deploy</title><content type="html">I just wanted to release a piece of software I'm working on when I encountered a wall. Big, high and not very talkative wall - read timeout. I thought maybe the configuration of the server (and Web DAV) I described in &lt;a href="http://blog.bielu.com/2008/02/maven-artifactory-continuum.html"&gt;this post&lt;/a&gt; has changed? No way - everything is like it was. The only thing that has changed is Maven version from 2.0.9 to 2.2.1 (where you don't have to define DAV extension in the &lt;tt&gt;build&lt;/tt&gt; part).&lt;br /&gt;
&lt;br /&gt;
Fortunately I also had my old environment where it worked (I meanMmaven 2.0.9). I noticed that the full build takes over 2 minutes while on the new Maven I get the timeout after 1 minute and few seconds. This way I realized that maybe increasing the timeout value will help. &lt;b&gt;IT DID!!!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
So how to do this? It's simple - just add:&lt;br /&gt;
&lt;pre name="code" class="xml:nogutter"&gt;&amp;lt;servers&amp;gt;
  &amp;lt;server&amp;gt;
    &amp;lt;id&amp;gt;someId&amp;lt;/id&amp;gt;
    &amp;lt;username&amp;gt;blahblah&amp;lt;/username&amp;gt;
    &amp;lt;password&amp;gt;blahblah&amp;lt;/password&amp;gt;
    &amp;lt;configuration&amp;gt;
      &amp;lt;timeout&amp;gt;120000&amp;lt;/timeout&amp;gt; &amp;lt;!-- your timeout in milliseconds --&amp;gt;
    &amp;lt;/configuration&amp;gt;
  &amp;lt;/server&amp;gt;
  ...
&lt;/pre&gt;in the &lt;tt&gt;MAVEN_HOME/conf/settings.xml&lt;/tt&gt; file and restart your Maven task.&lt;br /&gt;
&lt;br /&gt;
Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-535842915964543183?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/o3qerJhFTvg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/535842915964543183/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=535842915964543183" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/535842915964543183?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/535842915964543183?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/09/server-timeout-for-maven-releaseperform.html" title="Server timeout for maven &lt;code&gt;release:perform&lt;/code&gt; or &lt;code&gt;site:deploy&lt;/code&gt;" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;AkUHSXc6fSp7ImA9WxNQGEU.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-3318641365087670956</id><published>2009-09-22T08:46:00.006+02:00</published><updated>2009-09-25T16:17:18.915+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-25T16:17:18.915+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="buzz" /><title>My daily WTF</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/__TpWDBZjanA/Src90VnXSsI/AAAAAAAAMoQ/QYitpa4d_ZQ/s1600-h/wtf.png" imageanchor="1" title="Error: Your password must be different from the 12 previous passwords."&gt;&lt;img border="0" src="http://2.bp.blogspot.com/__TpWDBZjanA/Src90VnXSsI/AAAAAAAAMoQ/QYitpa4d_ZQ/s800/wtf.png" width="460" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;I was just slapped but web application: "Your password must be different from the 12 previous passwords".&lt;br /&gt;
&lt;br /&gt;
Very "secure" (obscure) system forcing me to have my original password (of value "password") plus additional 12 passwords of values "password1", "password2", etc. On the other hand there is no other policy requiring me to have at least one digit or capital letter. The only one is that my new password has to be different than 12 that I had before.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;big&gt;WTF?&lt;/big&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-3318641365087670956?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/VoXJU2hDL3Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/3318641365087670956/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=3318641365087670956" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3318641365087670956?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3318641365087670956?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/09/my-daily-wtf.html" title="My daily WTF" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/__TpWDBZjanA/Src90VnXSsI/AAAAAAAAMoQ/QYitpa4d_ZQ/s72-c/wtf.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C04HRno4eip7ImA9WxNXE00.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-8316139242882196325</id><published>2009-09-20T20:13:00.003+02:00</published><updated>2009-09-30T11:12:17.432+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-30T11:12:17.432+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tool" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>Add-in Express™ - a great tool for tiny price</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://www.add-in-express.com"&gt;&lt;img src="http://www.add-in-express.com/images/2007/adx-ie/index/index.png" style="margin-right: 5px; width: 280px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture (c) Add-in Express™&lt;/div&gt;&lt;/div&gt;I recently had to develop Internet Explorer plugin that had had to be compatible with versions 6, 7 and 8 of this browser. I searched the net a bit and I found a lot of solutions to do this. The best (if not the only one) solution is to implement &lt;a href="http://en.wikipedia.org/wiki/Browser_Helper_Object"&gt;Browser Helper Object (BHO)&lt;/a&gt;. The problem with doing it manually is that it was designed by Microsoft which means that even if implementing it is easy you have to store zillions of information in the Windows registry to make your application work. This, on the other hand, is not that easy as you have to know exactly what and where to store, how to generated COM classes' GUIDs, and if it's not enough this kind of work is not testable or debugable.&lt;br /&gt;
&lt;br /&gt;
Of course, it's easy to find some ready solutions with demo how to register all objects, etc. Another problem with this is that all the documentation from MS or from opensource community is pretty old and irrelevant. For example some example plugins I found worked out-of-the-box, however I had some special needs that were not addressed and that I couldn't find any documentation for.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Let's try the other way&lt;/b&gt;&lt;br /&gt;
In the previous paragraphs I forgot to mention that the software I was up to develop had to be delivered in two days (I mean the demo showing that it's possible to develop such plugin at all). This way I didn't have time to dig into the COM docs and BHO registration options. I found &lt;a href="http://www.add-in-express.com"&gt;Add-in Express™&lt;/a&gt; plugins for Visual Studio. My obvious choice was &lt;a href="http://www.add-in-express.com/programming-internet-explorer/"&gt;Add-in Express™ 2009 for Internet Explorer® and Microsoft® .net&lt;/a&gt; (AE4IE).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Benefits&lt;/b&gt;&lt;br /&gt;
With this tool I achieved more in 5 minutes than with Microsoft and opensource documentation in two days. It's not an exaggeration if I say that every developer is able to create at least working skeleton of IE plugin in 15 minutes. AE4IE has excellent documentation and is extremely easy to use. ROI is obvious and very quick as this tool gives a great quality for the price it costs.&lt;br /&gt;
&lt;br /&gt;
With AE4IE templates for Visual Studio you not only create plugins in 5 minutes. This tool also creates the whole project structure as well as the Setup project that enables your users installing the plugins in the user-friendly manner. &lt;b&gt;And it takes only few clicks!!!&lt;/b&gt; I love it.&lt;br /&gt;
&lt;br /&gt;
It saves a lot of time and hard work of digging into MS documentation or reading (and buying) books on BHO/COM subjects.&lt;br /&gt;
&lt;br /&gt;
Another good point is that developers are given pure Microsoft API such as &lt;a href="http://www.add-in-express.com/purchase/index.php"&gt;IWebBrowser2&lt;/a&gt; - this way you gain full power over your plugin and don't have to worry about COM specification and Windows registry configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What about the support&lt;/b&gt;&lt;br /&gt;
Add-in Express™ team replies and solves problems very quickly and professionally. There is a special &lt;a href="http://www.add-in-express.com/forum/"&gt;forum&lt;/a&gt; where you can find answers for many real-life questions and find solutions to common problems.&lt;br /&gt;
&lt;br /&gt;
Extremely useful thing is also having a &lt;a href="http://www.add-in-express.com/creating-addins-blog/"&gt;technical blog&lt;/a&gt; of Add-in Express™ team where they present new features and explain how to solve advanced issues (e.g. with sharing data between COM objects).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Conclusions&lt;/b&gt;&lt;br /&gt;
I'm very happy with this tool and would recommend it to every small or big company that has to develop IE plugin. You will never do what they did for such a small amount of &lt;a href="http://www.add-in-express.com/purchase/index.php"&gt;money&lt;/a&gt;. The whole purchasing procedure takes 5 minutes and after another 15 minutes you have your plugin ready. The only remaining thing to do is to implement the business logic. How cool is that?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;DISCLAIMER:&lt;/b&gt; I have no business connections with Add-in Express™ company and my review is not a commercial break&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-8316139242882196325?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/71Gza6QpQ50" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/8316139242882196325/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=8316139242882196325" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/8316139242882196325?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/8316139242882196325?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/09/add-in-express-great-tool-for-tiny.html" title="Add-in Express™ - a great tool for tiny price" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/__TpWDBZjanA/Smgbd4NmoqI/AAAAAAAALSI/baPwP1SyvUQ/s72-c/splash_visualvm.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DE8NRng_eSp7ImA9WxJbE04.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-666122256449932441</id><published>2009-07-23T10:00:00.001+02:00</published><updated>2009-07-23T10:14:57.641+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-23T10:14:57.641+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tool" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="debug" /><category scheme="http://www.blogger.com/atom/ns#" term="deadlock" /><title>Visual VM - a great Java tool you were waiting for!</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="https://visualvm.dev.java.net/"&gt;&lt;img src="http://4.bp.blogspot.com/__TpWDBZjanA/Smgbd4NmoqI/AAAAAAAALSI/baPwP1SyvUQ/s400/splash_visualvm.gif" style="margin-right: 5px; width: 280px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture (c) VisualVM&lt;/div&gt;&lt;/div&gt;I planned to publish this post some months ago but unfortunately I was too busy to do so. I'm still busy :) but I can write couple of sentences about &lt;a href="https://visualvm.dev.java.net/"&gt;VisualVM&lt;/a&gt; - a VISUAL (no surprise) tool for monitoring Java applications. If you had to monitor state of your Java systems you probably already know &lt;a href="http://openjdk.java.net/tools/svc/jconsole/"&gt;JConsole&lt;/a&gt; - a JMX console to you Java stuff. Of course, you can just connect to JVM's JMX services and monitor almost every aspect of VM but the way data is not presented in a very friendly manner. Some differences between VisualVM and JConsole are described in &lt;a href="http://www.javaworld.com/community/node/1289"&gt;this article&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Anyway, VisualVM is an absolutely GREAT tool to monitor Java apps. You are able to see all threads (with possible deadlocks), memory state (heap and stack), profiling information on CPU and memory utilization, etc. VisualVM has pluggable architecture and you can find many useful addins to it including JConsole plugins. This way you will be able to use only on tool and get rid of JConsole (which is a great tool too).&lt;br /&gt;&lt;br /&gt;More details and full-blown tutorial can be found here: &lt;a href="http://www.taranfx.com/blog/?p=930"&gt;http://www.taranfx.com/blog/?p=930&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;More advanced topics are described here: &lt;a href="http://blog.grovehillsoftware.com/2009/05/visualvm-and-cutting-method-calls-by.html"&gt;http://blog.grovehillsoftware.com/2009/05/visualvm-and-cutting-method-calls-by.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-666122256449932441?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/qakRxzBK6_s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/666122256449932441/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=666122256449932441" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/666122256449932441?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/666122256449932441?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/07/visual-vm-java-tool-you-were-waiting.html" title="Visual VM - a great Java tool you were waiting for!" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/__TpWDBZjanA/Smgbd4NmoqI/AAAAAAAALSI/baPwP1SyvUQ/s72-c/splash_visualvm.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DkUHRXs-fSp7ImA9WxJbE04.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-870335549200894652</id><published>2009-07-16T22:33:00.002+02:00</published><updated>2009-07-23T09:30:34.555+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-23T09:30:34.555+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scrum" /><category scheme="http://www.blogger.com/atom/ns#" term="presentation" /><title>Présentation de Scrum pour Riviera JUG</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://picasaweb.google.com/stephane.epardaud/15Juillet2009SophiaAntipolisSoireeAgile#5358974518412214258"&gt;&lt;img src="http://lh5.ggpht.com/_9DhVsQpfNGE/Sl7m7nJUf_I/AAAAAAAAAiY/_8QJ8Zjub8Q/s800/IMG_9276.JPG" style="margin-right: 5px; width: 280px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture (c) Riviera JUG&lt;/div&gt;&lt;/div&gt;Hier, j'ai présente Scrum exclusivement pour &lt;a href="http://rivierajug.org/"&gt;Riviera Java User Group&lt;/a&gt; dans le Mistral Auditorium d'Amadeus. Mon public, environs 120 personnes est venu de Sophia Antipolis, Antibes et de région de Nice en général. Selon le retour que j'ai reçu après ma &lt;a href="http://rivierajug.org/xwiki/bin/download/Main/Evenements/rivierajug%2D20090715%2Dprzemyslaw%2Dscrum.pdf"&gt;présentation&lt;/a&gt;, elle était un grand succès. Maintenant j'attends les réponses de participant  au sujet de la création et la participation dans Riviera Agile User Group. J'espère ce groupe sera bientôt crée et nous pourrons réunir régulièrement et présenter nos idées et échanger nos expériences a'propos d'agile.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Si vous êtes intéresses par la projet comme Riviera Agile User Group, vous pouvez me contacter. &lt;br /&gt;&lt;br /&gt;Si vous êtes (ou vous travaillez pour) une société qui pourrait financer les réunions mensuels (nous aurons besoin de la salle de conférence, des boissons et snacks environs 200-400 EUR) , je serai ravi de le savoir. Cela serait une bonne promotion pour vous car les méthodes agile gagnent plus en plus de la popularité ici au sud de France - vous serez bien VISIBLE si vous décidez de nous aider.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La résume de la dernière présentation, aussi que les slides et les photos vous pouvez trouve &lt;a href="http://rivierajug.org/xwiki/bin/view/Blog/Bilandu15juillet2009"&gt;ici&lt;/a&gt;.J'espere que la video va apparaitre bientot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-870335549200894652?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/wCloufaacHc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/870335549200894652/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=870335549200894652" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/870335549200894652?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/870335549200894652?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/07/presentation-de-scrum-pour-riviera-jug.html" title="Présentation de Scrum pour Riviera JUG" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_9DhVsQpfNGE/Sl7m7nJUf_I/AAAAAAAAAiY/_8QJ8Zjub8Q/s72-c/IMG_9276.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DkUGQn07fyp7ImA9WxJbE04.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-2303749315530640847</id><published>2009-07-16T21:11:00.004+02:00</published><updated>2009-07-23T09:30:23.307+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-23T09:30:23.307+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scrum" /><category scheme="http://www.blogger.com/atom/ns#" term="presentation" /><title>Scrum presentation for Riviera JUG</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://picasaweb.google.com/stephane.epardaud/15Juillet2009SophiaAntipolisSoireeAgile#5358974518412214258"&gt;&lt;img src="http://lh5.ggpht.com/_9DhVsQpfNGE/Sl7m7nJUf_I/AAAAAAAAAiY/_8QJ8Zjub8Q/s800/IMG_9276.JPG" style="margin-right: 5px; width: 280px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture (c) Riviera JUG&lt;/div&gt;&lt;/div&gt;Yesterday I presented Scrum exclusively for &lt;a href="http://rivierajug.org"&gt;Riviera Java User Group&lt;/a&gt; in Amadeus' Mistral Auditorium. My audience was about 120 people from Sophia Antipolis, Antibes and Nice area in general. According to the feedback I received the &lt;a href="http://rivierajug.org/xwiki/bin/download/Main/Evenements/rivierajug%2D20090715%2Dprzemyslaw%2Dscrum.pdf"&gt;presentation&lt;/a&gt; was a big success and now I'm waiting for the answers from attending people whether they are interested in creating and participating to Riviera Agile User Group. I hope we will create such initiative shortly and will be able to meet regularly presenting ideas, thoughts and experiences on agile subjects.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;If you are interested in open initiative such as Riviera Agile User Group please contact me.&lt;br /&gt;&lt;br /&gt;If you are (or work for) a company that would like to sponsor such monthly events (we will need conference room, some beverages and snacks i.e. 200 - 400 EUR) I would love to know about it. It will be a great marketing for you as the agile methods gain more and more popularity here in southern France - you will be very VISIBLE if you decide to help us.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Summary of the last meeting, slides and pictures can be found &lt;a href="http://rivierajug.org/xwiki/bin/view/Blog/Bilandu15juillet2009"&gt;here.&lt;/a&gt; I hope the video will follow shortly too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-2303749315530640847?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/U_F_Ib40Kqg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/2303749315530640847/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=2303749315530640847" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/2303749315530640847?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/2303749315530640847?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/07/scrum-presentation-for-riviera-jug.html" title="Scrum presentation for Riviera JUG" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_9DhVsQpfNGE/Sl7m7nJUf_I/AAAAAAAAAiY/_8QJ8Zjub8Q/s72-c/IMG_9276.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry><entry gd:etag="W/&quot;Ak8AR3o8fyp7ImA9WxJWFU8.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-3741244881939371438</id><published>2009-06-20T22:12:00.001+02:00</published><updated>2009-06-20T22:14:06.477+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-20T22:14:06.477+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="communication" /><category scheme="http://www.blogger.com/atom/ns#" term="team" /><title>Half-dead project saved! Thank you - Direct Communication</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://agilesoftwaredevelopment.com/files/big_picture.jpg"&gt;&lt;img src="http://agilesoftwaredevelopment.com/files/big_picture.jpg" style="margin-right: 5px; width: 280px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture (c) Przemyslaw Bielicki&lt;/div&gt;&lt;/div&gt;In my &lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/direct-communication-agile-platform-part-1-draft-title"&gt;previous post&lt;/a&gt; I shortly described the half-dead project in an over-waterfall company me and my team had to save three months before production. In this part I will show you how direct (instead of discrete) communication with customer or good Product Owner in general can help saving almost dead projects.&lt;br /&gt;&lt;br /&gt;As I described earlier me and my team had a lot of problems with the systems we had to integrate - technical issues were present but they were not dominant, even taking into account the fact that the team was not experienced in .NET and T-SQL stuff.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Customer saved our project&lt;/b&gt;&lt;br /&gt;After some time struggling with technical issues we finally were contacted by the person who knew how the product should behave. This person (let me call her Product Owner - PO) had all acceptance tests in her mind and knew exactly how to help us understand the product. PO was in fact our client - to be completely clear, the product we were delivering was either win-win or lose-lose so we &lt;b&gt;had&lt;/b&gt; to cooperate and the success was our mutual goal.&lt;br /&gt;&lt;br /&gt;PO was remotely available (although in the same time zone) but that was not a problem for us at all - we exchanged tons of emails and some phone calls and that was perfectly sufficient.&lt;br /&gt;&lt;br /&gt;We were working like this for over two months and we delivered every single customer's request to the product. After the development phase our software had to pass the certification phase which, in fact, was couple-hour testing process in production. Our PO was present there and was helping other clients with testing (yes, there were other clients eventually using our product). &lt;br /&gt;&lt;br /&gt;I could risk a claim that it was a huge success because we just found couple of minor issues that were not even concerning the software but insufficient or incomplete data in our production databases. Everybody is sure that what saved the project and what really caused it to be such success was direct contact and constant help from our PO. As I wrote in one of my previous posts, namely &lt;a href="http://agilesoftwaredevelopment.com/blog/pbielicki/customer-team-member-way-winning-together"&gt;Customer Team Member - a way to winning together&lt;/a&gt; having customer as your team member is usually really good and efficient idea.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fool's gold?&lt;/b&gt;&lt;br /&gt;There are also (of course) problems with such attitude - the most "popular" one is the problem with actually having a customer. But even if you have a customer, how would you encourage him/her to be involved in the project (they usually aren't, especially at the beginning of the project)? It may depend on the actual contract i.e. how you define success or whether customer gain something by helping you - to know which contract best suits your current situation please refer to Peter Stevens' article: &lt;a href="http://agilesoftwaredevelopment.com/blog/peterstev/10-agile-contracts"&gt;10 Contracts for your next Agile Software Project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;It saved us - it can save You&lt;/b&gt;&lt;br /&gt;To summarize, from my experience every time I worked with customer that was involved in the project I produced software with the highest business value (at that time). Every time I worked directly with involved customer I delivered the product that everybody treated as theirs, everybody was the owner - that's very cool feeling. This has also real business effect - satisfied customer is more likely to come back to your company. You gain credibility working together with your customers e.g. by showing them that you really work hard to meet their needs and to bring the best business value reducing costs. That usually pays off.&lt;br /&gt;&lt;br /&gt;So, my final advice here for you would be to take some effort and time and look for a GOOD Product Owner. When you find her then start bombing her with emails, phone calls, whatever that can help your team deliver the product with highest possible business value.&lt;br /&gt;&lt;br /&gt;What are your experiences with working directly with customers? Are they positive or negative? How would you improve thing in your project - could customer's involvement help?&lt;br /&gt;&lt;br /&gt;Originally published on &lt;a href="http://AgileSoftwareDevelopment.com"&gt;AgileSoftwareDevelopment.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-3741244881939371438?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/r9zlChcl92A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/3741244881939371438/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=3741244881939371438" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3741244881939371438?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3741244881939371438?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/06/half-dead-project-saved-thank-you.html" title="Half-dead project saved! Thank you - Direct Communication" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;AkIFQnc-eSp7ImA9WxJXFkw.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-2012982946908859391</id><published>2009-06-10T09:19:00.002+02:00</published><updated>2009-06-10T09:21:53.951+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-10T09:21:53.951+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="buzz" /><title>The Vendor Client Relationship (In Real World Situations)</title><content type="html">&lt;embed width="480" height="340" allowfullscreen="true" allowscriptaccess="always" type="application/x-shockwave-flash" src="http://www.youtube.com/v/R2a8TRSgzZY&amp;hl=en&amp;fs=1&amp;showinfo=0"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;ROTFL&lt;br /&gt;&lt;br /&gt;Copied from &lt;a href="http://www.codesqueeze.com/the-vendor-client-relationship-in-real-world-situations/"&gt;{codesqueeze}&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-2012982946908859391?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/m2ZlzmZwVxQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/2012982946908859391/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=2012982946908859391" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/2012982946908859391?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/2012982946908859391?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/06/vendor-client-relationship-in-real.html" title="The Vendor Client Relationship (In Real World Situations)" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;D08HQ3w9fCp7ImA9WxNQFk0.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-202765341607024941</id><published>2009-05-20T08:00:00.003+02:00</published><updated>2009-09-22T09:50:32.264+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-22T09:50:32.264+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tool" /><category scheme="http://www.blogger.com/atom/ns#" term="debug" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><title>Sysinternals (Process Explorer) saved my a**</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://bielu.com/blog/procexp.jpg"&gt;&lt;img src="http://bielu.com/blog//procexp.jpg" style="margin-right: 5px; width: 300px;" /&gt;&lt;/a&gt;&lt;/div&gt;After deploying our .NET system in production functionally speaking everything was OK. However, after couple of days we saw our processes consuming more than 80% of the CPU of some pretty powerful servers - and we were not computing any nuclear or medical killer stuff. Something was wrong - but what?&lt;br /&gt;
&lt;br /&gt;
At this moment I recalled using free &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx"&gt;Sysinternals&lt;/a&gt; tool from Microsoft to see what's deep inside my operating system (in runtime, of course).&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What really happened?&lt;/b&gt;&lt;br /&gt;
I started &lt;a hre="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx"&gt;Process Explorer&lt;/a&gt; belonging to the Sysinternals suite, found my process and looked at it's runtime properties: &lt;div style="float: left"&gt;&lt;a href="http://bielu.com/blog/props.jpg"&gt;&lt;img src="http://bielu.com/blog/props.jpg" style="margin-right: 5px; width: 300px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
What I saw was the increasing number of TCP/IP connections (because used connections were not closed/returned to the pool properly). After some time spent on monitoring the process I noticed that this pattern is stable and each request caused the number of connections to database grow - until the process reached max and OS couldn't handle this process any more. Of course I fixed this issue wit one or two lines of code because it was a "little" problem (as usual) that appeared to have a big impact on the operating software.&lt;br /&gt;
&lt;br /&gt;
I think wouldn't be able to discover this issue so quickly without using Sysinternals. Why? Because my colleagues were trying to investigate and fix this issue for some time before me. They didn't know &lt;a hre="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx"&gt;Process Explorer&lt;/a&gt; tool :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-202765341607024941?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/BhbRktlxlF4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/202765341607024941/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=202765341607024941" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/202765341607024941?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/202765341607024941?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/05/sysinternals-process-explorer-saved-my.html" title="Sysinternals (Process Explorer) saved my a**" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></entry><entry gd:etag="W/&quot;CkcEQXY7eip7ImA9WxJRFk4.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-5370763589432424579</id><published>2009-05-18T09:00:00.000+02:00</published><updated>2009-05-18T09:00:00.802+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-18T09:00:00.802+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="communication" /><category scheme="http://www.blogger.com/atom/ns#" term="team" /><title>Direct communication as a half-dead project saver: When you start in an over-waterfall company</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://www.flickr.com/photos/clagnut/252185030/"&gt;&lt;img src="http://farm1.static.flickr.com/85/252185030_616b864353.jpg?v=0" style="margin-right: 5px; width: 220px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture courtesy of &lt;a href="http://www.flickr.com/photos/clagnut/"&gt;clagnut@flickr&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;At the end of year 2008 our team was given a project that was critical from the $$ point of view. We had to deliver the project by the end of March 2009 in order to avoid huge fees from our customer. The problem was that the project we got was being developed by different team in different location and the quality of the existing solution was at least questionable. It turned out that the whole old team left the company and our small commando squad had to save the day. I just have to mention that the company we all worked for was a pure-waterfall monster.&lt;br /&gt;&lt;br /&gt;You know, agile books are fun to read, but how do you start it if you happen to be a developer in a pure waterfall company on an impossible project? I went through it and going to show what worked well for us. I will tell how we were able to get an impossible project apply the agile principles and survive.&lt;br /&gt;&lt;!--break--&gt;&lt;br /&gt;&lt;b&gt;A bit of a history&lt;/b&gt;&lt;br /&gt;The company I used to work for sometime didn't know/use Agile methods. Everything there was pure waterfall i.e. there was a marketing that defined what it wanted (previously negotiated the contract i.e. feature list with the customer), then it passed the specification docs to product definition team that was in charge of designing the solution, finding ALL possible problems and answering ALL possible questions. Then after couple of months the technical specifications were passed to the development team that... started everything all over again. I mean that the development team usually found documents received from product definition team useless - it's not my opinion, rather my conclusion after talks with many friend-developers. Some docs like protocol specifications or conversion specs were REALLY useful but they were vast minority.&lt;br /&gt;&lt;br /&gt;Anyway, when developers started working on the project it usually took just few classes to find some blocking issues that had not been predicted/designed in the docs. "How it's possible?" "They were supposed to find ALL possible problems and answer ALL possible questions". Well, they were supposed to but it was IMPOSSIBLE to do so. Even perfectly prepared and thoroughly checked documentation will not replace direct communication channels.&lt;br /&gt;&lt;br /&gt;The project I'm going to describe was quite different - there was no documentation, no specification but more so there was not a single person understanding the problem. This was a real shocker for the company used to work in an "ordered" and "predictable" way.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Project&lt;/b&gt;&lt;br /&gt;In short we had to develop an unknown communication protocol to connect the two unknown existing systems. And the time we were given was pretty much estimated as we already knew all the guts and gears in this system. Ah - I forgot about some pretty "unimportant" detail: the test database for the test system was located around 1000 km from our desks and the VPN connection was not yet established. So, for couple of weeks we were just having a pretty "black box" environment - it was not so bad though because we had some time to learn how to compile given sources (still, this was the time when we were supposed to be developing software).&lt;br /&gt;&lt;br /&gt;&lt;b&gt; What did we have?&lt;/b&gt;&lt;br /&gt;We had the documentation for the protocol we had to implement with examples (requests and responses). The documentation was not very useful, though because it was designed for people who knew this protocol before. This documentation was not explaining many concepts - it was assuming the reader's knowledge on quite high level - unfortunately we were GREEN.&lt;br /&gt;We also had some stored procedures (in our unreachable database) that were supposed to contain business logic and they were supposed to work already - we were told that they require just small changes. Basically we had to develop a part that had to receive the requests, parse and process it and invoke already existing stored procedure with transformed parameters – we knew that we would also modify or create completely new stored procedures from scratch.&lt;br /&gt;&lt;br /&gt;When we eventually got to know what to do we knew that we had to implement hotel availability (3 different request/responses) and booking (couple of quite complex transaction flows) messages. The availability part was supposed to be 100% ready (this way we could focus only on booking) - we just had to test it and confirm (probably do some small fixes).&lt;br /&gt;&lt;br /&gt;To summarize: we had some germ of the C# code, fully functional stored procedures in T-SQL (MS SQL server) that required some significant rework and proprietary ASCII format specification. I also have to mention that neither of the team members was C# or T-SQL expert (I put it as delicate as possible).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Finally @Work&lt;/b&gt;&lt;br /&gt;After some time of investigation we knew how the frontend and backend work but we still couldn't test the system because we had no database. When it was ready we established a test environment and we finally was able to integrate the whole system. We were able to start this machinery and inject some requests. We were even receiving some responses - but at this moment we had completely no idea whether these responses were correct or not.&lt;br /&gt;&lt;br /&gt;Here is the moment we started communicating directly with our customer who started testing delivered system in test environment and giving us feedback. If you ask why we didn’t communicate with them earlier I would answer that we had nothing to show them as the test environment was unreachable for developers. If we couldn’t show them anything we weren’t able to get any feedback. That sucked…&lt;br /&gt;&lt;br /&gt;I will leave the details of our communication process with customer for the next post.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lessons learned so far&lt;/b&gt;&lt;br /&gt;We took over the project in a rush and were just given a source codes from the previous team – which wasn’t the first class anyway (I mean the code). There was no unit tests, no continuous integration environment, no single product backlog but we started creating those artefacts. And you know what – this was the best decision we could make - we took as much as we could from the agile world in this project. &lt;br /&gt;&lt;br /&gt;The main problem that was probably the root cause of all other issues was lack of communication. Before starting contacting directly with customer (who became our product owner, in fact) this was the worst part of the project because we not only didn’t know what to do but also we had no one who could verify our assumptions. Lack of communication was very visible and the deadlines were getting closer. We were really thinking that we will be late with such pace and information flow (or rather lack of it). We knew that with such level of uncertainty agile practices - especially open and effective communication - could help us saving our jobs.&lt;br /&gt;&lt;br /&gt;In the next part I will explain how we solved our communication problems, how agile practices helped keep the project on track and keep the number of bugs close to zero as well as how the whole project finished. Stay tuned!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Feedback&lt;/b&gt;&lt;br /&gt;Do you recall such situation in your own project(s)? What was the solution that worked for your team? I'm really curious your opinions and thoughts.&lt;br /&gt;&lt;br /&gt;Originally published on &lt;a href="http://AgileSoftwareDevelopment.com"&gt;AgileSoftwareDevelopment.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-5370763589432424579?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/78IKlar-LK8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/5370763589432424579/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=5370763589432424579" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/5370763589432424579?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/5370763589432424579?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/05/direct-communication-as-half-dead.html" title="Direct communication as a half-dead project saver: When you start in an over-waterfall company" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;CE8DRXY8fyp7ImA9WxJRFUg.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-3621912492800003850</id><published>2009-05-15T20:36:00.004+02:00</published><updated>2009-05-17T11:34:34.877+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-17T11:34:34.877+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="buzz" /><category scheme="http://www.blogger.com/atom/ns#" term="po polsku" /><title>Niezły kawałek muzyki</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://towary.art.pl/"&gt;&lt;img src="http://towary.art.pl/dolne-miasto-ost/img/album.jpg" style="margin-right: 5px; width: 220px;" /&gt;&lt;/a&gt;&lt;/div&gt;This post will be in Polish but don't worry it won't be about Java or technology at all. Anyway, if you want to listen to some really good music (one of the artist - Piotr Czerski - is my friend from university and some really wasting parties ;) visit this website: &lt;a href="http://towary.art.pl"&gt;http://towary.art.pl&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mam nadzieję, że Groszek się nie obrazi jeśli skopiuję post z jego &lt;a href="http://mmorfe.blogspot.com/"&gt;bloga&lt;/a&gt; - nic lepszego i tak nie wymyślę na temat nowiuteńkiej płyty grupy "Towary Zastępcze" pt. "Dolne Miasto" bo o tym będzie ten wpis. Przesłuchałem tę płytę już dzisiaj dwa razy i jestem bardzo &lt;i&gt;kontent&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;A oto co do powiedzenia ma na temat płyty Groszek (ze wszystkim się w stu procentach zgadzam):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Na płytę składa się dwanaście zaśpiewanych wierszy, opowiadających strzępy tragicznej historii dziewczyny z Grand Hotelu. Szczególną uwagę zwraca strona internetowa towary.art.pl promująca album, na której możemy wcielić się w rolę detektywa prowadzącego śledztwo. Oglądając kolejne fragmenty video i podążając właściwym tropem, z pewnością uda nam się zdobyć odpowiedzi na trzy pytania, co pozwoli ściągnąć album w formacie mp3 za darmo z sieci. Wytrwali mogą również odnaleźć prawdziwego mordercę i dotrzeć do kolejnych bonusów.&lt;br /&gt;&lt;br /&gt;Album dostępny jest również w bardziej namacalnej postaci. W atrakcyjnej cenie można nabyć akta sprawy, w których jednym z dowodów jest płyta. Doskonały pomysł na nietuzinkowy prezent i wsparcie twórczości artystów. Gorąco polecam!&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ja też polecam - kawał dobrej roboty i muzyki!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-3621912492800003850?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/lvWs1Crjg6c" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/3621912492800003850/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=3621912492800003850" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3621912492800003850?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3621912492800003850?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/05/niezy-kawaek-muzyki.html" title="Niezły kawałek muzyki" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;DUcARHo4eyp7ImA9WxJQE0s.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-3696232397458449146</id><published>2009-05-15T15:13:00.004+02:00</published><updated>2009-05-26T21:44:05.433+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-26T21:44:05.433+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="concurrency" /><title>Java Concurrency Bugs/Programmer's Errors</title><content type="html">Alex Miller has been posting very interesting &lt;a href="http://tech.puredanger.com/category/bug/"&gt;series&lt;/a&gt; on Java concurrency bugs (or pitfalls programmers could fall into). Especially interesting is the last post: &lt;a href="http://tech.puredanger.com/2009/05/13/java-concurrency-bugs-5-inconsistent-synchronization/"&gt;Inconsistent synchronization&lt;/a&gt;. This post is most probably inspired by the problems Alex discovered in &lt;a href="http://tech.puredanger.com/2009/05/13/hibernate-concurrency-bugs/"&gt;Hibernate statistics&lt;/a&gt; and I am pretty proud I was able to find possible concurrency issues reading the code. Anyway, I was not able to fully and correctly solve those issues.&lt;br /&gt;&lt;br /&gt;The conclusion for me is that I thought about "magic" solution instead of the correct one i.e. I suggested that declaring a integer field as &lt;code&gt;volatile&lt;/code&gt; would solve the issue. In fact it would but the "correct" solution to this problem is using &lt;a href="http://java.sun.com/javase/6/docs/api/java/util/concurrent/atomic/AtomicInteger.html"&gt;AtomicInteger&lt;/a&gt; from &lt;code&gt;java.util.concurrent.atomic&lt;/code&gt; package.&lt;br /&gt;&lt;br /&gt;Another conclusion is to remember to keep bombarding your Java code with &lt;a href="http://findbugs.sourceforge.net/"&gt;FindBugs&lt;/a&gt; - it can find many many Java issues in your code (not only related to concurrency).&lt;br /&gt;&lt;br /&gt;The rest of the Alex's series (so far) is here:&lt;br /&gt;&lt;a href="http://tech.puredanger.com/2009/02/02/java-concurrency-bugs-concurrentmodificationexception/"&gt;Java Concurrency Bugs #4: ConcurrentModificationException&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tech.puredanger.com/2009/01/30/java-concurrency-bugs-atomic/"&gt;Java Concurrency Bugs #3 - atomic + atomic != atomic&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tech.puredanger.com/2009/01/28/java-concurrency-bugs-synchronize-object/"&gt;Java Concurrency Bugs #2 - what to synchronize on&lt;/a&gt;&lt;br /&gt;&lt;a href="http://tech.puredanger.com/2009/01/27/java-concurrency-bugs-mutable-statics/"&gt;Java Concurrency Bugs #1 - mutable statics&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy you Java Concurrency Issues ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-3696232397458449146?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/LceA8WL1Yf4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/3696232397458449146/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=3696232397458449146" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3696232397458449146?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3696232397458449146?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/05/java-concurrency-bugsprogrammers-errors.html" title="Java Concurrency Bugs/Programmer's Errors" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;A0cGSHo7eip7ImA9WxJSFE8.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-2783029348547603225</id><published>2009-05-04T11:00:00.002+02:00</published><updated>2009-05-04T11:23:49.402+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-04T11:23:49.402+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="buzz" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Fun soft: regex checker</title><content type="html">I'm not a regular expressions expert but I use them often - as probably most of software developers. Before using them I want to be sure my regexes are written correctly and they will serve their purposes. I wrote very small command-line app for doing the check for me :) As a first input user provides the regex to check, then the user can type all texts to check against previously given regex until she types 'q' or 'exit' (for which program exits). Enjoy!&lt;br /&gt;&lt;pre name="code" class="java:nogutter"&gt;&lt;br /&gt;package com.bielu;&lt;br /&gt;&lt;br /&gt;import java.io.Console;&lt;br /&gt;&lt;br /&gt;public class RegexTester {&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    Console in = System.console();&lt;br /&gt;    if (in == null) {&lt;br /&gt;      System.err.println("Cannot obtain system console - exiting application");&lt;br /&gt;      return;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    System.out.print("Enter regex to test: ");&lt;br /&gt;    String regex = in.readLine();&lt;br /&gt; &lt;br /&gt;    while (true) {&lt;br /&gt;      System.out.printf("Type value to match with given regex '%s': ", regex);&lt;br /&gt;      String string = in.readLine();&lt;br /&gt;  &lt;br /&gt;      if (string.equalsIgnoreCase("q") || string.equalsIgnoreCase("exit")) {&lt;br /&gt;        break;&lt;br /&gt;      }&lt;br /&gt;  &lt;br /&gt;      if (string.matches(regex)) {&lt;br /&gt;        System.out.printf("'%s' matches '%s' regex\n", string, regex);&lt;br /&gt;      } else {&lt;br /&gt;        System.out.printf("'%s' does NOT match '%s' regex\n", string, regex);&lt;br /&gt;      }&lt;br /&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/37306137-2783029348547603225?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/tyY8nyqUtgA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/2783029348547603225/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=2783029348547603225" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/2783029348547603225?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/2783029348547603225?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/04/fun-soft-regex-checker.html" title="Fun soft: regex checker" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;Ck4ARn07cCp7ImA9WxJTGEs.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-3336353899517220004</id><published>2009-04-27T21:09:00.008+02:00</published><updated>2009-04-27T21:35:47.308+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-27T21:35:47.308+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="CSM" /><category scheme="http://www.blogger.com/atom/ns#" term="training" /><category scheme="http://www.blogger.com/atom/ns#" term="Scrum" /><category scheme="http://www.blogger.com/atom/ns#" term="certificate" /><title>Certified Scrum Master Training in Gdańsk</title><content type="html">&lt;center&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__TpWDBZjanA/SfYDyOfGNfI/AAAAAAAAGlc/6p0b3goaQ0M/s1600-h/scrum.png"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 97%;" src="http://3.bp.blogspot.com/__TpWDBZjanA/SfYDyOfGNfI/AAAAAAAAGlc/6p0b3goaQ0M/s400/scrum.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5329451370456430066" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;div style="text-align: justify;"&gt;I hope you already know that a cool company that is definitely one generation ahead than their competitors (at least as far as the way they work is concerned) called &lt;a href="http://spartez.com"&gt;Spartez&lt;/a&gt; organizes the first &lt;a href="http://spartez.com/eng/csmtraining.html"&gt;CSM Training&lt;/a&gt; in northern Poland, namely in &lt;a href="http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=gdansk&amp;ie=UTF8&amp;z=11&amp;iwloc=A"&gt;Gdańsk&lt;/a&gt;. The training will be led by famous &lt;a href="http://www.crisp.se/henrik.kniberg"&gt;Henrik Kniberg&lt;/a&gt; from whose book my adventure with real Scrum began. It is really a PITTY I will not be there :(&lt;br /&gt;&lt;br /&gt;But anyway - if you live somewhere in the central, eastern or northern Europe this training is definitely worth taking. I took CSM course in Zurich last week led by Angela Druckman and am very satisfied. This training is really worth it's price (or even more because I think the training is quite cheap).&lt;br /&gt;&lt;br /&gt;Don't waste your time and sign up for this &lt;a href="http://spartez.com/eng/csmtraining.html"&gt;CSM session&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/37306137-3336353899517220004?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/wih9EkKIJMk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/3336353899517220004/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=3336353899517220004" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3336353899517220004?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/3336353899517220004?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/04/certified-scrum-master-training-in.html" title="Certified Scrum Master Training in Gdańsk" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/__TpWDBZjanA/SfYDyOfGNfI/AAAAAAAAGlc/6p0b3goaQ0M/s72-c/scrum.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;D0QNRH8-eCp7ImA9WxJTEkw.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-6286527861871001503</id><published>2009-04-17T16:00:00.016+02:00</published><updated>2009-04-20T10:16:35.150+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-20T10:16:35.150+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="final" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="concurrency" /><title>The power of the final keyword - updated</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://www.flickr.com/photos/data_op/2735704097/"&gt;&lt;img src="http://farm4.static.flickr.com/3227/2735704097_cab90bcd07.jpg?v=0" style="margin-right: 5px; width: 220px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture courtesy of &lt;a href="http://www.flickr.com/photos/data_op/"&gt;Okko Pyykkö@flickr&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;These two articles of Alex Miller:&lt;ul&gt;&lt;li&gt;&lt;a href="http://tech.puredanger.com/2008/11/26/final-java/"&gt;A final bit of advice&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://tech.puredanger.com/2008/11/26/jmm-and-final-field-freeze/"&gt;JMM and final field freeze&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;clearly explain why using &lt;code&gt;final&lt;/code&gt; fields in concurrent programs is extremely powerful and safe (thread-safe).&lt;br /&gt;&lt;br /&gt;Take a look a this simple example:&lt;br /&gt;&lt;pre name="code" class="java:nogutter"&gt;&lt;br /&gt;public class SomeClass implements Runnable {  &lt;br /&gt;    private final LinkedHashMap map;&lt;br /&gt;      &lt;br /&gt;    public SomeClass(LinkedHashMap copiedMap) {&lt;br /&gt;        map = copiedMap;&lt;br /&gt;        preProcessMap();&lt;br /&gt;    }  &lt;br /&gt;     &lt;br /&gt;    private void preProcessMap() {&lt;br /&gt;        //some non-trivial and not-so-short computations&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // A read method  &lt;br /&gt;    public Object get(Object key) {  &lt;br /&gt;        return map.get(key);  &lt;br /&gt;    }  &lt;br /&gt;     &lt;br /&gt;    public void run() {&lt;br /&gt;        //assume that in this method only &lt;br /&gt;        //unsynchronized read operations on map may occur&lt;br /&gt;        //any unsynchronized write operation is not thread-safe&lt;br /&gt;    }&lt;br /&gt;    // etc...  &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;public class Main {&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;      LinkedHashMap map = // map creation&lt;br /&gt;      // map initialization&lt;br /&gt;      new Thread(new SomeClass(map)).start();&lt;br /&gt;      // etc.&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;b&gt;UPDATE:&lt;/b&gt;&lt;br /&gt;I preserved the original version of the code but after some thoughts and thanks to some comments (thank you dear readers) I conclude that this example is not 100% correct. Before &lt;code&gt;Thread.start()&lt;/code&gt; could be started the object has to be fully initialized and initialization will be completed only AFTER the &lt;code&gt;SomeClass&lt;/code&gt; object is created. This way &lt;code&gt;final&lt;/code&gt; keyword doesn't add any value there. On the other hand I meant this piece of code: &lt;pre name="code" class="java:nogutter"&gt;&lt;br /&gt;public class Main {&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;      LinkedHashMap map = // map creation&lt;br /&gt;      // map initialization&lt;br /&gt;      final ExecutorService service = Executors.newFixedThreadPool(1);&lt;br /&gt;      service.submit(new SomeClass(map));&lt;br /&gt;      // etc.&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;In such case I'm pretty sure you cannot assume that e.g. second processor (in a multi-core platform) will wait before executing newly scheduled task until the object of class &lt;code&gt;SomeClass&lt;/code&gt; is fully initialized, right? Correct me if I'm wrong because I feel have some mess in my brain now ;)&lt;br /&gt;&lt;b&gt;End of UPDATE&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Whatever happens in the &lt;code&gt;preProcessMap()&lt;/code&gt; method you can be sure that &lt;code&gt;LinkedHashMap&lt;/code&gt; will be copied and preprocessed BEFORE starting the &lt;code&gt;run()&lt;/code&gt; method by the new thread. This way any READ (get) operation on this map in all threads will be safe and will operate on completely and correctly initialized &lt;code&gt;map&lt;/code&gt; object.&lt;br /&gt;&lt;br /&gt;If only you remove &lt;code&gt;final&lt;/code&gt; keyword from &lt;code&gt;LinkedHashMap&lt;/code&gt; declaration you cannot be sure our previous assumption. It may happen that the thread will be started BEFORE copying the map and if in &lt;code&gt;run()&lt;/code&gt; method you process this map in any way you may get NPE.&lt;br /&gt;&lt;br /&gt;Let me use a bottle metaphor :) For me &lt;code&gt;final&lt;/code&gt; keyword is like the guarantee that you closed the bottle of whisky before passing it to your crazy friend who likes juggling them. If you ensure that the bottle is closed (final) before passing it to your friend you can be sure he will not spill any of the precious whisky on the floor. On the other hand if you start passing the bottle to him while trying to close it you're not sure whether it's fully closed while he starts juggling it or not. It may be closed 100% of time when you meet in your place but when you go to your other friend's party he may spill very expensive whisky and break the bottle in the same time (test and production environments metaphor this time). &lt;br /&gt;Conclusion? Close the bottle before giving it to anybody else.&lt;br /&gt;&lt;br /&gt;I will not be original and simply copy Alex Miller's advice:&lt;br /&gt;&lt;blockquote&gt;Final fields are ever so important and useful. Whenever possible, strive to make your fields final. One tip for this is to enable a Save Action in Eclipse (or your IDE of choice) that automatically attempts to make fields final if possible so you can’t forget!&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-6286527861871001503?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/mpgd6SG9b1s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/6286527861871001503/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=6286527861871001503" title="10 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/6286527861871001503?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/6286527861871001503?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/04/java-concurrency-is-easy-power-of-final.html" title="The power of the &lt;code&gt;final&lt;/code&gt; keyword - &lt;b&gt;updated&lt;/b&gt;" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">10</thr:total></entry><entry gd:etag="W/&quot;Ck8CRXw4fip7ImA9WxVUGU0.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-8371336367696894319</id><published>2009-03-24T14:13:00.001+01:00</published><updated>2009-03-24T14:21:04.236+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-24T14:21:04.236+01:00</app:edited><title>Why Object-Oriented languages rock?</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://lh3.ggpht.com/__TpWDBZjanA/SOjOkTCxy6I/AAAAAAAADYs/gf33fl5MO4I/s800/IMG_0422.jpg"&gt;&lt;img src="http://lh3.ggpht.com/__TpWDBZjanA/SOjOkTCxy6I/AAAAAAAADYs/gf33fl5MO4I/s800/IMG_0422.jpg" style="margin-right: 5px; width: 250px;" /&gt;&lt;/a&gt;&lt;/div&gt;I loved coming back from using &lt;a href="http://en.wikipedia.org/wiki/Transact-SQL"&gt;T-SQL&lt;/a&gt; to C# or Java like I loved the view from the picture (view from the &lt;a href="http://maps.google.fr/?ie=UTF8&amp;ll=43.487801,6.890488&amp;spn=0.170625,0.30899&amp;t=h&amp;z=12"&gt;l'Esterel's mountains&lt;/a&gt; towards Cannes). Of course, SQL-like languages are very powerful and when you do some complicated computations that need many requests to the underlying relational database, this choice may be the right one. At least, as far as the performance is concerned.&lt;br /&gt;&lt;br /&gt;If we leave performance concerns behind we still have the language itself. So, what did I miss in this language? I was thinking of enumerating things that I didn't like but after some thinking I conclude that I just missed object-orientation in general.&lt;br /&gt;&lt;br /&gt;But what it means? Let's see... I was not able to use any design pattern (e.g. &lt;a href="http://en.wikipedia.org/wiki/Factory_method_pattern"&gt;Factory&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Strategy_design_pattern"&gt;Strategy&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Decorator_pattern"&gt;Decorator&lt;/a&gt;) and I needed them very badly! Instead of using design patterns I had to add many ugly &lt;tt&gt;if&lt;/tt&gt;s.&lt;br /&gt;&lt;br /&gt;Another thing I missed was abstraction i.e. I wasn't able to create abstract stored procedure and then implement specialized subprocedures. In T-SQL everything you can do is to add some more &lt;tt&gt;if&lt;/tt&gt;s :) This language is strongly data-oriented which is maybe good but it's not sufficient IMHO.&lt;br /&gt;&lt;br /&gt;Yes - it's very vague but it doesn't make sense to compare stored procedures with OO constructs. T-SQL is just yet another language I've learnt and used after many years of writing Java/C++ code and I just wanted to express my feelings.&lt;br /&gt;&lt;br /&gt;I don't know what are perspectives for such SQL languages like T-SQL or &lt;a href="http://en.wikipedia.org/wiki/PL_SQL#Similar_languages"&gt;PL/SQL&lt;/a&gt; but I think they should evolve in an object-oriented way. It would be much easier to write stored procedures/classes in e.g. Java, test them and then deploy on the server. This would be a win-win situation. We would gain performance by having stored code invoked directly on the SQL server while we will still be able to use OO constructs and profit from unit tests, design patterns, etc.&lt;br /&gt;&lt;br /&gt;Maybe there already are such languages but I just don't know them (most of them are procedural languages) - if you know some let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-8371336367696894319?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/SYhSbVa2nQc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/8371336367696894319/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=8371336367696894319" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/8371336367696894319?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/8371336367696894319?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/03/why-object-oriented-languages-rock.html" title="Why Object-Oriented languages rock?" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/__TpWDBZjanA/SOjOkTCxy6I/AAAAAAAADYs/gf33fl5MO4I/s72-c/IMG_0422.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total></entry><entry gd:etag="W/&quot;D0IGQHs4fCp7ImA9WxVWGUU.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-7801982523873019715</id><published>2009-03-02T10:16:00.001+01:00</published><updated>2009-03-02T10:18:41.534+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-02T10:18:41.534+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="agile" /><category scheme="http://www.blogger.com/atom/ns#" term="unit testing" /><category scheme="http://www.blogger.com/atom/ns#" term="documentation" /><category scheme="http://www.blogger.com/atom/ns#" term="maintenance" /><title>Everybody Needs ... Unit Tests</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://flickr.com/photos/fridlund/2194911895/"&gt;&lt;img src="http://farm3.static.flickr.com/2313/2194911895_a621109592.jpg?v=0" style="margin-right: 5px; width: 220px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture courtesy of &lt;a href="http://flickr.com/photos/fridlund/"&gt;Lotus72@flickr&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;i&gt;... please remember people, no matter who you are, and whatever you do to live, thrive and survive, there are still some things that make us all the same: you, me, him, them - everybody, everybody!&lt;/i&gt; - this is a fragment of Blues Brothers' "Everybody Need Somebody" song. Nothing to do with software development but when you change the next line of this song from "Everybody needs somebody" to "Everybody needs Unit Tests" it becomes closer to software development.&lt;br /&gt;&lt;br /&gt;I intentionally used lyrics of this song to keep everyone's attention (just a little bit) to this post. If you are familiar with TDD and unit test your code you can disregard it - I'd like to address this post to all software engineers/developers/programmers/etc. that DO NOT unit test their code.&lt;br /&gt;&lt;br /&gt;In this post I will try (again) to convince all software developers that still don't unit test their code that it's right thing to do and it's damn simple.&lt;br /&gt;&lt;h2&gt;Assume that Agile software development is wrong, really wrong&lt;/h2&gt;&lt;br /&gt;You don't have to be the fan of Agile movement - you can even think it's stupid, immature and doesn't help software development at all. Maybe you're right, maybe not - it's rather a question of taste. You don't have to use or like Scrum, you may think that XP is crazy and an overkill - you have right to think so. I can understand everything but PLEASE do unit test your code! Forget about Agile, forget about processes and methodologies - just unit test your code.&lt;br /&gt;&lt;br /&gt;I just took over another project that is quite complex (of course it is!) but has NO SINGLE unit test (or any test at all). More so, there is no documentation of any kind. Yes I can read the code and see what it does - that's simple but how the hell I could know it does what it should do? How could I know it's not a mistake made by the developer who created this creature?&lt;br /&gt;&lt;br /&gt;This code lacks Unit Test, but fortunately day after day I add more and more and I'm more confident this piece of software works.&lt;br /&gt;&lt;h2&gt;Unit Testing once again&lt;/h2&gt;&lt;br /&gt;If you want to know something more about unit testing check out &lt;a href="http://agilesoftwaredevelopment.com/tags/unittesting"&gt;our previous articles&lt;/a&gt;. I will just recapitulate the most important, in my opinion, qualities of unit testing:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;unit tests document internal and external architecture of the software system&lt;/li&gt;&lt;br /&gt;&lt;li&gt;unit tests help you and other developers to immediately see whether code "improvements" broke already existing code&lt;/li&gt;&lt;br /&gt;&lt;li&gt;unit tests help making your software bug-free - all issues should be addressed by writing a failing test first&lt;/li&gt;&lt;br /&gt;&lt;li&gt;unit tests together with &lt;a href="http://agilesoftwaredevelopment.com/tags/codecoverage"&gt;code coverage&lt;/a&gt; tools improve quality of your software&lt;/li&gt;&lt;br /&gt;&lt;li&gt;unit tests can be used as a presentation platform - you can present hard to visualise issues using unit testing green bar - green means that it works&lt;/li&gt;&lt;br /&gt;&lt;li&gt;unit tests significantly improve team confidency in progress - if all the tests pass it means that all features implemented so far work and nobody broke the system&lt;/li&gt;&lt;br /&gt;&lt;li&gt;unit tests improve efficiency - you don't have to perform laborious manual tests again and again after code changes, just start unit tests and watch the red/green bar&lt;/li&gt;&lt;br /&gt;&lt;li&gt;already there but so important that worth reminding - unit tests work as a DOCUMENTATION (auxiliary or main one)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i&gt;I'm open for your propositions&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I hope I convinced you to start writing unit tests - if you don't like or believe in Agile movement it's OK. &lt;b&gt;Unit Testing is just an obligatory practice of every decent software developer.&lt;/b&gt; If you do unit test it doesn't mean you're good one but if you don't unit test you're a poor developer (I mean it).&lt;br /&gt;&lt;br /&gt;I wonder when unit testing will be taught obligatory at every decent university. It does so many good and is so simple - people, please - write unit tests!&lt;br /&gt;&lt;br /&gt;If you have any ideas how to convince every developer that unit testing is right thing to do I'm open for suggestions.&lt;br /&gt;&lt;br /&gt;Originally published on &lt;a href="http://AgileSoftwareDevelopment.com"&gt;AgileSoftwareDevelopment.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-7801982523873019715?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/3XYtHUBo3_w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/7801982523873019715/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=7801982523873019715" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/7801982523873019715?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/7801982523873019715?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2009/03/everybody-needs-unit-tests.html" title="Everybody Needs ... Unit Tests" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></entry><entry gd:etag="W/&quot;C08ASXs7fCp7ImA9WxJTEU4.&quot;"><id>tag:blogger.com,1999:blog-37306137.post-7785329299781449246</id><published>2009-02-16T08:00:00.001+01:00</published><updated>2009-04-19T11:04:08.504+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-19T11:04:08.504+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><category scheme="http://www.blogger.com/atom/ns#" term="collections" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorial" /><category scheme="http://www.blogger.com/atom/ns#" term="concurrency" /><title>Synchronized collections in Java 5+</title><content type="html">&lt;div style="float: left"&gt;&lt;a href="http://flickr.com/photos/swamibu/1182138940/"&gt;&lt;img src="http://farm2.static.flickr.com/1406/1182138940_b0b36d843d.jpg?v=0" style="margin-right: 5px; width: 220px;" /&gt;&lt;/a&gt;&lt;div style="font-size: xx-small" align="center"&gt;Picture courtesy of &lt;a href="http://flickr.com/photos/swamibu/"&gt;Swamibu@flickr&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;You probably encountered problem of which collection to use while writing concurrent applications. Which implementation to use when you have N concurrent writers and M concurrent readers? I will try to shortly answer this question on simple example. &lt;br /&gt;&lt;br /&gt;The code below presents usage of different collection implementations while having 16 concurrent writer threads and 100 concurrent reader threads. At the same time writer threads modify the collection i.e. add new elements and reader threads iterate through actual collection state and operate on its elements.&lt;br /&gt;&lt;pre name="code" class="java:nogutter"&gt;&lt;br /&gt;public class ConcurrentCollectionsTest {&lt;br /&gt; public static final int READERS_COUNT = 100;&lt;br /&gt; public static final int COLLECTION_SIZE = 5000;&lt;br /&gt; public static final int WRITERS_COUNT = 16;&lt;br /&gt;&lt;br /&gt; static volatile int readExceptionCount = 0;&lt;br /&gt;  static CountDownLatch latch;&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) throws Exception {&lt;br /&gt;  Map&amp;lt;String, Collection&amp;lt;String&amp;gt;&amp;gt; map = &lt;br /&gt;    new LinkedHashMap&amp;lt;String, Collection&amp;lt;String&amp;gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt;  map.put("ArrayList", &lt;br /&gt;      new ArrayList&amp;lt;String&amp;gt;());&lt;br /&gt;&lt;br /&gt;  map.put("Synchronized ArrayList", &lt;br /&gt;      Collections.synchronizedCollection(&lt;br /&gt;        new ArrayList&amp;lt;String&amp;gt;()));&lt;br /&gt;&lt;br /&gt;  map.put("ConcurrentLinkedQueue", &lt;br /&gt;      new ConcurrentLinkedQueue&amp;lt;String&amp;gt;());&lt;br /&gt;&lt;br /&gt;  map.put("CopyOnWriteArrayList", &lt;br /&gt;      new CopyOnWriteArrayList&amp;lt;String&amp;gt;());&lt;br /&gt;&lt;br /&gt;  for (Entry&amp;lt;String, Collection&amp;lt;String&amp;gt;&amp;gt; e: map.entrySet()) {&lt;br /&gt;   Collection&amp;lt;String&amp;gt; collection = e.getValue();&lt;br /&gt;   latch = new CountDownLatch(READERS_COUNT + WRITERS_COUNT);&lt;br /&gt;   readExceptionCount = 0;&lt;br /&gt;&lt;br /&gt;   long start = System.currentTimeMillis();&lt;br /&gt;   for (int i = 0; i &amp;lt; WRITERS_COUNT; ++i) {&lt;br /&gt;    Thread t = new Thread(new Writer(collection));&lt;br /&gt;    t.start();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   for (int i = 0; i &amp;lt; READERS_COUNT; ++i) {&lt;br /&gt;    Thread t = new Thread(new Reader(collection));&lt;br /&gt;    t.start();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   latch.await();&lt;br /&gt;   System.out.println("-----------------");&lt;br /&gt;   System.out.println("Stats for [" + e.getKey() + "]:");&lt;br /&gt;   System.out.printf("Collection's size: %d\n", collection.size());&lt;br /&gt;   System.out.printf("ConcurrentModificationException count [read]: %d\n", readExceptionCount);&lt;br /&gt;   System.out.printf("Duration: %d\n\n", System.currentTimeMillis() - start);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;static class Reader implements Runnable {&lt;br /&gt; private final Collection&amp;lt;String&amp;gt; collection;&lt;br /&gt;&lt;br /&gt; Reader(Collection&amp;lt;String&amp;gt; col) {&lt;br /&gt;  this.collection = col;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void run() {&lt;br /&gt;  try {&lt;br /&gt;   for (Iterator&amp;lt;String&amp;gt; i = collection.iterator(); i.hasNext();) {&lt;br /&gt;    // additional computing operation just to consume some time&lt;br /&gt;    String t = i.next() + "_added";&lt;br /&gt;    if (t.length() &gt; 10 &amp;&amp; i.hasNext()) {&lt;br /&gt;     i.next();&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  } catch (ConcurrentModificationException e) {&lt;br /&gt;   readExceptionCount++;&lt;br /&gt;  }&lt;br /&gt;  latch.countDown();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static class Writer implements Runnable {&lt;br /&gt; private final Collection&amp;lt;String&amp;gt; collection;&lt;br /&gt;&lt;br /&gt; Writer(Collection&amp;lt;String&amp;gt; col) {&lt;br /&gt;  this.collection = col;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void run() {&lt;br /&gt;  try {&lt;br /&gt;   for (int i = 0; i &lt; COLLECTION_SIZE; ++i) {&lt;br /&gt;    collection.add(Thread.currentThread().getName() &lt;br /&gt;        + System.currentTimeMillis());&lt;br /&gt;   }&lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;   // ignore&lt;br /&gt;  }&lt;br /&gt;  latch.countDown();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Results on my machine (numbers can vary on different hardware but problems/conclusions will be the same):&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;-----------------&lt;br /&gt;Stats for [ArrayList]:&lt;br /&gt;Collection's size: 77038&lt;br /&gt;ConcurrentModificationException count [read]: 17&lt;br /&gt;Duration: 1047 ms&lt;br /&gt;&lt;br /&gt;-----------------&lt;br /&gt;Stats for [Synchronized ArrayList]:&lt;br /&gt;Collection's size: 80000&lt;br /&gt;ConcurrentModificationException count [read]: 4&lt;br /&gt;Duration: 1141 ms&lt;br /&gt;&lt;br /&gt;-----------------&lt;br /&gt;Stats for [ConcurrentLinkedQueue]:&lt;br /&gt;Collection's size: 80000&lt;br /&gt;ConcurrentModificationException count [read]: 0&lt;br /&gt;Duration: 1046 ms&lt;br /&gt;&lt;br /&gt;-----------------&lt;br /&gt;Stats for [CopyOnWriteArrayList]:&lt;br /&gt;Collection's size: 80000&lt;br /&gt;ConcurrentModificationException count [read]: 0&lt;br /&gt;Duration: 14344 ms&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;&lt;b&gt;Conclusions&lt;/b&gt;&lt;br /&gt;&lt;tt&gt;ArrayList&lt;/tt&gt; (unsurprisingly) doesn't work at all - there is 17 ConcurrentModificationException on read attempt and what is more unacceptable this collection is in unpredictable state i.e. it's size should be 80000 instead of 77038 - it means that many items were not stored by the writer threads.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;Synchronized ArrayList&lt;/tt&gt; works better i.e. its state is correct but still you need additional synchronization in order to get rid of ConcurrentModificationException while iterating through it.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;ConcurrentLinkedQueue&lt;/tt&gt; works best in this case and does not add any performance penalties.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;CopyOnWriteArrayList&lt;/tt&gt; is the worst in this case because &lt;i&gt;traversal operations &lt;b&gt;does not&lt;/b&gt; vastly outnumber mutations&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;The last conclusion would be to perform such test before deciding which implementation works best in your particular case. Also, read javadoc carefully to see implications and suggested use cases.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/37306137-7785329299781449246?l=blog.bielu.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/FromJavaToJavaEe/~4/zJJ_ocCkTfw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.bielu.com/feeds/7785329299781449246/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=37306137&amp;postID=7785329299781449246" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/7785329299781449246?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/37306137/posts/default/7785329299781449246?v=2" /><link rel="alternate" type="text/html" href="http://blog.bielu.com/2008/12/java-concurrency-is-easy-synchronized.html" title="Synchronized collections in Java 5+" /><author><name>Przemysław Bielicki</name><uri>http://www.blogger.com/profile/15413461498736691725</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="00313775433780294050" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></entry></feed>
