<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><!-- generator="wordpress/2.3.1" --><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">

<channel>
	<title>Rajith's Column</title>
	<link>http://rajith.2rlabs.com</link>
	<description>Freeman, Hacker, Artist</description>
	<pubDate>Thu, 07 Jan 2010 17:43:15 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/rajith" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="rajith" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Hello 2010 And My Rant For 2009</title>
		<link>http://rajith.2rlabs.com/2010/01/07/hello-2010-and-my-rant-for-2009/</link>
		<comments>http://rajith.2rlabs.com/2010/01/07/hello-2010-and-my-rant-for-2009/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 17:34:17 +0000</pubDate>
		<dc:creator>rajith</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://rajith.2rlabs.com/2010/01/07/hello-2010-and-my-rant-for-2009/</guid>
		<description><![CDATA[It&#8217;s never to late to say &#8220;Happy New Year&#8221; !!!
I would like to take this opportunity to wish everybody the very best for 2010.
2009 have been a very busy and an eventful year.  My wife graduated and thus ended our 2 year stay at the university residences at UTM. All though a small townhouse [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s never to late to say &#8220;Happy New Year&#8221; !!!<br />
I would like to take this opportunity to wish everybody the very best for 2010.</p>
<p>2009 have been a very busy and an eventful year.  My wife graduated and thus ended our 2 year stay at the university residences at <a href="http://www.utm.utoronto.ca/">UTM</a>. All though a small townhouse (albeit with 4 bedrooms - no idea how they fit them all in that tiny space) it was nestled in a lovely location. There was greenery all around and our townhouse backed into a wooded lot where there was deer with plenty of raccoons and the occasional rabbit. The campus had clearly paid a lot of attention to maintaining a healthy balance with nature, so there was plenty of tress around the area.  I am not really a shutter bug, but we did take a few pictures here and there. Sadly I can&#8217;t seem to find them, so I&#8217;m linking with a few photos (<a href="http://www.flickr.com/photos/queencindy/2943044810/">pic1</a>, <a href="http://www.flickr.com/photos/queencindy/2942184517/in/photostream/">pic2</a>, <a href="http://www.flickr.com/photos/queencindy/2943043192/in/photostream/">pic3</a>) I found on the net taken by one <a href="http://www.flickr.com/photos/queencindy/">QueenCindy</a>. My kid loved this place as there was plenty of room to run around and play.</p>
<p>      After my wife graduated we had to moved into another place and after a very exhaustive search we found our selves back in the northern edge of Brampton,ON.  House hunting was no fun and we spent countless hours running around looking for a place that fits our whims and fancies and also within our budget.  Once we found the house it was a mad rush to find a mortgage at a suitable rate as we had only a few days. At the time the rates were very attractive, but the lending institutions were very thorough with so many requirements for various kinds of documents. I just about managed to get all the paper work done in time, but not without a last minute scare where for reason only known to them the bank refused to work with my lawyer. So I found another one at the eleventh hour that had a good working relationship with the bank which ensured we closed on time. All this happened while my wife was doing her final exams and I had to work on site with a customer that had a fairly aggressive schedule. My interactions with customers were mostly via email or phone calls, so being onsite was a new experience, all though I have to admit it was fairly stressful as well. I have blogged on my experience about it <a href="http://rajith.2rlabs.com/2009/09/09/survival-tips-for-software-engineers-in-a-customer-facing-role/">here</a>. By the time the gig came to an end, I had lost quite a few hair.</p>
<p>    The university gave us a one month grace period as there was nobody waiting to lease our townhouse. It allowed us some flexibility in the closing schedule. We have moved 5 times during the last 6 years, where one move was from Ottawa to Brampton (in Greater Toronto Area) !!!. So the very thought of moving again itself was a dreadful experience. I managed the last 5 moves on my own by renting a UHaul trunk. It wasn&#8217;t fun and I had enough, so this time I hired a mover. It took us quite a bit of time to get everything unpacked and settled in.</p>
<p>    I started playing cricket in earnest  during the last season (2009) for the Toronto and District Cricket League. It was an up and down season ending with me breaking my finger pretty badly during the last match of the regular season. The finger was dislocated and had a volar plate chip fracture. My finger is still in a pretty bad shape with a real possibility of it not attaining at least a 70% of what it used to be. One highlight of the season was facing <a href="http://www.cricinfo.com/westindies/content/player/371989.html">Navin Stewart</a> from Trinidad (who came to Canada to play club cricket during his off season). He plays for Trinidad and Tobago and featured in the <a href="http://en.wikipedia.org/wiki/Stanford_Super_Series">Stanford Super Series</a> and the esteemed <a href="http://www.clt20.com/">Champions League</a> in India. The bastard bowled two bouncers the second of which hit my glove, ricocheted off my helmet before being caught at the slips. He had decent pace and it was difficult to pick the red ball against the fading light. I hope I had better luck this coming season, but not sure if I am able to play at all due to the finger injury.</p>
<p>   With all the madness happening around I had managed to post a grand total of 3 blog entries for 2009. I am certainly hoping to improve on that in the coming year. Again I wish everybody the very best for 2010 !!!</p>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2010/01/07/hello-2010-and-my-rant-for-2009/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Microsoft contributes WCF client for Apache Qpid</title>
		<link>http://rajith.2rlabs.com/2009/09/29/microsoft-contributes-wcf-client-for-apache-qpid/</link>
		<comments>http://rajith.2rlabs.com/2009/09/29/microsoft-contributes-wcf-client-for-apache-qpid/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 23:05:42 +0000</pubDate>
		<dc:creator>rajith</dc:creator>
		
		<category><![CDATA[AMQP]]></category>

		<category><![CDATA[Announcements]]></category>

		<category><![CDATA[Qpid]]></category>

		<guid isPermaLink="false">http://rajith.2rlabs.com/2009/09/29/microsoft-contributes-wcf-client-for-apache-qpid/</guid>
		<description><![CDATA[Since joining the Apache Qpid project around Nov 2008 Microsoft has been helping with the windows port of the C++ broker. They also worked on a WCF client based on the C++ client libraries. Recently (about 2 weeks back) they contributed the code (QPID-2065). The examples could be found here.
From the read me the following [...]]]></description>
			<content:encoded><![CDATA[<p>Since <a href="http://rajith.2rlabs.com/2008/11/07/microsoft-joining-apache-qpid-and-the-amqp-working-group/">joining</a> the Apache Qpid project around Nov 2008 Microsoft has been helping with the windows port of the C++ broker. They also worked on a WCF client based on the C++ client libraries. Recently (about 2 weeks back) they contributed the <a href="https://issues.apache.org/jira/browse/QPID-2065">code (QPID-2065)</a>. The examples could be found <a href="http://svn.apache.org/viewvc/qpid/trunk/qpid/wcf/samples/">here</a>.</p>
<p>From the read me the following features are available,<br />
1.  WCF service model programming using one way contracts<br />
2.  WCF channel model programming using IInputChannel and IOutputChannel based factories<br />
3.  Programmatic access to AMQP message properties on WCF messages<br />
4.  AMQP version 0-10 (as provided by the Qpid C++ native client library)<br />
5.  Shared connections for multiple channels based on binding parameters<br />
6.  WCF to WCF applications (using SOAP message encoders)<br />
7.  WCF to non-WCF applications (using raw content encoders)<br />
8.  Rudimentary AMQP type support for headers (Int and String)<br />
9.  Channel functional tests using NUnit<br />
10. Programming samples</p>
<p>There are several opportunities for folks to collaborate in this area. Cliff Jansen who worked with Qpid on the code drop identified the following areas as potential areas for contributions.</p>
<p>From qpid/wcf/ReadMe.txt:</p>
<p> 2. Planned features (not yet available)<br />
 =======================================</p>
<p> 1.  Full AMQP type support, including maps and arrays<br />
 2.  System.Transactions integration (local and distributed with dynamic escalation)<br />
 3.  Prefetch window for inbound messages<br />
 4.  Shared sessions<br />
 5.  Connection failover with AMQP broker clusters<br />
 6.  Temporary queues<br />
 7.  Broker management<br />
 8.  System logging and tracing<br />
 9.  CMake build system support<br />
 10. Transport and message based security</p>
<p>One item that I would like to add to the above list is documentation for the WCF client and it&#8217;s examples.</p>
<p>If you are interested in contributing please join us by sending an email to dev-subscribe@qpid.apache.org<br />
You are most welcomed to contribute by way of code, testing, providing feedback or documentation.</p>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2009/09/29/microsoft-contributes-wcf-client-for-apache-qpid/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Survival tips for software engineers in a customer facing role</title>
		<link>http://rajith.2rlabs.com/2009/09/09/survival-tips-for-software-engineers-in-a-customer-facing-role/</link>
		<comments>http://rajith.2rlabs.com/2009/09/09/survival-tips-for-software-engineers-in-a-customer-facing-role/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 15:10:19 +0000</pubDate>
		<dc:creator>rajith</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://rajith.2rlabs.com/2009/09/09/survival-tips-for-software-engineers-in-a-customer-facing-role/</guid>
		<description><![CDATA[It is not often a software engineer has to engage in a customer facing role. In most organizations there is a tiered support structure between a customer and the software engineer. However in certain circumstances a software engineer may end up in a customer facing role. For example if you work for a startup you [...]]]></description>
			<content:encoded><![CDATA[<p>It is not often a software engineer has to engage in a customer facing role. In most organizations there is a tiered support structure between a customer and the software engineer. However in certain circumstances a software engineer may end up in a customer facing role. For example if you work for a startup you may have to juggle multiple roles, including a customer facing role until a proper support structure is put in place. Even in an established organization, when a new product is introduced the engineering team may need to handle support issues initially until the support organization gets up to speed with it.</p>
<p>In any case it is important that software engineers develop necessary skills to handle such situations effectively. Some of these skills will help when communicating within your organization and some for life in general.<br />
Following are some tips that may help you to make your engagement a productive and a pleasant one.</p>
<ol>
<li>.<strong> Pay attention to the subtleties when communicating over email.</strong><br />
It is often easy for people to misunderstand you when communicating over email as opposed to phone or in person. The tone could be easily misunderstood as being aggressive or rude as the person reading is unable to gauge your emotions or see your body language. This is especially important if you haven&#8217;t met them in person or spoken to them over the phone. Generally once a person can put a face to a name it becomes a bit more easy.</p>
<p>I have had several instances where this has happened and I now pay close attention to any email I send out to ensure that I communicate exactly what I intended.</p>
<p>Also it is important to state the obvious at least for completeness sake. What is obvious to you may not be to others. This especially important when using emails as there is no opportunity for instant feedback/questions. Otherwise it will result in lengthy email threads.</li>
<p></br></p>
<li><strong>Respect the people you are dealing with and try to build good working relationships</strong><br />
Telling a customer to RTFM is probably not a good idea. Even if you are frustrated due to repeated questions that you have answered a 100 times to several people during the last few days, it is best to answer it one more time. Even when you have no choice but to tell them to RTFM, do so in a respectful manner which doesn&#8217;t make people feel bad. Nobody in this world wants to be belittled or disrespected. When egos are hurt it creates a very unpleasant work environment.</p>
<p>In fact good healthy relationship can go a long way in making sure the project runs smoothly and successfully.</li>
<p></br></p>
<li><strong>Your code vs my code -  avoid the customary finger pointing</strong><br />
Most people are very passionate about the code they write. And often when there is a problem we tend to take a defensive stand. Anybody who has seen a conversation between a programmer and QA engineer would know what I am talking about.<br />
But when you are dealing with a customer, you need to be extra careful about how you look at a problem. <em>Even if the issue is not in your product you need to control your urge to point it in the same emphatic way you do so with your QA folks</em>. You need to be more diplomatic in how you point out the bug on their side and try to avoid using words like &#8220;your code&#8221; or &#8220;our code&#8221;.</li>
<p></br></p>
<li><strong>We can&#8217;t reproduce in our lab environment is not a good answer.</strong><br />
Certain problems may not be possible to reproduce (in the exact form), outside the customers environment as it is difficult to replicate the exact environment due to differences in hardware and not having access to their application binaries due to security, legal and other issues. . But it is important to identify the issues at a more deeper level. Perhaps if you understand the root cause, you maybe able to simulate the issue in a different way.<br />
Take the time to understand the issue and try to talk to all people involved to get a complete and accurate picture. From experience I have seen that sometimes you want get all relevant information the first time you talk to people. People often forget unless you ask probing questions. Most times the first reactions from people capture the symptoms rather than the root cause. So a careful analysis maybe need to nail the real issue.</li>
<p></br></p>
<li><strong>Encourage the use of proper support procedures right from the beginning. Never take short cuts.</strong><br />
I have been burned several times by not following this. When an issue happens it is important that you encourage your customers to follow the correct procedure. For example the use of a bug tracking tool instead of a series of adhoc emails. It is often tempting to ask customers to email log files, or if you are on site to walk over to their desk and try to investigate.<br />
But if you encourage the use of a bug reporting tool it will have several benefits. It will force the person reporting the issue to think through in a methodical way and capture all the right information while it is still fresh in their mind. For example most bug reporting tools have fields to capture version information, a problem description, a component, steps to reproduce (if any), expected and observed result and provisions to attach log files ..etc. Once information is captured in a central location it is easy to share that information with your engineering team rather than digging through a series of adhoc emails.</li>
<p></br></p>
<li><strong>Proactively educate the people you work with</strong><br />
By experience I have found it is helpful to have a meeting as soon as possible with all involved parties and educate them on the following. Some of these may have already being communicated to them. But most may have forgotten or in some cases not being given to them at all.</p>
<ul>
<li>Provide links to documentation, training slides ..etc</li>
<li>Educate them on the proper procedure to follow when reporting issues (can&#8217;t stress this enough)</li>
<li>Based on the most frequent questions, try to provide an faq that is tailored to their environment</li>
<li>Once you identify the full system setup provide a basic trouble shooting guide for them to isolate if the issue is related to your organizations product or not. This I found reduced a lot of pain and non issues being reported.</li>
<li>Provide useful links to other skills involved in the project. For example I sometimes encountered folks who work mostly in a windows environment, but now dragged into a product being deployed in a unix environment. So links on basic unix skills would make it easy on everybody in such a situation.</li>
</ul>
</li>
<p></br></p>
<li><strong>Don&#8217;t babysit the people you work with</strong><br />
Initially you may get into the habit of spoon feeding information and babysitting them. This may seem like an easy option rather than trying to get them involved in the process. But it is in everybody&#8217;s best interest to get the customer to gain as much confidence in getting to know how to install, debug and use your product. This will reduce a load of pain later on in the process. Also try to,</p>
<ul>
<li> Avoid getting sucked into debugging the customers code.</li>
<li>Avoid the temptation to debug or fix an issue on your own. Try as much as possible to get them involved in the process.</li>
<li>Document trouble shooting attempts and consolidate them into a trouble shooting guide. Most products have official trouble shooting guides, but a supplementary trouble shooting guide tailored to their environment and using terminology familiar to them will make them more comfortable.</li>
</ul>
</li>
<p></br></p>
<li><strong>It is helpful if you have multiple programming language skills</strong><br />
Since you write code, the customer will expect you to answer questions at the code level. Sometimes you may have to review code segments and provide an opinion. However if your product is providing clients in different languages, these questions may be in a language that is outside of your core competencies. Therefore it is important that you have a at least some knowledge using those languages.<br />
In general the ability to write code in several languages is always an added bonus as you will be a valuable asset to the company.</li>
<p></br></p>
<li><strong>Know thy unix tools</strong><br />
   Also if you are in the unix world it is nice to have some skills in basic unix tools like top, vmstat, pmap, netstat, sar, lsof ..etc and text processing languages like perl, awk, sed etc. These tools can help you diagnose issues and obtain important information about the env. The text processing tools will be invaluable  when you need to make sense out of massive log files or other text processing tasks. These skills will make you more productive by allowing you to extract information  quickly and efficiently than just using grep or crunching numbers using a spreadsheet. </li>
<p></br></p>
<li><strong>Keep your conversations professional and never take things personal</strong><br />
You always need to remember that you are representing your company/product and the team you work with. Therefore the people you work with at a customer&#8217;s site may directly vent their frustration at you. This may manifest in the form of rude comments, lack of cooperation and in rare situations a bit of yelling (Fortunately I&#8217;ve only seen only one such incident that happened a few years back) .  Never take them personally or get into any sort of argument. It is best not to take anything personal or get emotionally involved. When the stakes are high and push comes to shove, humans will react and we need to understand that and continue to behave professionally. Sometimes all they expect is for you to keep quiet, listen to them and empathize with their situation. And something simple as &#8220;I hear your point/understand your frustration. We are doing all we can to help&#8221; is all it takes. </p>
<p>However if you are finding it difficult to cope, it is best to bring it to your managers attention and discuss possible measures to address the situation. It&#8217;s a bad idea to just keep quiet and bottle them inside, as you run the risk of an emotional outburst. Let your manager help you by dealing with the management on the customers side. All though the customer is the king, it is not acceptable for anybody to be treated badly.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2009/09/09/survival-tips-for-software-engineers-in-a-customer-facing-role/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Apache Qpid M4 Released</title>
		<link>http://rajith.2rlabs.com/2009/01/28/apache-qpid-m4-released/</link>
		<comments>http://rajith.2rlabs.com/2009/01/28/apache-qpid-m4-released/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 22:54:25 +0000</pubDate>
		<dc:creator>rajith</dc:creator>
		
		<category><![CDATA[AMQP]]></category>

		<category><![CDATA[Announcements]]></category>

		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Qpid]]></category>

		<guid isPermaLink="false">http://rajith.2rlabs.com/2009/01/28/apache-qpid-m4-released/</guid>
		<description><![CDATA[The Apache Qpid community is pleased to announce the release of Apache Qpid M4!
Apache Qpid (http://qpid.apache.org) is a cross platform enterprise messaging solution which implements the Advanced Message Queueing Protocol (http://www.amqp.org). 
It provides brokers written in Java and C++ and clients in C++, Java (including a JMS implementation), .Net, Python, and Ruby.
New features included in [...]]]></description>
			<content:encoded><![CDATA[<p>The Apache Qpid community is pleased to announce the release of Apache Qpid M4!</p>
<p><strong>Apache Qpid (http://qpid.apache.org)</strong> is a cross platform enterprise messaging solution which implements the <strong><em>Advanced Message Queueing Protocol (http://www.amqp.org). </em></strong><br />
It provides brokers written in Java and C++ and clients in C++, Java (including a JMS implementation), .Net, Python, and Ruby.</p>
<p>New features included in this release are:</p>
<ul>
<li> .NET, WCF and excel support for AMQP 0-10</li>
<li>SSL added for C++ broker and all clients</li>
<li>Windows port for C++ client &#038; broker</li>
<li>C++ Broker
<ul>
<li>ACL</li>
<li>Active-Active clustering</li>
<li>Federation, push bridges &#038; dynamic routes</li>
<li>RDMA for C++ broker &#038; C++ client (70-80us, yes us max latency on a well setup machines)</li>
<li>Support for message TTL</li>
<li>Queue options
<ul>
<li>added RING/ STRICT ring</li>
<li>LVQ</li>
</ul>
</li>
<li>Exchange options
<ul>
<li>LVE</li>
<li>message sequencing</li>
</ul>
</li>
<li> XQuery based XML Exchange now as plugin</li>
</ul>
</li>
<li>Performance work</li>
<li>Management for AMQP 0-10
<ul>
<li>QMF C updates (console)
<ul>
<li>Python</li>
<li>C++</li>
</ul>
</li>
<li>QMF Agent
<ul>
<li>C++</li>
</ul>
</li>
<li>QMan JMX bridge for QMF</li>
<li>Alerts/ logger for QMF events</li>
</ul>
</li>
<li>JMSXUserId</li>
<li>Java broker
<ul>
<li>Message Priority</li>
<li>bug fixes</li>
<li>some prep work for AMQP 0-10</li>
</ul>
</li>
</ul>
<p>It is available to download from:<br />
http://www.apache.org/dist/qpid/M4/</p>
<p>Complete release notes are available here:<br />
https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310520&#038;styleName=Html&#038;version=12313279</p>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2009/01/28/apache-qpid-m4-released/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The art of spin bowling</title>
		<link>http://rajith.2rlabs.com/2008/12/23/the-art-of-spin-bowling/</link>
		<comments>http://rajith.2rlabs.com/2008/12/23/the-art-of-spin-bowling/#comments</comments>
		<pubDate>Wed, 24 Dec 2008 02:58:31 +0000</pubDate>
		<dc:creator>rajith</dc:creator>
		
		<category><![CDATA[cricket]]></category>

		<guid isPermaLink="false">http://rajith.2rlabs.com/2008/12/23/the-art-of-spin-bowling/</guid>
		<description><![CDATA[I was always fascinated about spin bowling. I followed Shane Warne and Murali very closely over the years and tried to understand what made a spin bowler great. When YouTube came around there was plenty of videos to study. Then came Ajantha Mendis, who bought a completely different perspective to spin bowling and bamboozled batsmen [...]]]></description>
			<content:encoded><![CDATA[<p>I was always fascinated about spin bowling. I followed Shane Warne and Murali very closely over the years and tried to understand what made a spin bowler great. When YouTube came around there was plenty of videos to study. Then came Ajantha Mendis, who bought a completely different perspective to spin bowling and bamboozled batsmen and pundits alike. </p>
<p>Spin bowling is more art than science. The principles of spin bowling are very simple. One could learn to bowl spin by learning these principles, but mastering them is an art. A closer look at spinners who were successful at their trade, shows that each made an art out of these principles. They had something unusual to offer that set them apart from the rest of the pack.</p>
<p>Looking at some of the greatest spinners, for example <a href=”http://content-usa.cricinfo.com/india/content/player/27591.html”>Bhagwat Chandrasekhar</a> had an unusually whippy action due to a withered arm which was a result of childhood polio. It is said that he delivered googlies, topspinners and leg breaks at near medium pace and eventually producing an unplayable delivery.<a href=”http://content-usa.cricinfo.com/pakistan/content/player/38973.html”> Abdul Qadir</a> had a fancy run up, the temperament of a fast bowler and good variety to back it up. His googly was probably the best. <a href=”http://content-usa.cricinfo.com/ci/content/player/49636.html”>Muttiah Muralitharan</a> was a vicious spinner of the ball on any type of surface.  <a href=”http://content-www.cricinfo.com/ci/content/player/42628.html”>Saqlain Mushtaq</a> was probably the first to use the “doosra” effectively. <a href=”http://content-usa.cricinfo.com/australia/content/player/8166.html”>Shane Warne</a> undoubtedly the best leg spinner we have seen so far, has quite a bit of variation. Then finally you have <a href=”http://content-usa.cricinfo.com/srilanka/content/player/268739.html”>Ajantha Mendis</a> who uses variation as his main weapon. All these folks mixed their unique talent (and their deformity in the case of Mural and Bhagawat) with these principles to create an art form that is almost magical. (For the die hard fans, the above is not an exhaustive list of great spinners. So if your favorite is not listed there please do not think I have thought less about your favorite spinner).</p>
<p>As a bowler you need to consistently beat a variety of batsmen to become a successful bowler. Sure you may get a few freebies when the batsmen eventually makes a mistake (every human is going to make a mistake at some point) or due to pressure at the other end. But if you need to improve your wickets column and become a champion spinner, then you have to ensure that the batsmen makes those mistakes while you are bowling. </p>
<p>There are several ways to beat a batsmen and more often than not a combination of those techniques is what buys you a wicket. Most of these techniques are intertwined. One technique is to try and out think a batsmen. For example Shane Warne always tried to anticipate a batsman&#8217;s move and bowled accordingly. Creating doubts in a batsman&#8217;s mind is another way. Ajantha Mendis is a master at this as he bowls very accurately with subtle changes in the direction where the ball spins. Bhagwat Chandrasekhar didn&#8217;t even know what would happens when he bowled and never planned his deliveries. When a batsman is not picking up the variations he begins to doubt and his confidence suffers, effectively stifling the scoring and increasing the chances of making a mistake. Deceiving a batsmen is another way. You could deceive a batsmen through changes in the amount of spin imparted, pace, line, length , flight or direction of spin by cleverly disguising your variations off the hand. For example a spinner could bowl a quick top spinner, a cleverly disguised googly or an arm ball. The batsmen depending on his ability and concentration level may not pick the subtle change in your action, the pace or the direction it takes off the pitch,  Yet another way is to setup and lead a batsmen into a trap. For example a leg spinner or an off spinner could use their stock ball on a given line and length and then stealthily produce a googly or a doosra on the same line and length inviting the batsmen to make a mistake. Or the trap could come in the way of a cleverly placed field setting.</p>
<p>If we look closely most of the great spinners, have devised their own way of executing those techniques.  The rest are ordinary bowlers who approach spin bowling mechanically as a science and most with a bit of coaching can get there. But the legendary spinners used what ever skill they had to transform spin bowling into an art of it&#8217;s own. Great spinners are not made, they are born.</p>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2008/12/23/the-art-of-spin-bowling/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Microsoft joining Apache Qpid and the AMQP working group</title>
		<link>http://rajith.2rlabs.com/2008/11/07/microsoft-joining-apache-qpid-and-the-amqp-working-group/</link>
		<comments>http://rajith.2rlabs.com/2008/11/07/microsoft-joining-apache-qpid-and-the-amqp-working-group/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 22:42:03 +0000</pubDate>
		<dc:creator>rajith</dc:creator>
		
		<category><![CDATA[AMQP]]></category>

		<category><![CDATA[Announcements]]></category>

		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Qpid]]></category>

		<guid isPermaLink="false">http://rajith.2rlabs.com/2008/11/07/microsoft-joining-apache-qpid-and-the-amqp-working-group/</guid>
		<description><![CDATA[I guess by now many have heard that Microsoft is joining the Apache Qpid project and the AMQP Working Group. Sam Ramji mentioned this during his key note at the Apache Con US 2008. This is indeed great news for both the AMQP working group as well as the Apache Qpid community.
One of the engineers [...]]]></description>
			<content:encoded><![CDATA[<p>I guess by now many have heard that Microsoft is joining the <a href="http://cwiki.apache.org/qpid/index.html">Apache Qpid project</a> and the <a href="http://www.amqp.org">AMQP Working Group</a>. <a href="http://apacheconus2008.crowdvine.com/talks/show/2775">Sam Ramji</a> mentioned this during his key note at the <a href="http://www.us.apachecon.com/c/acus2008/">Apache Con US 2008</a>. This is indeed great news for both the AMQP working group as well as the Apache Qpid community.</p>
<p>One of the engineers from Microsoft <a href="http://port25.technet.com/members/anandeep.aspx">Anandeep Pannu</a>, has <a href="http://port25.technet.com/archive/2008/11/07/finally-dive-into-the-deep-participation.aspx">written very excitedly</a> about participating in Qpid. </p>
<p>In July Sam Ramji <a href="http://port25.technet.com/archive/2008/07/25/oscon2008.aspx">announced a sponsorship</a> for the Apache Software Foundation. It kind of signaled about their intent to get their feet wet with playing an active role in open source. It seems that most large vendors have realized the importance of participating and promoting open source on one hand and also harnessing the power of open source on the other hand. IBM for instance played this strategy very well over the last decade or so. This is very good PR for the Qpid project and hopefully attract more participants and end users to the project. Definitely looking forward to working them in Qpid and the AMQP working group.</p>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2008/11/07/microsoft-joining-apache-qpid-and-the-amqp-working-group/feed/</wfw:commentRss>
		</item>
		<item>
		<title>AMQP in 10 mins - update</title>
		<link>http://rajith.2rlabs.com/2008/11/07/amqp-in-10-mins-update/</link>
		<comments>http://rajith.2rlabs.com/2008/11/07/amqp-in-10-mins-update/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 16:32:17 +0000</pubDate>
		<dc:creator>rajith</dc:creator>
		
		<category><![CDATA[AMQP]]></category>

		<guid isPermaLink="false">http://rajith.2rlabs.com/2008/11/07/amqp-in-10-mins-update/</guid>
		<description><![CDATA[A lot of folks have asked me as to why I have not written the next part in the series after Oct,2007. So I think I owe an explanation.
I guess I started the series a bit early, and at that time the protocol was going through a phase of rapid changes. So I decided to [...]]]></description>
			<content:encoded><![CDATA[<p>A lot of folks have asked me as to why I have not written the next part in the series after Oct,2007. So I think I owe an explanation.<br />
I guess I started the series a bit early, and at that time the protocol was going through a phase of rapid changes. So I decided to wait until the dust has settled, as there is no point in writing about something that may change within a short time. However it took the working group a bit longer than expected to thrash out the 0-10 version.<br />
Now the AMQP working group is working towards a 1.0 release. So I think it would be worthwhile to wait until we have firmed up the 1.0 spec as it makes sense to write about a final 1.0 release than an interim version. I don&#8217;t expect a lot to change between 0-10 and 1.0, and most changes would be to remove certain unnecessary complexity in the 0-10 version and also to incorporate any feedback from the folks who worked on implementing the 0-10 version.</p>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2008/11/07/amqp-in-10-mins-update/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Gartner Hype Cycle</title>
		<link>http://rajith.2rlabs.com/2008/10/21/gartner-hype-cycle/</link>
		<comments>http://rajith.2rlabs.com/2008/10/21/gartner-hype-cycle/#comments</comments>
		<pubDate>Tue, 21 Oct 2008 14:08:35 +0000</pubDate>
		<dc:creator>rajith</dc:creator>
		
		<category><![CDATA[cartoon]]></category>

		<guid isPermaLink="false">http://rajith.2rlabs.com/2008/10/21/gartner-hype-cycle/</guid>
		<description><![CDATA[

Art work is licensed under Creative Commons Attribution-NonCommercial 2.5 License.
]]></description>
			<content:encoded><![CDATA[<p><img width="550" height="504" src='http://2rlabs.com/rajith/blog/wp-content/uploads/2008/10/gartner_hype_cycle_cartooon.jpg'' alt='Gartner Hype Cycle' /><br />
<br />
Art work is licensed under <a href="http://creativecommons.org/licenses/by-nc/2.5/">Creative Commons Attribution-NonCommercial 2.5 License</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2008/10/21/gartner-hype-cycle/feed/</wfw:commentRss>
		</item>
		<item>
		<title>5 reasons why Distributed Systems are hard to program</title>
		<link>http://rajith.2rlabs.com/2008/07/23/5-reasons-why-distributed-systems-are-hard-to-develop/</link>
		<comments>http://rajith.2rlabs.com/2008/07/23/5-reasons-why-distributed-systems-are-hard-to-develop/#comments</comments>
		<pubDate>Wed, 23 Jul 2008 21:14:58 +0000</pubDate>
		<dc:creator>rajith</dc:creator>
		
		<category><![CDATA[Architecture]]></category>

		<category><![CDATA[Distributed Systems]]></category>

		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://rajith.2rlabs.com/2008/07/23/5-reasons-why-distributed-systems-are-hard-to-develop/</guid>
		<description><![CDATA[Here are 5 reasons why I found distributed system are hard to program. This is not some sort of thorough analysis, but merely my observations in dealing with such systems. For completeness, here is the definition of &#8220;Distributed System&#8221; I used.
A distributed system contains of more than one process that runs as a single system. [...]]]></description>
			<content:encoded><![CDATA[<p>Here are 5 reasons why I found distributed system are hard to program. This is not some sort of thorough analysis, but merely my observations in dealing with such systems. For completeness, here is the definition of &#8220;Distributed System&#8221; I used.<br />
<em>A distributed system contains of more than one process that runs as a single system. These processes can be on the same computer or multiple computers that are on a local area network or geographically distributed over a wide area network.</em></p>
<p>Without any further do here are the reasons in no particular order.</p>
<p>
<strong>1. Difficulty in identifying and dealing with failures.</strong><br />
When communicating between processes failures can happen at many levels. Dealing with them is not trivial. Of course you rely on frameworks based on technologies like RMI, CORBA, COM, SOAP, AMQP, REST(is an architectural style not a standard) etc to handle these. But the fact remains that you still need to clearly think about these cases and handle these situations properly.</p>
<p>For example if we consider a simple interaction between two processes on different computers, the following failures can happen.</p>
<ul>
<li>Failures that occur within the process that initiates the communication (sending the message or invoking the RPC call). </li>
<li>Failures between the time the process hands over the request to the OS and the OS writing it to the network.</li>
<li>Network failures between the time it takes to transmit the packets from one computer to the other.</li>
<li>Failures between the time the OS on the receiving end receives the packets and then handing it over to the  recipient process.</li>
<li>Failures that occur when the recipient process tried to <em>process</em> the request/message. </li>
</ul>
<p>Sometimes the framework you use, is unable to/may not report all these error cases. Sometimes when the error is reported, it may not contain enough information to figure out at which level the error occurred.<br />
<em>Did it reach the remote computer? if so how far up the stack did it go?. If the receiving process got the request or message did the error occur before or after the request/message was processed?</em><br />
In some cases where idempotency is built into the the receiving application or the framework/protocol (ex a message client that detects duplicate messages, or doing an HTTP GET) a simple retry maybe ok. In some cases Idempotency and retrying maybe expensive or difficult to implement. In such cases careful thought needs to be given on how these different errors are identified and handled.
</p>
<p>
<strong>2. Achieving consistency in data across processes.</strong><br />
One of the hardest problems in programming distributed systems is achieving a consistent view of data across the processes. When one processes updates some data, you need to replicate them across the other processes, so if any other process decides to operate on the same set of data, then it is doing so on the most current copy.<br />
Lets look at two examples.</p>
<p><em>Assume a global banking application for ABC bank. A customer goes to a branch in New York, US and deposits money to an account. A few moments later his relative in London, UK does a withdraw on that account. Due to latency there is obviously a time lag before the process in London, UK sees the updated amount in the account.</em></p>
<p><em>In an online trading system, a user in NY places an item for sale. The transaction is updated on the closest data center which is in Boston. A few moments later another user in LA is searching for the exact same item and is served off a data center in Phoenix. The user in LA may or may not see the item due to the latency involved in replicating the data across</em></p>
<p>For example 1 <em>strong consistency</em> is required, while for example 2, you could get away with <em>weak consistency</em>, for example by setting an SLA that says data is valid within a 5 min time window.<br />
This is not an easy problem to solve and this area itself is a subject on its own. Wener Vogels wrote a nice peice on this called <a href="http://www.allthingsdistributed.com/2007/12/eventually_consistent.html">Eventually Consistent</a> which is worth reading.<br />
Of course there are specialized frameworks/libraries that can handle this for you. But still there is no escape for you and you pretty much need to have an understanding of the pros and cons of various approaches, failure modes etc.
</p>
<p>
<strong>3. Heterogeneous nature of the components involved in the system.</strong><br />
A distributed system may contain components written in a variety of languages deployed across machines with different architectures and operating systems. Needless to say that this poses certain challenges (especially integration, interoperability issues) when implementing the system. A whole range of standards/technologies were presented to solve these issues, including but not limited to CORBA, SOAP, AMQP, REST (is an architectural style not a standard) and RPC based frameworks like ICE, Thrift, Etch etc. Anyone who has worked with these technologies knows that neither of these are trivial to use nor provide a complete solution in every situation.</p>
<p>If anybody has read the <a href="http://steve.vinoski.net/blog/2008/07/01/convenience-over-correctness/">recent posts</a> by <a href="http://steve.vinoski.net/blog">Steve Vinoski</a> and the discussions around it would realize the issues/challenges surrounding RPC. The following <a href="http://www.hpl.hp.com/techreports/2005/HPL-2005-83.pdf">paper</a> discuss the impedance mismatch problems when working with IDL based systems. The issues with type systems and data formats are not limited to RPC only. When using a message oriented approach like SOAP (doc lit style) or AMQP you will end up tunneling data thats not supported by the protocol as a string or a sequence of bytes. When using REST you would need to represent your resource in a format the requesting application understands/supports, which maybe quite different from the native format.</p>
<p>Again not an easy issue to deal with no matter what technology or framework is used. As an architect/developer you need to understand these issues and deal with them accordingly. </p>
<p>
<strong>4. Testing a distributed system is quite difficult.</strong><br />
This is arguably one of the hardest aspects of developing a distributed system. Verification of the behavior and impact of your code in the system is not easy.<br />
There are many aspects that needs to be tested, and doing so before every checkin is not a fun task at all. Running some of these tests before every checkin is not practical. But its a good idea to run them nightly and some tests during the weekend. Here are some of the areas that needs to be tested (I plan to write another blog entry elaborating on the testing aspects).</p>
<ul>
<li>Functionality testing (can be covered with well written unit testing) </li>
<li>Integration testing - you need to test the distributed system as a whole with all the components involved </li>
<li>Interoperability testing - this is crucial when heterogeneous components (different languages, OS) are involved, and is quite different from integration testing</li>
<li>TCK compliance - If your system is based on standards/specifications, then you need to ensure that you haven&#8217;t broken anything w.r.t compliance </li>
<li>Performance testing - to ensure that your changes haven&#8217;t accidentally caused a degradation in performance</li>
<li>Stress testing  - to ensure that your checkin hasn&#8217;t accidentally caused any stability issues - ex increased chance of deadlocks when the load increases</li>
<li>Soak testing - to ensure that your checkin hasn&#8217;t caused any longevity issues - ex a memory leak thats manifested after a couple hours, days</li>
</ul>
<p>Most often than not developers cut corners in their testing as running these tests are tedious and time consuming. Also these tests need to be run regularly to catch issues in a timely manner and the best way to tackle this issue is to automate as much testing as possible. There many options with continuous build systems like cruisecontrol or using a plain old cron job.<br />
Functionality testing, TCK compliance, certain types of integration and interoperability tests can be run periodically.<br />
In most organizations test machines are just lying around doing nothing during the night (unless around the clock testing is done with development centers in different time zones.). Instead of wasting computing cycles, you could automate test suites to run during the night. More time consuming integration and interoperability tests, performance, stress and soak testing can be done nightly, while more longer duration soak testing can be scheduled to run during the weekends.</p>
<p>While testing is a tough issue for any type of system, distributed systems have a lot more failure points which adds to the complexity.<br />
Getting these tests right to cover these failure points and executing them needs a lot of careful thought and planning.
</p>
<p>
<strong>5. The technologies involved in distributed systems are not easy to understand .</strong><br />
Distributed system are not easy to understand. Neither are the myriad of technologies used in developing these systems.<br />
Most folks find it difficult to grasp the concepts behind these technologies. If you look into the discussions and misconceptions surrounding REST you can understand what I am trying to get at. CORBA  was not an easy spec to understand, so is WS-* or AMQP. While it is true that you don&#8217;t need to understand everything to develop using them, you still need at least a reasonable understanding to figure how to tackle some of the above mentioned issues. Frameworks based on these technologies are touted as the cure for these problems. Sure they could help, but it still does not shift the burden away from you.<br />
To compound the issue all sorts of vendors keep touting their technology/framework as the next silver bullet.  No matter what vendor you use, at the end of the day <a href="http://rajith.2rlabs.com/2007/10/29/architecture-is-your-responsibility/">you are still responsible for getting it right</a>. And it is not an easy task. You need to face the reality that distributed systems are hard and that you cannot hide every complexity behind some framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2008/07/23/5-reasons-why-distributed-systems-are-hard-to-develop/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Axis2/C has AMQP support via Apache Qpid</title>
		<link>http://rajith.2rlabs.com/2008/06/16/axis2c-has-amqp-support-via-apache-qpid/</link>
		<comments>http://rajith.2rlabs.com/2008/06/16/axis2c-has-amqp-support-via-apache-qpid/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 13:40:24 +0000</pubDate>
		<dc:creator>rajith</dc:creator>
		
		<category><![CDATA[AMQP]]></category>

		<category><![CDATA[Announcements]]></category>

		<category><![CDATA[Axis2]]></category>

		<category><![CDATA[Qpid]]></category>

		<guid isPermaLink="false">http://rajith.2rlabs.com/2008/06/16/axis2c-has-amqp-support-via-apache-qpid/</guid>
		<description><![CDATA[Danushka Menikkumbura has got AMQP support going for Axis2/C via the Apache Qpid project.
This will only work on Linux as the Qpid c++ client so far has only a Linux implementation. Currently there is ongoing work from two contributors trying to port the code base to support Windows and Solaris. This is scoped for the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://wso2.com/about/engineers/danushka/">Danushka Menikkumbura</a> has got AMQP support going for Axis2/C via the Apache Qpid project.<br />
This will only work on Linux as the Qpid c++ client so far has only a Linux implementation. Currently there is ongoing work from two contributors trying to port the code base to support Windows and Solaris. This is scoped for the M3 release.</p>
<p>Watch the WSO2 blog space or the Axis2/C website for a tutorial/blog post from Danushka.</p>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2008/06/16/axis2c-has-amqp-support-via-apache-qpid/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
