<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.sidu.in/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:gd="http://schemas.google.com/g/2005" gd:etag="W/&quot;AkUASXgzeCp7ImA9WxFaEUQ.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962</id><updated>2010-07-15T18:20:48.680+05:30</updated><title>Electric Sheep Blog</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.sidu.in/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>146</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.sidu.in/diningtablecoder" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="diningtablecoder" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DEYGQH0yfCp7ImA9WxBRF08.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-4874488474111708370</id><published>2010-01-06T02:33:00.006+05:30</published><updated>2010-01-06T02:45:21.394+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-06T02:45:21.394+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><title>On WWRails... finally</title><content type="html">I'm not sure why I didn't do this long ago, but better late than never, what?&lt;br /&gt;&lt;a href="http://www.workingwithrails.com/recommendation/new/person/18353-sidu-ponnappa" target="_blank"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 240px; height: 90px;" src="http://3.bp.blogspot.com/_ABLwpl_AaVo/S0Opntjz9KI/AAAAAAAAAKk/vj-TI9YT1Kg/s320/wwrails.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5423364875994002594" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-4874488474111708370?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=OLO1sfGlDgQ:6rwZ0z7MIAw:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=OLO1sfGlDgQ:6rwZ0z7MIAw:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=OLO1sfGlDgQ:6rwZ0z7MIAw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=OLO1sfGlDgQ:6rwZ0z7MIAw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=OLO1sfGlDgQ:6rwZ0z7MIAw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=OLO1sfGlDgQ:6rwZ0z7MIAw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=OLO1sfGlDgQ:6rwZ0z7MIAw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=OLO1sfGlDgQ:6rwZ0z7MIAw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=OLO1sfGlDgQ:6rwZ0z7MIAw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=OLO1sfGlDgQ:6rwZ0z7MIAw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/OLO1sfGlDgQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/4874488474111708370/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=4874488474111708370" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4874488474111708370?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4874488474111708370?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2010/01/on-wwrails-finally.html" title="On WWRails... finally" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_ABLwpl_AaVo/S0Opntjz9KI/AAAAAAAAAKk/vj-TI9YT1Kg/s72-c/wwrails.jpg" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;C0AFSXs6eip7ImA9WxBSFE0.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-4900628086596875028</id><published>2009-12-21T18:32:00.003+05:30</published><updated>2009-12-21T18:51:58.512+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-21T18:51:58.512+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="rubyconf" /><title>RubyConf India - Call for Proposals</title><content type="html">The Call for Proposals for &lt;a href="http://rubyconfindia.org/"&gt;India's first RubyConf&lt;/a&gt; in now on. For information on where and how to submit your proposal, please check &lt;a href="http://rubyconfindia.org/"&gt;the website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is a significant milestone to reach when setting up a conference for the first time. There are many people who deserve much appreciation for making this possible, not least all the enthusiastic members of India's Ruby community. A heartfelt thanks to all of you and do come and present; after all it is because of you that the community has gotten this far!&lt;br /&gt;&lt;br /&gt;Please do post this information to any Ruby communities that you are a member of. At this point, publicity is key, so please also blog, tweet, digg and reddit away!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-4900628086596875028?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Cf2nEY9ca5o:2V3o_-vzO-g:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Cf2nEY9ca5o:2V3o_-vzO-g:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Cf2nEY9ca5o:2V3o_-vzO-g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Cf2nEY9ca5o:2V3o_-vzO-g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Cf2nEY9ca5o:2V3o_-vzO-g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Cf2nEY9ca5o:2V3o_-vzO-g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Cf2nEY9ca5o:2V3o_-vzO-g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Cf2nEY9ca5o:2V3o_-vzO-g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Cf2nEY9ca5o:2V3o_-vzO-g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Cf2nEY9ca5o:2V3o_-vzO-g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/Cf2nEY9ca5o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/4900628086596875028/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=4900628086596875028" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4900628086596875028?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4900628086596875028?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/12/rubyconf-india-call-for-proposals.html" title="RubyConf India - Call for Proposals" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0QERXk7fyp7ImA9WxNXGUU.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-7258060293916700192</id><published>2009-10-08T11:21:00.004+05:30</published><updated>2009-10-08T11:25:04.707+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-08T11:25:04.707+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="rubyconf" /><title>RubyConf India - It's official!</title><content type="html">Yes, it's true. RubyConf is happening in Bangalore, India early next year. Here's the link to the (currently rather brief) &lt;a href="http://rubyconfindia.org"&gt;RunConf India 2010 website&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-7258060293916700192?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=NW5LI20CEGY:WlqcwsbfMiE:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=NW5LI20CEGY:WlqcwsbfMiE:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=NW5LI20CEGY:WlqcwsbfMiE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=NW5LI20CEGY:WlqcwsbfMiE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=NW5LI20CEGY:WlqcwsbfMiE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=NW5LI20CEGY:WlqcwsbfMiE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=NW5LI20CEGY:WlqcwsbfMiE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=NW5LI20CEGY:WlqcwsbfMiE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=NW5LI20CEGY:WlqcwsbfMiE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=NW5LI20CEGY:WlqcwsbfMiE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/NW5LI20CEGY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/7258060293916700192/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=7258060293916700192" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/7258060293916700192?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/7258060293916700192?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/10/rubyconf-india-its-official.html" title="RubyConf India - It's official!" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;C0cER3syfCp7ImA9WxNQEUs.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-4920140306838854130</id><published>2009-09-17T00:10:00.005+05:30</published><updated>2009-09-17T09:46:46.594+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-17T09:46:46.594+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="jruby" /><title>Faster xml deserialisation on JRuby</title><content type="html">For the last day or so, I've been looking at XML deserilisation performance at work. When dealing with REST/POX, a respectable fraction of the time is spent in serilising and deserialising xml; consequently it's a fair target for performance analysis. Since I'm currently working on a multi-threaded Twitter library built using &lt;a href="http://github.com/kaiwren/wrest"&gt;Wrest&lt;/a&gt;, I decided I might as well take a look at xml deserialisation performance under JRuby.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The Contenders&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Wrest delegates XML deserilisation to ActiveSupport, which in turn supports one of three libraries - LibXML Ruby, Nokogiri and of course REXML. REXML is the slowest, buggiest of the three and is pure Ruby. Both LibXML and Nokogiri use the native libxml2 libraries; however LibXML is &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; available on JRuby whereas Nokogiri is. Nokogiri also has an as yet unreleased version that does not use the JNA based JRuby FFI implementation and is expected to be faster. Build instructions for the non FFI Nokogiri are available &lt;a href="http://planet-soc.com/node/7930"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;REXML can however be enhanced by including &lt;a href="http://github.com/nicksieger/jrexml"&gt;JREXML&lt;/a&gt; which uses the java xpp3 libs and claims a 10x performance improvemnt. &lt;br /&gt;&lt;br /&gt;Thus we have four contenders:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Vanilla REXML&lt;/li&gt;&lt;li&gt;REXML enhanced by JREXML&lt;/li&gt;&lt;li&gt;FFI Nokogiri&lt;/li&gt;&lt;li&gt;Non FFI nokogiri&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The Test Environment&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;jruby -v&lt;/code&gt; reads &lt;code&gt;jruby 1.4.0dev (ruby 1.8.7p174) (2009-08-05 619cebe) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_13) [x86_64-java]&lt;/code&gt;)&lt;/li&gt;&lt;li&gt;I'm using a 2.2GHz 2008 MacBook Pro running Leopard&lt;/li&gt;&lt;li&gt;The benchmark is a simple Hash.from_xml. It's canned as a Wrest rake task. The full command is &lt;code&gt;jruby -S rake -J-server benchmark:deserialise_xml&lt;/code&gt;&lt;/li&gt;&lt;li&gt;JREXML 0.5.3 and Nokogiri 1.3.3 (the non-FFI build is also 1.3.3, revision fb7e9bb6, from the origin/java branch of tenderlove/nokogiri)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The Numbers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:115%;"&gt;Vanilla REXML&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;Deserialising using ActiveSupport::XmlMini_REXML&lt;br /&gt;Rehearsal -------------------------------------------------&lt;br /&gt;Hash.from_xml  11.831000   0.000000  11.831000 ( 11.831000)&lt;br /&gt;--------------------------------------- total: 11.831000sec&lt;br /&gt;&lt;br /&gt;                    user     system      total        real&lt;br /&gt;hash.from_xml   5.475000   0.000000   5.475000 (  5.474000)&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:115%;"&gt;REXML + JREXML&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;Detected JRuby, JREXML loaded.&lt;br /&gt;Deserialising using ActiveSupport::XmlMini_REXML&lt;br /&gt;Rehearsal -------------------------------------------------&lt;br /&gt;Hash.from_xml  11.323000   0.000000  11.323000 ( 11.323000)&lt;br /&gt;--------------------------------------- total: 11.323000sec&lt;br /&gt;&lt;br /&gt;                    user     system      total        real&lt;br /&gt;Hash.from_xml   5.436000   0.000000   5.436000 (  5.436000)&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:115%;"&gt;FFI Nokogiri&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;Deserialising using ActiveSupport::XmlMini_Nokogiri&lt;br /&gt;Rehearsal -------------------------------------------------&lt;br /&gt;Hash.from_xml   9.468000   0.000000   9.468000 (  9.468000)&lt;br /&gt;---------------------------------------- total: 9.468000sec&lt;br /&gt;&lt;br /&gt;                    user     system      total        real&lt;br /&gt;Hash.from_xml   3.876000   0.000000   3.876000 (  3.876000)&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:115%;"&gt;Non FFI Nokogiri&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;Deserialising using ActiveSupport::XmlMini_Nokogiri&lt;br /&gt;Rehearsal -------------------------------------------------&lt;br /&gt;Hash.from_xml   5.956000   0.000000   5.956000 (  5.956000)&lt;br /&gt;---------------------------------------- total: 5.956000sec&lt;br /&gt;&lt;br /&gt;                    user     system      total        real&lt;br /&gt;Hash.from_xml   2.123000   0.000000   2.123000 (  2.123000)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;As expected, REXML was slow. Surprisingly though, JREXML didn't improve those numbers very much.&lt;br /&gt;FFI Nokogiri was faster than REXML, but the JNA seems to have taken its toll - on MRI 1.8.6 the same benchmark runs in under 2s. Non FFI Nokogiri was the real win, though, taking deserialisation performance within spitting distance of the CRuby Nokogiri.&lt;br /&gt;&lt;br /&gt;Note that &lt;code&gt;Hash.from_xml&lt;/code&gt; does mess around a bit with the hash that the libraries produce and this might make the numbers different from directly using the xml libraries; however since this API is what I need to use with in Wrest (and Rails on JRuby, for that matter) these are the relative performance numbers I'm interested in seeing. If you're not using Rails (or Wrest, dare I say?) you may want to re-run this benchmark against the libraries directly without ActiveSupport mediating.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-4920140306838854130?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=eH5ZsyeQVno:thB7oYfzS4A:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=eH5ZsyeQVno:thB7oYfzS4A:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=eH5ZsyeQVno:thB7oYfzS4A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=eH5ZsyeQVno:thB7oYfzS4A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=eH5ZsyeQVno:thB7oYfzS4A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=eH5ZsyeQVno:thB7oYfzS4A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=eH5ZsyeQVno:thB7oYfzS4A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=eH5ZsyeQVno:thB7oYfzS4A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=eH5ZsyeQVno:thB7oYfzS4A:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=eH5ZsyeQVno:thB7oYfzS4A:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/eH5ZsyeQVno" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/4920140306838854130/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=4920140306838854130" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4920140306838854130?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4920140306838854130?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/09/faster-xml-deserilisation-on-jruby.html" title="Faster xml deserialisation on JRuby" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;C0UNSXo_eyp7ImA9WxNSEU4.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-397829642580057019</id><published>2009-08-22T19:06:00.015+05:30</published><updated>2009-08-24T21:58:18.443+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-24T21:58:18.443+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="wrest" /><category scheme="http://www.blogger.com/atom/ns#" term="REST" /><title>Wrest, REST and Ruby HTTP libraries</title><content type="html">I've been using Rails' ActiveResource for over eighteen months to consume the &lt;a href="http://en.wikipedia.org/wiki/Plain_Old_XML"&gt;POX&lt;/a&gt; based pseudo &lt;a href="http://en.wikipedia.org/wiki/REST"&gt;REST&lt;/a&gt; that Rails applications make so easy to produce, and I'm not overwhelmed. &lt;br /&gt;&lt;br /&gt;ActiveResource &lt;a href="http://blog.brianguthrie.com/articles/2008/08/02/the-weirdest-code-ive-seen-recently"&gt;isn't a particularly well written library&lt;/a&gt;, nor is it easy to extend, modify and use. It doesn't support certain features that I've come to consider essential for a Rails POX/REST client, like pagination. The only nice things you can say about it are that it works for the most common cases, and that it ships with Rails. But you know what hackers say about sucky tools - 'Don't get mad; roll your own'. So I did. &lt;br /&gt;&lt;br /&gt;I started working on &lt;a href="http://github.com/kaiwren/wrest"&gt;Wrest&lt;/a&gt; a few months ago with the intention of creating a drop-in replacement for ActiveResource. The section of the Wrest &lt;a href="http://github.com/kaiwren/wrest/tree/master/README.rdoc"&gt;README&lt;/a&gt; that talks about Wrest::Resource is actually a record of the features that we've discussed over the &lt;a href="http://blog.sidu.in/2006/10/eh-wassa-dining-table.html"&gt;dining table&lt;/a&gt; that we &lt;span style="font-style:italic;"&gt;wished&lt;/span&gt; ActiveResource had. However, as I hacked away on Wrest, I slowly came to realise that a good REST client needs to be a good &lt;span style="font-style:italic;"&gt;HTTP&lt;/span&gt; client first.&lt;br /&gt;&lt;br /&gt;I took a look at those that were popular at the time, but they didn't really appeal to my engineering aesthetic. They heavily favoured class/static methods and seemed to be geared toward command line usage rather than as a library. So I started to implement a clean, easy to use and well encapsulated HTTP library first, resulting in Wrest::Core; it is now ready for use and is sufficiently mature that I'm comfortable writing about it and inviting people to take it for a spin. It does need a few more features, but nothing that can't be added with a few hours worth of hacking. Wrest::Resource however, is still a work in progress, but some of its building blocks are already ready for use. You can see some examples &lt;a href="http://github.com/kaiwren/wrest/tree/master/examples"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Wrest is available for installation through both RubyGems and as a Rails plugin via &lt;a href="http://github.com/kaiwren/wrest"&gt;Git&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To get the gem, all you need to do is &lt;code&gt;(sudo) gem install wrest&lt;/code&gt;. If you want it as a Rails plugin, simply do &lt;code&gt;script/plugin install git://github.com/kaiwren/wrest.git&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Wrest runs on Ruby 1.8, 1.9 as well as JRuby.&lt;br /&gt;&lt;br /&gt;Here is an example that shows how you can use the &lt;a href="http://delicious.com/help/api"&gt;Delicious API&lt;/a&gt; using Wrest. If you can't see it (it's a github gist that needs js) you can see the original source &lt;a href="http://github.com/kaiwren/wrest/tree/master/examples/delicious.rb"&gt;here&lt;/a&gt;. You may also be interested in the &lt;a href="http://github.com/kaiwren/wrest/tree/master/examples/twitter.rb"&gt;Twitter example&lt;/a&gt;, which showcases a more complex scenario with ideas and features from Wrest::Resource.&lt;br /&gt;&lt;br /&gt;&lt;script src="http://gist.github.com/172794.js"&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-397829642580057019?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=To8DZLZVSZM:kJVmLBjklvM:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=To8DZLZVSZM:kJVmLBjklvM:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=To8DZLZVSZM:kJVmLBjklvM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=To8DZLZVSZM:kJVmLBjklvM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=To8DZLZVSZM:kJVmLBjklvM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=To8DZLZVSZM:kJVmLBjklvM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=To8DZLZVSZM:kJVmLBjklvM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=To8DZLZVSZM:kJVmLBjklvM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=To8DZLZVSZM:kJVmLBjklvM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=To8DZLZVSZM:kJVmLBjklvM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/To8DZLZVSZM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/397829642580057019/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=397829642580057019" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/397829642580057019?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/397829642580057019?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/08/wrest-rest-and-ruby-http-libraries.html" title="Wrest, REST and Ruby HTTP libraries" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>11</thr:total></entry><entry gd:etag="W/&quot;CUAHRXo9fip7ImA9WxJVE0Q.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-3903574927410490750</id><published>2009-07-01T01:56:00.001+05:30</published><updated>2009-07-01T01:58:54.466+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-01T01:58:54.466+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="oss" /><category scheme="http://www.blogger.com/atom/ns#" term="release" /><category scheme="http://www.blogger.com/atom/ns#" term="cc.rb" /><title>CruiseControl.rb 1.4.0 released!</title><content type="html">We are happy to announce the release of &lt;a href="http://cruisecontrolrb.thoughtworks.com"&gt;CruiseControl.rb&lt;/a&gt; 1.4.0. This release adds support for three distributed version control systems - Git, Mercurial and Bazaar - in addition to Subversion.&lt;br /&gt;&lt;br /&gt;CC.rb remains easy to install, pleasant to use and simple to hack. Since the source has now moved to a &lt;a href="http://github.com/thoughtworks/cruisecontrol.rb"&gt;git repository&lt;/a&gt;, it is easier than ever to fork and contribute. We're looking forward to your pull requests!&lt;br /&gt;&lt;br /&gt;Downloads are available from both &lt;a href="http://rubyforge.org/frs/?group_id=2918"&gt;Rubyforge&lt;/a&gt; and &lt;a href="http://github.com/thoughtworks/cruisecontrol.rb/tree/v1.4.0"&gt;Github&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-3903574927410490750?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=okteJPXJC48:F77oEyYsHJ4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=okteJPXJC48:F77oEyYsHJ4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=okteJPXJC48:F77oEyYsHJ4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=okteJPXJC48:F77oEyYsHJ4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/okteJPXJC48" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/3903574927410490750/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=3903574927410490750" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/3903574927410490750?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/3903574927410490750?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/07/cruisecontrolrb-140-released.html" title="CruiseControl.rb 1.4.0 released!" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUQMRHw4cCp7ImA9WxJXEE0.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-1163640395608610744</id><published>2009-06-03T09:24:00.005+05:30</published><updated>2009-06-03T09:59:45.238+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-03T09:59:45.238+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="darkness" /><category scheme="http://www.blogger.com/atom/ns#" term="metaprogramming" /><title>Dynamic languages, Twitter, kind_of? and some statistics</title><content type="html">Some time ago &lt;a href="/2009/04/twitter-on-ruby-and-scala.html"&gt;I'd written&lt;/a&gt; about how &lt;a href="http://www.artima.com/scalazine/articles/twitter_on_scala.html"&gt;Twitter's descriptions of their own codebase&lt;/a&gt; made my hackles rise.&lt;br /&gt;&lt;br /&gt;I wasn't alone in this, and one discussion thread on the internal ThoughtWorks dev list later we had some hard numbers extracted from all the Ruby work we've done or are doing.&lt;br /&gt;&lt;br /&gt;Martin's put them up on his bliki - &lt;a href="http://martinfowler.com/bliki/DynamicTypeCheck.html"&gt;take a look&lt;/a&gt;. &lt;span style="font-style:italic;"&gt;There&lt;/span&gt; are the numbers to back the talk - you &lt;span style="font-style:italic;"&gt;don't&lt;/span&gt; need type checks all over your codebase in Ruby (or any other dynamic language), Alex Payne's opinion notwithstanding.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-1163640395608610744?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=bClnjV0wATQ:XytGiRd6zLk:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=bClnjV0wATQ:XytGiRd6zLk:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=bClnjV0wATQ:XytGiRd6zLk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=bClnjV0wATQ:XytGiRd6zLk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=bClnjV0wATQ:XytGiRd6zLk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=bClnjV0wATQ:XytGiRd6zLk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=bClnjV0wATQ:XytGiRd6zLk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=bClnjV0wATQ:XytGiRd6zLk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=bClnjV0wATQ:XytGiRd6zLk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=bClnjV0wATQ:XytGiRd6zLk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/bClnjV0wATQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/1163640395608610744/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=1163640395608610744" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/1163640395608610744?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/1163640395608610744?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/06/dynamic-languages-twitter-kindof-and.html" title="Dynamic languages, Twitter, kind_of? and some statistics" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkYNRXcycSp7ImA9WxVaE0k.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-5130760274998432808</id><published>2009-04-10T12:27:00.008+05:30</published><updated>2009-04-10T12:53:14.999+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-10T12:53:14.999+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="event" /><category scheme="http://www.blogger.com/atom/ns#" term="dcb2" /><category scheme="http://www.blogger.com/atom/ns#" term="devcampbangalore" /><title>DevCamp Tomorrow</title><content type="html">So &lt;a href="http://devcamp.in"&gt;DevCamp&lt;/a&gt; is tomorrow; I haven't got my talk(s?) anywhere close to ready, so today is going to be a hard grind. Perhaps, I'll just do the Ruby talk and skip the js one?&lt;br /&gt;&lt;br /&gt;Anyways, if you live in Bangalore or happen be in town on Saturday, 11th April, do consider dropping in (directions to ThoughtWorks office can be &lt;a href="http://devcamp.in/wiki/Venue:_ThoughtWorks_Bangalore"&gt;found on the wiki&lt;/a&gt;, map and all); there are &lt;a href="http://devcamp.in/wiki/DevCamp_Bangalore_2_Sessions"&gt;18 sessions up on the wiki&lt;/a&gt; and a bunch of interesting people participating, so it should be an entertaining gig.&lt;br /&gt;&lt;br /&gt;Oh, and do remember to tell any of your friends who might be interested.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-5130760274998432808?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=CRrMwQDujVQ:5nG5jeX7cQM:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=CRrMwQDujVQ:5nG5jeX7cQM:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=CRrMwQDujVQ:5nG5jeX7cQM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=CRrMwQDujVQ:5nG5jeX7cQM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=CRrMwQDujVQ:5nG5jeX7cQM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=CRrMwQDujVQ:5nG5jeX7cQM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=CRrMwQDujVQ:5nG5jeX7cQM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=CRrMwQDujVQ:5nG5jeX7cQM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=CRrMwQDujVQ:5nG5jeX7cQM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=CRrMwQDujVQ:5nG5jeX7cQM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/CRrMwQDujVQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/5130760274998432808/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=5130760274998432808" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/5130760274998432808?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/5130760274998432808?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/04/devcamp-tomorrow.html" title="DevCamp Tomorrow" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;AkAEQX0zfCp7ImA9WxVaE0k.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-6478747728829537405</id><published>2009-04-06T22:19:00.012+05:30</published><updated>2009-04-10T13:01:40.384+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-10T13:01:40.384+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="functional programming" /><category scheme="http://www.blogger.com/atom/ns#" term="twitter" /><category scheme="http://www.blogger.com/atom/ns#" term="scala" /><title>Twitter on Ruby and Scala</title><content type="html">Ever heard a code-smell in a conversation? Like this guy is giving you gyan about how he's doing x in language y and it's such a pain in the ass, and you're thinking to yourself "x is such a darn stupid idea in the first place," know what I mean?&lt;br /&gt;&lt;br /&gt;The reason I bring this up is because this &lt;a href="http://www.artima.com/scalazine/articles/twitter_on_scala.html"&gt;interview with some of the Twitter hackers&lt;/a&gt; came up on the ThoughtWorks software dev mailing list today, and it smelt faintly of cowpats so I thought it worth a mention.&lt;br /&gt;&lt;br /&gt;Most of the interview is fairly quiet, sensible stuff; you're ambling along going 'Ho, hum, mildly interesting...' and then something fearsomely ignorant bumbles out and gores you someplace delicate. Here's an example that got pointed out: &lt;blockquote&gt;Alex Payne: I’d definitely want to hammer home what Steve said about typing. As our system has grown, a lot of the logic in our Ruby system sort of replicates a type system, either in our unit tests or as validations on models. I think it may just be a property of large systems in dynamic languages, that eventually you end up rewriting your own type system, and you sort of do it badly. You’re checking for null values all over the place. There’s lots of calls to Ruby’s kind_of? method, which asks, “Is this a kind of User object? Because that’s what we’re expecting. If we don’t get that, this is going to explode.” It is a shame to have to write all that when there is a solution that has existed in the world of programming languages for decades now.&lt;/blockquote&gt;Aargh. Aargh, I say. I would freakin' bust someone who wrote object-oriented code with &lt;code&gt;is_a?&lt;/code&gt; or &lt;code&gt;kind_of?&lt;/code&gt; in it, and here's this laddie out on the world wide internetworks proudly &lt;span style="font-style:italic;"&gt;admitting&lt;/span&gt; that his people write that kind of code. &lt;code&gt;nil&lt;/code&gt; checks everywhere? The solution to &lt;a href="http://en.wikipedia.org/wiki/Null_object_pattern"&gt;that&lt;/a&gt; has been around for ten years now, for crying out loud. Hasn't anyone told them this kind of code is a people problem, not a language problem?&lt;br /&gt;&lt;br /&gt;Here's another bit that seemed suspicious:&lt;blockquote&gt;Alex Payne: I think programmers who’ve never worked with a language with pattern matching before should be prepared to have that change their perceptions about programming. I was talking to a group of mostly Mac programmers, largely Objective-C developers. I was trying to convey to them that once you start working with pattern matching, you’ll never want to use a language without it again. It’s such a common thing that a programmer does every day. I have a collection of stuff. Let me pick certain needles out of this haystack, whether its based on a class or their contents, it’s such a powerful tool. It’s so great.&lt;/blockquote&gt;Needle in a haystack, eh? In my limited fp experience, pattern matching is used in functional languages for both terseness and for polymorphism. What they seem to be describing - using pattern matching as a glorified regexp and an accessory to the violation of encapsulation - seems pretty unnecessary, given that they're using an OO language that supports polymorphism through objects anyways. This kind of stuff was why I put my Scala studies on hold until I learned how to think correctly in functional terms; Scala makes it easy for a novice to write code that is neither good FP nor good OO.&lt;br /&gt;&lt;br /&gt;I have this feeling that Twitter is always 'discovering' something which the rest of the world already knows and has used for a long time. What's worse, they won't go look at the tons of work that's out there and learn from that; no, they'll make the same naive mistakes all over again, like they did a couple of years ago with message queues, a story I've heard from a lot of people.&lt;br /&gt;&lt;br /&gt;Don't get me wrong here, I'm not dissing everything they've said; they're good chaps and have a fantastic service deserving of respect. I've also written a &lt;span style="font-style:italic;"&gt;little&lt;/span&gt; Scala myself and have been lurking on the &lt;span style="font-style:italic;"&gt;/Lift/&lt;/span&gt; lists for over a year and I agree with them when they say Scala is a nice language. But frankly, a little engineering and attention to code quality might help them solve more problems than switching languages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-6478747728829537405?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Y1NJCunp15w:51BeLwKX58g:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Y1NJCunp15w:51BeLwKX58g:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Y1NJCunp15w:51BeLwKX58g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Y1NJCunp15w:51BeLwKX58g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Y1NJCunp15w:51BeLwKX58g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Y1NJCunp15w:51BeLwKX58g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Y1NJCunp15w:51BeLwKX58g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Y1NJCunp15w:51BeLwKX58g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Y1NJCunp15w:51BeLwKX58g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Y1NJCunp15w:51BeLwKX58g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/Y1NJCunp15w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/6478747728829537405/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=6478747728829537405" title="17 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/6478747728829537405?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/6478747728829537405?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/04/twitter-on-ruby-and-scala.html" title="Twitter on Ruby and Scala" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>17</thr:total></entry><entry gd:etag="W/&quot;A0QCQn08cCp7ImA9WxVbEU4.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-6913532167865883593</id><published>2009-03-22T23:27:00.007+05:30</published><updated>2009-03-27T13:06:03.378+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-27T13:06:03.378+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="irc" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="undernet" /><title>Connecting to Undernet in India is easy... not.</title><content type="html">It appears that &lt;a href="http://undernet.org"&gt;Undernet&lt;/a&gt; is &lt;a href="http://forum.undernet.org/viewtopic.php?f=2&amp;t=9536&amp;start=15"&gt;blocked across a whole bunch of networks in India for reasons unknown&lt;/a&gt;. Here's my traceroute to us.undernet.org:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;~$ traceroute us.undernet.org&lt;br /&gt;traceroute: Warning: us.undernet.org has multiple addresses; using 66.186.59.50&lt;br /&gt;traceroute to us.undernet.org (66.186.59.50), 64 hops max, 40 byte packets&lt;br /&gt; 1  192.168.1.1 (192.168.1.1)  1.227 ms  0.858 ms  0.875 ms&lt;br /&gt; 2  ABTS-KK-Dynamic-001.64.167.122.airtelbroadband.in (122.167.64.1)  39.120 ms  26.279 ms *&lt;br /&gt; 3  ABTS-KK-Static-041.32.166.122.airtelbroadband.in (122.166.32.41)  47.611 ms  25.424 ms  25.164 ms&lt;br /&gt; 4  ABTS-KK-Static-009.32.166.122.airtelbroadband.in (122.166.32.9)  25.713 ms  25.913 ms  24.841 ms&lt;br /&gt; 5  122.175.255.29 (122.175.255.29)  26.253 ms  25.515 ms  25.598 ms&lt;br /&gt; 6  * * *&lt;br /&gt; 7  * * *&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;There is just one server accessible, and that's montreal.qc.ca.undernet.org. Hopefully, this should save you a half hour's googling.&lt;br /&gt;&lt;br /&gt;Don't let this stop you from filing a complaint with your ISP though (I just logged one with Airtel - ticket #18088886 - and they've promised to have this sorted by 1:30 pm tomorrow) - this is still a free country and they have no business blocking &lt;span style="font-style:italic;"&gt;anything&lt;/span&gt; on the internetworks.&lt;br /&gt;&lt;br /&gt;Update 2009-03-24:&lt;br /&gt;Oslo.NO.EU.Undernet.Org also seems to work. Still no response from Airtel, however. That's quite atypical - it's the first time in about three years that Airtel has failed their "we'll fix it in four business hours" promise.&lt;br /&gt;&lt;br /&gt;Update 2009-03-27:&lt;blockquote&gt;&lt;br /&gt;Date: 25/3/09 1:24 AM&lt;br /&gt;Hi,&lt;br /&gt;&lt;br /&gt;I was to be informed about the status issue 18088886 regarding blocking of Undernet IRC servers by Airtel latest by 13:30 on 24th March, but have not been contacted. Please get back to me with an update.&lt;br /&gt;&lt;br /&gt;Thanks,&lt;br /&gt;Sidu.&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;Date: 25/3/09 1:32 PM&lt;br /&gt;&lt;br /&gt;Dear Mr.Sidu,&lt;br /&gt;&lt;br /&gt;Thank you for writing to us at Airtel Telemedia Services.&lt;br /&gt;&lt;br /&gt;We acknowledge the receipt of your mail dated March 25th, 2009.&lt;br /&gt;&lt;br /&gt;With regards to reference number 18088886, we regret to inform you that IRC&lt;br /&gt;port 66602 cannot be opened as the same has&lt;br /&gt;been blocked by Department of Telecommunications (DoT).&lt;br /&gt;&lt;br /&gt;For further assistance, please.&lt;br /&gt;• Call us at 080-44444121&lt;br /&gt;• E-Mail us at - care.karnataka@airtel.in&lt;br /&gt;• Fax us at 080-41112346&lt;br /&gt;&lt;br /&gt;Assuring you of our best of  services at all times.&lt;br /&gt;Yours sincerely,&lt;br /&gt;&lt;br /&gt;Thrapthi&lt;br /&gt;Customer Relations&lt;br /&gt;Airtel Telemedia Services&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;Date: 25/3/09 3:08 PM&lt;br /&gt;Hi,&lt;br /&gt;&lt;br /&gt;The highest port possible is 65535. Port number 66602 does not exist. Please confirm your response.&lt;br /&gt;&lt;br /&gt;Please keep in mind that I am able to connect to other IRC networks (like Freenode) on the standard IRC ports, which would not be possible if the ports themselves were blocked by the DoT.&lt;br /&gt;&lt;br /&gt;Best,&lt;br /&gt;Sidu. &lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;Date: 26/3/09 9:15 AM&lt;br /&gt;&lt;br /&gt;Dear Mr. Sidu,&lt;br /&gt;&lt;br /&gt;Thank you for writing to us at Airtel Telemedia Services.&lt;br /&gt;&lt;br /&gt;We acknowledge the receipt of your mail dated March 25th, 2009.&lt;br /&gt;&lt;br /&gt;Your request for broadband related has already been registered with the&lt;br /&gt;reference number&lt;br /&gt;18088886 and we have forwarded your mail to our technical team for further&lt;br /&gt;clarifications.&lt;br /&gt;&lt;br /&gt;We would get back to you as per the updates.&lt;br /&gt;&lt;br /&gt;For further assistance, please.&lt;br /&gt;• Call us at 080-44444121&lt;br /&gt;• E-Mail us at - care.karnataka@airtel.in&lt;br /&gt;• Fax us at 080-41112346&lt;br /&gt;&lt;br /&gt;Assuring you of our best of  services at all times.&lt;br /&gt;Yours sincerely,&lt;br /&gt;&lt;br /&gt;Mohsin.&lt;br /&gt;Customer Relations&lt;br /&gt;Airtel Telemedia Services&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-6913532167865883593?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=82Q_DUxBfUo:_huMI1V3Ek0:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=82Q_DUxBfUo:_huMI1V3Ek0:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=82Q_DUxBfUo:_huMI1V3Ek0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=82Q_DUxBfUo:_huMI1V3Ek0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=82Q_DUxBfUo:_huMI1V3Ek0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=82Q_DUxBfUo:_huMI1V3Ek0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=82Q_DUxBfUo:_huMI1V3Ek0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=82Q_DUxBfUo:_huMI1V3Ek0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=82Q_DUxBfUo:_huMI1V3Ek0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=82Q_DUxBfUo:_huMI1V3Ek0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/82Q_DUxBfUo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/6913532167865883593/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=6913532167865883593" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/6913532167865883593?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/6913532167865883593?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/03/connecting-to-undernet-in-india-is-easy.html" title="Connecting to Undernet in India is easy... not." /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>5</thr:total></entry><entry gd:etag="W/&quot;D0ICQHg5cSp7ImA9WxVUEUQ.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-2878213727096657061</id><published>2009-03-16T14:16:00.007+05:30</published><updated>2009-03-16T14:56:01.629+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-16T14:56:01.629+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="event" /><category scheme="http://www.blogger.com/atom/ns#" term="dcb2" /><category scheme="http://www.blogger.com/atom/ns#" term="devcampbangalore" /><title>Announcing DevCamp Bangalore 2</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ABLwpl_AaVo/Sb4UrhdLMTI/AAAAAAAAAJw/8Cm1RI-87js/s1600-h/devcamp22009.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 104px;" src="http://2.bp.blogspot.com/_ABLwpl_AaVo/Sb4UrhdLMTI/AAAAAAAAAJw/8Cm1RI-87js/s400/devcamp22009.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5313707348291432754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We're happy to announce the second edition of DevCamp Bangalore, &lt;a href="http://devcamp.in/"&gt;DevCamp Bangalore 2&lt;/a&gt;; it's happening on Saturday, 11th April 2009.&lt;br /&gt;&lt;br /&gt;DevCamp is an un-conference by the &lt;a href="http://www.cs.berkeley.edu/%7Ebh/hacker.html" class="external text" title="http://www.cs.berkeley.edu/~bh/hacker.html" rel="nofollow"&gt;hackers&lt;/a&gt;, for the &lt;a href="http://www.catb.org/jargon/html/meaning-of-hack.html" class="external text" title="http://www.catb.org/jargon/html/meaning-of-hack.html" rel="nofollow"&gt;hackers&lt;/a&gt; and of the &lt;a href="http://en.wikipedia.org/wiki/Hacker_%28programmer_subculture%29#Definition" class="external text" title="http://en.wikipedia.org/wiki/Hacker_(programmer_subculture)#Definition" rel="nofollow"&gt;hackers&lt;/a&gt;.&lt;br /&gt;It's a species of &lt;a href="http://en.wikipedia.org/wiki/Barcamp" class="external text" title="http://en.wikipedia.org/wiki/Barcamp" rel="nofollow"&gt;BarCamp&lt;/a&gt; where anything a lover of computers and technology would consider important or entertaining goes.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.devcamp.in/wiki/DevCamp_Bangalore_1"&gt;first DevCamp&lt;/a&gt; happened a little over a year ago and was a lot of fun; we're hoping hoping to keep that trend going with DCB2.&lt;br /&gt;&lt;br /&gt;If you're planning to do a session at DCB2, do keep in mind the fact that everyone at DevCamp is a hacker, a pro. Please assume a high level of exposure and knowledge on the part of your audience and tailor your sessions to suit. Avoid 'Hello World' and how-to sessions which can be trivially found on the net. First hand war stories, in-depth analyses of topics and live demos are best.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-2878213727096657061?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=q0xEUchZpDE:_h_xM-MYQR4:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=q0xEUchZpDE:_h_xM-MYQR4:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=q0xEUchZpDE:_h_xM-MYQR4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=q0xEUchZpDE:_h_xM-MYQR4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=q0xEUchZpDE:_h_xM-MYQR4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=q0xEUchZpDE:_h_xM-MYQR4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=q0xEUchZpDE:_h_xM-MYQR4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=q0xEUchZpDE:_h_xM-MYQR4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=q0xEUchZpDE:_h_xM-MYQR4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=q0xEUchZpDE:_h_xM-MYQR4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/q0xEUchZpDE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/2878213727096657061/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=2878213727096657061" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/2878213727096657061?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/2878213727096657061?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/03/announcing-devcamp-bangalore-2.html" title="Announcing DevCamp Bangalore 2" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_ABLwpl_AaVo/Sb4UrhdLMTI/AAAAAAAAAJw/8Cm1RI-87js/s72-c/devcamp22009.jpg" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DUcCSX04fCp7ImA9WxVVGUo.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-4611619204875057053</id><published>2009-03-14T02:01:00.004+05:30</published><updated>2009-03-14T02:14:28.334+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-14T02:14:28.334+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="activeresource" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><title>ActiveResource logging tip</title><content type="html">If you're developing using ActiveResource, you should to add this line to your environment.rb:&lt;code&gt;&lt;pre&gt;ActiveResource::Base.logger = ActiveRecord::Base.logger&lt;/pre&gt;&lt;/code&gt;That will write all your resource requests to the log as well, a useful thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-4611619204875057053?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=VeU7lAvvtHw:yXixkf8WTc4:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=VeU7lAvvtHw:yXixkf8WTc4:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=VeU7lAvvtHw:yXixkf8WTc4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=VeU7lAvvtHw:yXixkf8WTc4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=VeU7lAvvtHw:yXixkf8WTc4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=VeU7lAvvtHw:yXixkf8WTc4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=VeU7lAvvtHw:yXixkf8WTc4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=VeU7lAvvtHw:yXixkf8WTc4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=VeU7lAvvtHw:yXixkf8WTc4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=VeU7lAvvtHw:yXixkf8WTc4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/VeU7lAvvtHw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/4611619204875057053/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=4611619204875057053" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4611619204875057053?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4611619204875057053?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/03/activresource-logging-tip.html" title="ActiveResource logging tip" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>5</thr:total></entry><entry gd:etag="W/&quot;A0EAQ34ycSp7ImA9WxVVGEo.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-7364338863096087077</id><published>2009-03-12T23:02:00.003+05:30</published><updated>2009-03-12T23:10:42.099+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-12T23:10:42.099+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="functional programming" /><category scheme="http://www.blogger.com/atom/ns#" term="event" /><title>Bangalore Functional Programming Group is meeting on Saturday, 14th March</title><content type="html">The next &lt;a href="http://groups.google.com/group/bangalore-fp"&gt;bangalore-fp&lt;/a&gt; meetup is scheduled to take place on the 14'th of March at ThoughtWorks.&lt;br /&gt;&lt;br /&gt;Presentations:.&lt;br /&gt;1. Functional Programming 101 by Varoun&lt;br /&gt;2. Dojo Zen aka Web 3D by Tom Elam&lt;br /&gt;&lt;br /&gt;Date/Time: 14-Mar-2009, 2:30 PM - 4:30 PM&lt;br /&gt;&lt;br /&gt;Location: ThoughtWorks Technologies (India) Pvt Ltd.&lt;br /&gt;          2nd Floor, Tower C, Corporate Block, Diamond District&lt;br /&gt;          Airport Road, Bangalore - 560 008, India.&lt;br /&gt;&lt;br /&gt;Directions + map &lt;a href="/2006/11/thoughtworks-is-hosting-barcamp.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-7364338863096087077?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Q-9eBfGquwA:6BZYLzVfM3E:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Q-9eBfGquwA:6BZYLzVfM3E:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Q-9eBfGquwA:6BZYLzVfM3E:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Q-9eBfGquwA:6BZYLzVfM3E:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Q-9eBfGquwA:6BZYLzVfM3E:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Q-9eBfGquwA:6BZYLzVfM3E:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Q-9eBfGquwA:6BZYLzVfM3E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Q-9eBfGquwA:6BZYLzVfM3E:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=Q-9eBfGquwA:6BZYLzVfM3E:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=Q-9eBfGquwA:6BZYLzVfM3E:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/Q-9eBfGquwA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/7364338863096087077/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=7364338863096087077" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/7364338863096087077?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/7364338863096087077?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/03/bangalore-functional-programming-group.html" title="Bangalore Functional Programming Group is meeting on Saturday, 14th March" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Ak8MQ3c8eSp7ImA9WxVVGEU.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-2362634728113445644</id><published>2009-03-08T14:19:00.005+05:30</published><updated>2009-03-13T01:44:42.971+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-13T01:44:42.971+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="metaprogramming" /><title>A simple define_method example</title><content type="html">Someone on #ruby-lang wanted to know how to define a method on a class when the method is first called. Here's a quick example. &lt;code&gt;&lt;/code&gt;&lt;pre&gt;require 'rubygems'&lt;br /&gt;require 'spec'&lt;br /&gt;&lt;br /&gt;module DynamicGetter&lt;br /&gt;  def method_missing(name, *args)&lt;br /&gt;    if(@attributes.has_key? name)&lt;br /&gt;      self.class.class_eval do&lt;br /&gt;       define_method(name){ @attributes[name] }&lt;br /&gt;      end&lt;br /&gt;      self.send(name, *args)&lt;br /&gt;    else&lt;br /&gt;      super&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;describe DynamicGetter do&lt;br /&gt;  before(:each) do&lt;br /&gt;  # Reference the class used in the specs&lt;br /&gt;  # as an ordinary variable rather than a&lt;br /&gt;  # named constant (@ooga instead of Ooga)&lt;br /&gt;  # so that it can be created afresh for&lt;br /&gt;  # each spec.&lt;br /&gt;  # If we did class Ooga, the second spec&lt;br /&gt;  # would fail because the first spec already&lt;br /&gt;  # created the method #woot.&lt;br /&gt;&lt;br /&gt;    @ooga_klass = Class.new(Object)&lt;br /&gt;    @ooga_klass.class_eval do&lt;br /&gt;      include DynamicGetter&lt;br /&gt;&lt;br /&gt;      def initialize(attributes = {})&lt;br /&gt;        @attributes = attributes&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  it "should know how to add a method to a class on first call" do&lt;br /&gt;    o = @ooga_klass.new(:woot =&gt; 5)&lt;br /&gt;    o.should_not respond_to(:woot)&lt;br /&gt;    o.woot.should == 5&lt;br /&gt;    o.should respond_to(:woot)&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  it "should raise a method not found exception if the attribute isn't present" do&lt;br /&gt;    lambda{ @ooga_klass.new.woot }.should raise_error(NoMethodError)&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;Another example is the Rails &lt;code&gt;find_by_*&lt;/code&gt; methods, which are defined the first time you call them.&lt;br /&gt;If, for some reason, you want to apply the example I've given on a per-instance basis, look at &lt;a href="http://www.blogger.com/2008/04/consistent-interfaces-contrived.html"&gt;this post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Related posts:&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://blog.sidu.in/2007/11/ruby-blocks-gotchas.html"&gt;Ruby blocks gotchas &lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://blog.sidu.in/2008/02/loading-classes-from-strings-in-ruby.html"&gt;Loading classes from strings in Ruby &lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://blog.sidu.in/2007/12/rubys-new-as-factory.html"&gt;Ruby's new as a factory &lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://blog.sidu.in/2007/12/rubys-methodadded.html"&gt;Ruby's method_added object lifcycle hook&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.sidu.in/2008/04/consistent-interfaces-contrived.html"&gt;&lt;span style="font-size:85%;"&gt;Consistent interfaces, contrived examples and define_method for instances&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-2362634728113445644?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=t-oGzVnNwOQ:g5I2my52KpE:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=t-oGzVnNwOQ:g5I2my52KpE:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=t-oGzVnNwOQ:g5I2my52KpE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=t-oGzVnNwOQ:g5I2my52KpE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=t-oGzVnNwOQ:g5I2my52KpE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=t-oGzVnNwOQ:g5I2my52KpE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=t-oGzVnNwOQ:g5I2my52KpE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=t-oGzVnNwOQ:g5I2my52KpE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=t-oGzVnNwOQ:g5I2my52KpE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=t-oGzVnNwOQ:g5I2my52KpE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/t-oGzVnNwOQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/2362634728113445644/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=2362634728113445644" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/2362634728113445644?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/2362634728113445644?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/03/simple-definemethod-example.html" title="A simple define_method example" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;A0UFRn49eCp7ImA9WxVVFE4.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-6684536881933080558</id><published>2009-03-07T20:44:00.004+05:30</published><updated>2009-03-07T20:50:17.060+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-07T20:50:17.060+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="jruby" /><title>JRuby symlinks</title><content type="html">If you plan on building running JRuby from source, then here are a few useful symlinks to get things set up. Remember to change the paths to suit.&lt;code&gt;&lt;/code&gt;&lt;pre&gt;ln -s ~/Work/ruby/jruby/bin/jruby /usr/bin/jruby&lt;br /&gt;ln -s ~/Work/ruby/jruby/bin/jirb /usr/bin/jirb&lt;br /&gt;ln -s ~/Work/ruby/jruby/bin/jgem /usr/bin/jgem&lt;br /&gt;ln -s ~/Work/ruby/jruby/bin/jirb_swing /usr/bin/jirb_swing&lt;/pre&gt;Why run JRuby from source? Because it's developed very actively and there is enough happening that I like to do an &lt;code&gt;svn up&lt;/code&gt; every other week, followed by and &lt;code&gt;ant clean&lt;/code&gt; and an &lt;code&gt;ant&lt;/code&gt;. Yes, that is all it takes :). The svn url is &lt;code&gt;http://svn.codehaus.org/jruby/trunk/jruby&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-6684536881933080558?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=yaAj7jyc_0E:YKYK-vqM5Jo:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=yaAj7jyc_0E:YKYK-vqM5Jo:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=yaAj7jyc_0E:YKYK-vqM5Jo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=yaAj7jyc_0E:YKYK-vqM5Jo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=yaAj7jyc_0E:YKYK-vqM5Jo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=yaAj7jyc_0E:YKYK-vqM5Jo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=yaAj7jyc_0E:YKYK-vqM5Jo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=yaAj7jyc_0E:YKYK-vqM5Jo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=yaAj7jyc_0E:YKYK-vqM5Jo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=yaAj7jyc_0E:YKYK-vqM5Jo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/yaAj7jyc_0E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/6684536881933080558/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=6684536881933080558" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/6684536881933080558?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/6684536881933080558?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/03/jruby-symlinks.html" title="JRuby symlinks" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CEEGRn85fSp7ImA9WxVWFko.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-2561197697214383071</id><published>2009-02-26T23:06:00.006+05:30</published><updated>2009-02-26T23:53:47.125+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-26T23:53:47.125+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="book review verdict:read" /><title>Book Review: The Left Hand of Darkness</title><content type="html">Title: &lt;a href="http://www.amazon.com/gp/product/0441007317?ie=UTF8&amp;tag=workatthedini-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0441007317"&gt;The Left Hand of Darkness&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=workatthedini-20&amp;l=as2&amp;o=1&amp;a=0441007317" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;Author: Ursula K LeGuin&lt;br /&gt;Genre: Science Fiction&lt;br /&gt;Verdict: Read&lt;br /&gt;Started: 2009-02-24&lt;br /&gt;Finished: 2009-02-25&lt;br /&gt;&lt;br /&gt;'&lt;a href="http://www.amazon.com/gp/product/0441007317?ie=UTF8&amp;tag=workatthedini-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0441007317"&gt;The Left Hand of Darkness&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=workatthedini-20&amp;l=as2&amp;o=1&amp;a=0441007317" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;' came highly recommended by several friends; the cover had no less a personage than Michael Moorcock comparing it to '&lt;a href="http://www.amazon.com/gp/product/0618517650?ie=UTF8&amp;tag=workatthedini-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0618517650"&gt;The Lord of the Rings&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=workatthedini-20&amp;l=as2&amp;o=1&amp;a=0618517650" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;.' I certainly enjoyed reading this book; it wasn't something that made a huge impression (like, say, '&lt;a href="http://www.amazon.com/gp/product/0345459407?ie=UTF8&amp;tag=workatthedini-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=0345459407"&gt;Perdido Street Station&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=workatthedini-20&amp;l=as2&amp;o=1&amp;a=0345459407" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;' did), but it's a charming tale in it's own quiet, subtle way. I must admit this is the first time I'm reading Ursula LeGuin, so I didn't get the few references to previous books in the series. It can however be read an an independent novel without spoiling the experience.&lt;br /&gt;&lt;br /&gt;The narrative is almost entirely in the first person with very few exceptions; the texture of the narrative is crisp and not given to, for the lack of a better adjective, loudness. This book deals mostly with society and the way it shaped by the sexuality of its members. It also deals with religion to some small extent; I must say I found the philosophy of the Handdara extremely fascinating.&lt;br /&gt;&lt;br /&gt;This is very much a 'What if?' book in the same vein as '&lt;a href="http://www.amazon.com/gp/product/1563899809?ie=UTF8&amp;amp;tag=workatthedini-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1563899809"&gt;Y: The Last Man&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=workatthedini-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1563899809" alt="" style="border: medium none  ! important; margin: 0px ! important;" border="0" height="1" width="1" /&gt;' - except that instead of all the men vanishing we have a society of human hermaphrodites who take on one gender or the other just for a day or two during every sexual cycle. LeGuin speculates about the kind of society which would evolve if humanity's established pattern of male-female behaviour is replaced by one where every human is truly equal in terms of both social roles and expectations, especially child-bearing. The book is set on a harsh, difficult planet in the middle of an Ice age, and is narrated from the perspective of an outsider, an envoy to one of the nations there.&lt;br /&gt;&lt;br /&gt;This is a gentle, thoughtful book and I recommend it without reservation.&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=workatthedini-20&amp;amp;o=1&amp;amp;p=8&amp;amp;l=as1&amp;amp;asins=0441007317&amp;amp;fc1=000000&amp;amp;IS2=1&amp;amp;lt1=_blank&amp;amp;m=amazon&amp;amp;lc1=0000FF&amp;amp;bc1=000000&amp;amp;bg1=FFFFFF&amp;amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-2561197697214383071?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=M44B3OumUi8:72-SUV8-en0:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=M44B3OumUi8:72-SUV8-en0:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=M44B3OumUi8:72-SUV8-en0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=M44B3OumUi8:72-SUV8-en0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=M44B3OumUi8:72-SUV8-en0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=M44B3OumUi8:72-SUV8-en0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=M44B3OumUi8:72-SUV8-en0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=M44B3OumUi8:72-SUV8-en0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=M44B3OumUi8:72-SUV8-en0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=M44B3OumUi8:72-SUV8-en0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/M44B3OumUi8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/2561197697214383071/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=2561197697214383071" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/2561197697214383071?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/2561197697214383071?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/02/book-review-left-hand-of-darkness.html" title="Book Review: The Left Hand of Darkness" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;Ak8FQ3k7eSp7ImA9WxVQFUQ.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-2985094989725301292</id><published>2009-02-02T23:36:00.004+05:30</published><updated>2009-02-02T23:50:12.701+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-02T23:50:12.701+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><title>Project White makes it to #6 on CodePlex</title><content type="html">&lt;a href="http://www.jroller.com/viveksingh123/"&gt;Vivek Singh's&lt;/a&gt; automated functional testing tool &lt;a href="http://www.codeplex.com/white"&gt;White&lt;/a&gt; has &lt;a href="http://blogs.msdn.com/codeplex/archive/2009/01/26/codeplex-2008-a-year-in-review.aspx"&gt;made it to #6&lt;/a&gt; in the list of top projects (by page view count) hosted at CodePlex for 2008.&lt;br /&gt;&lt;br /&gt;White allows the automation of Windows applications and so ends up being an excellent choice for the functional testing of thick clients. If you're building a Win32, WinForms, WPF or SWT based application and need automated testing, you should give White a shot.&lt;br /&gt;&lt;br /&gt;Vivek is also on the lookout for folks interested in contributing to the project. If you're once of them, you should consider submitting a patch or three to get started.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-2985094989725301292?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=xU0Wbp3rXCk:xMyMpuvmJcU:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=xU0Wbp3rXCk:xMyMpuvmJcU:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=xU0Wbp3rXCk:xMyMpuvmJcU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=xU0Wbp3rXCk:xMyMpuvmJcU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=xU0Wbp3rXCk:xMyMpuvmJcU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=xU0Wbp3rXCk:xMyMpuvmJcU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=xU0Wbp3rXCk:xMyMpuvmJcU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=xU0Wbp3rXCk:xMyMpuvmJcU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=xU0Wbp3rXCk:xMyMpuvmJcU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=xU0Wbp3rXCk:xMyMpuvmJcU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/xU0Wbp3rXCk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/2985094989725301292/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=2985094989725301292" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/2985094989725301292?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/2985094989725301292?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/02/project-white-makes-it-to-6-on-codeplex.html" title="Project White makes it to #6 on CodePlex" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CkQCQ3g9fSp7ImA9WxVQEkk.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-5008218218505378764</id><published>2009-01-29T19:45:00.005+05:30</published><updated>2009-01-29T20:16:02.665+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-29T20:16:02.665+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="osx" /><title>Locking your Mac with a keyboard shortcut</title><content type="html">This is one feature that isn't directly supported by the otherwise extremely usable OS X.&lt;br /&gt;There are a bunch of ways to do this most involving starting the screen-saver, either though hot corners or via &lt;a href="http://www.blacktree.com/"&gt;QuickSilver&lt;/a&gt; triggers. However, I'm not very happy with starting the screen-saver to lock the screen, so I found the shell command for fast user switching and use that instead. Here's the script:&lt;pre&gt;&lt;code&gt;# lock.sh&lt;br /&gt;/System/Library/CoreServices/"Menu Extras"/User.menu/Contents/Resources/CGSession -suspend&lt;/code&gt;&lt;/pre&gt;You can execute this script (remember to &lt;code&gt;chmod u+x&lt;/code&gt; it first) via a keyboard shortcut by using &lt;a href="http://www.blacktree.com/"&gt;QuickSilver&lt;/a&gt; triggers. Since it's easier to explain with screenshots, that's what I've done. Just remember that when you're selecting an item (shown in the last image), you need to hit '.' to clear the field so you can type in the path to your copy of &lt;code&gt;lock.sh&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ABLwpl_AaVo/SYG_qpsUlGI/AAAAAAAAAI0/qAePpz2V934/s1600-h/quicksilver-triggers.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 259px;" src="http://2.bp.blogspot.com/_ABLwpl_AaVo/SYG_qpsUlGI/AAAAAAAAAI0/qAePpz2V934/s400/quicksilver-triggers.png" alt="" id="BLOGGER_PHOTO_ID_5296725376231576674" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_ABLwpl_AaVo/SYG_xqTGbhI/AAAAAAAAAI8/O9MHBcHkC1o/s1600-h/quicksilver-triggers-hotkeys.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 335px;" src="http://4.bp.blogspot.com/_ABLwpl_AaVo/SYG_xqTGbhI/AAAAAAAAAI8/O9MHBcHkC1o/s400/quicksilver-triggers-hotkeys.png" alt="" id="BLOGGER_PHOTO_ID_5296725496653311506" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_ABLwpl_AaVo/SYG_8F_X7lI/AAAAAAAAAJE/6TRFJGIBz9Y/s1600-h/quicksilver-triggers-config.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 207px;" src="http://3.bp.blogspot.com/_ABLwpl_AaVo/SYG_8F_X7lI/AAAAAAAAAJE/6TRFJGIBz9Y/s400/quicksilver-triggers-config.png" alt="" id="BLOGGER_PHOTO_ID_5296725675885456978" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-5008218218505378764?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=NzW96AhsD9A:G2wReUdE37I:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=NzW96AhsD9A:G2wReUdE37I:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=NzW96AhsD9A:G2wReUdE37I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=NzW96AhsD9A:G2wReUdE37I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=NzW96AhsD9A:G2wReUdE37I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=NzW96AhsD9A:G2wReUdE37I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=NzW96AhsD9A:G2wReUdE37I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=NzW96AhsD9A:G2wReUdE37I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=NzW96AhsD9A:G2wReUdE37I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=NzW96AhsD9A:G2wReUdE37I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/NzW96AhsD9A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/5008218218505378764/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=5008218218505378764" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/5008218218505378764?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/5008218218505378764?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/01/locking-your-mac-with-keyboard-shortcut.html" title="Locking your Mac with a keyboard shortcut" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_ABLwpl_AaVo/SYG_qpsUlGI/AAAAAAAAAI0/qAePpz2V934/s72-c/quicksilver-triggers.png" height="72" width="72" /><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;AkUESHgyfSp7ImA9WxVQEk4.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-4303934119526675207</id><published>2009-01-29T19:31:00.005+05:30</published><updated>2009-01-29T19:40:09.695+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-29T19:40:09.695+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="functional programming" /><category scheme="http://www.blogger.com/atom/ns#" term="event" /><title>Bangalore functional programming group is meeting on the 31st</title><content type="html">This months meet is on the 31st of January at 3:00 PM.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Details:&lt;/span&gt;&lt;br /&gt;Speaker: Thomas Andrew Elam:&lt;br /&gt;Subject: 'A Scheme interpreter inside every modern web browser; and applications for it' (This will be the first of his two episode 'blockbuster' presentation!)&lt;br /&gt;&lt;br /&gt;Date/Time: 31-Jan-2009, 3:00 PM - 4:00 PM&lt;br /&gt;&lt;br /&gt;Location: ThoughtWorks Technologies (India) Pvt Ltd.&lt;br /&gt;          2nd Floor, Tower C, Corporate Block, Diamond District view map&lt;br /&gt;          Airport Road, Bangalore - 560 008, India.&lt;br /&gt;&lt;br /&gt;Please confirm your attendance  by mail on the &lt;a href="http://groups.google.com/group/bangalore-fp"&gt;Bangalore FP list&lt;/a&gt; so that we have a rough estimate of the attendance. This will help us to arrange seating, refreshments etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-4303934119526675207?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=L6h53rOzLxE:eaAGgwDH7t0:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=L6h53rOzLxE:eaAGgwDH7t0:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=L6h53rOzLxE:eaAGgwDH7t0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=L6h53rOzLxE:eaAGgwDH7t0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=L6h53rOzLxE:eaAGgwDH7t0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=L6h53rOzLxE:eaAGgwDH7t0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=L6h53rOzLxE:eaAGgwDH7t0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=L6h53rOzLxE:eaAGgwDH7t0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=L6h53rOzLxE:eaAGgwDH7t0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=L6h53rOzLxE:eaAGgwDH7t0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/L6h53rOzLxE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/4303934119526675207/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=4303934119526675207" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4303934119526675207?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/4303934119526675207?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/01/bangalore-functional-programming-group.html" title="Bangalore functional programming group is meeting on the 31st" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DkAMQXo5cCp7ImA9WxVTGEo.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-6061243610499759124</id><published>2009-01-02T10:38:00.006+05:30</published><updated>2009-01-02T11:09:40.428+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-02T11:09:40.428+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><category scheme="http://www.blogger.com/atom/ns#" term="mongrel" /><title>Catching relative url issues in rails early with --prefix</title><content type="html">When developing in Rails, we use &lt;code&gt;script/server&lt;/code&gt; to run the app, which makes the application available at &lt;code&gt;http://localhost:someport&lt;/code&gt;. Later, in production it's usually &lt;code&gt;somedomain.com/&lt;/code&gt;. In both cases, the application is mounted at the root of the domain, which means links beginning with &lt;code&gt;/&lt;/code&gt; (like say &lt;code&gt;&amp;lt;a href='/users'&amp;gt;Users&amp;lt;/a&amp;gt;&lt;/code&gt;) which were inadvertently introduced will &lt;span style="font-style: italic;"&gt;never&lt;/span&gt; break. Then, when someone then deploys your application to a non-root url like &lt;code&gt;mydomain.com/myapp&lt;/code&gt; all hell breaks loose and you have a bunch of broken links.&lt;br /&gt;&lt;br /&gt;As a preventive measure, it's wiser to both develop and run automated functional test suites (like a &lt;a href="http://en.wikipedia.org/wiki/Selenium_(software)"&gt;Selenium&lt;/a&gt; suite) with your application running on a non-root url. That way relative url bugs are caught early enough that nothing significant is affected.&lt;br /&gt;&lt;br /&gt;Some ruby servers do indeed support this kind of mounting - but not all, I presume, so &lt;code&gt;script/server&lt;/code&gt; does not support it. However, the popular &lt;a href="http://mongrel.rubyforge.org/"&gt;mongrel&lt;/a&gt; server does allow this through the &lt;code&gt;--prefix&lt;/code&gt; option. We've modified &lt;code&gt;script/server&lt;/code&gt; to a more narrow &lt;code&gt;script/mongrel&lt;/code&gt; which accepts the &lt;code&gt;--prefix&lt;/code&gt; option and always uses mongrel. &lt;code&gt;script/mongrel&lt;/code&gt; otherwise behaves like &lt;code&gt;script/server&lt;/code&gt; in every respect.&lt;br /&gt;&lt;br /&gt;Try it out - you can get it off GitHub from the &lt;a href="http://github.com/niranjan/script-mongrel/tree/master"&gt;script-mongrel&lt;/a&gt; project. If you're on Windows (or otherwise don't have git), don't worry - it's a single file plus the README. You can simply copy them off the repo browser.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-6061243610499759124?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=8rKftzifWHQ:jAg3SeUT57A:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=8rKftzifWHQ:jAg3SeUT57A:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=8rKftzifWHQ:jAg3SeUT57A:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=8rKftzifWHQ:jAg3SeUT57A:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=8rKftzifWHQ:jAg3SeUT57A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=8rKftzifWHQ:jAg3SeUT57A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=8rKftzifWHQ:jAg3SeUT57A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=8rKftzifWHQ:jAg3SeUT57A:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=8rKftzifWHQ:jAg3SeUT57A:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=8rKftzifWHQ:jAg3SeUT57A:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/8rKftzifWHQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/6061243610499759124/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=6061243610499759124" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/6061243610499759124?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/6061243610499759124?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2009/01/catching-relative-url-issues-in-rails.html" title="Catching relative url issues in rails early with --prefix" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;D0cFSHw8eSp7ImA9WxVVFU0.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-1933726309575445504</id><published>2008-12-18T09:32:00.004+05:30</published><updated>2009-03-08T15:06:59.271+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-08T15:06:59.271+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="event" /><category scheme="http://www.blogger.com/atom/ns#" term="brug" /><title>BRUG meeting on Saturday, 20th December</title><content type="html">The &lt;a href="http://groups.google.com/group/bangalorerug"&gt;Bangalore Ruby User Group&lt;/a&gt; will be meeting up this Saturday at 4pm. There is no set agenda; the meeting is divided into two halves, with members talking about something they've worked on recently in the first half and an open Q &amp;amp; A session in the second where folks can pick each others brains about all things Ruby.&lt;br /&gt;&lt;br /&gt;The first half will be quick, ten minute sessions. If you're planning to participate, please remember that a full-fledged presentation with slides is nice, but not necessary.&lt;br /&gt;&lt;br /&gt;I'm planning to talk about some of the smells and pitfalls someone new to Ruby should watch out for when contributing to a codebase.&lt;br /&gt;&lt;br /&gt;If you're interested in attending, please let us know by sending a mail to the &lt;a href="http://groups.google.com/group/bangalorerug"&gt;list&lt;/a&gt; so that we have a rough idea of how many folks will be participating.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Details&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Date:&lt;/span&gt; Saturday, 20th December&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Time:&lt;/span&gt; 4:00pm to 5:30pm&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Venue:&lt;/span&gt;&lt;br /&gt;ThoughtWorks,&lt;br /&gt;2nd Floor, Tower C,&lt;br /&gt;Corporate Block, Diamond District,&lt;br /&gt;Airport Road, Bangalore.&lt;br /&gt;&lt;a href="/2006/11/thoughtworks-is-hosting-barcamp.html"&gt;&lt;span style="font-size:85%;"&gt;Directions, Map and Parking&lt;/span&gt;&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-1933726309575445504?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=tohfsxTy_KY:DMC6F_2KF2c:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=tohfsxTy_KY:DMC6F_2KF2c:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=tohfsxTy_KY:DMC6F_2KF2c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=tohfsxTy_KY:DMC6F_2KF2c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=tohfsxTy_KY:DMC6F_2KF2c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=tohfsxTy_KY:DMC6F_2KF2c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=tohfsxTy_KY:DMC6F_2KF2c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=tohfsxTy_KY:DMC6F_2KF2c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=tohfsxTy_KY:DMC6F_2KF2c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=tohfsxTy_KY:DMC6F_2KF2c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/tohfsxTy_KY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/1933726309575445504/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=1933726309575445504" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/1933726309575445504?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/1933726309575445504?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2008/12/brug-meeting-on-saturday-20th-december.html" title="BRUG meeting on Saturday, 20th December" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkYGRX4_eip7ImA9WxRUE0g.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-3722179675782880793</id><published>2008-11-22T15:50:00.000+05:30</published><updated>2008-11-22T16:05:24.042+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-22T16:05:24.042+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="osx" /><title>British English spellings for Dictionary.app</title><content type="html">Dictionary.app has criticised my spelling of 'criticise' for the last time. This most &lt;a href="http://davidtse916.wordpress.com/2008/01/24/adding-dictionaries-to-the-built-in-dictionary-application-in-leopard/"&gt;excellent article&lt;/a&gt; has allowed me to add more &lt;a href="http://stardict.sourceforge.net/Dictionaries_dictd-www.dict.org.php"&gt;dictionaries&lt;/a&gt; which spell the way I do and get rid of the old ones. Not trivial, but worth the effort.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-3722179675782880793?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=IYqivqIOC1Y:ShKE54HjJVA:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=IYqivqIOC1Y:ShKE54HjJVA:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=IYqivqIOC1Y:ShKE54HjJVA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=IYqivqIOC1Y:ShKE54HjJVA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=IYqivqIOC1Y:ShKE54HjJVA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=IYqivqIOC1Y:ShKE54HjJVA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=IYqivqIOC1Y:ShKE54HjJVA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=IYqivqIOC1Y:ShKE54HjJVA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=IYqivqIOC1Y:ShKE54HjJVA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=IYqivqIOC1Y:ShKE54HjJVA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/IYqivqIOC1Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/3722179675782880793/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=3722179675782880793" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/3722179675782880793?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/3722179675782880793?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2008/11/british-english-spellings-for.html" title="British English spellings for Dictionary.app" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;DUMERX0yfCp7ImA9WxRUE0k.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-5483216128799325329</id><published>2008-11-22T14:54:00.001+05:30</published><updated>2008-11-22T15:20:04.394+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-22T15:20:04.394+05:30</app:edited><title>Avoid the refrigerated stuff at FoodWorld</title><content type="html">A word of advice to shoppers - don't buy foodstuff that require refrigeration from a &lt;a href="http://www.food-world.com/main/index.asp"&gt;FoodWorld&lt;/a&gt; outlet. &lt;br /&gt;&lt;br /&gt;There is a reasonable chance with such items that power outages would have made them go bad, so you need to shop at a store with a sensible exchange policy for such products. If a store insists on you producing a bill, then you're in trouble, because who preserves two hundred rupee bills for Chocos, chips and srikhand?&lt;br /&gt;&lt;br /&gt;The reason I bring this up is because I've just been dinged for the (luckily not-so-huge) sum of Rs. 56 over a carton of &lt;a href="http://www.amul.com/desserts-shrikhand.html"&gt;Amul Srikhand&lt;/a&gt; which requires storage at zero degrees Celsius; I bought a couple of cartons on Thursday night at a FoodWorld, opened one on Friday and found it had gone quite manky (the other was fine). FoodWorld insists on bills to prove stuff and refuses to look up their billing database (I payed by card, so it can't be difficult) in the event that the bill is no longer available. The manager at the 100ft Road FoodWorld, a Mr. Gupta, told me he' be in a deep trouble if he took the Srikhand back without a bill - in fact, he'd have to pay for it himself.&lt;br /&gt;&lt;br /&gt;Oh well, perhaps I'll find the bill in the pocket of the jeans I was wearing that night. Whether I find it or not, I'm not going to shop at a store which would rather screw it's customers and employees over rather than fix its processes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-5483216128799325329?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=N5rt8TSNecM:Gs4mTxweWhc:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=N5rt8TSNecM:Gs4mTxweWhc:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=N5rt8TSNecM:Gs4mTxweWhc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=N5rt8TSNecM:Gs4mTxweWhc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=N5rt8TSNecM:Gs4mTxweWhc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=N5rt8TSNecM:Gs4mTxweWhc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=N5rt8TSNecM:Gs4mTxweWhc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=N5rt8TSNecM:Gs4mTxweWhc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=N5rt8TSNecM:Gs4mTxweWhc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=N5rt8TSNecM:Gs4mTxweWhc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/N5rt8TSNecM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/5483216128799325329/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=5483216128799325329" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/5483216128799325329?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/5483216128799325329?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2008/11/avoid-refrigerated-stuff-at-foodworld.html" title="Avoid the refrigerated stuff at FoodWorld" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DUAAQXo6cCp7ImA9WxRUEEw.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-1550031790950499751</id><published>2008-11-18T19:22:00.001+05:30</published><updated>2008-11-18T19:45:40.418+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-18T19:45:40.418+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="howto" /><category scheme="http://www.blogger.com/atom/ns#" term="rails" /><title>Don't misplace your p()s</title><content type="html">Every so often, someone forgets to remove &lt;code&gt;p()&lt;/code&gt; statements from their &lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt; &lt;a href="http://rspec.info/"&gt;specs&lt;/a&gt; and then checks in. Figuring out where those &lt;code&gt;p()&lt;/code&gt;s are afterward is a pain in the neck. &lt;br /&gt;&lt;br /&gt;Here's a simple solution: the whiny p.&lt;code&gt;&lt;pre&gt;def p(*args)&lt;br /&gt;  super *(args &lt;&lt; caller[0])&lt;br /&gt;end&lt;/pre&gt;&lt;/code&gt;Drop this little snippet into your &lt;code&gt;spec_helper.rb&lt;/code&gt; or &lt;code&gt;test_helper.rb&lt;/code&gt; and all your &lt;code&gt;p()&lt;/code&gt; statements will also print the line number from which they are invoked. Pretty cool, what?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-1550031790950499751?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=cHfzDx6mpvg:Dd3jcO_vWlk:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=cHfzDx6mpvg:Dd3jcO_vWlk:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=cHfzDx6mpvg:Dd3jcO_vWlk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=cHfzDx6mpvg:Dd3jcO_vWlk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=cHfzDx6mpvg:Dd3jcO_vWlk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=cHfzDx6mpvg:Dd3jcO_vWlk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=cHfzDx6mpvg:Dd3jcO_vWlk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=cHfzDx6mpvg:Dd3jcO_vWlk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=cHfzDx6mpvg:Dd3jcO_vWlk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=cHfzDx6mpvg:Dd3jcO_vWlk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/cHfzDx6mpvg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/1550031790950499751/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=1550031790950499751" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/1550031790950499751?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/1550031790950499751?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2008/11/dont-misplace-your-ps.html" title="Don't misplace your p()s" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0cBQ3s6cCp7ImA9WxVVFU0.&quot;"><id>tag:blogger.com,1999:blog-3718956085911858962.post-2688999419574175308</id><published>2008-11-11T02:56:00.003+05:30</published><updated>2009-03-08T15:07:32.518+05:30</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-08T15:07:32.518+05:30</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="noob" /><category scheme="http://www.blogger.com/atom/ns#" term="darkness" /><title>Collections, each and the violation of encapsulation</title><content type="html">Every so often I come across a bit of code which looks something like this:&lt;code&gt;&lt;pre&gt;def upcase_collection(collection)&lt;br /&gt; array = []&lt;br /&gt; collection.each{|item| array &lt;&lt; item.upcase}&lt;br /&gt; array&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt; &lt;br /&gt;Yeah, I know you language punters are looking at this and going 'yech'; but folks new to blocks and used to &lt;code&gt;for&lt;/code&gt; loops aren't likely see the problem.&lt;br /&gt;&lt;br /&gt;Here's the deal: when using blocks with collections in Ruby, always respect the sanctity of a block passed to a collection. Never misuse the closure created with the block to manipulate objects outside the scope of the block - in this example using &lt;code&gt;array&lt;/code&gt; as an accumulator. There are always better ways to do this without violating encapsulation, the other collection methods available in &lt;a href="http://ruby-doc.org/core/classes/Enumerable.html"&gt;Enumerable&lt;/a&gt; being a case in point.&lt;br /&gt;&lt;br /&gt;There are a couple of smells you always come across in such situations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The presence of objects whose states are changed from within a block in a different scope&lt;/li&gt;&lt;li&gt;The fact that you need a temporary variable at all in the first place&lt;/li&gt;&lt;li&gt;The availability of methods like &lt;code&gt;collect&lt;/code&gt;, &lt;code&gt;partition&lt;/code&gt; or &lt;code&gt;inject&lt;/code&gt; which do exactly what you need - for free.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The (trivial) example I've given would be better solved using &lt;code&gt;collect&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3718956085911858962-2688999419574175308?l=blog.sidu.in' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=FgE0OjY3c1I:FkHAHwcogNw:mtsM-81NTLw"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=mtsM-81NTLw" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=FgE0OjY3c1I:FkHAHwcogNw:cGdyc7Q-1BI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=cGdyc7Q-1BI" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=FgE0OjY3c1I:FkHAHwcogNw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=FgE0OjY3c1I:FkHAHwcogNw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=FgE0OjY3c1I:FkHAHwcogNw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=FgE0OjY3c1I:FkHAHwcogNw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=FgE0OjY3c1I:FkHAHwcogNw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=FgE0OjY3c1I:FkHAHwcogNw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.sidu.in/~ff/diningtablecoder?a=FgE0OjY3c1I:FkHAHwcogNw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/diningtablecoder?i=FgE0OjY3c1I:FkHAHwcogNw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/diningtablecoder/~4/FgE0OjY3c1I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.sidu.in/feeds/2688999419574175308/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=3718956085911858962&amp;postID=2688999419574175308" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/2688999419574175308?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3718956085911858962/posts/default/2688999419574175308?v=2" /><link rel="alternate" type="text/html" href="http://blog.sidu.in/2008/11/collections-each-and-violation-of.html" title="Collections, each and the violation of encapsulation" /><author><name>Sidu</name><uri>http://www.blogger.com/profile/11938300811286150164</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17880039954856882313" /></author><thr:total>2</thr:total></entry></feed>
