<?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, 01 Apr 2010 20:19:05 +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>Managing Software Projects - Dealing With Change</title>
		<link>http://rajith.2rlabs.com/2010/03/31/managing-software-projects-changes-are-inevitable-are-you-ready/</link>
		<comments>http://rajith.2rlabs.com/2010/03/31/managing-software-projects-changes-are-inevitable-are-you-ready/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 22:28:52 +0000</pubDate>
		<dc:creator>rajith</dc:creator>
		
		<category><![CDATA[Software Engineering]]></category>

		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://rajith.2rlabs.com/2010/03/31/managing-software-projects-changes-are-inevitable-are-you-ready/</guid>
		<description><![CDATA[Managing Software Projects - A Software Engineers Perspective.
Contrary to popular belief, many aspects of a software project could be proactively controlled and managed by an ordinary software engineer to make his/her life easier. Instead of whining about frequent requirement changes, looming deadlines ..etc, there are many things you can do to help yourself retire with [...]]]></description>
			<content:encoded><![CDATA[<p><em>Managing Software Projects - A Software Engineers Perspective.<br />
Contrary to popular belief, many aspects of a software project could be proactively controlled and managed by an ordinary software engineer to make his/her life easier. Instead of whining about frequent requirement changes, looming deadlines ..etc, there are many things you can do to help yourself retire with enough hair left. The &#8220;Managing Software Projects&#8221; series is an attempt at exploring these aspects.</em></p>
<p><strong>Be In A Position Of Strength When Changes Occur (By Maintaining Code In A Ready-To-Ship State).</strong><br />
Rarely does anything in life work according to plan and software projects are no exception.  Simply put,  changes are bound to happen and how you deal with them will determine how successful the project is. Most of these changes will be involuntary and unexpected and the programmers and testers are usually at the receiving end. With deadlines whizzing past you the pressure mounts and the vicious cycle continues. <em>This is where a solid foundation is useful as explained <a href="http://rajith.2rlabs.com/2010/03/29/managing-software-projects-the-way-we-set-it-up-is-how-it-ends-up/">here</a>. If  you have a solid foundation, then it becomes less of a burden to maintain code in a ready-to-ship state at all times.</em> Without that you may not have the ability to respond to changes in a timely manner. Lets look at a few scenarios.</p>
<ul>
<li><em>Sudden requests for demos or alpha/beta builds by influential customers.</em> If you have a continuous build system and you keep your builds reasonably green, then you could literally provide the last successful build. If not  you would need to drop everything you are doing and try to figure out a way to get a stable build. If you have many test failures, you will probably need to fix them first as well.</li>
<li><em>A team member resigns, or falls ill</em>. Unless the project culture had insisted in tested, reviewed and documented code right from the get go, the person who have to take over will need to spend a significant amount of time in getting it going.</li>
<li><em>And our favourite, the customer and/or marketing folks change their mind for the umpteenth time.</em> Again if you have ready-to-ship code backed by an armada of tests (unit, integration, performance, interoprability ..etc) then you are in much better position to make the required changes with confidence.  The tests will provide you instant feedback about the impact. The most important thing is to be able to give an accurate picture of the impact of such a change. If you have evidence to backup your claims then managers, marketing folks and the customer are more likely to listen to you</li>
</ul>
<p><strong>Have A Well Defined Process To Manage Change (No, I am not talking about the process that your organization already has)</strong><br />
Most organizations have a formal process for handling RFE&#8217;s and bug fixes etc. (There are also organizations that are completely at sea when it comes to this). Irrespective of whether there is such a process or not at the organizational level, the engineering team should have it&#8217;s own. Some points to consider from an engineering perspective (as alluded to in my previous post).</p>
<ul>
<li><em>If your organization doesn&#8217;t have a proper process already in place or does not follow the process, then the first thing to do is to work on getting that done. </em> It&#8217;s sad to see that some organizations doesn&#8217;t have such a process, while others did have a process but was frequently ignored for short term convenience. The consequences were disastrous, especially for the poor engineering team, and not to mention that the ability to respond effectively decreases dramatically over time. How such a process should look like and what&#8217;s involved is a separate discussion that I hope to tackle later on.</li>
<li><em>Branching policies for handling releases, hotfixes (these are notorious for making your life dreadful).</em> In my humble experience, having this discussion right at the beginning (and on an ongoing basis) vs later in the project cycle (especially when everybody is under the gun) is whole lot more productive.</li>
<li><em>Handling RFE&#8217;s/critical bug fixes for existing releases.</em> - same as above. Do it when your head is relatively free.</li>
<li><em>Figuring out how to evaluate change requests &#038; who is responsible for what area to make that call</em> While the team leader/manager is ultimately responsible for making a call, they are always not in a good position to make a good decision without input from others. Therefore it want hurt to have folks informally appointed (known within and outside the team) as subject experts in certain areas. Radical changes to the code base, taking on new functionality that directly/indirectly affects a particular area should not be decided without the input from these area experts. All though Apache Qpid is an open source project, most committers will discuss with the area expert (on the dev-list/JIRA) if the commit falls outside the committers core area of expertise. Not only it&#8217;s courteous and reduces friction/disagreements it also ensures things are done correct the first time which minimizes the impact it has on schedule etc..</li>
</ul>
<p><strong>Deal With RFE&#8217;s/Requirement Changes Methodically (instead of being emotional and kicking up a storm).</strong><br />
No matter how swamped your team is and/or how ridiculous the request/requirement is, emotional outbursts or rejecting them with &#8220;not enough time&#8221; ..etc is not going to help.<br />
It&#8217;s in your best interest (and the interest of the customer) to listen, understand, analyse the impact and then compile your response backed with evidence.</p>
<ul>
<li><em>If you make an effort to listen &#038; understand the change request, </em>
<ul>
<li>You may find the real underlying requirement is something else. Which maybe easier to implement after all.</li>
<li>Provide an acceptable alternative</li>
<li>Provide an acceptable workaround until you fix it properly in the next release.</li>
</ul>
</li>
<li><em>If you provide a proper response backed by evidence</em>
<ul>
<li>First of all people are likely to listen to you as you are presenting facts backed by evidence and not mere conjeture .</li>
<li>It helps people to understand the impact and the consequences (Ex half the functionality will not work and would need n extra days).</li>
<li>Even if your opinion is ignored and the change is forced upon, atleast for your own/teams benefit you know how much of an impact you have to deal with. </li>
</ul>
</li>
</ul>
<p><strong>Your Credibility Is Important.</strong><br />
This could go a long way in ensuring your opinion is heard, hence being able to negotiate changes successfully!</p>
<ul>
<li>If you have provided sound judgement in the past, the managers are likely to listen to your opinion.</li>
<li>If you have built credibility with the customers, then they are likely to listen to your opinion, accept your workaround or alternative solution.</li>
</ul>
<p><strong>Ability To Improvise</strong><br />
Sometimes it takes a bit of improvisation to deal with the changes and still beat the clock.  Instead of complaining and whining about the changes, use them as an opportunity to show your worth.<br />
And here are some stories..</p>
<ul>
<li>Once we had to deal with a customer who asked for frequent GUI changes on an application that ran in an embedded device. Suffice to say it was a real pain. At the time one of my colleagues was toying with the idea  of expressing the screens in XML. We promptly adopted it and taught the customer how to customize the screens to their hearts content. My colleague eventually went on to lead the team.</li>
<li>We needed an automated build system to run our test suites in different OS&#8217;s and aggregate results. As the project progressed the permutations grew. We looked around and didn&#8217;t find anything that fit our needs. Then a colleague of ours used our own product to create a distributed automated-build-system.</li>
<li>While working on an application that ran on an embedded device (same as item 1), the QA team had a tough time testing due to the restricted nature of the embedded device. The long test cycle ate into our dev cycle and impacted our turnaround time. I finally wrote a simulation program during my free time that simplified a lot of the testing. I scored some brownie points there, which came handy during the next performance review</li>
</ul>
<p>In summary, a software engineering team can do a lot to mitigate the risks posed by changes that happen throughout the project. How well you negotiate those changes will have a huge impact on the final outcome.</p>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2010/03/31/managing-software-projects-changes-are-inevitable-are-you-ready/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Managing Software Projects - The Way We Set It Up Is How It Ends Up</title>
		<link>http://rajith.2rlabs.com/2010/03/29/managing-software-projects-the-way-we-set-it-up-is-how-it-ends-up/</link>
		<comments>http://rajith.2rlabs.com/2010/03/29/managing-software-projects-the-way-we-set-it-up-is-how-it-ends-up/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 22:26:05 +0000</pubDate>
		<dc:creator>rajith</dc:creator>
		
		<category><![CDATA[Software Engineering]]></category>

		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://rajith.2rlabs.com/2010/03/29/managing-software-projects-the-way-we-set-it-up-is-how-it-ends-up/</guid>
		<description><![CDATA[Managing Software Projects - A Software Engineers Perspective.
Contrary to popular belief, many aspects of a software project could be proactively controlled and managed by an ordinary software engineer to make his life easier. Instead of whining about frequent requirement changes, looming deadlines ..etc, there are many things you can do to help yourself retire with [...]]]></description>
			<content:encoded><![CDATA[<p><em>Managing Software Projects - A Software Engineers Perspective.<br />
Contrary to popular belief, many aspects of a software project could be proactively controlled and managed by an ordinary software engineer to make his life easier. Instead of whining about frequent requirement changes, looming deadlines ..etc, there are many things you can do to help yourself retire with enough hair left. The &#8220;Managing Software Projects&#8221; series is an attempt at exploring these aspects.</em></p>
<p>It amazes me to see how little attention is paid to this simple truth when a software project is undertaken. There is a reason why it&#8217;s said &#8220;you reap what you sow&#8221;. More often than not the success of a software project (for that matter many things in life) depends on how well you have laid the foundation. But It seems far too many think that software projects are immune from simple realities in life. You don&#8217;t need to have elaborate plans or lengthy kick off meetings, but reasonable time and effort needs to be spent on getting the basics right. While none of us have the power to foresee every obstacle that might crop up during the project, there are many aspects that are within our control. And more often than not, these aspects are not given their due recognition, hence taken for granted !</p>
<p><strong> The Way We Set It Up Is How It Ends Up.</strong><br />
What can be managed should be managed right from the start by following the proper process. <strong><em>We all know we need to test, use coding standards, provide documentation, do code reviews, follow process..etc, but how often do we think about these aspects right at the beginning of the project?</strong></em> These are things that we can control to a reasonable extent, but if not paid enough attention could spiral out of control and eat up enough cycles to cause major disruptions in your project later on. </p>
<ul>
<li>How many projects use a continuous build system right from the start? In the first couple of days or so you may not even have enough tests to run, but ensuring that at any given moment the code is compilable and tests are passing will set the tone for the project right at the beginning.</li>
<li>We all think we could write documentation when we have enough functionality, but we soon find out that we have quite a bit to write with not enough time.  Ditto for code review &#038; coding standards.</li>
<li>Same goes for writing tests too!  By the time we decide to write the tests in earnest, we have done quite a bit of coding. All that time saved by not writing tests and a lot more is now wasted doing damage control.</li>
<li>Using a bug tracking system right from the get go is better than using sticky notes:)</li>
<li>How often do we slap in a quick ant file/make file ..etc to <u>get it going soon</u>, thinking we can improve it later as the projects gets more complex. Anybody who had gone through the pain of tinkering with the build system when the project is in full swing knows what I am talking about. Spending some time upfront designing a more robust build system would save you loads of time and frustration down the line.</li>
<li>During the initial setup period, how often do teams discuss about the internal release process, branching policies,  how to handle hotfixes, bug fixes for existing releases etc. If these points are discussed in earnest right at the start, then perhaps you could put in place structure that would accommodate them more easily vs having to bend over backwards at a latter stage of a project when we really need to do it.</li>
</ul>
<p>Simply put, following proper process right at the start will determine how successfully your project ends.</p>
<p><strong>This Applies Even When Your Are Doing A Proof-Of-Concept (And here&#8217;s why)</strong><br />
I have seen many proof-of-concepts being done without using any version control, without adhering to coding standards, using a bug tracking system or writing any sort of tests. The justification being it&#8217;s only a proof-of-concept, and we could do it properly when we get to the real thing. But how many times have we seen the proof-of-concept being used almost as it is as the initial code when the real project starts?</p>
<p><em><strong>Now all of a sudden you have a lump of code, that is not reviewed, documented, tested or version controlled properly. </strong></em>Since no bug tracking was used, all the time spent in testing the POC is now wasted.  While nobody cares about the POC being stable and forgive you readily when the system crashes several times during the demo,  the same allowance is not given when you deliver the real system.  But scarily enough the same unstable code is now being used as the base for the real system. Now is the time you lament about not following proper procedures during the POC development.</p>
<p>Ideally a POC should be what it is - a POC and nothing more. The real system should be started from scratch. But the problem is, we don&#8217;t live in an ideal world!<br />
So if your organization has a history of turning POCs into real systems in double time, then follow process right from the start to avoid a stroke or a heart attack.</p>
<p><strong>The Only Thing That Does Not Change, Is Change Itself. So Plan For It At The Beginning!</strong><br />
Changes are going to happen!  Either the customer or the marketing dept or both will change their mind. These changes will happen for a variety of reasons and more often than not they will need to be accommodated.  We cannot have an architecture that will withstand all the numerous RFE&#8217;s. We cannot plan for everything. But we could still have a plan for dealing with these changes! Having one right at the beginning will save you a load of trouble. You may need this kind of planing at different levels.</p>
<ul>
<li>Most organizations have a process for dealing with changes and RFE&#8217;s. But you may need to have a project specific criteria as well. What might work for one project may not work for another, so the corporate guidelines may be inadequate in covering all scenarios. Working that out right at the beginning and getting approval from all concerned parties may reduce a load of pain at the end.</li>
<li>While you cannot architect for every conceivable change, we could still try to identify areas in the system that can potentially change. Not only this is useful in scheduling, it is also important in the architecture stage as you could try to isolate change as much as you can. Even though you have no control or visibility into how a particular feature might eventually pan out, you still maybe able to isolate it enough to minimize the impact the changes could cause in your system.Identifying areas that could change at the beginning and setting up your architecture in such a way will ensure how well you deal with inevitable changes.</li>
<li>Similarly testing strategies should also be planned with changes in mind. Having this discussion right at the beginning rather than later will no doubt contribute positively towards the success of the project</li>
</ul>
<p>Related to this topic is discussions about resourcing, requirements planning etc. These aspects are critical in properly setting up a project. However the above piece is written more from a software engineers perspective. In some ways the software engineer has very little influence (ex resourcing, requirements planning..) in determining the way a project is setup and in other ways quite a bit is within their sphere of control (ex. the aspects mentioned above). The idea is to maximize what you could manage/control and plan for what you cannot.</p>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2010/03/29/managing-software-projects-the-way-we-set-it-up-is-how-it-ends-up/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Apache Qpid 0.6 Released !</title>
		<link>http://rajith.2rlabs.com/2010/03/26/apache-qpid-06-released/</link>
		<comments>http://rajith.2rlabs.com/2010/03/26/apache-qpid-06-released/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 13:16:36 +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/2010/03/26/apache-qpid-06-released/</guid>
		<description><![CDATA[The Apache Qpid community is happy to announce the release of Apache
Qpid 0.6.
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 C++ and
Java and clients for C++, Java (including a JMS implementation), .Net,
Python, and Ruby.
This release contains many bug fixes and stability improvements [...]]]></description>
			<content:encoded><![CDATA[<p>The Apache Qpid community is happy to announce the release of Apache<br />
Qpid 0.6.</p>
<p>Apache Qpid (http://qpid.apache.org) is a cross platform enterprise<br />
messaging solution which implements the Advanced Message Queueing<br />
Protocol (http://www.amqp.org). It provides brokers written in C++ and<br />
Java and clients for C++, Java (including a JMS implementation), .Net,<br />
Python, and Ruby.</p>
<p>This release contains many bug fixes and stability improvements over<br />
previous release and we recommend that all users upgrade.</p>
<p>New in this release is another .Net WCF implementation which uses the<br />
C++ client library as its transport rather than the native C# client.<br />
This version has improved protocol version interoperability with Java<br />
broker support for the 0-10 and 0-9-1 AMQP protocol versions.</p>
<p>Apache Qpid 0.6 can be downloaded from here:</p>
<p>http://www.apache.org/dist/qpid/0.6</p>
<p>A complete list of the reported features/bugs addressed in this release<br />
can be found here:</p>
<p>https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12310520&#038;styleName=Html&#038;version=12313728</p>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2010/03/26/apache-qpid-06-released/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Apache Qpid - Securing Connections With SSL</title>
		<link>http://rajith.2rlabs.com/2010/03/01/apache-qpid-securing-connections-with-ssl/</link>
		<comments>http://rajith.2rlabs.com/2010/03/01/apache-qpid-securing-connections-with-ssl/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 23:25:34 +0000</pubDate>
		<dc:creator>rajith</dc:creator>
		
		<category><![CDATA[JMS]]></category>

		<category><![CDATA[Qpid]]></category>

		<guid isPermaLink="false">http://rajith.2rlabs.com/2010/03/01/apache-qpid-securing-connections-with-ssl/</guid>
		<description><![CDATA[In some cases you may want to allow connections to your brokers from outside the firewall. For obvious security reasons it&#8217;s recommended to use some form of encryption for such connections. Apache Qpid provides two options for securing connections.

 SSL
 SASL security layer

This articles focuses on how to secure your connections between the C++ broker [...]]]></description>
			<content:encoded><![CDATA[<p>In some cases you may want to allow connections to your brokers from outside the firewall. For obvious security reasons it&#8217;s recommended to use some form of encryption for such connections. Apache Qpid provides two options for securing connections.</p>
<ul>
<li> SSL</li>
<li> SASL security layer</li>
</ul>
<p>This articles focuses on how to secure your connections between the C++ broker (on Linux) and the JMS and C++ clients  with SSL.<br />
I plan to write an entry explaining how to use the SASL security layer in the future.</p>
<p><strong><em>Disclaimer : The SSL tools/techniques used below for creating certificates are for illustration/testing purposes only. For production you need to use certificates from a competent third-party CA or use Professional grade CA software.</em></strong></p>
<p><strong>1.0 Installing SSL Support</strong></p>
<p><strong>1.1 Installing SSL Support For C++ Broker &amp; Client</strong><br />
The C++ Broker/Client uses Mozilla&#8217;s Network Security Services Library (SSL) for SSL support. </p>
<p><strong>1.1.1 Installing From RPMs</strong><br />
For Broker support</p>
<pre>yum install qpidd-ssl</pre>
<p>For Client</p>
<pre>yum install qpidc</pre>
<p><strong>1.1.2 Building From Source</strong></p>
<ul>
<li>Download a released source tarball from <a href="http://qpid.apache.org/download.html">here</a></li>
<li>Make sure you have the following dependencies installed
<ul>
<li> nss <http://www.mozilla.org/projects/security/pki/nss/> </li>
<li> nspr <http://www.mozilla.org/projects/nspr/> </li>
</ul>
</li>
<li>Follow the build instructions given in the INSTALL file located in the source directory</li>
</ul>
<p><strong>1.2 Installing Java Client</strong><br />
Download the Java client from <a href="http://qpid.apache.org/download.html">here</a>.</p>
<p><strong>2.0 Creating the SSL Certificates For Testing</strong><br />
Lets create the required certificates for testing our SSL setup.  For this purpose we are using the Mozilla <a href="http://www.mozilla.org/projects/security/pki/nss/tools/certutil.html">certutil</a> tool.<br />
For more details please read <a href="http://www.mozilla.org/projects/security/pki/nss/ref/ssl/gtstd.html">[1]</a>.</p>
<p><strong>2.1 Setting Up The CA</strong><br />
We need to setup the CA and the self signed root CA certificate.</p>
<ul>
<li>Create a new certificate database in the CA_db directory.
<pre>
             >mkdir CA_db
             >certutil -N -d CA_db
             </pre>
</li>
<li> Create the self-signed Root CA certificate, specifying the subject name for the certificate.
<pre>
             >certutil -S -d CA_db -n "MyRootCA" -s "CN=MyRootCA,O=ACME,ST=Ontario,C=CA" -t "CT,," -x -2
            </pre>
<ul>
<li>It will prompt you for a password. Enter the password you specified when creating the root CA database.</li>
<li>Type &#8220;y&#8221; for &#8220;Is this a CA certificate [y/N]?&#8221;</li>
<li>Press enter for &#8220;Enter the path length constraint, enter to skip [&lt;0 for unlimited path]: &gt;&#8221;</li>
<li>Type &#8220;n&#8221; for &#8220;Is this a critical extension [y/N]?&#8221;</li>
</ul>
</li>
<li> Extract the CA certificate from the CA&#8217;s certificate database to a file.
<pre>
           >certutil -L -d CA_db -n "MyRootCA" -a -o CA_db/rootca.crt
          </pre>
</li>
</ul>
<p><strong>2.2 Creating The Certificates For The Server (Qpid Broker)</strong></p>
<ul>
<li>Create a certificate database for the Qpid Broker.
<pre>
              >mkdir server_db
              >certutil -N -d server_db
             </pre>
</li>
<li>Import the CA certificate into the broker&#8217;s certificate database, and mark it trusted for issuing certificates for SSL client and server authentication.
<pre>
            >certutil -A -d server_db -n "MyRootCA" -t "TC,," -a -i CA_db/rootca.crt
            </pre>
</li>
<li>Create the server certificate request, specifying the subject name for the server certificate. We make the common name (CN) be identical to the hostname of the server. Note that this step generates the server&#8217;s private key, so it must be done in the server&#8217;s database directory.
<pre>
             >certutil -R -d server_db -s "CN=localhost.localdomain,O=ACME,ST=Ontario,C=CA" -a -o server_db/server.req
             </pre>
</li>
<li>This step simulates the CA signing and issuing a new server certificate based on the server&#8217;s certificate request. The new cert is signed with the CA&#8217;s private key, so this operation uses the CA&#8217;s databases. This step leaves the server&#8217;s new certificate in a file.
<pre>
            >certutil -C -d CA_db -c "MyRootCA" -a -i server_db/server.req -o server_db/server.crt -2 -6
            </pre>
<ul>
<li>Select &#8220;0 - Server Auth&#8221; at the prompt</li>
<li>Press 9 at the prompt</li>
<li>Type &#8220;n&#8221; for &#8220;Is this a critical extension [y/N]?&#8221;</li>
<li>Type &#8220;n&#8221; for &#8220;Is this a CA certificate [y/N]?&#8221;</li>
<li>Enter &#8220;-1&#8243; for &#8220;Enter the path length constraint, enter to skip [&lt;0 for unlimited path]: &gt;&#8221;</li>
<li>Type &#8220;n&#8221; for &#8220;Is this a critical extension [y/N]?&#8221;</li>
<li>When prompted password, enter the password you specified when creating the root CA database.</li>
</ul>
</li>
<li>Import (Add) the new server certificate to the broker&#8217;s certificate database in the server_db directory with the appropriate nickname. Notice that no trust is explicitly needed for this certificate.
<pre>
           >certutil -A -d server_db -n localhost.localdomain -a -i server_db/server.crt -t ",,"
           </pre>
</li>
</ul>
<p><strong>2.3 Creating The Certificates For The C++ Client</strong></p>
<ul>
<li>Create a new certificate database in the client_db directory.
<pre>
              >mkdir client_db
              >certutil -N -d client_db
        </li>
<li> Import the CA certificate into the client&#8217;s certificate database, and mark it trusted for issuing certificates for SSL client and server authentication.
<pre>
              >certutil -A -d client_db -n "MyRootCA" -t "TC,," -a -i CA_db/rootca.crt
             </pre>
</li>
<li>Create the client certificate request, specifying the subject name for the certificate.
<pre>
              >certutil -R -d client_db -s "CN=CppClient,O=ACME,ST=Ontario,C=CA" -a -o client_db/client.req
              </pre>
</li>
<li>This step simulates the CA signing and issuing a new client certificate based on the client&#8217;s certificate request. The new cert is signed with the CA&#8217;s private key, so this operation uses the CA&#8217;s databases. This step leaves the client&#8217;s new certificate in a file.
<pre>
             >certutil -C -d CA_db -c "MyRootCA" -a -i client_db/client.req -o client_db/client.crt -2 -6
             </pre>
<ul>
<li>Select &#8220;1 - Client Auth&#8221; at the prompt</li>
<li>Press 9 at the prompt</li>
<li>Type &#8220;n&#8221; for &#8220;Is this a critical extension [y/N]?&#8221;</li>
<li>Type &#8220;n&#8221; for &#8220;Is this a CA certificate [y/N]?&#8221;</li>
<li>Enter &#8220;-1&#8243; for &#8220;Enter the path length constraint, enter to skip [&lt;0 for unlimited path]: &gt;&#8221;</li>
<li>Type &#8220;n&#8221; for &#8220;Is this a critical extension [y/N]?&#8221;</li>
<li>When prompted password, enter the password you specified when creating the root CA database.</li>
</ul>
</li>
<li>Add the new client certificate to the client&#8217;s certificate database in the client_db directory with the appropriate nickname. Notice that no trust is required for this certificate.
<pre>
             >certutil -A -d client_db -n "CppClient" -a -i client_db/client.crt -t ",,"
             </pre>
</li>
</ul>
<p><strong>2.4 Creating The Certificates For The JMS Client</strong></p>
<ul>
<li>Import the CA certificate in to the trust store.
<pre>
             keytool -import -v -keystore trust-store.jks -storepass password -alias RootCA -file CA_db/rootca.crt
             </pre>
</li>
<li>Import the CA certificate in to the key store.  (need for client authentication)
<pre>
             keytool -import -v -keystore key-store.jks -storepass password -alias RootCA -file CA_db/rootca.crt
             </pre>
</li>
<li>Generate keys for the client certificate.
<pre>
             keytool -genkey -alias java-client -keyalg RSA -sigalg MD5withRSA -validity 356 -keystore key-store.jks -storepass password
             </pre>
<p>            Answer the questions accordingly and press enter when prompted for the password to select the same password as the key-store.
       </li>
<li>Create a certificate request.
<pre>
             keytool -certreq -alias java-client -sigalg MD5withRSA -keystore key-store.jks -storepass password -v -file java-client.req
             </pre>
<p>            Answer the questions accordingly and press enter when prompted for the password to select the same password as the key-store.
       </li>
<li>Create a certificate request.
<pre>
             keytool -certreq -alias java-client -sigalg MD5withRSA -keystore key-store.jks -storepass password -v -file java-client.req
             </pre>
<p>            Answer the questions accordingly and press enter when prompted for the password to select the same password as the key-store.
       </li>
<li>Sign the certificate request using CA certificate.
<pre>
             certutil -C -d CA_db -c "MyRootCA" -a -i java-client.req -o java-client.crt  -2 -6
             </pre>
<ul>
<li>Select &#8220;1 - Client Auth&#8221; at the prompt</li>
<li>Press 9 at the prompt</li>
<li>Type &#8220;n&#8221; for &#8220;Is this a critical extension [y/N]?&#8221;</li>
<li>Type &#8220;n&#8221; for &#8220;Is this a CA certificate [y/N]?&#8221;</li>
<li>Enter &#8220;-1&#8243; for &#8220;Enter the path length constraint, enter to skip [&lt;0 for unlimited path]: &gt;&#8221;</li>
<li>Type &#8220;n&#8221; for &#8220;Is this a critical extension [y/N]?&#8221;</li>
<li>When prompted password, enter the password you specified when creating the root CA database.</li>
</ul>
</li>
<li>Import the certificate into the key store.
<pre>
             keytool -import -v -alias java-client -keystore key-store.jks -storepass password -file java-client.crt
             </pre>
</li>
</ul>
<p><strong>3.0 Configuring The C++ Broker To Use SSL</strong></p>
<ul>
<li>The $CERT_LOC denotes the directory where we created the CA_db, server_db, client_db, trust-store.jks and key-store.jks</li>
<li>The broker-pfile needs to contain the password you entered while creating the server_db</li>
<li>If you want to use client authentication, add &#8211;ssl-require-client-authentication to the broker options</li>
</ul>
<p>If starting the broker from an installation.</p>
<pre>
/usr/sbin/qpidd --ssl-cert-db $CERT_LOC/server_db/ \
                       --ssl-cert-password-file $CERT_LOC/broker-pfile \
                       --ssl-cert-name localhost.localdomain \
                       --ssl-port 5674
</pre>
<p>If starting the broker from a source build</p>
<pre>
./src/qpidd --load-module ./src/.libs/ssl.so
                 --ssl-cert-db $CERT_LOC/server_db/ \
                 --ssl-cert-password-file $CERT_LOC/broker-pfile \
                 --ssl-cert-name localhost.localdomain \
                 --ssl-port 5674
</pre>
<p><strong>4.0 Configuring The C++ Client To Use SSL</strong><br />
The following steps needs to be followed to enable SSL on the C++ client side.<br />
The client side options are specified using environment variables.</p>
<ol>
<li> Load the SslConnector.so<br />
              If running from source</p>
<pre>
                       export QPID_LOAD_MODULE=./src/.libs/sslconnector.so
              </pre>
</li>
<li> To open an SSL enabled connection, set the protocol to ssl in the ConnectionSettings passed to Connection::open():
<pre>
                #include <qpid/client/ConnectionSettings.h>
                #include <qpid/client/Connection.h>
                #include <qpid/client/Session.h>

                using namespace qpid::client;

                int main(int , char** ) {

                ConnectionSettings connectionSettings;
                connectionSettings.host = &#8220;localhost&#8221;;
                connectionSettings.port = 5674;
                connectionSettings.protocol=&#8221;ssl&#8221;;

                Connection connection;
                try {
                     connection.open(connectionSettings);
                &#8230;&#8230;
            </pre>
</li>
<li>If client authentication is used, then we need to specify the clients certificate.
<pre>
                 export QPID_SSL_CERT_DB=$CERT_LOC/client_db/
                 export QPID_SSL_CERT_NAME=CppClient
                 export QPID_SSL_CERT_PASSWORD_FILE=$CERT_LOC/cpfile
             </pre>
</li>
</ol>
<p><strong>4.0 Configuring The JMS Client To Use SSL</strong><br />
The following steps needs to be followed to enable SSL on the JMS client side.</p>
<ol>
<li>You need to specify the ssl option and the correct port in the Connection URL
<pre>
                 amqp://guest:guest@test/?brokerlist='tcp://localhost:5674?ssl='true''
              </pre>
</li>
<li>Specify the trust store which contains the CA certificate
<pre>
                -Djavax.net.ssl.trustStore=$CERT_LOC/trust-store.jks \
                -Djavax.net.ssl.trustStorePassword=password \
            </pre>
</li>
<li>If client authentication is used, you need to specify the trust store and the key store which contains the client&#8217;s certificate
<pre>
                -Djavax.net.ssl.keyStore=$CERT_LOC/key-store.jks \
                -Djavax.net.ssl.keyStorePassword=password \
                -Djavax.net.ssl.trustStore=$CERT_LOC/trust-store.jks \
                -Djavax.net.ssl.trustStorePassword=password \
            </pre>
</li>
<li>In case you run into issues adding &#8220;-Djavax.net.debug=ssl&#8221; will enable logging in the Java SSL code</li>
</ol>
<p>If you have any questions please feel free to contact us at users@qpid.apache.org.</p>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2010/03/01/apache-qpid-securing-connections-with-ssl/feed/</wfw:commentRss>
		</item>
		<item>
		<title>97 Things Every Programmer Should Know</title>
		<link>http://rajith.2rlabs.com/2010/02/10/97-things-every-programmer-should-know/</link>
		<comments>http://rajith.2rlabs.com/2010/02/10/97-things-every-programmer-should-know/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 00:03:10 +0000</pubDate>
		<dc:creator>rajith</dc:creator>
		
		<category><![CDATA[Announcements]]></category>

		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://rajith.2rlabs.com/2010/02/10/97-things-every-programmer-should-know/</guid>
		<description><![CDATA[I am honoured to have been able to contribute two chapters (entries) for the book &#8220;97 Things Every Programmer Should Know&#8221; that&#8217;s scheduled to be released this month.
There is nothing really ground breaking here, but rather short useful tips that could help in your goal in becoming a better programmer.  Some of the advice [...]]]></description>
			<content:encoded><![CDATA[<p>I am honoured to have been able to contribute two chapters (entries) for the book <a href="http://oreilly.com/catalog/9780596809492">&#8220;97 Things Every Programmer Should Know&#8221;</a> that&#8217;s scheduled to be released this month.<br />
There is nothing really ground breaking here, but rather short useful tips that could help in your goal in becoming a better programmer.  Some of the advice given is obvious (or even trivial), but they are also what we normally take for granted. While some of those nuggets could potentially save you some trouble, others merely point out a different perspective about an aspect of programming that we may have failed to see. All in all I think it&#8217;s well worth a read. It&#8217;s also available on the wiki <a href="http://programmer.97things.oreilly.com/wiki/index.php/Contributions_Appearing_in_the_Book">here</a>.</p>
<p>This book is part of a new series started by O`reilly where the chapters (or entries) are chosen from a series of contributions (short essays) made by many individuals. The contributions are collected via a wiki and goes through an editing process via a designated editor. Once submissions are edited and agreed upon by the editor and the contributor they get added to a separate section from where the final contributions are chosen. This type of book offers the reader an opportunity to see multiple and varied perspectives of many individuals about the subject as opposed to a single authors perspective. The format of the book also allows for easy reading and the short concise entries are easy to digest. AFAIK there are two other books in the series, <a href="http://oreilly.com/catalog/9780596522704">97 Things Every Software Architect Should Know</a> and <a href="http://oreilly.com/catalog/9780596804169/">97 Things Every Project Manager Should Know</a>.</p>
<p>My contributions were motivated by the daily challenges I faced as a programmer. Refactoring and testing are topics that are relevant to any programmer.<br />
<a href="http://programmer.97things.oreilly.com/wiki/index.php/Before_You_Refactor">Before You Refactor</a> and <a href="http://programmer.97things.oreilly.com/wiki/index.php/Test_While_You_Sleep_%28and_over_Weekends%29">Test While You Sleep (and over Weekends)</a> are based on my humble experience working in the industry for over 10 years. I hope it helps another programmer to avoid the pain I had to go through by learning things the hard way.  <a href="http://www.two-sdg.demon.co.uk/curbralan/kevlin.html">Kevlin Henny</a> was the editor for this book and it was a pleasure to have had the opportunity to work with him. Sometimes it&#8217;s amazing to note how a little bit of editing could make a world of difference. During the process I learnt a few things about writing from Kevlin for which I am very grateful for.</p>
<p>And here is the <a href="http://covers.oreilly.com/images/9780596809492/lrg.jpg">cover page</a> with my mug shot <img src='http://2rlabs.com/rajith/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://rajith.2rlabs.com/2010/02/10/97-things-every-programmer-should-know/feed/</wfw:commentRss>
		</item>
		<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[Middleware]]></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[JMS]]></category>

		<category><![CDATA[Middleware]]></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>
	</channel>
</rss>

