<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Connecting the Dots</title>
	<atom:link href="http://indraneelc.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://indraneelc.wordpress.com</link>
	<description>o o o o o o o o o o o o o o o o o o o</description>
	<lastBuildDate>Fri, 30 Apr 2010 12:08:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='indraneelc.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/460a94f239d39d0768e06f233ab0509d?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Connecting the Dots</title>
		<link>http://indraneelc.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://indraneelc.wordpress.com/osd.xml" title="Connecting the Dots" />
	<atom:link rel='hub' href='http://indraneelc.wordpress.com/?pushpress=hub'/>
		<item>
		<title>SVG and Javascript for interactive web graphics</title>
		<link>http://indraneelc.wordpress.com/2010/02/21/svg-and-javascript-for-interactive-web-graphics/</link>
		<comments>http://indraneelc.wordpress.com/2010/02/21/svg-and-javascript-for-interactive-web-graphics/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 17:01:54 +0000</pubDate>
		<dc:creator>Indraneel</dc:creator>
				<category><![CDATA[SVG]]></category>
		<category><![CDATA[Technologies]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://neelchowdhury.com/?p=215</guid>
		<description><![CDATA[This is something that I did quite sometime back. I hadn&#8217;t written a post about it at that time. So I thought it maybe worth the time to write a little about this. I was handed the responsibility to come up with a front-end technology for developing a cool online game. Initially we thought of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=215&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This is something that I did quite sometime back. I hadn&#8217;t written a post about it at that time. So I thought it maybe worth the time to write a little about this.<br />
I was handed the responsibility to come up with a front-end technology for developing a cool online game. Initially we thought of using flash but then I remembered about SVG from my earlier days when we were creating an application to convert CGM graphics to SVG so that the images and image fragments could be indexed and searched. If you are not familiar, SVG is a language for describing 2 dimensional graphics in XML. SVG is really &#8220;the&#8221; way for interactive web graphics. And after W3C came up with SVG Tiny more and more smart mobile phones have started supporting SVG as a native format for their browsers. For example &#8211; the mobile Safari browser in iPhone has native support for SVG.<br />
One of the requirements of the game was to allow the user to draw polygons on a canvas. And then the application had to determine whether a graphic object say, a circle, is inside a polygon that is drawn by the user.<br />
In order to give my team with a headstart I created a little prototype which lets a user click on a canvas to create a polygon. It assumes that all points are on the same polygon until the &#8220;Complete Poly&#8221; button is clicked. More polygons can then be created by clicking on different points on the canvas and then clicking the &#8220;Complete Poly&#8221; button. A red circle can be dragged to one of the polygons. And on clicking &#8220;Where?&#8221; it prints out inside which polygon the red circle is. Since this was just a prototype, I created the Javascript functions inside the SVG document itself.<br />
<div id="attachment_229" class="wp-caption alignnone" style="width: 610px"><a href="http://indraneelc.files.wordpress.com/2010/02/polygons.png"><img src="http://indraneelc.files.wordpress.com/2010/02/polygons.png?w=600&#038;h=423" alt="SVG polygons" title="Polygons" width="600" height="423" class="size-full wp-image-229" /></a><p class="wp-caption-text">SVG polygons</p></div><br />
Interactivity is achieved by manipulating the SVG DOM at runtime by Javascript. It&#8217;s really the same as manipulating the HTML DOM with Javascript.<br />
Here is the SVG fragment that I used for my prototype:<br />
<code><br />
<em><br />
&lt;rect width="100%" height="100%" style="fill:blue;stroke:black;stroke-width:5;fill-opacity:0.1;stroke-opacity:0.9" /&gt;<br />
&lt;text x="15" y="50" font-family="Verdana" font-size="14" fill="black"&gt; Complete Poly&lt;/text&gt;<br />
&lt;text x="155" y="50" font-family="Verdana" font-size="16" fill="black"&gt; Where? &lt;/text&gt;<br />
&lt;rect id="button1" x="10" y="30" width="110" height="30" style="fill:green;stroke:black;stroke-width:3;fill-opacity:0.7;stroke-opacity:0.9" onclick="completepoly(evt)" /&gt;<br />
&lt;rect id="button2" x="150" y="30" width="70" height="30" style="fill:green;stroke:black;stroke-width:3;fill-opacity:0.7;stroke-opacity:0.9" onclick="in_or_out(evt)" /&gt;<br />
&lt;circle id="circ2" cx="700" cy="70" r="20" fill="red" /&gt;<br />
</em><br />
</code></p>
<p>Here is my Canvas. As you see it has got three rectangles. The first one is the canvas on which the polygons are drawn. On the other two I place two text nodes &#8211; &#8220;Complete Poly&#8221; and &#8220;Where?&#8221;. I use these rectangles as buttons by creating handlers for them when they are clicked.<br />
When users click on the canvas, those points serve as the vertices of the polygon they want to draw. When they click the rectangle with id &#8211; &#8220;button1&#8243;, the polygon is complete and the subsequent clicks on the canvas are taken to be the vertices of the next polygon.<br />
Here is how the Javascript function to add the vertices onto the polygon and draw them looks like:<br />
<code><em><br />
function add(evt){<br />
			if (evt.target.getAttribute("id") =="button1" || evt.target.getAttribute("id") =="button2" || isDrawingDone == 1)<br />
				return<br />
			points = points + evt.clientX + ","+ evt.clientY + " "<br />
			indices += 1;</p>
<p>			if(indices &gt; 2)<br />
			{<br />
				var target = evt.target<br />
			   	if ( window.svgDocument == null )<br />
			   		svgDocument = evt.target.ownerDocument;</p>
<p>			    var shape = svgDocument.createElementNS(xmlns, "polygon");<br />
			    shape.setAttributeNS(null, "id", "poly"+polyindx);<br />
			    shape.setAttributeNS(null, "points", points);<br />
			    shape.setAttributeNS(null, "fill", "none");<br />
			    shape.setAttributeNS(null, "stroke", "red");<br />
			  shape.setAttributeNS(null, "stroke-width", "3");<br />
			  	if(polyindx &gt; 0 )<br />
			  	{<br />
			  		for (var indx = 0;polyindx &gt;= indx;indx++)<br />
			  		{<br />
			  			var polyid = "poly"+indx;<br />
			  			var polyg = document.getElementById(polyid);<br />
			  			if(polyg != null)<br />
			  			{<br />
			  				svgDocument.documentElement.removeChild(polyg);</p>
<p>			  			}<br />
			  		}<br />
			  	}<br />
			  	         svgDocument.documentElement.appendChild(shape);<br />
			  	polyindx +=1;<br />
	}<br />
</em></code><br />
As you would see from the code that each time the user clicks on the canvas, I&#8217;m drawing a polygon with all the available vertices. But I also want to erase off the previous polygons that I had drawn earlier. This is done by following a naming convention, so that the finder looks incrementally through the ids and deletes them. If I didn&#8217;t delete those polygons it would have looked like this:<br />
<a href="http://indraneelc.files.wordpress.com/2010/02/incremental-polygons.png"><img src="http://indraneelc.files.wordpress.com/2010/02/incremental-polygons.png?w=300&#038;h=210" alt="" title="Incremental Polygons" width="300" height="210" class="alignnone size-medium wp-image-226" /></a><br />
But erasing the polygons poses a new problem. When I&#8217;m done with the first polygon, and I start drawing the new polygon, I want the first one to stay. So I cheat here and rename the last polygon I created breaking away from the naming convention I was following so that the finder does not find this one while trying to delete them.<br />
And Finally when the user clicks &#8220;Complete Poly&#8221;, the following function is executed:</p>
<hr />
<code><br />
<em><br />
		function completepoly(evt)<br />
		{<br />
			var polyidindx = polyindx-1;<br />
			var polyg = document.getElementById("poly"+ polyidindx);<br />
			if(polyg != null)<br />
			{<br />
				currpolyindx = polyidindx*11;<br />
				polyg.setAttributeNS(null, "id", "region"+currpolyindx);<br />
			}<br />
			points = "";</p>
<p>		}</p>
<p></em></code><br />
And finally, the function &#8211; in_or_out determines inside which polygon the circle lies:<br />
<code><em><br />
			function in_or_out(evt)<br />
			{<br />
			 	isDrawingDone = 1;<br />
			 	if(document.getElementById("txt1") != null)<br />
			 	{<br />
			 		var txtnode = document.getElementById("txt1");<br />
			 		Root.removeChild(txtnode);<br />
			 	}<br />
				var shape = document.getElementById("circ2");<br />
				var polygons = document.getElementsByTagNameNS(xmlns, "polygon");</p>
<p>				var indx = 0;<br />
				var foundflag = 0;<br />
				var numpolygons = polygons.length;<br />
				var data="Outside";</p>
<p>				for(var indx=0; numpolygons&gt;indx;indx++)<br />
				{</p>
<p>			   		var points = polygons.item(indx).getAttribute("points");<br />
					var parray = points.split(" ");<br />
					var numvertices = parray.length;<br />
					var vertx = new Array();<br />
					var verty = new Array();<br />
					var ix = 0;<br />
					while(numvertices &gt; ix)<br />
					{<br />
						vertx.push(parray[ix].split(",")[0]);<br />
						verty.push(parray[ix].split(",")[1]);<br />
						ix=ix+1;<br />
					}</p>
<p>					if ( isPointinPoly(numvertices, vertx, verty, shape.getAttribute("cx"), shape.getAttribute("cy")))<br />
			   			{<br />
			   				data = document.createTextNode("Inside Region =&gt;" + indx);<br />
			   				foundflag = 1;<br />
                                                        break;<br />
			   			}<br />
			   			else<br />
			   			{<br />
			   				data = document.createTextNode("Outside All Regions");<br />
			   			}<br />
				}<br />
				var text = document.createElementNS(xmlns, "text");<br />
				text.setAttributeNS(null, "font-size", "12pt");<br />
				text.setAttributeNS(null, "x", 30);<br />
				text.setAttributeNS(null, "y", 500);<br />
				text.setAttributeNS(null, "id", "txt1");<br />
				text.appendChild(data);<br />
				Root.appendChild(text);						</p>
<p>				return;<br />
			}<br />
</em><br />
</code></p>
<hr />
Pretty simple, isn&#8217;t it? This, in short was the base on which the <a href="http://innovationgames.com/">Innovation Game</a> &#8211; Prune The Product Tree was built. </p>
<br />Filed under: <a href='http://indraneelc.wordpress.com/category/technologies/svg/'>SVG</a>, <a href='http://indraneelc.wordpress.com/category/technologies/'>Technologies</a> Tagged: <a href='http://indraneelc.wordpress.com/tag/javascript/'>Javascript</a>, <a href='http://indraneelc.wordpress.com/tag/svg/'>SVG</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/indraneelc.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/indraneelc.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/indraneelc.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/indraneelc.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/indraneelc.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/indraneelc.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/indraneelc.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/indraneelc.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/indraneelc.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/indraneelc.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/indraneelc.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/indraneelc.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/indraneelc.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/indraneelc.wordpress.com/215/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=215&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://indraneelc.wordpress.com/2010/02/21/svg-and-javascript-for-interactive-web-graphics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>28.576000 77.369101</georss:point>
		<geo:lat>28.576000</geo:lat>
		<geo:long>77.369101</geo:long>
		<media:content url="http://0.gravatar.com/avatar/46e1cbbd102fdda109ce6a0f1e2f492d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">indraneel</media:title>
		</media:content>

		<media:content url="http://indraneelc.files.wordpress.com/2010/02/polygons.png" medium="image">
			<media:title type="html">Polygons</media:title>
		</media:content>

		<media:content url="http://indraneelc.files.wordpress.com/2010/02/incremental-polygons.png?w=300" medium="image">
			<media:title type="html">Incremental Polygons</media:title>
		</media:content>
	</item>
		<item>
		<title>Medical records and the new playing field</title>
		<link>http://indraneelc.wordpress.com/2010/01/31/medical-records-and-the-new-playing-field/</link>
		<comments>http://indraneelc.wordpress.com/2010/01/31/medical-records-and-the-new-playing-field/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 17:06:35 +0000</pubDate>
		<dc:creator>Indraneel</dc:creator>
				<category><![CDATA[Healthcare]]></category>
		<category><![CDATA[EHR]]></category>
		<category><![CDATA[EMR]]></category>

		<guid isPermaLink="false">http://neelchowdhury.com/?p=200</guid>
		<description><![CDATA[Recently one of our clients was looking to build a product in the healthcare domain which involved accessing and modifying medical records. As a part of the initial engagement I did a comparative study of a few EHRs, EMRs and PHRs. There are just too many of them now, each targeted towards a market of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=200&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Recently one of our clients was looking to build a product in the healthcare domain which involved accessing and modifying medical records. As a part of the initial engagement I did a comparative study of a few EHRs, EMRs and PHRs. There are just too many of them now, each targeted towards a market of their choice. What impressed me is the amount of integrations that are possible with some of these systems. The good ones come with drug database, insurance claims process, ePrescription integration and a host of others. However, what really struck me is the fact that very few of them use modern application delivery methods. If fact a lot of them are still stuck at desktop application/client-server mode. Some have the ASP model. Few, very few have made the transition towards SaaS. Needless to say, these systems need to head towards the direction the world is headed.<br />
The electronic revolution in medical instruments have been going on for a very long time now. But the rise in the use consumer medical instruments is pretty recent. Today we have blood glucose and pressure monitors in almost every homes. And this got me thinking &#8211; how cool it would be if these equipments can automatically send the measurements to say, the PHRs. Yes, we are looking at a new playing field if you are thinking what I&#8217;ve been thinking.</p>
<br />Filed under: <a href='http://indraneelc.wordpress.com/category/healthcare/'>Healthcare</a> Tagged: <a href='http://indraneelc.wordpress.com/tag/ehr/'>EHR</a>, <a href='http://indraneelc.wordpress.com/tag/emr/'>EMR</a>, <a href='http://indraneelc.wordpress.com/tag/healthcare/'>Healthcare</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/indraneelc.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/indraneelc.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/indraneelc.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/indraneelc.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/indraneelc.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/indraneelc.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/indraneelc.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/indraneelc.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/indraneelc.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/indraneelc.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/indraneelc.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/indraneelc.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/indraneelc.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/indraneelc.wordpress.com/200/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=200&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://indraneelc.wordpress.com/2010/01/31/medical-records-and-the-new-playing-field/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>28.576000 77.369101</georss:point>
		<geo:lat>28.576000</geo:lat>
		<geo:long>77.369101</geo:long>
		<media:content url="http://0.gravatar.com/avatar/46e1cbbd102fdda109ce6a0f1e2f492d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">indraneel</media:title>
		</media:content>
	</item>
		<item>
		<title>Getting started with the Cloud</title>
		<link>http://indraneelc.wordpress.com/2010/01/25/getting-started-with-the-cloud/</link>
		<comments>http://indraneelc.wordpress.com/2010/01/25/getting-started-with-the-cloud/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 21:17:44 +0000</pubDate>
		<dc:creator>Indraneel</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[Product Engineering]]></category>

		<guid isPermaLink="false">http://neelchowdhury.com/?p=161</guid>
		<description><![CDATA[There has been so much of hoo-ha about the cloud in recent days that it&#8217;s really difficult to filter out the noise. A lot of times I get this question from people &#8211; &#8220;So how do we start using the cloud?&#8221; With the slew of cloud vendors and underlying technologies, it&#8217;s really pretty easy to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=161&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>There has been so much of hoo-ha about the cloud in recent days that it&#8217;s really difficult to filter out the noise. A lot of times I get this question from people  &#8211; &#8220;So how do we start using the cloud?&#8221; With the slew of cloud vendors and underlying technologies, it&#8217;s really pretty easy to start using the cloud in our day-to-day lives. In this post I will talk only about the IaaS cloud, Amazon cloud components in particular. But you can choose any vendor you like. </p>
<h4> Rapid provisioning and disposal of engineering environments </h4>
<p>&nbsp;<br />
One of the biggest advantages of the cloud is that you can fire up an instance in the blink of an eye. OK, maybe not in the blink of an eye, but if you are using Amazon EC2, it takes about 3-5 minutes to fire up an instance. And that is probably umpteen times faster than your IT department provisioning a server for you. And this gives us the opportunity to rapidly provision engineering environments like testing, staging etc. at will. It also saves a great deal of money if you throw away the instance when you don&#8217;t need it. Say, you are at towards the end of the first sprint of the first release of the product. The product owner would need to see the demo of the working product at the end of the sprint. He would also like to play with the product a little. But you don&#8217;t want to give out your testing environment so that the product owner and the testers don&#8217;t step on each other&#8217;s toes. So what do you do. You fire up another instance of the AMI that you saved with all the configurations, pre-requisite software and libraries that&#8217;s needed to run the product and deploy the finished product to that instance right before the day of the demo. How much time would it take. Not more than 3-5 minutes, for launching the instance and maybe 10 minutes for the product if you have set up automated deployment.<br />
When the product owner is done with playing around, you can just bring down the instance with the click of a button. It is really that simple.<br />
<a href="http://indraneelc.files.wordpress.com/2010/01/rapid-provisioning.png"><img src="http://indraneelc.files.wordpress.com/2010/01/rapid-provisioning.png?w=600" alt="Cloud - Rapid provisioning of engineering environments" title="Rapid provisioning of engineering environments" width="600"/></a><br />
</p>
<h4> Deployment of several versions of products</h4>
<p>&nbsp;<br />
In order to keep development work on groups of features independent of each other for one of the products that we were building, we created branches on which groups of developers would work. This is an excellent strategy if you have short development cycles because if there are a group of features that need to go in simultaneously into the product, you can have a (relatively) long running branch. However these branches have to be tested independently. Also, just before the release, you will have to do away with these branches, deploy the trunk after the merge has happened and test that too. So you will need different versions of the product, residing in separate branches deployed at the same time. And that&#8217;s where the cloud comes in handy because you can provision and dispose in a jiffy.<br />
<a href="http://indraneelc.files.wordpress.com/2010/01/automated-deployments.png"><img src="http://indraneelc.files.wordpress.com/2010/01/automated-deployments.png?w=600" alt="Cloud - Automated Deployments" title="Automated Deployments" width="600"/></a><br />
</p>
<h4>Saving application state </h4>
<p>&nbsp;<br />
Have you ever faced the situation when you found a huge bug in a product but the developers could not replicate it and marked the bug as invalid? I bet you have. A lot of times even saving the bug as a video as mentioned in one of my posts, does not help unearthing the real problem. That&#8217;s because, most of the times, these issues are embedded in the environment or the data. How good it would be if you could freeze the entire state of the application &#8211; session, data, environment and all, bundle it all up and gave it to the development team. Some developers will hate you for that, but I&#8217;m sure they&#8217;ll thank you later. One of the biggest advantages the cloud gives us is bundling up the entire environment. If you are using Amazon EC2, you can just bundle up the instance, data, environment, session and all into an AMI and go on your way of testing the application again.<br />
<a href="http://indraneelc.files.wordpress.com/2010/01/saving-application-state.png"><img src="http://indraneelc.files.wordpress.com/2010/01/saving-application-state.png?w=600" alt="Cloud - Saving the application state" title="Saving application state" width="600"/></a><br />
</p>
<h4>Cloudification of a part of the application services </h4>
<p>&nbsp;<br />
If you are in an organization where you cannot deploy anything outside the organization firewalls due to security policy or if the product itself is such that using public infrastructure like the Amazon cloud is not a viable option (one example could be IP protection), you can still use the cloud. Let me take the example of an application that indexes huge documents or maybe media amongst doing a lot of other things. Now, indexing media is very computationally intensive. And what is the cloud good for if it can&#8217;t take up the burden of computationally intensive stuff? You can keep the entire application inside the firewall and host a web-service on the cloud which listens for indexing requests and fires up an instance as soon as it gets one and processes the request. Better yet, you can enable Amazon Cloudwatch and set thresholds so that it fires up more instances when one instance is thrashing. Simple but powerful.<br />
<br /> &nbsp;<br />
<a href="http://indraneelc.files.wordpress.com/2010/01/cloudify-only-part-of-application-services2.png"><img src="http://indraneelc.files.wordpress.com/2010/01/cloudify-only-part-of-application-services2.png?w=600" alt="Cloudify a part of application services" title="Cloudify a part of application services" width="600"/></a><br />
<br />
As you can see, it&#8217;s really easy to start taking the advantages of public cloud components. So go ahead and get started today.</p>
<br />Posted in Cloud Computing Tagged: Cloud Computing, Product Engineering <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/indraneelc.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/indraneelc.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/indraneelc.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/indraneelc.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/indraneelc.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/indraneelc.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/indraneelc.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/indraneelc.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/indraneelc.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/indraneelc.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/indraneelc.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/indraneelc.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/indraneelc.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/indraneelc.wordpress.com/161/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=161&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://indraneelc.wordpress.com/2010/01/25/getting-started-with-the-cloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>28.576000 77.369101</georss:point>
		<geo:lat>28.576000</geo:lat>
		<geo:long>77.369101</geo:long>
		<media:content url="http://0.gravatar.com/avatar/46e1cbbd102fdda109ce6a0f1e2f492d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">indraneel</media:title>
		</media:content>

		<media:content url="http://indraneelc.files.wordpress.com/2010/01/rapid-provisioning.png" medium="image">
			<media:title type="html">Rapid provisioning of engineering environments</media:title>
		</media:content>

		<media:content url="http://indraneelc.files.wordpress.com/2010/01/automated-deployments.png" medium="image">
			<media:title type="html">Automated Deployments</media:title>
		</media:content>

		<media:content url="http://indraneelc.files.wordpress.com/2010/01/saving-application-state.png" medium="image">
			<media:title type="html">Saving application state</media:title>
		</media:content>

		<media:content url="http://indraneelc.files.wordpress.com/2010/01/cloudify-only-part-of-application-services2.png" medium="image">
			<media:title type="html">Cloudify a part of application services</media:title>
		</media:content>
	</item>
		<item>
		<title>Continuous performance testing</title>
		<link>http://indraneelc.wordpress.com/2010/01/23/continuous-performance-testing/</link>
		<comments>http://indraneelc.wordpress.com/2010/01/23/continuous-performance-testing/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 20:07:20 +0000</pubDate>
		<dc:creator>Indraneel</dc:creator>
				<category><![CDATA[Performance Engineering]]></category>
		<category><![CDATA[Product Engineering]]></category>

		<guid isPermaLink="false">http://neelchowdhury.com/?p=142</guid>
		<description><![CDATA[Once I asked an engineering manager what they were doing to ensure that the product they were building would be able to endure peak load. After a blank stare, all I got was that they were adding features and would worry about performance later, when they development hubbub settled down. After the product was built [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=142&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Once I asked an engineering manager what they were doing to ensure that the product they were building would be able to endure peak load. After a blank stare, all I got was that they were adding features and would worry about performance later, when they development hubbub settled down.<br />
After the product was built one of the team members ran a performance test and found out a lot of the user actions took an inordinately amount of time to complete even under a concurrent user load of just 5.<br />
Leaving out performance considerations till the end of the development cycles is just dangerous. I have seen teams who were forced to make architectural changes right before the release and then scurry to meet release deadlines, because they never found out what the performance impact of an architectural decision they took 4 sprints ago.<br />
That said, in one of the product teams that I was working with, found out that some of the user actions was taking an inordinate amount of time because users complained about it. This is perhaps the last thing that you want. But anyways, we agreed that we needed to know performance impact of each new feature we pushed out and each enhancement we made. We were doing weekly releases and so we knew that it would really require quite a bit of automation. Choosing performance scenarios, creating scripts, running them and analyzing the results was too much to be done manually every week.<br />
Enter <strong>Bamboo</strong>, <strong>JMeter</strong> and <a href="http://gruff.rubyforge.org/"><strong>Gruff</strong></a>. Bamboo would run the performance scripts created in JMeter along with the build every Tuesday before the build got pushed to the staging sever. We can store the results for the scenarios in MySQL and create graphs with Gruff and show them as Bamboo &#8220;artifacts&#8221; for the Tuesday builds. Yes, I know what you are thinking. Maybe we should have used the rrdtool instead of MySQL and Gruff. We tried using rrdtool and gave up. Mainly because we wanted to keep all our performance data, not just a window of it. Since we were not running very heavy loads we decided to generate the load from the Bamboo machine itself since it was a pretty decent machine. We kept the target machine isolated to make sure nothing else was done on it except performance tests.<br />
A ruby script would trigger the JMeter scripts just after the build is complete, bundled and deployed on the target sever by capistrano. For result aggregation we used the XSLT provided by JMeter and tweaked it to produce XML instead of HTML. The aggregated data went into the MySQL database. And then we used Gruff to create the graphs and store them as Bamboo artifacts.<br />
Here is a little sample of what it looked like in the end.<br />
<br />
<a href="http://indraneelc.files.wordpress.com/2010/01/continuousperftest2.png"><img src="http://indraneelc.files.wordpress.com/2010/01/continuousperftest2.png?w=600&#038;h=187" alt="Performance test with Jmeter, Bamboo and Gruff" title="ContinuousPerftest" width="600" height="187" class="alignnone size-full wp-image-151" /></a><br />
<br />
With the performance tests running with every Tuesday builds, it was now easy to see the performance impact of adding the new features or enhancements.</p>
<br />Posted in Performance Engineering, Product Engineering Tagged: Performance Engineering, Product Engineering <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/indraneelc.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/indraneelc.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/indraneelc.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/indraneelc.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/indraneelc.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/indraneelc.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/indraneelc.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/indraneelc.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/indraneelc.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/indraneelc.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/indraneelc.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/indraneelc.wordpress.com/142/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/indraneelc.wordpress.com/142/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/indraneelc.wordpress.com/142/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=142&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://indraneelc.wordpress.com/2010/01/23/continuous-performance-testing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/46e1cbbd102fdda109ce6a0f1e2f492d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">indraneel</media:title>
		</media:content>

		<media:content url="http://indraneelc.files.wordpress.com/2010/01/continuousperftest2.png" medium="image">
			<media:title type="html">ContinuousPerftest</media:title>
		</media:content>
	</item>
		<item>
		<title>Pre-loading the distributed cache</title>
		<link>http://indraneelc.wordpress.com/2010/01/22/pre-loading-the-distributed-cache/</link>
		<comments>http://indraneelc.wordpress.com/2010/01/22/pre-loading-the-distributed-cache/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 08:20:37 +0000</pubDate>
		<dc:creator>Indraneel</dc:creator>
				<category><![CDATA[Product Engineering]]></category>
		<category><![CDATA[Caching]]></category>
		<category><![CDATA[Distributed Caching]]></category>

		<guid isPermaLink="false">http://neelchowdhury.com/?p=138</guid>
		<description><![CDATA[We have been using memcache for distributed caching in one of the products that we were working with. We had 4 application servers with 2GB of memory dedicated to memcache in each of the machines. A lot of times when we delivered new functionality or a patch, we needed to restart the memcache servers. And [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=138&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>We have been using memcache for distributed caching in one of the products that we were working with. We had 4 application servers with 2GB of memory dedicated to memcache in each of the machines. A lot of times when we delivered new functionality or a patch, we needed to restart the memcache servers. And then for a day, the site thrashed. We got horrible response times for a lot of our pages which were supposed to be cached. We digged a little deep and found out that the cache loader which was supposed to pre-load the cache needed about 50 hours to complete. No wonder we were getting horrible response times in pages that were supposed to be cached. What we actually needed was a multi-threaded pre-loader running on two different machines. With some code optimizations and 16 threads pre-loading the pages into memcache, it took us about 3 hours.</p>
<br />Posted in Product Engineering Tagged: Caching, Distributed Caching <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/indraneelc.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/indraneelc.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/indraneelc.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/indraneelc.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/indraneelc.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/indraneelc.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/indraneelc.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/indraneelc.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/indraneelc.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/indraneelc.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/indraneelc.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/indraneelc.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/indraneelc.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/indraneelc.wordpress.com/138/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=138&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://indraneelc.wordpress.com/2010/01/22/pre-loading-the-distributed-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/46e1cbbd102fdda109ce6a0f1e2f492d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">indraneel</media:title>
		</media:content>
	</item>
		<item>
		<title>More about email deliverability</title>
		<link>http://indraneelc.wordpress.com/2009/12/20/more-about-email-deliverability/</link>
		<comments>http://indraneelc.wordpress.com/2009/12/20/more-about-email-deliverability/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 17:31:50 +0000</pubDate>
		<dc:creator>Indraneel</dc:creator>
				<category><![CDATA[Product Engineering]]></category>
		<category><![CDATA[Email Deliverability]]></category>

		<guid isPermaLink="false">http://neelchowdhury.com/?p=115</guid>
		<description><![CDATA[Sometime ago I wrote a post about how to send emails without getting flagged as SPAM. Unfortunately I had missed out on a few things. rDNS One of the most important things in email deliverability is rDNS (also known as the PTR record). rDNS stands for &#8220;reverse&#8221; DNS. Here is an example how rDNS works: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=115&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Sometime ago I wrote a <a href="http://wp.me/pdYqi-e">post</a> about how to send emails without getting flagged as SPAM. Unfortunately I had missed out on a few things.</p>
<h4>rDNS</h4>
<p>One of the most important things in email deliverability is rDNS (also known as the PTR record). rDNS stands for &#8220;reverse&#8221; DNS. Here is an example how rDNS works:</p>
<ul>
<li>A mail header says that the sender is abc@abc.com and it was sent from 111.222.333.444</li>
<li>The receiving mail server verifies if 111.222.333.4444 really points to abc.com by a rDNS lookup</li>
</ul>
<p>Mail servers like AOL and Google are very very particular about rDNS i.e &#8211; they would check for reverse DNS entries for each mail received by them. Your important newsletter is almost sure to make it to the bulk email folder if you haven&#8217;t setup the reverse DNS entry for your domain.<br />
<em>Now if you are hosting your nice web-application on Amazon EC2, reverse DNS won&#8217;t work for you, because Amazon won&#8217;t set your reverse lookup. You will have to use a third-party email service like <a href="http://authsmtp.com">authsmtp</a> or <a href="http://fastmail.com">fastmail</a> to send out mass emails with maximum deliverability.<br />
</em></p>
<h4>Domain Keys Identified Mail</h4>
<p>Domain Keys Identified Mail is a method for email authentication (as the DKIM <a href="http://www.dkim.org/">website</a> says). Basically DKIM allows the sender of an email to sign the email using public key cryptography. Prominent email services like Yahoo, Gmail and Fastmail implement DKIM. This is how it works in a nutshell:</p>
<ul>
<li>The sender of the email adds a header-field named “DKIM-Signature” which contains a digital signature of the contents of the header and body of the email message</li>
<li> The receiving SMTP server does a DNS lookup and gets the public key for the domain.</li>
<li> It uses the public key to decrypt the message</li>
</ul>
<p>You can use Javamail with DKIM for sending out that important newsletter from your web application.</p>
<h4> Sender policy Framework </h4>
<p>SPF is a special format DNS record which specifies which machines can send emails for that domain.</p>
<ul>
<li> For example the owner of abc.com can determine which hosts are allowed to send emails whose sender email address ends in @abc.com</li>
<li> Receivers who check SPF can reject messages from unauthorized hosts before receiving the message body</li>
</ul>
<p>And here&#8217;s what the SPF record may look like:<br />
<code><br />
abc.com TXT “v=spf1 ip4:111.222.333.444 –all”<br />
</code></p>
<h4> White lists, Black lists </h4>
<ul>
<li>Blacklists are lists of domain names which are known to send SPAM emails. Basically they are the lists of known offenders.</li>
<li>Whitelists are the opposite &#8211; lists by which an ISP allows someone to bypass spam filters when sending emails to its subscribers</li>
</ul>
<p><b><br />
So &#8230;. Get Registered<br />
</b><br />
<a href="http://www.mxtoolbox.com"><b>MxToolBox</b> </a> and <a href="http://www.returnpath.net"> <b> ReturnPath </b> </a>are both good options</p>
<br />Posted in Product Engineering Tagged: Email Deliverability <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/indraneelc.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/indraneelc.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/indraneelc.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/indraneelc.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/indraneelc.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/indraneelc.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/indraneelc.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/indraneelc.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/indraneelc.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/indraneelc.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/indraneelc.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/indraneelc.wordpress.com/115/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/indraneelc.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/indraneelc.wordpress.com/115/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=115&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://indraneelc.wordpress.com/2009/12/20/more-about-email-deliverability/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<georss:point>28.576000 77.369101</georss:point>
		<geo:lat>28.576000</geo:lat>
		<geo:long>77.369101</geo:long>
		<media:content url="http://0.gravatar.com/avatar/46e1cbbd102fdda109ce6a0f1e2f492d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">indraneel</media:title>
		</media:content>
	</item>
		<item>
		<title>JIRA-git integration</title>
		<link>http://indraneelc.wordpress.com/2009/12/19/jira-and-git/</link>
		<comments>http://indraneelc.wordpress.com/2009/12/19/jira-and-git/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 17:27:58 +0000</pubDate>
		<dc:creator>Indraneel</dc:creator>
				<category><![CDATA[Product Engineering Tools]]></category>
		<category><![CDATA[Integration]]></category>

		<guid isPermaLink="false">http://neelchowdhury.com/?p=98</guid>
		<description><![CDATA[I&#8217;ve been messing around with JIRA for quite sometime now. So when one of our product teams got stuck with integrating JIRA with git, I tried to help. There was a JIRA-git plugin over here and it worked fine. Problems arose when the plugin did not pull out commits to the branches in JIRA. So [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=98&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been messing around with JIRA for quite sometime now. So when one of our product teams got stuck with integrating JIRA with git, I tried to help. There was a JIRA-git plugin over <a href="http://confluence.atlassian.com/display/JIRAEXT/Jira+Git+Plugin">here</a> and it worked fine. Problems arose when the plugin did not pull out commits to the branches in JIRA. So I went ahead and fixed it. Now the plugin pulls up all the changes from the branches but unfortunately it does not show the branch name along with the name of the changed file in the JIRA tab. I&#8217;ll try and fix that soon. In the meantime you can download and use the modified plugin from <a href="http://confluence.atlassian.com/display/JIRAEXT/Jira+Git+Plugin">this location</a>.</p>
<br />Posted in Product Engineering Tools Tagged: Integration, Product Engineering Tools <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/indraneelc.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/indraneelc.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/indraneelc.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/indraneelc.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/indraneelc.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/indraneelc.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/indraneelc.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/indraneelc.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/indraneelc.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/indraneelc.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/indraneelc.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/indraneelc.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/indraneelc.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/indraneelc.wordpress.com/98/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=98&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://indraneelc.wordpress.com/2009/12/19/jira-and-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/46e1cbbd102fdda109ce6a0f1e2f492d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">indraneel</media:title>
		</media:content>
	</item>
		<item>
		<title>Continuous Integration and Automated Deployment for PHP</title>
		<link>http://indraneelc.wordpress.com/2009/01/16/ci-and-autodeploy-php/</link>
		<comments>http://indraneelc.wordpress.com/2009/01/16/ci-and-autodeploy-php/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 18:11:15 +0000</pubDate>
		<dc:creator>Indraneel</dc:creator>
				<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Deployment]]></category>

		<guid isPermaLink="false">http://neelchowdhury.com/?p=84</guid>
		<description><![CDATA[I had set up the Continuous Integration for a few Ruby on Rails products including Workstreamr and PaidInterviews. It was easy with rake, the ci_reporter plugin, rcov and Bamboo. I also used Capistrano for automated deployments after each build. A new product development started a few days ago and I was called upon to setup [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=84&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I had set up the Continuous Integration for a few Ruby on Rails products including <a href="http://www.workstreamr.com">Workstreamr</a> and <a href="http://www.paidinterviews.com">PaidInterviews</a>. It was easy with rake, the ci_reporter plugin, rcov and Bamboo. I also used Capistrano for automated deployments after each build. A new product development started a few days ago and I was called upon to setup the Continuous Integration platform again. It was different this time though. This new product was to be developed in PHP.<br />
Rake is a general purpose build tool just like ant and maven. And Capistrano is the best deployment tool I have encountered so far. So the choice was easy. This is how I created a rake task to execute all the unit tests and produce test coverage reports with PHPUnit.</p>
<p><a href="http://indraneelc.files.wordpress.com/2009/01/one1.png"><img src="http://indraneelc.files.wordpress.com/2009/01/one1.png?w=500&#038;h=252" alt="" title="tasks" width="500" height="252" class="alignnone size-medium wp-image-109" /></a></p>
<p>Yeah, yeah, I know, I could have done the same thing with a shell script. But when I start creating tasks for database migration and such, things are going to get messy and tracking dependencies wouldn&#8217;t be easy with shell script.</p>
<p>PHPUnit can also produce coverage reports. So I included the second task which would produce coverage reports.</p>
<p>Now for the deployment script.</p>
<p><a href="http://indraneelc.files.wordpress.com/2009/01/two.png"><img src="http://indraneelc.files.wordpress.com/2009/01/two.png?w=500&#038;h=500" alt="" title="capistrano" width="500" height="500" class="alignnone size-medium wp-image-108" /></a></p>
<p>And now I bundle all this up neatly in a shell script and give it to Bamboo. Here is what my build-deploy.sh script looks like:</p>
<p><code>#/bin/bash<br />
rake build:report_coverage<br />
cap remote deploy<br />
</code></p>
<br />Posted in Continuous Integration Tagged: Continuous Integration, Deployment <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/indraneelc.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/indraneelc.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/indraneelc.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/indraneelc.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/indraneelc.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/indraneelc.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/indraneelc.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/indraneelc.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/indraneelc.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/indraneelc.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/indraneelc.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/indraneelc.wordpress.com/84/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/indraneelc.wordpress.com/84/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/indraneelc.wordpress.com/84/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=84&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://indraneelc.wordpress.com/2009/01/16/ci-and-autodeploy-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/46e1cbbd102fdda109ce6a0f1e2f492d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">indraneel</media:title>
		</media:content>

		<media:content url="http://indraneelc.files.wordpress.com/2009/01/one1.png?w=300" medium="image">
			<media:title type="html">tasks</media:title>
		</media:content>

		<media:content url="http://indraneelc.files.wordpress.com/2009/01/two.png?w=300" medium="image">
			<media:title type="html">capistrano</media:title>
		</media:content>
	</item>
		<item>
		<title>The PC Quest article</title>
		<link>http://indraneelc.wordpress.com/2009/01/16/the-pc-quest-article/</link>
		<comments>http://indraneelc.wordpress.com/2009/01/16/the-pc-quest-article/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 18:02:25 +0000</pubDate>
		<dc:creator>Indraneel</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>

		<guid isPermaLink="false">http://neelchowdhury.com/?p=81</guid>
		<description><![CDATA[Some of my comments appeared in the January 2009 edition of PC Quest. The online version of it is available over here. Posted in Cloud Computing<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=81&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Some of my comments appeared in the January 2009 edition of PC Quest. The online version of it is available over <a href="http://pcquest.ciol.com/content/content_ITcareers/2009/109010101.asp">here</a>.</p>
<br />Posted in Cloud Computing  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/indraneelc.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/indraneelc.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/indraneelc.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/indraneelc.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/indraneelc.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/indraneelc.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/indraneelc.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/indraneelc.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/indraneelc.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/indraneelc.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/indraneelc.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/indraneelc.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/indraneelc.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/indraneelc.wordpress.com/81/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=81&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://indraneelc.wordpress.com/2009/01/16/the-pc-quest-article/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>28.576000 77.369101</georss:point>
		<geo:lat>28.576000</geo:lat>
		<geo:long>77.369101</geo:long>
		<media:content url="http://0.gravatar.com/avatar/46e1cbbd102fdda109ce6a0f1e2f492d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">indraneel</media:title>
		</media:content>
	</item>
		<item>
		<title>Cloud Computing &#8211; Large scale computing for everyone</title>
		<link>http://indraneelc.wordpress.com/2008/11/02/cloud-computing/</link>
		<comments>http://indraneelc.wordpress.com/2008/11/02/cloud-computing/#comments</comments>
		<pubDate>Sun, 02 Nov 2008 18:40:35 +0000</pubDate>
		<dc:creator>Indraneel</dc:creator>
				<category><![CDATA[Cloud Computing]]></category>
		<category><![CDATA[product deployment]]></category>

		<guid isPermaLink="false">http://indraneelc.wordpress.com/?p=53</guid>
		<description><![CDATA[In the beginning of 2008, New York Times ingested 405,000 very large TIFF images, 3.3 million articles in SGML and 405,000 xml files mapping articles to rectangular regions in the TIFF’s using Amazon Web Services, Hadoop and some custom code. This data was converted to a more web-friendly 810,000 PNG images and 405,000 Javascript files [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=53&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In the beginning of 2008, New York Times ingested 405,000 very large TIFF images, 3.3 million articles in SGML and 405,000 xml files mapping articles to rectangular regions in the TIFF’s using Amazon Web Services, Hadoop and some custom code. This data was converted to a more web-friendly 810,000 PNG images and 405,000 Javascript files containing JSON in less than 36 hours.<br />
<strong></strong></p>
<p><strong>Why is this a big deal?</strong></p>
<p>NASA has been computing on far greater scale than this for a long time. NASA&#8217;s weather simulation software is computationally a lot more complex than indexing documents.<br />
So why is this a big deal? It&#8217;s a big deal because it was neither NASA nor CERN, not even Google. It was a business who did this without buying a single machine. They rented computing power on the fly. They rented slices of a cloud.</p>
<p><strong>What is cloud computing?</strong></p>
<p>A few days ago a journalist said &#8220;There is clear consensus that there is no consensus on what cloud computing is&#8221;. I like to think of cloud computing as the commercialization of computing resources like CPU cycles, storage, memory etc just like public utilities like electricity, water or natural gas. At the very core of the cloud is virtualization. Virtualization is a technique in which software is used to completely simulate or emulate hardware.</p>
<p><strong>Types of clouds</strong></p>
<p>I see two distinct categories of clouds that vendors are selling today:</p>
<ul>
<li><em><strong>Infrastructure as a Service</strong></em> &#8211; IaaS vendors sell raw compute power &#8211; CPU cycles, memory, bandwidth etc. IaaS clouds are complex but with the complexity comes flexibility. Most cloud vendors allow root access to an instance. And hence, specialized knowledge is necessary to handle such flexibility.</li>
<li><em><strong>Platform as a service</strong></em> &#8211; PaaS refers to those clouds which provide frameworks and infrastructure on which users can build applications. PaaS clouds are built on IaaS clouds. Most PaaS clouds are very restrictive. They generally allow users to build applications on a particular set or sets of technologies. For example Google App Engine allows users to build applications using Python only. Portability is an inherent issue with PaaS clouds, because of the lack of standards in this domain. So if you have built an application using Google App Engine and BigTable you probably won&#8217;t be ableto port the data to any other cloud without spending a huge amount of time and money.</li>
</ul>
<p><strong>Inside the cloud</strong></p>
<p>At a very high level clouds are made up of the following layers:</p>
<div id="attachment_74" class="wp-caption alignnone" style="width: 310px"><a href="http://indraneelc.files.wordpress.com/2008/11/cloud2.png"><img class="size-medium wp-image-74" style="margin-top:1px;margin-bottom:1px;" title="cloud2" src="http://indraneelc.files.wordpress.com/2008/11/cloud2.png?w=300&#038;h=249" alt="Inside the cloud" width="300" height="249" /></a><br />
<p class="wp-caption-text">Inside the cloud</p></div>
<ol>
<li>At the very bottom is the hardware layer. Many cloud vendors build their clouds out of of the shelf server class software. For example Joyent uses Dell servers with quad core intel processors for their cloud. Plumbing refers to the networking elements in the cloud with all the fast router, switches and load balancers connected by fiber optic cabling. Clusters, made up of ordinary server class machines make up the skeleton of the cloud.</li>
<li>Storage services refer the storage provided by the cloud. Most cloud vendors offer SAN or NAS storage. Provisioning is generally on the fly and users can ask for virtually unlimited amount of storage.</li>
<li>As mentioned earlier, virtualization is at the very core of the cloud. Virtualization has made creation of a software machine as a clone of an existing one super fast. Think of the cluster (mentioned earlier) as one mega machine with one host OS managing all its resources. Creating virtual machines with pre-defined CPU and memory is fast and easy. Many vendors like Amazon Web Services use Xen virtualization.</li>
<li>Platform services are bunch of pre-installed and packaged goodies that an user of the cloud gets whenever an instance of the cloud is brought up. The LAMP stack supported by AWS and Joyent is an example of platform services.</li>
<li>No matter what the vendor says, if it takes more than 10-15 minutes to bring up an instance, then it is not a cloud. The web services layer is the one that enables users to templatize an instance, bring up a new instance from a template, take backups, restore from a backup etc. instantly, as and when needed.</li>
</ol>
<p><strong>Just in time deployment using the cloud</strong></p>
<p>Deployment of products is messy business. Not so long ago, fledgling organizations had to first calculate the amount of computing resources needed for a launch, translate that into hardware requirements, call up the hardware vendors or the hosting company and wait till they provisioned the hardware and then installed and configured the software. Provisioning, installation and configuration took several days. It was a lose-lose scenario for everyone. Product success meant another cycle of calls and provisioning while the users suffered due to unresponsive software caused due to heavy load. Product failure meant huge losses due to unused hardware.<br />
Not any more with the advent of the cloud. Now product launches can happen at the click of a button with just enough computing resources sitting behind a Virtual IP. The utilization of the resources are closely monitored. New, templatized instances of the cloud are instantiated whenever the threshold for the monitored utilization is reached. The users of the cloud pay for what they use at any instant of time. The users of the product never find it unresponsive, since computing resources are always adequate, just in time to meet the users&#8217; needs.</p>
<p><strong>Large scale computing for all</strong></p>
<p>So long the ability to do large scale computing was within the reach of an elite club of businesses. Google, Amazon and Yahoo were amongst the very few in the club. Few businesses had the means to lay their hands on infrastructure of that scale.  Cloud computing has changed that. Today, a &#8216;large&#8217; Amazon EC2 instance with 4 EC2 compute units (which is equivalent to the capacity of 4 Opteron or Xeon processors) and 7.5 Gigs of memory costs as less as $288 per month.  Users can choose from quite a few operating systems and scale up and down on the fly. Application development platforms like JBoss Enterprise Application Platform and Ruby on Rails come built into it.  Clouds have opened the doors of large scale computing to virtually everyone.</p>
<br />Posted in Cloud Computing Tagged: Cloud Computing, product deployment <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/indraneelc.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/indraneelc.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/indraneelc.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/indraneelc.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/indraneelc.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/indraneelc.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/indraneelc.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/indraneelc.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/indraneelc.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/indraneelc.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/indraneelc.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/indraneelc.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/indraneelc.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/indraneelc.wordpress.com/53/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=indraneelc.wordpress.com&amp;blog=3330534&amp;post=53&amp;subd=indraneelc&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://indraneelc.wordpress.com/2008/11/02/cloud-computing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<georss:point>28.576000 77.369101</georss:point>
		<geo:lat>28.576000</geo:lat>
		<geo:long>77.369101</geo:long>
		<media:content url="http://0.gravatar.com/avatar/46e1cbbd102fdda109ce6a0f1e2f492d?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">indraneel</media:title>
		</media:content>

		<media:content url="http://indraneelc.files.wordpress.com/2008/11/cloud2.png?w=300" medium="image">
			<media:title type="html">cloud2</media:title>
		</media:content>
	</item>
	</channel>
</rss>
