<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-35310414</id><updated>2012-02-25T14:06:45.250+05:30</updated><category term='Shell'/><category term='CDH3'/><category term='LZO'/><category term='TDD'/><category term='RAILS'/><category term='Agile'/><category term='Ruby'/><category term='GridGain'/><category term='Learnings'/><category term='Scrum'/><category term='Hibernate'/><category term='HBase'/><category term='Logging'/><category term='Design'/><category term='Documentation'/><category term='Configure'/><category term='Java'/><category term='ActionMailer'/><title type='text'>A thinking programer's blog</title><subtitle type='html'>&lt;a href="http://www.twitter.com/srikanthps"&gt;&lt;img src="http://twitter-badges.s3.amazonaws.com/follow_me-a.png" alt="Follow srikanthps on Twitter"&gt;&lt;/a&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.srikanthps.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default?start-index=26&amp;max-results=25'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-35310414.post-3367117281487008362</id><published>2011-08-06T15:48:00.007+05:30</published><updated>2011-08-15T16:07:24.644+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='LZO'/><category scheme='http://www.blogger.com/atom/ns#' term='CDH3'/><category scheme='http://www.blogger.com/atom/ns#' term='HBase'/><category scheme='http://www.blogger.com/atom/ns#' term='Configure'/><title type='text'>Configuring LZO Compression for CDH3 HBase</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;This post explains steps for "Configuring LZO Compression for CDH3 HBase" and it applies to CDH3 HBase 0.90.1 and above.&amp;nbsp;&amp;nbsp; Main source of this post is &lt;a href="http://wiki.apache.org/hadoop/UsingLzoCompression"&gt;http://wiki.apache.org/hadoop/UsingLzoCompression&lt;/a&gt;, I have added details of steps that are needed for CDH3 (step 3)&amp;nbsp;as some instructions in the wiki page&amp;nbsp;did not seem to apply&amp;nbsp;applicable for CDH3 HBase.&lt;br /&gt;&lt;br /&gt;I tried below steps on Ubuntu.&amp;nbsp; If you are using Linux, give Todd Lipcon's &lt;a href="https://github.com/toddlipcon/hadoop-lzo-packager"&gt;https://github.com/toddlipcon/hadoop-lzo-packager&lt;/a&gt; a try.&lt;br /&gt;&lt;br /&gt;Also, adding LZO Compression may require additional configuration changes in your HBase setup.&amp;nbsp; Refer &lt;a href="http://search-hadoop.com/m/WUnLM6ojHm1/Long+client+pauses+with+compression&amp;amp;subj=Long+client+pauses+with+compression"&gt;http://search-hadoop.com/m/WUnLM6ojHm1/Long+client+pauses+with+compression&amp;amp;subj=Long+client+pauses+with+compression&lt;/a&gt; &lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt; Download and build &lt;a class="http" href="http://www.oberhumer.com/opensource/lzo/"&gt;http://www.oberhumer.com/opensource/lzo/&lt;/a&gt;. This steps are&amp;nbsp; based on http://www.linuxfromscratch.org/blfs/view/cvs/general/LZO.html.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.05.tar.gz&lt;/li&gt;&lt;li&gt; gunzip lzo-2.05.tar.gz&lt;/li&gt;&lt;li&gt;tar -xvf lzo-2.05.tar&lt;/li&gt;&lt;li&gt;cd lzo-2.05/&lt;/li&gt;&lt;li&gt;./configure --prefix=/usr --enable-shared&lt;/li&gt;&lt;li&gt;make&lt;/li&gt;&lt;li&gt;make check&lt;/li&gt;&lt;ul&gt;&lt;li&gt;All checks should pass. &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;make test&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;All tests should pass.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;sudo make install&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Download and build &lt;a class="http" href="http://code.google.com/p/hadoop-gpl-compression/"&gt;http://code.google.com/p/hadoop-gpl-compression/&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;svn checkout &lt;a href="http://svn.codespot.com/a/apache-extras.org/hadoop-gpl-compression/trunk/%20hadoop-gpl-compression-read-only"&gt;http://svn.codespot.com/a/apache-extras.org/hadoop-gpl-compression/trunk/ hadoop-gpl-compression-read-only&lt;/a&gt;&lt;/li&gt;&lt;li&gt;cd hadoop-gpl-compression-read-only/&lt;/li&gt;&lt;li&gt; export CFLAGS="-m64"&lt;/li&gt;&lt;li&gt;ant compile-native&lt;/li&gt;&lt;li&gt;ant jar&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Copy the Hadoop GPL Compression JAR to HBase lib&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;cp build/hadoop-gpl-compression-0.2.0-dev.jar /path/to/hbase/lib/&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;Copy the native files to /usr/local/lib/&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;sudo cp build/native/Linux-amd64-64/lib/* /usr/local/lib/&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt; Edit /path/to/hbase/conf/hbase-env.sh, and add /usr/local/lib to environment variable.&amp;nbsp; This is needed as hbase/lib does not seem to have "native" folder anymore (Refer:&amp;nbsp; &lt;a href="http://cdh3u0.cloudera.com/cdh/3/hbase-0.90.1+15.18.releasenotes.html"&gt;http://cdh3u0.cloudera.com/cdh/3/hbase-0.90.1+15.18.releasenotes.html&lt;/a&gt; and &lt;a href="https://issues.apache.org/jira/browse/HBASE-3533"&gt;https://issues.apache.org/jira/browse/HBASE-3533&lt;/a&gt;)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;vi /path/to/hbase/conf/hbase-env.sh&lt;/li&gt;&lt;li&gt; Add following line at the end:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;export HBASE_LIBRARY_PATH=/usr/local/lib/&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Start the HBase.&amp;nbsp; You should see that native lzo library is successfully loaded in logs.&amp;nbsp; I was trying in stand alone mode, need to confirm whether below logs will be seen in master or region server logs.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;2011-08-06 14:54:08,776 INFO com.hadoop.compression.lzo.GPLNativeCodeLoader: Loaded native gpl library&lt;/li&gt;&lt;li&gt;2011-08-06 14:54:08,782 INFO com.hadoop.compression.lzo.LzoCodec: Successfully loaded &amp;amp; initialized native-lzo library&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-3367117281487008362?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/3367117281487008362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=3367117281487008362&amp;isPopup=true' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/3367117281487008362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/3367117281487008362'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2011/08/configuring-lzo-compression-for-cdh3.html' title='Configuring LZO Compression for CDH3 HBase'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-5985262066256166858</id><published>2011-08-06T14:11:00.001+05:30</published><updated>2011-08-06T14:12:03.465+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Logging'/><category scheme='http://www.blogger.com/atom/ns#' term='GridGain'/><title type='text'>Using your own log4j.properties with GridGain</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;By default, GridGain comes with its own copy of log4j configuration in the form of "default-log4j.xml"  GridGain does not allow usage of log4j.properties as GridLog4jLogger only accepts XML file as source of configuration.&lt;br /&gt;&lt;br /&gt;However, like me, if you are adding GridGain to an application that has logging already configured using log4j.properties, then, you can use below workaround.  &lt;br /&gt;&lt;br /&gt;In the below example, we are setting gridLogger property of Grid Configuration by using an&lt;br /&gt;instance of GridLogger that is constructed using a regular log4j Logger object.&lt;br /&gt;&lt;br /&gt;Then, we have log4jInitialization bean that initialzes log4j using&lt;br /&gt;log4j.properties with the help of org.springframework.util.Log4jConfigurer.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;script src="https://gist.github.com/1120462.js?file=grid-config.xml"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-5985262066256166858?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/5985262066256166858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=5985262066256166858&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/5985262066256166858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/5985262066256166858'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2011/08/using-your-own-log4jproperties-with.html' title='Using your own log4j.properties with GridGain'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-8082554650131676797</id><published>2011-07-17T23:28:00.001+05:30</published><updated>2011-07-17T23:33:48.149+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='HBase'/><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Power of Ruby and HBase shell</title><content type='html'>Well, its a well known fact that Hbase shell is a Ruby IRB shell with lots of HBase convenience method loaded into it.&lt;br /&gt;&lt;br /&gt;I had a requirement for my project wherein I wanted to check whether a row, identified by a given row key, exists in table or not.&amp;nbsp; Though "get" kind of works, but it does not return true or false, instead dumps the output to standard out.&lt;br /&gt;&lt;br /&gt;However, I wanted to read a file which consisted of a set of row keys and find out whether those row keys were present in the table or not.&amp;nbsp; Since, "get" would not return a boolean, I was not able to build a logic around it.&lt;br /&gt;&lt;br /&gt;So, I started looking into ruby code of HBase shell, and came up with following.&amp;nbsp; Looks like neat little hack.&amp;nbsp; But it also demonstrates the opportunities at offer to write really nice shell utilities for your project's needs.&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1087856.js?file=row_existence.rb"&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/1087856.js?file=README"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-8082554650131676797?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/8082554650131676797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=8082554650131676797&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/8082554650131676797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/8082554650131676797'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2011/07/power-of-ruby-and-hbase-shell.html' title='Power of Ruby and HBase shell'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-5152156177860030149</id><published>2011-06-26T22:51:00.019+05:30</published><updated>2011-06-28T00:50:17.478+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='HBase'/><title type='text'>HBase Benchmarking for multi-threaded environment</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;This weekend I attempted to figure out how HBase writes perform in multi-threaded environments.&amp;nbsp; To do so,&amp;nbsp; I wrote a Java program that writes records in a HBase table, and which can be configured to run to write N number of records using M Threads.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;I used three variants to write records into HBase:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use one HTable for every write&lt;/li&gt;&lt;ol&gt;&lt;li&gt;HTable is created using a singleton instance of HBaseConfiguration&lt;/li&gt;&lt;li&gt;HTable is created using new instance of HBaseConfiguration (Why? - I wanted to check how the behavior changes if connections to servers are not shared.&amp;nbsp; Reference: &lt;a href="http://instances%20of%20htable%20passed%20the%20same%20configuration%20instance%20will%20share%20connections%20to%20servers%20out%20on%20the%20cluster%20and%20to%20the%20zookeeper%20ensemble%20as%20well%20as%20caches%20of%20region%20locations.%20this%20is%20usually%20a%20*good*%20thing%20and%20it%20is%20recommended%20to%20reuse%20the%20same%20configuration%20object%20for%20all%20your%20tables.%20this%20happens%20because%20they%20will%20all%20share%20the%20same%20underlying%20hconnection%20instance.%20see%20hconnectionmanager%20for%20more%20on%20how%20this%20mechanism%20works./"&gt;HTable&lt;/a&gt; and &lt;a href="http://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/HConnectionManager.html"&gt;HConnectionManager&lt;/a&gt; documentation)&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Use HTablePool&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;strong&gt;Here are the various results:&lt;/strong&gt;&lt;br /&gt;&lt;style type="text/css"&gt;td { border: 1px solid #E6E6E6; padding: 2px; margin: 0px;}.scenario1 { background-color: #E0F2F7}.scenario2 { background-color: #F8E0F1}.scenario3 { background-color: #F2F5A9}&lt;/style&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;    &lt;td colspan="9"&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;HBase&amp;nbsp;0.20.6    Standalone mode&lt;/span&gt;&lt;/strong&gt; &amp;nbsp;(all figures in milliseconds)&lt;/td&gt;   &lt;/tr&gt;&lt;tr style="background-color: silver;"&gt;    &lt;td&gt;Scenario&lt;/td&gt;    &lt;td&gt;Num Threads&lt;/td&gt;    &lt;td&gt;Puts&lt;/td&gt;    &lt;td&gt;Mean&lt;/td&gt;    &lt;td&gt;Standard Deviation&lt;/td&gt;    &lt;td&gt;Max&lt;/td&gt;    &lt;td&gt;Min&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;    &lt;td&gt;80th Percentile&lt;/td&gt;    &lt;td&gt;90th Percentile&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario1"&gt;    &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;    &lt;td&gt;1&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;4.86&lt;/td&gt;    &lt;td&gt;1.49&lt;/td&gt;    &lt;td&gt;12.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;5.00&lt;/td&gt;    &lt;td&gt;6.90&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario2"&gt;    &lt;td&gt;HTable with same configuration instance&lt;/td&gt;    &lt;td&gt;1&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;4.52&lt;/td&gt;    &lt;td&gt;1.12&lt;/td&gt;    &lt;td&gt;9.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;5.00&lt;/td&gt;    &lt;td&gt;6.90&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario3"&gt;    &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;    &lt;td&gt;1&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;4.15&lt;/td&gt;    &lt;td&gt;0.88&lt;/td&gt;    &lt;td&gt;8.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;4.00&lt;/td&gt;    &lt;td&gt;5.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario1"&gt;    &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;    &lt;td&gt;1&lt;/td&gt;    &lt;td&gt;1000&lt;/td&gt;    &lt;td&gt;4.19&lt;/td&gt;    &lt;td&gt;3.60&lt;/td&gt;    &lt;td&gt;108.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;4.00&lt;/td&gt;    &lt;td&gt;5.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario2"&gt;    &lt;td&gt;HTable with same configuration instance&lt;/td&gt;    &lt;td&gt;1&lt;/td&gt;    &lt;td&gt;1000&lt;/td&gt;    &lt;td&gt;4.02&lt;/td&gt;    &lt;td&gt;1.79&lt;/td&gt;    &lt;td&gt;47.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;4.00&lt;/td&gt;    &lt;td&gt;5.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario3"&gt;    &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;    &lt;td&gt;1&lt;/td&gt;    &lt;td&gt;1000&lt;/td&gt;    &lt;td&gt;3.84&lt;/td&gt;    &lt;td&gt;3.57&lt;/td&gt;    &lt;td&gt;108.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;4.00&lt;/td&gt;    &lt;td&gt;4.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario1"&gt;    &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;    &lt;td&gt;1&lt;/td&gt;    &lt;td&gt;10000&lt;/td&gt;    &lt;td&gt;3.95&lt;/td&gt;    &lt;td&gt;4.13&lt;/td&gt;    &lt;td&gt;211.00&lt;/td&gt;    &lt;td&gt;2.00&lt;/td&gt;    &lt;td&gt;4.00&lt;/td&gt;    &lt;td&gt;5.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario2"&gt;    &lt;td&gt;HTable with same configuration instance&lt;/td&gt;    &lt;td&gt;1&lt;/td&gt;    &lt;td&gt;10000&lt;/td&gt;    &lt;td&gt;4.28&lt;/td&gt;    &lt;td&gt;10.02&lt;/td&gt;    &lt;td&gt;571.00&lt;/td&gt;    &lt;td&gt;2.00&lt;/td&gt;    &lt;td&gt;4.00&lt;/td&gt;    &lt;td&gt;5.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario3"&gt;    &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;    &lt;td&gt;1&lt;/td&gt;    &lt;td&gt;10000&lt;/td&gt;    &lt;td&gt;3.80&lt;/td&gt;    &lt;td&gt;5.46&lt;/td&gt;    &lt;td&gt;244.00&lt;/td&gt;    &lt;td&gt;2.00&lt;/td&gt;    &lt;td&gt;4.00&lt;/td&gt;    &lt;td&gt;4.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario1"&gt;    &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;    &lt;td&gt;10&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;24.59&lt;/td&gt;    &lt;td&gt;22.73&lt;/td&gt;    &lt;td&gt;204.00&lt;/td&gt;    &lt;td&gt;4.00&lt;/td&gt;    &lt;td&gt;38.60&lt;/td&gt;    &lt;td&gt;44.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario2"&gt;    &lt;td&gt;HTable with same configuration instance&lt;/td&gt;    &lt;td&gt;10&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;20.48&lt;/td&gt;    &lt;td&gt;28.05&lt;/td&gt;    &lt;td&gt;233.00&lt;/td&gt;    &lt;td&gt;5.00&lt;/td&gt;    &lt;td&gt;22.00&lt;/td&gt;    &lt;td&gt;36.80&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario3"&gt;    &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;    &lt;td&gt;10&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;21.44&lt;/td&gt;    &lt;td&gt;28.05&lt;/td&gt;    &lt;td&gt;241.00&lt;/td&gt;    &lt;td&gt;5.00&lt;/td&gt;    &lt;td&gt;26.80&lt;/td&gt;    &lt;td&gt;50.90&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario1"&gt;    &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;    &lt;td&gt;10&lt;/td&gt;    &lt;td&gt;1000&lt;/td&gt;    &lt;td&gt;26.10&lt;/td&gt;    &lt;td&gt;21.94&lt;/td&gt;    &lt;td&gt;246.00&lt;/td&gt;    &lt;td&gt;5.00&lt;/td&gt;    &lt;td&gt;40.00&lt;/td&gt;    &lt;td&gt;49.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario2"&gt;    &lt;td&gt;HTable with same configuration instance&lt;/td&gt;    &lt;td&gt;10&lt;/td&gt;    &lt;td&gt;1000&lt;/td&gt;    &lt;td&gt;23.80&lt;/td&gt;    &lt;td&gt;25.31&lt;/td&gt;    &lt;td&gt;238.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;35.80&lt;/td&gt;    &lt;td&gt;44.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario3"&gt;    &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;    &lt;td&gt;10&lt;/td&gt;    &lt;td&gt;1000&lt;/td&gt;    &lt;td&gt;22.55&lt;/td&gt;    &lt;td&gt;21.96&lt;/td&gt;    &lt;td&gt;209.00&lt;/td&gt;    &lt;td&gt;4.00&lt;/td&gt;    &lt;td&gt;35.00&lt;/td&gt;    &lt;td&gt;44.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario1"&gt;    &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;    &lt;td&gt;10&lt;/td&gt;    &lt;td&gt;10000&lt;/td&gt;    &lt;td&gt;22.06&lt;/td&gt;    &lt;td&gt;18.81&lt;/td&gt;    &lt;td&gt;279.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;36.00&lt;/td&gt;    &lt;td&gt;43.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario2"&gt;    &lt;td&gt;HTable with same configuration instance&lt;/td&gt;    &lt;td&gt;10&lt;/td&gt;    &lt;td&gt;10000&lt;/td&gt;    &lt;td&gt;22.67&lt;/td&gt;    &lt;td&gt;18.44&lt;/td&gt;    &lt;td&gt;287.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;37.00&lt;/td&gt;    &lt;td&gt;45.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario3"&gt;    &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;    &lt;td&gt;10&lt;/td&gt;    &lt;td&gt;10000&lt;/td&gt;    &lt;td&gt;24.43&lt;/td&gt;    &lt;td&gt;26.67&lt;/td&gt;    &lt;td&gt;507.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;38.00&lt;/td&gt;    &lt;td&gt;46.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario1"&gt;    &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;106.45&lt;/td&gt;    &lt;td&gt;68.53&lt;/td&gt;    &lt;td&gt;422.00&lt;/td&gt;    &lt;td&gt;5.00&lt;/td&gt;    &lt;td&gt;164.60&lt;/td&gt;    &lt;td&gt;199.40&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario2"&gt;    &lt;td&gt;HTable with same configuration instance&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;102.81&lt;/td&gt;    &lt;td&gt;68.45&lt;/td&gt;    &lt;td&gt;421.00&lt;/td&gt;    &lt;td&gt;4.00&lt;/td&gt;    &lt;td&gt;167.80&lt;/td&gt;    &lt;td&gt;194.60&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario3"&gt;    &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;25.73&lt;/td&gt;    &lt;td&gt;20.58&lt;/td&gt;    &lt;td&gt;209.00&lt;/td&gt;    &lt;td&gt;4.00&lt;/td&gt;    &lt;td&gt;29.80&lt;/td&gt;    &lt;td&gt;35.90&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario1"&gt;    &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;1000&lt;/td&gt;    &lt;td&gt;195.38&lt;/td&gt;    &lt;td&gt;189.46&lt;/td&gt;    &lt;td&gt;696.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;375.80&lt;/td&gt;    &lt;td&gt;488.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario2"&gt;    &lt;td&gt;HTable with same configuration instance&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;1000&lt;/td&gt;    &lt;td&gt;189.86&lt;/td&gt;    &lt;td&gt;193.69&lt;/td&gt;    &lt;td&gt;688.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;384.00&lt;/td&gt;    &lt;td&gt;492.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario3"&gt;    &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;1000&lt;/td&gt;    &lt;td&gt;79.80&lt;/td&gt;    &lt;td&gt;110.55&lt;/td&gt;    &lt;td&gt;525.00&lt;/td&gt;    &lt;td&gt;4.00&lt;/td&gt;    &lt;td&gt;151.00&lt;/td&gt;    &lt;td&gt;252.80&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario1"&gt;    &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;10000&lt;/td&gt;    &lt;td&gt;219.65&lt;/td&gt;    &lt;td&gt;214.10&lt;/td&gt;    &lt;td&gt;1277.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;433.00&lt;/td&gt;    &lt;td&gt;543.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario2"&gt;    &lt;td&gt;HTable with same configuration instance&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;10000&lt;/td&gt;    &lt;td&gt;277.60&lt;/td&gt;    &lt;td&gt;473.36&lt;/td&gt;    &lt;td&gt;4129.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;453.80&lt;/td&gt;    &lt;td&gt;609.00&lt;/td&gt;   &lt;/tr&gt;&lt;tr class="scenario3"&gt;    &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;    &lt;td&gt;100&lt;/td&gt;    &lt;td&gt;10000&lt;/td&gt;    &lt;td&gt;214.80&lt;/td&gt;    &lt;td&gt;230.87&lt;/td&gt;    &lt;td&gt;1386.00&lt;/td&gt;    &lt;td&gt;3.00&lt;/td&gt;    &lt;td&gt;435.00&lt;/td&gt;    &lt;td&gt;566.00&lt;/td&gt;   &lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;td colspan="9"&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;HBase&amp;nbsp;0.20.6&amp;nbsp;Distributed   Mode&amp;nbsp;with 3 Region Servers (Hadoop 0.20)&lt;/span&gt;&lt;/strong&gt;&amp;nbsp;(all figures in milliseconds)&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="background-color: silver;"&gt;   &lt;td&gt;Scenario&lt;/td&gt;   &lt;td&gt;Num Threads&lt;/td&gt;   &lt;td&gt;Puts&lt;/td&gt;   &lt;td&gt;Mean&lt;/td&gt;   &lt;td&gt;Standard Deviation&lt;/td&gt;   &lt;td&gt;Max&lt;/td&gt;   &lt;td&gt;Min&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/td&gt;   &lt;td&gt;80th Percentile&lt;/td&gt;   &lt;td&gt;90th Percentile&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;3.25&lt;/td&gt;   &lt;td&gt;1.96&lt;/td&gt;   &lt;td&gt;18.00&lt;/td&gt;   &lt;td&gt;2.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;3.90&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;2.98&lt;/td&gt;   &lt;td&gt;1.18&lt;/td&gt;   &lt;td&gt;9.00&lt;/td&gt;   &lt;td&gt;2.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;4.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;2.91&lt;/td&gt;   &lt;td&gt;1.43&lt;/td&gt;   &lt;td&gt;10.00&lt;/td&gt;   &lt;td&gt;1.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;4.90&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;4.56&lt;/td&gt;   &lt;td&gt;3.77&lt;/td&gt;   &lt;td&gt;40.00&lt;/td&gt;   &lt;td&gt;1.00&lt;/td&gt;   &lt;td&gt;6.00&lt;/td&gt;   &lt;td&gt;11.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;4.98&lt;/td&gt;   &lt;td&gt;4.04&lt;/td&gt;   &lt;td&gt;20.00&lt;/td&gt;   &lt;td&gt;1.00&lt;/td&gt;   &lt;td&gt;11.00&lt;/td&gt;   &lt;td&gt;11.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;2.28&lt;/td&gt;   &lt;td&gt;1.20&lt;/td&gt;   &lt;td&gt;9.00&lt;/td&gt;   &lt;td&gt;1.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;2.48&lt;/td&gt;   &lt;td&gt;1.76&lt;/td&gt;   &lt;td&gt;41.00&lt;/td&gt;   &lt;td&gt;1.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;2.43&lt;/td&gt;   &lt;td&gt;1.78&lt;/td&gt;   &lt;td&gt;49.00&lt;/td&gt;   &lt;td&gt;1.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;2.84&lt;/td&gt;   &lt;td&gt;2.79&lt;/td&gt;   &lt;td&gt;52.00&lt;/td&gt;   &lt;td&gt;1.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;5.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;15.88&lt;/td&gt;   &lt;td&gt;21.62&lt;/td&gt;   &lt;td&gt;204.00&lt;/td&gt;   &lt;td&gt;2.00&lt;/td&gt;   &lt;td&gt;23.80&lt;/td&gt;   &lt;td&gt;32.90&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;13.09&lt;/td&gt;   &lt;td&gt;20.50&lt;/td&gt;   &lt;td&gt;204.00&lt;/td&gt;   &lt;td&gt;2.00&lt;/td&gt;   &lt;td&gt;18.00&lt;/td&gt;   &lt;td&gt;20.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;8.78&lt;/td&gt;   &lt;td&gt;19.64&lt;/td&gt;   &lt;td&gt;197.00&lt;/td&gt;   &lt;td&gt;2.00&lt;/td&gt;   &lt;td&gt;8.80&lt;/td&gt;   &lt;td&gt;13.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;12.36&lt;/td&gt;   &lt;td&gt;10.76&lt;/td&gt;   &lt;td&gt;203.00&lt;/td&gt;   &lt;td&gt;2.00&lt;/td&gt;   &lt;td&gt;19.00&lt;/td&gt;   &lt;td&gt;22.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;12.39&lt;/td&gt;   &lt;td&gt;11.49&lt;/td&gt;   &lt;td&gt;202.00&lt;/td&gt;   &lt;td&gt;2.00&lt;/td&gt;   &lt;td&gt;20.00&lt;/td&gt;   &lt;td&gt;26.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;9.13&lt;/td&gt;   &lt;td&gt;10.79&lt;/td&gt;   &lt;td&gt;204.00&lt;/td&gt;   &lt;td&gt;1.00&lt;/td&gt;   &lt;td&gt;14.00&lt;/td&gt;   &lt;td&gt;17.90&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;32.41&lt;/td&gt;   &lt;td&gt;59.62&lt;/td&gt;   &lt;td&gt;1785.00&lt;/td&gt;   &lt;td&gt;1.00&lt;/td&gt;   &lt;td&gt;50.00&lt;/td&gt;   &lt;td&gt;80.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;37.87&lt;/td&gt;   &lt;td&gt;143.47&lt;/td&gt;   &lt;td&gt;4911.00&lt;/td&gt;   &lt;td&gt;2.00&lt;/td&gt;   &lt;td&gt;51.00&lt;/td&gt;   &lt;td&gt;84.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;12.93&lt;/td&gt;   &lt;td&gt;11.26&lt;/td&gt;   &lt;td&gt;212.00&lt;/td&gt;   &lt;td&gt;2.00&lt;/td&gt;   &lt;td&gt;20.00&lt;/td&gt;   &lt;td&gt;24.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;296.71&lt;/td&gt;   &lt;td&gt;132.66&lt;/td&gt;   &lt;td&gt;710.00&lt;/td&gt;   &lt;td&gt;47.00&lt;/td&gt;   &lt;td&gt;404.80&lt;/td&gt;   &lt;td&gt;467.50&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;263.60&lt;/td&gt;   &lt;td&gt;135.97&lt;/td&gt;   &lt;td&gt;738.00&lt;/td&gt;   &lt;td&gt;16.00&lt;/td&gt;   &lt;td&gt;389.40&lt;/td&gt;   &lt;td&gt;411.80&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;7.11&lt;/td&gt;   &lt;td&gt;8.33&lt;/td&gt;   &lt;td&gt;48.00&lt;/td&gt;   &lt;td&gt;2.00&lt;/td&gt;   &lt;td&gt;10.00&lt;/td&gt;   &lt;td&gt;12.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;108.58&lt;/td&gt;   &lt;td&gt;105.80&lt;/td&gt;   &lt;td&gt;419.00&lt;/td&gt;   &lt;td&gt;2.00&lt;/td&gt;   &lt;td&gt;215.00&lt;/td&gt;   &lt;td&gt;268.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;107.31&lt;/td&gt;   &lt;td&gt;105.14&lt;/td&gt;   &lt;td&gt;362.00&lt;/td&gt;   &lt;td&gt;2.00&lt;/td&gt;   &lt;td&gt;218.00&lt;/td&gt;   &lt;td&gt;267.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;10.24&lt;/td&gt;   &lt;td&gt;13.45&lt;/td&gt;   &lt;td&gt;203.00&lt;/td&gt;   &lt;td&gt;1.00&lt;/td&gt;   &lt;td&gt;11.00&lt;/td&gt;   &lt;td&gt;20.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;149.96&lt;/td&gt;   &lt;td&gt;197.28&lt;/td&gt;   &lt;td&gt;1527.00&lt;/td&gt;   &lt;td&gt;1.00&lt;/td&gt;   &lt;td&gt;267.00&lt;/td&gt;   &lt;td&gt;333.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;134.47&lt;/td&gt;   &lt;td&gt;144.55&lt;/td&gt;   &lt;td&gt;646.00&lt;/td&gt;   &lt;td&gt;2.00&lt;/td&gt;   &lt;td&gt;276.00&lt;/td&gt;   &lt;td&gt;358.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;247.84&lt;/td&gt;   &lt;td&gt;692.83&lt;/td&gt;   &lt;td&gt;11043.00&lt;/td&gt;   &lt;td&gt;1.00&lt;/td&gt;   &lt;td&gt;370.00&lt;/td&gt;   &lt;td&gt;668.00&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;   &lt;td colspan="9"&gt;&lt;strong&gt;&lt;span style="color: blue;"&gt;HBase&amp;nbsp;0.90.1 CDH3 Standalone installation &lt;/span&gt;&lt;/strong&gt;(all figures in milliseconds)&lt;/td&gt;  &lt;/tr&gt;&lt;tr style="background-color: silver;"&gt;   &lt;td&gt;Scenario&lt;/td&gt;   &lt;td&gt;Num Threads&lt;/td&gt;   &lt;td&gt;Puts&lt;/td&gt;   &lt;td&gt;Mean&lt;/td&gt;   &lt;td&gt;Stdev&lt;/td&gt;   &lt;td&gt;Max&lt;/td&gt;   &lt;td&gt;Min&lt;/td&gt;   &lt;td&gt;80 Pctl&lt;/td&gt;   &lt;td&gt;90 Pctl&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;6.54&lt;/td&gt;   &lt;td&gt;4.24&lt;/td&gt;   &lt;td&gt;38.00&lt;/td&gt;   &lt;td&gt;4.00&lt;/td&gt;   &lt;td&gt;7.00&lt;/td&gt;   &lt;td&gt;8.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;5.77&lt;/td&gt;   &lt;td&gt;1.34&lt;/td&gt;   &lt;td&gt;10.00&lt;/td&gt;   &lt;td&gt;4.00&lt;/td&gt;   &lt;td&gt;7.00&lt;/td&gt;   &lt;td&gt;8.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;5.23&lt;/td&gt;   &lt;td&gt;1.33&lt;/td&gt;   &lt;td&gt;12.00&lt;/td&gt;   &lt;td&gt;4.00&lt;/td&gt;   &lt;td&gt;5.00&lt;/td&gt;   &lt;td&gt;6.90&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;5.50&lt;/td&gt;   &lt;td&gt;1.62&lt;/td&gt;   &lt;td&gt;26.00&lt;/td&gt;   &lt;td&gt;4.00&lt;/td&gt;   &lt;td&gt;6.00&lt;/td&gt;   &lt;td&gt;7.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;4.95&lt;/td&gt;   &lt;td&gt;1.35&lt;/td&gt;   &lt;td&gt;22.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;6.00&lt;/td&gt;   &lt;td&gt;6.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;4.94&lt;/td&gt;   &lt;td&gt;1.31&lt;/td&gt;   &lt;td&gt;16.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;6.00&lt;/td&gt;   &lt;td&gt;6.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;4.84&lt;/td&gt;   &lt;td&gt;2.57&lt;/td&gt;   &lt;td&gt;92.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;5.00&lt;/td&gt;   &lt;td&gt;6.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;4.59&lt;/td&gt;   &lt;td&gt;4.88&lt;/td&gt;   &lt;td&gt;229.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;5.00&lt;/td&gt;   &lt;td&gt;6.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;1&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;4.30&lt;/td&gt;   &lt;td&gt;4.72&lt;/td&gt;   &lt;td&gt;231.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;4.00&lt;/td&gt;   &lt;td&gt;5.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;26.44&lt;/td&gt;   &lt;td&gt;27.85&lt;/td&gt;   &lt;td&gt;205.00&lt;/td&gt;   &lt;td&gt;4.00&lt;/td&gt;   &lt;td&gt;34.80&lt;/td&gt;   &lt;td&gt;39.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;27.50&lt;/td&gt;   &lt;td&gt;28.68&lt;/td&gt;   &lt;td&gt;214.00&lt;/td&gt;   &lt;td&gt;7.00&lt;/td&gt;   &lt;td&gt;35.00&lt;/td&gt;   &lt;td&gt;40.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;31.55&lt;/td&gt;   &lt;td&gt;31.22&lt;/td&gt;   &lt;td&gt;205.00&lt;/td&gt;   &lt;td&gt;4.00&lt;/td&gt;   &lt;td&gt;37.00&lt;/td&gt;   &lt;td&gt;70.40&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;25.80&lt;/td&gt;   &lt;td&gt;14.84&lt;/td&gt;   &lt;td&gt;204.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;36.00&lt;/td&gt;   &lt;td&gt;41.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;26.15&lt;/td&gt;   &lt;td&gt;15.21&lt;/td&gt;   &lt;td&gt;212.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;37.00&lt;/td&gt;   &lt;td&gt;41.90&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;25.72&lt;/td&gt;   &lt;td&gt;14.31&lt;/td&gt;   &lt;td&gt;199.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;37.00&lt;/td&gt;   &lt;td&gt;43.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;26.12&lt;/td&gt;   &lt;td&gt;16.09&lt;/td&gt;   &lt;td&gt;280.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;36.00&lt;/td&gt;   &lt;td&gt;41.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;27.45&lt;/td&gt;   &lt;td&gt;16.93&lt;/td&gt;   &lt;td&gt;274.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;38.00&lt;/td&gt;   &lt;td&gt;43.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;10&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;25.57&lt;/td&gt;   &lt;td&gt;13.90&lt;/td&gt;   &lt;td&gt;263.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;36.00&lt;/td&gt;   &lt;td&gt;40.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;22.55&lt;/td&gt;   &lt;td&gt;17.28&lt;/td&gt;   &lt;td&gt;50.00&lt;/td&gt;   &lt;td&gt;5.00&lt;/td&gt;   &lt;td&gt;44.80&lt;/td&gt;   &lt;td&gt;46.90&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;132.36&lt;/td&gt;   &lt;td&gt;77.87&lt;/td&gt;   &lt;td&gt;481.00&lt;/td&gt;   &lt;td&gt;18.00&lt;/td&gt;   &lt;td&gt;197.80&lt;/td&gt;   &lt;td&gt;241.30&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;29.23&lt;/td&gt;   &lt;td&gt;22.76&lt;/td&gt;   &lt;td&gt;97.00&lt;/td&gt;   &lt;td&gt;4.00&lt;/td&gt;   &lt;td&gt;52.60&lt;/td&gt;   &lt;td&gt;59.90&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;175.42&lt;/td&gt;   &lt;td&gt;272.73&lt;/td&gt;   &lt;td&gt;2987.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;307.60&lt;/td&gt;   &lt;td&gt;356.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;19.54&lt;/td&gt;   &lt;td&gt;47.49&lt;/td&gt;   &lt;td&gt;248.00&lt;/td&gt;   &lt;td&gt;3.00&lt;/td&gt;   &lt;td&gt;9.00&lt;/td&gt;   &lt;td&gt;11.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;1000&lt;/td&gt;   &lt;td&gt;52.58&lt;/td&gt;   &lt;td&gt;69.17&lt;/td&gt;   &lt;td&gt;383.00&lt;/td&gt;   &lt;td&gt;4.00&lt;/td&gt;   &lt;td&gt;79.80&lt;/td&gt;   &lt;td&gt;150.90&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario1"&gt;   &lt;td&gt;HTable from HTablePool (pool size: 100)&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;173.08&lt;/td&gt;   &lt;td&gt;1294.93&lt;/td&gt;   &lt;td&gt;24606.00&lt;/td&gt;   &lt;td&gt;4.00&lt;/td&gt;   &lt;td&gt;117.00&lt;/td&gt;   &lt;td&gt;148.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario2"&gt;   &lt;td&gt;HTable with same configuration instance&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;57.95&lt;/td&gt;   &lt;td&gt;43.75&lt;/td&gt;   &lt;td&gt;414.00&lt;/td&gt;   &lt;td&gt;4.00&lt;/td&gt;   &lt;td&gt;93.00&lt;/td&gt;   &lt;td&gt;113.00&lt;/td&gt;  &lt;/tr&gt;&lt;tr class="scenario3"&gt;   &lt;td&gt;HTable with new Hbase configuration instance&lt;/td&gt;   &lt;td&gt;100&lt;/td&gt;   &lt;td&gt;10000&lt;/td&gt;   &lt;td&gt;180.96&lt;/td&gt;   &lt;td&gt;163.70&lt;/td&gt;   &lt;td&gt;937.00&lt;/td&gt;   &lt;td&gt;4.00&lt;/td&gt;   &lt;td&gt;334.00&lt;/td&gt;   &lt;td&gt;424.00&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;I will be adding more results here: &lt;a href="https://github.com/srikanthps/hbase-benchmarker/blob/master/Reports.TXT"&gt;https://github.com/srikanthps/hbase-benchmarker/blob/master/Reports.TXT&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Conclusions:&lt;/span&gt;&lt;br /&gt;So, what conclusions can be drawn from above figures:&lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;Write performances seems to be good when lesser threads are used for writing.&lt;br /&gt;2.&amp;nbsp; All 3 variants seems to perform more or less similarly.&amp;nbsp;&amp;nbsp;In our application, we use&amp;nbsp;HTablePool based approach and its nice to see that it performs equally nice.&amp;nbsp; Another thing which I observed during my tests is that pool size may not have much role to play.&amp;nbsp; With pool size of 10 too, the results are more or less similar.&lt;br /&gt;3. As number of threads increase, the write performance deteriorates. &amp;nbsp;A potential reason for this behavior is that HBase opens only one connection per region server from a single JVM.&amp;nbsp; So, will increasing the number of JVMs help in horizontally scaling the writes?&lt;br /&gt;&lt;br /&gt;Under heavy multi-threading, the avg. time increases as most of the threads seems to be blocking here:&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;"pool-1-thread-99" prio=6 tid=0x045a4c00 nid=0x22e4 waiting for monitor entry [0x06c6f000]&lt;br /&gt;&amp;nbsp;&amp;nbsp; java.lang.Thread.State: BLOCKED (on object monitor)&lt;/span&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: red;"&gt;&amp;nbsp;at org.apache.hadoop.hbase.ipc.HBaseClient$Connection.sendParam(HBaseClient.java:471)&lt;/span&gt;&amp;nbsp;- waiting to lock &amp;lt;0x291f0088&amp;gt; (a java.io.DataOutputStream)&lt;br /&gt;&amp;nbsp;at org.apache.hadoop.hbase.ipc.HBaseClient.call(HBaseClient.java:713)&lt;br /&gt;&amp;nbsp;at org.apache.hadoop.hbase.ipc.HBaseRPC$Invoker.invoke(HBaseRPC.java:333)&lt;br /&gt;&amp;nbsp;at $Proxy0.put(Unknown Source)&lt;br /&gt;&amp;nbsp;at org.apache.hadoop.hbase.client.HConnectionManager$TableServers$3$1.call(HConnectionManager.java:1242)&lt;br /&gt;&amp;nbsp;at org.apache.hadoop.hbase.client.HConnectionManager$TableServers$3$1.call(HConnectionManager.java:1240)&lt;br /&gt;&amp;nbsp;at org.apache.hadoop.hbase.client.HConnectionManager$TableServers.getRegionServerWithRetries(HConnectionManager.java:1035)&lt;br /&gt;&amp;nbsp;at org.apache.hadoop.hbase.client.HConnectionManager$TableServers$3.doCall(HConnectionManager.java:1239)&lt;br /&gt;&amp;nbsp;at org.apache.hadoop.hbase.client.HConnectionManager$TableServers$Batch.process(HConnectionManager.java:1161)&lt;br /&gt;&amp;nbsp;at org.apache.hadoop.hbase.client.HConnectionManager$TableServers.processBatchOfRows(HConnectionManager.java:1247)&lt;br /&gt;&amp;nbsp;at org.apache.hadoop.hbase.client.HTable.flushCommits(HTable.java:609)&lt;br /&gt;&amp;nbsp;at org.apache.hadoop.hbase.client.HTable.put(HTable.java:474)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;snip&gt;&lt;/snip&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Source code for benchmarking application:&lt;/span&gt;&lt;br /&gt;Available in my github repository.&lt;br /&gt;&lt;a href="https://github.com/srikanthps/hbase-benchmarker"&gt;https://github.com/srikanthps/hbase-benchmarker&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-5152156177860030149?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/5152156177860030149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=5152156177860030149&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/5152156177860030149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/5152156177860030149'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2011/06/hbase-benchmarking-for-multi-threaded.html' title='HBase Benchmarking for multi-threaded environment'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-7621773279148867850</id><published>2011-06-26T18:35:00.000+05:30</published><updated>2011-06-26T18:36:52.831+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='HBase'/><title type='text'>HBase Issue - HMaster not starting with error "Cannot assign requested address"</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Today I ran into an issue with my working HBase standalone node after my Ubuntu PC got a new IP address due to restart.&lt;br /&gt;&lt;br /&gt;HBase master logs showed:&lt;br /&gt;2011-06-26 17:38:13,125 INFO org.apache.hadoop.hbase.master.HMaster: &lt;b&gt;&lt;span style="color: blue;"&gt;My address is ubuntu.ubuntu-domain:60000 &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;2011-06-26 17:38:13,250 ERROR org.apache.hadoop.hbase.master.HMaster: Can not start master&lt;br /&gt;java.net.BindException: Problem binding to /192.168.1.2:60000 : &lt;b&gt;&lt;span style="color: red;"&gt;Cannot assign requested address&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.ipc.HBaseServer.bind(HBaseServer.java:179)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; at org.apache.hadoop.hbase.ipc.HBaseServer$Listener.&lt;init&gt;(HBaseServer.java:242)&lt;/init&gt;&lt;br /&gt;&lt;snip&gt;&lt;/snip&gt;&lt;br /&gt;&lt;br /&gt;I noticed that my current IP address was 192.168.1.3, not 1.2 which HBase was trying to bind to.&lt;br /&gt;&lt;br /&gt;Ping to my host name showed IP address which HBase was trying to use, but "ifconfig" showed the new IP Address:&lt;br /&gt;&lt;br /&gt;srikanth@ubuntu:~/hadoop/hbase-0.20.6$ ping ubuntu.ubuntu-domain &lt;br /&gt;PING &lt;span style="background-color: yellow;"&gt;ubuntu.ubuntu-domain (192.168.1.2)&lt;/span&gt; 56(84) bytes of data.&lt;br /&gt;64 bytes from ubuntu.ubuntu-domain (192.168.1.2): icmp_seq=1 ttl=64 time=12.2 ms&lt;br /&gt;64 bytes from ubuntu.ubuntu-domain (192.168.1.2): icmp_seq=2 ttl=64 time=1.17 ms&lt;br /&gt;&lt;br /&gt;srikanth@ubuntu:~$ ifconfig &lt;br /&gt;eth0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Link encap:Ethernet&amp;nbsp; HWaddr 00:1c:c0:4d:74:86&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inet addr:&lt;span style="background-color: yellow;"&gt;192.168.1.3&lt;/span&gt;&amp;nbsp; Bcast:192.168.1.255&amp;nbsp; Mask:255.255.255.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inet6 addr: fe80::21c:c0ff:fe4d:7486/64 Scope:Link&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UP BROADCAST RUNNING MULTICAST&amp;nbsp; MTU:1500&amp;nbsp; Metric:1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RX packets:6518 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TX packets:6501 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; collisions:0 txqueuelen:100 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RX bytes:6421057 (6.4 MB)&amp;nbsp; TX bytes:865876 (865.8 KB)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Memory:e0400000-e0420000 &lt;br /&gt;&lt;br /&gt;lo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Link encap:Local Loopback&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inet addr:127.0.0.1&amp;nbsp; Mask:255.0.0.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inet6 addr: ::1/128 Scope:Host&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UP LOOPBACK RUNNING&amp;nbsp; MTU:16436&amp;nbsp; Metric:1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RX packets:421 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TX packets:421 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; collisions:0 txqueuelen:0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RX bytes:52862 (52.8 KB)&amp;nbsp; TX bytes:52862 (52.8 KB)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I tried following after some googling but had no success:&lt;br /&gt;1. Disabled IPv6&lt;br /&gt;2. Try to clear the DNS Cache.&amp;nbsp; And in this process, also learned that Ubuntu does not do any DNS caching.&lt;br /&gt;3. Tried to assign static IP Address so that HBase is happy, though this worked for HBase, but my machine went out of network (no internet, and my laptop could not SSH to it).&lt;br /&gt;4. Called up my friend who is Linux expert.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Later I decided to update /etc/hosts to map my host name to my new IP address.&amp;nbsp; It was only then did I realize that it already had an entry that was pointing my host name to my previous IP address which was causing all the mess.&amp;nbsp; I updated it to use my current IP address, and things started working fine again.&amp;nbsp; Phew!!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-7621773279148867850?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/7621773279148867850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=7621773279148867850&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/7621773279148867850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/7621773279148867850'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2011/06/hbase-issue-hmaster-not-starting-with.html' title='HBase Issue - HMaster not starting with error &quot;Cannot assign requested address&quot;'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-288193539390838242</id><published>2011-06-18T23:42:00.001+05:30</published><updated>2011-06-19T13:01:21.109+05:30</updated><title type='text'>Ruby Application to tweet messages using twitter</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Using twitter_oauth gem, I wrote an &lt;a href="https://gist.github.com/1033288"&gt;application&lt;/a&gt; that can be used in non-web-based application to integrate twitter. Using the concepts demonstrated in this sample application, one can generate tweets on whenever an interesting application events occurs.  For example, a shopping site can tweet about a new category of products that gets available.&lt;br /&gt;&lt;br /&gt;I will try to make it into a gem soon, and may be rails plugin too, something like "ActionTweeter" similar to "ActionMailer".&lt;br /&gt;&lt;br /&gt;Here is the GIST URL:&amp;nbsp;&lt;a href="https://gist.github.com/1033288"&gt;https://gist.github.com/1033288&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-288193539390838242?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/288193539390838242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=288193539390838242&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/288193539390838242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/288193539390838242'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2011/06/ruby-application-to-tweet-messages.html' title='Ruby Application to tweet messages using twitter'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-874635766814160666</id><published>2010-11-15T12:06:00.000+05:30</published><updated>2010-11-15T12:06:28.168+05:30</updated><title type='text'>98th Thing every programmer should know</title><content type='html'>If you provide a code review comment, follow it up with other developer to confirm whether it was implemented or not.  Many a times, a comment gets lost in email chain and never gets implemented.&lt;br /&gt;&lt;br /&gt;It is better if you can use a code review tool that integrates well with the IDE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-874635766814160666?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/874635766814160666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=874635766814160666&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/874635766814160666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/874635766814160666'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2010/11/98th-thing-every-programmer-should-know.html' title='98th Thing every programmer should know'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-2665825132636152438</id><published>2010-11-15T10:35:00.000+05:30</published><updated>2010-11-15T10:35:26.075+05:30</updated><title type='text'>99th thing every programmer should know</title><content type='html'>Avoid unnecessary acronmym-ization of words.&lt;br /&gt;&lt;br /&gt;Eg: This is the name of the constant CHART_DTL_MAIN some one used in the code.&lt;br /&gt;&lt;br /&gt;Here "DTL" is actually an acronmy invented by programmer for the word "DETAIL".  By saving 3 characters, programmer has made variable not easy to interpret.&lt;br /&gt;&lt;br /&gt;It's better to avoid using unnecssary acronyms and use as descriptive words as possible as there are typically no restrictions in the language.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-2665825132636152438?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/2665825132636152438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=2665825132636152438&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/2665825132636152438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/2665825132636152438'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2010/11/99th-thing-every-programmer-should-know.html' title='99th thing every programmer should know'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-639932860797678196</id><published>2010-09-29T00:25:00.000+05:30</published><updated>2010-09-29T00:25:46.857+05:30</updated><title type='text'>Ruby Frameworks that I wish to learn more about..</title><content type='html'>Paperclip&lt;br /&gt;Activemerchant&lt;br /&gt;Attachment_fu&lt;br /&gt;cancan&lt;br /&gt;factory girl&lt;br /&gt;arel&lt;br /&gt;radiant cms&lt;br /&gt;devise&lt;br /&gt;authlogic&lt;br /&gt;mongomapper&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-639932860797678196?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/639932860797678196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=639932860797678196&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/639932860797678196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/639932860797678196'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2010/09/ruby-frameworks-that-i-wish-to-learn.html' title='Ruby Frameworks that I wish to learn more about..'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-939618769796361461</id><published>2010-08-16T22:38:00.000+05:30</published><updated>2010-08-16T22:38:36.321+05:30</updated><title type='text'>Ruby Eigen Class</title><content type='html'>Ruby Eigen Classes are created in following scenarios:&lt;br /&gt;&lt;br /&gt;1. When you define a instance method (singleton method) on an object, that object's class is an Eigen class.  &lt;br /&gt;2. When you include a module in a class, that class's super class is an Eigen class.&lt;br /&gt;&lt;br /&gt;Any other??&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-939618769796361461?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/939618769796361461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=939618769796361461&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/939618769796361461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/939618769796361461'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2010/08/ruby-eigen-class.html' title='Ruby Eigen Class'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-7429911942416386368</id><published>2010-07-20T21:54:00.001+05:30</published><updated>2010-07-21T00:55:05.674+05:30</updated><title type='text'>A readable piece of source code</title><content type='html'>Other day, I wrote a piece of code similar to one below, when I had to intialize the password column in Users table with a default password.&lt;br /&gt;&lt;br /&gt;String initialPassword = hashOf(firstSixChars(userName));&lt;br /&gt;&lt;br /&gt;I liked the idea that code reads like a prose.  I have been constantly practicing to write such code.&lt;br /&gt;&lt;br /&gt;After all, code should be written less for machines and more for other programmers who are going to read it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-7429911942416386368?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/7429911942416386368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=7429911942416386368&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/7429911942416386368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/7429911942416386368'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2010/07/readable-piece-of-source-code.html' title='A readable piece of source code'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-3115814151103584742</id><published>2010-07-17T22:10:00.000+05:30</published><updated>2010-07-17T22:10:46.477+05:30</updated><title type='text'>Sending emails using gmail SMTP Server (in Java)</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;After doing a bit of search on google, I found &lt;a href="http://forums.sun.com/thread.jspa?threadID=668779"&gt;here &lt;/a&gt;a code snippet in the comments section that can be used to send emails through gmail. &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px;"&gt;There was a minor typo in the code snippet in the "main" function, where class name was wrongly spelt as "MailUtils" instead of "SimpleMail".&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px;"&gt;This code depends on Java Mail API. &amp;nbsp;I picked the "mail.jar" from Spring distribution's "lib" directory.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Thats it! &amp;nbsp;I was sending emails from Java in no time.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Code sample is available as my github GIST here.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://gist.github.com/479631"&gt;http://gist.github.com/479631&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-3115814151103584742?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/3115814151103584742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=3115814151103584742&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/3115814151103584742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/3115814151103584742'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2010/07/sending-emails-using-gmail-smtp-server.html' title='Sending emails using gmail SMTP Server (in Java)'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-9109336315167988936</id><published>2010-07-12T23:31:00.003+05:30</published><updated>2010-07-12T23:37:49.260+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='RAILS'/><title type='text'>Basecamp like domain names for your SaaS Users</title><content type='html'>I was wondering how one would go about implementing a custom domain for each user of a SaaS application.&amp;nbsp; For example, I need to visit &lt;a href="https://srikanthps.basecamphq.com/login"&gt;https://srikanthps.basecamphq.com/login&lt;/a&gt; if I need to login to BaseCamp.&amp;nbsp; This is very neat.&lt;br /&gt;&lt;br /&gt;After doing a bit of googling, I found following blog entries which gave me some idea on how one can achieve something similar to base camp.&lt;br /&gt;Changes needed in a RAILS App (Post by DHH):&amp;nbsp; This should be enough if you are hosting the app on your own servers.&lt;br /&gt;&lt;a href="http://37signals.com/svn/posts/1512-how-to-do-basecamp-style-subdomains-in-rails"&gt;http://37signals.com/svn/posts/1512-how-to-do-basecamp-style-subdomains-in-rails&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;If you are&amp;nbsp;planning to use a hosting provider, such as Heroku, then,&amp;nbsp;read this post,&amp;nbsp; &lt;a href="http://docs.heroku.com/custom-domains"&gt;http://docs.heroku.com/custom-domains&lt;/a&gt;, especially the part about wild card domains.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-9109336315167988936?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/9109336315167988936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=9109336315167988936&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/9109336315167988936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/9109336315167988936'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2010/07/basecamp-like-domain-names-for-your.html' title='Basecamp like domain names for your SaaS Users'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-1923036608823210912</id><published>2010-07-11T22:06:00.003+05:30</published><updated>2010-07-12T22:26:22.647+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='ActionMailer'/><category scheme='http://www.blogger.com/atom/ns#' term='RAILS'/><title type='text'>Sending emails in RAILS using gmail SMTP Server</title><content type='html'>I implemented email support in Bug Manager (&lt;a href="http://bugmanager.heroku.com/"&gt;http://bugmanager.heroku.com/&lt;/a&gt;), my application I developed to learn RAILS.&lt;br /&gt;&lt;br /&gt;I followed the instructions from here &lt;a href="http://blog.heroku.com/archives/2009/11/9/tech_sending_email_with_gmail/"&gt;http://blog.heroku.com/archives/2009/11/9/tech_sending_email_with_gmail/&lt;/a&gt; &amp;nbsp;and here (&lt;a href="http://blog.inspired.no/smtp-error-while-using-gmail-in-rails-271"&gt;SMTP error while using Gmail in Rails | Inspired? No&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Works like charm!&lt;br /&gt;&lt;br /&gt;Hosting RAILS app on Heroku can't be any simpler. &amp;nbsp;I just followed the instructions here &lt;a href="http://www.blogger.com/(http://docs.heroku.com/quickstart)."&gt;(http://docs.heroku.com/quickstart).&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-1923036608823210912?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/1923036608823210912/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=1923036608823210912&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/1923036608823210912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/1923036608823210912'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2010/07/sending-emails-in-rails-using-gmail.html' title='Sending emails in RAILS using gmail SMTP Server'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-1912144041367655011</id><published>2009-12-08T01:41:00.002+05:30</published><updated>2009-12-08T01:45:44.633+05:30</updated><title type='text'>My github repositories</title><content type='html'>Started adding stuff to my github &lt;a href="http://github.com/srikanthps"&gt;repository&lt;/a&gt;&lt;a href="http://github.com/srikanthps"&gt; (http://github.com/srikanthps)&lt;/a&gt;.   &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Migrated my "bugs on rails" project from Google code to github&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Also, started a new adventure in terms of "cvsstat" project.  Was fed up today using the &lt;a href="http://sourceforge.net/projects/cvsstat/"&gt;other cvsstat&lt;/a&gt; which kept reporting me wrong data, so I thought let me write a simple program to extract the data I need from cvs logs.  It's current state  is such that even I can't use it, but I hope to polish it in a day or two.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-1912144041367655011?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/1912144041367655011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=1912144041367655011&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/1912144041367655011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/1912144041367655011'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2009/12/my-github-repositories.html' title='My github repositories'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-1767924234390172104</id><published>2009-09-27T19:05:00.026+05:30</published><updated>2009-09-28T12:44:39.912+05:30</updated><title type='text'>My Macbook Pro</title><content type='html'>After thinking about it for more than a month now, I could not resist, and bought myself a &lt;a href="http://www.apple.com/in/macbookpro/"&gt;Macbook Pro &lt;/a&gt;this Saturday. It's a 13" one, with 2.53 GHz Intel Core2 Duo, and 4GB RAM. I also got "Snow Leopard" upgrade disk with it, so my Macbook Pro is now running the &lt;a href="http://www.apple.com/macosx/"&gt;latest and greatest Mac OS&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Bought it at Imagine Store, Forum Mall, Bangalore. The staff there was very friendly and helped me with registering the Mac (which I did at the store), and also showed me how to go about upgrading the OS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Here are some pictures.&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_16Xoa7OJX0k/Sr9vL1SopoI/AAAAAAAAAEI/kIKK8q7IGNg/s1600-h/IMG_1136.JPG"&gt;&lt;img style="width: 320px; height: 255px;" id="BLOGGER_PHOTO_ID_5386145928432887426" alt="" src="http://1.bp.blogspot.com/_16Xoa7OJX0k/Sr9vL1SopoI/AAAAAAAAAEI/kIKK8q7IGNg/s320/IMG_1136.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_16Xoa7OJX0k/Sr9rneN2hGI/AAAAAAAAADY/Tdah0nJRtDA/s1600-h/IMG_1137.JPG"&gt;&lt;img style="width: 320px; height: 226px;" id="BLOGGER_PHOTO_ID_5386142005228635234" alt="" src="http://1.bp.blogspot.com/_16Xoa7OJX0k/Sr9rneN2hGI/AAAAAAAAADY/Tdah0nJRtDA/s320/IMG_1137.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_16Xoa7OJX0k/Sr9rfpGXsqI/AAAAAAAAADQ/kUKe-oh_EJA/s1600-h/IMG_1136.JPG"&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_16Xoa7OJX0k/Sr9rS6NkEOI/AAAAAAAAADI/18YdYpp9UXY/s1600-h/IMG_1140.JPG"&gt;&lt;img style="width: 264px; height: 320px;" id="BLOGGER_PHOTO_ID_5386141651966365922" alt="" src="http://1.bp.blogspot.com/_16Xoa7OJX0k/Sr9rS6NkEOI/AAAAAAAAADI/18YdYpp9UXY/s320/IMG_1140.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_16Xoa7OJX0k/Sr9rt-vfYzI/AAAAAAAAADg/bMzLWwUPFm0/s1600-h/IMG_1141.JPG"&gt;&lt;img style="width: 320px; height: 317px;" id="BLOGGER_PHOTO_ID_5386142117038875442" alt="" src="http://4.bp.blogspot.com/_16Xoa7OJX0k/Sr9rt-vfYzI/AAAAAAAAADg/bMzLWwUPFm0/s320/IMG_1141.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_16Xoa7OJX0k/Sr9r5UOsHRI/AAAAAAAAADo/aw6FVE4M86M/s1600-h/IMG_1142.JPG"&gt;&lt;img style="width: 320px; height: 240px;" id="BLOGGER_PHOTO_ID_5386142311785438482" alt="" src="http://3.bp.blogspot.com/_16Xoa7OJX0k/Sr9r5UOsHRI/AAAAAAAAADo/aw6FVE4M86M/s320/IMG_1142.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_16Xoa7OJX0k/Sr9sF7Px6LI/AAAAAAAAADw/d3cy7tCgLZM/s1600-h/IMG_1143.JPG"&gt;&lt;img style="width: 320px; height: 282px;" id="BLOGGER_PHOTO_ID_5386142528417425586" alt="" src="http://2.bp.blogspot.com/_16Xoa7OJX0k/Sr9sF7Px6LI/AAAAAAAAADw/d3cy7tCgLZM/s320/IMG_1143.JPG" border="0" /&gt;&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_16Xoa7OJX0k/Sr9sNgNk9EI/AAAAAAAAAD4/uBfQClnOS3I/s1600-h/IMG_1144.JPG"&gt;&lt;img style="width: 318px; height: 320px;" id="BLOGGER_PHOTO_ID_5386142658599384130" alt="" src="http://4.bp.blogspot.com/_16Xoa7OJX0k/Sr9sNgNk9EI/AAAAAAAAAD4/uBfQClnOS3I/s320/IMG_1144.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_16Xoa7OJX0k/Sr9rHVpM1jI/AAAAAAAAADA/vSMPm4eGSJo/s1600-h/IMG_1171.JPG"&gt;&lt;img style="width: 320px; height: 302px;" id="BLOGGER_PHOTO_ID_5386141453171611186" alt="" src="http://3.bp.blogspot.com/_16Xoa7OJX0k/Sr9rHVpM1jI/AAAAAAAAADA/vSMPm4eGSJo/s320/IMG_1171.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/_16Xoa7OJX0k/Sr9sdVgW1UI/AAAAAAAAAEA/rohcXhssfns/s1600-h/IMG_1172.JPG"&gt;&lt;img style="width: 320px; height: 240px;" id="BLOGGER_PHOTO_ID_5386142930603267394" alt="" src="http://1.bp.blogspot.com/_16Xoa7OJX0k/Sr9sdVgW1UI/AAAAAAAAAEA/rohcXhssfns/s320/IMG_1172.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-1767924234390172104?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/1767924234390172104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=1767924234390172104&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/1767924234390172104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/1767924234390172104'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2009/09/my-macbook-pro.html' title='My Macbook Pro'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_16Xoa7OJX0k/Sr9vL1SopoI/AAAAAAAAAEI/kIKK8q7IGNg/s72-c/IMG_1136.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-2763826915259085647</id><published>2009-07-31T01:57:00.007+05:30</published><updated>2009-07-31T02:22:10.132+05:30</updated><title type='text'>At last, I have become productive in using RAILS.</title><content type='html'>I started working on a RAILS project to solve a problem at work. I was finding it difficult to manage tracking of defects. So, I started putting together a small tool that can help me share information on bugs within the team so that team members can pick up bugs to fix, and everyone is at same page when it comes to status.&lt;br /&gt;&lt;br /&gt;My this little adventure with RAILS is shaping into something interesting. At present, I have made this application Open source on &lt;a href="http://code.google.com/p/bugsonrails"&gt;Google Code&lt;/a&gt;. My friend, Anish, and I are trying to make it a general purpose application. We are still a long way to go, but its a start!&lt;br /&gt;&lt;br /&gt;&lt;iframe height="342" src="http://docs.google.com/present/embed?id=dhfxqc7p_0hpnh3kfd" frameborder="0" width="410"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;To justify the blog title, I was able to put together a basic "Task board" in a matter of just 2 hours. At present, I am just punching the code without worrying much about automated test cases. Cucubmer, WebRat, RSpec are in my TODO list. My initial goal is to attain some mastery in doing basic RAILS right!.&lt;br /&gt;&lt;br /&gt;I am following &lt;a href="http://testobsessed.com/"&gt;Elisabeth Hendrikson's &lt;/a&gt;suggestion on how to do TDD on a new technology. She suggests that one should build a throw-away app first to get a good hang of a new technology before one can do TDD right in that technology.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://testobsessed.com/2009/02/10/how-much-to-automate-agile-changes-the-equation/"&gt;Here is her answer to my query on how to do TDD on a new technology&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;Elisabeth responds:&lt;br /&gt;Yes, I ran into this problem recently in my own work when using a new library. The recipe for TDDing something in a new technology where you’re still trying to figure out how the technology works is to spike, learn, shred, and then TDD it right. That means you start by hacking together something that works well enough so you can learn how the technology works. Then you shred that initial solution, ripping (or commenting) out all that hacked together code. And start over test-first. Does it take longer? Sure. But the result is more maintainable, testable software with fewer bugs, and also much deeper learning.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-2763826915259085647?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/2763826915259085647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=2763826915259085647&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/2763826915259085647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/2763826915259085647'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2009/07/at-last-i-have-become-productive-in.html' title='At last, I have become productive in using RAILS.'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-6505153558873766147</id><published>2009-01-30T00:17:00.002+05:30</published><updated>2009-01-30T00:25:00.801+05:30</updated><title type='text'>Practices for becoming a better programmer</title><content type='html'>Today, at my work place,  I presented a on the topic "Practices for becoming a better programmer" to the new campus recruits.  This presentation was aimed at sharing some of the best practices which every programmer should know about.&lt;br /&gt;&lt;br /&gt;Examples in these slides came from two major sources:  &lt;a href="http://www.agileskills.org/download.html.en"&gt;Essential Skills for Agile Development &lt;/a&gt;and &lt;a href="http://www.flipkart.com/clean-code-robert-martin-michael/0132350882-mow3fm8nob"&gt;Clean Code&lt;/a&gt;.  Topics themselves have already been discussed and blogged about by many on the internet.&lt;br /&gt;&lt;br /&gt;You are free to use these slides to present on similar topics.  My &lt;a href="http://www.slideshare.net/srikanthps/practices-for-becoming-a-better-programmer-presentation"&gt;slides are available here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-6505153558873766147?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/6505153558873766147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=6505153558873766147&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/6505153558873766147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/6505153558873766147'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2009/01/practices-for-becoming-better.html' title='Practices for becoming a better programmer'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-4042927431649652774</id><published>2008-12-11T23:37:00.003+05:30</published><updated>2008-12-11T23:59:34.144+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Scrum in 15 Minutes</title><content type='html'>Scrum and 15 minutes are related to each other.&lt;br /&gt;Daily Scrum meetings are time boxed to 15 minutes.&lt;br /&gt;&lt;br /&gt;So, when I could not get enough audience for my 1.5 hour presentation on Scrum at my organization, I realized that if I want to be heard, I will have to talk less.&lt;br /&gt;&lt;br /&gt;Hence, I cut down all the fluff from the presentation slides to come up with a bare minimum set of slides that can introduce Scrum in just 15 minutes.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.slideshare.net/srikanthps/scrum-in-15-minutes-presentation/"&gt;You can download the slides from here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Slides are based on Mike Cohn's &lt;a href="http://www.mountaingoatsoftware.com/scrum-a-presentation"&gt;work&lt;/a&gt; and I do not claim any credits for these slides.&lt;br /&gt;Like Mike's slides, these are also free for everyone to use as long as credits to Mike Cohn's work is not removed from the slides.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-4042927431649652774?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/4042927431649652774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=4042927431649652774&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/4042927431649652774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/4042927431649652774'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2008/12/scrum-in-15-minutes.html' title='Scrum in 15 Minutes'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-5377891811523972161</id><published>2008-11-19T01:44:00.005+05:30</published><updated>2008-11-19T15:40:27.716+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>TDD Session</title><content type='html'>Today, I had a real TDD session while I was coding a piece for upcoming release.&lt;br /&gt;&lt;br /&gt;I did a classical TDD (I think):&lt;br /&gt;1. Wrote failing test first.&lt;br /&gt;2. Coded a bit. Made the test pass.&lt;br /&gt;3. Wrote another test(s).&lt;br /&gt;4. Coded some more. Made the test(s) pass.&lt;br /&gt;5. Left the day with a failing test.&lt;br /&gt;&lt;br /&gt;I think, it was Kent Beck, who in his book, &lt;a href="http://www.flipkart.com/test-driven-development-example-beck/8131715957-tu23fqb2ab"&gt;Test Driven Development - By Example&lt;/a&gt;, has mentioned that it is a good practice to leave the day with a failing test. The failing test is a good way to remember "what were you upto yesterday" when you start the day next morning.&lt;br /&gt;&lt;br /&gt;I used Agitar JUnit runner, and it showed me code coverage done by my tests. This helped me to not only write more tests to have 100% code coverage, but also made me remove some redundant conditional checks as the those checks were evaluating to "true" always.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-5377891811523972161?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/5377891811523972161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=5377891811523972161&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/5377891811523972161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/5377891811523972161'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2008/11/tdd-session.html' title='TDD Session'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-7387515462841210413</id><published>2008-11-19T01:12:00.010+05:30</published><updated>2008-11-19T15:40:43.084+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Scrum Adoption</title><content type='html'>&lt;p&gt;I have initated adoption of Scrum in my team. To start with, we are trying to bring Scrum way of doing things in release and iteration planning.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;We have had 2-week iterations in our project, and we have been having a release every 2 months. However, I felt that we have not been planning the work for iterations very effectively.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Now we have started to do following: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;Do a story point estimate of high level deliverables (Stories) for the 2 month phase of the project. &lt;/li&gt;&lt;li&gt;Split the stories based on story points across the three 2-week iterations which we will have in 2 month release. One of the goals of allocating stories to various iterations is to ensure that we have equal distribution of story points across iterations. &lt;/li&gt;&lt;li&gt;Break-up the stories selected for current iteration into tasks. For this, we create tasks on post-it notes, estimate each task in ideal hours, and then put it on task board. &lt;img id="BLOGGER_PHOTO_ID_5270090223456106930" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 320px; CURSOR: hand; HEIGHT: 240px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_16Xoa7OJX0k/SSMfItdcObI/AAAAAAAAACE/e7idX7QJOB0/s320/Task+Board.JPG" border="0" /&gt;&lt;/li&gt;&lt;li&gt;Team signs-up for tasks and moves them from "Not checked-out" to "Checked-out" status in Task boards.&lt;/li&gt;&lt;li&gt;We have daily standup at afternoon 2.30PM. We discuss the status, plan for the day and also, move the completed tasks to "Done" status. &lt;/li&gt;&lt;li&gt;We are doing pair-programming selectively wherever there is a need for knowledge exchange or tasks which we think need could be done faster if two members looked at it.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Yesterday, I presented the Scrum to the team. The slides were based on &lt;a href="http://www.mountaingoatsoftware.com/scrum-a-presentation"&gt;Mike Cohn's slides&lt;/a&gt;. While preparing for the presentation, I had a chance to read the Harvard Business Review , &lt;a href="http://apln-richmond.pbwiki.com/f/New+New+Prod+Devel+Game.pdf"&gt;The New New Product Development Game&lt;/a&gt;, by Hirotaka Takeuchi and Ikujiro Nonaka. It's a great paper and I liked the parts where they talk about "Self-organizing teams" and "Multilearnings".&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-7387515462841210413?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/7387515462841210413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=7387515462841210413&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/7387515462841210413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/7387515462841210413'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2008/11/scrum-adoption.html' title='Scrum Adoption'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_16Xoa7OJX0k/SSMfItdcObI/AAAAAAAAACE/e7idX7QJOB0/s72-c/Task+Board.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-5417976856080710615</id><published>2008-10-26T22:47:00.044+05:30</published><updated>2008-11-03T22:57:29.342+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='Scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Notes from Ken Schwaber presentation on Scrum</title><content type='html'>Source: &lt;a href="http://video.google.com/videoplay?docid=-7230144396191025011"&gt;Google Video Presentation by Ken Schroder on Scrum&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;* Everything in Scrum is time-boxed.&lt;br /&gt;* It's the team which has to get things done by the end of timebox, and that should be potentially shippable.&lt;br /&gt;* Scrum is about managing product development, and XP is about engineering practices for product development.&lt;br /&gt;* Scrum is not a methodology, Scrum is like a simple process framework, analogous to rules of chess (which are simple, but can be used to develop complex strategies).&lt;br /&gt;* Scrum brings in transparency, you know where you are and where you are heading at any given point of time.&lt;br /&gt;&lt;br /&gt;* Product manager defines the backlog.&lt;br /&gt;&lt;br /&gt;* Team decides the contents of a Sprint along with product manager by picking items from Product backlog.&lt;br /&gt;&lt;br /&gt;* Sprint is somewhere between 2 to 4 weeks.&lt;br /&gt;* Team should have minimum or no interupptions during the sprint.&lt;br /&gt;* After the sprint, the backlog is revised and re-prioritized.&lt;br /&gt;&lt;br /&gt;* Burndown chart as indicators for velocity gives transparent view on whether we are going to meet the marketing's deadline or not.&lt;br /&gt;&lt;br /&gt;* Traditionally, Pressure to increase velocity can result in developers reducing the quality and/or working for long hours, and that will only result in much more slower velocity.&lt;br /&gt;&lt;br /&gt;* More than 65% of functionality is rarely used or not used at all. Hence, product manager should select only high value items and leave out the rest from sprint. Hence, instead of trying to increase the velocity, try to re-prioritize the backlog or see if some requirements can be trimmed down.&lt;br /&gt;&lt;br /&gt;* Architecture and design are driven through Non-functional requirements. This type of work can be done in first, second and other sprints, but all sprints much deliver business value, and should demonstrate that architecture infrastructure is working.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-5417976856080710615?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/5417976856080710615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=5417976856080710615&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/5417976856080710615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/5417976856080710615'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2008/10/notes-from-ken-schroder-presentation-on.html' title='Notes from Ken Schwaber presentation on Scrum'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-3239236944897767612</id><published>2008-10-04T01:10:00.005+05:30</published><updated>2008-10-07T14:36:08.204+05:30</updated><title type='text'>Avoid using names for HTML input elements that match HTML FORM object's attribute</title><content type='html'>At work, other day we encounted a strange issue.&lt;br /&gt;&lt;br /&gt;We have this web application which is based on Spring Web Flow, and each of the views in the flow have process buttons such as "Back", "Skip", "Cancel", and "Submit" (for main action).&lt;br /&gt;&lt;br /&gt;In order to resolve an issue, We modified handling of Back, and Cancel buttons from using HTTP POST to use HTTP GET.  In other words, instead of submitting the form to the Spring WEB Flow controller with one of the request parameter being _eventId (represented through a hidden field in form), We changed the Back and Cancel button's click handlers to use "window.location = document.forms[0].action + '&amp;_eventId=back'" and "window.location = document.forms[0].action + '&amp;_eventId=cancel'" respectively.&lt;br /&gt;&lt;br /&gt;For most of the pages, this code just worked fine. However, for few pages related to certain functionality, the above code did not work. With the help of alert messages, We realized that browser was not treating document.forms[0].action as string containing action URL, but was tricked into thinking that document.forms[0].action was an object.&lt;br /&gt;&lt;br /&gt;That behaviour seemed pretty strange as the same code was working fine for 90% of pages.&lt;br /&gt;&lt;br /&gt;After the investigations, we found that there was an HTML input element in the page with name "action".  The browser hence was returning reference to that object instead of the value of "action" URL.&lt;br /&gt;&lt;br /&gt;This was a nice learning.  And the lesson is to avoid using names for any of the HTML input elements (Input box, check box, selects, and other types of input elements) that matches the FORM object's attributes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-3239236944897767612?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/3239236944897767612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=3239236944897767612&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/3239236944897767612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/3239236944897767612'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2008/10/avoid-using-names-for-html-elements.html' title='Avoid using names for HTML input elements that match HTML FORM object&apos;s attribute'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-6886025716237806338</id><published>2008-09-04T00:40:00.004+05:30</published><updated>2008-09-04T00:49:59.730+05:30</updated><title type='text'>http://www.srikanthps.com is online now</title><content type='html'>Thanks to a enlightening blog entry by Jay Fields - &lt;a href="http://blog.jayfields.com/2008/08/be-your-start-up.html"&gt;Be your own startup&lt;/a&gt; , I got my domain registered and now it's pointing to my blog. First step taken care, it's now my turn to follow on other two advices:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Start presenting&lt;/li&gt;&lt;li&gt;Start contributing to open source projects.&lt;/li&gt;&lt;/ol&gt;Let me see how far I will be succesful in following the above two advices.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-6886025716237806338?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/6886025716237806338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=6886025716237806338&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/6886025716237806338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/6886025716237806338'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2008/09/httpwwwsrikanthpscom-is-online-now.html' title='http://www.srikanthps.com is online now'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-35310414.post-7870499278662796601</id><published>2008-09-04T00:06:00.008+05:30</published><updated>2008-09-04T01:13:48.698+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='RAILS'/><category scheme='http://www.blogger.com/atom/ns#' term='Learnings'/><title type='text'>Got running first RAILS sample app</title><content type='html'>It's not really an achievement to get a sample app running. But it almost became frustrating difficult to get it running.&lt;br /&gt;&lt;br /&gt;I have been reading&lt;a href="http://www.manning.com/black/"&gt; RUBY FOR RAILS &lt;/a&gt;book by David A. Black. Since I was nearing the end, and the section four was talking about improving the RAILS app developed in chapter 2, I just wanted to get the sample app from chapter 2 running.&lt;br /&gt;&lt;br /&gt;I already had latest version of RAILS installed on my computer. I followed the instructions in the book to create an app, and controllers and typed in the contents for the all controller .rb files and view .(r)html files. In essence, I did pretty much what the book said (or so I had thought).&lt;br /&gt;&lt;br /&gt;When I ran the application, as usual, it started throwing errors at me. I had to following modifications to run the app:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;RAILS was configured to use Sqlite3. I initially thought its a driver (thanks to my Java backround) and did not care much. But after googling, I found that I had to change config/database.yml to use MySQL. I had to google again to get hold of typical MySQL configuration. Here it is for your reference:&lt;pre&gt;development:&lt;br /&gt;  adapter: mysql&lt;br /&gt;  host: localhost&lt;br /&gt;  database: r4rmusic1_development&lt;br /&gt;  username: railsuser&lt;br /&gt;  password: railsuser&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;My first mistake was that I had copy pasted the line &lt;strong&gt;&lt;span style="font-family:courier new;font-size:85%;color:#3333ff;"&gt;helper :all&lt;/span&gt;&lt;/strong&gt; line already present in the app/controllers/application.rb to define the default layout. I had used &lt;span style="font-family:courier new;font-size:85%;color:#3333ff;"&gt;&lt;strong&gt;layout :base&lt;/strong&gt;&lt;/span&gt;. This was causing &lt;span style="font-family:courier new;font-size:85%;color:#ff0000;"&gt;undefined method `base' for #&lt;maincontroller:0x4bc7948&gt;&lt;/span&gt; error. I did google, but no help. Somehow, I stumbled upon the mistake I had done, and fixed it by using &lt;span style="font-family:courier new;font-size:85%;color:#3333ff;"&gt;layout "base"&lt;/span&gt; in application.rb.&lt;pre&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;I thought I have got everything right now, but application started reporting now a different error. &lt;span style="font-size:85%;color:#ff0000;"&gt;Missing layout layouts/base.html.erb in view path C:/srikanth-development/rails-workspace/r4rmusic1/app/views&lt;/span&gt; I did google again, but not any "bulls-eye" type of help. So, I broke my head for 15 to 20 minutes to get this working. I observed that RAILS was complaining about base.html.erb and I had base.rhtml. It took me some time but I figured that RAILS had changed extension convention for ERB files to .html.erb. My Windows Vista File explorer had that option turned on "Hide extensions of well known files" which kept me confused for some time as I observed only .html files in RAILS generated views. But once, I had .html.erb extension for all view files, things started progressing.&lt;/li&gt;&lt;li&gt;There were many typo in my code and I had to fix all of them to get the app finally up and running.&lt;/li&gt;&lt;/ol&gt;&lt;/maincontroller:0x4bc7948&gt;&lt;p&gt;Getting RAILS installed and getting an app running always seems challenging. But I guess its a matter of getting used to its nuances.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/35310414-7870499278662796601?l=www.srikanthps.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.srikanthps.com/feeds/7870499278662796601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=35310414&amp;postID=7870499278662796601&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/7870499278662796601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/35310414/posts/default/7870499278662796601'/><link rel='alternate' type='text/html' href='http://www.srikanthps.com/2008/09/got-running-first-rails-sample-app.html' title='Got running first RAILS sample app'/><author><name>Srikanth</name><uri>http://www.blogger.com/profile/04390951066987797600</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://4.bp.blogspot.com/_16Xoa7OJX0k/SUqiwSSmLPI/AAAAAAAAACQ/2WJHMhV5gFk/S220/Mee-yahoo.jpg'/></author><thr:total>0</thr:total></entry></feed>
