<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:media="http://search.yahoo.com/mrss/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5715425530181339158</atom:id><lastBuildDate>Thu, 16 Feb 2012 13:32:38 +0000</lastBuildDate><category>Project Management</category><category>OSGi</category><category>web frameworks</category><category>development</category><category>Corporate</category><category>Free Software</category><category>thanks</category><category>maven</category><category>Tips</category><category>Java</category><category>ops4j</category><category>JavaOne</category><category>RIA</category><category>Daemon</category><category>Open Source</category><category>leasure</category><category>Enterprise</category><category>polyglot</category><category>HR Sightings</category><category>agile</category><category>sql</category><category>web 2.0</category><category>software</category><category>persistence</category><category>Linux</category><category>html</category><category>orm</category><category>License</category><category>Eclipse</category><category>book review</category><category>QCon</category><category>nosql</category><category>career</category><category>DDD</category><category>News</category><category>DevCon</category><title>Thomas Joseph's blog</title><description>Open thoughts, ideas and rants on FOSS, softwares, technology, methodologies, corporates, business and some random free thoughts.</description><link>http://blog.ethomasjoseph.com/</link><managingEditor>noreply@blogger.com (Thomas Joseph)</managingEditor><generator>Blogger</generator><openSearch:totalResults>39</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/rss+xml" href="http://feeds.feedburner.com/openthoughtworks" /><feedburner:info uri="openthoughtworks" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><media:copyright>Verbatim copying and distribution of this entire article is permitted in any medium without royalty, provided this notice is preserved and appropriate credit is given to the author(s) and/or this site.</media:copyright><media:category scheme="http://www.itunes.com/dtds/podcast-1.0.dtd">Technology/Tech News</media:category><creativeCommons:license>http://creativecommons.org/licenses/by-sa/3.0/</creativeCommons:license><image><link>http://creativecommons.org/licenses/by-sa/3.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-8167879025231205486</guid><pubDate>Sat, 03 Jul 2010 06:48:00 +0000</pubDate><atom:updated>2010-07-03T12:22:42.328+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><category domain="http://www.blogger.com/atom/ns#">Eclipse</category><title>Solving eclipse error with SVN 1.6 (loading JavaHL library)</title><description>If you are using Eclipse and SVN (Subversion), there are high chances that you are using the Eclipse plugin - &lt;a href="http://subclipse.tigris.org"&gt;Subclipse&lt;/a&gt;. And if you recently upgraded to subclipse 1.6, there is a good chance that you have encountered the error or loading JavaHL Library, that says something like this:
&lt;br/&gt;

&lt;blockquote&gt;&lt;strong&gt;Problem:&lt;/strong&gt;
&lt;pre class="brush: plain"&gt;
Failed to load JavaHL Library.
These are the errors that were encountered:
no libsvnjavahl-1 in java.library.path
no svnjavahl-1 in java.library.path
no svnjavahl in java.library.path
java.library.path = /opt/jdk/64/jdk1.6.0_20/jre/lib/amd64/server:/opt/jdk/64/jdk1.6.0_20/jre/lib/amd64:/opt/jdk/64/jdk1.6.0_20/jre/../lib/amd64:/usr/lib64/xulrunner-addons:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;br/&gt;
If this is the case, then few tips to get this working. As always, I will suggest solutions with the least number of steps, and all simple.
&lt;ol&gt;
&lt;li&gt;When installing/updating subclipse 1.6, use the update site - http://subclipse.tigris.org/update_1.6.x/ from within Eclipse.&lt;/li&gt;
&lt;li&gt;The installation screen shows the features. Make sure that all features marked "required" are selected for installation. (You will anyway be not allowed to proceed otherwise).&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
If it still does not work, it is highly possible that the Java native libraries required for the SVN to work together with Java (thats Java HL) is not available to the Java. Either not installed or just that Java is not able to find it.
&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;1. Install Java HL&lt;/h3&gt;
You can refer to &lt;a href="http://subclipse.tigris.org/wiki/JavaHL#head-7498d204a5be83e0e97d196ba75fc797d5f0c822"&gt;here&lt;/a&gt; for a generic discussion on this topic, especially for Windows and Mac OS. For Linux, I have simpler solutions :).
&lt;br/&gt;
Install through your package manager, a package named &lt;code&gt;libsvn-java&lt;/code&gt;, that contains the JavaHL. You must make sure that it is for SVN 1.6.
&lt;br/&gt;
For Ubuntu or other Debian based Linux, the command should be handy:
&lt;pre class="brush: bash"&gt;
sudo  apt-get install libsvn-java
&lt;/pre&gt;


&lt;br/&gt;
However, it is possible that the installation is requiring you to install the whole Java binaries itself, although you already have one (an old version, or a manually configured Java for example), and you are not willing to install the Java packages. In that case, just go to your package maintainer's site, and manually download the package, and unzip it to your system  (yes, you will need root permissions), so that the dependencies are not installed.
&lt;br/&gt;&lt;br/&gt;
If you had installations fine, without any hacks, restarting Eclipse should get your Subclipse working. If not, follow what is below.

&lt;br/&gt;
&lt;h3&gt;2. Make Eclipse runtime aware of the new JavaHL binaries.&lt;/h3&gt;.
There are two options for doing this:
&lt;ol&gt;
&lt;li&gt;Tell JVM/Eclipse about the JavaHL libraries when starting JVM with the system property, that points to the java library path where the JavaHL binaries are installed. eg:
&lt;pre class="brush: plain"&gt;
   -Djava.library.path=/usr/lib/jni
&lt;/pre&gt;
This option can be specified in config.ini as well.
&lt;/li&gt;
&lt;li&gt;
Put the JavaHL binaries in paths that JVM normally searches for native libraries. Normally these paths are listed, in the error above. Above the paths are listed as:
&lt;pre class="brush: plain"&gt;
java.library.path = /opt/jdk/64/jdk1.6.0_20/jre/lib/amd64/server:/opt/jdk/64/jdk1.6.0_20/jre/lib/amd64:/opt/jdk/64/jdk1.6.0_20/jre/../lib/amd64:/usr/lib64/xulrunner-addons:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

I went for the second option, since that one seemed most non-intrusive and easy to me. Let me show it how I did that:
&lt;ol&gt;
&lt;li&gt;Choose any of the listed Java library paths. In a terminal, move into that directory:&lt;/li&gt;
&lt;pre class="brush: bash"&gt;cd /usr/lib/jvm/java-6-sun/jre/lib/i386&lt;/pre&gt;
&lt;li&gt;
Make softlinks to the JavaHL libraries.
&lt;pre class="brush: bash"&gt;
sudo ln -s /usr/lib/jni/libsvnjavahl-1.so libsvnjavahl-1.so
sudo ln -s /usr/lib/jni/libsvnjavahl-1.so.0 libsvnjavahl-1.so.0
sudo ln -s /usr/lib/jni/libsvnjavahl-1.so.0.0.0 libsvnjavahl-1.so.0.0.0
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;br/&gt;
Now restarting Eclipse should get everything working fine. If it does not, review your steps, and also read in full length about JavaHL from &lt;a href="http://subclipse.tigris.org/wiki/JavaHL"&gt;http://subclipse.tigris.org/wiki/JavaHL&lt;/a&gt;, and try the steps again.&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-8167879025231205486?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/gyQjxzfoljq6kracwlZcXy21gYI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gyQjxzfoljq6kracwlZcXy21gYI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/gyQjxzfoljq6kracwlZcXy21gYI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/gyQjxzfoljq6kracwlZcXy21gYI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=DY0s3wy65nY:ETBz59DkLH8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=DY0s3wy65nY:ETBz59DkLH8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=DY0s3wy65nY:ETBz59DkLH8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=DY0s3wy65nY:ETBz59DkLH8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=DY0s3wy65nY:ETBz59DkLH8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=DY0s3wy65nY:ETBz59DkLH8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=DY0s3wy65nY:ETBz59DkLH8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=DY0s3wy65nY:ETBz59DkLH8:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=DY0s3wy65nY:ETBz59DkLH8:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/DY0s3wy65nY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/DY0s3wy65nY/solving-eclipse-errors-with-svn-1-6.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2010/07/solving-eclipse-errors-with-svn-1-6.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-8761943781117941503</guid><pubDate>Thu, 24 Jun 2010 18:52:00 +0000</pubDate><atom:updated>2010-06-25T00:22:02.818+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tips</category><category domain="http://www.blogger.com/atom/ns#">Linux</category><title>Running tomcat/webserver on port 80/443 without root permissions on Linux</title><description>&lt;h3&gt;The Problem&lt;/h3&gt;One of the concerns for web application developers is to run their web servers on the default port (which is 80 for HTTP, and 443 for HTTPS). However, since these ports are privileged ports (ports less that 1024 are privileged ports in Linux/UNIX), the developers are either required to run the server either as a root, or run on alternative non privileged ports such as 8080 or 8443.
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;The Solution&lt;/h3&gt;While to the same problem, there may be different solutions, the most simplest of all that I found was to do local port forwarding. Again here, many do not like to fiddle with commands every time. An easier, and one time solution to this is to use a program called "guidedog".
&lt;br/&gt;&lt;br/&gt;
Guidedog is a GUI based advanced and powerful networking configuration tool for Linux, that can be used for packet routing, NAT and port-forwarding. Although it is for KDE, your Linux package manager should be intelligent enough to make that work for you even if you do not use KDE. We will here use its port-forwarding feature.
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Steps&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Launch your favorite package manager tool (Synaptic/Aptitude/YUM etc) and install "guidedog". For Ubuntu I use Synaptics Package manager, or even a command would do.
&lt;br/&gt;
&lt;pre class="brush: bash"&gt;
sudo apt-get install guidedog
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Once installed, launch the application with root permissions (don't worry, you require it to do just once).
&lt;br/&gt;
&lt;pre class="brush: bash"&gt;
sudo guidedog&lt;/pre&gt;
&lt;br/&gt;
On Ubuntu, you can also find it under the menu Applications-&gt;Other. You will have to even edit the menu command to &lt;code&gt;gksu guidedog&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Move to the "Forward" tab. Add a new rule, such that TCP traffic on port 80 is forwarded to port 8080 (or whatever port your server runs on). Similarly, add another rule, such that TCP traffic on port 443 is forwarded to port 8443 (or whatever port your server runs on for HTTPS/SSL connections). After you are done, your screen should look like this:&lt;br/&gt;&lt;br/&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://static.openthoughtworks.com/images/guidedog.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img class="border" src="http://static.openthoughtworks.com/images/guidedog.png" width="400px"/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Apply the changes.&lt;/li&gt;
&lt;/ol&gt;
You are done. Now just hit on &lt;code&gt;localhost&lt;/code&gt; instead of &lt;code&gt;localhost:8080&lt;/code&gt;, next time you start your applications.
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Tool power&lt;/h3&gt;
The tool creates a system rule to forward the traffic to a different port(8080/8443) from its original destination (port 80/443) on the same machine. You can see in the tool that it is much more powerful, and can allow even port forwarding for other machines too, or even do IP Masquadering/NAT (Network Address Transilation). However, explaining on these topics would outgrow the topic of this blog and would take more of your and my time too.&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-8761943781117941503?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hARAPh8P-cK-5rhVrbT2edYoMlI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hARAPh8P-cK-5rhVrbT2edYoMlI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hARAPh8P-cK-5rhVrbT2edYoMlI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hARAPh8P-cK-5rhVrbT2edYoMlI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=ujjBIf5ZJ7A:bVivuVw7t6U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=ujjBIf5ZJ7A:bVivuVw7t6U:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=ujjBIf5ZJ7A:bVivuVw7t6U:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=ujjBIf5ZJ7A:bVivuVw7t6U:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=ujjBIf5ZJ7A:bVivuVw7t6U:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=ujjBIf5ZJ7A:bVivuVw7t6U:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=ujjBIf5ZJ7A:bVivuVw7t6U:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=ujjBIf5ZJ7A:bVivuVw7t6U:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=ujjBIf5ZJ7A:bVivuVw7t6U:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/ujjBIf5ZJ7A" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/ujjBIf5ZJ7A/running-tomcatwebserver-on-port-80443.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2010/06/running-tomcatwebserver-on-port-80443.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-6216279000115585705</guid><pubDate>Mon, 24 May 2010 17:04:00 +0000</pubDate><atom:updated>2010-06-25T00:30:36.589+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tips</category><category domain="http://www.blogger.com/atom/ns#">Linux</category><title>VNC via SSH tunneling</title><description>&lt;h2&gt;5 simple steps to connect through VNC to office/work PC via SSH tunneling&lt;/h2&gt;

&lt;h3&gt;Situation:&lt;/h3&gt;You have to connect to your office PC from home via VNC, but your office PC does not have a public IP. The only way to access your PC is through one of the access point machines provided by your office that can be reached through Internet.
&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Concept:&lt;/h3&gt;VNC port is 5900. You can ssh tunnel to your office PC through your office access point, and connect to this tunnel to have VNC connection.
&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Assumption:&lt;/h3&gt;&lt;strong&gt;Office access point machine:&lt;/strong&gt;&amp;nbsp;&lt;code&gt;accesspts1.company.com&lt;/code&gt;&lt;br/&gt;
&lt;strong&gt;Internal IP of your office machine:&lt;/strong&gt;&amp;nbsp;&lt;code&gt;192.168.1.31&lt;/code&gt;
&lt;br/&gt;&lt;br/&gt;
Also assume that your Office PC is switched on, and access point machine can access your office PC via the internal IP, and can access its ports as well.
&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Steps:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;SSH to access point machine. Provide password when prompted&lt;br/&gt;
&lt;pre class="brush: bash"&gt;ssh username@accesspts1.company.com&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;Now that you are on access point machine, ssh from there to your office PC. Again provide password when prompted.&lt;br/&gt;
&lt;pre class="brush: bash"&gt;ssh username@192.168.1.31&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;On your office pc, start VNC server. Keep this terminal open.&lt;br/&gt;
&lt;pre class="brush: bash"&gt;x11vnc&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;On another terminal, make open a tunnel to your office pc via the access point. Provide the password for your access point machine when prompted.&lt;br/&gt;
&lt;pre class="brush: bash"&gt;ssh -L 0.0.0.0:xxxx:192.168.1.31:5900 username@accesspts1.company.com&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;Use an VNC viewer to connect to your Office PC via the tunnel. Use the following details:&lt;br/&gt;
&lt;blockquote&gt;&lt;strong&gt;Host:&lt;/strong&gt; localhost&lt;br/&gt;
&lt;strong&gt;Port:&lt;/strong&gt; xxxx&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-6216279000115585705?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/0XfE-w8VDi0dS7Egjg05_H_UCtw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0XfE-w8VDi0dS7Egjg05_H_UCtw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/0XfE-w8VDi0dS7Egjg05_H_UCtw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/0XfE-w8VDi0dS7Egjg05_H_UCtw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=pZYvdTrrcpU:THgDWlCD880:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=pZYvdTrrcpU:THgDWlCD880:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=pZYvdTrrcpU:THgDWlCD880:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=pZYvdTrrcpU:THgDWlCD880:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=pZYvdTrrcpU:THgDWlCD880:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=pZYvdTrrcpU:THgDWlCD880:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=pZYvdTrrcpU:THgDWlCD880:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=pZYvdTrrcpU:THgDWlCD880:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=pZYvdTrrcpU:THgDWlCD880:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/pZYvdTrrcpU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/pZYvdTrrcpU/vnc-via-ssh-tunneling.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2010/05/vnc-via-ssh-tunneling.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-1161141756467491596</guid><pubDate>Tue, 30 Mar 2010 15:15:00 +0000</pubDate><atom:updated>2010-08-23T00:18:25.786+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">Project Management</category><title>Agility and more - better &amp; faster business solutions with software - part-3</title><description>In my previous &lt;a href="http://blog.openthoughtworks.com/2010/03/agility-and-more-better-faster-business_29.html"&gt;posts&lt;/a&gt;, I discussed about practicing agile in real life, and why adapting the agile prescriptions is important. I discussed how the basic values of Agile manifesto narrates it all. This is my last post in this series, where I will explain about practices even beyond the direct agile prescriptions, that can help build faster and quality software with smiling teams.&lt;br /&gt;&lt;br /&gt;
&lt;h2&gt;





Some Agility and beyond&lt;/h2&gt;While the software creation itself is creative, the process employed to create this software is also creative. Its not just practicing agile, that helps create good software, there are more things to it. The craftsman (developer) who creates software has also to be given importance (Did I mention that before?). Let me discuss few of these things that include things from the Agile practices such as XP and Scrum, as well as those that go beyond them.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;
&lt;h3&gt;





XP practices&lt;/h3&gt;
Focus on producing better software with &lt;a href="http://martinfowler.com/articles/designDead.html"&gt;XP practices&lt;/a&gt; such as &lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;continuous integration&lt;/a&gt;, with focus on unit tests, integration tests, and automated functional/UAT tests. I do not want to go to the depth of CI and unit tests, but it helps you be confident on regressions, as the software evolves. There are few other inherent advices that Martin Fowler has with the CI such as "&lt;i&gt;Keep the Build Fast&lt;/i&gt;", "&lt;i&gt;Test in a Clone of the Production Environment&lt;/i&gt;", "&lt;i&gt;Make it Easy for Anyone to Get the Latest Executable&lt;/i&gt;" etc. I would highly recommend reading his article.&lt;br /&gt;
&lt;br /&gt;
Continuously try to clear up the &lt;a href="http://www.martinfowler.com/bliki/TechnicalDebt.html"&gt;technical debts&lt;/a&gt;. Did a Quick Fix? Create a ticket that says,.. fix it! Removing old legacy and unused code - it helps developers avoid straying away to look at an unused code, to fix problems, and faster induction of new joiners to team. Old code also makes large codebase, maintenance problems, larger build time and lots of confusion.&lt;br /&gt;
&lt;br /&gt;
Equally important is a focus on continuous &lt;a href="http://en.wikipedia.org/wiki/Refactor"&gt;refactoring&lt;/a&gt; for improved code readability reduced complexity and improved the maintainability and extensibility, for one or more of its benefits. This also helps clear our technical debts.&lt;br /&gt;
&lt;br /&gt;
Closely related to refactoring is the CI, that would help us to be sure that code refactoring is going fine. And to be confident in that a lots of test-cases needs to be in, that would ensure that there are no regressions. So develop a habit of writing unit test case for every bug or feature request. From my experience, going fully TDD (Test Driven Development) sounds like crazy as we develop all the tests-cases upfront, while having no test case or very scanty is also not a good practice. My experience is good to stay somewhere between - say at 50-85%, if we assume TDD to be 100% for writing test cases (use your mind and adapt!).&lt;br /&gt;
&lt;br /&gt;
The rule is simple. Start out lean, and consult Scrum and XP for places they are expert in. You need not take all their advice, but taking an advice is always good. Have something very technical - probably XP is good, other places Scrum is good, some other places - you get advice from both.&lt;br /&gt;
&lt;h3&gt;





Know your team velocity&lt;/h3&gt;
It is very important to know your teams velocity. What is the team capacity to crunch out the story points (or whatever measure you keep) given to them? If the team velocity is not known, it release dates predicted may not be credible. There are various ways to measure your team velocity. For example, you could measure your team velocity by recording the story points finished for a period of time, or measure the amount of original estimated hours that the team could finish for a period of time.&lt;br /&gt;
&lt;br /&gt;
Talking of this, it is important to remember that the efficiency (sometimes called the &lt;i&gt;Focus Factor&lt;/i&gt;) of the team is never 100%, since teams lose time doing unplanned items, doing context switches, helping other teams, checking their email, fixing network snag etc. With my experience, even when we had 9-6 working day, we normally counted it as 8 hours working day assuming the 1 hour lunch time as a normal organizational practice. However, when doing plannings, we used to calculate only 7 hours for a day, and hence allot only 6.5 - 7 hours of approximate work per person per day. That would be around 75-80% efficiency. However, you may like to bill your client w.r.t to all the time spent i.e 8 hours per day per person, which is perfectly fine! :)&lt;br /&gt;
&lt;br /&gt;
It may sound ridiculous to count 60% or 70% efficiency, but on real analysis of your team, it is normal to find such statistics. However, such a statistics is helpful to make realistic expectation from your team, and commit to reliable release dates.&lt;br /&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://lh4.ggpht.com/_yr1SU8wX2Ls/S6tHiORQrtI/AAAAAAAAAaA/_6ysni8HSCI/cumilative-flow-diagram.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img class="border" height="206" src="http://lh4.ggpht.com/_yr1SU8wX2Ls/S6tHiORQrtI/AAAAAAAAAaA/_6ysni8HSCI/cumilative-flow-diagram.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="font-size: x-small;"&gt;Cumulative Flow diagram depicts the team velocity and the lead time required to finish items - helps to plan and minimise queues/waiting times.&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="font-size: x-small;"&gt;(&lt;i&gt;Image reproduced from the &lt;a href="http://www.infoq.com/minibooks/kanban-scrum-minibook"&gt;InfoQ minibook&lt;/a&gt;&lt;/i&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Most organizations want to reduce lead time, and do get things done faster. Unfortunately many try to do this by getting more people in or working overtime. Usually the most effective way to get stuff done faster is to smooth out the flow and limit work to capacity, not add more people or work harder. This type of diagram shows why, and thereby increases the likelihood that the team and management will collaborate effectively.&lt;br /&gt;
&lt;br /&gt;
The velocity does not vary much, however, you will have to regularly measure your team velocity, since velocity may increase with experience and expertise. However, this velocity may not change drastically over successive iterations, except for may be the first few iterations, when you are still stabilising over the agile practices, or when the team is new to a project. Release planning with these statistics can would help achieve timely and reliable releases and yet prevent team burnouts.&lt;br /&gt;
&lt;h3&gt;





Clear goals and minimized wait times&lt;/h3&gt;
While focusing on individual productivity is important, it is also important to understand that they maintain their productivity when working as a team. One important factor that may hamper individual productivity when working as a team may be lack of clear goals on what to do next. Having a clear-cut road-map for not just for the day, for for the coming week itself may be good.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://lh6.ggpht.com/_Vtp_0kLqub4/S4G-krr-kBI/AAAAAAAAr1w/mbva9VBFmBg/s1600/Photos031.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img class="border" src="http://lh6.ggpht.com/_Vtp_0kLqub4/S4G-krr-kBI/AAAAAAAAr1w/mbva9VBFmBg/s320/Photos031.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="font-size: x-small;"&gt;Minimising wait times increases team throughput&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;&lt;span style="font-size: x-small;"&gt;(Image Courtesy: Vype's &lt;a href="http://picasaweb.google.com/trianglepics"&gt;web album&lt;/a&gt;) &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
Another factor to be considered is to reduce dependence on each other. Plan out the iteration road-map so that there is minimal dependence of one on the other. See that a team-member is not waiting for the other to finish. There may be dependence, but then, the timing can be adjusted for it. In manufacturing, a good importance is given to reduce queues of intermediate products to reduce costs and increase throughput. For software development, there is no silver bullet for this, however providing an execution plan upfront can help in this, since if developer knows what needs to be done for tomorrow or next week and something that is independent of the current work, they can go ahead and start doing that task, so that individual productivity remains high. Well planned iteration backlog, daily stand-ups and scrum principles of removing impediments can help a lot to this.&lt;br /&gt;
&lt;h3&gt;





Automate to Scale&lt;/h3&gt;
Try to bring automation to places wherever possible, since doing things manually doesn't scale, but machines can scale. That's how Google has achieved its excellence - by relying on algorithms and machines to scale rather than depending on humans. Automation can be brought at many places - CI, &lt;a href="http://martinfowler.com/articles/continuousIntegration.html#AutomateTheBuild"&gt;intelligent builds&lt;/a&gt; for every commits, sending error reports of CI and builds, and other automated testing, smoke testing, functional testing, and even &lt;a href="http://martinfowler.com/articles/continuousIntegration.html#AutomateDeployment"&gt;deployments&lt;/a&gt;. You will definitely avoid team burnouts!&lt;br /&gt;
&lt;h3&gt;





Reduce complexity of the software&lt;/h3&gt;
Reducing complexity in your software would help a long way in more than one ways to create good software. Well known agile and modularity guru &lt;a href="http://techdistrict.kirkk.com/about-kirk/"&gt;Kirk Knoernschild&lt;/a&gt; explained in his keynote speech during the recent Jax London conference about reducing &lt;a href="http://techdistrict.kirkk.com/2010/02/17/osgi-devcon-preview/"&gt;complexity in the software&lt;/a&gt;. But there is no silver bullet to this, though modularising application is a definite direction to this.&lt;br /&gt;
&lt;br /&gt;
Kirk further explains the cost of complexity with the following &lt;a href="http://users.jyu.fi/%7Ekoskinen/smcosts.htm"&gt;statistics&lt;/a&gt;:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;The number of lines of code doubles every 7 years&lt;/li&gt;
&lt;li&gt;50% of development time is spent understanding code&lt;/li&gt;
&lt;li&gt;90% of software cost is maintenance and evolution&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
Look at the #2! So if complexity is reduced, time spent in understanding code is reduced, thereby speeding up the overall development process. It is natural for the systems to grow complex over time, and as system evolves, unless efforts are put in to reduce this complexity.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://lh5.ggpht.com/_R9dwm3RMQB8/ST08ZZv-e1I/AAAAAAAACAU/Lps5LwgU1HE/DSC05364%20%28small%29.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img class="border" height="240" src="http://lh5.ggpht.com/_R9dwm3RMQB8/ST08ZZv-e1I/AAAAAAAACAU/Lps5LwgU1HE/DSC05364%20%28small%29.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;&lt;span style="font-size: x-small;"&gt;"As a system evolves, its complexity increases unless work is done to 
maintain or reduce it.&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-size: x-small;"&gt; "&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;&lt;span style="font-size: x-small;"&gt;(Image Courtesy: Flavio's &lt;a href="http://picasaweb.google.com/byte964"&gt;web album&lt;/a&gt;)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
There is more to reducing complexity in the code:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Write less code&lt;/li&gt;
&lt;li&gt;Build modular applications&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;





Write less code&lt;/h4&gt;
Avoid writing code whenever possible. The mantra is "less is more". Avoid writing code that is not your main line of business. Many teams spend lot of time and energy writing huge chunks of code and configuration for creating "&lt;i&gt;platforms&lt;/i&gt;". Platforms are necessary, but try to evolve it from existing and stable code libraries and frameworks as something that has the least glue code, so that your framework can evolve over time. For example, you need to have great amount of integration points in your application, before jumping ahead to write message brokers, message bus, and all those fancy ESB kind of features, consider one of those ESB's and message brokers available out in the open source or its commercial variant. Will the original author be available all through the project life-cycle to explain the code and intent? Who will maintain it? Will the subsequent maintainers fully understand the code and its intent? When we use popular libraries and frameworks, there is more chance of finding developers who already have knowledge in it.&lt;br /&gt;
&lt;br /&gt;
When developing internal frameworks, its imperative that we design for even what requirements may come after 10 years, but the fact is that even after just 4-6 years, you will be hardly using the same system. Technology may have changed, your requirements may have widely changed and you end to design another &lt;i&gt;framework&lt;/i&gt; to tackle those, or may have added a bunch of code to your existing system, and many of the capacities of your old &lt;i&gt;framework&lt;/i&gt; goes unused.&amp;nbsp; Still if you feel compelled to write some good amount of code for your framework, consider to market it separately or may be consider still better open sourcing it, so that you can early find co-developers, and build a community around that. Of course you can always commercially sell a software that you have open-sourced.&lt;br /&gt;
&lt;h4&gt;





Build modular applications&lt;/h4&gt;
While writing modular applications is like a very common vocabulary that we use and have this intent when we design our applications, the reality is that &lt;a href="http://njbartlett.name/blog/2010/03/17/osgi-and-how-it-got-that-way/"&gt;achieving "true" modularity is difficult&lt;/a&gt;. Writing component based applications may provide some answer. For Java applications considering &lt;a href="http://www.osgi.org/"&gt;OSGi&lt;/a&gt; may be a &lt;a href="http://blog.openthoughtworks.com/2008/07/osgi-add-dynamic-modularity-to-your.html"&gt;good choice&lt;/a&gt;, that has been upheld by all the major application server vendors including IBM, Oracle and Sun. Recent JVM modularity to be introduced with Java 7 with &lt;a href="http://openjdk.java.net/projects/jigsaw/"&gt;Jigsaw&lt;/a&gt;, and the Oracle's more recent modularity efforts with &lt;a href="http://qwylt.org/"&gt;Qwylt&lt;/a&gt; are also interesting move towards this.&lt;br /&gt;
&lt;h3&gt;





Focus on developer productivity - tools and techniques continuously&lt;/h3&gt;
To have a faster development and lesser team burnouts, one very important factor is to focus on how effective is the software craftsman in performing the very act of producing software. It is important to look out to improve developer productivity at every act of the software development - project layout, development mode and development cycle time, running tests, IDE integration, build tool effectiveness, conventions over configuration, code and architecture complexity.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Unit tests and integration tests&lt;/b&gt; should be easy to run in all possible ways - with regular builds, test builds, CI builds, and even in IDEs. This helps to frequetnly run the tests withing IDE, and be confident on the code from the very beginning of writing code. This helps a lot especially when refactoring code. Running tests should be equally easy and simple from the command line as well.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Focus on conventions over configuration&lt;/b&gt; principles on all possible aspect of software development (including build - eg Maven). Although choice of &lt;a href="http://javamoods.blogspot.com/2010/02/maven-vs-ant-stop-battle.html"&gt;build tool is not a religion&lt;/a&gt;, Maven is for one thing a great &lt;a href="http://www.leshazlewood.com/?p=55"&gt;productivity improving&lt;/a&gt;, since once you learn Maven, you know it even when you change your projects. Adopting such practices also brings down the learning curve, and even new joiners can get productive quickly. Applying this principle is not just for project layout, but the overall architecture and day-to-day coding as well. &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Watch out and remove impediments &lt;/b&gt;required for a fast build-run cycles. Does the build require punching in a lot of key strokes? Also watch out with continual performance tuning. Does running of you app, almost freezes a 3GB memory system? - High time that you lookout for memory leaks, and do application startup tweaks. At production you may be countering this with a massive server configuration, but think if trimming the code would actually save you on team's energy as well as on your server infrastructure money as well! The builds should be easiliy launched from within and outside IDE. If you have multiple IDEs, make sure that all the IDEs work just fine (Maven plugins are available for almost all major IDEs, that can help you do this).&lt;/li&gt;
&lt;li&gt;Strive to find tools that would make things easy and remove/ automate / lessen hassles and repetitious tasks. Tools need not be always visible, eg.. scrum and kanban are tools for process improvement, while &lt;a href="http://www.springsource.org/roo"&gt;Spring ROO&lt;/a&gt; is also a tool that explicitly focuses on developer productivity. For instance promote &lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt; or similar JavaScript library instead of fully hand crafted JavaScripts.&lt;/li&gt;
&lt;li&gt;Carefully choose and use &lt;a href="http://en.wikipedia.org/wiki/Comparison_of_issue_tracking_systems"&gt;issue tracking systems&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/Comparison_of_wiki_software"&gt;wiki software&lt;/a&gt; for your requirements:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Choosing issue tracking systems with integration to your SCM. This would be good to track the commits for a particular issue, and ease code reviews.&lt;/li&gt;
&lt;li&gt;Use popular solutions:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;There is more probability of finding experienced users- less learning curve.&lt;/li&gt;
&lt;li&gt;You don't have to maintain that s/w which is not your mainline business.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Consider Distributed SCM soultions like &lt;a href="http://git-scm.com/%20"&gt;git&lt;/a&gt; or &lt;a href="http://mercurial.selenic.com/"&gt;mercurial&lt;/a&gt; (Remember that this is just a tool, but it &lt;a href="http://www.joelonsoftware.com/items/2010/03/17.html"&gt;helps manage changes&lt;/a&gt; rather than versions, and so that branching and merging is simple.).&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Have easy read code-bases, easy run executables and easy obtainable project artifacts. Martin Fowler nicely describes this in &lt;a href="http://martinfowler.com/articles/cotinuousIntegration.html#MaintainASingleSourceRepository"&gt;his article&lt;/a&gt;, where I would like to highlight a &lt;i&gt;few&lt;/i&gt; items:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Have everything you need to do a build should be in there including: test scripts, properties files, database schema, install scripts, and third party libraries. Note: Maven eases this out, since you have a separate system (a maven repository) to maintain third party library, and you would just put the dependencies in your POM. The basic rule of thumb is that you should be able to walk up to the project with a virgin machine, do a checkout, and be able to fully build the system. Putting in IDE configuration file is also a good practice. However, do not store the build products itself in the SCM., this rather indicates a flaky build technique that cannot reliably recreate builds.&lt;/li&gt;
&lt;li&gt;Keep your use of branches to a minimum. In particular have a &lt;i&gt;mainline&lt;/i&gt;: a single branch of the project currently under development. Pretty much everyone should work off this mainline most of the time. (Reasonable branches are bug fixes of prior production releases and temporary experiments.)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://martinfowler.com/articles/continuousIntegration.html#MakeItEasyForAnyoneToGetTheLatestExecutable"&gt;Make it Easy for Anyone to Get the Latest Executable&lt;/a&gt; - To help make this work, anyone involved with a software project should be able to get the latest executable and be able to run it: for demonstrations, exploratory testing, or just to see what changed this week. Doing this is pretty straightforward: make sure there's a well known place where people can find the latest executable. An internal Maven repository for example is a great place.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
This discussion is not a comprehensive one describing each and every bottlenecks for faster development and increased productivity, but covers a lot of ground on it. You may share your own experiences and discussion points using the comments section in this blog.&lt;br /&gt;
&lt;h3&gt;





Technology, R&amp;amp;D and more&lt;/h3&gt;
&lt;b&gt;Encourage R&amp;amp;D within your organization&lt;/b&gt;.&lt;br /&gt;
Have a dedicated R&amp;amp;D team if possible. Swap people in and out of the R&amp;amp;D team. Encourage people in all teams to spend 20% time for doing something creative, or may be blog to start with. Consider putting people to R&amp;amp;D as an alternative to benching, if you have such a practice. Encourage the R&amp;amp;D team to publish their findings regularly through blogs and research papers. I will blog separately about the need for blogging. You can identify your gems working this way.&lt;br /&gt;
&lt;br /&gt;
The &lt;i&gt;80:20 principle&lt;/i&gt; at Google is there to bring out wild ideas from developer minds to be experimented. Some of the great projects from Google including GMail, Google News etc have been the result of such researching and experimenting mentality of Googlers.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Technology is still important!&lt;/b&gt;&lt;br /&gt;
As emphasized in the &lt;a href="http://blog.openthoughtworks.com/2009/03/domain-driven-design-in-10-minutes_31.html"&gt;DDD&lt;/a&gt; principles - give good focus to the business at hand, but at the same time don't neglect technology. New technologies emerge to solve challenges that the existing ones cannot solve or because they are not efficient in doing that. This underlines the importance of using newer technology to solve our technical problems. Keep a balance however. It would not be recommend to use bleeding edge technology for production use, but encourage R&amp;amp;D learning to use the new technology 'wisely' whenever needed and possible.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Community learning&lt;/b&gt;&lt;br /&gt;
Encourage your team to get involved with some good and popular open source project. This could also be a project something that you use yourself, or are planning to use in the near future. It has many benefits - when you officially can take part in OSS activities, you are getting better visibility to your company, apart from the learning that your team and company as a whole gains in the process. There are many ways in which the team can participate - participating in forums and discussions, filing bug reports (with test cases preferred), feature requests, subscribing to developer mailing lists if available,&amp;nbsp; and if possible - commit code, help with release etc. The team also gets better knowledge of good standard practices for software development - issue/ticket management, coding, testing, continuous integration, release, deployment etc.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://lh6.ggpht.com/_uNN_nz3Bwnk/Si584XEON9I/AAAAAAAADhQ/ZSSUVMAMQ44/IMG_6770.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img class="border" height="240" src="http://lh6.ggpht.com/_uNN_nz3Bwnk/Si584XEON9I/AAAAAAAADhQ/ZSSUVMAMQ44/IMG_6770.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="font-size: x-small;"&gt;Community learning helps in many ways&lt;/span&gt;&lt;i&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;&lt;span style="font-size: x-small;"&gt;(Image Courtesy: Horace Mann School's &lt;a href="http://picasaweb.google.com/HoraceMannSchool"&gt;web album&lt;/a&gt;)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
Continuous improvement: Always look out for improvement - talk to peers, get ideas from them (that's why retrospectives are there). Encourage team to spot improvements or pain points in your projects and processes and seek solutions from them. Your team will be forced to think creatively, and you may in-fact get something useful! Have an open minded discussions before incorporating such changes (or rejecting suggestions) to the project.&lt;br /&gt;
&lt;h2&gt;





Solving your software development problems&lt;/h2&gt;
Agile is about iterations and incremental software development. This helps to build software that evolves over time with the customer requirements. Some prescriptions of agile practices such as from XP about CI, unit testing, helps to keep you confident in what you develop for each increment. &lt;br /&gt;
&lt;br /&gt;
That apart, looking at the discussions so far, and in the links there-in, we can deduce that its not just agility, there is more that helps you build better, and quality software. Agile practices with focus on developer productivity helps you release your software in a timely manner, yet maintaining the quality and budgets, while keeping your team happy and in high spirits.&lt;br /&gt;
&lt;h2&gt;





How to Start...?&lt;/h2&gt;
A difficult part to start anything new, is to get started. Very true for agile too!. Read a lot on agile, Scrum, Kanban and XP. Start with basic minimals on being agile&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Start stand-ups - focusing on highly communicated and focused team&lt;/li&gt;
&lt;li&gt;Start iterations - smaller the better&lt;/li&gt;
&lt;li&gt;Incorporate to retrospect your processes, code and techniques&lt;/li&gt;
&lt;li&gt;Never feel complete with improving your process - it should be a continuous process.&lt;/li&gt;
&lt;/ul&gt;
Good start would be to start lean, and then add prescriptions that work for you! And,... don't forget to adapt!&lt;br /&gt;
&lt;h2&gt;




Final Thoughts...&lt;/h2&gt;
This discussion, or few more blogs cannot cover everything related to software development. So much of literature is there around. Get inspired from those. Go ahead and start somewhere. You cannot start a perfect agile anyway! Over the time, you will improve with every iterations.



&lt;h3&gt;Update...&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/2010/03/agility-and-more-better-faster-business.html"&gt;Part 1 of this blog series.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/2010/03/agility-and-more-better-faster-business_29.html"&gt;Part 2 of this blog series.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-1161141756467491596?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sHz-dDEJgVMxB2tTdVez8uulkko/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sHz-dDEJgVMxB2tTdVez8uulkko/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sHz-dDEJgVMxB2tTdVez8uulkko/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sHz-dDEJgVMxB2tTdVez8uulkko/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=W5LtR5fzW5U:-_GAFlVpd6k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=W5LtR5fzW5U:-_GAFlVpd6k:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=W5LtR5fzW5U:-_GAFlVpd6k:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=W5LtR5fzW5U:-_GAFlVpd6k:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=W5LtR5fzW5U:-_GAFlVpd6k:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=W5LtR5fzW5U:-_GAFlVpd6k:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=W5LtR5fzW5U:-_GAFlVpd6k:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=W5LtR5fzW5U:-_GAFlVpd6k:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=W5LtR5fzW5U:-_GAFlVpd6k:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/W5LtR5fzW5U" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/W5LtR5fzW5U/agility-and-more-better-faster-business_30.html</link><author>noreply@blogger.com (Thomas Joseph)</author><media:thumbnail url="http://lh4.ggpht.com/_yr1SU8wX2Ls/S6tHiORQrtI/AAAAAAAAAaA/_6ysni8HSCI/s72-c/cumilative-flow-diagram.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2010/03/agility-and-more-better-faster-business_30.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-4192900042549701478</guid><pubDate>Mon, 29 Mar 2010 14:30:00 +0000</pubDate><atom:updated>2010-08-23T00:19:53.038+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">software</category><category domain="http://www.blogger.com/atom/ns#">Project Management</category><title>Agility and more: better &amp; faster business solutions with software - part-2</title><description>In my previous &lt;a href="http://blog.openthoughtworks.com/2010/03/agility-and-more-better-faster-business.html"&gt;blog post&lt;/a&gt;, I talked about why software development needs processes, and the need for agile in the processes. Here, I continue with the discussions, focusing on how the basic principles of agile itself has a lot to say, that can help us build better software.&lt;br /&gt;
&lt;h2&gt;
















Practicing agile - adapting is more important&lt;/h2&gt;
As mentioned before, the popular practiced tools for agile process include Scrum, Kanban and XP. But often, the process models/tools are applied as a religion, being strict on what the text prescribes. This has resulted in some &lt;a href="http://gilb.com/blogpost111-7-truths-about-Agile-and-Scrum-that-people-don-t-want-to-hear-Part-0-of-7"&gt;rumblings&lt;/a&gt; that has questioned the effectiveness of agile processes to deliver quality and creative solutions to business. The InfoQ book on &lt;a href="http://www.infoq.com/minibooks/kanban-scrum-minibook"&gt;Scrum and Kanban&lt;/a&gt; has highlighted the need for the process models to be adapted to their needs.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://farm4.static.flickr.com/3384/3633561833_498dbbf48a.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img class="border" height="320" src="http://farm4.static.flickr.com/3384/3633561833_498dbbf48a.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="font-size: x-small;"&gt;One size doesn't fit all -
 adapting is important.&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;&lt;span style="font-size: x-small;"&gt;(Image Courtesy: Robin Skyler Tell's &lt;a href="http://www.flickr.com/photos/robinskyler/%20"&gt;photostream&lt;/a&gt;)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
So what needs to be practiced is taking a lean model, and adapting it to your needs, probably by adding "&lt;i&gt;prescriptions&lt;/i&gt;" from the stouter process models, and even removing "prescriptions" that hinder your progress, but with absolute knowledge of what is being removed. This is what &lt;a href="http://twitter.com/henrikkniberg"&gt;Henrik&lt;/a&gt; has put in his InfoQ &lt;a href="http://www.infoq.com/minibooks/kanban-scrum-minibook"&gt;book&lt;/a&gt; - &lt;i&gt;"Do not limit yourself to one tool!"&lt;/i&gt;. &lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I have my own experience, where we started out with pure Scrum. Scrum iterations help evolve not only the software but our (scrum) process itself with continuous retrospectives. As we practiced it, over the time we hit against the walls of the Scrum, such that we had to eventually remove few prescriptions of the Scrum, effectively making it leaner and the process as "&lt;i&gt;Scrum Inspired&lt;/i&gt;". For example, we would feel OK to extend our sprint for 2-3 days and still declare it as a successful sprint! We would find it OK to even entertain new items during the sprint, if it was critical to the client. Sometimes, 1 or 2 team member may work on items from another product, that is planned in advance for the sprint, because we had small teams, and the same team members would work on multiple products/projects. In spite of this, we always knew where the limits were, and we were effective with whatever we did. We were strict on whatever process we followed. If we changed the Scrum rule, we did that knowingly, and probably would be the outcome of the retrospectives we had at the end of sprints. By adapting the process, not only was our output improved (that would make customers happy), the management as well as the team members were &lt;a href="http://blog.openthoughtworks.com/2010/03/tribute-to-my-ex-colleagues.html"&gt;happy at what we do&lt;/a&gt;, and how we do it and the overall team productivity.&lt;br /&gt;
&lt;br /&gt;
We all were extremely happy on the retrospective day, since it was the 
day we could blast out our rants, impediments and criticisms openly. We 
virtually had fights over the retrospectives. But finally, it all would 
help us improve what we do. &lt;br /&gt;
&lt;br /&gt;
Mix-n-match and adapting is important. For instance, Scrum does not say anything about releases, but XP does, hence combining them together is more compelling. The "&lt;i&gt;Do it&lt;/i&gt;" nature of scrum and the "&lt;i&gt;pair programming&lt;/i&gt;" and "&lt;i&gt;move people around&lt;/i&gt;" principle of XP and a well communicated team also helps in getting a new joiner to be inducted fast into the team as well!. Most of us have done pieces of XP and agile knowingly or unknowingly, if for example we have written unit tests, did iterations of development and the like. But the real benefit for going agile comes from developing and following process models with prescriptions from the agile processes available. Process models such as Kanban actually give us metrics to measure our process against, and take the best of what works for us from all the process models - agile or not. We can choose to start&amp;nbsp; out with Kanban, with probably the regular iteration, daily stand-up meetings, and retrospectives from the Scrum, add to that the software engineering specific practices from XP, such as CI, unit testing and pair programming.&lt;br /&gt;
&lt;br /&gt;
Again, what is more important is to adapt the process models to your needs. For example, even as I mentioned above for practicing prescriptions from Scrum and XP, I am still wondering how a stand-up meeting would happen for a distributed team? &lt;a href="http://evilword.wordpress.com/2009/03/06/distributed_scrum/"&gt;Distributed Scrum&lt;/a&gt;? Probably, we can have scrum of scrum, but again, this is something I have no experience. So, when the need comes for it, I will give it a try, practiced, adapted and practiced and improved so on.&lt;br /&gt;
&lt;h2&gt;















Responding to change over following a plan&lt;/h2&gt;
This is one of the four core values of the Agile manifesto. Adapting your process is a definite way to achieve this objective. Agility promotes responding to change inherently because of its iterative nature, that can enable the team to incorporate changes to a software more rapidly that traditional classic waterfall model. Process framework such as Kanban further fosters this changes to be percolated more rapidly into the development.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Try experimenting&lt;/b&gt;. Experiment with new and innovative ideas for improving processes. Invite all sort of crazy ideas from your team as well. I am sure, you will not go worse even if your experiments failed. You will learn so much. Next time you always know what not to do :).&lt;br /&gt;
&lt;h3&gt;














Focus on individuals and interactions over processes and tools&lt;/h3&gt;
This is again one of the four core values of the Agile Manifesto. This is what we have covered already. Let me explain. By focusing more on adapting the process to our needs instead of following the process as a religion, we are focusing more on the people and interactions for sure. The stand-up and the retrospectives for example are effective to give importance to the people who are involved, removing their impediments, and giving importance to their interactions. Once we practice scrum and XP, there is a value that the team learns. It is more important to follow these values, than to follow these practices by book.&lt;br /&gt;
&lt;h3&gt;













Communications and Interactions&lt;/h3&gt;
As we talk of individuals and interactions, I should emphasize on the need for effective communication and interaction within the team and with the customer (or his representative). Well communicated teams is one of the focus of scrum and XP (and most of the agile practices). The team stake holder should ensure proper communication channels. Small and well knit teams help a lot on this. If a team member has a problem, he knows already to whom this should be addressed, and the turnaround time to address this should be maximum of two meetings - i.e, the impediment should be addressed before the second team meeting after the impediment had been raised.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://lh5.ggpht.com/_H-EwBdXu07w/SiqlilqAtjI/AAAAAAAABSc/_9Kz4f2hlhw/s1600/img_0575.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img class="border" src="http://lh5.ggpht.com/_H-EwBdXu07w/SiqlilqAtjI/AAAAAAAABSc/_9Kz4f2hlhw/s320/img_0575.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;&lt;span style="font-size: x-small;"&gt;(Image courtesy: Avish's &lt;a href="http://picasaweb.google.com/some.avish/AWeekWithTheBuckhmanBunch"&gt;web album&lt;/a&gt;)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
To enhance our communication channel, we used enterprise blogging at three levels:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Organizational blog&lt;/b&gt;: We used this blog to express new ideas and rants across teams.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Team blog&lt;/b&gt;: we used this blog within the team for various purpose&lt;/li&gt;
&lt;ol style="list-style-type: lower-alpha;"&gt;
&lt;li&gt;&lt;i&gt;Daily status update&lt;/i&gt; - every team member used to put the daily status update for days work under the following headings:
&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Tasks completed&lt;/li&gt;
&lt;li&gt;Tasks pending&lt;/li&gt;
&lt;li&gt;Impediments&lt;/li&gt;
&lt;li&gt;Things I found new today&lt;/li&gt;
&lt;li&gt;Comments&lt;/li&gt;
&lt;/ul&gt;
This daily status update, served more than one way to increase our effectiveness. Members would take a look at the updates for the day from other members before the scrum, and come prepared for it. It was also helpful, if a member was was absent on the day, or could not make to attend the scrum for some reason.
&lt;li&gt;&lt;i&gt;Project specific posts&lt;/i&gt; - To discuss and document a project specific problems, and ideas. Many times although, we would promote some of the posts to the organizational blog too.&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
One-to-one interactions are really good at fostering better communication and interactions. It will be extremely good to have your team work at the same location, if possible within same cubicle. ThoughtWorks practices this with "&lt;i&gt;&lt;a href="http://offshore.thoughtworks.com/why-we%27re-different"&gt;Dining Table&lt;/a&gt;&lt;/i&gt;" culture for the team that &lt;a href="http://www.thoughtworker.com/agile-our-way-life"&gt;fosters greater collaboration and communication&lt;/a&gt; (and flow of ideas). For distributed teams, this may not be feasible, where better interaction can be provided by having the team members available to each other on IMs. Use of wiki based whiteboards as discussed above can be a good way to go for distributed teams. Well, there can be a lot of talk for this. So I reserve the 'distributed teams' topic to a separate discussion.
&lt;br /&gt;
&lt;h3&gt;




Human factor&lt;/h3&gt;
While focusing on individual developer productivity is important, it is also important to see how the team as a whole can mesh well and be productive. A very important thing is to have well-knit and well communicated team. Focus that they can work well with each other considering the human emotions and social factors.&lt;br /&gt;
&lt;br /&gt;
Frequently changing the context is not a good idea. Everybody may not be equally good at changing contexts. It would be nice to group together similar tasks. Human minds takes time to get adjusted to the new environment and get productive. Again, this is a topic that may itself need a separate discussion.&lt;br /&gt;
&lt;h3&gt;




Tools do not replace process and individual interactions&lt;/h3&gt;
When we started out with Scrum, we used whiteboard for everything - from daily tracking our burndowns at daily scrums to the retrospectives. But later to keep track of what we do, we moved parts of these into our enterprise wiki. Later we also tried with JIRA's GreenHopper plugin to manage most of the scrum, except the retrospectives. We where still open to change or adapt to tools as would our process be adapted. In short, we used the tools to aid us what do.&lt;br /&gt;
&lt;br /&gt;
Using tools does not mean that we are doing what the tool is meant for.&amp;nbsp; What we do for scrum is more important than the tool used to manage scrum. Using the &lt;a href="http://www.oracle.com/agile/index.html"&gt;Agile PLM&lt;/a&gt; does not mean that we have gone agile. Tools should be at our disposal to aid us what we do more effectively.&lt;br /&gt;
&lt;h3&gt;




Focus on the developer skills&lt;/h3&gt;
A craftsman is the center-point of every creation - not just software. From the craftsman of a building to that of a supersonic jet aircraft - the skill of the craftsman involved is very important and crucial to it. Software craftsman is no exception.&lt;br /&gt;
&lt;br /&gt;
The developer should realize the importance of developing skills even beyond his current needs. Developers should proactively try to learn, innovate and come with new ideas. Always try to learn something new at work, and from around your (professional) community. Work proactively to improve the environment you work in. Work towards a more productive process, for getting better output for your company and yourself. No one can teach you or or force you to learn. It has to come from within. Try reading books, blogs and articles, try to keep up with what is happening around. Find how a new technology could help you create better software. Find how a new technique or trick could help you do more with less effort. Attend conferences, and user groups, speak at them, share your learning - good and bad, &lt;a href="http://tech.puredanger.com/2010/03/05/non-death-blogging/"&gt;blog about them&lt;/a&gt;. &lt;a href="http://qconlondon.com/london-2010/speaker/Pete+Goodliffe"&gt;Peter Goodliffe&lt;/a&gt; and &lt;a href="http://qconlondon.com/london-2010/speaker/Dan+North"&gt;Dan North&lt;/a&gt; have &lt;a href="http://qconlondon.com/london-2010/file?path=/qcon-london-2010/slides/DanNorth_SharpeningTheTools.pdf"&gt;some (pdf)&lt;/a&gt; interesting &lt;a href="http://qconlondon.com/london-2010/file?path=/qcon-london-2010/slides/PeteGoodliffe_TheCraftsmanLearnsorLearningTheCraft.pdf"&gt;advice (pdf)&lt;/a&gt; on this topic that they presented on the recent &lt;a href="http://blog.openthoughtworks.com/2010/03/qcon-london-2010-slides.html"&gt;QCon London 2010 conference&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
As software shops that nurture these software craftsmen, it is important to promote them at these things, and provide a conductive atmosphere for the developers to nurture their skills. I will discuss these things in later in this post (series) under the title "&lt;i&gt;Some Agility and beyond&lt;/i&gt;".&lt;br /&gt;
&lt;h2&gt;





Focus on working software over comprehensive documentation&lt;/h2&gt;
This is again one of the principles of Agile manifesto. But this often creates confusion and debates. Since, many times good documentation is called for a good software.&amp;nbsp; Because, at later stages, a software without documentation, may be hard to understand, and maintain. However, this principle, does not mean to avoid documentation. A good discussion on agile documentation is provided &lt;a href="http://www.agilemodeling.com/essays/agileDocumentationBestPractices.htm"&gt;here&lt;/a&gt;. After all,&amp;nbsp; documentation is &lt;a href="http://www.agilemodeling.com/essays/agileDocumentationBestPractices.htm#FindBetterWaysToCommunicate"&gt;all about communication&lt;/a&gt;, so as mentioned before - documentation is just a medium of communication, focus instead on the overall communication.This topic alone requires a lot of discussion, but let me discuss few very important topics in this.&lt;br /&gt;
&lt;h3&gt;





Code is your document&lt;/h3&gt;
Documenting your code - code is your document. Code commenting, with importance in probably what is the intent of the code rather that what the code is doing,.. any good developer will understand what the lines of code do, if they know the intent of the code. At times, for an intent you may have to write a lot of classes and methods, there put the intent at the index/root of where it all begins, and probably give reference to it. See the JDK, or the Spring API documentation,.. its so beautifully documented.&lt;br /&gt;
&lt;h3&gt;





A test-case is worth a thousand words&lt;/h3&gt;
Developing test case is also a good documentation, to showcase the functionality. The test-cases can be automated unit test cases, that very much is a very good documentation - technically as well as functionally. Tests should run in all possible ways - regular builds, test builds, CI builds, and even in IDEs. I will cover more on this in my next post in this series.&lt;br /&gt;
&lt;h3&gt;





External Documents&lt;/h3&gt;
You will have to maintain external documents too. For example, a document that discuses your architecture and its intentions. Focus on developing the software first, and writing documentation for the working software instead of writing for speculative design. Managing external documents, should be among the task list during your iterations. And very important of all, keep in a format that is easy to edit and maintain. You may have a document management software to maintain them or it may be as simple as managing all of them in your enterprise wiki.&lt;br /&gt;
&lt;h2&gt;




More to come ...&lt;/h2&gt;
In the next blog post in this series, I will try to explain practices that stretch beyond agile prescriptions, that can help build better software. While some of the practices are within the agile prescriptions, few others have also been recommended by Agile experts such as Martin Fowler, while few other are practices that have been proved to work, to produce some admirable software, while having a happy team.


&lt;h3&gt;Update...&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/2010/03/agility-and-more-better-faster-business.html"&gt;Part 1 of this blog series.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/2010/03/agility-and-more-better-faster-business_30.html"&gt;Part 3 of this blog series.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-4192900042549701478?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_g1d9KRL9LYVa5d_iEylNkYglis/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_g1d9KRL9LYVa5d_iEylNkYglis/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_g1d9KRL9LYVa5d_iEylNkYglis/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_g1d9KRL9LYVa5d_iEylNkYglis/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=To1QEK7WgXQ:1Dr4dW70tvA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=To1QEK7WgXQ:1Dr4dW70tvA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=To1QEK7WgXQ:1Dr4dW70tvA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=To1QEK7WgXQ:1Dr4dW70tvA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=To1QEK7WgXQ:1Dr4dW70tvA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=To1QEK7WgXQ:1Dr4dW70tvA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=To1QEK7WgXQ:1Dr4dW70tvA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=To1QEK7WgXQ:1Dr4dW70tvA:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=To1QEK7WgXQ:1Dr4dW70tvA:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/To1QEK7WgXQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/To1QEK7WgXQ/agility-and-more-better-faster-business_29.html</link><author>noreply@blogger.com (Thomas Joseph)</author><media:thumbnail url="http://farm4.static.flickr.com/3384/3633561833_498dbbf48a_t.jpg" height="72" width="72" /><thr:total>0</thr:total><enclosure url="http://qconlondon.com/london-2010/file?path=/qcon-london-2010/slides/DanNorth_SharpeningTheTools.pdf" length="697672" type="application/pdf" /><media:content url="http://qconlondon.com/london-2010/file?path=/qcon-london-2010/slides/DanNorth_SharpeningTheTools.pdf" fileSize="697672" type="application/pdf" /><feedburner:origLink>http://blog.ethomasjoseph.com/2010/03/agility-and-more-better-faster-business_29.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-1765143169103281416</guid><pubDate>Thu, 25 Mar 2010 14:10:00 +0000</pubDate><atom:updated>2010-08-23T00:13:47.796+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">software</category><category domain="http://www.blogger.com/atom/ns#">Project Management</category><title>Agility and more: better &amp; faster business solutions with software - part-1</title><description>Software development is a creative process, where we create software to deliver solutions to business problems (most of the time), and/or to add value to it. Although the holy duty of a software developer is to deliver solutions to business problems, and not always necessarily developing software. But when we have decided to build a software, we work as teams (most of the times), and the business problem is the central focus of the process. But, the overall quality of the developed software also depends on how we are developing the software - from the requirement capturing to coding, testing, and implementation. This highlights the need for a process at all stages of software development.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;b&gt;Note:&lt;/b&gt; Software is also developed for fun, some write it to learn programming (we all have did that), some times it is written for personal use (eg,. automating some mundane task). But most of the time, its written for business needs - let it be a game software, and ERP, the OS itself, or the search engine software - most of them eventually turn as a business or a business solution. In this post I am talking mostly about the software that deals with business and hence the software shops find time and money to be spent to develop these software. So whenever I talk of software, I mean it to be the software developed in these software shops, unless otherwise indicated.&lt;/blockquote&gt;
&lt;br /&gt;
These series of posts highlights my understanding and experience on how the Agile processes can be effectively used to improve the overall quality of the software solutions with reasonable time leads and better estimates. Why and how agile processes needs to be adapted? For Software Engineering teams, there is even more than just being lean/agile, that needs to be into the process.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://lh3.ggpht.com/_FMBWAYy8eXE/SZuv3AxXDkI/AAAAAAAAATc/9PuOTEGzlqk/s1600/68design_001.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img class="border" src="http://lh3.ggpht.com/_FMBWAYy8eXE/SZuv3AxXDkI/AAAAAAAAATc/9PuOTEGzlqk/s320/68design_001.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="font-size: x-small;"&gt;(&lt;i&gt;Image courtesy: Coffish's &lt;a href="http://picasaweb.google.com/coffish/Material"&gt;web album&lt;/a&gt;&lt;/i&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
This is of course not a comprehensive discussion on any of the process tools/frameworks discussed here. Although I discuss about Scrum, XP and Kanban to certain extent, what I tell here is the basics, a skeleton that every team/organization can give thoughts to, and then adapt them to their needs. You may add whatever more is needed to meet some standards, but just don't overdo it that you have problem remembering your own processes - keep it as lean as possible. There are several literature that talks about these specific techniques. I will not talk about all the aspects of software development too! Here I will talk in general, about faster development cycle and developer productivity while achieving quality and timely software releases with less team burnouts and overtimes.&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;




Why this talk?&lt;/h2&gt;
I am into the software development profession for over 4 years now and about 7 years overall into the world of software. I have developed software the ugly way, the good, way and still an ever improving way that gets better each passing day. I was very fortunate to have a wide variety of experience in such a short span. I've worked as a junior programmer to leading teams. I have been a Scrum Master for nearly 2 years. I continuously look out to improve myself and the environment in which I work. I try to implement my learning whenever possible, and its a continuous process where the learning and improvement never stops.&lt;br /&gt;
&lt;br /&gt;
Although, I have practiced focused agile processes for almost 2 years now, I do not consider it as too long to be compared to the seasoned agile experts. Nor do I have done any agile/lean consulting for organizations. But I do talk to peers, friends, friends of friends and seek their experiences and suggestions, share mine with them, and advice them. I read a lot, or get to watch conference videos and slides on agile processes and tools, on developer productivity, apart from the efforts on improving my technical skills. I still look forward to attending user-groups and conferences to discuss out these things. This is why that I feel that I need to share my experiences and learning with others, especially for those who have not yet started on a good agile practice, or are trying to find experiences of others to improve their own processes. After-all, process improvement is more to do with experience - learning from our own and from others, sharing our own and getting valuable feedback, and further improving.&lt;br /&gt;
&lt;h2&gt;




What is a good software?&lt;/h2&gt;
The Economist magazine (Nov 27, 2004 p. 71) cites the Standish Group's estimates that&lt;br /&gt;
&lt;blockquote&gt;
&lt;i&gt;"...30% of all software projects are canceled, nearly half come in over budget, 60% are considered failures by the organizations that initiated them, and 9 out of 10 come in late."&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
With this statement, let us have a quick description of a good software:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Solves the business problem at hand&lt;/li&gt;
&lt;li&gt;Gives and adds value to the business and hence the customers&lt;/li&gt;
&lt;li&gt;Evolves with customer needs (as fast as the business itself): Maintainable&lt;/li&gt;
&lt;li&gt;Free of bugs :)&lt;/li&gt;
&lt;li&gt;Could be built and deployed with lesser cost&lt;/li&gt;
&lt;li&gt;Available to use on time&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
With this small description of a good software, we can now focus on making good software, where we need people and processes.&lt;br /&gt;
&lt;h2&gt;




Need for agile&lt;/h2&gt;
Putting it fast, being agile helps foster better output for software shops. However agile is a too general term to be practiced or explained as such, although the general aims and principles of agile is clearly stated at the &lt;a href="http://agilemanifesto.org/"&gt;agile manifesto&lt;/a&gt;. Hence, we will need to follow the process tools that have been designed with the agile principles, such as the &lt;a href="http://en.wikipedia.org/wiki/Scrum_%28development%29"&gt;Scrum&lt;/a&gt;, &lt;a href="http://www.infoq.com/articles/hiranabe-lean-agile-kanban"&gt;Kanban&lt;/a&gt; and &lt;a href="http://www.extremeprogramming.org/"&gt;XP&lt;/a&gt;.&lt;br /&gt;
&lt;blockquote&gt;
&lt;h3&gt;




The Agile Hype&lt;/h3&gt;
Often people get confused on "what is agile"? The Agile Manifesto is the defining document of "&lt;i&gt;agile&lt;/i&gt;." It lists &lt;a href="http://www.agilemanifesto.org/"&gt;4 fundamental values&lt;/a&gt; and &lt;a href="http://www.agilemanifesto.org/principles.html"&gt;12 guiding principles&lt;/a&gt;. That is the full definition of "&lt;i&gt;agile&lt;/i&gt;." Based on those values and principles, we are expected to derive processes and practices that are consistent with the agile approach. However, often the term Agile has been over-hyped, that the people often do not recognize the true meaning of agile. The hype has infused software vendors to come up with tools to support agile, that has often increased this chaos, where people believe that they need those tools to go agile. Also, agile practitioners, often refer to a certain school of practice as Agile. With various schools of agile practice, new comers often get confused about Agile.&lt;br /&gt;
&lt;br /&gt;
Dave Nicolette explains &lt;a href="http://dnicolet1.tripod.com/agile/index.blog?entry_id=2001900"&gt;why is it so hard to find a clear definition of "agile"?&lt;/a&gt;.&lt;/blockquote&gt;
&lt;br /&gt;
Since the overall quality of the software developed also depends on how we are developing the software, the need for a organized process to produce the software becomes important. Process models such as &lt;a href="http://www.sei.cmu.edu/cmmi/"&gt;CMMi&lt;/a&gt; evolved over years with this focus - "&lt;i&gt;provide organizations with the essential elements of effective processes that ultimately improve their performance&lt;/i&gt;". Over the years people found iterative and Agile methods to be more effective in delivering better output. And in the recent times, there has been a considerable shift to adopting leaner agile models such as &lt;a href="http://www.infoq.com/minibooks/kanban-scrum-minibook"&gt;Scrum and Kanban&lt;/a&gt; over heavier and prescriptive process models such as &lt;a href="http://en.wikipedia.org/wiki/IBM_Rational_Unified_Process"&gt;RUP&lt;/a&gt;. Prescriptive means that there are more rules to follow, and adaptive ones have lesser rules to follow. Agile methods are lightweight since they are less prescriptive than the traditional methods of software process. Even within agile, the leaner and less prescriptive models are becoming more popular, naturally, because they are more adaptive to one's organizational needs and seem to be more effective and easy to learn and practice than the prescriptive ones.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://lh6.ggpht.com/_yr1SU8wX2Ls/S6tHiNXOrvI/AAAAAAAAAZ8/0bbMOn1r_Bo/s1600/process-prescription.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img class="border" src="http://lh6.ggpht.com/_yr1SU8wX2Ls/S6tHiNXOrvI/AAAAAAAAAZ8/0bbMOn1r_Bo/s320/process-prescription.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Process models&lt;/b&gt;: both extremes of scale does not seem to work well.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: x-small;"&gt;(&lt;i&gt;Image reproduced from &lt;a href="http://www.infoq.com/minibooks/kanban-scrum-minibook"&gt;InfoQ minibook&lt;/a&gt;&lt;/i&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Even with the need for processes to govern the software development, there are more reasons to go for agile process.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Your customers have continually evolving requirements and changing requirements&lt;/li&gt;
&lt;li&gt;Your customers are not very sure about their requirements, and they need your help to identify those requirements&lt;/li&gt;
&lt;li&gt;Your team needs to respond quickly to change requests, and deliver projects&lt;/li&gt;
&lt;li&gt;You need have a major rework of the project just delivered, because of requirement mis-understanding with customer.&lt;/li&gt;
&lt;li&gt;You have teams working overtime continually and at other times sit idle waiting for the other team/person to complete&lt;/li&gt;
&lt;li&gt;You have chaos in team due to lack of communication (many times you never feel that your teams have this problem!)&lt;/li&gt;
&lt;li&gt;Managers are over burdened, and often need to go in to resolving issues between teams that work on same project&lt;/li&gt;
&lt;li&gt;Your estimates prove wrong and your projects go over-budget and/or take longer to complete.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Of course, seasoned agile practitioners can find even more points to be added to the above. But this is what was very obvious to me.&lt;br /&gt;
&lt;h2&gt;




More to come...&lt;/h2&gt;
In the following posts in this series, I will explain about practicing agile in real life, and why adapting the agile prescriptions is important. I will also explain about practices even beyond the direct agile prescriptions, that can help organizations to build faster and quality software.

&lt;h3&gt;Update...&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/2010/03/agility-and-more-better-faster-business_29.html"&gt;Part 2 of this blog series.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/2010/03/agility-and-more-better-faster-business_30.html"&gt;Part 3 of this blog series.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-1765143169103281416?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZeB0bemuE7aCqrBWWy-1ieoGR5M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZeB0bemuE7aCqrBWWy-1ieoGR5M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZeB0bemuE7aCqrBWWy-1ieoGR5M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZeB0bemuE7aCqrBWWy-1ieoGR5M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=o_XEHeI3dVw:Ra8VjXlx-lM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=o_XEHeI3dVw:Ra8VjXlx-lM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=o_XEHeI3dVw:Ra8VjXlx-lM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=o_XEHeI3dVw:Ra8VjXlx-lM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=o_XEHeI3dVw:Ra8VjXlx-lM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=o_XEHeI3dVw:Ra8VjXlx-lM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=o_XEHeI3dVw:Ra8VjXlx-lM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=o_XEHeI3dVw:Ra8VjXlx-lM:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=o_XEHeI3dVw:Ra8VjXlx-lM:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/o_XEHeI3dVw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/o_XEHeI3dVw/agility-and-more-better-faster-business.html</link><author>noreply@blogger.com (Thomas Joseph)</author><media:thumbnail url="http://lh3.ggpht.com/_FMBWAYy8eXE/SZuv3AxXDkI/AAAAAAAAATc/9PuOTEGzlqk/s72-c/68design_001.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2010/03/agility-and-more-better-faster-business.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-1135276667370632462</guid><pubDate>Wed, 24 Mar 2010 07:52:00 +0000</pubDate><atom:updated>2010-03-24T20:30:56.123+05:30</atom:updated><title>Downloading InfoQ videos and slides</title><description>InfoQ is a portal with lot of interesting and happening stuff for IT people, and especially for the developers. Some of the areas, it specializes includes - Java, .NET, Ruby, SOA, Agile and Architecture. Like many others, I am a regular user of the site, that provides me the "energy supplements" for my developer life.&lt;br /&gt;
&lt;br /&gt;
Like many others, I was always interested to download the videos and slides from the InfoQ website. With some effort I could device a way to achieve that - exclusively for my private usage. I did this because, often my internet connection is slow and then 
watching the entire presentation/interview would eat much of my time - 
most of it waiting for the content to get downloaded.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://www.infoq.com/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img class="border" src="http://lh3.ggpht.com/_yr1SU8wX2Ls/S6offtnGJGI/AAAAAAAAAZg/he2tLPGEk4I/s800/infoq-videos.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
I wanted to share this technique with others on my blog. However, I was concerned on the IP rights and so checked the website for it. However I could not find one that stated a usage policy. So I decided to check the same with the website owners - &lt;a href="http://www.c4media.com/"&gt;c4media&lt;/a&gt;. I emailed them and in the reply, I was advised not to publish any details on downloading slides and videos. This was the response I got.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
Thanks for taking the time to ask us about this. We’d ask that you not provide instructions on how to download or view these videos beyond the means we currently offer. &lt;br /&gt;
&lt;br /&gt;
When we go out and film these interviews or presentations one of the stipulations in the agreement we sign with the conference or individual is that the video not be made available for download. By allowing or even turning a blind eye to people doing this it would not only put us in potential legal hot water but would also “blacklist” us from filming future presentations or interviews.&lt;br /&gt;
&lt;br /&gt;
Due to this we can unfortunately only support people viewing the presentations or interviews in the formats we currently offer; either streaming them online or, in some cases, downloading the MP3.&lt;/blockquote&gt;
&lt;br /&gt;
It was a co-incidence to find that InfoQ was reacting publicly to seek feedback for their site, probably at the same time when I was drafting the mail. The responses will indicated that people are &lt;a href="http://www.blogger.com/%20http://www.infoq.com/news/2010/03/infoq-user-survey-results#view_54379"&gt;interested to download the videos&lt;/a&gt; and slides, and the InfoQ's response to these queries.&lt;br /&gt;
&lt;br /&gt;
Further, I was encouraged by the InfoQ to publish their response to me, showing how transparent InfoQ was. Respecting the InfoQ's&amp;nbsp; legal terms, I have decided not to publish any technique for downloading the InfoQ videos or slides.&lt;br /&gt;
&lt;br /&gt;
InfoQ may change the way it is presenting the videos and slides, to stick to its legal agreements. However, as far a technical feasibility of devising any hacks are concerned, even RSA encryption can be compromised, for that matter, given enough of time and CPU power.&lt;br /&gt;
&lt;br /&gt;
I am however, happy about the fact that InfoQ is redesigning its website, closely working with the users. It may also present direct method to download interviews, which is InfoQ's "original material". I would encourage you to provide your feedback, and help yourself to make the site more useful.&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-1135276667370632462?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CsMG1r4qZj_PyO1wwHtt1RJdIGw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CsMG1r4qZj_PyO1wwHtt1RJdIGw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CsMG1r4qZj_PyO1wwHtt1RJdIGw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CsMG1r4qZj_PyO1wwHtt1RJdIGw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=yol97val8hE:fV8Qv2234Ao:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=yol97val8hE:fV8Qv2234Ao:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=yol97val8hE:fV8Qv2234Ao:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=yol97val8hE:fV8Qv2234Ao:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=yol97val8hE:fV8Qv2234Ao:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=yol97val8hE:fV8Qv2234Ao:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=yol97val8hE:fV8Qv2234Ao:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=yol97val8hE:fV8Qv2234Ao:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=yol97val8hE:fV8Qv2234Ao:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/yol97val8hE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/yol97val8hE/downloading-infoq-videos-and-slides.html</link><author>noreply@blogger.com (Thomas Joseph)</author><media:thumbnail url="http://lh3.ggpht.com/_yr1SU8wX2Ls/S6offtnGJGI/AAAAAAAAAZg/he2tLPGEk4I/s72-c/infoq-videos.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2010/03/downloading-infoq-videos-and-slides.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-868171178902531946</guid><pubDate>Wed, 17 Mar 2010 16:31:00 +0000</pubDate><atom:updated>2010-03-18T00:22:41.575+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tips</category><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">leasure</category><title>Tech and some...</title><description>I had just brought a new headphone for making Skype calls. I was trying testing it out, and I recorded my voice to test it. What came in was a movie song that I was chanting over. I played it back to find too much of background noise. I wanted to remove it. Now for any utility for my OS, I do not rely on a search engine,.. I rely on my "&lt;i&gt;Synaptic Package Manager&lt;/i&gt;" on my Linux box - &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; 9.10 (Karmic Koala). Quick was it, to get "&lt;i&gt;Audacity&lt;/i&gt;" to help me record, and edit audio.
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://static.openthoughtworks.com/images/Screenshot-pathira_pullu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="http://static.openthoughtworks.com/images/Screenshot-pathira_pullu.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
Notice, that I split the audio into multiple tracks easily and mix it at proper timings.&lt;br /&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Believe me. Within half an hour I could learn the basic stuff and the edited voice was so good to hear now. I thought, how about mixing some music as well? Soon I got the Karaoke for it as well. Without much practice or effort, I could record that song with the music tack mixed. Hear it to believe it!
&lt;br /&gt;
&lt;br /&gt;
&lt;embed allowscriptaccess="never" bgcolor="#ffffff" flashvars="playerMode=embedded" height="27" pluginspage="http://www.macromedia.com/go/getflashplayer" quality="best" src="http://www.google.com/reader/ui/3247397568-audio-player.swf?audioUrl=http://static.openthoughtworks.com/res/pathira_pullu-thomas-intro.mp3?attredirects=0&amp;d=1" type="application/x-shockwave-flash" width="400" wmode="window"&gt;&lt;/embed&gt;
&lt;br /&gt;
&lt;a href="http://static.openthoughtworks.com/res/pathira_pullu-thomas-intro.mp3?attredirects=0&amp;d=1"&gt;Download Song (mp3)&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
This is a romantic song "&lt;a href="http://www.youtube.com/watch?v=Mbiy4DXHPq0"&gt;Pathira Pullu&lt;/a&gt;" from the Malayalam Movie - "&lt;a href="http://www.moserbaerhomevideo.com/title-view.htm?titleid=3399"&gt;Ee Puzhayum Kadannu&lt;/a&gt;"(1996). It is one of my favorites songs. Music composed by &lt;a href="http://en.wikipedia.org/wiki/Johnson_%28composer%29"&gt;Johnson&lt;/a&gt; (one of my favorite music composers), and originally sung by &lt;a href="http://en.wikipedia.org/wiki/K._J._Yesudas"&gt;KJ Yesudas&lt;/a&gt; (obviously my favorite singer).
&lt;br /&gt;
&lt;br /&gt;
Those who know me personally can recognize my voice. I have just removed some background noise, added some echo and bass. I am just a bathroom singer, but the voice seems to come out pretty well after the treatment. Even as a fist-time sound recordists, the result was pleasing to me, even with the low quality of the microphone and the always present background noise.
&lt;br /&gt;
&lt;br /&gt;
I would encourage people to try this out. Linux is not just for geeks. &lt;u&gt;Linux is for &lt;b&gt;all&lt;/b&gt; human beings&lt;/u&gt;. I am sure there should be more professional tools available for professional people. You can at-least use the tool to record your voice at home and send to participate in your favorite music reality shows :).
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;PS:&lt;/b&gt; I would have preferred to upload flac/ogg format, but then my friends on non-Linux machines would have no way to hear it.&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-868171178902531946?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VFILXPoStZoxknNTD9GtPWCdyY0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VFILXPoStZoxknNTD9GtPWCdyY0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VFILXPoStZoxknNTD9GtPWCdyY0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VFILXPoStZoxknNTD9GtPWCdyY0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=RmlNooA6ia8:AFN645meVYE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=RmlNooA6ia8:AFN645meVYE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=RmlNooA6ia8:AFN645meVYE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=RmlNooA6ia8:AFN645meVYE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=RmlNooA6ia8:AFN645meVYE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=RmlNooA6ia8:AFN645meVYE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=RmlNooA6ia8:AFN645meVYE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=RmlNooA6ia8:AFN645meVYE:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=RmlNooA6ia8:AFN645meVYE:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/RmlNooA6ia8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/RmlNooA6ia8/tech-and-some.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><enclosure url="http://static.openthoughtworks.com/res/pathira_pullu-thomas-intro.mp3?attredirects=0&amp;d=1" length="1707472" type="audio/mpeg" /><media:content url="http://static.openthoughtworks.com/res/pathira_pullu-thomas-intro.mp3?attredirects=0&amp;d=1" fileSize="1707472" type="audio/mpeg" /><feedburner:origLink>http://blog.ethomasjoseph.com/2010/03/tech-and-some.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-3287682949989134929</guid><pubDate>Tue, 16 Mar 2010 13:33:00 +0000</pubDate><atom:updated>2010-03-16T19:20:08.323+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">thanks</category><title>A tribute to my ex-colleagues</title><description>Moving with the waves of time, I changed my job. So did some of my other colleagues at &lt;i&gt;Miediant Solutions&lt;/i&gt; - my previous employer. Now after we all are into our new jobs, happy and looking forward for a pleasant and prosperous future with our new jobs, we all miss our team, the togetherness we shared. We enjoyed the fun-filled, yet productive work environment, that had so much to learn, and had contributed so much to our professional career. While, many love to hate their bosses, we hope to have him again in our team. We all keep our fingers crossed, and hope for the best to happen, and meet each other and work together again some day.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;Thank you all for making the work a pleasurable experience, and the office - a home away from home,&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;a place we wish to stay together. We shared so much professionally, and&amp;nbsp;&lt;/i&gt;&lt;br /&gt;
&lt;i&gt;we worked like soldiers in the war.&lt;/i&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;Thank for all the sprints, the daily scrums and the virtually fighting retrospectives,&lt;/i&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt; the lunch, the outings - thanks for all that time.&lt;/i&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt; Thank you all for the professional and personal growth gained together.&lt;/i&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;Wish you all a prosperous and happy future!&lt;/i&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-3287682949989134929?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tN6Qjy1RxWp0KsmQvg8o0o-A2BY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tN6Qjy1RxWp0KsmQvg8o0o-A2BY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tN6Qjy1RxWp0KsmQvg8o0o-A2BY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tN6Qjy1RxWp0KsmQvg8o0o-A2BY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=XSZDuQRzuio:NN5xuQ74CTg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=XSZDuQRzuio:NN5xuQ74CTg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=XSZDuQRzuio:NN5xuQ74CTg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=XSZDuQRzuio:NN5xuQ74CTg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=XSZDuQRzuio:NN5xuQ74CTg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=XSZDuQRzuio:NN5xuQ74CTg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=XSZDuQRzuio:NN5xuQ74CTg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=XSZDuQRzuio:NN5xuQ74CTg:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=XSZDuQRzuio:NN5xuQ74CTg:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/XSZDuQRzuio" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/XSZDuQRzuio/tribute-to-my-ex-colleagues.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>3</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2010/03/tribute-to-my-ex-colleagues.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-8642808445224492490</guid><pubDate>Mon, 15 Mar 2010 07:02:00 +0000</pubDate><atom:updated>2010-03-15T12:32:31.521+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">QCon</category><title>QCon London 2010 slides</title><description>The QCon London 2010 has just concluded. There was extremely good response from the delegates. Many attendees have &lt;a href="http://blogsearch.google.com/blogsearch?hl=en&amp;amp;ie=UTF-8&amp;amp;q=Qcon+london+2010&amp;amp;btnG=Search+Blogs"&gt;blogged&lt;/a&gt; on the same.&lt;br /&gt;
&lt;br /&gt;
The conference had 19 tracks spread over 3 days:&lt;br /&gt;
&lt;ol&gt;
&lt;b&gt;Wednesday&lt;/b&gt;
&lt;li&gt;Architectures You've Always Wondered About&lt;/li&gt;
&lt;li&gt;Software Craftsmanship&lt;/li&gt;
&lt;li&gt;Non-Relational DBs &amp;amp; Web Oriented Data&lt;/li&gt;
&lt;li&gt;Dev and Ops: A single team&lt;/li&gt;
&lt;li&gt;Functional programming&lt;/li&gt;
&lt;li&gt;Solution Track: Wednesday&lt;/li&gt;
&lt;b&gt;Thursday&lt;/b&gt;
&lt;li&gt;2015 Software Development&lt;/li&gt;
&lt;li&gt;Irresponsible Architectures and Unusual Architects&lt;/li&gt;
&lt;li&gt;Pragmatic Cloud Computing&lt;/li&gt;
&lt;li&gt;Agile Evolution&lt;/li&gt;
&lt;li&gt;AlphaGeeks on .NET&lt;/li&gt;
&lt;li&gt;IT - more than tools and technology&lt;/li&gt;
&lt;li&gt;Solutions Track: Performance and Scalability&lt;/li&gt;
&lt;b&gt;Friday&lt;b&gt;
&lt;/b&gt;&lt;/b&gt;
&lt;li&gt;The Concurrency Challenge&lt;/li&gt;
&lt;li&gt;Cool Stuff with Java&lt;/li&gt;
&lt;li&gt;How do you test that?&lt;/li&gt;
&lt;li&gt;SOA 2010&lt;/li&gt;
&lt;li&gt;Browser as a Platform&lt;/li&gt;
&lt;li&gt;Solution Track: Friday&lt;/li&gt;
&lt;/ol&gt;
Some great &lt;a href="http://qconlondon.com/london-2010/speakers/"&gt;speakers&lt;/a&gt; such as Robert C. Martin, Martin Fowler, Rod Johnson, Joe Armstrong, Dan North teamed up for this.&lt;br /&gt;
&lt;ol&gt;
&lt;/ol&gt;
Some of the slides for these are &lt;a href="http://qconlondon.com/london-2010/schedule/wednesday.jsp"&gt;available online&lt;/a&gt; on the official QCon London website. Although, the slides by themselves do not ever match for going there yourself, these and the blogs are good for those who could not attend it.&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-8642808445224492490?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/TidVVphZkDo7QQCjCxy7_YJLzmg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TidVVphZkDo7QQCjCxy7_YJLzmg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/TidVVphZkDo7QQCjCxy7_YJLzmg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/TidVVphZkDo7QQCjCxy7_YJLzmg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=nvJNTEMrT0w:Hr9LsxqlK6A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=nvJNTEMrT0w:Hr9LsxqlK6A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=nvJNTEMrT0w:Hr9LsxqlK6A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=nvJNTEMrT0w:Hr9LsxqlK6A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=nvJNTEMrT0w:Hr9LsxqlK6A:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=nvJNTEMrT0w:Hr9LsxqlK6A:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=nvJNTEMrT0w:Hr9LsxqlK6A:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=nvJNTEMrT0w:Hr9LsxqlK6A:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=nvJNTEMrT0w:Hr9LsxqlK6A:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/nvJNTEMrT0w" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/nvJNTEMrT0w/qcon-london-2010-slides.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2010/03/qcon-london-2010-slides.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-3483692851486571088</guid><pubDate>Mon, 21 Dec 2009 17:09:00 +0000</pubDate><atom:updated>2010-03-23T23:25:50.641+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tips</category><category domain="http://www.blogger.com/atom/ns#">Linux</category><title>Saving a streaming video / presentation</title><description>Ever wondered to to save those streaming videos from Youtube, Metacafe, DailyMotion and so many others? I always wanted to save those streams, so that I could watch them again and again even without an Internet connection.&lt;br /&gt;
&lt;br /&gt;
I am a faithful Firefox user, and one of its wonderful plugin - &lt;a href="http://www.downloadhelper.net/"&gt;DownloadHelper&lt;/a&gt; has helped me for a long time to capture and save Youtube videos as flash video files on my local hard disk. That was quite helpful. But I always wanted to save those InfoQ videos as well, but unfortunately, DownloadHelper could not provide support for InfoQ (among others).&lt;br /&gt;
&lt;br /&gt;
It was only recently, that I used the conversion feature of DownloadHelper, in which I was converting one of those Youtube videos to be converted to wmv format. I noticed, that the conversion started only after the whole of the video stream was played on my browser. And I could readily guess, that the conversion must be using one of the libraries on my machine. So I looked at the process to find that it was using ffmpeg command to do this job. I also noticed, that actually every video was buffered to the /tmp on my Ubuntu. The filename I could see was something like FlashVOZFnS.&lt;br /&gt;
&lt;br /&gt;
Naturally, if a movie plays on your machine, it must be stored somewhere before being played on your browser. So now if you want to save your next streaming video, just identify where in your system does the flash player saves its movie temporarily before being played on your browser, and save that file to your videos folder, and possibly give it a .flv extension too.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;b&gt;Note&lt;/b&gt;:&amp;nbsp;&lt;/i&gt;
&lt;ol&gt;
&lt;li&gt;&lt;i&gt;As soon as you close the tab containing the video, the temporary file is discarded.&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Not all videos may be fully buffered before playing. Very long videos and webcasts may not be fully buffered.&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;h3&gt;Converting flash movies to other format (Linux)&lt;/h3&gt;
And now if you also want to convert it into other formats, its very easy in Linux with the following commands:&lt;br /&gt;
&lt;b&gt;FLV to WMV:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;code&gt;ffmpeg -i /home/thomas/Desktop/video.flv -y -v 0 -acodec wmav1 -b 1000kbps -f asf -vcodec wmv1 /home/thomas/Desktop/video.wmv&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;FLV to MPG:&lt;/b&gt;&lt;br /&gt;
&lt;code&gt;ffmpeg -i /home/thomas/dwhelper/Desktop/video.flv -y -v 0 -f asf -vcodec mpeg4 /home/thomas/Desktop/video.mpg&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;

There are so many other options with this command, even up to video capturing your screen, but I am not very expert at those. So I leave it to you to experiment with those options.

&lt;hr&gt;
&lt;h2&gt;Update&lt;/h2&gt;
For any streaming video site, if you cannot see DownloadHelper to your help, make sure that you should have only this one tab containing any video to download. In other words, if you have multiple tabs with video contents, DownloadHelper seems to get confused, so you may not actually get a download link help.
&lt;br/&gt;&lt;br/&gt;
---------------&lt;br/&gt;
Edited and removed some content for legal reasons.&lt;br/&gt;
---------------&lt;br/&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-3483692851486571088?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wpWiVEwqCDO5Lt_aryS8c6UmOcw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wpWiVEwqCDO5Lt_aryS8c6UmOcw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wpWiVEwqCDO5Lt_aryS8c6UmOcw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wpWiVEwqCDO5Lt_aryS8c6UmOcw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=lpWU3ZT1QcU:rbutYpv_NVA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=lpWU3ZT1QcU:rbutYpv_NVA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=lpWU3ZT1QcU:rbutYpv_NVA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=lpWU3ZT1QcU:rbutYpv_NVA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=lpWU3ZT1QcU:rbutYpv_NVA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=lpWU3ZT1QcU:rbutYpv_NVA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=lpWU3ZT1QcU:rbutYpv_NVA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=lpWU3ZT1QcU:rbutYpv_NVA:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=lpWU3ZT1QcU:rbutYpv_NVA:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/lpWU3ZT1QcU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/lpWU3ZT1QcU/saving-streaming-video-presentation.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2009/12/saving-streaming-video-presentation.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-8174019623107931526</guid><pubDate>Tue, 15 Dec 2009 14:43:00 +0000</pubDate><atom:updated>2009-12-15T20:45:56.730+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">ops4j</category><category domain="http://www.blogger.com/atom/ns#">OSGi</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><title>Configuring log4j with XML in OSGi</title><description>Sometime back, I had to make &lt;a href="http://perf4j.codehaus.org/"&gt;perf4j&lt;/a&gt; work on OSGi. It required &lt;a href="http://logging.apache.org/log4j/"&gt;log4j&lt;/a&gt; as the logging library and purely demanded &lt;code&gt;log4j.xml&lt;/code&gt; (it would not take the &lt;code&gt;.properties&lt;/code&gt; file since the configuration must attach downstream appenders). I assumed that it should be simple, but unfortunately it was not. In the rest of this post, I describe how I could get around this, and used log4j.xml to configure log4j logging in OSGi.&lt;br /&gt;&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;
&lt;h3&gt;Some background on logging for OSGi&lt;/h3&gt;
Logging was something that was looked as one of the earliest thing for building up our OSGi infrastructure libraries. Since most of the bundles and libraries require logging to be there, we were forced to provide its implementation at the early stages itself. What came as the first viable option was to use &lt;a href="http://wiki.ops4j.org/display/paxlogging/"&gt;Pax Logging&lt;/a&gt;. It is still the best logging mechanism for OSGi. It can take configurations in a variety of ways, the most pleasing of all the available configuration models was using the ConfigAdmin service that would leverage the OSGi's dynamism. This is again the best was to configure any service, and not just logging. Even without any explicit configuration Pax Logging would just work fine with its default behavior with a DEBUG for all the bundles in the system.&lt;br /&gt;
&lt;br /&gt;
We chose Pax Logging with ConfigAdmin service. At first the ConfigAdmin provider was chosen as &lt;a href="http://wiki.ops4j.org/display/ops4j/Pax+ConfMan"&gt;Pax ConfMan&lt;/a&gt;. But due to its limitation of not providing runtime updates, I chose to opt for &lt;a href="http://wiki.ops4j.org/display/~adreghiciu@gmail.com/Pax+Coin"&gt;Pax Coin&lt;/a&gt; which is still under incubation, but has some good features including runtime property updates and capability to consume configuration data from multiple sources. I was happy to make Pax Coin consume configuration from file system. But I could find that it simply did not accept configurations from the xml file.&lt;br /&gt;
&lt;br /&gt;
So, as of now though providing configuration data via ConfigAdmin seems to be a good choice, I could not find any quick solution to this. So I found a temporary hack for this.
&lt;br /&gt;
&lt;h3&gt;Hack&lt;/h3&gt;
&lt;strong&gt;Note:&lt;/strong&gt; The following instructions are for working on &lt;a href="http://paxrunner.ops4j.org/"&gt;Pax Runner&lt;/a&gt;. If you are not already using it, I would highly recommend it as a tool to start your OSGi framework. It would be the most elegant way to get started with OSGi.&lt;br/&gt;
&lt;ol&gt;
&lt;li&gt;
Remove any references to pax logging from your provisioning, so that it doesn't appear in your OSGi platform.&lt;/li&gt;
&lt;li&gt;Add commons-logging and log4j jars to the platform as bundles. Add the following URLs in your profile/provisioning file:
&lt;pre&gt;
    wrap:mvn:commons-logging/commons-logging/1.1.1
    wrap:mvn:log4j/log4j/1.2.15
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Point to the &lt;code&gt;log4j.xml&lt;/code&gt; file it OSGi classpath via Pax Runner. Its easy to append &lt;code&gt;--cp=&amp;lt;path_to_dir&amp;gt;&lt;/code&gt; as a parameter when starting Pax Runner. The directory &lt;code&gt;path_to_dir&lt;/code&gt; will now be in classpath, so you can place our log4j.xml there to be picked up by the log4j system.
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Future&lt;/h3&gt;
This was a temporary hack, but the concern is that I need to find a better way to make ConfigAdmin service consume XML.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-8174019623107931526?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oFPmhRKNnDPkMPXJ9ghe_83trVA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oFPmhRKNnDPkMPXJ9ghe_83trVA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/oFPmhRKNnDPkMPXJ9ghe_83trVA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oFPmhRKNnDPkMPXJ9ghe_83trVA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=U7azvAavaAY:LTrPUjx2LL4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=U7azvAavaAY:LTrPUjx2LL4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=U7azvAavaAY:LTrPUjx2LL4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=U7azvAavaAY:LTrPUjx2LL4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=U7azvAavaAY:LTrPUjx2LL4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=U7azvAavaAY:LTrPUjx2LL4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=U7azvAavaAY:LTrPUjx2LL4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=U7azvAavaAY:LTrPUjx2LL4:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=U7azvAavaAY:LTrPUjx2LL4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/U7azvAavaAY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/U7azvAavaAY/configuring-log4j-with-xml-in-osgi.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2009/12/configuring-log4j-with-xml-in-osgi.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-8543380609892044944</guid><pubDate>Wed, 18 Nov 2009 05:53:00 +0000</pubDate><atom:updated>2010-06-27T21:27:26.164+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">web frameworks</category><category domain="http://www.blogger.com/atom/ns#">polyglot</category><title>Microsoft ASP.NET MVC - Why Java web developers should reconsider action frameworks?</title><description>&lt;blockquote&gt;
Microsoft's &lt;a href="http://en.wikipedia.org/wiki/ASP.NET_MVC_Framework"&gt;ASP.NET MVC&lt;/a&gt; is a paradigm shift in web development from its pioneering component based development offered with &lt;a href="http://msdn.microsoft.com/en-us/library/ms973868.aspx"&gt;WebForms&lt;/a&gt; to action based web framework. This was a natural evolution due to the pains in the component based web development. While the Java community started out with the action based frameworks, the shift of the community seems to be on a higher side for the component based web development led by &lt;a href="http://java.sun.com/javaee/javaserverfaces/"&gt;JavaServer Faces (JSF)&lt;/a&gt; in the recent years. The shift of Microsoft towards action frameworks should make the Java web developer's heads again turn towards action frameworks and reconsider their choice towards the paradigm for web development. Perhaps a thinking about polyglot web development is needed, rather than abandoning action frameworks.&lt;br /&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;img border="0" height="207" src="http://static.openthoughtworks.com/images/webframeworks.png" width="320" /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;a name='more'&gt;&lt;/a&gt;&lt;h3&gt;





A stroll with component web framework&lt;/h3&gt;
Like many other Java web developers, I also had a chance to use JSF for my web development, after using &lt;a href="http://struts.apache.org/1.x/"&gt;Struts classic&lt;/a&gt; for almost two years. Everything was so exciting as we started with it. There was en enthusiasm to go on with Rapid Application Development (RAD) with drag and drop, the event oriented programming ushered by the component framework. The wide variety of JSF extensions, and widgets that would help us develop rich web applications, added to our excitement. The pain in tinkering with JavaScript and browser quirks would be zeroed.&lt;br /&gt;
&lt;br /&gt;
As we started out, there were some initial hiccups because of the change in the way we think about developing web applications. Now we are less worried about the basics of HTTP, requests, responses, request parameters and its conversion between class properties. We were excited about the wide variety of rich controls that a JSF extension such as Richfaces or ICEFaces could offer.&lt;br /&gt;
&lt;br /&gt;
Now about one year down the line as we started out writing more and more code, I felt at certain places, that I was missing action framework. It was not easy to bookmark pages - the URLs where least indicative about it, they are not search engine friendly. There are a whole lot of&amp;nbsp;&lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=45519#233235"&gt;problems indicated by people&lt;/a&gt; at various&amp;nbsp;&lt;a href="http://raibledesigns.com/rd/entry/re_usability_problems_in_jsf"&gt;blogs&lt;/a&gt; and articles. The flow control with JSF was very flaky, unless I used &lt;a href="http://www.springsource.org/webflow"&gt;Spring Webflow&lt;/a&gt; to &lt;a href="http://www.javaworld.com/javaworld/jw-11-2008/jw-11-intro-to-swf2.html"&gt;conquer my workflow&lt;/a&gt; requirements. I could no longer easily play with small tweaks that action frameworks would have always allowed me to. I had lost the flexibility to the framework that was primarily made to hide the details about HTTP. Although there are ways to get around with the limitations, some workarounds are very ugly and the bottomline was - &lt;a href="http://java.sys-con.com/node/43952"&gt;the simplicity had gone&lt;/a&gt;. There was a higher learning curve too.&lt;br /&gt;
&lt;br /&gt;
While the problems faced with JSF may not be true for every component frameworks, the higher adoption rate for JSF is causing me to rethink on it, before I could invest more efforts on it.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;



Looking back at action web framework&lt;/h3&gt;
While the flexibility problems with JSF were still haunting, I heard about ASP.NET MVC from Microsoft - an action framework for .NET web development. I was looking back to action frameworks now. When I last used Struts classic in 2007,&amp;nbsp;&amp;nbsp;&lt;a href="http://struts.apache.org/2.x/"&gt;Struts 2&lt;/a&gt; had already hit the popularity headlines. But I did not had a chance to try that out, because of the obvious migration problems associated with a large project. With a mixed response to this, I started looking into Struts 2.&lt;br /&gt;
&lt;br /&gt;
While I am still learning Struts 2, I could realize that the framework is much more easier that its predecessor. It could hide away the HTTP details, but at the same time, it was easy for anyone to play with the intricacies of HTTP if one would like to. Its damn simple, with least learning curve, probably because action framework are the right fit to thinking on how web works. Lead architect of Microsoft - &lt;a href="http://weblogs.asp.net/scottgu/archive/2009/04/01/asp-net-mvc-1-0.aspx"&gt;Scott Guthrie has quoted&lt;/a&gt; on the action framework - "&lt;i&gt;It enables full control over HTML markup and URL structure, and facilitates unit testing and a test driven development workflow&lt;/i&gt;" explains this.&lt;br /&gt;
&lt;br /&gt;
I wondered why even after three years of Struts 2 (and so many other action frameworks for Java), JSF adoption rate was going high when compared to Struts or any other action frameworks. The job boards posted more requirements for JSF jobs when compared to action frameworks like Struts. This made me look into some depth why Microsoft adopted action frameworks, who were the people who introduced component based programming to the web development with ASP. ASP was later evolved with .NET as it became ASP.NET. &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;



A look into why component web frameworks emerged&lt;/h3&gt;
The significant roots of component based frameworks could be traced back to Microsoft coming out with ASP way back in mid-nineties to late nineties, as web started growing out from serving static HTML pages to creating dynamic web applications using the same HTTP protocol and HTML markups. The programming style in ASP although made some exposure to HTML, HTTP, GET and POST, primarily it was intended for VB6 desktop developers who would like to move on to web development. ASP.NET 1.0 continued this pace within the .NET framework. It was easy for seasoned VB6 developers to drag and drop components from the toolbox to author a page, with the least concern that it was a programming for web. VB6ers felt at home as they had to deal with post-backs and click handlers.&lt;br /&gt;
&lt;br /&gt;
The same period in the Java space was taking a different stride. The Servlet specification was the first attempt from the Java community to deal with dynamic web pages. The pain of writing HTML markup in Java code paved the way to emergence of JSP. This was relaxing to an extent, but there were no formal web frameworks. This made the emergence of Struts by around mid of 2000, that brought in the concept of MVC to the web development. It quickly became the most popular framework in the Java community. Sun finally came out with a web-framework specification in &lt;a href="http://www.jsfcentral.com/editorial/editorial_1.html"&gt;2004 as JSF1.0&lt;/a&gt;. JSF was largely similar to ASP/ASP.NET model programming and aimed at a&amp;nbsp;&lt;a href="http://www.developer.com/design/article.php/3572721/JavaServer-Faces-and-ASPNET---A-Side-by-Side-Look.htm"&gt;competition with it&lt;/a&gt;. It is component based and even driven, that allowed rapid application developments that aimed the IDEs to give away drag-and-drop UI development combined with post-backs and even handlers in backing beans.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;



Why Microsoft is making a transition to action framework?&lt;/h3&gt;
Definitely Microsoft is more experienced in component based development. The developers have always missed an inherent MVC with WebForms. They have also missed the Test Driven Development (TDD) robustness in their applications. The separation of concerns provide extensibility and testability, that was missing in WebForms. Action framework provided by the ASP.NET MVC has been now recognized as a natural fit to developing web applications. The power, simplicity and flexibility of action frameworks was witnessed earlier with &lt;a href="http://www.castleproject.org/monorail/index.html"&gt;MonoRail&lt;/a&gt; by the .NET developers. The emergence of ASP.NET MVC is the result of learning from the past and the recognition of needs by the developers for a simple, yet powerful action framework to the mainstream .NET developers. Now ASP.NET developers could enjoy TDD approach to web development in addition to the simplicity and extensibility provided by the action framework.&lt;br /&gt;
&lt;br /&gt;
While the ASP.NET MVC framework was released just this March 2009, the active community around it has already found need for further improvements with an effort &lt;a href="http://aspnet.codeplex.com/wikipage?title=Road%20Map"&gt;already into the development of its 2.0 release&lt;/a&gt;. I do not rule out the reasons to attract non .NET web developers into the Microsoft platform as one reason for Microsoft to come out with this plan. A notable point here is the recommendation by Microsoft to move the WebForms to the new action framework. It is already predicted by some to be the norm for ASP.NET development by 2011. ASP.NET MVC will be shipped with Visual Studio 2010 underlines its importance to Microsoft.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;



Learning from each other&lt;/h3&gt;
Though late, Microsoft community has identified the importance of action framework for web development. Now when the Microsoft community is moving from component based to action framework based web development, the Java community really needs to re-evaluate its use of JSF for web development. Definitely, each paradigm of web development has its own importance, and probably can and should co-exist. But the larger Java community should not forget the learning of Microsoft community with web development framework.&lt;br /&gt;
&lt;br /&gt;
On the other hand, Microsoft community can benefit from the learning in Java community with action frameworks such as Struts 2. ASP.NET MVC has&amp;nbsp;&lt;a href="http://weblogs.asp.net/scottgu/archive/2009/04/01/asp-net-mvc-1-0.aspx"&gt;released under open source license&lt;/a&gt; (&lt;a href="http://www.opensource.org/licenses/ms-pl.html"&gt;MS-PL&lt;/a&gt;) and working with the community to develop it further, which is a welcome step. It also allows the community to contribute to the growth and higher adoption of the framework.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Rapid Application Development&lt;/b&gt;&lt;br /&gt;
As far as rapid application development is concerned, Rails principles such as convention over configuration, intelligent defaults, and automatic code generation with templates could be employed. ASP.NET MVC already includes tooling that uses code generation to quickly create a view based on a model object. Ruby on Rails is already a good example that can be followed. Struts 2 is no doubt, a great framework for Java web development with a flexible, simple and pluggable framework with convention over configuration and intelligent defaults that can be emulated by even the Microsoft community in developing its action framework. A good deal already seems to be into the ASP.NET MVC 1.0 inspired from Struts 2.&lt;br /&gt;
&lt;br /&gt;
RAD can also be supported with plugin architecture as in Struts 2 that already offers plugins for&amp;nbsp;&lt;a href="http://code.google.com/webtoolkit/"&gt;GWT&lt;/a&gt;,&amp;nbsp;&lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; and&amp;nbsp;&lt;a href="http://www.dojotoolkit.org/"&gt;dojo&lt;/a&gt; among others. More and more code generators like the&amp;nbsp;&lt;a href="http://www.springsource.org/roo"&gt;Spring ROO&lt;/a&gt; are also a welcome step. Perhaps we will witness a plethora of such code generators with Maven3 gets ready to be into the wild, that will support such extensions including the IDE integrations.&lt;br /&gt;
&lt;br /&gt;
WYSIWYG editors for component framework can definitely will have its own role to play. We can see such&amp;nbsp;&lt;a href="http://www.instantiations.com/gwtdesigner/"&gt;editors for GWT&lt;/a&gt; and JSF as well. Better WYSIWYG editors for action frameworks are needed for RAD.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;



Concluding thoughts&lt;/h3&gt;
The web frameworks do not end with JSF and Struts or with ASP.NET WebForms or ASP.NET MVC. There are notable advantages with frameworks like GWT and &lt;a href="http://echo.nextapp.com/site/"&gt;Echo&lt;/a&gt; that take a different stride to web development. Its time we need to re-look into our web development and see if we are beating every nail with the same hammer. Today as we speak of &lt;a href="http://blogs.computerworld.com/15032/polyglot_programming_development_in_multiple_languages"&gt;polyglot programming&lt;/a&gt; and &lt;a href="http://benscofield.com/2009/09/polyglot-persistence/"&gt;polyglot persistence&lt;/a&gt;, probably a thinking about polyglot web frameworks is also needed.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-8543380609892044944?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OotVM8V3gv8YqnGAI8CvpSfo_XU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OotVM8V3gv8YqnGAI8CvpSfo_XU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OotVM8V3gv8YqnGAI8CvpSfo_XU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OotVM8V3gv8YqnGAI8CvpSfo_XU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=WHoHBZiUS3o:RKVl7t6Gvw4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=WHoHBZiUS3o:RKVl7t6Gvw4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=WHoHBZiUS3o:RKVl7t6Gvw4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=WHoHBZiUS3o:RKVl7t6Gvw4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=WHoHBZiUS3o:RKVl7t6Gvw4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=WHoHBZiUS3o:RKVl7t6Gvw4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=WHoHBZiUS3o:RKVl7t6Gvw4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=WHoHBZiUS3o:RKVl7t6Gvw4:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=WHoHBZiUS3o:RKVl7t6Gvw4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/WHoHBZiUS3o" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/WHoHBZiUS3o/microsoft-aspnet-mvc-why-java-web.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>6</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2009/11/microsoft-aspnet-mvc-why-java-web.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-6519400021180807413</guid><pubDate>Thu, 29 Oct 2009 12:20:00 +0000</pubDate><atom:updated>2010-06-27T21:27:58.759+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">sql</category><category domain="http://www.blogger.com/atom/ns#">persistence</category><category domain="http://www.blogger.com/atom/ns#">orm</category><category domain="http://www.blogger.com/atom/ns#">nosql</category><title>Evolving persistence, SQL and ORMs to the next generation</title><description>Recently there has been a lot of discussion on the web describing the &lt;a href="http://codemonkeyism.com/orms/"&gt;ORMs as a thing of the past&lt;/a&gt;, and its &lt;a href="http://debasishg.blogspot.com/2009/10/are-orms-really-thing-of-past.html"&gt;associated discussions&lt;/a&gt; that &lt;a href="http://blog.schauderhaft.de/2009/10/18/hibernate-problems-alternative/"&gt;agreed&lt;/a&gt; and &lt;a href="http://java.dzone.com/articles/are-orms-really-thing-past"&gt;disagreed&lt;/a&gt; with their arguments presented to &lt;a href="http://www.hatfulofhollow.com/posts/code/farewell-to-orms.html"&gt;various degrees&lt;/a&gt;. The discussions even took a long &lt;a href="https://twitter.com/#search?q=orms%20thing%20of%20past"&gt;conversations across the twitter space&lt;/a&gt; too.
&lt;br/&gt;

&lt;h3&gt;Persistence models and application evolution&lt;/h3&gt;
Persistence is important for any application. Over the years this has been done in &lt;a href="http://internetmindmap.com/database_software"&gt;various ways&lt;/a&gt;. While RDBMS and SQL were the most obvious choice till few years from now, recent times have also seen successful practical usage of other persistence models which include Amazon's SimpleDB, and Google's BigTable among others. These non-relational alternatives fall under the &lt;a href="http://en.wikipedia.org/wiki/Nosql" onclick="javascript:pageTracker._trackPageview('/outbound/article/en.wikipedia.org');"&gt;NoSQL&lt;/a&gt; (or “&lt;a href="http://therealadam.com/archive/2009/08/31/its-not-nosql-its-post-relational" onclick="javascript:pageTracker._trackPageview('/outbound/article/therealadam.com');"&gt;post-relational&lt;/a&gt;”) persistence models.
&lt;br/&gt;&lt;br/&gt;


Naturally it becomes quite obvious that over the time, relational databases have &lt;a href="http://www.computerworld.com.au/index.php?q=article/309716/no_sql_anti-database_movement_gains_steam&amp;amp;fp=39&amp;amp;fpid=26257"&gt;proven inadequate&lt;/a&gt; to satisfy the growing needs of the Web2.0 applications. The advent of the new-generation non-relational databases are a proof to this.  Every persistence model has a niche area to which they cater. The newer databases have has also made people to think about "&lt;span style="font-style: italic;"&gt;mix-n-match&lt;/span&gt;" use of the various persistence models as people talk &lt;a href="http://benscofield.com/2009/09/polyglot-persistence"&gt;more&lt;/a&gt; and &lt;a href="http://www.infoq.com/news/2009/07/leberknight-polyglot-persistence"&gt;more&lt;/a&gt; about &lt;a href="http://www.nearinfinity.com/blogs/scott_leberknight/polyglot_persistence.html"&gt;polyglot persistence&lt;/a&gt;.
&lt;br/&gt;

&lt;h3&gt;The relation-object impedance mismatch&lt;/h3&gt;
Since RDBMS has a solid theoretical foundation, and has been used across various applications, its existence for another century cannot be ruled out. Yet new advances in persistence like &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;, &lt;a href="http://labs.google.com/papers/bigtable.html"&gt;BigTable&lt;/a&gt;,  &lt;a href="http://en.wikipedia.org/wiki/Amazon_SimpleDB"&gt;SimpleDB&lt;/a&gt;, &lt;a href="http://neo4j.org/"&gt;Graph databases&lt;/a&gt;, etc are most welcome steps in advancing the persistence mechanism.
&lt;br/&gt;&lt;br/&gt;


Even with newer persistence models, a lot of the enterprise applications still use, and will continue to use relational databases. Applications that use up this data are largely represented as objects. While object model seem to be the most obvious choice for application development, the mismatch between the relational model and the object model comes as the reason for a lot of hues and cries that have given rise to ORMs. The learning curve and the pain in using these ORMs have now given rise to debates questioning the existence of ORMs in the future.
&lt;br/&gt;&lt;br/&gt;


More than debating over the existence of ORMs itself, rather a deep look is needed, to the problem which the ORM is trying to solve. Why does the ORM exist? The most popular answer would be impedance mismatch. But the mismatch is pointed out between relational data representation versus the object model.
&lt;br/&gt;

&lt;h3&gt;Overhauling the persistence mechanisms&lt;/h3&gt;
Often the data storage mechanism and its interfacing API are seen as an integral part, including the RDBMS data storage and SQL. They are often seen as one, but are actually two separate components of the modern day  relational databases. They were created at a time when the existence and usage of OO was questionable. Even now when they are used for a long time, it can be argued that SQL and RDBMS themselves have a mismatch in the paradigms. Now when OO has gained so much importance, it is time that the RDBMS and SQL should be re-looked from the OO perspective.
&lt;br/&gt;&lt;br/&gt;


We can consider two aspects in any persistence mechanism:
&lt;ol&gt;&lt;li&gt;The way data is stored (relational, key-value, hierarchical ,  column, JSON etc) using various data structures and storage mechanisms. Closely associated to this data storage will be the related methods of storing and fetching the stored data (algorithms used to fetch data based on persistent store itself - eg relational algebra) that could be probably exposed through function calls. The function calls will be closely associated to the data store mechanism itself.&lt;/li&gt;&lt;li&gt;Interfacing provided to interact with persistent store (SQL, NoSQL, ObjectQL, programming language API  etc).&lt;/li&gt;&lt;/ol&gt;
Often these two aspects are baked together (in our minds most of the time). This thinking should evolve and these two should essentially be seen as separate, and ideally pluggable. We talk about adapter pattern in programming languages, but the same concept could probably be applied to persistence mechanisms as well. The persistent storage and its storing and fetching mechanism should allow widely different interfacing provided to interact with it. DB vendors can provide few interfacing mechanism, and also allow others to write other interfacing mechanism that should be pluggable.
&lt;br/&gt;

&lt;img style="margin: 0px auto 10px; display: block; text-align: center; width: 300px; height: 203px;" src="http://static.openthoughtworks.com/images/persistence-interfacing-small.png" alt="Persistence Interfacing" border="0" /&gt;

&lt;br/&gt;
Interfacing will expose the persistent store in various forms - relational model, or object model or even other models used now and may come in future.  Mapping of the datastore persistence model to the exposed model should reside with the interfacing mechanism used.
&lt;br/&gt;

&lt;h3&gt;Concluding thoughts&lt;/h3&gt;
Achieving this practically may not be very easy, but not impossible. Once this is achieved, ORMs will rather shed off the mapping weight and evolve as frameworks that enhance developer productivity on issues like caching, application scaling etc. Rather, ORMs will no longer be ORMs and probably a new breed of softwares will evolve that will take care of the cross-cutting concerns for an application when dealing with persistent stores.
&lt;br/&gt;&lt;br/&gt;


This may look crap to some,  but then that is what I wish. I am an application developer presenting my ideas on what a database itself can provide, and how applications can leverage the new capabilities. The issue needs to be looked at by db vendors and research scholars. DB vendors and db developers need to give deeper thoughts to the problems faced by application developers in their need to persist application data. How many of us use the bare databases (using only SQLs probably) without an application? The current forms of persistence may be right in their own theoretical framework, but it should evolve to fit in seamlessly with the application development space, where it is used.
&lt;br/&gt;&lt;br/&gt;


And till that happens, I will have to carefully weigh my choices among NoSQL, SQL and ORMs, and muddle with the problems that have already heated up a lot of discussions in the application development space.&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-6519400021180807413?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/m076YhkWvnMsTO4DR7w_E_IONyY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/m076YhkWvnMsTO4DR7w_E_IONyY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/m076YhkWvnMsTO4DR7w_E_IONyY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/m076YhkWvnMsTO4DR7w_E_IONyY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=b_-HkyUfJR8:nHateL-L-10:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=b_-HkyUfJR8:nHateL-L-10:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=b_-HkyUfJR8:nHateL-L-10:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=b_-HkyUfJR8:nHateL-L-10:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=b_-HkyUfJR8:nHateL-L-10:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=b_-HkyUfJR8:nHateL-L-10:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=b_-HkyUfJR8:nHateL-L-10:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=b_-HkyUfJR8:nHateL-L-10:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=b_-HkyUfJR8:nHateL-L-10:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/b_-HkyUfJR8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/b_-HkyUfJR8/evolving-persistence-sql-and-orms-to.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2009/10/evolving-persistence-sql-and-orms-to.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-2499963872033676867</guid><pubDate>Tue, 27 Oct 2009 13:44:00 +0000</pubDate><atom:updated>2009-11-17T18:16:41.562+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">career</category><title>My state of affairs - part 2 (looking for new projects)</title><description>In my &lt;a href="http://blog.openthoughtworks.com/2009/10/my-state-of-affairs-part-1.html"&gt;previous blog post&lt;/a&gt;, I mentioned about the my state of affairs, of how things have been moving in last 2-3 years, and why I was so irregular at posting blogs. The state of affairs was actually not finished yet. I continue it here.
&lt;br/&gt;

&lt;h3&gt;Looking out for new job/consulting opportunities&lt;/h3&gt;My current employer is finding it difficult to sustain its employees. While some employees quit at the start of the turbulent times, some of us including me decided to stay strong with the company. And now more than one year after showing signs of trouble, the company is not yet able to fully recover and get back to normal business. The management is so kind to ask us to look out for other jobs as an open offer to us. We can take our own time to move out. Although the management has plans to bring it up again back to business, it doesn't want its employees to be dragged across the difficult times any longer. As our work is tapering off, I will be looking out to see if some good offers can come along.
&lt;br/&gt;&lt;br/&gt;

So if you are looking out for an experienced developer or consultant, with proven track record in providing effective business solutions with good exposure to various technologies, try me - I will be happy to help you out. I specialize in Java/EE, Spring, Maven and OSGi (thats about building truly modular Java applications). And if you want few more experience hands, may be my company can help you in your IT endeavors, specializing in creating robust modular and scalable Java applications.
&lt;br/&gt;&lt;br/&gt;

In the meanwhile I will be working on some OSS projects and writing blogs. So, keep an eye on this blog. My blog posts will give a good understanding of various technologies and how the technology can be best put to use in solving real-life business problems.
&lt;br/&gt;&lt;br/&gt;

I am also working out on a project (of my own) that is a good mix of some technologies I have already learned, or have scratched the surface. It will provide the ground for me to build depth of my technical knowledge as well as serve as a ground to build up applications for my client that require ground-up work. Some time down the line, I will also give out this code to the OSS space.
&lt;br/&gt;&lt;br/&gt;

If you would like to know more about me, follow the links below:
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.linkedin.com/in/ethomasjoseph"&gt;LinkedIn profile&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://sites.google.com/a/openthoughtworks.com/static/pdf/Thomas_Resume.pdf"&gt;Resume (pdf)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://twitter.com/ethomasjoseph"&gt;Twitter profile&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ohloh.net/accounts/ethomasjoseph"&gt;Open Source contributions&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-2499963872033676867?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9eZPDt5Gn8Lq1eO7o-HpgPFKdqk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9eZPDt5Gn8Lq1eO7o-HpgPFKdqk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9eZPDt5Gn8Lq1eO7o-HpgPFKdqk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9eZPDt5Gn8Lq1eO7o-HpgPFKdqk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=U2vOLrCALRk:Hpj7niFgbFg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=U2vOLrCALRk:Hpj7niFgbFg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=U2vOLrCALRk:Hpj7niFgbFg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=U2vOLrCALRk:Hpj7niFgbFg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=U2vOLrCALRk:Hpj7niFgbFg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=U2vOLrCALRk:Hpj7niFgbFg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=U2vOLrCALRk:Hpj7niFgbFg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=U2vOLrCALRk:Hpj7niFgbFg:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=U2vOLrCALRk:Hpj7niFgbFg:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/U2vOLrCALRk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/U2vOLrCALRk/my-state-of-affairs-part-2-looking-for.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><enclosure url="https://sites.google.com/a/openthoughtworks.com/static/pdf/Thomas_Resume.pdf" length="61924" type="application/pdf" /><media:content url="https://sites.google.com/a/openthoughtworks.com/static/pdf/Thomas_Resume.pdf" fileSize="61924" type="application/pdf" /><feedburner:origLink>http://blog.ethomasjoseph.com/2009/10/my-state-of-affairs-part-2-looking-for.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-756085057554094331</guid><pubDate>Mon, 26 Oct 2009 20:10:00 +0000</pubDate><atom:updated>2009-10-27T09:15:16.182+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">career</category><title>My state of affairs - part 1</title><description>Now it has been a while that I have blogged, and I understand that not many people are there who follow my blog. Though some of the topics on which I have blogged in the past have been getting some good hits, I cannot maintain a regular list of people who will visit my blog often, probably because I am not regular at blogging. But thanks to those 3 feed-readers who have been with me, and probably would like to know, what keeps me busy that prevents me to write blogs, and now why is it that I am giving out an explanation. Also, probably in every other serious post that I write, I almost mention that the next post will be coming very soon, and still that does not happen.
&lt;img style="margin: 0px auto 10px; display: block; text-align: center;" src="http://static.openthoughtworks.com/images/computing-silhouette.jpg" alt="" border="0" /&gt;
&lt;h3&gt;Last 3 years&lt;/h3&gt;While it is a fact that I have been dealing with so many topics in the past, especially in the last 3 years or so, and every time I feel like posting about it on the blog, and yet that does not happen. all this time, I have been dealing with a vast breadth of topics in the Java space - &lt;span style="font-style: italic;"&gt;Rules Engine/Drools, &lt;a href="http://blog.openthoughtworks.com/2008/08/getting-your-toolbox-ready-for-osgi.html"&gt;OSGi (Pax, Felix, Equinox, Karaf)&lt;/a&gt;, Maven, ESB (ServiceMix), Message Routers (Camel), JPA/Hibernate, Spring, Webworks/Struts2, Spring Webflow, JSF, Facelets, RichFaces, REST, SOA, GAE (Google App Engine), GWT, Spring Security&lt;/span&gt; and its various tools, implementations and their integrations on how these topics can play with each other.




It was during this time that I got more into the OSS space as well. Initially moved by the JBoss professional open sourcing and then more impressed and involved with the &lt;a href="http://blog.openthoughtworks.com/2008/08/thinking-to-start-or-contributing-to.html"&gt;OPS4J&lt;/a&gt; philosophy. The single factor that made me meet OPS4J was its PAX line of products that dealt with OSGi. And as I started &lt;a href="http://www.tensegrity.hellblazer.com/2009/10/all-we-need-to-do-is-take-these-lies-and-make-them-true-somehow.html"&gt;learning OSGi&lt;/a&gt;, I was happy to take out some of my personal time to make few commits into the same products in PAX - that made me smile better as I struggled with my initial steps with OSGi.

&lt;h3&gt;The journey begins&lt;/h3&gt;This journey begins as I complete almost one year with my previous employer, when the client and the employer impressed with my performance handed over the implementation of intelligence in an insurance quoting system to me. Thanks to them, it was a great experience. I implemented the system using &lt;a href="http://blog.openthoughtworks.com/2008/03/rules-engines-for-business-rules-rules.html"&gt;Drools&lt;/a&gt; and I was able to deliver the system that could be taken out to production systems within 7 months from the date I was assigned the task, with hardly any help from anybody else. Whats more, the system was almost zero on bugs as of my knowledge.




Here I started my journey of exploring technologies beyond the regular Java/J2EE developer. Though in the past I had done it on my personal itch, this was a better experience, since could see it working on a real system. Before this, I had experience with the regular Java/J2EE experience like the majority developers with just Servlets, JSP, Struts, SQL, EJB etc etc.

&lt;h3&gt;Last 2 years&lt;/h3&gt;Now it is almost 2 years that I've been working with my current employer, and most of this time I was into R&amp;amp;D primarily with OSGi and its related aspects. While I personally like to dig past bleeding edge technologies, and playing with it, a similar work profile as my job profile was something that was very exciting. I was always excited about how technology could be used constructively to provide least effort and long term solutions to real-life business problems.

I was the prime responsible for bringing up a framework for the company that could be used by its products/services to cater its clients in the coming future. The power and dynamism of OSGi was a major push to this. During this time, I had the opportunity to deal with a variety of technologies to make up the framework as mentioned above. I did made serious advances in setting up the technological stack for my company based on OSGi. But I still feel very sorry that I could do very less on contributing this knowledge to the OSS, as I see people trying to struggle with OSGi and web .

&lt;h3&gt;But why should all that prevent from posting blogs?&lt;/h3&gt;All this made me so much involved in understanding the technologies that I considered it worthwhile to spend that 2-5 hours to understanding the other technology for integration to the stack, than to write a blog on what I had just learned. I even spent my personal time for understanding aspects of technology that was outside the scope in my official research. Also, its not that I did not write blogs. While a very few appeared here on my public blog, most of them went on to my corporate blog that is not a public one. Also, all this time, my understanding about any technology is something, that I think would be better to blog about as I learn more. But over the time, that never happened as I piled up more and more technologies.

&lt;h3&gt;So, now whats there for the future?&lt;/h3&gt;Guessed, it right! I am again going to say that I will try to be more regular at blogging. Blogging is a tool to showcase yourself, express your ideas and to market yourself. Now this time, there are reasons too why I should blog, about which I will be explaining in my immediately next blog (mmmh..., you will not have to wait, its ready as I write this. This blog was bloating too much, so I just decided to split it into two).&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-756085057554094331?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CoOihCypLvCvjSVbDXgqVFenvnw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CoOihCypLvCvjSVbDXgqVFenvnw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CoOihCypLvCvjSVbDXgqVFenvnw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CoOihCypLvCvjSVbDXgqVFenvnw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=3CSnRYjJnzs:ZT70bomdqZo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=3CSnRYjJnzs:ZT70bomdqZo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=3CSnRYjJnzs:ZT70bomdqZo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=3CSnRYjJnzs:ZT70bomdqZo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=3CSnRYjJnzs:ZT70bomdqZo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=3CSnRYjJnzs:ZT70bomdqZo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=3CSnRYjJnzs:ZT70bomdqZo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=3CSnRYjJnzs:ZT70bomdqZo:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=3CSnRYjJnzs:ZT70bomdqZo:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/3CSnRYjJnzs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/3CSnRYjJnzs/my-state-of-affairs-part-1.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2009/10/my-state-of-affairs-part-1.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-6527373349237662523</guid><pubDate>Thu, 11 Jun 2009 06:26:00 +0000</pubDate><atom:updated>2009-06-12T00:04:07.747+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">JavaOne</category><title>JavaOne 2009 slides are now out!</title><description>Now the slides of the sessions at JavaOne 2009 are out and available at &lt;a href="http://developers.sun.com/learning/javaoneonline/index.jsp"&gt;Sun Developer Network (SDN)&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
You need to be a registered user there! (For some, this sucks!)
&lt;br/&gt;&lt;br/&gt;
Modularity and OSGi was one of the discussed topics in the sessions, but worried to find that Sun has not mentioned anything on it (OSGi) on the site, though it has put up the slides :).
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;More Goodies&lt;/h3&gt;
Sun has put up some good articles and other stuffs on JavaOne as well on its &lt;a href="http://java.sun.com/javaone/2009/articles/listing.jsp"&gt;site&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-6527373349237662523?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7yAvHR8AkzZfphkNeLzu9LFg1_Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7yAvHR8AkzZfphkNeLzu9LFg1_Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7yAvHR8AkzZfphkNeLzu9LFg1_Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7yAvHR8AkzZfphkNeLzu9LFg1_Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=CuTnPY-jvx0:lOUXu1wvErA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=CuTnPY-jvx0:lOUXu1wvErA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=CuTnPY-jvx0:lOUXu1wvErA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=CuTnPY-jvx0:lOUXu1wvErA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=CuTnPY-jvx0:lOUXu1wvErA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=CuTnPY-jvx0:lOUXu1wvErA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=CuTnPY-jvx0:lOUXu1wvErA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=CuTnPY-jvx0:lOUXu1wvErA:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=CuTnPY-jvx0:lOUXu1wvErA:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/CuTnPY-jvx0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/CuTnPY-jvx0/javaone-2009-slides-are-now-out.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2009/06/javaone-2009-slides-are-now-out.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-790897730020943607</guid><pubDate>Thu, 11 Jun 2009 05:31:00 +0000</pubDate><atom:updated>2009-06-11T11:10:24.825+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">OSGi</category><category domain="http://www.blogger.com/atom/ns#">DevCon</category><title>OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO</title><description>This slide discusses some comparisons on the various component oriented development models with OSGi. Probably there a mention of Peaberry, would have been good. Sure, I will post some in the coming posts.

&lt;div style="width:425px;text-align:left" id="__ss_1233043"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/heiko.seeberger/osgi-devcon-09-component-oriented-development-in-osgi-with-ds-spring-and-ipojo?type=powerpoint" title="OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO"&gt;OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=osgidevcon09-components-tutorial-090401092329-phpapp01&amp;stripped_title=osgi-devcon-09-component-oriented-development-in-osgi-with-ds-spring-and-ipojo" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=osgidevcon09-components-tutorial-090401092329-phpapp01&amp;stripped_title=osgi-devcon-09-component-oriented-development-in-osgi-with-ds-spring-and-ipojo" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;Microsoft Word documents&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/heiko.seeberger"&gt;Heiko Seeberger&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-790897730020943607?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/vgzaVgU6m7LkVP68LOfYL1vCCj0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vgzaVgU6m7LkVP68LOfYL1vCCj0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/vgzaVgU6m7LkVP68LOfYL1vCCj0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/vgzaVgU6m7LkVP68LOfYL1vCCj0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=N8X_d9y9NQc:JYD7tMjiIuM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=N8X_d9y9NQc:JYD7tMjiIuM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=N8X_d9y9NQc:JYD7tMjiIuM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=N8X_d9y9NQc:JYD7tMjiIuM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=N8X_d9y9NQc:JYD7tMjiIuM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=N8X_d9y9NQc:JYD7tMjiIuM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=N8X_d9y9NQc:JYD7tMjiIuM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=N8X_d9y9NQc:JYD7tMjiIuM:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=N8X_d9y9NQc:JYD7tMjiIuM:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/N8X_d9y9NQc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/N8X_d9y9NQc/osgi-devcon-09-component-oriented.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><enclosure url="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=osgidevcon09-components-tutorial-090401092329-phpapp01&amp;stripped_title=osgi-devcon-09-component-oriented-development-in-osgi-with-ds-spring-and-ipojo" length="120402" type="application/x-shockwave-flash" /><media:content url="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=osgidevcon09-components-tutorial-090401092329-phpapp01&amp;stripped_title=osgi-devcon-09-component-oriented-development-in-osgi-with-ds-spring-and-ipojo" fileSize="120402" type="application/x-shockwave-flash" /><feedburner:origLink>http://blog.ethomasjoseph.com/2009/06/osgi-devcon-09-component-oriented.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-2294904130477514624</guid><pubDate>Thu, 11 Jun 2009 05:16:00 +0000</pubDate><atom:updated>2009-06-11T10:50:22.197+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">OSGi</category><category domain="http://www.blogger.com/atom/ns#">DevCon</category><title>OSGi DevCon 2009 Review</title><description>Last few weeks I was more into the OSGi updates going around with the EclipseCon and JavaOne. In this and few more posts I will try to put something to capture on the recent developments on OSGi and related fields and technologies.
&lt;br/&gt;&lt;br/&gt;
So here is an interesting slide I found.


&lt;div style="width:425px;text-align:left" id="__ss_1336336"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/njbartlett/osgi-devcon-2009-review?type=powerpoint" title="OSGi DevCon 2009 Review"&gt;OSGi DevCon 2009 Review&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=osgi-devcon2009-review-090424043433-phpapp02&amp;stripped_title=osgi-devcon-2009-review" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=osgi-devcon2009-review-090424043433-phpapp02&amp;stripped_title=osgi-devcon-2009-review" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;Microsoft Word documents&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/njbartlett"&gt;njbartlett&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-2294904130477514624?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/P6vwoeKlHT2b3yhKVaUG5FDKoVs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P6vwoeKlHT2b3yhKVaUG5FDKoVs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/P6vwoeKlHT2b3yhKVaUG5FDKoVs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/P6vwoeKlHT2b3yhKVaUG5FDKoVs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=C0C7Lfm5rS0:h7La-AaQ9B8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=C0C7Lfm5rS0:h7La-AaQ9B8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=C0C7Lfm5rS0:h7La-AaQ9B8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=C0C7Lfm5rS0:h7La-AaQ9B8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=C0C7Lfm5rS0:h7La-AaQ9B8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=C0C7Lfm5rS0:h7La-AaQ9B8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=C0C7Lfm5rS0:h7La-AaQ9B8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=C0C7Lfm5rS0:h7La-AaQ9B8:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=C0C7Lfm5rS0:h7La-AaQ9B8:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/C0C7Lfm5rS0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/C0C7Lfm5rS0/osgi-devcon-2009-review.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><enclosure url="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=osgi-devcon2009-review-090424043433-phpapp02&amp;stripped_title=osgi-devcon-2009-review" length="120402" type="application/x-shockwave-flash" /><media:content url="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=osgi-devcon2009-review-090424043433-phpapp02&amp;stripped_title=osgi-devcon-2009-review" fileSize="120402" type="application/x-shockwave-flash" /><feedburner:origLink>http://blog.ethomasjoseph.com/2009/06/osgi-devcon-2009-review.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-4103912389347718037</guid><pubDate>Thu, 14 May 2009 11:19:00 +0000</pubDate><atom:updated>2009-05-14T19:40:39.833+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">book review</category><category domain="http://www.blogger.com/atom/ns#">maven</category><title>Book Review: Maven: The Definitive Guide</title><description>Sonatype &lt;a href="http://www.sonatype.com/people/2009/05/maven-book-05-flex-chapter-pdf-improvments/"&gt;recently released&lt;/a&gt; its 0.5 version of its Maven Book - &lt;a href="http://www.sonatype.com/products/maven/documentation/book-defguide"&gt;Maven: The Definitive Guide&lt;/a&gt;.The print edition published by &lt;a href="http://www.amazon.com/Maven-Definitive-Guide-Sonatype-Company/dp/0596517335/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1223866448&amp;amp;sr=8-1"&gt;O'Reilly&lt;/a&gt;, the printable PDF published by Sonatype is available as a &lt;a href="http://www.sonatype.com/maven/documentation/download-book?file=books/maven-definitive-guide.pdf"&gt;free download&lt;/a&gt;! I went thorough the book quickly and here is my first hand impression. The books is also available for &lt;a href="http://www.sonatype.com/books/maven-book/reference/"&gt;online reading&lt;/a&gt;.
&lt;br/&gt;
&lt;img src="http://www.sonatype.com/images/page7_3.jpg" alt="Maven: The Definitive Guide" /&gt;
&lt;br/&gt;
&lt;h2&gt;Cool!&lt;/h2&gt;
I have been using Maven now for quite sometime, and I was very happy to read the book. The book is a fit-for-all, who wants to use maven in someway or other.
&lt;br/&gt;&lt;br/&gt;
It starts with as simple as downloading and installing maven, to explaining the core basics of maven, its dependency management, plugins etc, to optimizing plugins and POMS. It serves as a tutorial as well as a reference guide for Maven.
&lt;br/&gt;
The book explains concept with ample examples. It also covers to explain some of the most useful plugins in depth. It explains the maven build cycle in depth, build profiles, maven assemblies, site generation and maven repositories, m2eclipse and nexus at depth. It also explains customizing plugins and also on writing our own plugins.
&lt;br/&gt;
&lt;h3&gt;How to use the book&lt;/h3&gt;
An extract:
&lt;br/&gt;
&lt;blockquote&gt;
This book is divided into three parts: Introductory Material, Part I, “Maven by Example”, and Part II, “Maven Reference”. The introductory material consists of two chapters: Chapter 1, Introducing Apache Maven and Chapter 2, Installing and Running Maven. Part I, “Maven by Example” introduces Maven by developing some real examples and walking you through the structure of those examples providing motivation and explanation along the way. If you are new to Maven, start with Part I, “Maven by Example”. Part II, “Maven Reference” is less introduction than reference, each chapter in Part II, “Maven Reference” deals with a focused topic and dives into as much detail as possible about each topic. For example, the Chapter 17, Writing Plugins chapter in Part II, “Maven Reference” deals with writing plugins by providing a few examples and a series of lists and tables.
&lt;br/&gt;&lt;br/&gt;
While both Part I, “Maven by Example” and Part II, “Maven Reference” provide explanation, each part takes a different strategy. Where Part I, “Maven by Example” focuses on the context of a Maven project, Part II, “Maven Reference” focuses on a single topic. You can skip around in the book, Part I, “Maven by Example” is by no means a prerequisite for Part II, “Maven Reference”, but you'll have a better appreciation for Part II, “Maven Reference” if you read through Part I, “Maven by Example”. Maven is best learned by example, but once you've gone through the examples, you are going to need a good reference to start customizing Maven for your own environment.
&lt;/blockquote&gt;
&lt;br/&gt;
&lt;h2&gt;Kudos&lt;/h2&gt;
The work is excellent and what makes it even better is the fact that the company and the authors do not consider it complete yet! Its a beta 0.5. This is what they have to say on it:
&lt;br/&gt;
&lt;blockquote&gt;
If this book moves out of Beta, we're essentially saying that there is no more content to add and nothing is going to change. I've always thought that good books evolve over time and that they live beyond the confines of the chapters and sections that define them. A good book is an ongoing conversation and a series of interactions not just between authors and readers, but of lateral interactions between readers. That was a fancy way of saying that the book is a community.
&lt;/blockquote&gt;
&lt;br/&gt;
Sonatype and the book authors have done an excellent job. I would recommend the book to anyone who uses Maven.&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-4103912389347718037?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WrI7m5E_vOHUuTmbo_K6sLvzhsA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WrI7m5E_vOHUuTmbo_K6sLvzhsA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WrI7m5E_vOHUuTmbo_K6sLvzhsA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WrI7m5E_vOHUuTmbo_K6sLvzhsA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=V96lT4vq1E0:fUQqb9Ifwns:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=V96lT4vq1E0:fUQqb9Ifwns:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=V96lT4vq1E0:fUQqb9Ifwns:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=V96lT4vq1E0:fUQqb9Ifwns:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=V96lT4vq1E0:fUQqb9Ifwns:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=V96lT4vq1E0:fUQqb9Ifwns:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=V96lT4vq1E0:fUQqb9Ifwns:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=V96lT4vq1E0:fUQqb9Ifwns:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=V96lT4vq1E0:fUQqb9Ifwns:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/V96lT4vq1E0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/V96lT4vq1E0/book-review-maven-definitive-guide.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2009/05/book-review-maven-definitive-guide.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-876875298872454031</guid><pubDate>Tue, 12 May 2009 07:04:00 +0000</pubDate><atom:updated>2009-05-12T13:58:33.357+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">OSGi</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">RIA</category><title>Flex Clients for OSGi apps</title><description>As I continued to work on OSGi based web apps, there was rising demands from our clients and partners about supporting Flex clients in future. I took a lead to evaluate our existing architecture consisting mainly of POJOs, supported with Spring and OSGi.
&lt;br/&gt;&lt;br/&gt;
Thanks to the documentation at &lt;a href="http://opensource.adobe.com/wiki/display/blazeds/Overview"&gt;BlazeDS site&lt;/a&gt; and the &lt;a href="http://feeds.dzone.com/%7Er/zones/refcardz/%7E3/icbjx9Ewknk/flex-spring-integration"&gt;refcard at DZone&lt;/a&gt; for helping me out. I am almost ignorant of Flex programming, but still I could make out few things. Here is my first-cut evaluation.
&lt;br/&gt;
&lt;h2&gt;Flex and Java with POJO&lt;/h2&gt;
I was happy to learn that with Spring's hailed paradigm of programming with interfaces and POJOs would make integration with Flex very simple, and would hardly require any change in how we program and architect our application.
&lt;br/&gt;&lt;br/&gt;
Flex has strong ties to Java. Its server BlazeDS is based on Java remoting. Good news that with Spring BlazeDS, we can reuse our interfaces and its POJO implementations.
&lt;br/&gt;&lt;br/&gt;
&lt;a href="http://www.springsource.org/spring-flex"&gt;Spring BlazeDS&lt;/a&gt; as described by SpringSource:
&lt;blockquote&gt;
Spring BlazeDS Integration is a new addition to the Spring portfolio, and a component of the complete Spring Web stack.  This project's purpose is to make it easier to build Spring-powered Rich Internet Applications using &lt;a href="http://www.adobe.com/devnet/flex/"&gt;Adobe Flex&lt;/a&gt; as the front-end client.  It aims to achieve this purpose by providing first-class support for using the open source &lt;a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/"&gt;Adobe BlazeDS&lt;/a&gt; project and its powerful remoting and messaging facilities in combination with the familiar Spring programming model.
&lt;/blockquote&gt;
&lt;br/&gt;&lt;br/&gt;
Blaze DS is based on Java remoting and web messaging from Adobe. Its primary purpose of existence is easier integration of Adobe Flex/Adobe AIR with existing Java code to create Rich Internet Applications (RIA). Spring BlazeDS leverages more on this end by its dependency injection, and simpler integration platform.
&lt;br/&gt;&lt;br/&gt;
Blaze DS can be set to run on any web container such as Tomcat. It listens to a particular URL for client requests and processes them. Flex clients connect to the Blaze DS server and executes Java methods. The base transport protocol will be HTTP.
&lt;br/&gt;&lt;br/&gt;
The regular client calls with Blaze DS is usually handled by a Servlet from Blaze DS. However, when Spring Blaze DS comes into picture, this is replaced by the Spring's Spring MVC Servlet, so that Spring can intercept those client calls.
&lt;br/&gt;&lt;br/&gt;
Flex works on the concept of message broker. A class that will can handle client calls. The clients calls will be routed to the message broker through additional configuration specific to Blaze DS. We should be happy to expose our interfaces and its implementation classes to work as message brokers.
&lt;br/&gt;&lt;br/&gt;
A sample Spring's application-context.xml file
&lt;pre class="brush: xml"&gt;
&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;
&amp;lt;beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:flex="http://www.springframework.org/schema/flex"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/flex
http://www.springframework.org/schema/flex/spring-flex-1.0.xsd"&amp;gt;
&amp;lt;!-- Spring Beans's --&amp;gt;
&amp;lt;bean id="myService" class="MyServiceImpl" /&amp;gt;
&amp;lt;!-- Simplest possible message broker --&amp;gt;
&amp;lt;flex:message-broker /&amp;gt;
&amp;lt;!-- exposes myService as BlazeDS destination --&amp;gt;
&amp;lt;flex:remote-service ref="myService" /&amp;gt;
&amp;lt;/beans&amp;gt;
&lt;/pre&gt;
&lt;br/&gt;
The point to be noted above is that myService can be given any reference, including a reference to any OSGi service.
&lt;br/&gt;&lt;br/&gt;
Another notable point about Spring BlazeDS Integration is that Flex can support authentication, that can easily plug in with &lt;a href="http://static.springsource.org/spring-security/site/index.html"&gt;Spring Security&lt;/a&gt;.
&lt;br/&gt;
&lt;h3&gt;Kudos&lt;/h3&gt;
Spring BlazeDS has not yet had its final release, but indeed a great work from Spring guys to help lift existing POJO based applications to work with Flex clients in most non-intrusive manner.&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-876875298872454031?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BWfDlOO-duxpjjhvFno-vXjn7UQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BWfDlOO-duxpjjhvFno-vXjn7UQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BWfDlOO-duxpjjhvFno-vXjn7UQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BWfDlOO-duxpjjhvFno-vXjn7UQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=6zqPp46L7ro:q0Oz7u5-_Jc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=6zqPp46L7ro:q0Oz7u5-_Jc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=6zqPp46L7ro:q0Oz7u5-_Jc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=6zqPp46L7ro:q0Oz7u5-_Jc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=6zqPp46L7ro:q0Oz7u5-_Jc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=6zqPp46L7ro:q0Oz7u5-_Jc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=6zqPp46L7ro:q0Oz7u5-_Jc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=6zqPp46L7ro:q0Oz7u5-_Jc:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=6zqPp46L7ro:q0Oz7u5-_Jc:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/6zqPp46L7ro" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/6zqPp46L7ro/flex-clients-for-osgi-apps.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>1</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2009/05/flex-clients-for-osgi-apps.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-662493329566238591</guid><pubDate>Fri, 08 May 2009 14:00:00 +0000</pubDate><atom:updated>2009-05-08T19:33:29.311+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">News</category><title>Guice getting into Java SE?</title><description>One day I may use @javax.inject.Inject as my regular Java annotation! Yes, dependency injection with annotations might become a standard Java API. Google Guice and SpringSource have partnered to standardize a proven, non-controversial set of annotations that make injectable classes portable  across frameworks. The JSR has been proposed.

&lt;br/&gt;&lt;br/&gt;

Read more about this at the official &lt;a href="http://google-code-updates.blogspot.com/2009/05/javaxinjectinject.html"&gt;Google Code Blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-662493329566238591?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WB5l0x7wlOOk0CkPE1pbzvyYHV4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WB5l0x7wlOOk0CkPE1pbzvyYHV4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WB5l0x7wlOOk0CkPE1pbzvyYHV4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WB5l0x7wlOOk0CkPE1pbzvyYHV4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=AaMCQza-n-s:rz2oLHhYY2s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=AaMCQza-n-s:rz2oLHhYY2s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=AaMCQza-n-s:rz2oLHhYY2s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=AaMCQza-n-s:rz2oLHhYY2s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=AaMCQza-n-s:rz2oLHhYY2s:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=AaMCQza-n-s:rz2oLHhYY2s:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=AaMCQza-n-s:rz2oLHhYY2s:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=AaMCQza-n-s:rz2oLHhYY2s:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=AaMCQza-n-s:rz2oLHhYY2s:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/AaMCQza-n-s" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/AaMCQza-n-s/guice-getting-into-java-se.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2009/05/guice-getting-into-java-se.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-4442704112452239477</guid><pubDate>Mon, 20 Apr 2009 11:06:00 +0000</pubDate><atom:updated>2009-04-20T20:25:40.332+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tips</category><category domain="http://www.blogger.com/atom/ns#">html</category><title>Submitting form to new window</title><description>Today one of my co-workers was in an effort to submit a form that would bring up a new popup window. After some Googling, they found a solution.
&lt;br/&gt;
&lt;pre class="brush:html"&gt;
&amp;lt;form name="datacollector" method="POST" action="new-url.do" target="_blank"&amp;gt;
&amp;lt;!--
     ...
     other form elements
     ...
--&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/pre&gt;

Though this was getting them a new window, on Firefox it was appearing as a new tab. They soon found a setting in FF, that would bring it to a new window itself. However, they wanted a popup without any toolbars, menus etc.
&lt;br/&gt;&lt;br/&gt;
They approached me. Thanks to one of my student days HTML/JavaScript tutorial. I was able to recollect it and give them a solution.
&lt;br/&gt;
&lt;pre class="brush:html"&gt;
&amp;lt;script type="text/javascript"&amp;gt;
   function submitToNewWindow(frm) {
       window.open('','popupWin','scrollbars=no,menubar=no,height=600,width=800,resizable=yes,toolbar=no,status=no');
       frm.action= "new-url.do";
       frm.target = "popupWin";
       frm.submit();
   }
&amp;lt;/script&amp;gt;
...
...
&amp;lt;form name="datacollector" method="POST"&amp;gt;
&amp;lt;!--
     ...
     other form elements
     ...
--&amp;gt;
      &amp;lt;input type="button" value"Generate" onclick="javascript:submitToNewWindow(this.form)"/&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/pre&gt;

The idea is simple. Open a window with a name (here popupWin) using JavaScript that will have no scrollbar, menu, etc. Now in the form's target, supply this window name. This would bring up the form submission's result on the specified popup window. As far as the "_blank" is concerned, it is a HTML's default name for a new blank window.
&lt;br/&gt;&lt;br/&gt;

This is a basic feature of HTML, that in the target, it accepts the name of a window. Note that if a window with that name does not exist, probably a new one will be created.
&lt;br/&gt;&lt;br/&gt;

This solution was tested to be working in FF as well as IE.
&lt;br/&gt;&lt;br/&gt;

Though this is a simple solution, I thought to put up here on my blog, as my co-workers were not able to get anything like this on Googling.&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-4442704112452239477?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/MOdhh9yPXizZauhjoER4EAwNqrg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MOdhh9yPXizZauhjoER4EAwNqrg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/MOdhh9yPXizZauhjoER4EAwNqrg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/MOdhh9yPXizZauhjoER4EAwNqrg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=Jowq2ara1zE:SVR06LWlX7M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=Jowq2ara1zE:SVR06LWlX7M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=Jowq2ara1zE:SVR06LWlX7M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=Jowq2ara1zE:SVR06LWlX7M:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=Jowq2ara1zE:SVR06LWlX7M:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=Jowq2ara1zE:SVR06LWlX7M:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=Jowq2ara1zE:SVR06LWlX7M:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=Jowq2ara1zE:SVR06LWlX7M:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=Jowq2ara1zE:SVR06LWlX7M:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/Jowq2ara1zE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/Jowq2ara1zE/submiting-form-to-new-window.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2009/04/submiting-form-to-new-window.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-2335698434042862624</guid><pubDate>Thu, 16 Apr 2009 14:49:00 +0000</pubDate><atom:updated>2009-04-16T21:43:59.967+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><category domain="http://www.blogger.com/atom/ns#">Daemon</category><title>Cross Platform Java Daemon</title><description>Running a Java application (non graphical) would normally need a command line for it. This seems OK if we are developing small applications, but today we see enterprise applications that often needs to go and work as a server, that need to start up and go down with the OS. For such applications, the requirement of avoiding a command line gains importance. Such applications are often referred to as Daemons in the *nix space, and services in the Windows space.
&lt;br/&gt;&lt;br/&gt;

&lt;h2&gt;Solutions?&lt;/h2&gt;
Wondering that you have seen so many Java applications that can work without command line? Its not that Java applications without a command line is not possible. Though Java is popular for being platform independent, doing this "daemonising" task has not been of that nature. Many of the Java based server products have been doing that in various different ways, and in most cases using native code. And if your look around for Java Daemon, or Java as Windows Service, you will find separate and widely different solutions.
&lt;br/&gt;&lt;br/&gt;

And there are solutions specific to platforms, for instance - the nohup and screen command in linux can get you an application without terminal. For the nohup, though your solution to stop the application, is probably to kill it.
&lt;br/&gt;&lt;br/&gt;

Recently I had a similar need, I looked around and could find a bunch of solutions:
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://commons.apache.org/daemon/"&gt;Commons Daemon (C, Java)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sourceforge.net/projects/wrapper"&gt;Java Service Wrapper (C and Java)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sourceforge.net/projects/yajsw"&gt;Yet Another Java Service Wrapper (pure Java)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://akuma.dev.java.net/"&gt;Akuma&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;br/&gt;&lt;br/&gt;
&lt;h2&gt;Do it yourself!&lt;/h2&gt;
Going through even the surface of these will give you an idea of how widely the implementations vary. These are solutions that help you lift your existing application, if you yourself do not want to provide any implementation of getting daemonised. But if you are happy to learn on this concept, or want to get your code provide the "daemon" power natively with simplicity and lightweight effort, read on...
&lt;br/&gt;&lt;br/&gt;


(&lt;b&gt;Note:&lt;/b&gt; I would recommend a reading of the Commons Daemon. Also note that the code below is just ideas and concepts, you may need to evolve it further to make it production ready.)

&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;The concepts&lt;/h3&gt;
Any Java application needs an entry point for it to start working. This is the public static void main(String[]) method. And the common way to do this invocation is to instruct the JVM and show it the class that contains this method block, with the java command. This command will start the JVM which starts the Java program starting with the main method. The command line is blocked until the Java program completes. This is a valid scenario for small and interactive applications, but for multi-threaded server programs, we do not want the command line.

&lt;br/&gt;&lt;br/&gt;

The daemon solutions have varied way to enter a Java program (other than the main method as well). But here, we will use what we already know: enter a Java program with main method and still remain detached from the command line.


&lt;br/&gt;&lt;br/&gt;

There we need to understand two concepts:
&lt;br/&gt;
&lt;strong&gt;1. Starting a program.&lt;/strong&gt;
Using Java, it is possible to start "any program" using Runtime.exec() and ProcessBuilder.exec(). Wondering? Yes, any program that you can run in a command line can also be launched within Java programs as well. Another notable aspect of this is that the launched program does not have a command line associated with it, and it is optional for the launching Java program to keep track of this process. Well, we will use this concept to launch a Java process inside a Java program!

&lt;br/&gt;

&lt;strong&gt;2. Stopping the program&lt;/strong&gt;
For a Java program, there is no way to get the control of a process running in the system. So if we launched a process from a Java program, and lost control over it, how can we tame it to bring it down? Establish protocol! We will make the launched program to open a port and start listening to it, and when it receives a valid shutdown command, start its shutdown procedures.

&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Taming the terms...&lt;/h3&gt;
Below, I will show how to do this. But before, I will introduce some terms, so that further discussions are easy.
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;TargetApp&lt;/b&gt; - the Java application (possibly a server program) that we want to get detached from the command line and go "daemonised".&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Daemon&lt;/b&gt; - The class that actually goes into daemon mode and listens to shutdown commands. If you are coding the daemon inside your application, this functionality will be inside one of your classes in the TargetApp.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Launcher&lt;/b&gt; - This program will kick off the Daemon as a process detached from the command line. Also provides interfacing to provide shutdown command to the Daemon.&lt;/li&gt;
&lt;/ol&gt;

&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Reaching out with Code&lt;/h3&gt;
&lt;h4&gt;1. TargetApp&lt;/h4&gt;
Since this can be any Java application that usually works in a loop, I will create a simple application that will keep printing a funny text to a file created in your current working directory.
&lt;pre class="brush: java; gutter: false; collapse: true"&gt;
package org.otw.daemon;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;

public class FunnyTargetApp {

   private boolean shouldRun = false;
   /**
    * @param args
    */
   public static void main(String[] args) {
       FunnyTargetApp app = new FunnyTargetApp();
       app.start();
   }

   /**
    * Starts the application.
    */
   public void start() {
       shouldRun = true;
       Thread workerThread = createWorkerThread();
       Thread commandTracker = createCommandTrackerThread();
       commandTracker.start();
       workerThread.start();
       try {
           workerThread.join();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
   }

   /**
    * Stops the application, in a clean way.
    */
   public void stop() {
       System.out.println("Stopping...");
       shouldRun = false;
   }

   /**
    * Creates a thread that mimics a continuous job as that of a server.
    * @return
    */
   private Thread createWorkerThread() {
       return new Thread(
               new Runnable () {
                   public void run() {
                       File file = null;
                       FileWriter wri = null;
                       try {
                           file = new File("test.out");
                           System.out.println("Started with file at ["
                                   + file.getAbsolutePath() + "].");
                           file.createNewFile();
                           wri = new FileWriter(file);
                           while(shouldRun) {
                               wri.write("Funny Text &gt;&gt; "+ new Date());
                               wri.write("\n");
                               wri.flush();
                               Thread.sleep(1000);
                           }
                       } catch(Exception e) {
                           e.printStackTrace();
                       } finally {
                           if (file !=null &amp;amp;&amp;amp; wri!=null) {
                               try {
                                   wri.flush();
                                   wri.close();
                               } catch (Exception e) {
                                   e.printStackTrace();
                               }
                           }
                       }
                   }
                  
               }, "Worker Thread"
       );
   }

   /**
    * Creates a thread that will keep track of the commands issued on the command line.
    * @return
    */
   private Thread createCommandTrackerThread() {
       return new Thread(
               new Runnable () {
                       public void run() {
                           System.out.println("Listening to commands from terminal.");
                           while(true) {
                               InputStreamReader isr = new InputStreamReader(System.in);
                               BufferedReader reader =  new BufferedReader(isr);
                               String command = null;
                               try {
                                   command = reader.readLine();
                               } catch (IOException e) {
                                   e.printStackTrace();
                                   break;
                               }
                               if (command.equalsIgnoreCase("stop")) {
                                   stop();
                                   break;
                               } else {
                                   System.out.println("invalid command.");
                               }
                           }
                       }
               }, "Command Tracker"
       );
   }
}
&lt;/pre&gt;



&lt;br/&gt;&lt;br/&gt;
&lt;h4&gt;2. Daemon&lt;/h4&gt;
This is the class that actually gets detached from the terminal and becomes a daemon, while keeping a reference of the TargetApp. So basically it has to deal with 3 functionality:
&lt;h5&gt;a. Launch the TargetApp and keep its reference.&lt;/h5&gt;
The TargetApp can be launched as a thread or as a process. The preferred way should be as a thread. For launching as a process, the TargetApp should have a either a start method or a regular main method. For launching TargetApp as a thread, invoke methods needed to start the TargetApp, if no such specific method is there, just invoke the main method.
&lt;pre class="brush:java"&gt;
//Starting as a Thread (reflecting on the main method)
Class payload = getPayloadStartClass(); // determine the payload class via configurations
Object payloadInstance = payload.newInstance();
Class[] paramTypes = new Class[1];
paramTypes[0] = arguments.getClass();
Object[] param = new Object[1];
param[0] = getPayloadArguments();
Method method = payload.getMethod("main", paramTypes);
method.invoke(payloadInstance, param);
&lt;/pre&gt;

&lt;br/&gt;&lt;br/&gt;

Note: This snippet uses reflection. You may use an interface to make things better, using a startup method.

&lt;pre class="brush:java"&gt;
// Starting as a Process
Class payload = getPayloadStartClass(); // determine the payload class via configurations
String javaOptions = //get it via configurations
String payloadArg = //get it via configurations
String command = "java " + javaOptions + " "
 + payload.getCanonicalName() + " "
 + payloadArg;
log.debug("Starting command line: " + command);
Runtime.getRuntime().exec(command, null);
&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;h5&gt;b. Starts up a shutdown port and waits for a shutdown command to be issued.&lt;/h5&gt;
&lt;pre class="brush:java"&gt;
ServerSocket serverSocket = ServerSocket(getShutdownPort());
Socket socket = serverSocket.accept();
boolean isLocalConnect = false;
InputStream stream = null;
PrintWriter out = null;
try {
   isLocalConnect = socket.getInetAddress().isLoopbackAddress();
   socket.setSoTimeout(getNetworkTimeout());
   stream = socket.getInputStream();
   out = new PrintWriter(socket.getOutputStream(), true);
} catch (AccessControlException ace) {
   log.warn("StandardServer.accept security exception: "
                      + ace.getMessage(), ace);
   return;
} catch (IOException e) {
   log.error("StandardServer.await: accept: ", e);
   return;
}
&lt;/pre&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;h5&gt;c. Stop the TargetApp and then itself for a clean shutdown on receiving valid shutdown command on the shutdown port.&lt;/h5&gt;
&lt;pre class="brush:java"&gt;
String command = readStream(stream); // reads command from the input stream
boolean match = command.toString().equals(shutdown);
if (match) {
   log.debug("Shutdown command recieved via Telnet.");
   shutdown(); // calling the shutdown procedures
   return;
} else {
   log.warn("Invalid command.");
}
&lt;/pre&gt;

&lt;br/&gt;&lt;br/&gt;
You can telnet to the port and provide shutdown command. The Launcher's stop routine also does the same thing (the code will follow soon).

&lt;br/&gt;&lt;br/&gt;

Remember to register shutdown hooks on the application startup, and remove it explicitly, if the shutdown was not initiated by the shutdown hook. Shutdown hook is a Thread that is not started, and registered with the JVM. When the JVM goes down, this thread will be started. So we can write some cleanup code in this thread. Remember to return from the run of the shutdown hook quickly.
&lt;br/&gt;&lt;br/&gt;

&lt;h4&gt;3. Launcher&lt;/h4&gt;
This class will provide us hooks to start up the Daemon, and stop it based on arguments (from the command line). To launch the Daemon as a Java process and detach it from the command line, we will use the Runtime.exec(). This will be similar to the process mode launching of TargetApp.
&lt;pre class="brush:java"&gt;
String strCmd = "java " + "-classpath " + classpath + javaOptions
   + " org.ops4j.laboratory.users.open4thomas.jdaemon.Carrier";
log.debug("Starting command line: " + strCmd);

Process proc = Runtime.getRuntime().exec(strCmd, builder.getArguments());
Thread hook =  createShutdownHook(proc);// create shutdown hook thread
Runtime.getRuntime().addShutdownHook(hook);
&lt;/pre&gt;

&lt;br/&gt;&lt;br/&gt;

To stop the running Daemon cleanly, the class will set up a socket connection to the Daemon's shutdown port, and supply a shutdown command. This will trigger a shutdown procedure in Daemon, which in turn can trigger shutdown on the TargetApp.
&lt;pre class="brush:java"&gt;
Socket socket = null;
PrintWriter out = null;
try {
   socket = new Socket("localhost", getShutdownPort());
   out = new PrintWriter(socket.getOutputStream(), true);
} catch (UnknownHostException e) {
   log.error("Unknown address: localhost.");
  return;
} catch (IOException e) {
   log.error("Couldn't connect to: localhost.");
   return;
}

out.write("shutdown\n");
out.flush();
&lt;/pre&gt;

&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Getting around with security holes.&lt;/h3&gt;
There is one important security hole in this approach. When the Daemon is listening on the shutdown port for shutdown command, it is possible for a hacker to compromise on this feature. 
&lt;br/&gt;
This can be eliminated with few approaches:
&lt;h4&gt;1. Provide password protection&lt;/h4&gt;
The application could ask for a password that could be stored in encrypted format, and before accepting shutdown command, the user will be needed to provide a password.
&lt;h4&gt;2. Preventing DoS attack&lt;/h4&gt;
A malicious user can connect to the shutdown port, and provide junk command continuously effectively doing a DoS attack. This can be dealt by accepting limited amount of failed password, or wrong command attempts. Limit the length of command/password.

&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;More improvements&lt;/h3&gt;
In the Launcher's stop, after issuing shutdown command to the Daemon, we could check for the existence of a PID file to know if the application is still running. The PID file can be created by the Daemon with "deleteOnExit" flag.

&lt;br/&gt;&lt;br/&gt;

Another improvement area is to provide an interface that the TargetApp should implement, so that it will be easy to call startup and shutdown routines on the TargetApp.

&lt;br/&gt;&lt;br/&gt;

There could be more, but not right now in my mind.

&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Want more code?&lt;/h3&gt;
Sure, the code snippet I provided here is just to explain the core concept. There are other things required to get it working. I worked out quickly on this, and the code is available in my lab at OPS4J &lt;a href="https://scm.ops4j.org/repos/ops4j/laboratory/users/open4thomas/jdaemon/jdaemon-main"&gt;here&lt;/a&gt;. Please note that I may change the code over time. I am writing this article as of revision #14752.
&lt;br/&gt;&lt;br/&gt;
This is a regular SVN repository. So you can get the source code with
&lt;br/&gt;
&lt;pre class="brush:plain; gutter: false;"&gt;
svn co https://scm.ops4j.org/repos/ops4j/laboratory/users/open4thomas/jdaemon/jdaemon-main
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-2335698434042862624?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9IAqmFnaz349k0baebnl1oEcAHw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9IAqmFnaz349k0baebnl1oEcAHw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9IAqmFnaz349k0baebnl1oEcAHw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9IAqmFnaz349k0baebnl1oEcAHw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=hy6OWNP8SlY:9SJIa9-OOCA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=hy6OWNP8SlY:9SJIa9-OOCA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=hy6OWNP8SlY:9SJIa9-OOCA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=hy6OWNP8SlY:9SJIa9-OOCA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=hy6OWNP8SlY:9SJIa9-OOCA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=hy6OWNP8SlY:9SJIa9-OOCA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=hy6OWNP8SlY:9SJIa9-OOCA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=hy6OWNP8SlY:9SJIa9-OOCA:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=hy6OWNP8SlY:9SJIa9-OOCA:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/hy6OWNP8SlY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/hy6OWNP8SlY/cross-platform-java-daemon.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>2</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2009/04/cross-platform-java-daemon.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-9199165262501798569</guid><pubDate>Wed, 08 Apr 2009 10:21:00 +0000</pubDate><atom:updated>2009-05-08T19:36:45.044+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">web 2.0</category><category domain="http://www.blogger.com/atom/ns#">News</category><title>Exciting future for the web</title><description>The future of web applications seem to be exiting for every web user. With the drafting and evolution of &lt;a title="HTML 5" href="http://en.wikipedia.org/wiki/HTML_5" id="g023"&gt;HTML 5&lt;/a&gt; , and browsers like Firefox coming up with plans on &lt;a title="Prism" href="http://labs.mozilla.com/projects/prism/" id="vm4t"&gt;Prism&lt;/a&gt;  and &lt;a title="Weave" href="http://labs.mozilla.com/projects/weave/" id="d4hw"&gt;Weave&lt;/a&gt; , its plugins, and evolving nature of supporting applications such as Google Sync (&lt;a title="mobile" href="http://www.google.com/mobile/default/sync.html" id="d1_6"&gt;mobile&lt;/a&gt;  and &lt;a title="browser" href="http://www.google.com/tools/firefox/browsersync/" id="n:t4"&gt;browser&lt;/a&gt; ) and &lt;a title="Google Gears" href="http://gears.google.com/" id="xt2m"&gt;Google Gears&lt;/a&gt; , the experience of a web user seems to be in a good light.

Some of the fantastic experiences would be:
&lt;ul&gt;&lt;li&gt;Inherent support for offline browsing and using web applications by browsers.&lt;/li&gt;&lt;li&gt;Inherent support for rich web UI.&lt;/li&gt;&lt;li&gt;Enhanced experiences with audio and video on web browsers.&lt;/li&gt;&lt;li&gt;Seamless and centralized browser profiles. Browser will seamlessly synchronize your profile including bookmarks, browsing history, saved passwords and tabs across multiple browsers, so that your desktop, laptop, and mobile phone can all work together.&lt;/li&gt;&lt;/ul&gt;
Many of them are already available for a beta preview. These seem to not only enhance the experience of a web user, but also developers like me will find an interesting turn in developing web applications.&lt;div class="blogger-post-footer"&gt;- Thomas Joseph
Geek, Experienced Enterprise Java Developer, Agile Practitioner &amp; Linux Junkie
... and a Human with lots of humor and emotions.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-9199165262501798569?l=blog.ethomasjoseph.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DP3SQpn2D-L-v3gqX2oLvMpupHc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DP3SQpn2D-L-v3gqX2oLvMpupHc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DP3SQpn2D-L-v3gqX2oLvMpupHc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DP3SQpn2D-L-v3gqX2oLvMpupHc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=raySHHMul1Q:xWZGwAUET7o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=raySHHMul1Q:xWZGwAUET7o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=raySHHMul1Q:xWZGwAUET7o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=raySHHMul1Q:xWZGwAUET7o:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=raySHHMul1Q:xWZGwAUET7o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=raySHHMul1Q:xWZGwAUET7o:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=raySHHMul1Q:xWZGwAUET7o:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=raySHHMul1Q:xWZGwAUET7o:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=raySHHMul1Q:xWZGwAUET7o:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openthoughtworks/~4/raySHHMul1Q" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/raySHHMul1Q/exciting-future-for-web.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><feedburner:origLink>http://blog.ethomasjoseph.com/2009/04/exciting-future-for-web.html</feedburner:origLink></item><language>en-us</language><copyright>Verbatim copying and distribution of this entire article is permitted in any medium without royalty, provided this notice is preserved and appropriate credit is given to the author(s) and/or this site.</copyright><media:credit role="author">Thomas Joseph</media:credit><media:rating>nonadult</media:rating></channel></rss>

