<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-5715425530181339158</atom:id><lastBuildDate>Fri, 08 Sep 2017 23:13:05 +0000</lastBuildDate><category>Tips</category><category>Java</category><category>OSGi</category><category>Linux</category><category>CQ</category><category>Project Management</category><category>development</category><category>AEM</category><category>Enterprise</category><category>Free Software</category><category>Open Source</category><category>agile</category><category>Corporate</category><category>DevCon</category><category>News</category><category>Passionate Progammer</category><category>career</category><category>software</category><category>web 2.0</category><category>CMS</category><category>CQ5</category><category>DDD</category><category>Daemon</category><category>Day CQ</category><category>Eclipse</category><category>HR Sightings</category><category>JavaOne</category><category>OAK</category><category>Performance Tuning</category><category>QCon</category><category>RIA</category><category>Sling</category><category>automation</category><category>book review</category><category>content management</category><category>html</category><category>html5</category><category>leasure</category><category>maven</category><category>nosql</category><category>ops4j</category><category>orm</category><category>persistence</category><category>polyglot</category><category>sql</category><category>testing</category><category>thanks</category><category>web frameworks</category><title>&lt;tech-musings/&gt; | Thomas Joseph&#39;s technical blog</title><description>Musings on software, technology, marketing, business and everything related to my passion &amp;amp; profession</description><link>http://tech.ethomasjoseph.com/</link><managingEditor>noreply@blogger.com (Thomas Joseph)</managingEditor><generator>Blogger</generator><openSearch:totalResults>48</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-6001409688727138258</guid><pubDate>Sat, 02 Jul 2016 03:54:00 +0000</pubDate><atom:updated>2016-07-20T09:01:16.848+05:30</atom:updated><title>Don&#39;t be a dick technologist</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div&gt;
Being a technologist doesn&#39;t mean that everything we create is created from scratch. We Google around, find lots of write ups, blogs, articles, and code and we take them all for writing our own solution. &amp;nbsp;However the effort we put to create our solution would vary a lot. Our solution may depend on a lot of libraries, or at times we have to copy some code and get started.&amp;nbsp;All this is so usual to our normal routine work, but one thing many of us forget about is the license that needs to be respected - especially when dealing with Open Source licenses.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
A decade back, people used to question the quality of the Open Source, but today with professional open sourcing in place this mindset has changed and people now have thinking that using Open source is good. However many people still believe that &quot;&lt;b&gt;&lt;i&gt;Open source is free&lt;/i&gt;&lt;/b&gt;&quot;. People also wrongly believe that &quot;&lt;b&gt;&lt;i&gt;Every visible source code is open source&lt;/i&gt;&lt;/b&gt;&quot;. Another wrong belief about Open Source is that for source code - &quot;&lt;b&gt;&lt;i&gt;can-see is can-copy&lt;/i&gt;&lt;/b&gt;&quot;. This mindset needs to change. People must know the license that applies to any piece work (including a write-up), and must faithfully abide by the license.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
But most of the time, reading the license text is very&amp;nbsp;verbose and complex with legal terms that many of us would fail to understand it. But irrespective, we all must give due respect to the hard work of the people(s) who originally created the work, and which you are now using. This is rightly&amp;nbsp;summarized&amp;nbsp;by the &lt;a href=&quot;https://github.com/philsturgeon/dbad/blob/master/LICENSE-en.md&quot; target=&quot;_blank&quot;&gt;DBAD license (Don&#39;t be a&amp;nbsp;dick license)&lt;/a&gt;. This license rightly brings out in simple and humorous way the courtesies that every user of the piece of work must follow. This license&amp;nbsp;focuses&amp;nbsp;on the moral responsibility of a person copying the work, rather than legally binding the person to do something or prevent it. It highlights the fact that many people copy other&#39;s work, and remain ungrateful, and do not attribute their work to the original work, or even worse - complain about it.&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
I personally may not apply a DBAD license due to its loose legal terms. However, &amp;nbsp;I would love to put its text along with my work, to let other know how important it is to show some&amp;nbsp;courtesy&amp;nbsp;to the creator of work. I would love to reproduce some of the context text of the license here.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
As developers we all want to protect our code from dicks that try to steal, sell, infringe or just generally rip us off. For this we have licenses like GPL, MIT, etc.&lt;br /&gt;
Sometimes however, you release a project where you just don&#39;t care what happens to the code. For this Sam Hocevar created the &lt;a href=&quot;http://www.wtfpl.net/&quot; target=&quot;_blank&quot;&gt;WTFPL &lt;/a&gt;which is a brilliant license.&lt;br /&gt;
For those of you who want something in between, try the &lt;a href=&quot;https://github.com/philsturgeon/dbad/blob/master/LICENSE-en.md&quot; target=&quot;_blank&quot;&gt;DBAD license&lt;/a&gt;.&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
One thing which every person and company using other&#39;s work in their own work (especially when using Open sourced work) must understand is that although the work is free to copy, the license accompanying it is still a legal license and should be abided. The copyright owner (or someone on their behalf) of the work can always sue the infringing dick. When you make loads of money by selling someone else&#39;s work, do care about buying them a pint or a coffee please, or at-least acknowledge them. Don&#39;t be a dick!&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2016/07/dont-be-dick-technologist.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-4843783178314164642</guid><pubDate>Mon, 20 Jun 2016 01:22:00 +0000</pubDate><atom:updated>2016-06-20T06:55:25.597+05:30</atom:updated><title>Universal Applications with Universal JavaScript</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;380&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;//www.slideshare.net/slideshow/embed_code/key/DQMwh6IbBdcLcL&quot; style=&quot;border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;&quot; width=&quot;595&quot;&gt; &lt;/iframe&gt; &lt;br /&gt;
&lt;div style=&quot;margin-bottom: 5px;&quot;&gt;
&lt;strong&gt; &lt;a href=&quot;https://www.slideshare.net/ethomasjoseph/universal-applications-with-universal-javascript&quot; target=&quot;_blank&quot; title=&quot;Universal Applications  with  Universal JavaScript&quot;&gt;Universal Applications  with  Universal JavaScript&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;https://www.slideshare.net/ethomasjoseph&quot; target=&quot;_blank&quot;&gt;ethomasjoseph&lt;/a&gt;&lt;/strong&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2016/06/universal-applications-with-universal.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-3178596482159563650</guid><pubDate>Mon, 26 Oct 2015 03:37:00 +0000</pubDate><atom:updated>2016-02-01T07:23:51.815+05:30</atom:updated><title>JavaScript is going Universal - Why should this matter you?</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
If you program for the web, and think that you are a &quot;&lt;i&gt;backend developer&lt;/i&gt;&quot;, and JavaScript isn&#39;t my cup of tea, that is not true any more. You can close your eyes and wish away that JavaScript on Server side is a hype, but the fact is that JavaScript is invading the Server side space each passing day, and you &quot;must&quot; know JavaScript and JavaScript based rendering technologies, if you intend to create next generation web and mobile applications, or may be - just to be employed!&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br clear=&quot;none&quot; /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
In the recently shared&amp;nbsp;&lt;a href=&quot;https://angularu.com/VideoSession/2015sf/angular-2-roadmap-update&quot; target=&quot;_blank&quot;&gt;roadmap of Angular 2&lt;/a&gt;&amp;nbsp;in&amp;nbsp;&lt;a href=&quot;https://angularu.com/&quot; target=&quot;_blank&quot;&gt;Angular U&lt;/a&gt;, the Angular team presented the idea of&amp;nbsp;&lt;a href=&quot;http://www.infoq.com/news/2015/06/angular-2-react-native-roadmap&quot; target=&quot;_blank&quot;&gt;splitting Angular into two pieces&lt;/a&gt;: core functionality and the&amp;nbsp;&lt;a href=&quot;https://youtu.be/aHGmj_fqPLE?t=784&quot; target=&quot;_blank&quot;&gt;renderer&lt;/a&gt;. The concept of renderer in Angular could be used for server side rendering, or native rendering on iOS or Android.&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br clear=&quot;none&quot; /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
This roadmap clearly brings Angular into the family of&amp;nbsp;&lt;a href=&quot;https://medium.com/@mjackson/universal-javascript-4761051b7ae9&quot; target=&quot;_blank&quot;&gt;Universal JavaScript&lt;/a&gt;&amp;nbsp;(also known as&amp;nbsp;&lt;a href=&quot;http://isomorphic.net/&quot; target=&quot;_blank&quot;&gt;Isomorphic JavaScript&lt;/a&gt;) rendering technologies. The family of Universal JavaScript rendering technologies already include&amp;nbsp;&lt;a href=&quot;http://rendrjs.github.io/&quot; target=&quot;_blank&quot;&gt;Rendr&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://facebook.github.io/flux/&quot; target=&quot;_blank&quot;&gt;Flux&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://facebook.github.io/react/&quot; target=&quot;_blank&quot;&gt;React&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;http://www.dustjs.com/&quot; target=&quot;_blank&quot;&gt;Dust&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;http://lazojs.org/&quot; target=&quot;_blank&quot;&gt;LazoJS&lt;/a&gt;&amp;nbsp;- to name a few popular ones.&amp;nbsp;&lt;a href=&quot;https://medium.com/building-coursera/why-and-how-coursera-does-isomorphic-javascript-a-fast-and-snappy-quiz-5ba7bb9bf367&quot; starget=&quot;_blank&quot;&gt;Coursera&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;http://nerds.airbnb.com/weve-launched-our-first-nodejs-app-to-product/&quot; target=&quot;_blank&quot;&gt;Airbnb&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://engineering.linkedin.com/frontend/leaving-jsps-dust-moving-linkedin-dustjs-client-side-templates&quot; target=&quot;_blank&quot;&gt;LinkedIn&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;http://www.infoq.com/news/2014/05/facebook-mvc-flux&quot; target=&quot;_blank&quot;&gt;Facebook&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;http://techblog.netflix.com/2015/08/making-netflixcom-faster.html&quot; target=&quot;_blank&quot;&gt;NetFlix&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;http://radar.oreilly.com/2014/10/isomorphic-javascript-with-lazojs.html&quot; target=&quot;_blank&quot;&gt;Walmart&lt;/a&gt;&amp;nbsp;are some of the high volume web applications that have already moved to Universal JavaScript. This move has already helped these websites to write applications that run universally - on server, browser and mobile apps - significantly reducing the development and&amp;nbsp;maintenance&amp;nbsp;effort across various channels, and more importantly - you just maintain one code and be flexible about intelligently choosing a logic execution and rendering to be on server or client side while pushing up the web applications&amp;nbsp;&lt;a href=&quot;http://techblog.netflix.com/2015/08/making-netflixcom-faster.html&quot; target=&quot;_blank&quot;&gt;to be much faster&lt;/a&gt;!&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br clear=&quot;none&quot; /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
JavaScript going Universal&lt;/h2&gt;
&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Despite the creation&amp;nbsp;of&amp;nbsp;JavaScript as a&amp;nbsp;&lt;a href=&quot;http://www.computer.org/csdl/mags/co/2012/02/mco2012020007.html&quot; target=&quot;_blank&quot;&gt;lightweight look-alike brother of Java&lt;/a&gt;,&amp;nbsp;JavaScript eventually became a key component in enabling the&amp;nbsp;&lt;a href=&quot;http://www.oreilly.com/pub/a/web2/archive/what-is-web-20.html&quot;&gt;Web 2.0&lt;/a&gt;&amp;nbsp;evolution - especially through AJAX. JavaScript has moved much beyond its initial design goals, with more standardization with ECMA, optimizations done to every release of the JavaScript engines, JavaScript is all ready to rule the web (and more platforms).&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://static.ethomasjoseph.com/images/universal-js.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://static.ethomasjoseph.com/images/universal-js.png&quot; height=&quot;166&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Universal JavaScript&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;http://techblog.netflix.com/2015/08/making-netflixcom-faster.html&quot; target=&quot;_blank&quot;&gt;Image Credit - Netflix&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Today JavaScript is a&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/JavaScript_engine&quot; target=&quot;_blank&quot;&gt;ubiquitous&lt;/a&gt;&amp;nbsp;runtime. &amp;nbsp;JavaScript&amp;nbsp;is everywhere - from Browser,&amp;nbsp;&amp;nbsp;&lt;a href=&quot;https://en.wikipedia.org/wiki/Comparison_of_server-side_JavaScript_solutions&quot; target=&quot;_blank&quot;&gt;server side&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;http://weworkweplay.com/play/raspberry-pi-nodejs/&quot; target=&quot;_blank&quot;&gt;embedded&lt;/a&gt;&amp;nbsp;device,&amp;nbsp;&lt;a href=&quot;http://openaphid.github.io/blog/2013/01/17/part-i-how-to-choose-a-javascript-engine-for-ios-and-android-apps/&quot; target=&quot;_blank&quot;&gt;mobile&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;https://github.com/bebraw/jswiki/wiki/Game-Engines&quot; target=&quot;_blank&quot;&gt;gaming&lt;/a&gt;.. The language&#39;s influence continues to grow on the server landscape via&amp;nbsp;&lt;a href=&quot;http://nodejs.org/&quot; target=&quot;_blank&quot;&gt;Node.js&lt;/a&gt;, and runtimes&amp;nbsp;such as&amp;nbsp;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino&quot;&gt;Rhino&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html&quot;&gt;Nashorn&lt;/a&gt;&amp;nbsp;for Java;&amp;nbsp;&lt;a href=&quot;https://jurassic.codeplex.com/&quot;&gt;Jurassic&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;http://v8dotnet.codeplex.com/&quot; target=&quot;_blank&quot;&gt;V8.NET&lt;/a&gt;&amp;nbsp;of .NET and projects such a&amp;nbsp;&lt;a href=&quot;http://eclipsesource.com/blogs/getting-started-with-j2v8/&quot; target=&quot;_blank&quot;&gt;J2V8&lt;/a&gt;&amp;nbsp; and&amp;nbsp;&lt;a href=&quot;http://facebook.github.io/react-native/&quot; target=&quot;_blank&quot;&gt;React&lt;/a&gt;&amp;nbsp;aiming to go even higher by targeting at Server side and mobile at the same time.&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br clear=&quot;none&quot; /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Digital Marketing, CMS, Ecommerce and Omnichannel&lt;/h3&gt;
&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
If you are into Digital Marketing and Ecommerce, you cannot discount the fact that these worlds are increasingly growing omni channel. Engaging consumers across various channels require consistent experience. I am yet to gain some more insights into usage of JavaScript for native apps and work it out, but thinking your application architecture with universal JavaScript rendering itself lends the architecture to support mobile apps as well. Which means building omni-channel experiences would be much easier, with cleaner separation of concerns. More importantly many of the frameworks advocate - &quot;learn once and write anywhere&quot;.&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br clear=&quot;none&quot; /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
My&amp;nbsp;Experiences&amp;nbsp;with Universal JavaScript&lt;/h3&gt;
&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Working at SapientNitro, last year I had initiated a humble beginning to use Universal JavaScript rendering with &lt;a href=&quot;http://handlebarsjs.com/&quot; target=&quot;_blank&quot;&gt;Handlebars&lt;/a&gt; being introduced for Adobe AEM on the server side, which later paved its&amp;nbsp;way&amp;nbsp;into the IEA - &lt;a href=&quot;http://www.businesswire.com/news/home/20150429006446/en/SapientNitro-Introduces-Groundbreaking-Architecture-Accelerate-Digital-Transformation&quot; target=&quot;_blank&quot;&gt;Integrated Experience Architecture&lt;/a&gt;. With almost one year down the line one extremely positive outlook common with people who have worked on&amp;nbsp;this concept on different projects &amp;nbsp;was the &quot;&lt;i&gt;separation of concerns&lt;/i&gt;&quot; and the inherent advantages of it.&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br clear=&quot;none&quot; /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
However such a model of development could be a cause of concern at times when there is no mediator who would understand the &quot;&lt;i&gt;backend&lt;/i&gt;&quot; and the &quot;&lt;i&gt;frontend&lt;/i&gt;&quot; frameworks patterns well, and allow the two teams to gel together. Even without such a person, projects would still move on, but what is produced at the end may not be elegant or easy to understand.&lt;br /&gt;
&lt;br /&gt;
When I started out with this effort for a project for a leading financial consulting client, I learnt Handlebars, Grunt, and NodeJS to an extent that I wrote some Grunt tasks and Handlebar helpers on JavaScript. While this may look trivial to a seasoned JavaScript developer, for me it really helped a lot to understand both sides of the world and help the Interactive team and the AEM team with teething problems and integration glitches. This also&amp;nbsp;helped us to create a better application &quot;&lt;i&gt;together&lt;/i&gt;&quot;. Looking back at the application, it is so seamless that ramping up a new member on the technology stack was really fast.&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
JavaScript - much beyond just rendering&lt;/h2&gt;
&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
JavaScript from a pure programming perspective itself is interesting - even when we leave out the goodies gained with universal rendering. JavaScript does not follow a purist programming paradigm, but it lends itself to almost any programming paradigm -&amp;nbsp;&lt;a href=&quot;https://medium.com/javascript-scene/the-two-pillars-of-javascript-ee6f3281e7f3&quot;&gt;Object Oriented (with prototypal inheritance)&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://medium.com/javascript-scene/the-two-pillars-of-javascript-pt-2-functional-programming-a63aa53a41a4#.eae6a57py&quot;&gt;Functional&lt;/a&gt;&amp;nbsp;or or just even no paradigm! Lot of libraries exist to help you get your flavour of JavaScript. The evolution of JavaScript specification itself is going through interesting phase - especially with&amp;nbsp;&lt;a href=&quot;http://www.ecma-international.org/publications/standards/Ecma-262.htm&quot;&gt;ES6&lt;/a&gt;&amp;nbsp;advances on&amp;nbsp;&lt;a href=&quot;http://es6-features.org/&quot;&gt;making the language better&lt;/a&gt;. The&amp;nbsp;&lt;a href=&quot;http://www.typescriptlang.org/&quot; target=&quot;_blank&quot;&gt;TypeScript&lt;/a&gt;&amp;nbsp;from Microsoft makes JavaScript &quot;&lt;i&gt;strongly typed&lt;/i&gt;&quot; and object oriented, while libraries like&amp;nbsp;&lt;strong&gt;&lt;a href=&quot;http://underscorejs.org/&quot; target=&quot;_blank&quot;&gt;Underscore&lt;/a&gt;&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;&lt;a href=&quot;https://lodash.com/&quot; target=&quot;_blank&quot;&gt;Lo-Dash&lt;/a&gt;&lt;/strong&gt;,&amp;nbsp;&lt;strong&gt;&lt;a href=&quot;http://ramdajs.com/&quot; target=&quot;_blank&quot;&gt;Ramda&lt;/a&gt;&lt;/strong&gt;&amp;nbsp;make it a functional language. This further enables you to take the best of the different programming paradigms and write better programs. Add to that, the programs you&amp;nbsp;write can run on Server or on the client. Isn&#39;t that interesting?&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br clear=&quot;none&quot; /&gt;&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
JavaScript based server side technologies - especially with NodeJS have&amp;nbsp;advanced so well that you can use them to create full blown high-volume (I/O) web applications. Rendering page, connecting to database, crunching number or&amp;nbsp;throwing out graphical charts, you name it - NodeJS applications do almost everything or even more than what you would expect from a traditional language or framework.&lt;br /&gt;
&lt;br /&gt;
I would recommend that more and more people on the &quot;&lt;i&gt;backend&lt;/i&gt;&quot; come forward and learn the&amp;nbsp;&lt;i&gt;front-end&lt;/i&gt;&amp;nbsp;frameworks, more importantly the JavaScript. This would help us be&amp;nbsp;&lt;a href=&quot;https://medium.com/javascript-scene/the-two-pillars-of-javascript-ee6f3281e7f3&quot; target=&quot;_blank&quot;&gt;better programmers&lt;/a&gt;&amp;nbsp;and architects and create better applications. For when you plan to give training to the developers, do also consider that the training can also include the interested backed developer. A &quot;&lt;i&gt;frontend&lt;/i&gt;&quot; aware&amp;nbsp;&lt;i&gt;backend&amp;nbsp;&lt;/i&gt;architect and developer can make such a difference that you will end up more time productively creating application than arguing that &quot;&lt;i&gt;it works for me&lt;/i&gt;&quot;, or &quot;&lt;i&gt;please do whatever to make this work on your end&lt;/i&gt;&quot;. And remember the &lt;a href=&quot;http://blog.codinghorror.com/the-principle-of-least-power/&quot; target=&quot;_blank&quot;&gt;Atwoods Law&lt;/a&gt;&amp;nbsp;- &quot;&lt;i&gt;Any application that can be written in JavaScript, will eventually be written in JavaScript.&lt;/i&gt;&quot; as a corollary to &quot;&lt;a href=&quot;http://www.w3.org/2001/tag/doc/leastPower.html&quot; target=&quot;_blank&quot;&gt;The Rule of Least Power&lt;/a&gt;&quot;.&lt;br /&gt;
&lt;br /&gt;
The improvements on the framework is ongoing. You can&#39;t wait for the perfect framework to come to learn it. Improvements in JavaScript frameworks seems to be there each passing day. If you are not already into the groove of learning JavaScript, do so. Understand the ecosystem of JavaScript - especially with things like NodeJS, Grunt, Gulp and JavaScrpt templating. Try joining your local JavaScript meetup group, or give yourself some hands on training.Try out the functional and object oriented features of JavaScript. It will&amp;nbsp;&lt;a href=&quot;https://medium.com/javascript-scene/the-two-pillars-of-javascript-ee6f3281e7f3&quot;&gt;make you a better and efficient programmers&lt;/a&gt;&amp;nbsp;and architects.&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2015/10/javascript-going-universal-why-matter-you.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-5864455401820943236</guid><pubDate>Sat, 26 Sep 2015 13:49:00 +0000</pubDate><atom:updated>2015-09-26T19:31:18.715+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">AEM</category><category domain="http://www.blogger.com/atom/ns#">CQ</category><category domain="http://www.blogger.com/atom/ns#">Sling</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><title>Sling - Who is closing my JCR Session?</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Has this happened to you? - You got the JCR session, but at times, you find that &quot;someone&quot; closed the JCR session! And that too - its very inconsistent. Sometimes it works and other times it does not! Well then its that you have hit the Sling / CQ development anti-pattern. And possibly this is what you see in your log:&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;javax.jcr.RepositoryException: This session has been closed.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
As suggested by &lt;a href=&quot;https://cqdump.wordpress.com/2013/07/23/cq-development-patterns-sling-resourceresolver-and-jcr-sessions/&quot; target=&quot;_blank&quot;&gt;Jorg Hoh on his blog&lt;/a&gt; on CQ development patterns, you should rely on Sling objects as much as possible, rather than relying directly on the JCR objects. But at those cases (e.g. writing to a repository) when you will have to directly rely on the JCR repository you will have to still use the JCR Session, its recommended that you directly get the JCR session from the Sling repository, and not adapt it from the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ResourceResolver&lt;/span&gt;, IF you do not intend to use the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ResourceResolver &lt;/span&gt;directly.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;@Reference
private ResourceResolverFactory resolverFactory;

// Wrong way of obtaining JCR Session
private Session getSessionAntipattern() throws LoginException {
 ResourceResolver resolver = resolverFactory.getServiceResourceResolver(null);
 return resolver.adaptTo(Session.class);
}
&lt;/pre&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;em&gt;&lt;strong&gt;Code Listing 1:&lt;/strong&gt; JCR Session Creation Antipattern&lt;/em&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;@Reference
private SlingRepository slingRepository;

// Correct way of obtaining JCR session
private Session getJCRSession() throws RepositoryException {
 return slingRepository.loginService(null, null);
}
&lt;/pre&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;em&gt;&lt;strong&gt;Code Listing 2:&lt;/strong&gt; JCR Session Creation Pattern&lt;/em&gt;&lt;/div&gt;
&lt;br /&gt;
You may wonder, what&#39;s wrong. Logically thinking, why would you retrieve the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ResourceResolver &lt;/span&gt;(and &amp;nbsp;adapt it to JCR Session), if you do not intend to use the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ResourceResolver&lt;/span&gt;? &amp;nbsp;This logic has made the Sling developer&#39;s to close the underlying JCR Session of the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ResourceResolver &lt;/span&gt;when the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ResourceResolver &lt;/span&gt;object is Garbage Collected. Although, how this is done is&amp;nbsp;&lt;a href=&quot;https://issues.apache.org/jira/browse/SLING-4372&quot; target=&quot;_blank&quot;&gt;being changed&lt;/a&gt;&amp;nbsp;across the releases, the basic idea of releasing the resources held up (JCR Session) is still valid.&lt;br /&gt;
&lt;br /&gt;
If you observe in the code snippet 1 (antipattern), the scope of the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ResourceResolver &lt;/span&gt;object ends as soon as the method returns, which makes it eligible for garbage collection. This means that whenever the garbage collector runs, the JCR Session got through the antipattern would be closed - oops! This explains your JCR Session getting closed inconsistently.&lt;br /&gt;
&lt;br /&gt;
I would like to emphasize that adapting to JCR Session from &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ResourceResolver &lt;/span&gt;itself is not wrong, if you intend to use the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;ResourceResolver &lt;/span&gt;along, other than just adapting it to JCR Session.&lt;br /&gt;
&lt;br /&gt;
Hope this post helps someone save some time debugging on the JCR Session getting closed inconsistently.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2015/09/sling-who-is-closing-my-jcr-session.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-6871453923218783018</guid><pubDate>Tue, 22 Sep 2015 17:30:00 +0000</pubDate><atom:updated>2015-11-18T07:04:24.383+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">automation</category><category domain="http://www.blogger.com/atom/ns#">CMS</category><category domain="http://www.blogger.com/atom/ns#">content management</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">testing</category><title>Insane sanity (testing)!</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div&gt;
You are busy writing your code on a complex piece and suddenly a team wide announcement comes - &quot;&lt;i&gt;The new code has gone in for the build, please do &#39;&lt;b&gt;sanity&lt;/b&gt;&#39; for your components&lt;/i&gt;&quot;.&lt;br /&gt;
&lt;br /&gt;
&quot;My unit tests would save me!&quot; is not something which will save you here if this happens to be something which has a lot of visual and &quot;content driven&quot; elements. So, you break out of writing code half-way and start doing the &quot;sanity&quot; because it is crucial to test your components before lunch, as this code will be going to production soon after. You do this half-heartedly because this is so common for you whenever a major release happens or a content restructuring happens - and anyway &quot;I am not a tester!&quot;. So you lose at-least one hour of your otherwise productive time to doing this insanely mundane task. On top of this, you also have your &quot;professional testers&quot; doing the same testing -just few extra eyeballs! This is the typical scenario if you are developing content driven (CMS) applications. Bless you if you are not so!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://static.ethomasjoseph.com/images/mad_scientist.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://static.ethomasjoseph.com/images/mad_scientist.png&quot; height=&quot;299&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Insane testing&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;https://en.wikipedia.org/wiki/Mad_scientist#/media/File:Mad_scientist.svg&quot; target=&quot;_blank&quot;&gt;Image Credit - Wikimedia Commons&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
At this age in Digital Marketing, where &lt;a href=&quot;http://www.marketingdonut.co.uk/marketing/marketing-strategy/why-content-is-king-in-today-s-marketing&quot; target=&quot;_blank&quot;&gt;content is the king&lt;/a&gt;, faster development and delivery overpowers the more structured delivery methods often followed in typical enterprise applications, where you invest for a lot of integrated and automated testing. Reason - &quot;If we invest time to build integration testing and automation, we lose time to market&quot;. This is a broken argument often upheld by people who most often do not even care about&lt;a href=&quot;http://www.martinfowler.com/articles/continuousIntegration.html&quot; target=&quot;_blank&quot;&gt; integration testing&lt;/a&gt;&amp;nbsp;in its real sense, and automated testing which can test the UI elements and the content of the page.&lt;br /&gt;
&lt;br /&gt;
If we can invest some time in bringing about continuous integration and &lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_GUI_testing_tools&quot; target=&quot;_blank&quot;&gt;UI automation&lt;/a&gt;, a lot - &lt;i&gt;really lot&lt;/i&gt; of time could be saved on developers doing &quot;&lt;i&gt;sanity testing&lt;/i&gt;&quot;. This may be difficult to achieve for shorter duration projects of the span less than 6 months - all out of their own budget, but may be easily feasible for bigger projects. Better - if this could be planned by &quot;practice leads&quot; who could invest on this once, and reap the benefits multiple times across projects. I do not have metrics to prove this by maths, but just a little retrospection into this would be useful.&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;
Personally, this topic is lower on my radar. First, there are higher priority tasks for learning and experimentation on my TODO list. Second, I work more in a consulting mode than delivery, so budgeting it on &amp;nbsp;my project is not possible. Additionally, I do not have metrics to convince my client to budget this either! However, I will &lt;i&gt;try &lt;/i&gt;to squeeze in some time in the coming days and weeks to do some research into this topics and publish my findings.&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2015/09/insane-sanity-testing.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-6769625655423786161</guid><pubDate>Mon, 21 Sep 2015 18:38:00 +0000</pubDate><atom:updated>2015-09-22T01:00:40.148+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">career</category><category domain="http://www.blogger.com/atom/ns#">Passionate Progammer</category><title>Three great advice</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Act on it. Don&#39;t think too hard. Be Agile. These are the three great advice that have been my favorite picks from &lt;b&gt;the book&lt;/b&gt; - &quot;&lt;a href=&quot;http://www.amazon.com/The-Passionate-Programmer-Remarkable-Development/dp/1934356344#&quot; target=&quot;_blank&quot;&gt;The Passionate Programmer - Creating A REMARKABLE CAREER in software development (2009)&lt;/a&gt;&quot;.&lt;br /&gt;
&lt;br /&gt;
&quot;&lt;b&gt;&lt;i&gt;Act on it&lt;/i&gt;&lt;/b&gt;&quot; means that a piece of good advice needs to have an action plan on it - however small it may be. Most of the chapters of the book had the &quot;Act on it&quot; section which forced us to review ourselves and try to find an action plan. Without an act, the advice just rusts in our minds.&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;tr-caption-container&quot; style=&quot;margin-left: auto; margin-right: auto; text-align: center;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: center;&quot;&gt;&lt;a href=&quot;http://static.ethomasjoseph.com/images/chimpanzee-830526_640.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: auto; margin-right: auto;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://static.ethomasjoseph.com/images/chimpanzee-830526_640.jpg&quot; height=&quot;320&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;tr-caption&quot; style=&quot;text-align: center;&quot;&gt;&lt;b&gt;Thinking hard - &quot;to jump or not?&quot;&lt;/b&gt;&lt;br /&gt;
&lt;a href=&quot;https://pixabay.com/en/chimpanzee-monkey-thinking-jump-830526/&quot; target=&quot;_blank&quot;&gt;Image Credits -&amp;nbsp;stefaanroelofs&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&quot;&lt;b&gt;&lt;i&gt;Don&#39;t think too hard&lt;/i&gt;&lt;/b&gt;&quot; means that it is not necessary to perfect the things in the first go. We should think on it, but not &quot;too hard&quot; to make it the best at the first attempt. This has been especially important to me because, often trying to do the &quot;best&quot; often resulted to the act not being done at the first place. The best example would be writing something for the blog. I would often have such a lot of topics but often either I choose a topic which requires itself to be expressed as an essay, or just make the writeup to be the best and cover all the aspects of the topic, leaving no open loops. Both of this essentially means a lot of time, which eventually just rusts in the backlog and never gets a chance to get published.&lt;br /&gt;
&lt;br /&gt;
&quot;&lt;b&gt;&lt;i&gt;Be Agile&lt;/i&gt;&lt;/b&gt;&quot; when applied to career and life means that career and life are never done. Re-iterate over, and try to make them better every time, and correct the course of action if it needs so.&lt;br /&gt;
&lt;br /&gt;
Putting this together would also mean that I should be blogging more often, even with not so well rounded topics still appearing in there. And of-course, this would also apply to other aspects of life as well.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2015/09/three-great-advice.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-5301597356108335241</guid><pubDate>Mon, 14 Sep 2015 16:45:00 +0000</pubDate><atom:updated>2015-09-23T01:30:20.118+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">career</category><category domain="http://www.blogger.com/atom/ns#">Passionate Progammer</category><title>Nice is just ordinary! You need to be Extra-ordinary - Amazing - Remarkable!</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Today I happened to see a TV advertisement which had a beautiful story - &quot;Nice is just ordinary!&quot;. This happened to &amp;nbsp;rephrase what &lt;a href=&quot;http://chadfowler.com/&quot; target=&quot;_blank&quot;&gt;Chad Fowler&lt;/a&gt; had to say in his amazing book - &lt;a href=&quot;http://www.amazon.com/The-Passionate-Programmer-Remarkable-Development/dp/1934356344#&quot; target=&quot;_blank&quot;&gt;The Passionate Programmer - Creating A REMARKABLE CAREER in software development (2009)&lt;/a&gt;, which I had finished reading one round just today.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;iframe width=&quot;320&quot; height=&quot;266&quot; class=&quot;YOUTUBE-iframe-video&quot; data-thumbnail-src=&quot;https://i.ytimg.com/vi/GzK4JkzOQ-o/0.jpg&quot; src=&quot;https://www.youtube.com/embed/GzK4JkzOQ-o?feature=player_embedded&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;i&gt;Winning is not about not-losing. Winning is about being awesome. Winning is about being Amazing - Remarkable!&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
My career, as I look back, seemed to have stagnated. I never had a roller-coaster ride in my career. I had pigeon-holed myself into the mediocrity - especially for the last 4-5 years. No one else to be blamed - just me. This was why I forced myself to read this excellent book to be inspired, and bring out the best in me. After-all I got into this profession for pure passion.&lt;br /&gt;
&lt;br /&gt;
This book was in my reading list ever since 2010, but it was two weeks back that I finally ordered a paperback edition from Amazon, which I would religiously read during my travel to and from office.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://static.ethomasjoseph.com/images/passionate-programmer.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://static.ethomasjoseph.com/images/passionate-programmer-small.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
The world around us always demands extra-ordinary and amazing things. Everything else is just OK, and CAN just live without. But I would like my life to be something which would create a dent in the world! Something awesome; something remarkable!&lt;br /&gt;
&lt;br /&gt;
Yes, I do need a lot of overhauling. I have to invest in myself - to be a remarkable product - to create remarkable products. And this should mark the beginning of the journey to a remarkable career.&lt;br /&gt;
&lt;br /&gt;
Over the next course of time, I would post critique to the book, apart from my brain dumps of some interesting ideas brewing.&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2015/09/nice-is-just-ordinary-you-need-to-be.html</link><author>noreply@blogger.com (Thomas Joseph)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/GzK4JkzOQ-o/default.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-4872655383541628420</guid><pubDate>Sun, 13 Sep 2015 15:06:00 +0000</pubDate><atom:updated>2015-09-13T23:30:02.052+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">AEM</category><category domain="http://www.blogger.com/atom/ns#">CQ</category><category domain="http://www.blogger.com/atom/ns#">OSGi</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><title>The secret sauce of wrapping a jar as OSGi bundle</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
OSGi has been on the mainstream technologies for some time now. Many of the Java application servers now are either natively OSGi based, or support OSGi. This has also led many to package their libraries as valid OSGi bundles. But still there are a lot of libraries, that have absolutely no knowledge of OSGi - and when we have to use one of such libraries - we have to depend on one of those many open source projects which gives an OSGi bundle for the library, or prepare our own recipe to wrap them into OSGi bundles.&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Before you begin&lt;/h2&gt;
Before you pack your toolbox to wrap vanilla jars into OSGi bundles, do search public OSGi repositories and projects which can save a lot of your effort. Here are some of the popular ones:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://ebr.springsource.com/repository/app/&quot; target=&quot;_blank&quot;&gt;SpringSource Enterprise Bundle Repository&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.servicemix.bundles%22&quot; target=&quot;_blank&quot;&gt;ServiceMix Bundle Project&lt;/a&gt;&amp;nbsp; Github Repository - &lt;a href=&quot;https://github.com/apache/servicemix-bundles&quot;&gt;https://github.com/apache/servicemix-bundles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.ops4j.pax.tipi%22&quot; target=&quot;_blank&quot;&gt;Pax Tipi&lt;/a&gt;&amp;nbsp;Github Repository - &lt;a href=&quot;https://github.com/ops4j/org.ops4j.pax.tipi&quot;&gt;https://github.com/ops4j/org.ops4j.pax.tipi&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
If you still can&#39;t find what you are looking for, you may have to consider building your own! You can even consider contributing your bundles to the &lt;i&gt;ServiceMix Bundle project&lt;/i&gt; or the &lt;i&gt;Pax Tipi project&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Wrapping of vanilla jars can sometimes become complicated, especially when it is related to dynamic class generation or that of XML parsing. And that is why I am writing this - to share my experience of wrapping OSGi bundles when the library is complicated.&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Choosing your tools&lt;/h2&gt;
No surprise, I am also going to suggest the &lt;a href=&quot;http://www.aqute.biz/Bnd/Bnd&quot; target=&quot;_blank&quot;&gt;BND tool&lt;/a&gt;&amp;nbsp;here. However, the BND tool itself is available in various flavours depending on your development workflow and tool as described in the &lt;a href=&quot;http://www.aqute.biz/Bnd/Download&quot; target=&quot;_blank&quot;&gt;Download page of the BND tool&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://bndtools.org/&quot; target=&quot;_blank&quot;&gt;Bndtools &lt;/a&gt;- Bundling tool for the Eclipse Plugin&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://felix.apache.org/documentation/subprojects/apache-felix-maven-bundle-plugin-bnd.html&quot; target=&quot;_blank&quot;&gt;Apache Maven Bundle Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/w11k/bnd4sbt&quot; target=&quot;_blank&quot;&gt;Bnd4sbt&lt;/a&gt; - Bundling tool for Scala application&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.gradle.org/current/userguide/osgi_plugin.html&quot; target=&quot;_blank&quot;&gt;Gradle OSGi Plugin&lt;/a&gt;&amp;nbsp;- A Gradle based OSGi plugin. Gradle is a Groovy based builder.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.aqute.biz/Bnd/Ant&quot; target=&quot;_blank&quot;&gt;Ant&lt;/a&gt; - Available as an ant task&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jetbrains.com/idea/help/osmorc.html&quot; target=&quot;_blank&quot;&gt;Osmorc &lt;/a&gt;- Plugin for IntelliJ IDEA&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22biz.aQute.bndlib%22&quot; target=&quot;_blank&quot;&gt;Command Line Utility&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
All of them however use the &lt;a href=&quot;http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22biz.aQute.bndlib%22&quot; target=&quot;_blank&quot;&gt;bnd library&lt;/a&gt;&amp;nbsp;at its heart. However here, the &lt;b&gt;BND &lt;/b&gt;tool command line utility can be handy to quickly wrap vanilla jars into OSGi bundles and do some basic analysis of the vanilla jars.&lt;br /&gt;
&lt;br /&gt;
The choice of tool is mostly a personal preference, and also driven on your development environment and workflow. I personally prefer the &lt;i&gt;Maven Bundle Plugin&lt;/i&gt;. However, irrespective of the tool used, there are a few fundamental principles which will help us wrap the bundles successfully. This need not be the best way, but has always helped me to build out OSGi bundles.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
For the Maven users&lt;/h3&gt;
To begin with, you can clone one of the projects - &lt;i&gt;ServiceMix Bundle Project &lt;/i&gt;or &lt;i&gt;Pax Tipi&lt;/i&gt; project, and add your own module to start out wrapping your bundle. If you need to manipulate the vanilla jar other than just adding the Manifest, you could consider using the &lt;i&gt;Maven Shade Plugin&lt;/i&gt; - as it is being used in the &lt;i&gt;ServiceMix &lt;/i&gt;bundle project.&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Setting up the lab&lt;/h2&gt;
First, I would recommend setting up an environment to test your OSGified library. You should have the following in your testing environment:&lt;br /&gt;
&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;b&gt;An OSGi container&lt;/b&gt; - Felix or Equinox or whatever you are using. Ensure that the version matches your target environment.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;The target OSGified jar&lt;/b&gt; - yeah we are not done yet, but this is the test target. We will perfect it over some iterations.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;The client bundle&lt;/b&gt; - the bundle where your code uses the API which exists in the target library (#2 above). You can use an OSGi activator (or the SCR activate) to run your code which will test if you have your library OSGified correctly.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;The supporting bundles in your target environment&lt;/b&gt;. This may range from logging bundles to that of XML parsers and so on. Just be as close as possible.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
All this environment should be something that is easy to provision and setup. I personally use a vanilla Felix instance with necessary environment bundles provisioned using &lt;b&gt;&lt;a href=&quot;https://ops4j1.jira.com/wiki/display/paxrunner/Pax+Runner&quot; target=&quot;_blank&quot;&gt;Pax Runner&lt;/a&gt;&lt;/b&gt;. However you are free to use the tool of your choice to do this provisioning. The objective is to be able to start, test and stop the OSGi container, make changes to your target OSGified bundle and client bundle and repeat. And you do need an environment which should be easy to provision. You can also consider using &lt;b&gt;&lt;a href=&quot;https://ops4j1.jira.com/wiki/display/PAXEXAM4/Pax+Exam&quot; target=&quot;_blank&quot;&gt;Pax Exam&lt;/a&gt; &lt;/b&gt;to setup this environment.&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Bundle it up!&lt;/h2&gt;
If the above setup gave you a success right away at your first try, then you need not read the rest of this writeup. But most often, we do not get it right at the first attempt. So then you will have to do some experimentation with the packaging of your bundle which will ultimately give you the success.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Realize what you need - single or family pack?&lt;/h3&gt;
It is important to understand and realize that what you ultimately need, and how the final target OSGified bundle will look depends on your use case. If operating in a pure and strict OSGi world, every library should be in its own bundle. In other cases, where there is no strict requirements around your dependencies being strictly separate bundles, you can combine a few libraries together to get a single bundle (or may be still a few more). However, both these ways of bundling has their own pros and cons.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Single bundles&lt;/b&gt; are the citizens of perfect OSGi world. This bundle would only represent one vanilla jar. The advantage of this approach is that you fully leverage the OSGi modularity. If there are multiple bundles which wants to use this library, one instance of this library would do (as long as the version requirements also match). &amp;nbsp;Your artifacts would be light. However, you may have to deal with and manage a lot of these bundles if the transitive dependencies of your target library is just too big.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Family pack&lt;/b&gt; - as I love to call it - is usually made by combining a related set of libraries together to form a single bundle. In Maven world, this often can be related to as the transitive dependencies. This kind of packaging may sometimes be necessitated by the library itself, which often has code which has hard, non-OSGi compliant &lt;a href=&quot;http://njbartlett.name/2010/08/30/osgi-readiness-loading-classes.html&quot; target=&quot;_blank&quot;&gt;bad OSGi practices&lt;/a&gt;&amp;nbsp;code for loading classes and resources, which requires some other dependent libraries to be on the same classpath (OK, you need to understand that in OSGi, every bundle has its own classpath). At other times this kind of packaging avoids you to manage a lot of bundles on your target environment. However, this would mean that tomorrow if another library needs to be added, which has one of the transitive dependencies that already exist somewhere in your existing family pack bundles, either you would duplicate the library over in your second family pack, or just expand your existing family pack. Family packs at times can also lead to &lt;i&gt;cyclic dependencies&lt;/i&gt; being created between bundles, which really is just evil.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Things to Remember&lt;/h3&gt;
Once you have decided the kind of packaging you require, you can move ahead and start creating and perfecting your bundle. The following are some of the things to be taken care of when you start your OSGification process:&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
1. Know what you are doing&lt;/h4&gt;
Unless the vanilla jar you are trying to wrap is really simple, you would have to understand OSGi a little bit deeper - especially what each of the manifest headers mean, and how it affects the classloading and resource resolution. What each of the BND instructions mean and how it affects the bundle being generated. Read the BND documentation, and also the tool specific documentation - in my case the Maven Bundle Plugin&#39;s documentation.&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
2. Verify the vanilla jars versus your OSGified bundle&lt;/h4&gt;
Verify that the contents of the vanilla jar and your OSGified bundle to ensure that you preserve the packages and the resources contained therein, unless you intend it otherwise. The resources iteself may contain some configuratoin files that are required by the library to function, or it may have some licenses. You should be particularly be aware that almost all the licenses and notices require that you keep them in the derived products. If you are merging more than one library, you may have to consider renaming the resources - &lt;i&gt;Maven Shade Plugin&lt;/i&gt; can be useful here.&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
3. Perfect on the contract - Import and Export packages&lt;/h4&gt;
The &lt;i&gt;Export-Package&lt;/i&gt; and the &lt;i&gt;Import-Package&lt;/i&gt; are the primary contract of your OSGi bundle. What goes into these should be absolutely clear. Try to understand the library clearly, and export those packages which are API, and hide the internal implementations (some libraries hardly distinguish this fact, so that forces you to have not-so-perfect OSGi practices). Also ensure that your exported packages has a logically valid version. For instance, if you are OSGifiying itext-2.1.7, you could start with an &lt;i&gt;Export-Package&lt;/i&gt; of&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt; com.lowagie*;version=&quot;2.1.7&quot;&lt;/span&gt;.&lt;br /&gt;
&lt;br /&gt;
What to keep for &lt;i&gt;Import-Package&lt;/i&gt; is trickier sometimes. This is where you would have to experiment a bit. Start with all the import packages being optional (&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;*;resolution:=optional&lt;/span&gt;), and then once your client bundle is all working perfect, come back here and understand what is absolutely necessary for the library to function, and which are optional. As an example, some libraries may give out dependencies to JUnit classes. Now, why would someone depend on JUnit classes, so quietly remove them from the import packages. On the other hand, dependencies to JAXB libraries could possibly be made as optional one. All this depends on the library under consideration.&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
4. Ensure no BND warnings&lt;/h4&gt;
When you are perfecting the contract of Import and Export packages, ensure that you have no BND warnings. Especially around split packages. When you get the split packages, carefully study your vanilla jars (often split package warnings will come when you are making a family pack), and understand of how would you like to prioritize the packages across the libraries to apply the split-package instructions for BND.&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
5. Dealing with cyclic dependencies&lt;/h4&gt;
As mentioned before, multiple family packs can lead to cyclic dependencies. When this happens, carefully study the bundles involved in cyclic dependencies and the packages on which these links are formed, and carefully remove the cyclic dependency by either separating out one of the transitive jar as a separate OSGi bundle, or simply keep all the packages of such a library as private. Take the decision based on your situation.&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
6. Adjusting your client bundle&lt;/h4&gt;
At times, your bundle may be importing certain packages from the wrong bundle (instead of what you are intending). Example of such packages may be what is exported by the system bundle which is outdated, and you instead want your client bundle to import from a later version exported by a separate OSGi bundle. In these cases, use the version as your savior and explicitly restrict the package versions so that it would import from the bundle of your choice. Often the client bundle may have a relaxed import versioning, which makes it to import from the system bundle. When the version is stricter, you would often achieve what you intend to.&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
7. Classloader Hell&lt;/h4&gt;
At times you may get into situations that even after following all the instructions above, your library is unable to load some classes or resources. Carefully try to debug through the library&#39;s source code and see where actually the code fails. Also compare this execution to one in a non-OSGi environment, and you would be able to identify that in OSGi, the library is unable to instantiate a class or load a library, because of &lt;a href=&quot;http://njbartlett.name/2010/08/30/osgi-readiness-loading-classes.html&quot; target=&quot;_blank&quot;&gt;the way that the code is written&lt;/a&gt; to do that. In these cases, the last option may be to patch the library. Download the source code of the original library and make modifications to the offending classes and put it back to the OSGi bundle. Follow the OSGi best practices when you do dynamic class loading or resource loading.&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
8. Test thoroughly&lt;/h4&gt;
Test you client bundle thoroughly with all the possible use cases of using the library. If possible use the &lt;b&gt;Pax Exam&lt;/b&gt; to write a test suite to be sure that you are covering all the use cases. Everytime you run the above environment, you will realize - most often with OSGi resolution error messages or error stack traces that something went wrong. This information is key to identifying what has to be tweaked to get it working. Repeat the all the steps above through this step, until you are done.&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
9. Be license compliant&lt;/h4&gt;
Nothing technical, but respect the licenses of the libraries you are trying to OSGify.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
For AEM / CQ developers&lt;/h2&gt;
For sometime I have been working on the Adobe&#39;s marketing platform AEM /CQ which utilizes OSGi as the application container and so requires developers to package their code as OSGi bundles and many of them get panic when they have to OSGify an external dependency - especially when it is a complicated one. I have personally found that most of these AEM developers do not understand the OSGi beyond what is there in the product documentation. And this was my primary motivation for writing this article.&lt;br /&gt;
&lt;br /&gt;
I have made some shortcuts for kick-starting your OSGification process for AEM environment, by creating Pax Runner profiles for few AEM versions at my Github repository &lt;a href=&quot;https://github.com/ethomasjoseph/aem-pax-runner-profile&quot;&gt;https://github.com/ethomasjoseph/aem-pax-runner-profile&lt;/a&gt;. Feel free to tweak and use this and contribute to this if you find this useful.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Before you say - I am done (or not)!&lt;/h2&gt;
Bundling a vanilla jar - especially the complicated ones require a lot of patience and experience. A lot of the above instructions are dependent on the context of which library are you trying to work with and what exactly is the need of the hour. Weigh the choices to choose your track. Feel free to reach out to me (blog comments are OK), in case you want some help in OSGification of your vanilla jar.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Happy Bundling!!!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
References&lt;/h2&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.aqute.biz/Bnd/Bnd&quot; target=&quot;_blank&quot;&gt;BND&#39;s official site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://svn.apache.org/repos/asf/felix/releases/maven-bundle-plugin-2.5.0/doc/site/index.html&quot; target=&quot;_blank&quot;&gt;Maven Bundle Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wiki.apache.org/commons/CommonsOsgi&quot; target=&quot;_blank&quot;&gt;Apache Commons OSGi tracker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Instruction of creating bundle using Maven and BND&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://felix.apache.org/documentation/subprojects/apache-felix-commons/creating-bundles-using-bnd.html&quot;&gt;http://felix.apache.org/documentation/subprojects/apache-felix-commons/creating-bundles-using-bnd.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://spring.io/blog/2008/02/18/creating-osgi-bundles/&quot;&gt;http://spring.io/blog/2008/02/18/creating-osgi-bundles/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://gnodet.blogspot.in/2008/09/id-like-to-talk-bit-about-third-party.html&quot;&gt;http://gnodet.blogspot.in/2008/09/id-like-to-talk-bit-about-third-party.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://karaf.apache.org/manual/latest/developers-guide/creating-bundles.html&quot;&gt;https://karaf.apache.org/manual/latest/developers-guide/creating-bundles.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2015/09/the-secret-sauce-of-wrapping-jar-as.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-3246719424112213796</guid><pubDate>Wed, 04 Mar 2015 13:11:00 +0000</pubDate><atom:updated>2015-10-31T02:02:56.377+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">AEM</category><category domain="http://www.blogger.com/atom/ns#">CQ</category><category domain="http://www.blogger.com/atom/ns#">OAK</category><category domain="http://www.blogger.com/atom/ns#">Performance Tuning</category><title>Tuning your JCR Queries for the AEM &amp; Jackrabbit OAK</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Application tuning is an activity which which every developer and architect will encounter sooner or later for any application. AEM based applications are no different. One of the activities that is particularly important with &lt;a href=&quot;http://docs.adobe.com/docs/en/aem/6-0.html&quot; target=&quot;_blank&quot;&gt;AEM 6&lt;/a&gt; is query tuning. AEM 6 uses &lt;a href=&quot;http://jackrabbit.apache.org/oak/&quot; target=&quot;_blank&quot;&gt;Jackrabbit OAK&lt;/a&gt; as the repository and hence we would have to know more about OAK to tune the queries. Apart from tuning the queries itself a majority of the time you would be tuning your indexes based on the query. AEM itself uses a lot of queries within for the application to function. It is important to understand how the queries and the indexes work in AEM.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;u&gt;&lt;b&gt;Update:&lt;/b&gt;&lt;/u&gt; This post was not written as a generic performance tuning guideline for AEM, but just on tuning the queries on OAK repository. Although a lot of the performance depends on how well tuned is your repository. Adobe&#39;s recent service packs on AEM 6, and AEM 6.1 in general are much stable and performant. Please refer to the Adobe&#39;s documentation for &lt;/i&gt;&lt;a href=&quot;https://helpx.adobe.com/experience-manager/kb/performance-tuning-tips.html&quot; style=&quot;font-style: italic;&quot; target=&quot;_blank&quot;&gt;general guidelines on performance tuning&lt;/a&gt;&lt;i&gt;.&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
While the instructions herein are primarily written for AEM applications, non-AEM applications which uses Jackrabbit OAK can also benefit.&lt;br /&gt;
&lt;br /&gt;
There are no hard and fast rules that a particular index will work. This is very similar to database indexes. You would have to look at the current queries being fired and the current repository state and arrive at the best indexes. Often you arrive at the best indexes over time. You would have to apply an index and the re-evaluate your queries, then further tune your queries or try out a different index. Repeat these steps over and over again to find the best and optimized index.&lt;br /&gt;
&lt;br /&gt;
However, there are some basic guidelines which should be followed, which can help you define the best indexes to you application specific needs:&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Ground Rules (AEM Specific)&lt;/h2&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Apply the latest Service Pack available and Oak specific hotfixes (if applicable). As of date &lt;a href=&quot;http://docs.adobe.com/docs/en/aem/6-0/release-notes-sp2.html&quot; target=&quot;_blank&quot;&gt;SP-2&lt;/a&gt; is publicly available.&lt;/li&gt;
&lt;li&gt;AEM has some built in indexes as well. Do not arbitrarily re-index these OOTB indexes. Indexing is a costly and resource-intensive operation. OOTB indexes should be re-indexed only when specifically advised by Adobe (this is a catch - sometimes you know that re-indexing a particular OOTB index will solve your problem at hand, but get a buy-in from Adobe for this). At other times you would have to create a new index (type) since the OOTB / existing index is in-efficient.&lt;/li&gt;
&lt;li&gt;Be aware that there has been some important changes since &lt;a href=&quot;http://mail-archives.us.apache.org/mod_mbox/www-announce/201412.mbox/%3CCAGP5+Yq0BMW7OT6KevTCwj6__fsdxOFOVKE--_st+rjjjM6ecQ@mail.gmail.com%3E&quot; target=&quot;_blank&quot;&gt;OAK 1.0.9&lt;/a&gt; - especially related to Lucene indexes, hence be mindful about reference resources that advice about using OAK indexes. Check the &lt;a href=&quot;http://jackrabbit.apache.org/oak/docs/query/query.html&quot; target=&quot;_blank&quot;&gt;OAK&#39;s latest documenting on query and indexing&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Tools&lt;/h2&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;If you are using AEM, the best tool to help you debug and explain your queries, find out slow and popular queries is to install Adobe &lt;a href=&quot;http://adobe-consulting-services.github.io/acs-aem-tools/&quot; target=&quot;_blank&quot;&gt;AEM ACS Tools package&lt;/a&gt;&amp;nbsp;(0.0.20 and above). Once installed, you can have access it using the URL: &lt;a href=&quot;http:/#&quot;&gt;http://yourinstance/etc/acs-tools/explain-query.html&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;If the above is not possible, you may have to depend on JMX to find slow and popular queries, you can use the Felix console to identify slow and popular queries on any instance&amp;nbsp;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http:/#&quot;&gt;http://yourinstance/system/console/jmx/org.apache.jackrabbit.oak%3Aid%3D9%2Cname%3D&quot;Oak+Query+Statistics&quot;%2Ctype%3D&quot;QueryStat&quot;&lt;/a&gt;.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;You can also use the OSGi Service of &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;b&gt;org.apache.jackrabbit.api.jmx.QueryStatManagerMBean&lt;/b&gt;&lt;/span&gt; to programmatically find the slow and popular queries.&amp;nbsp;&lt;/li&gt;
&lt;ol&gt;&lt;pre class=&quot;brush:java&quot;&gt;queryStatManagerMBean.getSlowQueries().values()
queryStatManagerMBean.getPopularQueries().values()&lt;/pre&gt;
&lt;/ol&gt;
&lt;li&gt;Use the following debug logs for details on various aspects of query and indexing:&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;Enable DEBUG logging on &amp;nbsp;&lt;b&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;org.apache.jackrabbit.oak.query&lt;/span&gt;&lt;/b&gt; for logs to find the details on query cost calculation (explain)&lt;/li&gt;
&lt;li&gt;Enable DEBUG logging on &amp;nbsp;&lt;b&gt;&lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;org.apache.jackrabbit.oak.plugins.index&lt;/span&gt;&lt;/b&gt; for logs to find the details on indexing&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;Use JMX to have high level overview about lucene indexes (OOTB or custom):&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http:/#&quot;&gt;http://yourinstance/system/console/jmx/org.apache.jackrabbit.oak%3Aid%3D4%2Cname%3D&quot;Lucene+Index+statistics&quot;%2Ctype%3D&quot;LuceneIndex&quot;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;To look at the actual indexes, you can stop the AEM / Oak instance and use the &lt;b&gt;&lt;a href=&quot;http://search.maven.org/#search%7Cga%7C1%7Coak-run&quot; target=&quot;_blank&quot;&gt;oak-run&lt;/a&gt;&amp;nbsp;&quot;console&lt;/b&gt;&quot; to explore the indexes among various other options:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;pre class=&quot;brush:bash;gutter: false;&quot;&gt;java -jar oak-1.1.6.jar explorer /path/to/crx-quickstart/repository/segmentstore&lt;/pre&gt;
(oak repository)&lt;/li&gt;
&lt;li&gt;On the resulting console, run the following command, to dump the index into file system:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;pre class=&quot;brush:bash;gutter: false;&quot;&gt;lc dump path/to/dump /path/to/luceneIndex/inRepository&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;eg. &lt;pre class=&quot;brush:bash;gutter: false;&quot;&gt;lc dump path/to/dump /oak:index/myCustomLuceneIndex&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Now &lt;a href=&quot;http://lingpipe-blog.com/2012/07/24/using-luke-the-lucene-index-browser-to-develop-search-queries/&quot; target=&quot;_blank&quot;&gt;analyse the resulting dump&lt;/a&gt; using Lucene Index analyser tool &lt;b&gt;&lt;a href=&quot;https://code.google.com/p/luke/&quot; target=&quot;_blank&quot;&gt;Luke&lt;/a&gt;&lt;/b&gt;:&lt;/li&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://4.bp.blogspot.com/-skwy0BAb2b8/VO4b5DMxyDI/AAAAAAAAEq8/fgWuzmCcp0A/s1600/luke.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;263&quot; src=&quot;http://4.bp.blogspot.com/-skwy0BAb2b8/VO4b5DMxyDI/AAAAAAAAEq8/fgWuzmCcp0A/s1600/luke.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/ul&gt;
&lt;/ol&gt;
&lt;pre class=&quot;brush:bash;gutter:false;&quot;&gt;java -XX:MaxPermSize=512m -classpath luke-with-deps.jar;oak-lucene-1.1.6.jar org.getopt.luke.Luke&lt;/pre&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;
&lt;li&gt;The following jars needs to be used:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;The luke-with-deps.jar can be downloaded from &lt;a href=&quot;https://github.com/DmitryKey/luke/releases&quot;&gt;https://github.com/DmitryKey/luke/releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The oak-lucene-1.1.6.jar can be &lt;a href=&quot;http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22org.apache.jackrabbit%22%20AND%20a%3A%22oak-lucene%22&quot; target=&quot;_blank&quot;&gt;downloaded &lt;/a&gt;from Maven repository as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ol&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Guidelines&lt;/h2&gt;
&lt;div&gt;
The basic steps for tuning your queries can be summarized as follows:&lt;/div&gt;
&lt;div&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Identify the slow queries in your system. This could be the one that takes a lot of time to execute primarily because there are not proper indexes and there are node traversals happening. The system itself can be queries through JMX to identify the slow and popular queries.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Tune your queries to ensure that you can use indexes whenever possible.&lt;/li&gt;
&lt;li&gt;Identify properties and nodes that needs to be indexed, based on the slow queries identified, and create Oak indexes for them.&lt;/li&gt;
&lt;li&gt;Verify your queries and indexes after creating indexes. The indexes are optimum if the cost of the queries identified are lowest - 0 being the best.&lt;/li&gt;
&lt;li&gt;Repeat steps 3 and 4 above (by even creating different indexes for the same query) till the most cost effective index is created.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Identification of Slow Queries&lt;/h3&gt;
Identify the slow queries by monitoring the error.log. Note the queries which traverses many nodes, where the log may look something like:&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;&lt;pre class=&quot;brush:bash;gutter: false;&quot;&gt;org.apache.jackrabbit.oak.spi.query.Cursors$TraversingCursor Traversed 1000 nodes
... consider creating an index or changing the query&amp;nbsp;&lt;/pre&gt;
&lt;/ul&gt;
&lt;/ol&gt;
&lt;div&gt;
You can also identify the slowest and popular queries in the system (which the Jackrabbit Oak keeps track of) using JMX or Adobe AEM Commons as described in the &quot;Tools&quot; section above.&lt;/div&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;&lt;/ul&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Indexing&lt;/h3&gt;
&lt;/div&gt;
For the same query you can create multiple indexes. However choose the one to be promoted to your production instances which prove to be the the best in terms of achieving lower cost to the query at hand.&lt;br /&gt;
&lt;br /&gt;
Consider the following when deciding the type of index to be used:&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;&lt;ol&gt;
&lt;li&gt;Full Text Index Types&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Lucene &amp;amp; Solr&lt;/li&gt;
&lt;li&gt;Aggregate Index - query time aggregation&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Lucene Property Index&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Since OAK-1.0.9 Lucene Property indexes are preferred indexes over other type of indexes&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Async&lt;/li&gt;
&lt;li&gt;Combines properties &amp;amp; full-text.&lt;/li&gt;
&lt;li&gt;Supports property condition, range conditions, ordering, full-text&lt;/li&gt;
&lt;li&gt;Index-time aggregation - performance improvements&lt;/li&gt;
&lt;li&gt;Using Lucene &amp;amp; Solr.&lt;/li&gt;
&lt;li&gt;Follow instructions for creating the index nodes as in the &lt;a href=&quot;http://jackrabbit.apache.org/oak/docs/query/lucene.html&quot; target=&quot;_blank&quot;&gt;OAK&#39;s Lucene documentation&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;&lt;b&gt;Property Index&lt;/b&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Default Indexes&lt;/li&gt;
&lt;li&gt;Synchronous&lt;/li&gt;
&lt;li&gt;Unique or Non-Unique&lt;/li&gt;
&lt;li&gt;eg. UUID&lt;/li&gt;
&lt;li&gt;property equals query works best&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;NodeType Index&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Internally Uses Property Index&lt;/li&gt;
&lt;li&gt;Uses primaryType and mixins to identify nodes&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Traversing Index&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Traverses Repo&lt;/li&gt;
&lt;li&gt;Does not store any data&lt;/li&gt;
&lt;li&gt;Used to retrieve the given path or its child nodes (sometimes the parent nodes as well)&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Ordered Index&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Async&lt;/li&gt;
&lt;li&gt;Not recommended of nodes &amp;gt; 1000 nodes&lt;/li&gt;
&lt;/ul&gt;
&lt;/ol&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;
Index Management&lt;/h3&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Currently, the indexes can be found under /oak:index/ on AEM.&lt;/li&gt;
&lt;li&gt;Once you have identified the best indexes, plan to install them as a package on AEM.&lt;/li&gt;
&lt;li&gt;Re-indexing is usually not needed. However when you see degrade in system performance, do double check your existing indexes if it would need a re-index.&lt;/li&gt;
&lt;li&gt;Re-index is a costly and resource intensive operation. Use it only when any oak upgrade or &amp;nbsp;mentioned explicitly in release doc for any patch or hotfix&lt;/li&gt;
&lt;li&gt;Avoid having multiple properties in index , it may slow your query , its recommended to have one index for each property.&lt;/li&gt;
&lt;li&gt;Set the system property &amp;nbsp;oak.queryLimitInMemory to 200000 (or something similar). This will limit the traversal of the nodes to that number&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
Finally...&lt;/h2&gt;
Jackrabbit Oak is a project under active development, especially around the area of Indexing. Hence please check official documentation for details. Indexing and tuning requires a lot of observation and practice to get perfect.&lt;br /&gt;
&lt;br /&gt;
I would recommend watching a &lt;a href=&quot;http://dev.day.com/content/ddc/en/gems/aem-6-oak--mongomk-and-queries.html&quot; target=&quot;_blank&quot;&gt;webinar on this topic&lt;/a&gt;&amp;nbsp;by Thomas Muller and Marcel Reutegger on AEM Gems, which is a bit old (before OAK-1.0.9 was released), but immensely useful to understand indexing on Jackrabbit Oak.&lt;br /&gt;
&lt;br /&gt;
Happy Indexing!!!&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2015/03/tuning-your-jcr-queries-for-aem.html</link><author>noreply@blogger.com (Thomas Joseph)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-skwy0BAb2b8/VO4b5DMxyDI/AAAAAAAAEq8/fgWuzmCcp0A/s72-c/luke.png" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-5587790323262857828</guid><pubDate>Sat, 13 Jul 2013 08:12:00 +0000</pubDate><atom:updated>2014-06-30T09:28:07.408+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">OSGi</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><title>Writing method with dynamic return type without type casting</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I have often come across this requirement across multiple projects, where we need to write a method, which can potentially return object of any class, and still you would not like to do a typecasting. Something like this:&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;MyClass myClass = getDynamicClass(MyClass.class);
&lt;/pre&gt;&lt;br /&gt;
Instead of :&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;MyClass myClass = (MyClass) getDynamicClass(MyClass.class);
&lt;/pre&gt;&lt;br /&gt;
Common example of such use case is where you would do some lookup of a dynamic service (as in OSGi) and return the object found. However, with Java 5 and above this is easy. So, if your earlier code was:&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;protected Object getDynamicClass(Class interfaceClass) {
    Object obj = null;
    // code to create / lookup the dynamic object
    return obj;
}
&lt;/pre&gt;This code can be converted as follows:&lt;br /&gt;
&lt;pre class=&quot;brush: java&quot;&gt;protected &amp;lt;ReturnType&amp;gt; ReturnType getDynamicClass(Class&amp;lt;ReturnType&amp;gt; interfaceClass) {
    Object obj = null;
    // code to create / lookup the dynamic object
    if (interfaceClass.isInstance(obj)) {
        return interfaceClass.cast(obj);
    }
    return null;
}
&lt;/pre&gt;This is very obvious code, but thought that sharing this would be useful. Enjoy!&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2013/07/writing-method-with-dynamic-return-type.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-2258246597497350671</guid><pubDate>Mon, 25 Mar 2013 15:30:00 +0000</pubDate><atom:updated>2013-03-25T21:00:54.298+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><title>Installing Java Plugin for Ubuntu / Linux for multiple users</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
If you are a&amp;nbsp;Linux&amp;nbsp;user like me and have encountered websites that require applet, you may be ok installing the default Java that comes with your distro, and most of the time you may be good to go with it.&lt;br /&gt;
&lt;br /&gt;
But at times you may specifically want to install Sun Java on your system. Since Oracle has licensing restrictions, distros like Ubuntu do not have Sun Java in their repositories, and you will have to resort to some &lt;i&gt;&quot;longer&quot;&lt;/i&gt; ways of installing Java as explained in &lt;a href=&quot;https://help.ubuntu.com/community/Java&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; for Ubuntu.&lt;br /&gt;
&lt;br /&gt;
But even by following the &lt;i&gt;&quot;longer&quot;&lt;/i&gt; ways, you may be still annoyed when your browser says that Java plugin is missing (it happened for me for my Ubuntu 12.04). Or else, even when it may be working for you, it may not be working for other users on your computer, and you may have to create soft links to Java plugin executable in &lt;tt&gt;.mozilla/plugins&lt;/tt&gt; directory of every user&#39;s home.&lt;br /&gt;
&lt;br /&gt;
Assuming that you have already installed Java flavor of your choice, and want to enable Java plugin for your browser for every user of your computer, just create a soft link to the Java plugin executable under &lt;tt&gt;/usr/lib/mozilla/plugins/&lt;/tt&gt; directory.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;cd /usr/lib/mozilla/plugins

ln -s /usr/lib/jvm/jdk1.7.0_17/jre/lib/amd64/libnpjp2.so
&lt;/pre&gt;
&lt;br /&gt;
...and you are good to go. Now you can refresh your browser containing the applet to see that it is working, or you can test it at the Java&#39;s official test page &lt;a href=&quot;http://www.java.com/en/download/testjava.jsp&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;. For me here is how my browser looked after I configured Java as above:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://4.bp.blogspot.com/-xlwDwIDiZi8/UVBtIu5gCFI/AAAAAAAACAs/xgGXpyVQ39g/s1600/How+do+I+test+whether+Java+is+working+on+my+computer%3f+-+Chromium_001.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;286&quot; src=&quot;http://4.bp.blogspot.com/-xlwDwIDiZi8/UVBtIu5gCFI/AAAAAAAACAs/xgGXpyVQ39g/s400/How+do+I+test+whether+Java+is+working+on+my+computer%3f+-+Chromium_001.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2013/03/installing-java-plugin-for-ubuntu-linux.html</link><author>noreply@blogger.com (Thomas Joseph)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-xlwDwIDiZi8/UVBtIu5gCFI/AAAAAAAACAs/xgGXpyVQ39g/s72-c/How+do+I+test+whether+Java+is+working+on+my+computer%3f+-+Chromium_001.png" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-2785765045149232447</guid><pubDate>Fri, 27 Apr 2012 07:44:00 +0000</pubDate><atom:updated>2012-04-28T09:07:24.714+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">html5</category><category domain="http://www.blogger.com/atom/ns#">web 2.0</category><title>Know your Geolocation right away with HTML5</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Wondered how Google Maps tracks you current location? HTML5! Thats what enables most of the modern-day applications to track down your current location.&lt;br /&gt;
&lt;br /&gt;
You can do it too right away!&lt;br /&gt;
&lt;br /&gt;
Open up your JavaScript/Firebug console. You can hit F12 to work on most of the browsers. And paste the following JavaScript code snippet.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;navigator.geolocation.getCurrentPosition(function(position){console.log(position);});
&lt;/pre&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;navigator.geolocation.getCurrentPosition(function(position){alert(position.coords.longitude + &quot; / &quot; +&amp;nbsp;position.coords.latitude);});&lt;/pre&gt;
&lt;br /&gt;
Did you see a confirmation asked on your browser? Allow it! Thats it! It was so simple. You can now see your location in terms of longitude and latitude on the console. You can use this data along with Google Maps API to spot your location on a map.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
  Earlier and now...&lt;/h2&gt;
Earlier, before HTML5, the user&#39;s IP was determined and so was the location tracked. Some sites provided friendly ways to do this such as&amp;nbsp;&lt;a href=&quot;http://www.geoplugin.net/&quot;&gt;http://www.geoplugin.net&lt;/a&gt;. With HTML5, if your browser supports HTML5, this should work whether on a mobile, tablet or on a conventional desktop. Although this way of location tracking won&#39;t show up much difference to earlier approach on a desktop, it would sure show a difference if you use it on your mobile with GPS enabled.&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;
  More to read...&lt;/h2&gt;
The API that was used above is one of the many available for location tracking. You can read more about HTML5 location tracking at the following links:&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.w3.org/TR/geolocation-API/&quot;&gt;http://www.w3.org/TR/geolocation-API/&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://html5demos.com/geo&quot;&gt;http://html5demos.com/geo&lt;/a&gt;&amp;nbsp;(DEMO)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mobile.tutsplus.com/tutorials/mobile-web-apps/html5-geolocation/&quot;&gt;http://mobile.tutsplus.com/tutorials/mobile-web-apps/html5-geolocation/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2012/04/know-your-geolocation-right-away-with.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-1341798160475359440</guid><pubDate>Sun, 28 Aug 2011 07:51:00 +0000</pubDate><atom:updated>2012-04-28T09:08:32.454+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">CQ</category><category domain="http://www.blogger.com/atom/ns#">CQ5</category><category domain="http://www.blogger.com/atom/ns#">Day CQ</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">OSGi</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><title>Developing Java / OSGi applications on Day CQ</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
Day CQ is a very popular enterprise CMS (Content Management System) suite from Adobe. Although most of the time the development on Day CQ is related to CMS and most of the development can be mapped to a proper CMS system, there are times when you would need to develop some logic in your application, or need to develop some feature that may not be available readily within Day CQ. In these cases, you may need to write some application code.&lt;br /&gt;
&lt;br /&gt;
Day CQ is a Java based software, and Java is the most popular way to develop custom features and application logic. To be specific, Day CQ is largely built using OSGi - a technology that enables you to develop truly modular applications. Developing any custom Java application modules also needs to be built on OSGi.&lt;br /&gt;
&lt;br /&gt;
I have noticed that developing OSGi modules is often a pain for a CMS developer, largely because of the lack of full development support&amp;nbsp; (or call it a buggy development support) from the CRXDE (The bundled Eclipse based IDE), which makes OSGi module development to take long time and painful. This post intends to give more insights to a CQ developer on OSGi, and also to do faster development of OSGi modules with OSGi.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;

&lt;span style=&quot;font-size: x-large;&quot;&gt;Why the development pain?&lt;/span&gt;&lt;/h2&gt;
Why is OSGi development painful with vanilla Day CQ development environment? Day CQ provides an Eclipse based IDE called as CRXDE. It is excellent for typical CMS development, but when it comes to developing Java applications, it lacks a lot of features, where a regular Eclipse (or your favorite IDE) will win.&lt;br /&gt;
&lt;br /&gt;
CRXDE is not a Eclipse plugin, but rather an RCP application. For this reason, we cannot add any plugins to the CRXDE, as in a regular Eclipse. For this reason, it is not possible to create a regular Java/Maven project in CRXDE, and regular Java development is not possible. Although CRXDE allows us to write Java code, it is buggy. I have often encountered unwarranted compilation errors in Java code. Moreover, we cannot enhance the IDE with any plugin, such as Maven, which is useful for dependency resolution.&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;

&lt;span style=&quot;font-size: x-large;&quot;&gt;Utilize the expertise&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
It would have been the best thing, if CRXDE was available as an 
Eclipse plugin. But since it is not, we will explore options where we 
will develop OSGi bundles where we will use the tools for which they are good at. Use CRXDE for regular CMS development - 
develop templates, components, workflows etc. Use regular Eclipse (or 
your favorite IDE) for Java / OSGi development. Use Maven for build and 
dependency resolution.&lt;br /&gt;
&lt;br /&gt;
One
 may have some workarounds with CRXDE itself, but again, if we follow 
the approach I give below, it would be save a lot of our development 
time, apart from the ease of development.&lt;br /&gt;
&lt;br /&gt;
How each of these tools are used independently is beyond the scope of this post, but rather my focus here is to provide an approach to use these tool in a collaborative manner to make CQ development easy. That apart, we will use few more toolis specific to OSGi, that will make our life simpler when developing OSGi bundles.&lt;br /&gt;
&lt;br /&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;

&lt;span style=&quot;font-size: x-large;&quot;&gt;Developing bundles for Day CQ&lt;/span&gt;&lt;/h3&gt;
Let me outline the approach on how we will develop, test and finally deploy the OSGi bundles on Day CQ and see it working.&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Make a Maven project which can create OSGi bundles.&lt;/li&gt;
&lt;li&gt;Write code and install the bundles in local maven repository.&lt;/li&gt;
&lt;li&gt;Test the bundle &lt;/li&gt;
&lt;li&gt;Configure Day CQ&#39;s Felix web console to install bundles just created&lt;/li&gt;
&lt;li&gt;Test the Day CQ applications for the bundle just created.&lt;/li&gt;
&lt;/ul&gt;
Let me demonstrate the approach with the famous &quot;Hello World&quot; example, since it is better than giving abstract instructions and code samples. We will create three bundles:&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;a hello world API bundle&lt;/li&gt;
&lt;li&gt; a hello world Service implementation bundle&lt;/li&gt;
&lt;li&gt;a client test bundle which will utilise the hello world service&lt;/li&gt;
&lt;/ol&gt;
Note however, that this approach will be more useful when you have complex requirements and more external maven dependencies.&lt;br /&gt;
&lt;br /&gt;
I have made this &quot;Hello World&quot; application available on &lt;a href=&quot;https://github.com/ethomasjoseph/javabumps/tree/master/osgi/hello-world&quot;&gt;github&lt;/a&gt;.&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;text-align: left;&quot;&gt;

&lt;span style=&quot;font-size: large;&quot;&gt;Create a Maven Project for your OSGi bundle&lt;/span&gt;&lt;/h3&gt;
I suggest to use Maven for your OSGi bundle projects because:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Maven is excellent in managing all the dependencies &lt;/li&gt;
&lt;li&gt;Creating OSGi bundles with Maven Bundle Plugin cannot get simpler. It automatically takes care of including any headers required due to the transitive dependencies.&lt;/li&gt;
&lt;li&gt;The learning from Maven can always be reused in your other projects as well, since Maven focuses on convention over configuration.&lt;/li&gt;
&lt;/ul&gt;
I prefer to use the following configuration for Maven Bundle Plugin:&lt;br /&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;plugin&amp;gt;
 &amp;lt;groupId&amp;gt;org.apache.felix&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;maven-bundle-plugin&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;${bundle-plugin.version}&amp;lt;/version&amp;gt;
 &amp;lt;extensions&amp;gt;true&amp;lt;/extensions&amp;gt;
 &amp;lt;configuration&amp;gt;
  &amp;lt;instructions&amp;gt;
   &amp;lt;Bundle-Name&amp;gt;${project.name}&amp;lt;/Bundle-Name&amp;gt;
   &amp;lt;Bundle-Description&amp;gt;${project.description}&amp;lt;/Bundle-Description&amp;gt;
   &amp;lt;Export-Package&amp;gt;${bundle.namespace};version=&quot;${project.version}&quot;&amp;lt;/Export-Package&amp;gt;
   &amp;lt;Private-Package&amp;gt;${bundle.namespace}.internal.*&amp;lt;/Private-Package&amp;gt;
   &amp;lt;_removeheaders&amp;gt;Ignore-Package,Include-Resource,Private-Package,Embed-Dependency&amp;lt;/_removeheaders&amp;gt;
   &amp;lt;_include&amp;gt;-osgi.bnd&amp;lt;/_include&amp;gt;
  &amp;lt;/instructions&amp;gt;
 &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
Here I have a osgi.bnd file place besides the pom.xml which has any specific instructions that needs to be provided to the bnd when creating the bundle. This will also override any instructions that are provided at the POM level (eg. some inherited instructions). For more details on the plugin, visit the &lt;a href=&quot;http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html&quot;&gt;official documentation&lt;/a&gt; for the Maven bundle plugin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;h2 style=&quot;text-align: left;&quot;&gt;

&lt;span style=&quot;font-size: x-large;&quot;&gt;What&#39;s next?&lt;/span&gt;&lt;/h2&gt;
I have given a heads up on a less painful and more robust method to develop OSGi bundles for Day CQ. But there are more things, that can make things easier when developing applications on Day CQ. This would require a more deep dive into OSGi, and I will try to illustrate approaches that uses OSGi&#39;s best practices while making the OSGi development easy.&lt;br /&gt;
&lt;br /&gt;
So mark this space for more on OSGi development with Day CQ!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2011/08/developing-java-osgi-applications-on.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-8167879025231205486</guid><pubDate>Sat, 03 Jul 2010 06:48:00 +0000</pubDate><atom:updated>2010-07-03T12:22:42.328+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Eclipse</category><category domain="http://www.blogger.com/atom/ns#">Java</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><title>Solving eclipse error with SVN 1.6 (loading JavaHL library)</title><description>If you are using Eclipse and SVN (Subversion), there are high chances that you are using the Eclipse plugin - &lt;a href=&quot;http://subclipse.tigris.org&quot;&gt;Subclipse&lt;/a&gt;. And if you recently upgraded to subclipse 1.6, there is a good chance that you have encountered the error or loading JavaHL Library, that says something like this:
&lt;br/&gt;

&lt;blockquote&gt;&lt;strong&gt;Problem:&lt;/strong&gt;
&lt;pre class=&quot;brush: plain&quot;&gt;
Failed to load JavaHL Library.
These are the errors that were encountered:
no libsvnjavahl-1 in java.library.path
no svnjavahl-1 in java.library.path
no svnjavahl in java.library.path
java.library.path = /opt/jdk/64/jdk1.6.0_20/jre/lib/amd64/server:/opt/jdk/64/jdk1.6.0_20/jre/lib/amd64:/opt/jdk/64/jdk1.6.0_20/jre/../lib/amd64:/usr/lib64/xulrunner-addons:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
&lt;/pre&gt;&lt;/blockquote&gt;

&lt;br/&gt;
If this is the case, then few tips to get this working. As always, I will suggest solutions with the least number of steps, and all simple.
&lt;ol&gt;
&lt;li&gt;When installing/updating subclipse 1.6, use the update site - http://subclipse.tigris.org/update_1.6.x/ from within Eclipse.&lt;/li&gt;
&lt;li&gt;The installation screen shows the features. Make sure that all features marked &quot;required&quot; are selected for installation. (You will anyway be not allowed to proceed otherwise).&lt;/li&gt;
&lt;/ol&gt;
&lt;br/&gt;
If it still does not work, it is highly possible that the Java native libraries required for the SVN to work together with Java (thats Java HL) is not available to the Java. Either not installed or just that Java is not able to find it.
&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;1. Install Java HL&lt;/h3&gt;
You can refer to &lt;a href=&quot;http://subclipse.tigris.org/wiki/JavaHL#head-7498d204a5be83e0e97d196ba75fc797d5f0c822&quot;&gt;here&lt;/a&gt; for a generic discussion on this topic, especially for Windows and Mac OS. For Linux, I have simpler solutions :).
&lt;br/&gt;
Install through your package manager, a package named &lt;code&gt;libsvn-java&lt;/code&gt;, that contains the JavaHL. You must make sure that it is for SVN 1.6.
&lt;br/&gt;
For Ubuntu or other Debian based Linux, the command should be handy:
&lt;pre class=&quot;brush: bash&quot;&gt;
sudo  apt-get install libsvn-java
&lt;/pre&gt;


&lt;br/&gt;
However, it is possible that the installation is requiring you to install the whole Java binaries itself, although you already have one (an old version, or a manually configured Java for example), and you are not willing to install the Java packages. In that case, just go to your package maintainer&#39;s site, and manually download the package, and unzip it to your system  (yes, you will need root permissions), so that the dependencies are not installed.
&lt;br/&gt;&lt;br/&gt;
If you had installations fine, without any hacks, restarting Eclipse should get your Subclipse working. If not, follow what is below.

&lt;br/&gt;
&lt;h3&gt;2. Make Eclipse runtime aware of the new JavaHL binaries.&lt;/h3&gt;.
There are two options for doing this:
&lt;ol&gt;
&lt;li&gt;Tell JVM/Eclipse about the JavaHL libraries when starting JVM with the system property, that points to the java library path where the JavaHL binaries are installed. eg:
&lt;pre class=&quot;brush: plain&quot;&gt;
   -Djava.library.path=/usr/lib/jni
&lt;/pre&gt;
This option can be specified in config.ini as well.
&lt;/li&gt;
&lt;li&gt;
Put the JavaHL binaries in paths that JVM normally searches for native libraries. Normally these paths are listed, in the error above. Above the paths are listed as:
&lt;pre class=&quot;brush: plain&quot;&gt;
java.library.path = /opt/jdk/64/jdk1.6.0_20/jre/lib/amd64/server:/opt/jdk/64/jdk1.6.0_20/jre/lib/amd64:/opt/jdk/64/jdk1.6.0_20/jre/../lib/amd64:/usr/lib64/xulrunner-addons:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

I went for the second option, since that one seemed most non-intrusive and easy to me. Let me show it how I did that:
&lt;ol&gt;
&lt;li&gt;Choose any of the listed Java library paths. In a terminal, move into that directory:&lt;/li&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;cd /usr/lib/jvm/java-6-sun/jre/lib/i386&lt;/pre&gt;
&lt;li&gt;
Make softlinks to the JavaHL libraries.
&lt;pre class=&quot;brush: bash&quot;&gt;
sudo ln -s /usr/lib/jni/libsvnjavahl-1.so libsvnjavahl-1.so
sudo ln -s /usr/lib/jni/libsvnjavahl-1.so.0 libsvnjavahl-1.so.0
sudo ln -s /usr/lib/jni/libsvnjavahl-1.so.0.0.0 libsvnjavahl-1.so.0.0.0
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;br/&gt;
Now restarting Eclipse should get everything working fine. If it does not, review your steps, and also read in full length about JavaHL from &lt;a href=&quot;http://subclipse.tigris.org/wiki/JavaHL&quot;&gt;http://subclipse.tigris.org/wiki/JavaHL&lt;/a&gt;, and try the steps again.&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2010/07/solving-eclipse-errors-with-svn-1-6.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-8761943781117941503</guid><pubDate>Thu, 24 Jun 2010 18:52:00 +0000</pubDate><atom:updated>2015-09-26T19:37:10.796+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><title>Running tomcat/webserver on port 80/443 without root permissions on Linux</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;h3&gt;
The Problem&lt;/h3&gt;
One of the concerns for web application developers is to run their web servers on the default port (which is 80 for HTTP, and 443 for HTTPS). However, since these ports are privileged ports (ports less that 1024 are privileged ports in Linux/UNIX), the developers are either required to run the server either as a root, or run on alternative non privileged ports such as 8080 or 8443. &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
The Solution&lt;/h3&gt;
While to the same problem, there may be different solutions, the most simplest of all that I found was to do local port forwarding. Again here, many do not like to fiddle with commands every time. An easier, and one time solution to this is to use a program called &quot;guidedog&quot;. &lt;br /&gt;
&lt;br /&gt;
Guidedog is a GUI based advanced and powerful networking configuration tool for Linux, that can be used for packet routing, NAT and port-forwarding. Although it is for KDE, your Linux package manager should be intelligent enough to make that work for you even if you do not use KDE. We will here use its port-forwarding feature. &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Steps&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Launch your favorite package manager tool (Synaptic/Aptitude/YUM etc) and install &quot;guidedog&quot;. For Ubuntu I use Synaptics Package manager, or even a command would do. &lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;sudo apt-get install guidedog
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Once installed, launch the application with root permissions (don&#39;t worry, you require it to do just once). &lt;br /&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;sudo guidedog&lt;/pre&gt;
&lt;br /&gt;
On Ubuntu, you can also find it under the menu Applications-&amp;gt;Other. You will have to even edit the menu command to &lt;code&gt;gksu guidedog&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;Move to the &quot;Forward&quot; tab. Add a new rule, such that TCP traffic on port 80 is forwarded to port 8080 (or whatever port your server runs on). Similarly, add another rule, such that TCP traffic on port 443 is forwarded to port 8443 (or whatever port your server runs on for HTTPS/SSL connections). After you are done, your screen should look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://static.openthoughtworks.com/images/guidedog.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img class=&quot;border&quot; src=&quot;http://static.ethomasjoseph.com/images/guidedog.png&quot; width=&quot;400px&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Apply the changes.&lt;/li&gt;
&lt;/ol&gt;
You are done. Now just hit on &lt;code&gt;localhost&lt;/code&gt; instead of &lt;code&gt;localhost:8080&lt;/code&gt;, next time you start your applications. &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;
Tool power&lt;/h3&gt;
The tool creates a system rule to forward the traffic to a different port(8080/8443) from its original destination (port 80/443) on the same machine. You can see in the tool that it is much more powerful, and can allow even port forwarding for other machines too, or even do IP Masquadering/NAT (Network Address Translation). However, explaining on these topics would outgrow the topic of this blog and would take more of your and my time too.&lt;/div&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2010/06/running-tomcatwebserver-on-port-80443.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-6216279000115585705</guid><pubDate>Mon, 24 May 2010 17:04:00 +0000</pubDate><atom:updated>2010-06-25T00:30:36.589+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><title>VNC via SSH tunneling</title><description>&lt;h2&gt;5 simple steps to connect through VNC to office/work PC via SSH tunneling&lt;/h2&gt;

&lt;h3&gt;Situation:&lt;/h3&gt;You have to connect to your office PC from home via VNC, but your office PC does not have a public IP. The only way to access your PC is through one of the access point machines provided by your office that can be reached through Internet.
&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Concept:&lt;/h3&gt;VNC port is 5900. You can ssh tunnel to your office PC through your office access point, and connect to this tunnel to have VNC connection.
&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Assumption:&lt;/h3&gt;&lt;strong&gt;Office access point machine:&lt;/strong&gt;&amp;nbsp;&lt;code&gt;accesspts1.company.com&lt;/code&gt;&lt;br/&gt;
&lt;strong&gt;Internal IP of your office machine:&lt;/strong&gt;&amp;nbsp;&lt;code&gt;192.168.1.31&lt;/code&gt;
&lt;br/&gt;&lt;br/&gt;
Also assume that your Office PC is switched on, and access point machine can access your office PC via the internal IP, and can access its ports as well.
&lt;br/&gt;&lt;br/&gt;

&lt;h3&gt;Steps:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;SSH to access point machine. Provide password when prompted&lt;br/&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;ssh username@accesspts1.company.com&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;Now that you are on access point machine, ssh from there to your office PC. Again provide password when prompted.&lt;br/&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;ssh username@192.168.1.31&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;On your office pc, start VNC server. Keep this terminal open.&lt;br/&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;x11vnc&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;On another terminal, make open a tunnel to your office pc via the access point. Provide the password for your access point machine when prompted.&lt;br/&gt;
&lt;pre class=&quot;brush: bash&quot;&gt;ssh -L 0.0.0.0:xxxx:192.168.1.31:5900 username@accesspts1.company.com&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;Use an VNC viewer to connect to your Office PC via the tunnel. Use the following details:&lt;br/&gt;
&lt;blockquote&gt;&lt;strong&gt;Host:&lt;/strong&gt; localhost&lt;br/&gt;
&lt;strong&gt;Port:&lt;/strong&gt; xxxx&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2010/05/vnc-via-ssh-tunneling.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-1161141756467491596</guid><pubDate>Tue, 30 Mar 2010 15:15:00 +0000</pubDate><atom:updated>2010-08-23T00:18:25.786+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">Project Management</category><title>Agility and more - better &amp; faster business solutions with software - part-3</title><description>In my previous &lt;a href=&quot;http://blog.openthoughtworks.com/2010/03/agility-and-more-better-faster-business_29.html&quot;&gt;posts&lt;/a&gt;, I discussed about practicing agile in real life, and why adapting the agile prescriptions is important. I discussed how the basic values of Agile manifesto narrates it all. This is my last post in this series, where I will explain about practices even beyond the direct agile prescriptions, that can help build faster and quality software with smiling teams.&lt;br /&gt;&lt;br /&gt;
&lt;h2&gt;





Some Agility and beyond&lt;/h2&gt;While the software creation itself is creative, the process employed to create this software is also creative. Its not just practicing agile, that helps create good software, there are more things to it. The craftsman (developer) who creates software has also to be given importance (Did I mention that before?). Let me discuss few of these things that include things from the Agile practices such as XP and Scrum, as well as those that go beyond them.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;
&lt;h3&gt;





XP practices&lt;/h3&gt;
Focus on producing better software with &lt;a href=&quot;http://martinfowler.com/articles/designDead.html&quot;&gt;XP practices&lt;/a&gt; such as &lt;a href=&quot;http://martinfowler.com/articles/continuousIntegration.html&quot;&gt;continuous integration&lt;/a&gt;, with focus on unit tests, integration tests, and automated functional/UAT tests. I do not want to go to the depth of CI and unit tests, but it helps you be confident on regressions, as the software evolves. There are few other inherent advices that Martin Fowler has with the CI such as &quot;&lt;i&gt;Keep the Build Fast&lt;/i&gt;&quot;, &quot;&lt;i&gt;Test in a Clone of the Production Environment&lt;/i&gt;&quot;, &quot;&lt;i&gt;Make it Easy for Anyone to Get the Latest Executable&lt;/i&gt;&quot; etc. I would highly recommend reading his article.&lt;br /&gt;
&lt;br /&gt;
Continuously try to clear up the &lt;a href=&quot;http://www.martinfowler.com/bliki/TechnicalDebt.html&quot;&gt;technical debts&lt;/a&gt;. Did a Quick Fix? Create a ticket that says,.. fix it! Removing old legacy and unused code - it helps developers avoid straying away to look at an unused code, to fix problems, and faster induction of new joiners to team. Old code also makes large codebase, maintenance problems, larger build time and lots of confusion.&lt;br /&gt;
&lt;br /&gt;
Equally important is a focus on continuous &lt;a href=&quot;http://en.wikipedia.org/wiki/Refactor&quot;&gt;refactoring&lt;/a&gt; for improved code readability reduced complexity and improved the maintainability and extensibility, for one or more of its benefits. This also helps clear our technical debts.&lt;br /&gt;
&lt;br /&gt;
Closely related to refactoring is the CI, that would help us to be sure that code refactoring is going fine. And to be confident in that a lots of test-cases needs to be in, that would ensure that there are no regressions. So develop a habit of writing unit test case for every bug or feature request. From my experience, going fully TDD (Test Driven Development) sounds like crazy as we develop all the tests-cases upfront, while having no test case or very scanty is also not a good practice. My experience is good to stay somewhere between - say at 50-85%, if we assume TDD to be 100% for writing test cases (use your mind and adapt!).&lt;br /&gt;
&lt;br /&gt;
The rule is simple. Start out lean, and consult Scrum and XP for places they are expert in. You need not take all their advice, but taking an advice is always good. Have something very technical - probably XP is good, other places Scrum is good, some other places - you get advice from both.&lt;br /&gt;
&lt;h3&gt;





Know your team velocity&lt;/h3&gt;
It is very important to know your teams velocity. What is the team capacity to crunch out the story points (or whatever measure you keep) given to them? If the team velocity is not known, it release dates predicted may not be credible. There are various ways to measure your team velocity. For example, you could measure your team velocity by recording the story points finished for a period of time, or measure the amount of original estimated hours that the team could finish for a period of time.&lt;br /&gt;
&lt;br /&gt;
Talking of this, it is important to remember that the efficiency (sometimes called the &lt;i&gt;Focus Factor&lt;/i&gt;) of the team is never 100%, since teams lose time doing unplanned items, doing context switches, helping other teams, checking their email, fixing network snag etc. With my experience, even when we had 9-6 working day, we normally counted it as 8 hours working day assuming the 1 hour lunch time as a normal organizational practice. However, when doing plannings, we used to calculate only 7 hours for a day, and hence allot only 6.5 - 7 hours of approximate work per person per day. That would be around 75-80% efficiency. However, you may like to bill your client w.r.t to all the time spent i.e 8 hours per day per person, which is perfectly fine! :)&lt;br /&gt;
&lt;br /&gt;
It may sound ridiculous to count 60% or 70% efficiency, but on real analysis of your team, it is normal to find such statistics. However, such a statistics is helpful to make realistic expectation from your team, and commit to reliable release dates.&lt;br /&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://lh4.ggpht.com/_yr1SU8wX2Ls/S6tHiORQrtI/AAAAAAAAAaA/_6ysni8HSCI/cumilative-flow-diagram.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img class=&quot;border&quot; height=&quot;206&quot; src=&quot;http://lh4.ggpht.com/_yr1SU8wX2Ls/S6tHiORQrtI/AAAAAAAAAaA/_6ysni8HSCI/cumilative-flow-diagram.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;Cumulative Flow diagram depicts the team velocity and the lead time required to finish items - helps to plan and minimise queues/waiting times.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;(&lt;i&gt;Image reproduced from the &lt;a href=&quot;http://www.infoq.com/minibooks/kanban-scrum-minibook&quot;&gt;InfoQ minibook&lt;/a&gt;&lt;/i&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Most organizations want to reduce lead time, and do get things done faster. Unfortunately many try to do this by getting more people in or working overtime. Usually the most effective way to get stuff done faster is to smooth out the flow and limit work to capacity, not add more people or work harder. This type of diagram shows why, and thereby increases the likelihood that the team and management will collaborate effectively.&lt;br /&gt;
&lt;br /&gt;
The velocity does not vary much, however, you will have to regularly measure your team velocity, since velocity may increase with experience and expertise. However, this velocity may not change drastically over successive iterations, except for may be the first few iterations, when you are still stabilising over the agile practices, or when the team is new to a project. Release planning with these statistics can would help achieve timely and reliable releases and yet prevent team burnouts.&lt;br /&gt;
&lt;h3&gt;





Clear goals and minimized wait times&lt;/h3&gt;
While focusing on individual productivity is important, it is also important to understand that they maintain their productivity when working as a team. One important factor that may hamper individual productivity when working as a team may be lack of clear goals on what to do next. Having a clear-cut road-map for not just for the day, for for the coming week itself may be good.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://lh6.ggpht.com/_Vtp_0kLqub4/S4G-krr-kBI/AAAAAAAAr1w/mbva9VBFmBg/s1600/Photos031.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img class=&quot;border&quot; src=&quot;http://lh6.ggpht.com/_Vtp_0kLqub4/S4G-krr-kBI/AAAAAAAAr1w/mbva9VBFmBg/s320/Photos031.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;Minimising wait times increases team throughput&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;(Image Courtesy: Vype&#39;s &lt;a href=&quot;http://picasaweb.google.com/trianglepics&quot;&gt;web album&lt;/a&gt;) &lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
Another factor to be considered is to reduce dependence on each other. Plan out the iteration road-map so that there is minimal dependence of one on the other. See that a team-member is not waiting for the other to finish. There may be dependence, but then, the timing can be adjusted for it. In manufacturing, a good importance is given to reduce queues of intermediate products to reduce costs and increase throughput. For software development, there is no silver bullet for this, however providing an execution plan upfront can help in this, since if developer knows what needs to be done for tomorrow or next week and something that is independent of the current work, they can go ahead and start doing that task, so that individual productivity remains high. Well planned iteration backlog, daily stand-ups and scrum principles of removing impediments can help a lot to this.&lt;br /&gt;
&lt;h3&gt;





Automate to Scale&lt;/h3&gt;
Try to bring automation to places wherever possible, since doing things manually doesn&#39;t scale, but machines can scale. That&#39;s how Google has achieved its excellence - by relying on algorithms and machines to scale rather than depending on humans. Automation can be brought at many places - CI, &lt;a href=&quot;http://martinfowler.com/articles/continuousIntegration.html#AutomateTheBuild&quot;&gt;intelligent builds&lt;/a&gt; for every commits, sending error reports of CI and builds, and other automated testing, smoke testing, functional testing, and even &lt;a href=&quot;http://martinfowler.com/articles/continuousIntegration.html#AutomateDeployment&quot;&gt;deployments&lt;/a&gt;. You will definitely avoid team burnouts!&lt;br /&gt;
&lt;h3&gt;





Reduce complexity of the software&lt;/h3&gt;
Reducing complexity in your software would help a long way in more than one ways to create good software. Well known agile and modularity guru &lt;a href=&quot;http://techdistrict.kirkk.com/about-kirk/&quot;&gt;Kirk Knoernschild&lt;/a&gt; explained in his keynote speech during the recent Jax London conference about reducing &lt;a href=&quot;http://techdistrict.kirkk.com/2010/02/17/osgi-devcon-preview/&quot;&gt;complexity in the software&lt;/a&gt;. But there is no silver bullet to this, though modularising application is a definite direction to this.&lt;br /&gt;
&lt;br /&gt;
Kirk further explains the cost of complexity with the following &lt;a href=&quot;http://users.jyu.fi/%7Ekoskinen/smcosts.htm&quot;&gt;statistics&lt;/a&gt;:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;The number of lines of code doubles every 7 years&lt;/li&gt;
&lt;li&gt;50% of development time is spent understanding code&lt;/li&gt;
&lt;li&gt;90% of software cost is maintenance and evolution&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
Look at the #2! So if complexity is reduced, time spent in understanding code is reduced, thereby speeding up the overall development process. It is natural for the systems to grow complex over time, and as system evolves, unless efforts are put in to reduce this complexity.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://lh5.ggpht.com/_R9dwm3RMQB8/ST08ZZv-e1I/AAAAAAAACAU/Lps5LwgU1HE/DSC05364%20%28small%29.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img class=&quot;border&quot; height=&quot;240&quot; src=&quot;http://lh5.ggpht.com/_R9dwm3RMQB8/ST08ZZv-e1I/AAAAAAAACAU/Lps5LwgU1HE/DSC05364%20%28small%29.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&quot;As a system evolves, its complexity increases unless work is done to 
maintain or reduce it.&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt; &quot;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;(Image Courtesy: Flavio&#39;s &lt;a href=&quot;http://picasaweb.google.com/byte964&quot;&gt;web album&lt;/a&gt;)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
There is more to reducing complexity in the code:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Write less code&lt;/li&gt;
&lt;li&gt;Build modular applications&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;





Write less code&lt;/h4&gt;
Avoid writing code whenever possible. The mantra is &quot;less is more&quot;. Avoid writing code that is not your main line of business. Many teams spend lot of time and energy writing huge chunks of code and configuration for creating &quot;&lt;i&gt;platforms&lt;/i&gt;&quot;. Platforms are necessary, but try to evolve it from existing and stable code libraries and frameworks as something that has the least glue code, so that your framework can evolve over time. For example, you need to have great amount of integration points in your application, before jumping ahead to write message brokers, message bus, and all those fancy ESB kind of features, consider one of those ESB&#39;s and message brokers available out in the open source or its commercial variant. Will the original author be available all through the project life-cycle to explain the code and intent? Who will maintain it? Will the subsequent maintainers fully understand the code and its intent? When we use popular libraries and frameworks, there is more chance of finding developers who already have knowledge in it.&lt;br /&gt;
&lt;br /&gt;
When developing internal frameworks, its imperative that we design for even what requirements may come after 10 years, but the fact is that even after just 4-6 years, you will be hardly using the same system. Technology may have changed, your requirements may have widely changed and you end to design another &lt;i&gt;framework&lt;/i&gt; to tackle those, or may have added a bunch of code to your existing system, and many of the capacities of your old &lt;i&gt;framework&lt;/i&gt; goes unused.&amp;nbsp; Still if you feel compelled to write some good amount of code for your framework, consider to market it separately or may be consider still better open sourcing it, so that you can early find co-developers, and build a community around that. Of course you can always commercially sell a software that you have open-sourced.&lt;br /&gt;
&lt;h4&gt;





Build modular applications&lt;/h4&gt;
While writing modular applications is like a very common vocabulary that we use and have this intent when we design our applications, the reality is that &lt;a href=&quot;http://njbartlett.name/blog/2010/03/17/osgi-and-how-it-got-that-way/&quot;&gt;achieving &quot;true&quot; modularity is difficult&lt;/a&gt;. Writing component based applications may provide some answer. For Java applications considering &lt;a href=&quot;http://www.osgi.org/&quot;&gt;OSGi&lt;/a&gt; may be a &lt;a href=&quot;http://blog.openthoughtworks.com/2008/07/osgi-add-dynamic-modularity-to-your.html&quot;&gt;good choice&lt;/a&gt;, that has been upheld by all the major application server vendors including IBM, Oracle and Sun. Recent JVM modularity to be introduced with Java 7 with &lt;a href=&quot;http://openjdk.java.net/projects/jigsaw/&quot;&gt;Jigsaw&lt;/a&gt;, and the Oracle&#39;s more recent modularity efforts with &lt;a href=&quot;http://qwylt.org/&quot;&gt;Qwylt&lt;/a&gt; are also interesting move towards this.&lt;br /&gt;
&lt;h3&gt;





Focus on developer productivity - tools and techniques continuously&lt;/h3&gt;
To have a faster development and lesser team burnouts, one very important factor is to focus on how effective is the software craftsman in performing the very act of producing software. It is important to look out to improve developer productivity at every act of the software development - project layout, development mode and development cycle time, running tests, IDE integration, build tool effectiveness, conventions over configuration, code and architecture complexity.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Unit tests and integration tests&lt;/b&gt; should be easy to run in all possible ways - with regular builds, test builds, CI builds, and even in IDEs. This helps to frequetnly run the tests withing IDE, and be confident on the code from the very beginning of writing code. This helps a lot especially when refactoring code. Running tests should be equally easy and simple from the command line as well.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Focus on conventions over configuration&lt;/b&gt; principles on all possible aspect of software development (including build - eg Maven). Although choice of &lt;a href=&quot;http://javamoods.blogspot.com/2010/02/maven-vs-ant-stop-battle.html&quot;&gt;build tool is not a religion&lt;/a&gt;, Maven is for one thing a great &lt;a href=&quot;http://www.leshazlewood.com/?p=55&quot;&gt;productivity improving&lt;/a&gt;, since once you learn Maven, you know it even when you change your projects. Adopting such practices also brings down the learning curve, and even new joiners can get productive quickly. Applying this principle is not just for project layout, but the overall architecture and day-to-day coding as well. &lt;/li&gt;
&lt;li&gt;&lt;b&gt;Watch out and remove impediments &lt;/b&gt;required for a fast build-run cycles. Does the build require punching in a lot of key strokes? Also watch out with continual performance tuning. Does running of you app, almost freezes a 3GB memory system? - High time that you lookout for memory leaks, and do application startup tweaks. At production you may be countering this with a massive server configuration, but think if trimming the code would actually save you on team&#39;s energy as well as on your server infrastructure money as well! The builds should be easiliy launched from within and outside IDE. If you have multiple IDEs, make sure that all the IDEs work just fine (Maven plugins are available for almost all major IDEs, that can help you do this).&lt;/li&gt;
&lt;li&gt;Strive to find tools that would make things easy and remove/ automate / lessen hassles and repetitious tasks. Tools need not be always visible, eg.. scrum and kanban are tools for process improvement, while &lt;a href=&quot;http://www.springsource.org/roo&quot;&gt;Spring ROO&lt;/a&gt; is also a tool that explicitly focuses on developer productivity. For instance promote &lt;a href=&quot;http://jquery.com/&quot;&gt;JQuery&lt;/a&gt; or similar JavaScript library instead of fully hand crafted JavaScripts.&lt;/li&gt;
&lt;li&gt;Carefully choose and use &lt;a href=&quot;http://en.wikipedia.org/wiki/Comparison_of_issue_tracking_systems&quot;&gt;issue tracking systems&lt;/a&gt;, and &lt;a href=&quot;http://en.wikipedia.org/wiki/Comparison_of_wiki_software&quot;&gt;wiki software&lt;/a&gt; for your requirements:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Choosing issue tracking systems with integration to your SCM. This would be good to track the commits for a particular issue, and ease code reviews.&lt;/li&gt;
&lt;li&gt;Use popular solutions:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;There is more probability of finding experienced users- less learning curve.&lt;/li&gt;
&lt;li&gt;You don&#39;t have to maintain that s/w which is not your mainline business.&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Consider Distributed SCM soultions like &lt;a href=&quot;http://git-scm.com/%20&quot;&gt;git&lt;/a&gt; or &lt;a href=&quot;http://mercurial.selenic.com/&quot;&gt;mercurial&lt;/a&gt; (Remember that this is just a tool, but it &lt;a href=&quot;http://www.joelonsoftware.com/items/2010/03/17.html&quot;&gt;helps manage changes&lt;/a&gt; rather than versions, and so that branching and merging is simple.).&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Have easy read code-bases, easy run executables and easy obtainable project artifacts. Martin Fowler nicely describes this in &lt;a href=&quot;http://martinfowler.com/articles/cotinuousIntegration.html#MaintainASingleSourceRepository&quot;&gt;his article&lt;/a&gt;, where I would like to highlight a &lt;i&gt;few&lt;/i&gt; items:&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Have everything you need to do a build should be in there including: test scripts, properties files, database schema, install scripts, and third party libraries. Note: Maven eases this out, since you have a separate system (a maven repository) to maintain third party library, and you would just put the dependencies in your POM. The basic rule of thumb is that you should be able to walk up to the project with a virgin machine, do a checkout, and be able to fully build the system. Putting in IDE configuration file is also a good practice. However, do not store the build products itself in the SCM., this rather indicates a flaky build technique that cannot reliably recreate builds.&lt;/li&gt;
&lt;li&gt;Keep your use of branches to a minimum. In particular have a &lt;i&gt;mainline&lt;/i&gt;: a single branch of the project currently under development. Pretty much everyone should work off this mainline most of the time. (Reasonable branches are bug fixes of prior production releases and temporary experiments.)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://martinfowler.com/articles/continuousIntegration.html#MakeItEasyForAnyoneToGetTheLatestExecutable&quot;&gt;Make it Easy for Anyone to Get the Latest Executable&lt;/a&gt; - To help make this work, anyone involved with a software project should be able to get the latest executable and be able to run it: for demonstrations, exploratory testing, or just to see what changed this week. Doing this is pretty straightforward: make sure there&#39;s a well known place where people can find the latest executable. An internal Maven repository for example is a great place.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
This discussion is not a comprehensive one describing each and every bottlenecks for faster development and increased productivity, but covers a lot of ground on it. You may share your own experiences and discussion points using the comments section in this blog.&lt;br /&gt;
&lt;h3&gt;





Technology, R&amp;amp;D and more&lt;/h3&gt;
&lt;b&gt;Encourage R&amp;amp;D within your organization&lt;/b&gt;.&lt;br /&gt;
Have a dedicated R&amp;amp;D team if possible. Swap people in and out of the R&amp;amp;D team. Encourage people in all teams to spend 20% time for doing something creative, or may be blog to start with. Consider putting people to R&amp;amp;D as an alternative to benching, if you have such a practice. Encourage the R&amp;amp;D team to publish their findings regularly through blogs and research papers. I will blog separately about the need for blogging. You can identify your gems working this way.&lt;br /&gt;
&lt;br /&gt;
The &lt;i&gt;80:20 principle&lt;/i&gt; at Google is there to bring out wild ideas from developer minds to be experimented. Some of the great projects from Google including GMail, Google News etc have been the result of such researching and experimenting mentality of Googlers.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Technology is still important!&lt;/b&gt;&lt;br /&gt;
As emphasized in the &lt;a href=&quot;http://blog.openthoughtworks.com/2009/03/domain-driven-design-in-10-minutes_31.html&quot;&gt;DDD&lt;/a&gt; principles - give good focus to the business at hand, but at the same time don&#39;t neglect technology. New technologies emerge to solve challenges that the existing ones cannot solve or because they are not efficient in doing that. This underlines the importance of using newer technology to solve our technical problems. Keep a balance however. It would not be recommend to use bleeding edge technology for production use, but encourage R&amp;amp;D learning to use the new technology &#39;wisely&#39; whenever needed and possible.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Community learning&lt;/b&gt;&lt;br /&gt;
Encourage your team to get involved with some good and popular open source project. This could also be a project something that you use yourself, or are planning to use in the near future. It has many benefits - when you officially can take part in OSS activities, you are getting better visibility to your company, apart from the learning that your team and company as a whole gains in the process. There are many ways in which the team can participate - participating in forums and discussions, filing bug reports (with test cases preferred), feature requests, subscribing to developer mailing lists if available,&amp;nbsp; and if possible - commit code, help with release etc. The team also gets better knowledge of good standard practices for software development - issue/ticket management, coding, testing, continuous integration, release, deployment etc.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://lh6.ggpht.com/_uNN_nz3Bwnk/Si584XEON9I/AAAAAAAADhQ/ZSSUVMAMQ44/IMG_6770.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img class=&quot;border&quot; height=&quot;240&quot; src=&quot;http://lh6.ggpht.com/_uNN_nz3Bwnk/Si584XEON9I/AAAAAAAADhQ/ZSSUVMAMQ44/IMG_6770.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;Community learning helps in many ways&lt;/span&gt;&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;(Image Courtesy: Horace Mann School&#39;s &lt;a href=&quot;http://picasaweb.google.com/HoraceMannSchool&quot;&gt;web album&lt;/a&gt;)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
Continuous improvement: Always look out for improvement - talk to peers, get ideas from them (that&#39;s why retrospectives are there). Encourage team to spot improvements or pain points in your projects and processes and seek solutions from them. Your team will be forced to think creatively, and you may in-fact get something useful! Have an open minded discussions before incorporating such changes (or rejecting suggestions) to the project.&lt;br /&gt;
&lt;h2&gt;





Solving your software development problems&lt;/h2&gt;
Agile is about iterations and incremental software development. This helps to build software that evolves over time with the customer requirements. Some prescriptions of agile practices such as from XP about CI, unit testing, helps to keep you confident in what you develop for each increment. &lt;br /&gt;
&lt;br /&gt;
That apart, looking at the discussions so far, and in the links there-in, we can deduce that its not just agility, there is more that helps you build better, and quality software. Agile practices with focus on developer productivity helps you release your software in a timely manner, yet maintaining the quality and budgets, while keeping your team happy and in high spirits.&lt;br /&gt;
&lt;h2&gt;





How to Start...?&lt;/h2&gt;
A difficult part to start anything new, is to get started. Very true for agile too!. Read a lot on agile, Scrum, Kanban and XP. Start with basic minimals on being agile&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Start stand-ups - focusing on highly communicated and focused team&lt;/li&gt;
&lt;li&gt;Start iterations - smaller the better&lt;/li&gt;
&lt;li&gt;Incorporate to retrospect your processes, code and techniques&lt;/li&gt;
&lt;li&gt;Never feel complete with improving your process - it should be a continuous process.&lt;/li&gt;
&lt;/ul&gt;
Good start would be to start lean, and then add prescriptions that work for you! And,... don&#39;t forget to adapt!&lt;br /&gt;
&lt;h2&gt;




Final Thoughts...&lt;/h2&gt;
This discussion, or few more blogs cannot cover everything related to software development. So much of literature is there around. Get inspired from those. Go ahead and start somewhere. You cannot start a perfect agile anyway! Over the time, you will improve with every iterations.



&lt;h3&gt;Update...&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/2010/03/agility-and-more-better-faster-business.html&quot;&gt;Part 1 of this blog series.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/2010/03/agility-and-more-better-faster-business_29.html&quot;&gt;Part 2 of this blog series.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2010/03/agility-and-more-better-faster-business_30.html</link><author>noreply@blogger.com (Thomas Joseph)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_yr1SU8wX2Ls/S6tHiORQrtI/AAAAAAAAAaA/_6ysni8HSCI/s72-c/cumilative-flow-diagram.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-4192900042549701478</guid><pubDate>Mon, 29 Mar 2010 14:30:00 +0000</pubDate><atom:updated>2010-08-23T00:19:53.038+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">Project Management</category><category domain="http://www.blogger.com/atom/ns#">software</category><title>Agility and more: better &amp; faster business solutions with software - part-2</title><description>In my previous &lt;a href=&quot;http://blog.openthoughtworks.com/2010/03/agility-and-more-better-faster-business.html&quot;&gt;blog post&lt;/a&gt;, I talked about why software development needs processes, and the need for agile in the processes. Here, I continue with the discussions, focusing on how the basic principles of agile itself has a lot to say, that can help us build better software.&lt;br /&gt;
&lt;h2&gt;
















Practicing agile - adapting is more important&lt;/h2&gt;
As mentioned before, the popular practiced tools for agile process include Scrum, Kanban and XP. But often, the process models/tools are applied as a religion, being strict on what the text prescribes. This has resulted in some &lt;a href=&quot;http://gilb.com/blogpost111-7-truths-about-Agile-and-Scrum-that-people-don-t-want-to-hear-Part-0-of-7&quot;&gt;rumblings&lt;/a&gt; that has questioned the effectiveness of agile processes to deliver quality and creative solutions to business. The InfoQ book on &lt;a href=&quot;http://www.infoq.com/minibooks/kanban-scrum-minibook&quot;&gt;Scrum and Kanban&lt;/a&gt; has highlighted the need for the process models to be adapted to their needs.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3384/3633561833_498dbbf48a.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img class=&quot;border&quot; height=&quot;320&quot; src=&quot;http://farm4.static.flickr.com/3384/3633561833_498dbbf48a.jpg&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;One size doesn&#39;t fit all -
 adapting is important.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;(Image Courtesy: Robin Skyler Tell&#39;s &lt;a href=&quot;http://www.flickr.com/photos/robinskyler/%20&quot;&gt;photostream&lt;/a&gt;)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
So what needs to be practiced is taking a lean model, and adapting it to your needs, probably by adding &quot;&lt;i&gt;prescriptions&lt;/i&gt;&quot; from the stouter process models, and even removing &quot;prescriptions&quot; that hinder your progress, but with absolute knowledge of what is being removed. This is what &lt;a href=&quot;http://twitter.com/henrikkniberg&quot;&gt;Henrik&lt;/a&gt; has put in his InfoQ &lt;a href=&quot;http://www.infoq.com/minibooks/kanban-scrum-minibook&quot;&gt;book&lt;/a&gt; - &lt;i&gt;&quot;Do not limit yourself to one tool!&quot;&lt;/i&gt;. &lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I have my own experience, where we started out with pure Scrum. Scrum iterations help evolve not only the software but our (scrum) process itself with continuous retrospectives. As we practiced it, over the time we hit against the walls of the Scrum, such that we had to eventually remove few prescriptions of the Scrum, effectively making it leaner and the process as &quot;&lt;i&gt;Scrum Inspired&lt;/i&gt;&quot;. For example, we would feel OK to extend our sprint for 2-3 days and still declare it as a successful sprint! We would find it OK to even entertain new items during the sprint, if it was critical to the client. Sometimes, 1 or 2 team member may work on items from another product, that is planned in advance for the sprint, because we had small teams, and the same team members would work on multiple products/projects. In spite of this, we always knew where the limits were, and we were effective with whatever we did. We were strict on whatever process we followed. If we changed the Scrum rule, we did that knowingly, and probably would be the outcome of the retrospectives we had at the end of sprints. By adapting the process, not only was our output improved (that would make customers happy), the management as well as the team members were &lt;a href=&quot;http://blog.openthoughtworks.com/2010/03/tribute-to-my-ex-colleagues.html&quot;&gt;happy at what we do&lt;/a&gt;, and how we do it and the overall team productivity.&lt;br /&gt;
&lt;br /&gt;
We all were extremely happy on the retrospective day, since it was the 
day we could blast out our rants, impediments and criticisms openly. We 
virtually had fights over the retrospectives. But finally, it all would 
help us improve what we do. &lt;br /&gt;
&lt;br /&gt;
Mix-n-match and adapting is important. For instance, Scrum does not say anything about releases, but XP does, hence combining them together is more compelling. The &quot;&lt;i&gt;Do it&lt;/i&gt;&quot; nature of scrum and the &quot;&lt;i&gt;pair programming&lt;/i&gt;&quot; and &quot;&lt;i&gt;move people around&lt;/i&gt;&quot; principle of XP and a well communicated team also helps in getting a new joiner to be inducted fast into the team as well!. Most of us have done pieces of XP and agile knowingly or unknowingly, if for example we have written unit tests, did iterations of development and the like. But the real benefit for going agile comes from developing and following process models with prescriptions from the agile processes available. Process models such as Kanban actually give us metrics to measure our process against, and take the best of what works for us from all the process models - agile or not. We can choose to start&amp;nbsp; out with Kanban, with probably the regular iteration, daily stand-up meetings, and retrospectives from the Scrum, add to that the software engineering specific practices from XP, such as CI, unit testing and pair programming.&lt;br /&gt;
&lt;br /&gt;
Again, what is more important is to adapt the process models to your needs. For example, even as I mentioned above for practicing prescriptions from Scrum and XP, I am still wondering how a stand-up meeting would happen for a distributed team? &lt;a href=&quot;http://evilword.wordpress.com/2009/03/06/distributed_scrum/&quot;&gt;Distributed Scrum&lt;/a&gt;? Probably, we can have scrum of scrum, but again, this is something I have no experience. So, when the need comes for it, I will give it a try, practiced, adapted and practiced and improved so on.&lt;br /&gt;
&lt;h2&gt;















Responding to change over following a plan&lt;/h2&gt;
This is one of the four core values of the Agile manifesto. Adapting your process is a definite way to achieve this objective. Agility promotes responding to change inherently because of its iterative nature, that can enable the team to incorporate changes to a software more rapidly that traditional classic waterfall model. Process framework such as Kanban further fosters this changes to be percolated more rapidly into the development.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Try experimenting&lt;/b&gt;. Experiment with new and innovative ideas for improving processes. Invite all sort of crazy ideas from your team as well. I am sure, you will not go worse even if your experiments failed. You will learn so much. Next time you always know what not to do :).&lt;br /&gt;
&lt;h3&gt;














Focus on individuals and interactions over processes and tools&lt;/h3&gt;
This is again one of the four core values of the Agile Manifesto. This is what we have covered already. Let me explain. By focusing more on adapting the process to our needs instead of following the process as a religion, we are focusing more on the people and interactions for sure. The stand-up and the retrospectives for example are effective to give importance to the people who are involved, removing their impediments, and giving importance to their interactions. Once we practice scrum and XP, there is a value that the team learns. It is more important to follow these values, than to follow these practices by book.&lt;br /&gt;
&lt;h3&gt;













Communications and Interactions&lt;/h3&gt;
As we talk of individuals and interactions, I should emphasize on the need for effective communication and interaction within the team and with the customer (or his representative). Well communicated teams is one of the focus of scrum and XP (and most of the agile practices). The team stake holder should ensure proper communication channels. Small and well knit teams help a lot on this. If a team member has a problem, he knows already to whom this should be addressed, and the turnaround time to address this should be maximum of two meetings - i.e, the impediment should be addressed before the second team meeting after the impediment had been raised.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://lh5.ggpht.com/_H-EwBdXu07w/SiqlilqAtjI/AAAAAAAABSc/_9Kz4f2hlhw/s1600/img_0575.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img class=&quot;border&quot; src=&quot;http://lh5.ggpht.com/_H-EwBdXu07w/SiqlilqAtjI/AAAAAAAABSc/_9Kz4f2hlhw/s320/img_0575.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;(Image courtesy: Avish&#39;s &lt;a href=&quot;http://picasaweb.google.com/some.avish/AWeekWithTheBuckhmanBunch&quot;&gt;web album&lt;/a&gt;)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;
&lt;br /&gt;
To enhance our communication channel, we used enterprise blogging at three levels:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Organizational blog&lt;/b&gt;: We used this blog to express new ideas and rants across teams.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Team blog&lt;/b&gt;: we used this blog within the team for various purpose&lt;/li&gt;
&lt;ol style=&quot;list-style-type: lower-alpha;&quot;&gt;
&lt;li&gt;&lt;i&gt;Daily status update&lt;/i&gt; - every team member used to put the daily status update for days work under the following headings:
&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Tasks completed&lt;/li&gt;
&lt;li&gt;Tasks pending&lt;/li&gt;
&lt;li&gt;Impediments&lt;/li&gt;
&lt;li&gt;Things I found new today&lt;/li&gt;
&lt;li&gt;Comments&lt;/li&gt;
&lt;/ul&gt;
This daily status update, served more than one way to increase our effectiveness. Members would take a look at the updates for the day from other members before the scrum, and come prepared for it. It was also helpful, if a member was was absent on the day, or could not make to attend the scrum for some reason.
&lt;li&gt;&lt;i&gt;Project specific posts&lt;/i&gt; - To discuss and document a project specific problems, and ideas. Many times although, we would promote some of the posts to the organizational blog too.&lt;/li&gt;
&lt;/ol&gt;
&lt;/ol&gt;
One-to-one interactions are really good at fostering better communication and interactions. It will be extremely good to have your team work at the same location, if possible within same cubicle. ThoughtWorks practices this with &quot;&lt;i&gt;&lt;a href=&quot;http://offshore.thoughtworks.com/why-we%27re-different&quot;&gt;Dining Table&lt;/a&gt;&lt;/i&gt;&quot; culture for the team that &lt;a href=&quot;http://www.thoughtworker.com/agile-our-way-life&quot;&gt;fosters greater collaboration and communication&lt;/a&gt; (and flow of ideas). For distributed teams, this may not be feasible, where better interaction can be provided by having the team members available to each other on IMs. Use of wiki based whiteboards as discussed above can be a good way to go for distributed teams. Well, there can be a lot of talk for this. So I reserve the &#39;distributed teams&#39; topic to a separate discussion.
&lt;br /&gt;
&lt;h3&gt;




Human factor&lt;/h3&gt;
While focusing on individual developer productivity is important, it is also important to see how the team as a whole can mesh well and be productive. A very important thing is to have well-knit and well communicated team. Focus that they can work well with each other considering the human emotions and social factors.&lt;br /&gt;
&lt;br /&gt;
Frequently changing the context is not a good idea. Everybody may not be equally good at changing contexts. It would be nice to group together similar tasks. Human minds takes time to get adjusted to the new environment and get productive. Again, this is a topic that may itself need a separate discussion.&lt;br /&gt;
&lt;h3&gt;




Tools do not replace process and individual interactions&lt;/h3&gt;
When we started out with Scrum, we used whiteboard for everything - from daily tracking our burndowns at daily scrums to the retrospectives. But later to keep track of what we do, we moved parts of these into our enterprise wiki. Later we also tried with JIRA&#39;s GreenHopper plugin to manage most of the scrum, except the retrospectives. We where still open to change or adapt to tools as would our process be adapted. In short, we used the tools to aid us what do.&lt;br /&gt;
&lt;br /&gt;
Using tools does not mean that we are doing what the tool is meant for.&amp;nbsp; What we do for scrum is more important than the tool used to manage scrum. Using the &lt;a href=&quot;http://www.oracle.com/agile/index.html&quot;&gt;Agile PLM&lt;/a&gt; does not mean that we have gone agile. Tools should be at our disposal to aid us what we do more effectively.&lt;br /&gt;
&lt;h3&gt;




Focus on the developer skills&lt;/h3&gt;
A craftsman is the center-point of every creation - not just software. From the craftsman of a building to that of a supersonic jet aircraft - the skill of the craftsman involved is very important and crucial to it. Software craftsman is no exception.&lt;br /&gt;
&lt;br /&gt;
The developer should realize the importance of developing skills even beyond his current needs. Developers should proactively try to learn, innovate and come with new ideas. Always try to learn something new at work, and from around your (professional) community. Work proactively to improve the environment you work in. Work towards a more productive process, for getting better output for your company and yourself. No one can teach you or or force you to learn. It has to come from within. Try reading books, blogs and articles, try to keep up with what is happening around. Find how a new technology could help you create better software. Find how a new technique or trick could help you do more with less effort. Attend conferences, and user groups, speak at them, share your learning - good and bad, &lt;a href=&quot;http://tech.puredanger.com/2010/03/05/non-death-blogging/&quot;&gt;blog about them&lt;/a&gt;. &lt;a href=&quot;http://qconlondon.com/london-2010/speaker/Pete+Goodliffe&quot;&gt;Peter Goodliffe&lt;/a&gt; and &lt;a href=&quot;http://qconlondon.com/london-2010/speaker/Dan+North&quot;&gt;Dan North&lt;/a&gt; have &lt;a href=&quot;http://qconlondon.com/london-2010/file?path=/qcon-london-2010/slides/DanNorth_SharpeningTheTools.pdf&quot;&gt;some (pdf)&lt;/a&gt; interesting &lt;a href=&quot;http://qconlondon.com/london-2010/file?path=/qcon-london-2010/slides/PeteGoodliffe_TheCraftsmanLearnsorLearningTheCraft.pdf&quot;&gt;advice (pdf)&lt;/a&gt; on this topic that they presented on the recent &lt;a href=&quot;http://blog.openthoughtworks.com/2010/03/qcon-london-2010-slides.html&quot;&gt;QCon London 2010 conference&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
As software shops that nurture these software craftsmen, it is important to promote them at these things, and provide a conductive atmosphere for the developers to nurture their skills. I will discuss these things in later in this post (series) under the title &quot;&lt;i&gt;Some Agility and beyond&lt;/i&gt;&quot;.&lt;br /&gt;
&lt;h2&gt;





Focus on working software over comprehensive documentation&lt;/h2&gt;
This is again one of the principles of Agile manifesto. But this often creates confusion and debates. Since, many times good documentation is called for a good software.&amp;nbsp; Because, at later stages, a software without documentation, may be hard to understand, and maintain. However, this principle, does not mean to avoid documentation. A good discussion on agile documentation is provided &lt;a href=&quot;http://www.agilemodeling.com/essays/agileDocumentationBestPractices.htm&quot;&gt;here&lt;/a&gt;. After all,&amp;nbsp; documentation is &lt;a href=&quot;http://www.agilemodeling.com/essays/agileDocumentationBestPractices.htm#FindBetterWaysToCommunicate&quot;&gt;all about communication&lt;/a&gt;, so as mentioned before - documentation is just a medium of communication, focus instead on the overall communication.This topic alone requires a lot of discussion, but let me discuss few very important topics in this.&lt;br /&gt;
&lt;h3&gt;





Code is your document&lt;/h3&gt;
Documenting your code - code is your document. Code commenting, with importance in probably what is the intent of the code rather that what the code is doing,.. any good developer will understand what the lines of code do, if they know the intent of the code. At times, for an intent you may have to write a lot of classes and methods, there put the intent at the index/root of where it all begins, and probably give reference to it. See the JDK, or the Spring API documentation,.. its so beautifully documented.&lt;br /&gt;
&lt;h3&gt;





A test-case is worth a thousand words&lt;/h3&gt;
Developing test case is also a good documentation, to showcase the functionality. The test-cases can be automated unit test cases, that very much is a very good documentation - technically as well as functionally. Tests should run in all possible ways - regular builds, test builds, CI builds, and even in IDEs. I will cover more on this in my next post in this series.&lt;br /&gt;
&lt;h3&gt;





External Documents&lt;/h3&gt;
You will have to maintain external documents too. For example, a document that discuses your architecture and its intentions. Focus on developing the software first, and writing documentation for the working software instead of writing for speculative design. Managing external documents, should be among the task list during your iterations. And very important of all, keep in a format that is easy to edit and maintain. You may have a document management software to maintain them or it may be as simple as managing all of them in your enterprise wiki.&lt;br /&gt;
&lt;h2&gt;




More to come ...&lt;/h2&gt;
In the next blog post in this series, I will try to explain practices that stretch beyond agile prescriptions, that can help build better software. While some of the practices are within the agile prescriptions, few others have also been recommended by Agile experts such as Martin Fowler, while few other are practices that have been proved to work, to produce some admirable software, while having a happy team.


&lt;h3&gt;Update...&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/2010/03/agility-and-more-better-faster-business.html&quot;&gt;Part 1 of this blog series.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/2010/03/agility-and-more-better-faster-business_30.html&quot;&gt;Part 3 of this blog series.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2010/03/agility-and-more-better-faster-business_29.html</link><author>noreply@blogger.com (Thomas Joseph)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm4.static.flickr.com/3384/3633561833_498dbbf48a_t.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-1765143169103281416</guid><pubDate>Thu, 25 Mar 2010 14:10:00 +0000</pubDate><atom:updated>2010-08-23T00:13:47.796+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">agile</category><category domain="http://www.blogger.com/atom/ns#">development</category><category domain="http://www.blogger.com/atom/ns#">Project Management</category><category domain="http://www.blogger.com/atom/ns#">software</category><title>Agility and more: better &amp; faster business solutions with software - part-1</title><description>Software development is a creative process, where we create software to deliver solutions to business problems (most of the time), and/or to add value to it. Although the holy duty of a software developer is to deliver solutions to business problems, and not always necessarily developing software. But when we have decided to build a software, we work as teams (most of the times), and the business problem is the central focus of the process. But, the overall quality of the developed software also depends on how we are developing the software - from the requirement capturing to coding, testing, and implementation. This highlights the need for a process at all stages of software development.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;b&gt;Note:&lt;/b&gt; Software is also developed for fun, some write it to learn programming (we all have did that), some times it is written for personal use (eg,. automating some mundane task). But most of the time, its written for business needs - let it be a game software, and ERP, the OS itself, or the search engine software - most of them eventually turn as a business or a business solution. In this post I am talking mostly about the software that deals with business and hence the software shops find time and money to be spent to develop these software. So whenever I talk of software, I mean it to be the software developed in these software shops, unless otherwise indicated.&lt;/blockquote&gt;
&lt;br /&gt;
These series of posts highlights my understanding and experience on how the Agile processes can be effectively used to improve the overall quality of the software solutions with reasonable time leads and better estimates. Why and how agile processes needs to be adapted? For Software Engineering teams, there is even more than just being lean/agile, that needs to be into the process.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://lh3.ggpht.com/_FMBWAYy8eXE/SZuv3AxXDkI/AAAAAAAAATc/9PuOTEGzlqk/s1600/68design_001.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img class=&quot;border&quot; src=&quot;http://lh3.ggpht.com/_FMBWAYy8eXE/SZuv3AxXDkI/AAAAAAAAATc/9PuOTEGzlqk/s320/68design_001.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;(&lt;i&gt;Image courtesy: Coffish&#39;s &lt;a href=&quot;http://picasaweb.google.com/coffish/Material&quot;&gt;web album&lt;/a&gt;&lt;/i&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
This is of course not a comprehensive discussion on any of the process tools/frameworks discussed here. Although I discuss about Scrum, XP and Kanban to certain extent, what I tell here is the basics, a skeleton that every team/organization can give thoughts to, and then adapt them to their needs. You may add whatever more is needed to meet some standards, but just don&#39;t overdo it that you have problem remembering your own processes - keep it as lean as possible. There are several literature that talks about these specific techniques. I will not talk about all the aspects of software development too! Here I will talk in general, about faster development cycle and developer productivity while achieving quality and timely software releases with less team burnouts and overtimes.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;




Why this talk?&lt;/h2&gt;
I am into the software development profession for over 4 years now and about 7 years overall into the world of software. I have developed software the ugly way, the good, way and still an ever improving way that gets better each passing day. I was very fortunate to have a wide variety of experience in such a short span. I&#39;ve worked as a junior programmer to leading teams. I have been a Scrum Master for nearly 2 years. I continuously look out to improve myself and the environment in which I work. I try to implement my learning whenever possible, and its a continuous process where the learning and improvement never stops.&lt;br /&gt;
&lt;br /&gt;
Although, I have practiced focused agile processes for almost 2 years now, I do not consider it as too long to be compared to the seasoned agile experts. Nor do I have done any agile/lean consulting for organizations. But I do talk to peers, friends, friends of friends and seek their experiences and suggestions, share mine with them, and advice them. I read a lot, or get to watch conference videos and slides on agile processes and tools, on developer productivity, apart from the efforts on improving my technical skills. I still look forward to attending user-groups and conferences to discuss out these things. This is why that I feel that I need to share my experiences and learning with others, especially for those who have not yet started on a good agile practice, or are trying to find experiences of others to improve their own processes. After-all, process improvement is more to do with experience - learning from our own and from others, sharing our own and getting valuable feedback, and further improving.&lt;br /&gt;
&lt;h2&gt;




What is a good software?&lt;/h2&gt;
The Economist magazine (Nov 27, 2004 p. 71) cites the Standish Group&#39;s estimates that&lt;br /&gt;
&lt;blockquote&gt;
&lt;i&gt;&quot;...30% of all software projects are canceled, nearly half come in over budget, 60% are considered failures by the organizations that initiated them, and 9 out of 10 come in late.&quot;&lt;/i&gt;&lt;/blockquote&gt;
&lt;br /&gt;
With this statement, let us have a quick description of a good software:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Solves the business problem at hand&lt;/li&gt;
&lt;li&gt;Gives and adds value to the business and hence the customers&lt;/li&gt;
&lt;li&gt;Evolves with customer needs (as fast as the business itself): Maintainable&lt;/li&gt;
&lt;li&gt;Free of bugs :)&lt;/li&gt;
&lt;li&gt;Could be built and deployed with lesser cost&lt;/li&gt;
&lt;li&gt;Available to use on time&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
With this small description of a good software, we can now focus on making good software, where we need people and processes.&lt;br /&gt;
&lt;h2&gt;




Need for agile&lt;/h2&gt;
Putting it fast, being agile helps foster better output for software shops. However agile is a too general term to be practiced or explained as such, although the general aims and principles of agile is clearly stated at the &lt;a href=&quot;http://agilemanifesto.org/&quot;&gt;agile manifesto&lt;/a&gt;. Hence, we will need to follow the process tools that have been designed with the agile principles, such as the &lt;a href=&quot;http://en.wikipedia.org/wiki/Scrum_%28development%29&quot;&gt;Scrum&lt;/a&gt;, &lt;a href=&quot;http://www.infoq.com/articles/hiranabe-lean-agile-kanban&quot;&gt;Kanban&lt;/a&gt; and &lt;a href=&quot;http://www.extremeprogramming.org/&quot;&gt;XP&lt;/a&gt;.&lt;br /&gt;
&lt;blockquote&gt;
&lt;h3&gt;




The Agile Hype&lt;/h3&gt;
Often people get confused on &quot;what is agile&quot;? The Agile Manifesto is the defining document of &quot;&lt;i&gt;agile&lt;/i&gt;.&quot; It lists &lt;a href=&quot;http://www.agilemanifesto.org/&quot;&gt;4 fundamental values&lt;/a&gt; and &lt;a href=&quot;http://www.agilemanifesto.org/principles.html&quot;&gt;12 guiding principles&lt;/a&gt;. That is the full definition of &quot;&lt;i&gt;agile&lt;/i&gt;.&quot; Based on those values and principles, we are expected to derive processes and practices that are consistent with the agile approach. However, often the term Agile has been over-hyped, that the people often do not recognize the true meaning of agile. The hype has infused software vendors to come up with tools to support agile, that has often increased this chaos, where people believe that they need those tools to go agile. Also, agile practitioners, often refer to a certain school of practice as Agile. With various schools of agile practice, new comers often get confused about Agile.&lt;br /&gt;
&lt;br /&gt;
Dave Nicolette explains &lt;a href=&quot;http://dnicolet1.tripod.com/agile/index.blog?entry_id=2001900&quot;&gt;why is it so hard to find a clear definition of &quot;agile&quot;?&lt;/a&gt;.&lt;/blockquote&gt;
&lt;br /&gt;
Since the overall quality of the software developed also depends on how we are developing the software, the need for a organized process to produce the software becomes important. Process models such as &lt;a href=&quot;http://www.sei.cmu.edu/cmmi/&quot;&gt;CMMi&lt;/a&gt; evolved over years with this focus - &quot;&lt;i&gt;provide organizations with the essential elements of effective processes that ultimately improve their performance&lt;/i&gt;&quot;. Over the years people found iterative and Agile methods to be more effective in delivering better output. And in the recent times, there has been a considerable shift to adopting leaner agile models such as &lt;a href=&quot;http://www.infoq.com/minibooks/kanban-scrum-minibook&quot;&gt;Scrum and Kanban&lt;/a&gt; over heavier and prescriptive process models such as &lt;a href=&quot;http://en.wikipedia.org/wiki/IBM_Rational_Unified_Process&quot;&gt;RUP&lt;/a&gt;. Prescriptive means that there are more rules to follow, and adaptive ones have lesser rules to follow. Agile methods are lightweight since they are less prescriptive than the traditional methods of software process. Even within agile, the leaner and less prescriptive models are becoming more popular, naturally, because they are more adaptive to one&#39;s organizational needs and seem to be more effective and easy to learn and practice than the prescriptive ones.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://lh6.ggpht.com/_yr1SU8wX2Ls/S6tHiNXOrvI/AAAAAAAAAZ8/0bbMOn1r_Bo/s1600/process-prescription.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img class=&quot;border&quot; src=&quot;http://lh6.ggpht.com/_yr1SU8wX2Ls/S6tHiNXOrvI/AAAAAAAAAZ8/0bbMOn1r_Bo/s320/process-prescription.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;b&gt;Process models&lt;/b&gt;: both extremes of scale does not seem to work well.&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;(&lt;i&gt;Image reproduced from &lt;a href=&quot;http://www.infoq.com/minibooks/kanban-scrum-minibook&quot;&gt;InfoQ minibook&lt;/a&gt;&lt;/i&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Even with the need for processes to govern the software development, there are more reasons to go for agile process.&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Your customers have continually evolving requirements and changing requirements&lt;/li&gt;
&lt;li&gt;Your customers are not very sure about their requirements, and they need your help to identify those requirements&lt;/li&gt;
&lt;li&gt;Your team needs to respond quickly to change requests, and deliver projects&lt;/li&gt;
&lt;li&gt;You need have a major rework of the project just delivered, because of requirement mis-understanding with customer.&lt;/li&gt;
&lt;li&gt;You have teams working overtime continually and at other times sit idle waiting for the other team/person to complete&lt;/li&gt;
&lt;li&gt;You have chaos in team due to lack of communication (many times you never feel that your teams have this problem!)&lt;/li&gt;
&lt;li&gt;Managers are over burdened, and often need to go in to resolving issues between teams that work on same project&lt;/li&gt;
&lt;li&gt;Your estimates prove wrong and your projects go over-budget and/or take longer to complete.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Of course, seasoned agile practitioners can find even more points to be added to the above. But this is what was very obvious to me.&lt;br /&gt;
&lt;h2&gt;




More to come...&lt;/h2&gt;
In the following posts in this series, I will explain about practicing agile in real life, and why adapting the agile prescriptions is important. I will also explain about practices even beyond the direct agile prescriptions, that can help organizations to build faster and quality software.

&lt;h3&gt;Update...&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/2010/03/agility-and-more-better-faster-business_29.html&quot;&gt;Part 2 of this blog series.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/2010/03/agility-and-more-better-faster-business_30.html&quot;&gt;Part 3 of this blog series.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2010/03/agility-and-more-better-faster-business.html</link><author>noreply@blogger.com (Thomas Joseph)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_FMBWAYy8eXE/SZuv3AxXDkI/AAAAAAAAATc/9PuOTEGzlqk/s72-c/68design_001.jpg" height="72" width="72"/><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-1135276667370632462</guid><pubDate>Wed, 24 Mar 2010 07:52:00 +0000</pubDate><atom:updated>2010-03-24T20:30:56.123+05:30</atom:updated><title>Downloading InfoQ videos and slides</title><description>InfoQ is a portal with lot of interesting and happening stuff for IT people, and especially for the developers. Some of the areas, it specializes includes - Java, .NET, Ruby, SOA, Agile and Architecture. Like many others, I am a regular user of the site, that provides me the &quot;energy supplements&quot; for my developer life.&lt;br /&gt;
&lt;br /&gt;
Like many others, I was always interested to download the videos and slides from the InfoQ website. With some effort I could device a way to achieve that - exclusively for my private usage. I did this because, often my internet connection is slow and then 
watching the entire presentation/interview would eat much of my time - 
most of it waiting for the content to get downloaded.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.infoq.com/&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img class=&quot;border&quot; src=&quot;http://lh3.ggpht.com/_yr1SU8wX2Ls/S6offtnGJGI/AAAAAAAAAZg/he2tLPGEk4I/s800/infoq-videos.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
I wanted to share this technique with others on my blog. However, I was concerned on the IP rights and so checked the website for it. However I could not find one that stated a usage policy. So I decided to check the same with the website owners - &lt;a href=&quot;http://www.c4media.com/&quot;&gt;c4media&lt;/a&gt;. I emailed them and in the reply, I was advised not to publish any details on downloading slides and videos. This was the response I got.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
Thanks for taking the time to ask us about this. We’d ask that you not provide instructions on how to download or view these videos beyond the means we currently offer. &lt;br /&gt;
&lt;br /&gt;
When we go out and film these interviews or presentations one of the stipulations in the agreement we sign with the conference or individual is that the video not be made available for download. By allowing or even turning a blind eye to people doing this it would not only put us in potential legal hot water but would also “blacklist” us from filming future presentations or interviews.&lt;br /&gt;
&lt;br /&gt;
Due to this we can unfortunately only support people viewing the presentations or interviews in the formats we currently offer; either streaming them online or, in some cases, downloading the MP3.&lt;/blockquote&gt;
&lt;br /&gt;
It was a co-incidence to find that InfoQ was reacting publicly to seek feedback for their site, probably at the same time when I was drafting the mail. The responses will indicated that people are &lt;a href=&quot;http://www.blogger.com/%20http://www.infoq.com/news/2010/03/infoq-user-survey-results#view_54379&quot;&gt;interested to download the videos&lt;/a&gt; and slides, and the InfoQ&#39;s response to these queries.&lt;br /&gt;
&lt;br /&gt;
Further, I was encouraged by the InfoQ to publish their response to me, showing how transparent InfoQ was. Respecting the InfoQ&#39;s&amp;nbsp; legal terms, I have decided not to publish any technique for downloading the InfoQ videos or slides.&lt;br /&gt;
&lt;br /&gt;
InfoQ may change the way it is presenting the videos and slides, to stick to its legal agreements. However, as far a technical feasibility of devising any hacks are concerned, even RSA encryption can be compromised, for that matter, given enough of time and CPU power.&lt;br /&gt;
&lt;br /&gt;
I am however, happy about the fact that InfoQ is redesigning its website, closely working with the users. It may also present direct method to download interviews, which is InfoQ&#39;s &quot;original material&quot;. I would encourage you to provide your feedback, and help yourself to make the site more useful.&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2010/03/downloading-infoq-videos-and-slides.html</link><author>noreply@blogger.com (Thomas Joseph)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/_yr1SU8wX2Ls/S6offtnGJGI/AAAAAAAAAZg/he2tLPGEk4I/s72-c/infoq-videos.png" height="72" width="72"/><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-868171178902531946</guid><pubDate>Wed, 17 Mar 2010 16:31:00 +0000</pubDate><atom:updated>2015-10-19T05:25:11.966+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">leasure</category><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><title>Tech and some...</title><description>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
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 &quot;&lt;i&gt;Synaptic Package Manager&lt;/i&gt;&quot; on my Linux box - &lt;a href=&quot;http://www.ubuntu.com/&quot;&gt;Ubuntu&lt;/a&gt; 9.10 (Karmic Koala). Quick was it, to get &quot;&lt;i&gt;Audacity&lt;/i&gt;&quot; to help me record, and edit audio. &lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;img border=&quot;0&quot; src=&quot;http://static.ethomasjoseph.com/images/Screenshot-pathira_pullu.png&quot; height=&quot;217&quot; width=&quot;320&quot; /&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=&#39;more&#39;&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;audio controls=&quot;&quot;&gt;&lt;br /&gt;
&lt;source src=&quot;horse.ogg&quot; type=&quot;audio/ogg&quot;&gt;&lt;/source&gt;&lt;br /&gt;
&lt;source src=&quot;http://static.ethomasjoseph.com/res/pathira_pullu-thomas-intro.mp3&quot; type=&quot;audio/mpeg&quot;&gt;&lt;/source&gt;&lt;br /&gt;
Your browser does not support the audio element.&lt;br /&gt;
&lt;/audio&gt;&lt;br /&gt;
&lt;br /&gt;
This is a romantic song &quot;&lt;a href=&quot;http://www.youtube.com/watch?v=Mbiy4DXHPq0&quot;&gt;Pathira Pullu&lt;/a&gt;&quot; from the Malayalam Movie - &quot;&lt;a href=&quot;http://www.moserbaerhomevideo.com/title-view.htm?titleid=3399&quot;&gt;Ee Puzhayum Kadannu&lt;/a&gt;&quot;(1996). It is one of my favorites songs. Music composed by &lt;a href=&quot;http://en.wikipedia.org/wiki/Johnson_%28composer%29&quot;&gt;Johnson&lt;/a&gt; (one of my favorite music composers), and originally sung by &lt;a href=&quot;http://en.wikipedia.org/wiki/K._J._Yesudas&quot;&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&gt;
&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2010/03/tech-and-some.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></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=&quot;text-align: center;&quot;&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=&quot;text-align: center;&quot;&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=&quot;text-align: center;&quot;&gt;
&lt;i&gt; the lunch, the outings - thanks for all that time.&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt; Thank you all for the professional and personal growth gained together.&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;Wish you all a prosperous and happy future!&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2010/03/tribute-to-my-ex-colleagues.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>3</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></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=&quot;http://blogsearch.google.com/blogsearch?hl=en&amp;amp;ie=UTF-8&amp;amp;q=Qcon+london+2010&amp;amp;btnG=Search+Blogs&quot;&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&#39;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=&quot;http://qconlondon.com/london-2010/speakers/&quot;&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=&quot;http://qconlondon.com/london-2010/schedule/wednesday.jsp&quot;&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=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2010/03/qcon-london-2010-slides.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-5715425530181339158.post-3483692851486571088</guid><pubDate>Mon, 21 Dec 2009 17:09:00 +0000</pubDate><atom:updated>2010-03-23T23:25:50.641+05:30</atom:updated><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Tips</category><title>Saving a streaming video / presentation</title><description>Ever wondered to to save those streaming videos from Youtube, Metacafe, DailyMotion and so many others? I always wanted to save those streams, so that I could watch them again and again even without an Internet connection.&lt;br /&gt;
&lt;br /&gt;
I am a faithful Firefox user, and one of its wonderful plugin - &lt;a href=&quot;http://www.downloadhelper.net/&quot;&gt;DownloadHelper&lt;/a&gt; has helped me for a long time to capture and save Youtube videos as flash video files on my local hard disk. That was quite helpful. But I always wanted to save those InfoQ videos as well, but unfortunately, DownloadHelper could not provide support for InfoQ (among others).&lt;br /&gt;
&lt;br /&gt;
It was only recently, that I used the conversion feature of DownloadHelper, in which I was converting one of those Youtube videos to be converted to wmv format. I noticed, that the conversion started only after the whole of the video stream was played on my browser. And I could readily guess, that the conversion must be using one of the libraries on my machine. So I looked at the process to find that it was using ffmpeg command to do this job. I also noticed, that actually every video was buffered to the /tmp on my Ubuntu. The filename I could see was something like FlashVOZFnS.&lt;br /&gt;
&lt;br /&gt;
Naturally, if a movie plays on your machine, it must be stored somewhere before being played on your browser. So now if you want to save your next streaming video, just identify where in your system does the flash player saves its movie temporarily before being played on your browser, and save that file to your videos folder, and possibly give it a .flv extension too.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;b&gt;Note&lt;/b&gt;:&amp;nbsp;&lt;/i&gt;
&lt;ol&gt;
&lt;li&gt;&lt;i&gt;As soon as you close the tab containing the video, the temporary file is discarded.&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Not all videos may be fully buffered before playing. Very long videos and webcasts may not be fully buffered.&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;h3&gt;Converting flash movies to other format (Linux)&lt;/h3&gt;
And now if you also want to convert it into other formats, its very easy in Linux with the following commands:&lt;br /&gt;
&lt;b&gt;FLV to WMV:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;code&gt;ffmpeg -i /home/thomas/Desktop/video.flv -y -v 0 -acodec wmav1 -b 1000kbps -f asf -vcodec wmv1 /home/thomas/Desktop/video.wmv&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;FLV to MPG:&lt;/b&gt;&lt;br /&gt;
&lt;code&gt;ffmpeg -i /home/thomas/dwhelper/Desktop/video.flv -y -v 0 -f asf -vcodec mpeg4 /home/thomas/Desktop/video.mpg&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;

There are so many other options with this command, even up to video capturing your screen, but I am not very expert at those. So I leave it to you to experiment with those options.

&lt;hr&gt;
&lt;h2&gt;Update&lt;/h2&gt;
For any streaming video site, if you cannot see DownloadHelper to your help, make sure that you should have only this one tab containing any video to download. In other words, if you have multiple tabs with video contents, DownloadHelper seems to get confused, so you may not actually get a download link help.
&lt;br/&gt;&lt;br/&gt;
---------------&lt;br/&gt;
Edited and removed some content for legal reasons.&lt;br/&gt;
---------------&lt;br/&gt;&lt;br/&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2009/12/saving-streaming-video-presentation.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>1</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></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=&quot;http://perf4j.codehaus.org/&quot;&gt;perf4j&lt;/a&gt; work on OSGi. It required &lt;a href=&quot;http://logging.apache.org/log4j/&quot;&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=&#39;more&#39;&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=&quot;http://wiki.ops4j.org/display/paxlogging/&quot;&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&#39;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=&quot;http://wiki.ops4j.org/display/ops4j/Pax+ConfMan&quot;&gt;Pax ConfMan&lt;/a&gt;. But due to its limitation of not providing runtime updates, I chose to opt for &lt;a href=&quot;http://wiki.ops4j.org/display/~adreghiciu@gmail.com/Pax+Coin&quot;&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=&quot;http://paxrunner.ops4j.org/&quot;&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&#39;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=&quot;blogger-post-footer&quot;&gt;- Thomas Joseph&lt;/div&gt;</description><link>http://tech.ethomasjoseph.com/2009/12/configuring-log4j-with-xml-in-osgi.html</link><author>noreply@blogger.com (Thomas Joseph)</author><thr:total>0</thr:total><gd:extendedProperty name="commentSource" value="1"/><gd:extendedProperty name="commentModerationMode" value="FILTERED_POSTMOD"/></item></channel></rss>