<?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: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, 18 Mar 2010 09:33:34 +0000</lastBuildDate><title>OpenThoughtWorks blog</title><description>Open Thoughts and Ideas on FOSS, softwares, technology, methodologies, corporates and free thoughts</description><link>http://blog.openthoughtworks.com/</link><managingEditor>noreply@blogger.com (Thomas Joseph)</managingEditor><generator>Blogger</generator><openSearch:totalResults>32</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-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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-868171178902531946?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=q7PQ1mYPUbA: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=q7PQ1mYPUbA:AFN645meVYE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=q7PQ1mYPUbA:AFN645meVYE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=q7PQ1mYPUbA: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=q7PQ1mYPUbA:AFN645meVYE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=q7PQ1mYPUbA:AFN645meVYE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=q7PQ1mYPUbA: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=q7PQ1mYPUbA: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=q7PQ1mYPUbA: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/q7PQ1mYPUbA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/q7PQ1mYPUbA/tech-and-some.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-3287682949989134929?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=cAEH_r14-Wo: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=cAEH_r14-Wo:NN5xuQ74CTg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=cAEH_r14-Wo:NN5xuQ74CTg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=cAEH_r14-Wo: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=cAEH_r14-Wo:NN5xuQ74CTg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=cAEH_r14-Wo:NN5xuQ74CTg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=cAEH_r14-Wo: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=cAEH_r14-Wo: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=cAEH_r14-Wo: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/cAEH_r14-Wo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/cAEH_r14-Wo/tribute-to-my-ex-colleagues.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.openthoughtworks.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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-8642808445224492490?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=Vlg755Zhmkg: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=Vlg755Zhmkg:Hr9LsxqlK6A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=Vlg755Zhmkg:Hr9LsxqlK6A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=Vlg755Zhmkg: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=Vlg755Zhmkg:Hr9LsxqlK6A:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=Vlg755Zhmkg:Hr9LsxqlK6A:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=Vlg755Zhmkg: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=Vlg755Zhmkg: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=Vlg755Zhmkg: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/Vlg755Zhmkg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/Vlg755Zhmkg/qcon-london-2010-slides.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.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-01-07T11:54:59.191+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, InfoQ, 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 did 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;
This was a great news, because this was applicable even to InfoQ videos. 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/infoq.flv -y -v 0 -acodec wmav1 -b 1000kbps -f asf -vcodec wmv1 /home/thomas/Desktop/infoq.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/infoq.flv -y -v 0 -f asf -vcodec mpeg4 /home/thomas/Desktop/infoq.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;
I could notice that actually DownloadHelper can download InfoQ videos, but just 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.

Also, getting the Slides on InfoQ is also easy. If you are a good developer, just see the source code of the page, and you will understand. Right now I see those videos and slides at my ease stored on my hard disk.&lt;div class="blogger-post-footer"&gt;- Thomas Joseph&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-3483692851486571088?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=4NM5LsLL1IA: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=4NM5LsLL1IA:rbutYpv_NVA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=4NM5LsLL1IA:rbutYpv_NVA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=4NM5LsLL1IA: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=4NM5LsLL1IA:rbutYpv_NVA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=4NM5LsLL1IA:rbutYpv_NVA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=4NM5LsLL1IA: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=4NM5LsLL1IA: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=4NM5LsLL1IA: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/4NM5LsLL1IA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/4NM5LsLL1IA/saving-streaming-video-presentation.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-8174019623107931526?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=LzjtjrjDACI: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=LzjtjrjDACI:LTrPUjx2LL4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=LzjtjrjDACI:LTrPUjx2LL4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=LzjtjrjDACI: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=LzjtjrjDACI:LTrPUjx2LL4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=LzjtjrjDACI:LTrPUjx2LL4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=LzjtjrjDACI: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=LzjtjrjDACI: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=LzjtjrjDACI: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/LzjtjrjDACI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/LzjtjrjDACI/configuring-log4j-with-xml-in-osgi.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.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>2009-11-18T11:43:56.344+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="https://sites.google.com/a/openthoughtworks.com/static/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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-8543380609892044944?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=a44WMbvJ6Nc: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=a44WMbvJ6Nc:RKVl7t6Gvw4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=a44WMbvJ6Nc:RKVl7t6Gvw4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=a44WMbvJ6Nc: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=a44WMbvJ6Nc:RKVl7t6Gvw4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=a44WMbvJ6Nc:RKVl7t6Gvw4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=a44WMbvJ6Nc: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=a44WMbvJ6Nc: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=a44WMbvJ6Nc: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/a44WMbvJ6Nc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/a44WMbvJ6Nc/microsoft-aspnet-mvc-why-java-web.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.openthoughtworks.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>2009-10-29T18:53:16.516+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="https://sites.google.com/a/openthoughtworks.com/static/images/persistence-interfacing-small.png" alt="" 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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-6519400021180807413?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=1YOHswZf6io: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=1YOHswZf6io:nHateL-L-10:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=1YOHswZf6io:nHateL-L-10:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=1YOHswZf6io: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=1YOHswZf6io:nHateL-L-10:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=1YOHswZf6io:nHateL-L-10:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=1YOHswZf6io: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=1YOHswZf6io: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=1YOHswZf6io: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/1YOHswZf6io" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/1YOHswZf6io/evolving-persistence-sql-and-orms-to.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-2499963872033676867?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=nHMm-hnV1yQ: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=nHMm-hnV1yQ:Hpj7niFgbFg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=nHMm-hnV1yQ:Hpj7niFgbFg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=nHMm-hnV1yQ: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=nHMm-hnV1yQ:Hpj7niFgbFg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=nHMm-hnV1yQ:Hpj7niFgbFg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=nHMm-hnV1yQ: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=nHMm-hnV1yQ: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=nHMm-hnV1yQ: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/nHMm-hnV1yQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/nHMm-hnV1yQ/my-state-of-affairs-part-2-looking-for.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><enclosure url="https://sites.google.com/a/openthoughtworks.com/static/pdf/Thomas_Resume.pdf" length="81999" type="application/pdf" /><media:content url="https://sites.google.com/a/openthoughtworks.com/static/pdf/Thomas_Resume.pdf" fileSize="81999" type="application/pdf" /><feedburner:origLink>http://blog.openthoughtworks.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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-756085057554094331?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=nykcjwSB0UY: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=nykcjwSB0UY:ZT70bomdqZo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=nykcjwSB0UY:ZT70bomdqZo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=nykcjwSB0UY: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=nykcjwSB0UY:ZT70bomdqZo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=nykcjwSB0UY:ZT70bomdqZo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=nykcjwSB0UY: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=nykcjwSB0UY: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=nykcjwSB0UY: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/nykcjwSB0UY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/nykcjwSB0UY/my-state-of-affairs-part-1.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-6527373349237662523?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=dd3SK279uF0: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=dd3SK279uF0:lOUXu1wvErA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=dd3SK279uF0:lOUXu1wvErA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=dd3SK279uF0: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=dd3SK279uF0:lOUXu1wvErA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=dd3SK279uF0:lOUXu1wvErA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=dd3SK279uF0: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=dd3SK279uF0: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=dd3SK279uF0: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/dd3SK279uF0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/dd3SK279uF0/javaone-2009-slides-are-now-out.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.openthoughtworks.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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-790897730020943607?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=JP2psneDays: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=JP2psneDays:JYD7tMjiIuM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=JP2psneDays:JYD7tMjiIuM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=JP2psneDays: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=JP2psneDays:JYD7tMjiIuM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=JP2psneDays:JYD7tMjiIuM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=JP2psneDays: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=JP2psneDays: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=JP2psneDays: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/JP2psneDays" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/JP2psneDays/osgi-devcon-09-component-oriented.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">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="121655" 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="121655" type="application/x-shockwave-flash" /><feedburner:origLink>http://blog.openthoughtworks.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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-2294904130477514624?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=z_05sVLX2iw: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=z_05sVLX2iw:h7La-AaQ9B8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=z_05sVLX2iw:h7La-AaQ9B8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=z_05sVLX2iw: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=z_05sVLX2iw:h7La-AaQ9B8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=z_05sVLX2iw:h7La-AaQ9B8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=z_05sVLX2iw: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=z_05sVLX2iw: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=z_05sVLX2iw: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/z_05sVLX2iw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/z_05sVLX2iw/osgi-devcon-2009-review.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">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="121655" 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="121655" type="application/x-shockwave-flash" /><feedburner:origLink>http://blog.openthoughtworks.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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-4103912389347718037?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=jGAEF7yqlIM: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=jGAEF7yqlIM:fUQqb9Ifwns:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=jGAEF7yqlIM:fUQqb9Ifwns:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=jGAEF7yqlIM: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=jGAEF7yqlIM:fUQqb9Ifwns:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=jGAEF7yqlIM:fUQqb9Ifwns:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=jGAEF7yqlIM: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=jGAEF7yqlIM: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=jGAEF7yqlIM: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/jGAEF7yqlIM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/jGAEF7yqlIM/book-review-maven-definitive-guide.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-876875298872454031?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=Dca-NA4igaA: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=Dca-NA4igaA:q0Oz7u5-_Jc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=Dca-NA4igaA:q0Oz7u5-_Jc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=Dca-NA4igaA: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=Dca-NA4igaA:q0Oz7u5-_Jc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=Dca-NA4igaA:q0Oz7u5-_Jc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=Dca-NA4igaA: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=Dca-NA4igaA: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=Dca-NA4igaA: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/Dca-NA4igaA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/Dca-NA4igaA/flex-clients-for-osgi-apps.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.openthoughtworks.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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-662493329566238591?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=lCb5Yk26ED4: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=lCb5Yk26ED4:rz2oLHhYY2s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=lCb5Yk26ED4:rz2oLHhYY2s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=lCb5Yk26ED4: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=lCb5Yk26ED4:rz2oLHhYY2s:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=lCb5Yk26ED4:rz2oLHhYY2s:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=lCb5Yk26ED4: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=lCb5Yk26ED4: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=lCb5Yk26ED4: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/lCb5Yk26ED4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/lCb5Yk26ED4/guice-getting-into-java-se.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-4442704112452239477?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=3hCw92bDT5k: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=3hCw92bDT5k:SVR06LWlX7M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=3hCw92bDT5k:SVR06LWlX7M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=3hCw92bDT5k: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=3hCw92bDT5k:SVR06LWlX7M:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=3hCw92bDT5k:SVR06LWlX7M:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=3hCw92bDT5k: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=3hCw92bDT5k: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=3hCw92bDT5k: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/3hCw92bDT5k" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/3hCw92bDT5k/submiting-form-to-new-window.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-2335698434042862624?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=vGUNOnKLMxo: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=vGUNOnKLMxo:9SJIa9-OOCA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=vGUNOnKLMxo:9SJIa9-OOCA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=vGUNOnKLMxo: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=vGUNOnKLMxo:9SJIa9-OOCA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=vGUNOnKLMxo:9SJIa9-OOCA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=vGUNOnKLMxo: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=vGUNOnKLMxo: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=vGUNOnKLMxo: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/vGUNOnKLMxo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/vGUNOnKLMxo/cross-platform-java-daemon.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://blog.openthoughtworks.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&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-9199165262501798569?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=xqkmJxpQ-8c: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=xqkmJxpQ-8c:xWZGwAUET7o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=xqkmJxpQ-8c:xWZGwAUET7o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=xqkmJxpQ-8c: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=xqkmJxpQ-8c:xWZGwAUET7o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=xqkmJxpQ-8c:xWZGwAUET7o:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=xqkmJxpQ-8c: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=xqkmJxpQ-8c: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=xqkmJxpQ-8c: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/xqkmJxpQ-8c" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/xqkmJxpQ-8c/exciting-future-for-web.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.com/2009/04/exciting-future-for-web.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-5855154069562828635</guid><pubDate>Mon, 06 Apr 2009 07:08:00 +0000</pubDate><atom:updated>2009-04-16T20:17:50.687+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Open Source</category><category domain="http://www.blogger.com/atom/ns#">Free Software</category><category domain="http://www.blogger.com/atom/ns#">Corporate</category><category domain="http://www.blogger.com/atom/ns#">Enterprise</category><title>Beating the Recession with Free Software</title><description>Few weeks back, one of my friends working with a big enterprise asked for my help in getting his personal PC to the right health. He would use computers only for browsing, spreadsheets, preparing presentations, and for word processing. His PC had Windows installed all infested with viruses, that was making his daily working trouble. He told that he had installed a free Antivirus , but still was having such problems. Even in the past that he had to get his PC with a fresh installation of Windows, and now it was barely a month after that.
&lt;br/&gt;&lt;br/&gt;
I was more than happy to introduce him to Linux. But he was not readily accepting the call since he had only used Windows, and had not even had a glance of Linux. But because I told him that Linux won't catch a virus, he was ready to go for a dual boot. Just then I took out my Laptop and showed him my Ubuntu installation, and asked him to use it for a while. After sometime he was comfortable to use all of its features that he wanted - the Firefox and the Open-Office met all his needs. To make him further convinced, showed him my installation of Sun's Virtual-Box, in which I had a Windows XP image running. He was so happy at this that he asked me to teach him on how to get on to Linux from the boot.
&lt;br/&gt;&lt;br/&gt;
The next question he asked me was - "Why are we using Windows  XP in office? We have to spend a good amount for its licensing every year. Added to that, we also have to spend on purchasing Antivirus and its licensing, while we can actually do it all with Linux."
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Spending on the Stack?&lt;/h3&gt;The question is not only on spending on one or two paid and closed software, but rather the stack of such software that is often built up. Let us not think about geeks who are able to modify the FOSS software such as the Linux to their use, but even from the perspective of end users like my friend, who use computers only to get their daily tasks done. For them, getting a functionality on their system means searching on the net for a software, finding the cheapest of all (many a times a shareware, and if they are not lucky - a malware), and installing them with a questionable security of your personal data. By just considering the Operating System, Antivirus software and Internet  Security solutions now seem as an inevitable part of paid and closed software stack. Does anyone know, what is inside a closed software?
&lt;br/&gt;&lt;br/&gt;
Compare this with a Free OS such as Linux. First, you are legally free to copy and redistribute the software. And the software comes for free "as in free beer" most of the time. Even if you spend, compare this to the cost you spend on the closed source OS.
&lt;br/&gt;&lt;br/&gt;
This is true not just for simple end users, but also advanced users of computers. Those software companies who are providing solutions with FOSS stack, can provide their customers with reasonably cheaper solutions (stability - I am avoiding here, because it depends on the solution provider).
&lt;br/&gt;&lt;br/&gt;
&lt;h3&gt;Leveraging business with FOSS&lt;/h3&gt;Even if considering this on an enterprise scale, I am sure there should be enough testimonials to say how much one should have saved when using a Free Software stack. In either case you need a support staff to manage all the software and its maintenance, so then why not spend on a software that are know to contain comparatively lesser security holes, and fewer headaches on licensing, and of course saving on the expenses.
&lt;br/&gt;&lt;br/&gt;
One thing however, is that it becomes necessary to choose a stack wisely that can reduce your overall costs. You have to weigh a lot of factors, but definitely, in your considerations, give a good space to the FOSS stack. I am sure every business can workout a good solution to beat such recessions with an optimal strategy with FOSS stack.
&lt;br/&gt;&lt;br/&gt;
Some questions can come up in your mind when reading through this. I have left those for you to think. I can't cover every aspect of this discussion in a blog post like this. But feel free to post your comment on here.&lt;div class="blogger-post-footer"&gt;- Thomas Joseph&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-5855154069562828635?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=S3vrOtg59IM:vNtpaFiVNeU: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=S3vrOtg59IM:vNtpaFiVNeU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=S3vrOtg59IM:vNtpaFiVNeU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=S3vrOtg59IM:vNtpaFiVNeU: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=S3vrOtg59IM:vNtpaFiVNeU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=S3vrOtg59IM:vNtpaFiVNeU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=S3vrOtg59IM:vNtpaFiVNeU: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=S3vrOtg59IM:vNtpaFiVNeU: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=S3vrOtg59IM:vNtpaFiVNeU: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/S3vrOtg59IM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/S3vrOtg59IM/beating-recession-with-free-software.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.com/2009/04/beating-recession-with-free-software.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-722206362863919445</guid><pubDate>Tue, 31 Mar 2009 09:59:00 +0000</pubDate><atom:updated>2009-04-16T20:17:02.171+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">DDD</category><category domain="http://www.blogger.com/atom/ns#">Enterprise</category><title>Domain Driven Design in 10 minutes</title><description>I had prepared some notes, when I was reading through the DDD book from InfoQ - "&lt;a title="Domain Driven Design Quickly" href="http://www.infoq.com/minibooks/domain-driven-design-quickly" id="me1s"&gt;Domain Driven Design Quickly&lt;/a&gt; " which is just summarizes the essence of what DDD is, drawing mostly &lt;a href="http://www.amazon.com/exec/obidos/ASIN/0321125215/domainlanguag-20"&gt;Eric Evans' book.&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
I thought, this note might be helpful to somebody who want to get the idea very quickly. This is not a complete description of what DDD is. Infact DDD is a very big topic that mostly comes into your grasp as you start practicing it. That is why probably books were written (and are written even now!) on it.
&lt;br/&gt;&lt;br/&gt;
So here it goes...
&lt;br/&gt;&lt;br/&gt;
&lt;h2&gt;1, 2, 3...&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;DDD introduces nothing new, DDD is all about bringing Object Oriented paradigms to the Enterprise development&lt;/li&gt;&lt;li&gt;Focus on business domain instead of technology hype&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;What is DDD
 &lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Software exist to solve real world problems - automate processes. Software is deeply entangled to the domain it is built for.&lt;/li&gt;&lt;li&gt;To create a good software, one must deeply understand the domain for which the software is built.&lt;/li&gt;&lt;li&gt;The knowledge of the domain is known to the people inside it - the domain experts. The software should always start from this domain knowledge.&lt;/li&gt;&lt;li&gt;Software should be a reflection of the domain.&lt;/li&gt;&lt;li&gt;One even without a knowledge in the domain should be able to learn about it, by just reading the code.&lt;/li&gt;&lt;li&gt;Software that does not reflect the domain cannot react well to the changes over time.&lt;/li&gt;&lt;/ul&gt;               &lt;h3&gt;Building Domain Knowledge&lt;/h3&gt;&lt;ul&gt;    &lt;li&gt;Software development process starts with understanding the domain. This starts with discussions between Software Designers/Developers and the Domain Experts.
 &lt;/li&gt;&lt;li&gt;Knowledge about the domain from the domain experts may be disorganized and unpolished. Their organization of knowledge is very specific for their usage and not always suited to building a software system. We should extract the right information from them by asking the right questions towards transforming it to a useful form - the domain model.
 &lt;/li&gt;&lt;li&gt;Early prototyping may be required for clarifying on the understanding between the two. However, the domain model is the place where the expertise of the two meet.
 &lt;/li&gt;&lt;li&gt;Sometimes the discussions brings out some of the unearthed concepts from the domain to picture.
 &lt;/li&gt;&lt;li&gt;There may be too many rounds of two and fro between domain expert, designer, and the developer.
 &lt;/li&gt;&lt;li&gt;The process may seem to be time consuming - it is, and it should because, at the end, the software's purpose is to solve business problems in a real life domain.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Building the Domain Model&lt;/h3&gt;&lt;ul&gt;    &lt;li&gt;Software process starts with Software Design - by talking to the domain experts.
 &lt;/li&gt;&lt;li&gt;Knowledge from the domain experts is organized, systematized, divided into logical modules and abstracted as the Domain Model.
 &lt;/li&gt;&lt;li&gt;Domain Model is very necessary throughout the design and development process as we will make lot of references to it later. We will need it to communicate with domain-experts, fellow designers, and developers.
 &lt;/li&gt;&lt;li&gt;Domain model is an essential part of Software Design. Domain model is the domain knowledge abstracted for the software. All the thinking about the domain is synthesized into this model.
 &lt;/li&gt;&lt;li&gt;Domain model can be expressed as a diagram (UML, DFD, FreeMind etc), in writing or a mix of both.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Software Designing&lt;/h3&gt;&lt;ul&gt;    &lt;li&gt;As a part of Software Design we have the Domain model expressed. Now we can start doing the Code Design.
 &lt;/li&gt;&lt;li&gt;Code design is different from Software Design. Software Design is like creating the architecture of a house, while Code Design is working on its details - deciding the location of a painting.
 &lt;/li&gt;&lt;li&gt;A code design mistake is usually more easily corrected, while software design errors are a lot more costly to repair. Its easy moving the paining from one wall to the other, but a different thing to tear down one side of the house.
 &lt;/li&gt;&lt;li&gt;Code design is where the design patterns comes to play. Good coding help create clean , maintainable code.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;The Ubiquitous Language - The need for a common vocabulary.&lt;/h2&gt;&lt;ul&gt;    &lt;li&gt;The Software process begins with building a domain model that happens by communication between the Domain expert and the Software Designer/Developer. Better Software needs better communication, that needs a common vocabulary between the parties - expert, designer and the developer.
 &lt;/li&gt;&lt;li&gt;The project faces serious problem for lack of a common vocabulary to discuss the domain. There will be serious communication gap.
 &lt;/li&gt;&lt;li&gt;Developers talk about classes, methods, algorithms, design patterns, databases, about which the domain expert hardly knows anything. But since we are solving the problems at the domain with the software, we should use the vocabulary that domain expert will understand, and normally uses.
 &lt;/li&gt;&lt;li&gt;Domain experts on the other hand use their own jargon that is not easy to understand for designers and developers. We bridge this gap of common vocabulary by creating the domain model, where all involved in the team arrive at a common vocabulary mainly driven from the actual domain. This is where the software meets the domain.
 &lt;/li&gt;&lt;li&gt;The vocabulary developed with the domain model must be used consistently in all communications without any ambiguity.
 &lt;/li&gt;&lt;li&gt;The language should evolve with the consent from both the parties. Domain experts should object to awkward terms, while developers should watch for terms that may cause any problems at their side.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Model Driven Development&lt;/h2&gt;&lt;ul&gt;    &lt;li&gt;Correctly expressing the model does not necessarily mean that the model will be correctly translated to a proper code. A good model producing a bad code model is not good anyway.
 &lt;/li&gt;&lt;li&gt;Any domain can be expressed with many models, and any model can be expressed in various ways in code. For each particular problem there can be more than one solution. It is then important to choose a model which can be easily and accurately put into code. Again, the code should be able to communicate the business domain.
 &lt;/li&gt;&lt;li&gt;The model chosen should allow the code to be accurately mapped to the model. This mapping should not be lost as the code and/or the domain evolves over time.
 &lt;/li&gt;&lt;li&gt;The transition from model to code should not lose any information, and even worse, should not convey the wrong meanings. This happens primarily when the model chosen is modeled without taking the coding aspect.
 &lt;/li&gt;&lt;li&gt;Analyst and domain expert meeting should not be closed room meetings. It would be good and productive to include the developers in the analyst meetings, so that they have a clear and complete view of the domain and the model before they start designing the code. The domain model should be constructed with an eye towards the software and design consideration, while not heavily relying on the code design.
 &lt;/li&gt;&lt;li&gt;Everyone on the team must be aware of the model as well as the code aspect of the system. A refractoring in code should not break away from the model, similarly, a model constructed should be practical to program.
 &lt;/li&gt;&lt;li&gt;Mapping between the model and code should be very simple and obvious. Complex mapping is a warning indicator. Revisit the model and modify it to be implemented more naturally in software, even as you seek to make it reflect deeper insight into the domain. Demand a single model that serves both purposes well, in addition to supporting a fluent Ubiquitous Language.
 &lt;/li&gt;&lt;li&gt;Code and the model are two aspects of the project. A change in one aspect should ripple across the other aspect as well. This should be a conscious decision.
 &lt;/li&gt;&lt;li&gt;Object-oriented programming is suitable for model implementation. They make it possible to create direct mappings between model objects with their relationships, and their programming counterparts.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Building blocks of Model Driven Development&lt;/h3&gt;&lt;h4&gt;Layered Architecture&lt;/h4&gt;&lt;ul&gt;    &lt;li&gt;We should plan for layered architecture to allow different concerns - UI, Application, Domain, Infrastructure&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Entity&lt;/h4&gt;&lt;ul&gt;    &lt;li&gt;When we are interested about, which object it is - eg a bank account&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Value Object&lt;/h4&gt;&lt;ul&gt;    &lt;li&gt;When we are more concerned about the attributes of the object rather than its identity. e.g - the points in a line.
 &lt;/li&gt;&lt;li&gt;It is recommended to select as entities only those objects which conform to the entity definition. And make the rest of the objects Value Objects.
 &lt;/li&gt;&lt;li&gt;Having no identity, Value Objects can be easily created and discarded. Nobody cares about creating an identity, and the garbage collector takes care of the object when is no longer referenced by any other object. This simplifies the design a lot.
 &lt;/li&gt;&lt;li&gt;Value objects should be immutable so that it can be shared. Make copies of it and share it with other objects.
 &lt;/li&gt;&lt;li&gt;Value objects may contain - attributes, other value objects, reference to entities.&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Services&lt;/h4&gt;&lt;ul&gt;    &lt;li&gt;Service encapsulate the behavior of the domain. The behavior does not seem to belong to any of the objects- entity or value objects. Service can group related functionality which serves the Entities and the Value Objects.
 &lt;/li&gt;&lt;li&gt;Such domain behaviors are attached to the Service objects. Such an object does not have an internal state, and its purpose is to simply provide functionality for the domain.
 &lt;/li&gt;&lt;li&gt;Services act as interfaces which provide operations. A Service usually becomes a point of connection for many objects. This is one of the reasons why behavior which naturally belongs to a Service should not be included into domain objects.
 &lt;/li&gt;&lt;li&gt;Services promote loose coupling between domain objects
 &lt;/li&gt;&lt;li&gt;A Service should not replace the operation which normally belongs on domain objects. We should not create a Service for every operation needed. But when such an operation stands out as an important concept in the domain, a Service should be created for it.
 &lt;/li&gt;&lt;li&gt;There are three characteristics of a Service:
      1. The operation performed by the Service refers to a domain concept which does not naturally belong to an Entity or Value Object.
      2. The operation performed refers to other objects in the domain.
      3. The operation is stateless.
 &lt;/li&gt;&lt;li&gt;Services can belong to 1. domain layer, 2. Application layer, 3. Infrastructure. These services should not be confused, and be kept separate:
 &lt;/li&gt;&lt;li&gt;Both application and domain Services are usually built on top of domain Entities and Values providing required functionality directly related to those objects.
 &lt;/li&gt;&lt;li&gt;If the operation performed conceptually belongs to the application layer, then the Service should be placed there. If the operation is about domain objects, and is strictly related to the domain, serving a domain need, then it should belong to the domain layer.
 &lt;/li&gt;&lt;li&gt;The application layer is a thin layer which stands between the user interface, the domain and the infrastructure. (application layer = JSF actions written inside beans ?)
 &lt;/li&gt;&lt;li&gt;Application layer does not talk to the domain object, but rather only to the service object, that in-turn work with domain objects.&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Modules&lt;/h4&gt;&lt;ul&gt;    &lt;li&gt;Modules allow to split application into logically related items, and call them as modules. It reduces complexity and cohesion between modules. Modules should be made up of elements which functionally or logically belong together assuring cohesion.
 &lt;/li&gt;&lt;li&gt;Modules should have well defined interfaces which are accessed by other modules. Instead of calling three objects of a module, it is better to access one interface, because it reduces coupling. Low coupling reduces complexity, and increases maintainability.
 &lt;/li&gt;&lt;li&gt;Give the Modules names that become part of the Ubiquitous Language. Modules and their names should reflect insight into the domain.
 &lt;/li&gt;&lt;li&gt;We have he module concept naturally in place with OSGi's bundles. Every bundle (pair) forms a module for the system.
 &lt;/li&gt;&lt;li&gt;Well defined interfaces to the Core bundles are provided by the OSGi service interfaces that we write.
 &lt;/li&gt;&lt;li&gt;About refractoring modules: It is true that module refractoring may be more expensive than a class refractoring, but when a module design mistake is found, it is better to address it by changing the module then by finding ways around it.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Domain Design Patterns&lt;/h3&gt;Managing the life cycle of a domain object constitutes a challenge in itself, and if it is not done properly, it may have a negative impact on the domain model. Domain design patterns will help us deal with this.&lt;h4&gt;Aggregates&lt;/h4&gt;&lt;ul&gt;    &lt;li&gt;Aggregate is a domain pattern used to define object ownership and boundaries.
 &lt;/li&gt;&lt;li&gt;Aggregates come to play when domain objects are associated with one another, creating a complex net of relationships. Associations can be one-to-one, one-to-many, and many-to-many.
 &lt;/li&gt;&lt;li&gt;Many-to-many, bi-directional associations increases complexity. Reducing the complexity is very important. Tips:        &lt;ul&gt;          &lt;li&gt;associations which are not essential for the model should be removed. They may exist in the domain, but they are not necessary in our model, so take them out.&lt;/li&gt;          &lt;li&gt;multiplicity can be reduced by adding a constraint. If many objects satisfy a relationship, it is possible that only one will do it if the right constraint is imposed on the relationship&lt;/li&gt;
       &lt;li&gt;many times bidirectional associations can be transformed in unidirectional ones.&lt;/li&gt;        &lt;/ul&gt;    &lt;/li&gt;&lt;li&gt;An Aggregate is a group of associated objects which are considered as one unit with regard to data changes.
 &lt;/li&gt;&lt;li&gt;Each Aggregate has one root. The root is an Entity, and it is the only object accessible from outside. The root can hold references to any of the aggregate objects, and the other objects can hold references to each other, but an outside object can hold references only to the root object. External objects cannot hold direct references to the objects in the aggregate for it to be directly changed, thus enforcing integrity.
 &lt;/li&gt;&lt;li&gt;It is possible for the root to pass transient references of internal objects to external ones, with the condition that the external objects do not hold the reference after the operation is finished. The external objects should not be able to modify the original aggregate objects.        &lt;ul&gt;          &lt;li&gt;One simple way to do that is to pass copies of the Value Objects to external objects.&lt;/li&gt;
       &lt;li&gt;Pass on interface references that does not have object modifiers.&lt;/li&gt;        &lt;/ul&gt;    &lt;/li&gt;&lt;li&gt;If objects of an Aggregate are stored in a database, only the root should be obtainable through queries. The other objects should be obtained through traversal associations.
 &lt;/li&gt;&lt;li&gt;Objects inside an Aggregate should be allowed to hold references to roots of other Aggregates.&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Factories&lt;/h4&gt;&lt;ul&gt;    &lt;li&gt; Factories gain importance when:        &lt;ul&gt;          &lt;li&gt;creation of object is a major operation in itself.
       &lt;/li&gt;&lt;li&gt;Knowledge needed to create an object needs to be encapsulated from the client objects that need them.&lt;/li&gt;        &lt;/ul&gt;
 &lt;/li&gt;&lt;li&gt; Especially useful to create aggregates. When the root of the Aggregate is created, all the objects contained by the Aggregate are created along with it, and all the invariants are enforced.
 &lt;/li&gt;&lt;li&gt; Good to have separate factories for each kind of objects. But related objects should be created in one factory.
 &lt;/li&gt;&lt;li&gt; Object creation process needs to be atomic. Object creation should enforce all its invariants (rules), and should only produce valid objects (its states). If an object cannot be created properly, an exception should be raised, making sure that an invalid value is not returned.
 &lt;/li&gt;&lt;li&gt; Factory: Therefore, shift the responsibility for creating instances of complex objects and Aggregates to a separate object, which may itself have no responsibility in the domain model but is still part of the domain design. Provide an interface that encapsulates all complex assembly and that does not require the client to reference the concrete classes of the objects being instantiated. Create entire Aggregates as a unit, enforcing their invariants.
 &lt;/li&gt;&lt;li&gt; Patterns: e.g,. Abstract Factory, Factory Method
 &lt;/li&gt;&lt;li&gt; Warning!:When creating a Factory, we are forced to violate an object's encapsulation, which must be done carefully. Whenever something changes in the object that has an impact on construction rules or on some of the invariants, we need to make sure the Factory is updated to support the new condition.
 &lt;/li&gt;&lt;li&gt; Types:Entity Factories and Value Object Factories needs to be differentiated.        &lt;ul&gt;
       &lt;li&gt;Values objects are usually immutable, and all the necessary attributes need to be produced at the time of creation. When the object is created, it has to be valid and final. It won't change. Value objects don't need identity.
       &lt;/li&gt;&lt;li&gt;Entities are not immutable. They can be changed later, by setting some of the attributes with their invariants respected. Entities need identity.&lt;/li&gt;        &lt;/ul&gt;
 &lt;/li&gt;&lt;li&gt; Use Constructor instead of factory when:        &lt;ul&gt;
       &lt;li&gt;The construction is not complicated.
       &lt;/li&gt;&lt;li&gt;The creation of an object does not involve the creation of others, and all the attributes needed are passed via the constructor.
       &lt;/li&gt;&lt;li&gt;The client is interested in the implementation, perhaps wants to choose the Strategy used.
       &lt;/li&gt;&lt;li&gt;The class is the type. There is no hierarchy involved, so no need to choose between a list of concrete implementations.&lt;/li&gt;        &lt;/ul&gt;     &lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Repositories&lt;/h4&gt;&lt;ul&gt;    &lt;li&gt; Need:        &lt;ul&gt;          &lt;li&gt;When client objects need references to pre-existing domain objects, it can obtained by accessing the database, where they can be stored. But directly accessing it from the database meas muddling with the infrastructure, and the such access logic scattered throughout the entire domain, compromising the domain model.
                 &lt;/li&gt;&lt;li&gt;If infrastructure is simple to pull out data from the database (Hibernate), domain logic moves into queries and client code, and the Entities and Value Objects become mere data containers. The overall effect is that the domain focus is lost and the design is compromised.&lt;/li&gt;        &lt;/ul&gt;
                     &lt;/li&gt;&lt;li&gt; Repository:        &lt;ul&gt;          &lt;li&gt;Encapsulate all the logic needed to obtain object references.
       &lt;/li&gt;&lt;li&gt;The domain objects won't have to deal with the infrastructure to get the needed references to other objects of the domain. They will just get them from the Repository and the model is regaining its clarity and focus.
       &lt;/li&gt;&lt;li&gt;Encapsulates the persistence mechanism.&lt;/li&gt;        &lt;/ul&gt;
 &lt;/li&gt;&lt;li&gt; Repositories may:        &lt;ul&gt;          &lt;li&gt;Cache domain object references
       &lt;/li&gt;&lt;li&gt;use a strategy to switch between various persistence storage mechanism.
       &lt;/li&gt;&lt;li&gt;on request from client, reconstitute the domain object from - cache, various repositories, or from a factory.&lt;/li&gt;        &lt;/ul&gt;
 &lt;/li&gt;&lt;li&gt; Repository should have a well known interface that will provide access to add, remove and searching objects based on criteria. This will encapsulate actual add, remove, and querying techniques. This will keep the client focused on the model, delegating all object storage and access to the Repositories.
 &lt;/li&gt;&lt;li&gt; An Entity can be easily specified by passing its identity. Other selection criteria can be made up of a set of object attributes.
 &lt;/li&gt;&lt;li&gt; The implementation of a repository can be closely liked to the infrastructure, but that the repository interface will be pure domain model.&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Factory vs Repository&lt;/h4&gt;&lt;ul&gt;
 &lt;li&gt;They are both patterns of the model-driven design, and they both help us to manage the life cycle of domain objects.
 &lt;/li&gt;&lt;li&gt;While the Factory is concerned with the creation of new objects, the Repository takes care of already existing objects.
 &lt;/li&gt;&lt;li&gt;When a new object is to be added to the Repository, it should be created first using the Factory, and then it should be given to the Repository which will store it like in the example below.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Refractoring Towards Deeper Insight&lt;/h2&gt;&lt;h3&gt;Continuous Re-factoring&lt;/h3&gt;&lt;ul&gt;    &lt;li&gt;Re-factoring the code is necessary and should be a continuous process.
     &lt;/li&gt;&lt;li&gt;Re-factoring is the process of redesigning the code to make it better without changing application behavior.
 &lt;/li&gt;&lt;li&gt;Re-factoring is usually done in small, controllable steps, with great care so we don't break functionality or introduce some bugs. Automated tests are of great help to ensure that we haven't broken anything.
 &lt;/li&gt;&lt;li&gt;Apart from code re-factoring for technical reasons, there should be emphasis on re-factoring for domain model.
 &lt;/li&gt;&lt;li&gt;Sometimes there is new insight into the domain, something becomes clearer, or a relationship between two elements is discovered. All that should be included in the design through re-factoring.
 &lt;/li&gt;&lt;li&gt;Usually initial models from specification are shallow model, without much clarity on the domain. But the design should be flexible enough to incorporate changes as more clarity on the domain is obtained.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Bring Key Concepts to Light&lt;/h3&gt;&lt;ul&gt;    &lt;li&gt;When re-factoring, try to bring the implicit concepts as explicit ones.
 &lt;/li&gt;&lt;li&gt;Looking for implicit concepts: The language we are using during modeling and design contains a lot of information about the domain. At the beginning it may not be so much, or some of the information may not be correctly used. Some of the concepts may not be fully understood, or even completely misunderstood. This is all part of learning a new domain. But as we build our Ubiquitous Language, the key concepts make their way into it. That is where we should start looking for implicit concepts.
 &lt;/li&gt;&lt;li&gt;Watch out for hidden concepts and contradictions in the concepts when doing re-factoring.&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Explicit Constraints, Processes, and Specifications&lt;/h4&gt;&lt;ul&gt;    &lt;li&gt;A Constraint is a simple way to express an invariant (business rule). This should be put as an explicit method so that its clearly visible. There is also room for growth adding more logic to the methods if the constraint becomes more complex.
 &lt;/li&gt;&lt;li&gt;Processes are usually expressed in code with procedures. The best way to implement processes is to use a Service. If there are different ways to carry out the process, then we can encapsulate the algorithm in an object and use a Strategy. Make only those process as explicit that are mentioned in the Ubiquitous language.
 &lt;/li&gt;&lt;li&gt;Specification is used to test an object to see if it satisfies a certain criteria. These are again, business rules, that operate against the domain data (from entity or value objects)&lt;/li&gt;&lt;/ul&gt;&lt;h5&gt;Rules&lt;/h5&gt;&lt;ul&gt;    &lt;li&gt;The domain layer contains business rules which are applied to Entities and Value Objects. Those rules are usually incorporated into the objects they apply to.
 &lt;/li&gt;&lt;li&gt;When business rules become complex to be stored into the objects they apply to, the rule should be encapsulated into an object of its own, which becomes the Specification for the object to which it applies, and should be kept in the domain layer.
 &lt;/li&gt;&lt;li&gt;Often a single Specification checks if a simple rule is satisfied, and then a number of such specifications are combined into a composite one expressing the complex rule.    &lt;code&gt;
     &lt;/code&gt;&lt;pre&gt;
         Specification customerEligibleForRefund = new
                         Specification(
               new CustomerPaidHisDebtsInThePast(),
               new CustomerHasNoOutstandingBalances());
         if(customerEligibleForRefund.isSatisfiedBy(customer)
         {
               refundService.issueRefundTo(customer);
         }
  &lt;/pre&gt;  
 &lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Preserving Model Integrity&lt;/h2&gt;&lt;h3&gt;Bounded Context&lt;/h3&gt;&lt;ul&gt;    &lt;li&gt;Splitting the domain into multiple models, each having its own context, and each model having a well defined contract with other models.
 &lt;/li&gt;&lt;li&gt;Good for large teams working on a project. Instead of one stepping on others toe, bring in the models such that independent teams can work on their own model, thereby splitting the team to work independently on the modules.
 &lt;/li&gt;&lt;li&gt;Still, everyone should have the big picture in mind.&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Continuous Integration&lt;/h3&gt;&lt;ul&gt;    &lt;li&gt;Even when a team works in a Bounded Context there is room for error.
 &lt;/li&gt;&lt;li&gt;If one does not understand the relationships between objects, they may modify the code in such a way that comes in contradiction with the original intent. It is easy to make such a mistake when we do not keep 100% focus on the purity of the model.        &lt;ul&gt;          &lt;li&gt;One member of the team might add code which duplicates existing code without knowing it, or they might add duplicate code instead of changing the current code, afraid of breaking existing functionality.&lt;/li&gt;        &lt;/ul&gt;
 &lt;/li&gt;&lt;li&gt;A model is not fully defined from the beginning. It is created, then it evolves continuously based on new insight in the domain and feedback from the development process. That means that new concepts may enter the model, and new elements are added to the code. This is why we need continuous integration.
 &lt;/li&gt;&lt;li&gt;We need a process of integration to make sure that all the new elements which are added fit harmoniously into the rest of the model, and are implemented correctly in code.        &lt;ul&gt;          &lt;li&gt;The sooner we merge the code the better. For a single small team, daily merges are recommended.
       &lt;/li&gt;&lt;li&gt;We also need to have a build process in place. The merged code needs to be automatically built so it can be tested.
       &lt;/li&gt;&lt;li&gt;Another necessary requirement is to perform automated tests. If the team has a test tool, and has created a test suite, the test can be run upon each build, and any errors are signaled. The code can be easily changed to fix the reported errors, because they are caught early, and the merge, build, and test process is started again.&lt;/li&gt;        &lt;/ul&gt;
 &lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Anti Corruption Layer&lt;/h2&gt;&lt;ul&gt;    &lt;li&gt;A layer between two separate but related systems.  The two systems depend on each other closely. This layer will ensure that the two systems evolve independently of each other, while the ACL layer will manage the complexities that may come when the two systems evolve.
 &lt;/li&gt;&lt;li&gt;Sort of a two way adapter?&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Separate Ways Pattern&lt;/h2&gt;&lt;ul&gt;    &lt;li&gt;The Separate Ways pattern addresses the case when an enterprise application can be made up of several smaller applications which have little or nothing in common from a modeling perspective.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-722206362863919445?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=t8dgfdEVIZk:8CDsmGBgsDc: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=t8dgfdEVIZk:8CDsmGBgsDc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=t8dgfdEVIZk:8CDsmGBgsDc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=t8dgfdEVIZk:8CDsmGBgsDc: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=t8dgfdEVIZk:8CDsmGBgsDc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=t8dgfdEVIZk:8CDsmGBgsDc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=t8dgfdEVIZk:8CDsmGBgsDc: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=t8dgfdEVIZk:8CDsmGBgsDc: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=t8dgfdEVIZk:8CDsmGBgsDc: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/t8dgfdEVIZk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/t8dgfdEVIZk/domain-driven-design-in-10-minutes_31.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.com/2009/03/domain-driven-design-in-10-minutes_31.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-5884239437821611225</guid><pubDate>Thu, 26 Mar 2009 11:26:00 +0000</pubDate><atom:updated>2009-04-16T20:14:54.430+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#">Enterprise</category><title>OSGi Discontent</title><description>Nice post on OSGi and its current problems on enterprise world.
&lt;br/&gt;&lt;br/&gt;
&lt;a href="http://java.dzone.com/news/osgi-discontent-no-migration"&gt;http://java.dzone.com/news/osgi-discontent-no-migration&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
This was something that I was planning to make a post from a long time, that I' ve been facing such problems myself. But I was pushing this on from a long time for lack of time.&lt;div class="blogger-post-footer"&gt;- Thomas Joseph&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-5884239437821611225?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=vc6JCGZGUqo:VxHDpk_xhJI: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=vc6JCGZGUqo:VxHDpk_xhJI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=vc6JCGZGUqo:VxHDpk_xhJI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=vc6JCGZGUqo:VxHDpk_xhJI: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=vc6JCGZGUqo:VxHDpk_xhJI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=vc6JCGZGUqo:VxHDpk_xhJI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=vc6JCGZGUqo:VxHDpk_xhJI: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=vc6JCGZGUqo:VxHDpk_xhJI: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=vc6JCGZGUqo:VxHDpk_xhJI: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/vc6JCGZGUqo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/vc6JCGZGUqo/osgi-discontent.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.com/2009/03/osgi-discontent.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-6868744197900640045</guid><pubDate>Wed, 10 Dec 2008 07:09:00 +0000</pubDate><atom:updated>2009-04-16T20:13:04.899+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>Clearing the Terminal Junk</title><description>&lt;p&gt;Today as I was on my regular - code, build and test cycle, that suddenly there was a huge lump of error trace. It was so huge as to going to the exact origin was making my work take long. After every build thought I did a &lt;code&gt;clear&lt;/code&gt;, it hardly helped me because, it actually "seems" to clear the screen, but actually holds the previous output, so even after the &lt;code&gt;clear&lt;/code&gt;, scrolling up the screen will take us to the old terminal output (that I supposed to have cleared).&lt;/p&gt;&lt;br/&gt;&lt;p&gt;
I wondered how I could actually clear off the entire terminal output, because after a cycle is complete, it hardly makes any sense to hold the previous output on my terminal buffer, rather it makes us more confused. After some googling, I got the solution - for the Mac (its the  “⌘K” key combination). Wondering where I could get on this my Linux box, that I noticed the "Terminal -&gt; Reset and Clear" option. Good it worked the way I wanted,.. but there was no shortcut key. Right away, I created one, and now I have the "Ctrk+K" combination clearing of the screen and its previous output buffer.&lt;/p&gt;&lt;br/&gt;
&lt;p&gt;Try it!  Probably you will never use the &lt;code&gt;clear&lt;/code&gt; again !!&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/2/28/Smile-tpvgames.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: none; cursor: pointer; width: 20px; height: 20px;" src="http://upload.wikimedia.org/wikipedia/commons/2/28/Smile-tpvgames.gif" alt="" border="0" /&gt;&lt;/a&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-6868744197900640045?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=UG1EaE16UBM:aVp-fQlfiPc: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=UG1EaE16UBM:aVp-fQlfiPc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=UG1EaE16UBM:aVp-fQlfiPc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=UG1EaE16UBM:aVp-fQlfiPc: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=UG1EaE16UBM:aVp-fQlfiPc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=UG1EaE16UBM:aVp-fQlfiPc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=UG1EaE16UBM:aVp-fQlfiPc: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=UG1EaE16UBM:aVp-fQlfiPc: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=UG1EaE16UBM:aVp-fQlfiPc: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/UG1EaE16UBM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/UG1EaE16UBM/clearing-terminal-junk.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.openthoughtworks.com/2008/12/clearing-terminal-junk.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-993917084870473269</guid><pubDate>Sun, 17 Aug 2008 17:38:00 +0000</pubDate><atom:updated>2008-08-17T23:12:18.588+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">OSGi</category><category domain="http://www.blogger.com/atom/ns#">Java</category><title>Getting your toolbox ready for OSGi</title><description>&lt;h1 id="m-.n3" class="western"&gt;Getting your toolbox ready for OSGi&lt;/h1&gt; &lt;p id="m-.n4" style="margin-bottom: 0cm;"&gt;This is my second post on OSGi. In my &lt;a id="m-.n5" href="http://openthoughtworks.blogspot.com/2008/07/osgi-add-dynamic-modularity-to-your.html"&gt;previous post&lt;/a&gt;, I just mentioned about what OSGi is all about. In the coming posts, I will be explaining on developing OSGi applications. As before, I won't be repeating anything that has been already written so well by other authors. I will be just siting some links to them. I will try to be innovative by linking thoughts in various articles or adding a missing point to the existing article, or giving a new way of doing things.&lt;/p&gt; &lt;p id="m-.n6" style="margin-bottom: 0cm;"&gt;&lt;br id="m-.n7"&gt; &lt;/p&gt; &lt;p id="m-.n8" style="margin-bottom: 0cm;"&gt;But, before we begin out on expedition and get our hands dirty on developing OSGi applications, let us pack up our toolbox for it. However if you are too eager to getting a feel of developing applications on OSGi, just read on &lt;a id="m-.n9" href="http://www.eclipsezone.com/eclipse/forums/m92130843.html"&gt;this&lt;/a&gt;  article by “Neil Bartlett” on &lt;i id="m-.n10"&gt;EclipseZone&lt;/i&gt;.&lt;/p&gt; &lt;p id="m-.n11" style="margin-bottom: 0cm;"&gt;&lt;br id="m-.n12"&gt; &lt;/p&gt; &lt;p id="m-.n13" style="margin-bottom: 0cm;"&gt;There is nothing special that you need in developing OSGi application, other than an OSGi platform implementation jar to your regular Java environment and a simple text editor. Still, we all like tools in our day-to-day life to make things easy. With this post, I will just try to get ourselves acquainted with the tools that will make our life of developing OSGi applications simpler.&lt;/p&gt; &lt;h3 id="m-.n14" class="western"&gt;Eclipse&lt;/h3&gt; &lt;p id="m-.n15" style="margin-bottom: 0cm;"&gt;&lt;a id="m-.n16" href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; is my favorite IDE for Java development. Although you can use can continue to use your own favorite IDE, if you are not already using Eclipse; there is more to using Eclipse. Eclipse itself is build on the Equinox runtime that is an OSGi implementation platform, and Eclipse allows to interact with the Equinox runtime. And sometimes its really very easy to developing your bundles in there.&lt;/p&gt; &lt;p id="m-.n17" style="margin-bottom: 0cm;"&gt;&lt;br id="m-.n18"&gt; &lt;/p&gt; &lt;p id="m-.n19" style="margin-bottom: 0cm;"&gt;Eclipse calls the so-called OSGi bundles as Plug-in, and the environment it provides for developing these Plug-ins is called Plugin Development Environment popularly called as PDE.&lt;/p&gt; &lt;h3 id="m-.n20" class="western"&gt;Maven&lt;/h3&gt; &lt;p id="m-.n21" style="margin-bottom: 0cm;"&gt;&lt;a id="m-.n23" href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; is basically a build management tool – like the &lt;a id="m-.n24" href="http://ant.apache.org/"&gt;Ant&lt;/a&gt;, but much much more. Maven can manage a project's build, reporting and documentation from a central piece of information provided by the POM file.&lt;/p&gt; &lt;p id="m-.n26" style="margin-bottom: 0cm;"&gt;&lt;br id="m-.n27"&gt; &lt;/p&gt; &lt;p id="m-.n28" style="margin-bottom: 0cm;"&gt;Maven is popularly helpful for its dependency management. It allows a project and all its dependencies to be managed gracefully. The variety of maven &lt;span id="m-.n30" style="font-style: normal;"&gt;plug-ins&lt;/span&gt; that are available makes the usage of Maven even simpler to be used for most of the odd kind of projects.&lt;/p&gt; &lt;p id="m-.n33" style="margin-bottom: 0cm;"&gt;&lt;br id="m-.n34"&gt; &lt;/p&gt; &lt;p id="m-.n35" style="margin-bottom: 0cm;"&gt;If you are new to Maven, it may feel a bit intimidating, at first, but you will soon feel very comfortable with it and would always think of how could you make use of Maven to make use of your tasks easier. I will not talk more on this – there is enough written on Maven.&lt;/p&gt; &lt;p id="m-.n36" style="margin-bottom: 0cm;"&gt;&lt;br id="m-.n37"&gt; &lt;/p&gt; &lt;p id="m-.n38" style="margin-bottom: 0cm;"&gt;Although we could use Ant, the simplicity given by the Maven  is just enough to make us learn Maven if we don't know it already - its simple. Believe me!&lt;/p&gt; &lt;p id="m-.n39" style="margin-bottom: 0cm;"&gt;&lt;br id="m-.n40"&gt; &lt;/p&gt; &lt;p id="m-.n41" style="margin-bottom: 0cm;"&gt;We will be using the power of Maven to simplify many of our tasks for OSGi.&lt;/p&gt; &lt;h3 id="m-.n42" class="western"&gt;Pax Projects&lt;/h3&gt; &lt;p id="m-.n43" style="margin-bottom: 0cm;"&gt;Probably the most important tool in your box for the OSGi world would be the set of tools provided by the OPS4J under the &lt;a id="m-.n44" href="http://wiki.ops4j.org/confluence/display/ops4j/Pax"&gt;Pax project&lt;/a&gt; – an umbrella project for all the OSGi projects at OPS4J. OPS4J was probably one of the early adopters of the OSGi, and therefore what they provide is worth the time they have spent on it. There are several projects under the Pax, all geared to making your OSGi life simpler, without any hype attached.&lt;/p&gt; &lt;p id="m-.n45" style="margin-bottom: 0cm;"&gt;&lt;br id="m-.n46"&gt; &lt;/p&gt; &lt;p id="m-.n47" style="margin-bottom: 0cm;"&gt;I would have loved to write on the tools provided by the Pax projects, but &lt;i id="m-.n48"&gt;Craig Walls&lt;/i&gt; has made my job easier by posting exactly the same on &lt;a id="m-.n49" href="http://www.jroller.com/habuma/entry/is_your_osgi_toolset_pax"&gt;his blog&lt;/a&gt; few days back. So I would just like to refer to it apart from looking at Pax official site.&lt;/p&gt; &lt;p id="m-.n50" style="margin-bottom: 0cm;"&gt;&lt;br id="m-.n51"&gt; &lt;/p&gt; &lt;p id="m-.n52" style="margin-bottom: 0cm;"&gt;And if you are wondering where to begin from on the Pax tools, just start on the pax-runner, pax-cursor and pax-construct to begin with.&lt;/p&gt; &lt;p id="m-.n53" style="margin-bottom: 0cm;"&gt;&lt;br id="m-.n54"&gt; &lt;/p&gt; &lt;p id="m-.n55" style="margin-bottom: 0cm;"&gt;The version numbers of most of the projects should not make you upset. You will find that most of them are still having a major version of '0'. Probably this is one of their strategies that indicates them avoiding the hype. I don't want to create any hype either, just check it out yourself. And if you find any place that needs improvements, feel free to do it right away, after all OPS4J is &lt;a id="m-.n56" href="http://openthoughtworks.blogspot.com/2008/08/thinking-to-start-or-contributing-to.html"&gt;not just about liberty of source&lt;/a&gt;, its about a community participation.&lt;/p&gt; &lt;h3 id="m-.n57" class="western"&gt;Spring &amp;amp; Spring-DM&lt;/h3&gt; &lt;p id="m-.n58" style="margin-bottom: 0cm;"&gt;We will be using &lt;a id="m-.n59" href="http://www.springframework.org/"&gt;Spring&lt;/a&gt; for what it is popular for – Dependency Injection. &lt;a id="m-.n60" href="http://www.springframework.org/osgi"&gt;Spring-DM&lt;/a&gt; (&lt;i id="m-.n61"&gt;Spring Dynamic Modules for OSGi service platforms&lt;/i&gt;) is another project from Spring Framework specifically focussed at OSGI. Probably we all would like our code to work not only in OSGi, but also in other environments as well. In designing such an application, you would probably do not want your domain objects to be coupled with the OSGi API.&lt;/p&gt; &lt;p id="m-.n62" style="margin-bottom: 0cm;"&gt;&lt;br id="m-.n63"&gt; &lt;/p&gt; &lt;p id="m-.n64" style="margin-bottom: 0cm;"&gt;That apart, just like Spring provides us with some great tools and utilities to getting our developer life easier, Spring DM will also provides some tools and utilities specific to OSGi, apart from the dependency injection aspects specifically for OSGi.&lt;/p&gt; &lt;h2 id="m-.n65" class="western"&gt;Whats Next?&lt;/h2&gt; &lt;p id="m-.n66" style="margin-bottom: 0cm;"&gt;Once these tools are at our box we will be in a better position to learn more and develop OSGi applications easily. Its not about mastering the tools above, but knowing about them will give us a holistic understanding of developing OSGi applications easily.&lt;/p&gt; &lt;p id="m-.n67" style="margin-bottom: 0cm;"&gt;&lt;br id="m-.n68"&gt; &lt;/p&gt; &lt;p id="m-.n69" style="margin-bottom: 0cm;"&gt;In my forthcoming posts, I will be using up these tools to develop OSGi applications.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-993917084870473269?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=oVfp3zOZJ8E:0q5p83ROkz8: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=oVfp3zOZJ8E:0q5p83ROkz8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=oVfp3zOZJ8E:0q5p83ROkz8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=oVfp3zOZJ8E:0q5p83ROkz8: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=oVfp3zOZJ8E:0q5p83ROkz8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=oVfp3zOZJ8E:0q5p83ROkz8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=oVfp3zOZJ8E:0q5p83ROkz8: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=oVfp3zOZJ8E:0q5p83ROkz8: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=oVfp3zOZJ8E:0q5p83ROkz8: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/oVfp3zOZJ8E" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/oVfp3zOZJ8E/getting-your-toolbox-ready-for-osgi.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.com/2008/08/getting-your-toolbox-ready-for-osgi.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-3008915958744126148</guid><pubDate>Sun, 10 Aug 2008 18:37:00 +0000</pubDate><atom:updated>2008-08-11T00:23:58.432+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">Open Source</category><category domain="http://www.blogger.com/atom/ns#">Free Software</category><title>Thinking beyond liberty of Source...</title><description>&lt;h2 id="iuz2"&gt;Thinking to start or contributing to Open Source project ...?&lt;/h2&gt; &lt;p id="fq654"&gt;Have you ever wondered at the richness of the &lt;a id="fq655" href="http://en.wikipedia.org/"&gt;Wikipedia&lt;/a&gt;, the amount and variety of information it contains? You can think to find there almost everything under the sun over there,.. and if you don't, you can always add it there. Great, isn't? All this richness was possible only because people all around the world can &lt;i id="fq656"&gt;participate&lt;/i&gt;&lt;span id="fq657" style="font-style: normal;"&gt; in authoring the Wikipedia. One can never think of such a great encyclopedia being authored by one or a few authors. You can always create new pages, edit or add to the existing ones and thus add to the richness of the Wikipedia.&lt;/span&gt;&lt;/p&gt; &lt;br/&gt;&lt;p id="fq658"&gt;&lt;span id="fq659" style="font-style: normal;"&gt;Now think of the same richness and flexibility being brought to the Software world. Wow! that would be fantastic!! Yes, &lt;a id="fq6510" href="http://www.ops4j.org/"&gt;OPS4J&lt;/a&gt; provides you this flexibility with the philosophy - “wiki brought to coding”.&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p id="fq6511"&gt;&lt;span id="fq6512" style="font-style: normal;"&gt;Here is the reproduction of the OPS4J philosophy from their wiki's home page:&lt;/span&gt;&lt;/p&gt; &lt;blockquote id="t77a"&gt; &lt;p id="fq6513"&gt;&lt;span id="fq6514" style="font-style: normal;"&gt;&lt;b id="fq6515"&gt;OPS4J&lt;/b&gt;&lt;/span&gt;&lt;span id="fq6516" style="font-style: normal;"&gt; stands for &lt;/span&gt;&lt;i id="fq6517"&gt;&lt;b id="fq6518"&gt;Open Participation Software for Java&lt;/b&gt;&lt;/i&gt;&lt;span id="fq6519" style="font-style: normal;"&gt;, and this community is trying to build a new, more open model for Open Source development, where not only the usage is Open and Free, but the Participation is Open as well. Removal of barriers, let more people in, have more fun and less politics. I have also seen &lt;/span&gt;&lt;i id="fq6520"&gt;Open Development&lt;/i&gt;&lt;span id="fq6521" style="font-style: normal;"&gt; as a term to describe this.&lt;/span&gt;&lt;/p&gt; &lt;br/&gt; &lt;p id="fq6522"&gt;Think of it as &lt;i id="fq6523"&gt;&lt;b id="fq6524"&gt;Wiki brought to Coding&lt;/b&gt;&lt;/i&gt;. Wikipedia is of course the most outstanding example of open collaboration.&lt;/p&gt; &lt;br/&gt; &lt;p id="fq6525"&gt;If this is your first visit to OPS4J, we recommend you the &lt;a id="fq6526" href="http://wiki.ops4j.org/confluence/display/ops4j/Introduction"&gt;Introduction&lt;/a&gt;.&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2 id="fq6530" class="western" style="font-style: normal;"&gt;What is “wiki brought to coding” ?&lt;/h2&gt; &lt;p id="fq6531" style="font-style: normal;"&gt;Wikis that drive the Wikipedia is a collaboration tool where contents or media could be added, edited and updated by virtually everyone with valid credentials. However Wikipedia just allows this credentials to anybody who just registers with it – no special merit is needed for you to obtain the credentials.  &lt;/p&gt; &lt;br/&gt; &lt;p id="fq6532" style="font-style: normal;"&gt;While both the philosophies of FOSS – Open Source and Free Software promote the openness in the software source and the liberty of the user to modify and redistribute the software without royalties, none of them actually dictates the ways in which someone could actually be a part of the project itself.&lt;/p&gt; &lt;h3 id="fq6533" style="font-style: normal;"&gt;Beyond the FOSS philosophy&lt;/h3&gt; &lt;p id="fq6534" style="font-style: normal;"&gt;OPS4J extends the concept of wiki into the software world. You just need to register with the site and then you can create, modify and contribute to the software or its documentation.&lt;/p&gt; &lt;br/&gt;&lt;p id="fq6535" style="font-style: normal;"&gt;The site itself is wiki-based, meaning that once registered, you can add and edit wiki pages that make up the site – just like Wikipedia. You also have write access the SVN, meaning that you can create your own projects, or add to the existing ones. So,.. no more patch submissions and waiting for you to prove yourself to be meritorious to have the write access to the SVN. Whats more – you also have almost an unrestricted access to the JIRA too!&lt;/p&gt; &lt;br/&gt; &lt;p id="fq6536" style="font-style: normal;"&gt;Its a home away from home for a developer. You have access to almost all the tools and rights needed to operate a software project. The whole world seems to be your team.&lt;/p&gt; &lt;h2 id="fq6537" class="western" style="font-style: normal;"&gt;Why this “No Barrier” approach to Open Source?&lt;/h2&gt; &lt;p id="fq6538" style="font-style: normal;"&gt;There are already Open Source promoted by organisations such as Apache, SourceForge, JBoss and the like, but they do not adequately allow everybody to participate. These projects are either merit based, privately owned or commercially controlled. They have their own way in how it restricts people from participating in the software evolve.&lt;/p&gt; &lt;br/&gt; &lt;p id="fq6543" style="font-style: normal;"&gt;&lt;span id="fq6540" style="font-style: normal;"&gt;These and similar thoughts on its philosophy is explained clearly &lt;a id="fq6541" href="http://wiki.ops4j.org/confluence/x/Dg"&gt;here&lt;/a&gt;, and at the links given at the &lt;/span&gt;&lt;i id="fq6542"&gt;references.&lt;/i&gt;&lt;br id="fq6545"&gt; &lt;/p&gt; &lt;br/&gt; &lt;p id="fq6546" style="font-style: normal;"&gt;It also answers few other questions that maybe coming up in our minds such as:&lt;/p&gt; &lt;ol id="fq6547"&gt; &lt;li id="fq6548"&gt; &lt;p id="fq6549" style="margin-bottom: 0cm; font-style: normal;"&gt;Why does "No  Barrier" projects make sense?&lt;/p&gt;  &lt;/li&gt; &lt;li id="fq6550"&gt; &lt;p id="fq6551" style="margin-bottom: 0cm; font-style: normal;"&gt;When does a  "No Barrier" project not make any sense?&lt;/p&gt;  &lt;/li&gt; &lt;li id="fq6552"&gt; &lt;p id="fq6553" style="margin-bottom: 0cm; font-style: normal;"&gt;How about the  bad guys (trying to destroy the code bases)?&lt;/p&gt;  &lt;/li&gt; &lt;li id="fq6554"&gt; &lt;p id="fq6555" style="margin-bottom: 0cm;"&gt;&lt;a id="fq6556" name="FrequentlyAskedQuestions-HowdoesitworkhereatOPS4J?"&gt;&lt;/a&gt;  How does it work here at OPS4J?&lt;/p&gt;  &lt;/li&gt; &lt;li id="fq6557"&gt; &lt;p id="fq6558" style="margin-bottom: 0cm;"&gt;&lt;a id="fq6559" name="FrequentlyAskedQuestions-WhoisincontrolatOPS4J?"&gt;&lt;/a&gt;  Who is in control at OPS4J?&lt;/p&gt;  &lt;/li&gt; &lt;li id="fq6560"&gt; &lt;p id="fq6561" style="margin-bottom: 0cm;"&gt;&lt;a id="fq6562" name="FrequentlyAskedQuestions-Asauser,whatlicensingappliestome?"&gt;&lt;/a&gt;  As a user, what licensing applies to me?&lt;/p&gt;  &lt;/li&gt; &lt;li id="fq6563"&gt; &lt;p id="fq6564" style="margin-bottom: 0cm;"&gt;&lt;a id="fq6565" name="FrequentlyAskedQuestions-WhatcanIdotomakeOPS4Jbetter?"&gt;&lt;/a&gt;  What can I do to make OPS4J better?&lt;/p&gt;  &lt;/li&gt; &lt;li id="fq6566"&gt; &lt;p id="fq6567" style="margin-bottom: 0cm;"&gt;&lt;a id="fq6568" name="FrequentlyAskedQuestions-Iwanttostartsharingsomecodeandinviteotherstohelpout.HowdoIdothat?"&gt;&lt;/a&gt;  I want to start sharing some code and invite others to help out. How  do I do that?&lt;/p&gt;  &lt;/li&gt; &lt;li id="fq6569"&gt; &lt;p id="fq6570" style="margin-bottom: 0cm;"&gt;&lt;a id="fq6571" name="FrequentlyAskedQuestions-Ihavefoundabuginsomecode,whatshallIdonow?"&gt;&lt;/a&gt;  I have found a bug in some code, what shall I do now?&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt;  &lt;h2 id="fq6574" class="western" style="font-style: normal;"&gt;Conclusion&lt;/h2&gt; &lt;p id="fq6575" style="font-style: normal;"&gt;Essentially the OPS4J is right in its innovative philosophy to promote Open Source that is essentially liberal. All those who have worked behind this upcoming idea has to be given all the credits.&lt;/p&gt; &lt;br/&gt; &lt;p id="fq6576" style="font-style: normal;"&gt;So what are you waiting for? Just jump ahead, create your account and start participating and see your ideas grow and mature!&lt;/p&gt;  &lt;h2 id="fq6579" class="western"&gt;&lt;span id="fq6580" style="font-style: normal;"&gt;References&lt;/span&gt;&lt;/h2&gt; &lt;p id="fq6581"&gt;&lt;span id="fq6582" style="font-style: normal;"&gt;OPS4J itself has much to say about the philosophy of “No Barrier” and “Open Development”, and how it tries to implement them. If these ideas excite you, please make sure to go through the following links.&lt;/span&gt;&lt;/p&gt; &lt;ol id="fq6583"&gt; &lt;li id="fq6584"&gt; &lt;p id="fq6585"&gt;&lt;span id="fq6586" style="font-style: normal;"&gt;&lt;a id="fq6587" href="http://wiki.ops4j.org/"&gt;http://wiki.ops4j.org&lt;/a&gt;  – Home Page&lt;/span&gt;&lt;/p&gt;  &lt;/li&gt; &lt;li id="fq6588"&gt; &lt;p id="fq6589"&gt;&lt;a id="fq6590" href="http://wiki.ops4j.org/confluence/x/mYE6"&gt;http://wiki.ops4j.org/confluence/x/mYE6&lt;/a&gt;  – Introduction&lt;/p&gt;  &lt;/li&gt; &lt;li id="fq6591"&gt; &lt;p id="fq6592"&gt;&lt;a id="fq6593" href="http://wiki.ops4j.org/confluence/x/Cg"&gt;http://wiki.ops4j.org/confluence/x/Cg&lt;/a&gt;  – Community Tour&lt;/p&gt;  &lt;/li&gt; &lt;li id="fq6594"&gt; &lt;p id="fq6595"&gt;&lt;a id="fq6596" href="http://wiki.ops4j.org/confluence/x/Cw"&gt;http://wiki.ops4j.org/confluence/x/Cw&lt;/a&gt;  – Principles of Open Participation Software&lt;/p&gt;  &lt;/li&gt; &lt;li id="fq6597"&gt; &lt;p id="fq6598"&gt;&lt;a id="fq6599" href="http://wiki.ops4j.org/confluence/x/D"&gt;http://wiki.ops4j.org/confluence/x/D&lt;/a&gt;  – Practicalities at OPS4J&lt;/p&gt; &lt;/li&gt; &lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-3008915958744126148?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=N27EWwvcXDc:1JlCptY86q0: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=N27EWwvcXDc:1JlCptY86q0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=N27EWwvcXDc:1JlCptY86q0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=N27EWwvcXDc:1JlCptY86q0: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=N27EWwvcXDc:1JlCptY86q0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=N27EWwvcXDc:1JlCptY86q0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=N27EWwvcXDc:1JlCptY86q0: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=N27EWwvcXDc:1JlCptY86q0: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=N27EWwvcXDc:1JlCptY86q0: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/N27EWwvcXDc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/N27EWwvcXDc/thinking-to-start-or-contributing-to.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://blog.openthoughtworks.com/2008/08/thinking-to-start-or-contributing-to.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-3012285515934613541</guid><pubDate>Mon, 04 Aug 2008 17:16:00 +0000</pubDate><atom:updated>2008-08-04T22:53:37.822+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Open Source</category><category domain="http://www.blogger.com/atom/ns#">Free Software</category><title>Open Source with Liberty</title><description>How many of us know that Open Source softwares essentially are Free Software as well (most of the time)? Again, if one has read the definition of Free Software? See &lt;a title="http://en.wikipedia.org/wiki/Free_Software" target="_blank" id="freesoftware" href="http://en.wikipedia.org/wiki/Free_Software"&gt;http://en.wikipedia.org/wiki/Free_Software&lt;/a&gt; and &lt;a title="http://en.wikipedia.org/wiki/Open_Source" target="_blank" id="opensource" href="http://en.wikipedia.org/wiki/Open_Source"&gt;http://en.wikipedia.org/wiki/Open_Source&lt;/a&gt;.&lt;br id="ogzj"&gt;&lt;br id="ogzj0"&gt; &lt;p id="cos15"&gt; Okay, I will give it out brief. Free in the Free Software as with its philosophy defines "&lt;i id="cos16"&gt;free&lt;/i&gt;" as in "&lt;i id="cos17"&gt;free thoughts&lt;/i&gt;" and not as in "&lt;i id="cos18"&gt;free beer&lt;/i&gt;". Essentially what makes a software Open Source or Closed Source or Free Software is determined by the license that it carries. But when most of the licenses (almost all the popular ones) that qualify for "&lt;i id="bsgp"&gt;Open Source&lt;/i&gt;" also qualify for the "&lt;i id="bsgp0"&gt;Free Software&lt;/i&gt;", essentially the software that carries such a license is essentially Open Source as well as Free Software.&lt;/p&gt;&lt;p id="p5fq"&gt;&lt;br id="p5fq0"&gt; &lt;/p&gt;&lt;p id="cos19"&gt; &lt;/p&gt;&lt;blockquote id="cos110"&gt;&lt;b id="cos111"&gt;NB:&lt;/b&gt; If you don't understand something as you read on, just open up a new tab on your browser and do a search on the subject, you will find so many good links. So much has been already written on the subject that I find it pointless to write them again. Please guess it right that I am too lazy to give out those links here. Hope you can &lt;i id="cbxm"&gt;excuse&lt;/i&gt; me for that!&lt;/blockquote&gt; &lt;p id="cos112"&gt;&lt;br id="p5fq1"&gt;&lt;/p&gt;&lt;p id="p5fq2"&gt; Even while most of the software qualify under both categories, its authors and promoters try to push it as Open Source, and not Free Software. Why? Popularity ... branding your software as being "Open Source" makes it more popular than branding it as "Free Software". Try to imagine a software that you have used and was promoted as "Free Software". Can't gain much... right?&lt;/p&gt;&lt;p id="ogzj1"&gt;&lt;br id="ogzj2"&gt; &lt;/p&gt;&lt;p id="cos113"&gt; I am not being paid by &lt;a title="Eric S Raymond" target="_blank" id="cos114" href="http://en.wikipedia.org/wiki/Eric_Raymond"&gt;Eric S Raymond&lt;/a&gt; or &lt;a title="OSI" target="_blank" id="cos115" href="http://www.opensource.org/"&gt;OSI&lt;/a&gt;, neither by &lt;a title="Richard Stallman" target="_blank" id="cos116" href="http://en.wikipedia.org/wiki/Richard_Stallman"&gt;Richard Stallman&lt;/a&gt; or &lt;a title="GNU" target="_blank" id="cos117" href="http://www.gnu.org/"&gt;GNU&lt;/a&gt; or &lt;a title="FSF" target="_blank" id="cos118" href="http://www.fsf.org/"&gt;FSF&lt;/a&gt;, so I should make a clear stand on both. While there are very narrow differences in the qualified Licenses for the two, they differ in their philosophies to where the emphasis goes. While the Open Source philosophy emphasis is on the &lt;i id="cos119"&gt;openness of the source&lt;/i&gt; (of the software), Free Software emphasis is on the liberty and &lt;b id="cos120"&gt;free&lt;/b&gt;dom on the software that you use. As the FSF/GNU site mentions it, Free Software and Open Source are not enemies, but rather closed source is the enemy.&lt;/p&gt;&lt;p id="e46e"&gt;&lt;br id="e46e0"&gt; &lt;/p&gt; &lt;h2 id="cos121"&gt;Why did I write this post?&lt;/h2&gt; As I talk to my friends and colleagues, I understand that not many understand &lt;a title="FOSS/FLOSS" target="_blank" id="cos122" href="http://en.wikipedia.org/wiki/FOSS"&gt;FOSS/FLOSS&lt;/a&gt; (addressing the Free and Open Source Software in a single name) in the real sense. For many, free software is something you don't have to pay for, and in that sense, open source is also free. And Open Source is something where you can &lt;b id="cos123"&gt;&lt;i id="cos124"&gt;see&lt;/i&gt;&lt;/b&gt;&lt;i id="e.jk"&gt; the source&lt;/i&gt;. To people like them, while at least when they read this line, they must realize that there needs to have a more thorough understanding of the FOSS/FLOSS philosophy.&lt;br id="cos125"&gt;&lt;br id="cos126"&gt; &lt;p id="cos127"&gt;There are good number of essays on this topic, but I thought of writing this post to save some of your time reading it. But if you are a bit more free, just read &lt;a title="this" target="_blank" href="http://www.gnu.org/philosophy/open-source-misses-the-point.html" id="xbxk"&gt;this&lt;/a&gt; one to understand some differences between the two philosophy. (Okay, this will not explain why most people prefer an Open Source branding as such, though it explains that "open source" is considered as a "marketing" campaign for free software). &lt;/p&gt;&lt;br id="cos129"&gt;&lt;p id="cos130"&gt; There is so much to write on the subject, but this is a comparatively small post because: &lt;br id="cos131"&gt; &lt;/p&gt;&lt;ol id="cos132"&gt;&lt;li id="cos133"&gt;I am lazy in writing essays.&lt;/li&gt;&lt;li id="cos134"&gt;I am not good at essays.&lt;/li&gt;&lt;li id="cos135"&gt;People often don't have time to read essays unless its really critical, and I understand that the need to understand FOSS is hardly ever critical unless you are selling a software with a sprinkle of FOSS around threatening your own license.&lt;/li&gt;&lt;/ol&gt; &lt;p id="cos137"&gt; I try to promote FLOSS as I deal with people personally, but for others, some of my posts like this should help. Just post on a comment if it helped a penny on your thoughts to know FOSS.&lt;/p&gt;&lt;br id="cos138"&gt;&lt;div class="blogger-post-footer"&gt;- Thomas Joseph&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5715425530181339158-3012285515934613541?l=blog.openthoughtworks.com' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=WpS5Dgf20BM:vf1Bl0QoESI: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=WpS5Dgf20BM:vf1Bl0QoESI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=WpS5Dgf20BM:vf1Bl0QoESI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=WpS5Dgf20BM:vf1Bl0QoESI: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=WpS5Dgf20BM:vf1Bl0QoESI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/openthoughtworks?i=WpS5Dgf20BM:vf1Bl0QoESI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/openthoughtworks?a=WpS5Dgf20BM:vf1Bl0QoESI: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=WpS5Dgf20BM:vf1Bl0QoESI: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=WpS5Dgf20BM:vf1Bl0QoESI: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/WpS5Dgf20BM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/openthoughtworks/~3/WpS5Dgf20BM/how-many-of-us-know-that-open-source.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://blog.openthoughtworks.com/2008/08/how-many-of-us-know-that-open-source.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>
