<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4668750628274566893</id><updated>2012-02-16T03:32:20.848-08:00</updated><title type='text'>Bhushan's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-8874617816837717427</id><published>2007-09-03T22:36:00.000-07:00</published><updated>2007-09-03T22:37:20.220-07:00</updated><title type='text'>कम्प्यूटर पर संदेश टंकित करें, नोकिया फोन से भेज</title><content type='html'>&lt;div class="post-header-line-1"&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;    &lt;div class="post-body entry-content"&gt;&lt;br /&gt;      &lt;p&gt;&lt;a href="http://photos1.blogger.com/blogger/2299/444/1600/hindi%20SMS.jpg"&gt;&lt;img style="margin: 0px 10px 10px 0px; float: left;" alt="" src="http://photos1.blogger.com/blogger/2299/444/320/hindi%20SMS.jpg" border="0"&gt;&lt;/a&gt; भारतीय भाषाओं में एस एम एस भेजना एक दुष्कर कार्य प्रतीत होता है। पर कुछ सुविधाएँ हैं जिसका प्रयोग करके आप इसका भी मजा ले सकते हैं। यदि आप नोकिया का फोन प्रयोग करते हैं तो यह काफी हद तक संभव है।ज्यादातर फोन निर्माता फोन खरीदते समय एक सी डी देते हैं जिसमे आपके कम्प्यूटर के लिए एक साफ्टवेयर होता है। यह साफ्टवेयर आपके फोन पर संगीत, फोटो आदि भेजने के लिए प्रयुक्त किया जाता है। आमतौर पर, आप इस साफ्टवेयर की मदद से फोन और कम्प्यूटर पर आपके दोस्त-परिचितों के नम्बर भी सीधे स्थानांतरित कर सकेंगे। इसके लिए फोन और कम्प्यूटर एक तार के माध्यम से, अथवा ब्लू टूथ या इन्फ्रा रेड पोर्ट के द्वारा जोड़े जाते हैं। नोकिया भी एक ऐसा ही साफ्टवेयर सी डी पर देती है जिसे पी सी सूट कहते हैं। पर एक महत्वपूर्ण सुविधा के साथ- इस साफ्टवेयर के माध्यम से आप अपना एस एम एस संदेश पी सी पर ही टंकित कर सकते है।&lt;br&gt;साथ लगे चित्र को देखिए। मैने रमण भाई के &lt;a href="http://uninagari.kaulonline.com/"&gt;युनिनागरी टंकन पटल&lt;/a&gt; पर अपने संदेश तैयार करके यहाँ चिपका दिया है। फिर यही से अपने दोस्त का नाम दिया, तो साफ्टवेयर ने उनका नम्बर मेरे फोन से स्वयं ही समझ लिया। फिर वहीं से प्रेषण का बटन दबा के संदेश को रवाना कर दिया। यह काफी आसान प्रक्रिया है।कुछ बातों का ध्यान रखना जरूरी है। नोकिया के ज्यादातर अच्छे फोन पी सी सूट समर्थित हैं। (मैं एक पिटा हुआ ६६१० प्रयोग करता हूँ)। पर अच्छा होगा यदि आप पी सी सूट का नया वर्जन नोकिया के अंतरस्थल (&lt;a href="http://www.nokiausa.com/support/pcsuite/main.html"&gt;यहाँ&lt;/a&gt;) से लें। यह तकरीबन २५ एम बी का है। ये भी ध्यान रखें कि कभी-कभी अक्षर बिखर जाते है। यदि पाने वाले का फोन नोकिया नहीं है, तो सब कुछ कचरा हो जाता है। फिर भी,  'कुछ नहीं से बेहतर कुछ भी' वाली बात होती है। दूसरी बात, सदेंश शायद छोटे लगें, पर अंग्रेजी से ज्यादा बाइट्स लेते प्रतीत होते हैं। यह पी सी सूट बिना आज्ञा के ही इसे दो या अधिक टुकड़ो में बाँट देता है। यदि ऐसा हुआ, तो उतने एस एम एस के पैसे भी लगेंगे।कुल मिला कर मेरा अनुभव संतोषप्रद है, पर यह और अच्छा हो सकता है। खासकर जब कि पाने वाले के फोन के निर्माता (ब्राण्ड) की जानकारी का अभाव हो तो ऐसी अवस्था का क्या निवारण है। यदि आप के कुछ दुसरे अनुभव हैं, तो आप भी बाँटे।&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-8874617816837717427?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/8874617816837717427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=8874617816837717427' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/8874617816837717427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/8874617816837717427'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/09/blog-post.html' title='कम्प्यूटर पर संदेश टंकित करें, नोकिया फोन से भेज'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-6382770751846382435</id><published>2007-09-03T06:10:00.000-07:00</published><updated>2007-09-03T06:11:08.445-07:00</updated><title type='text'>DRY RAILS database.yml config file</title><content type='html'>&lt;div class="post-body"&gt;From http://blog.bleything.net/articles/2006/06/27/dry-out-your-database-yml:&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;span class="ident"&gt;login&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;login&lt;/span&gt;&lt;br /&gt;  &lt;span class="ident"&gt;adapter&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;mysql&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="ident"&gt;username&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;username&lt;/span&gt;&lt;br /&gt;  &lt;span class="ident"&gt;password&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;password&lt;/span&gt;&lt;br /&gt;  &lt;span class="ident"&gt;host&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;mysql&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;example&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;com&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;development&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;span class="punct"&gt;&amp;lt;&amp;lt;:&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;login&lt;/span&gt;&lt;br /&gt;  &lt;span class="ident"&gt;database&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;app_dev&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;test&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;&lt;br /&gt;  &lt;span class="punct"&gt;&amp;lt;&amp;lt;:&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;login&lt;/span&gt;&lt;br /&gt;  &lt;span class="ident"&gt;database&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;app_test&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;production&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="punct"&gt;&amp;lt;&amp;lt;:&lt;/span&gt; &lt;span class="punct"&gt;*&lt;/span&gt;&lt;span class="ident"&gt;login&lt;/span&gt;&lt;br /&gt;  &lt;span class="ident"&gt;database&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="ident"&gt;app_prod&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-6382770751846382435?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/6382770751846382435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=6382770751846382435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/6382770751846382435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/6382770751846382435'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/09/dry-rails-databaseyml-config-file.html' title='DRY RAILS database.yml config file'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-8856650008402136810</id><published>2007-09-03T05:53:00.001-07:00</published><updated>2007-09-03T05:53:51.769-07:00</updated><title type='text'>Improved in_place_select_editor</title><content type='html'>&lt;div class="post-body"&gt;The in_place_select_editor method assumes that you want to display the exact item being edited. That isn't always the case. You might want to display a related attribute. The following modifies in_place_select_editor_field by allowing it to take a display parameter (third parameter), which is then passed to to_content_tag_display (also modified)&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;ApplicationHelper&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;in_place_select_editor&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;field_id&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{})&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="ident"&gt;function&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt;  &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;new Ajax.InPlaceSelectEditor(&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;    &lt;span class="ident"&gt;function&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;'&lt;span class="expr"&gt;#{field_id}&lt;/span&gt;', &lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="ident"&gt;function&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;'&lt;span class="expr"&gt;#{url_for(options[:url])}&lt;/span&gt;'&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;    &lt;span class="ident"&gt;function&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;, &lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;options_for_javascript&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;       &lt;span class="punct"&gt;{&lt;/span&gt;&lt;br /&gt;         &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;selectOptionsHTML&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt;&lt;br /&gt;                &lt;span class="punct"&gt;%(&lt;/span&gt;&lt;span class="string"&gt;'&lt;span class="expr"&gt;#{escape_javascript(options[:select_options].gsub(/\n/, ""))}&lt;/span&gt;'&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;       &lt;span class="punct"&gt;}&lt;/span&gt;&lt;br /&gt;       &lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;    &lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:select_options&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;br /&gt;    &lt;span class="ident"&gt;function&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;)&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="ident"&gt;javascript_tag&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;function&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;in_place_select_editor_field&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;method&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;display&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;tag_options&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{},&lt;/span&gt; &lt;br /&gt;                                   &lt;span class="ident"&gt;in_place_editor_options&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{})&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="ident"&gt;tag&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;ActionView&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Helpers&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;InstanceTag&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;method&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="ident"&gt;tag_options&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="symbol"&gt;:tag&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;span&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt; &lt;br /&gt;                    &lt;span class="symbol"&gt;:id&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{object}&lt;/span&gt;_&lt;span class="expr"&gt;#{method}&lt;/span&gt;_&lt;span class="expr"&gt;#{tag.object.id}&lt;/span&gt;_in_place_editor&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt; &lt;br /&gt;                   &lt;span class="symbol"&gt;:class&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;in_place_editor_field&lt;/span&gt;&lt;span class="punct"&gt;"}.&lt;/span&gt;&lt;span class="ident"&gt;merge!&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;tag_options&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="ident"&gt;in_place_editor_options&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:url&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;br /&gt;       &lt;span class="ident"&gt;in_place_editor_options&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:url&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;||&lt;/span&gt; &lt;br /&gt;       &lt;span class="ident"&gt;url_for&lt;/span&gt;&lt;span class="punct"&gt;({&lt;/span&gt; &lt;span class="symbol"&gt;:action&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;set_&lt;span class="expr"&gt;#{object}&lt;/span&gt;_&lt;span class="expr"&gt;#{method}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt; &lt;span class="symbol"&gt;:id&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;tag&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;object&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;id&lt;/span&gt; &lt;span class="punct"&gt;})&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="ident"&gt;tag&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_content_tag_display&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;tag_options&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;delete&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:tag&lt;/span&gt;&lt;span class="punct"&gt;),&lt;/span&gt; &lt;span class="ident"&gt;display&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;tag_options&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="ident"&gt;in_place_select_editor&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;tag_options&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:id&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt; &lt;span class="ident"&gt;in_place_editor_options&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;ActionView&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;Helpers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;InstanceTag&lt;/span&gt; &lt;span class="comment"&gt;#:nodoc:&lt;/span&gt;&lt;br /&gt;      &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="constant"&gt;Helpers&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;TagHelper&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;to_content_tag_display&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;tag_name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;display&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{})&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="ident"&gt;content_tag&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;tag_name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;display&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;      &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;      &lt;br /&gt;    &lt;span class="keyword"&gt;end&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;This permits (example), where Job.vendor_name(@job) (a custom method) is displayed.&lt;br&gt;&lt;br&gt;&lt;pre&gt;            &lt;span class="punct"&gt;&amp;lt;%=&lt;/span&gt;&lt;span class="string"&gt; in_place_select_editor_field(&lt;br /&gt;             :job,&lt;br /&gt;             :vendor_id,&lt;br /&gt;             Job.vendor_name(@job),&lt;br /&gt;             {},&lt;br /&gt;             :select_options &lt;/span&gt;&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;options_from_collection_for_select&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="attribute"&gt;@vendors&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;id&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="attribute"&gt;@job&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;vendor_id&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt; &lt;span class="punct"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="normal"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;you could also use this to display an icon to click on to display the drop-down box by passing an image_tag as the third parameter.&lt;br&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-8856650008402136810?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/8856650008402136810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=8856650008402136810' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/8856650008402136810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/8856650008402136810'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/09/improved-inplaceselecteditor.html' title='Improved in_place_select_editor'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-2530932863822399626</id><published>2007-09-03T05:46:00.000-07:00</published><updated>2007-09-03T05:47:17.938-07:00</updated><title type='text'>Time based expiration of cache fragments in Ruby on Rails (MemCacheStore and FileStore)</title><content type='html'>&lt;div class="post-body"&gt;This allows to expire cached fragments by ttl. Example usage (in views):&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;span class="punct"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="ident"&gt;cache&lt;/span&gt;&lt;span class="punct"&gt;("&lt;/span&gt;&lt;span class="string"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt; &lt;span class="symbol"&gt;:ttl&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;7&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;days&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;br /&gt;&lt;br /&gt;  ... some database-heavy stuff ...&lt;br /&gt;&amp;lt;% end %&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;Put the following in environment.rb or in lib/.&lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;ActionController::Caching::Fragments::MemCacheStore&lt;/span&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;write&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;value&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;=&lt;/span&gt;&lt;span class="constant"&gt;nil&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;is_a?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Hash&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;has_key?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:ttl&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="ident"&gt;ttl&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:ttl&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;br /&gt;    &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;br /&gt;      &lt;span class="ident"&gt;ttl&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;    &lt;span class="attribute"&gt;@data&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;set&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;value&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;ttl&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;module &lt;/span&gt;&lt;span class="module"&gt;ActionView::Helpers::CacheHelper&lt;/span&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;cache&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;{},&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;nil&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;block&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="attribute"&gt;@controller&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;cache_erb_fragment&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;block&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;ActionController::Caching::Fragments::UnthreadedFileStore&lt;/span&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;read&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;nil&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;br /&gt;    &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;is_a?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Hash&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;has_key?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:ttl&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="ident"&gt;ttl&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;options&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:ttl&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;br /&gt;    &lt;span class="keyword"&gt;else&lt;/span&gt;&lt;br /&gt;      &lt;span class="ident"&gt;ttl&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="ident"&gt;fn&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;real_file_path&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;# if cache expired act as if file doesn't exist&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;ttl&lt;/span&gt; &lt;span class="punct"&gt;&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;0&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;exists?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;fn&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;mtime&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;fn&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;Time&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;now&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt; &lt;span class="ident"&gt;ttl&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;open&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;fn&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;rb&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;f&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;read&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt; &lt;span class="keyword"&gt;rescue&lt;/span&gt; &lt;span class="constant"&gt;nil&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-2530932863822399626?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/2530932863822399626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=2530932863822399626' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/2530932863822399626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/2530932863822399626'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/09/time-based-expiration-of-cache.html' title='Time based expiration of cache fragments in Ruby on Rails (MemCacheStore and FileStore)'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-4042372119990455644</id><published>2007-09-03T05:35:00.000-07:00</published><updated>2007-09-03T05:36:00.130-07:00</updated><title type='text'>RJS with toggle_slide if not visible only</title><content type='html'>&lt;div class="post-body"&gt;RJS is very powerful. here is a small code snippet that shows how to do a toggle on a div if NOT visible. If the div is visible, it just exchange it. Here is my rhtml code:&lt;br&gt;&lt;br&gt;&lt;pre&gt;    &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ident"&gt;div&lt;/span&gt; &lt;span class="ident"&gt;style&lt;/span&gt;&lt;span class="punct"&gt;="&lt;/span&gt;&lt;span class="string"&gt;height: 30px&lt;/span&gt;&lt;span class="punct"&gt;"&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ident"&gt;div&lt;/span&gt; &lt;span class="ident"&gt;style&lt;/span&gt;&lt;span class="punct"&gt;="&lt;/span&gt;&lt;span class="string"&gt;float: left; padding: 0 0 0 180px&lt;/span&gt;&lt;span class="punct"&gt;"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span class="punct"&gt;&amp;lt;%=&lt;/span&gt;&lt;span class="string"&gt; link_to_remote("test_visibility" , &lt;br /&gt;                :with &lt;/span&gt;&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;'is_visible=' + Element.visible('list_div')&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;&lt;br /&gt;                &lt;span class="symbol"&gt;:loading&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;Element.show('getting_results')&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;                &lt;span class="symbol"&gt;:complete&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;Element.hide('getting_results')&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;&lt;br /&gt;                &lt;span class="symbol"&gt;:failure&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;alert('An error occured, please email us directly!')&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;                &lt;span class="symbol"&gt;:url&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="symbol"&gt;:action&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;one_action&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;})&lt;/span&gt; &lt;span class="punct"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;/div&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ident"&gt;div&lt;/span&gt; &lt;span class="ident"&gt;id&lt;/span&gt;&lt;span class="punct"&gt;="&lt;/span&gt;&lt;span class="string"&gt;getting_results&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt; &lt;span class="ident"&gt;style&lt;/span&gt;&lt;span class="punct"&gt;="&lt;/span&gt;&lt;span class="string"&gt;float: left; padding: 3px 0 0 30px; display: none;&lt;/span&gt;&lt;span class="punct"&gt;"&amp;gt;&lt;/span&gt;&lt;br /&gt;            &lt;span class="punct"&gt;&amp;lt;%=&lt;/span&gt;&lt;span class="string"&gt; image_tag "ajax-loader.gif", :class &lt;/span&gt;&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;image&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt; &lt;span class="symbol"&gt;:alt&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;loading...&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt; &lt;span class="punct"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="string"&gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;/div&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="regex"&gt;div&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;div id="list_div" style="display: none;" &amp;gt;&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;div&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;br /&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;And in my controller, I have the following code:&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;one_action&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span class="ident"&gt;render&lt;/span&gt; &lt;span class="symbol"&gt;:update&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;page&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;br /&gt;        &lt;span class="ident"&gt;page&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;replace_html&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;list_div&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:partial&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;one_partial&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;params&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;is_visible&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;false&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;br /&gt;          &lt;span class="ident"&gt;page&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;visual_effect&lt;/span&gt; &lt;span class="symbol"&gt;:toggle_slide&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;list_div&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:duration&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;        &lt;span class="keyword"&gt;end&lt;/span&gt;       &lt;br /&gt;      &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;How it works?&lt;br&gt;&lt;pre&gt;&lt;span class="constant"&gt;Element&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;visible&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;list_div&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;/pre&gt; is a prototype function that returns false if the element is not visible and true if it is. In the above case, we have the orginial visibility of the div to be "display: none". Thus the first time the action is called, the Ajax call will send the parameter false to the action. This will make the div appear. For subsequent requests, the value of visibility will be true, thus only replacing the div.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-4042372119990455644?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/4042372119990455644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=4042372119990455644' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/4042372119990455644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/4042372119990455644'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/09/rjs-with-toggleslide-if-not-visible.html' title='RJS with toggle_slide if not visible only'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-2795829943915368611</id><published>2007-09-03T05:31:00.001-07:00</published><updated>2007-09-03T05:31:40.236-07:00</updated><title type='text'>.htaccess That Fixes The Trailing Slash Error</title><content type='html'>&lt;div class="post-body"&gt;// This .htaccess file is for use with a Rails application that is accessed by a symbolic link. This fixes an error in which the directory URL must have a trailing slash. Otherwise, the user receives a 400 Bad Request error.&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;span class="constant"&gt;Options&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt;&lt;span class="constant"&gt;FollowSymLinks&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt;&lt;span class="constant"&gt;ExecCGI&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="constant"&gt;RewriteEngine&lt;/span&gt; &lt;span class="constant"&gt;On&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="constant"&gt;RewriteCond&lt;/span&gt; &lt;span class="punct"&gt;%{&lt;/span&gt;&lt;span class="string"&gt;SCRIPT_FILENAME&lt;/span&gt;&lt;span class="punct"&gt;}&lt;/span&gt;    &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;d&lt;/span&gt;&lt;br /&gt;&lt;span class="constant"&gt;RewriteCond&lt;/span&gt; &lt;span class="punct"&gt;%{&lt;/span&gt;&lt;span class="string"&gt;SCRIPT_FILENAME&lt;/span&gt;&lt;span class="punct"&gt;}&lt;/span&gt;      ^&lt;span class="punct"&gt;.*[^\/&lt;/span&gt;&lt;span class="regex"&gt;]$&lt;br /&gt;RewriteRule ^(.*)$ $1&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;N&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;#Put the directory your Rails app is in here.&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;RewriteBase&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;directory&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="constant"&gt;RewriteRule&lt;/span&gt; ^&lt;span class="global"&gt;$ &lt;/span&gt;&lt;span class="ident"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;html&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="constant"&gt;QSA&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="constant"&gt;RewriteRule&lt;/span&gt; ^&lt;span class="punct"&gt;([^.]+)&lt;/span&gt;&lt;span class="global"&gt;$ $1&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;html&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="constant"&gt;QSA&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="constant"&gt;RewriteCond&lt;/span&gt; &lt;span class="punct"&gt;%{&lt;/span&gt;&lt;span class="string"&gt;REQUEST_FILENAME&lt;/span&gt;&lt;span class="punct"&gt;}&lt;/span&gt; &lt;span class="punct"&gt;!-&lt;/span&gt;&lt;span class="ident"&gt;f&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="constant"&gt;RewriteRule&lt;/span&gt; ^&lt;span class="punct"&gt;(.*)&lt;/span&gt;&lt;span class="global"&gt;$ &lt;/span&gt;&lt;span class="ident"&gt;dispatch&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;cgi?&lt;/span&gt;&lt;span class="global"&gt;$1&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="constant"&gt;QSA&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;&lt;span class="constant"&gt;L&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-2795829943915368611?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/2795829943915368611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=2795829943915368611' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/2795829943915368611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/2795829943915368611'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/09/htaccess-that-fixes-trailing-slash.html' title='.htaccess That Fixes The Trailing Slash Error'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-1834263912124974109</id><published>2007-09-03T05:26:00.000-07:00</published><updated>2007-09-03T05:30:52.445-07:00</updated><title type='text'>Passing parameters into before filter</title><content type='html'>&lt;div class="post-body"&gt;application.rb &lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;ApplicationController&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActionController&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;hello&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;Hello &lt;span class="expr"&gt;#{name}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;users_controllers.rb&lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;UsersController&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ApplicationController&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="ident"&gt;before_filter&lt;/span&gt; &lt;span class="symbol"&gt;:only&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:index&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;u&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;br /&gt;    &lt;span class="ident"&gt;u&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;hello&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;Master&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-1834263912124974109?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/1834263912124974109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=1834263912124974109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/1834263912124974109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/1834263912124974109'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/09/passing-parameters-into-before-filter.html' title='Passing parameters into before filter'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-4462941483534808869</id><published>2007-09-03T05:24:00.000-07:00</published><updated>2007-09-03T05:25:02.326-07:00</updated><title type='text'>SQL Transaction in Rails</title><content type='html'>&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;fetch_value&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;sql&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;connection&lt;/span&gt;&lt;span class="punct"&gt;();&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;sql&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;SET autocommit=0&lt;/span&gt;&lt;span class="punct"&gt;";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="ident"&gt;sql&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;begin_db_transaction&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;id&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;value&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;sql&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;execute&lt;/span&gt;&lt;span class="punct"&gt;("&lt;/span&gt;&lt;span class="string"&gt;SELECT id, value FROM sometable WHERE used=0 LIMIT 1 FOR UPDATE&lt;/span&gt;&lt;span class="punct"&gt;").&lt;/span&gt;&lt;span class="ident"&gt;fetch_row&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="ident"&gt;sql&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;update&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;UPDATE sometable SET used=1 WHERE id=&lt;span class="expr"&gt;#{id}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;";&lt;/span&gt;&lt;br /&gt; &lt;span class="ident"&gt;sql&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;commit_db_transaction&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;span class="ident"&gt;value&lt;/span&gt;&lt;span class="punct"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-4462941483534808869?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/4462941483534808869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=4462941483534808869' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/4462941483534808869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/4462941483534808869'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/09/sql-transaction-in-rails.html' title='SQL Transaction in Rails'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-4920074085324631090</id><published>2007-09-03T05:21:00.002-07:00</published><updated>2007-09-03T05:22:01.648-07:00</updated><title type='text'>Seesaw: An Improved Restart System for Mongrel</title><content type='html'>&lt;p CLASS="entrytext"&gt;&lt;img WIDTH="268" VSPACE="4" HSPACE="4" HEIGHT="141" BORDER="1" ALT="Seesaw2" SRC="http://www.rubyinside.com/wp-content/uploads/2007/08/seesaw2.jpg" /&gt;&lt;/p&gt;&lt;br /&gt;Most Rails developers will be familiar with Zed Shaw's &lt;a HREF="http://mongrel.rubyforge.org/"&gt;Mongrel&lt;/a&gt;, a great HTTP library used by most Rails developers to either test or deploy their applications (it's also pretty great for building your own basic HTTP handlers too, but I digress).&lt;br /&gt;&lt;br /&gt;Sometimes when restarting applications after code updates, some requests can be "lost" in the whole process, particularly in high-traffic environments. &lt;a HREF="http://synaphy.com.au/2007/8/20/seesaw"&gt;Seesaw&lt;/a&gt;, developed by Max Muermann and Matt Allen, however, resolves this problem by restarting your mongrel processes one by one so that availability is ensured. Seesaw is available as a gem (gem install seesaw), although &lt;a HREF="http://synaphy.com.au/2007/8/20/seesaw"&gt;this blog post&lt;/a&gt; is essential reading to learn about integration with Nginx and Apache.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-4920074085324631090?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/4920074085324631090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=4920074085324631090' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/4920074085324631090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/4920074085324631090'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/09/seesaw-improved-restart-system-for.html' title='Seesaw: An Improved Restart System for Mongrel'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-4218026522530493860</id><published>2007-09-03T05:21:00.001-07:00</published><updated>2007-09-03T05:21:31.351-07:00</updated><title type='text'>Javascript code to set Rails date_select to today.</title><content type='html'>&lt;p CLASS="post-body"&gt;If you are using date_select in rails here is a little bit of javascript so that at the side of the fields the user can click a link that will automatically set the fields to todays date.&lt;/p&gt;&lt;br /&gt;&lt;strong&gt;Updated: Now works on rails 1.2, as date_select now finally has ids&lt;/strong&gt;&lt;br /&gt;&lt;pre&gt;&lt;span&gt;# put is app_root/public/javascript/application.js&lt;/span&gt;&lt;span&gt;function&lt;/span&gt; &lt;span CLASS="ident"&gt;set_today&lt;/span&gt;&lt;span CLASS="punct"&gt;(&lt;/span&gt;&lt;span&gt;model&lt;/span&gt;&lt;span CLASS="punct"&gt;,&lt;/span&gt; &lt;span CLASS="ident"&gt;atrib&lt;/span&gt;&lt;span CLASS="punct"&gt;)&lt;/span&gt;&lt;span CLASS="punct"&gt;{&lt;/span&gt;&lt;span CLASS="ident"&gt;t3&lt;/span&gt; &lt;span CLASS="punct"&gt;=&lt;/span&gt; &lt;span CLASS="ident"&gt;document&lt;/span&gt;&lt;span CLASS="punct"&gt;.&lt;/span&gt;&lt;span CLASS="ident"&gt;getElementById&lt;/span&gt;&lt;span CLASS="punct"&gt;(&lt;/span&gt;&lt;span CLASS="ident"&gt;model&lt;/span&gt; &lt;span CLASS="punct"&gt;+&lt;/span&gt; &lt;span CLASS="punct"&gt;'&lt;/span&gt;&lt;span CLASS="string"&gt;_&lt;/span&gt;&lt;span CLASS="punct"&gt;'&lt;/span&gt; &lt;span CLASS="punct"&gt;+&lt;/span&gt; &lt;span CLASS="ident"&gt;atrib&lt;/span&gt; &lt;span CLASS="punct"&gt;+&lt;/span&gt; &lt;span CLASS="punct"&gt;'&lt;/span&gt;&lt;span CLASS="string"&gt;_3i&lt;/span&gt;&lt;span CLASS="punct"&gt;');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span CLASS="ident"&gt;var&lt;/span&gt; &lt;span CLASS="ident"&gt;dt&lt;/span&gt; &lt;span CLASS="punct"&gt;=&lt;/span&gt; &lt;span CLASS="ident"&gt;new&lt;/span&gt; &lt;span CLASS="constant"&gt;Date&lt;/span&gt;&lt;span CLASS="punct"&gt;();&lt;/span&gt;&lt;span CLASS="ident"&gt;t3&lt;/span&gt;&lt;span CLASS="punct"&gt;.&lt;/span&gt;&lt;span CLASS="ident"&gt;selectedIndex&lt;/span&gt; &lt;span CLASS="punct"&gt;=&lt;/span&gt; &lt;span CLASS="ident"&gt;dt&lt;/span&gt;&lt;span CLASS="punct"&gt;.&lt;/span&gt;&lt;span CLASS="ident"&gt;getDate&lt;/span&gt;&lt;span CLASS="punct"&gt;();&lt;/span&gt;&lt;span CLASS="ident"&gt;t2&lt;/span&gt; &lt;span CLASS="punct"&gt;=&lt;/span&gt; &lt;span CLASS="ident"&gt;document&lt;/span&gt;&lt;span CLASS="punct"&gt;.&lt;/span&gt;&lt;span CLASS="ident"&gt;getElementById&lt;/span&gt;&lt;span CLASS="punct"&gt;(&lt;/span&gt;&lt;span CLASS="ident"&gt;model&lt;/span&gt; &lt;span CLASS="punct"&gt;+&lt;/span&gt; &lt;span CLASS="punct"&gt;'&lt;/span&gt;&lt;span CLASS="string"&gt;_&lt;/span&gt;&lt;span CLASS="punct"&gt;'&lt;/span&gt; &lt;span CLASS="punct"&gt;+&lt;/span&gt; &lt;span CLASS="ident"&gt;atrib&lt;/span&gt; &lt;span CLASS="punct"&gt;+&lt;/span&gt; &lt;span CLASS="punct"&gt;'&lt;/span&gt;&lt;span CLASS="string"&gt;_2i&lt;/span&gt;&lt;span CLASS="punct"&gt;')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span CLASS="ident"&gt;t2&lt;/span&gt;&lt;span CLASS="punct"&gt;.&lt;/span&gt;&lt;span CLASS="ident"&gt;selectedIndex&lt;/span&gt; &lt;span CLASS="punct"&gt;=&lt;/span&gt; &lt;span CLASS="ident"&gt;dt&lt;/span&gt;&lt;span CLASS="punct"&gt;.&lt;/span&gt;&lt;span CLASS="ident"&gt;getMonth&lt;/span&gt;&lt;span CLASS="punct"&gt;()&lt;/span&gt; &lt;span CLASS="punct"&gt;+&lt;/span&gt; &lt;span CLASS="number"&gt;1&lt;/span&gt;&lt;span CLASS="punct"&gt;;&lt;/span&gt;&lt;span CLASS="ident"&gt;t1&lt;/span&gt; &lt;span CLASS="punct"&gt;=&lt;/span&gt; &lt;span CLASS="ident"&gt;document&lt;/span&gt;&lt;span CLASS="punct"&gt;.&lt;/span&gt;&lt;span CLASS="ident"&gt;getElementById&lt;/span&gt;&lt;span CLASS="punct"&gt;(&lt;/span&gt;&lt;span CLASS="ident"&gt;model&lt;/span&gt; &lt;span CLASS="punct"&gt;+&lt;/span&gt; &lt;span CLASS="punct"&gt;'&lt;/span&gt;&lt;span CLASS="string"&gt;_&lt;/span&gt;&lt;span CLASS="punct"&gt;'&lt;/span&gt; &lt;span CLASS="punct"&gt;+&lt;/span&gt; &lt;span CLASS="ident"&gt;atrib&lt;/span&gt; &lt;span CLASS="punct"&gt;+&lt;/span&gt; &lt;span CLASS="punct"&gt;'&lt;/span&gt;&lt;span CLASS="string"&gt;_1i&lt;/span&gt;&lt;span CLASS="punct"&gt;')&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span CLASS="keyword"&gt;for&lt;/span&gt; &lt;span CLASS="punct"&gt;(&lt;/span&gt;&lt;span CLASS="ident"&gt;i&lt;/span&gt; &lt;span CLASS="punct"&gt;=&lt;/span&gt; &lt;span CLASS="number"&gt;0&lt;/span&gt;&lt;span CLASS="punct"&gt;;&lt;/span&gt; &lt;span CLASS="ident"&gt;i&lt;/span&gt; &lt;span CLASS="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span CLASS="ident"&gt;t1&lt;/span&gt;&lt;span CLASS="punct"&gt;.&lt;/span&gt;&lt;span CLASS="ident"&gt;length&lt;/span&gt;&lt;span CLASS="punct"&gt;;&lt;/span&gt; &lt;span CLASS="ident"&gt;i&lt;/span&gt;&lt;span CLASS="punct"&gt;++)&lt;/span&gt;&lt;span CLASS="punct"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span CLASS="keyword"&gt;      if&lt;/span&gt; &lt;span CLASS="punct"&gt;(&lt;/span&gt;&lt;span CLASS="ident"&gt;t1&lt;/span&gt;&lt;span CLASS="punct"&gt;.&lt;/span&gt;&lt;span CLASS="ident"&gt;options&lt;/span&gt;&lt;span CLASS="punct"&gt;[&lt;/span&gt;&lt;span CLASS="ident"&gt;i&lt;/span&gt;&lt;span CLASS="punct"&gt;].&lt;/span&gt;&lt;span CLASS="ident"&gt;text&lt;/span&gt; &lt;span CLASS="punct"&gt;==&lt;/span&gt; &lt;span CLASS="ident"&gt;dt&lt;/span&gt;&lt;span CLASS="punct"&gt;.&lt;/span&gt;&lt;span CLASS="ident"&gt;getFullYear&lt;/span&gt;&lt;span CLASS="punct"&gt;())&lt;/span&gt;&lt;span CLASS="punct"&gt;     {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span CLASS="ident"&gt;            t1&lt;/span&gt;&lt;span CLASS="punct"&gt;.&lt;/span&gt;&lt;span CLASS="ident"&gt;selectedIndex&lt;/span&gt; &lt;span CLASS="punct"&gt;=&lt;/span&gt; &lt;span CLASS="ident"&gt;i&lt;/span&gt;&lt;span CLASS="punct"&gt;;&lt;/span&gt;&lt;span CLASS="punct"&gt;     }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span CLASS="punct"&gt;}&lt;/span&gt;&lt;span CLASS="punct"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;To call this method say in a link use this in your rhtml&lt;br /&gt;&lt;pre&gt;&lt;span CLASS="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span CLASS="ident"&gt;a&lt;/span&gt; &lt;span CLASS="ident"&gt;href&lt;/span&gt;&lt;span CLASS="punct"&gt;="&lt;/span&gt;&lt;span CLASS="string"&gt;javascript: set_today('model_name', 'column_name');&lt;/span&gt;&lt;span CLASS="punct"&gt;"&amp;gt;&lt;/span&gt;&lt;span CLASS="ident"&gt;today?&lt;/span&gt;&lt;span CLASS="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span CLASS="regex"&gt;a&amp;gt;&lt;span CLASS="normal"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-4218026522530493860?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/4218026522530493860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=4218026522530493860' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/4218026522530493860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/4218026522530493860'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/09/javascript-code-to-set-rails-dateselect.html' title='Javascript code to set Rails date_select to today.'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-7086563414101519377</id><published>2007-09-02T23:52:00.000-07:00</published><updated>2007-09-03T05:20:49.896-07:00</updated><title type='text'>Directory Listing in Ruby On Rail</title><content type='html'>&lt;p CLASS="post-body"&gt;The code displays all the subdirectories and files listed in the the main directory, and also displays these items as a link so that the following subdirectories can become the directories and diaplay the corresponding elements&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span CLASS="constant"&gt;IN&lt;/span&gt; &lt;span CLASS="constant"&gt;CONTROLLER&lt;/span&gt;&lt;br /&gt;&lt;span CLASS="punct"&gt;...............&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span CLASS="constant"&gt;DEF&lt;/span&gt; &lt;span CLASS="ident"&gt;listing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span CLASS="keyword"&gt;if&lt;/span&gt; &lt;span CLASS="punct"&gt;(&lt;/span&gt;&lt;span CLASS="ident"&gt;params&lt;/span&gt;&lt;span CLASS="punct"&gt;[&lt;/span&gt;&lt;span CLASS="symbol"&gt;:dir&lt;/span&gt;&lt;span CLASS="punct"&gt;]&lt;/span&gt; &lt;span CLASS="punct"&gt;!=&lt;/span&gt;&lt;span CLASS="constant"&gt;nil&lt;/span&gt;&lt;span CLASS="punct"&gt;)&lt;/span&gt;&lt;br /&gt;      &lt;span CLASS="attribute"&gt;@path&lt;/span&gt;   &lt;span CLASS="punct"&gt;=&lt;/span&gt; &lt;span CLASS="ident"&gt;params&lt;/span&gt;&lt;span CLASS="punct"&gt;[&lt;/span&gt;&lt;span CLASS="symbol"&gt;:path&lt;/span&gt;&lt;span CLASS="punct"&gt;]+"&lt;/span&gt;&lt;span CLASS="string"&gt;/&lt;/span&gt;&lt;span CLASS="punct"&gt;"+&lt;/span&gt;&lt;span CLASS="ident"&gt;params&lt;/span&gt;&lt;span CLASS="punct"&gt;[&lt;/span&gt;&lt;span CLASS="symbol"&gt;:dir&lt;/span&gt;&lt;span CLASS="punct"&gt;]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   &lt;span CLASS="keyword"&gt;else&lt;/span&gt;&lt;br /&gt;      &lt;span CLASS="attribute"&gt;@path&lt;/span&gt; &lt;span CLASS="punct"&gt;="&lt;/span&gt;&lt;span CLASS="string"&gt;D:/Folder_name&lt;/span&gt;&lt;span CLASS="punct"&gt;"&lt;/span&gt;&lt;br /&gt;   &lt;span CLASS="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span CLASS="attribute"&gt;@dirEntries&lt;/span&gt; &lt;span CLASS="punct"&gt;=&lt;/span&gt; &lt;span CLASS="constant"&gt;Dir&lt;/span&gt;&lt;span CLASS="punct"&gt;.&lt;/span&gt;&lt;span CLASS="ident"&gt;entries&lt;/span&gt;&lt;span CLASS="punct"&gt;(&lt;/span&gt;&lt;span CLASS="attribute"&gt;@path&lt;/span&gt;&lt;span CLASS="punct"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;      &lt;span CLASS="attribute"&gt;@dirEntries&lt;/span&gt;&lt;span CLASS="punct"&gt;.&lt;/span&gt;&lt;span CLASS="ident"&gt;reject!&lt;/span&gt; &lt;span CLASS="punct"&gt;{&lt;/span&gt; &lt;span CLASS="punct"&gt;|&lt;/span&gt;&lt;span CLASS="ident"&gt;filename&lt;/span&gt;&lt;span CLASS="punct"&gt;|&lt;/span&gt; &lt;span CLASS="ident"&gt;filename&lt;/span&gt;&lt;span CLASS="punct"&gt;.&lt;/span&gt;&lt;span CLASS="ident"&gt;starts_with?&lt;/span&gt; &lt;span CLASS="punct"&gt;'&lt;/span&gt;&lt;span CLASS="string"&gt;.&lt;/span&gt;&lt;span CLASS="punct"&gt;'}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span CLASS="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span CLASS="constant"&gt;IN&lt;/span&gt; &lt;span CLASS="constant"&gt;VIEWS&lt;/span&gt;&lt;br /&gt;&lt;span CLASS="punct"&gt;.........&lt;/span&gt;&lt;br /&gt;&lt;span CLASS="punct"&gt;&amp;lt;%=&lt;/span&gt;&lt;span CLASS="string"&gt; javascript_include_tag :defaults %&amp;gt;  &lt;br /&gt;&lt;br /&gt;&amp;lt;% for dir in @dirEntries %&amp;gt; &lt;br /&gt;&amp;lt;%&lt;/span&gt;&lt;span CLASS="punct"&gt;=&lt;/span&gt; &lt;span CLASS="ident"&gt;link_to&lt;/span&gt; &lt;span CLASS="punct"&gt;"&lt;/span&gt;&lt;span CLASS="string"&gt;&lt;span CLASS="expr"&gt;#{dir}&lt;/span&gt;&lt;/span&gt;&lt;span CLASS="punct"&gt;",&lt;/span&gt; &lt;span CLASS="symbol"&gt;:action&lt;/span&gt; &lt;span CLASS="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span CLASS="punct"&gt;'&lt;/span&gt;&lt;span CLASS="string"&gt;listing&lt;/span&gt;&lt;span CLASS="punct"&gt;',&lt;/span&gt; &lt;span CLASS="symbol"&gt;:path&lt;/span&gt; &lt;span CLASS="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span CLASS="attribute"&gt;@path&lt;/span&gt;&lt;span CLASS="punct"&gt;,&lt;/span&gt; &lt;span CLASS="symbol"&gt;:dir&lt;/span&gt; &lt;span CLASS="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span CLASS="ident"&gt;dir&lt;/span&gt; &lt;span CLASS="punct"&gt;%&amp;gt;&lt;/span&gt;&lt;span CLASS="string"&gt;&amp;lt;br/&lt;/span&gt;&lt;span CLASS="punct"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span CLASS="punct"&gt;&amp;lt;%&lt;/span&gt; &lt;span CLASS="keyword"&gt;end&lt;/span&gt; &lt;span CLASS="punct"&gt;%&amp;gt; &lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-7086563414101519377?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/7086563414101519377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=7086563414101519377' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/7086563414101519377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/7086563414101519377'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/09/directory-listing-in-ruby-on-rail.html' title='Directory Listing in Ruby On Rail'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-8054628863211772234</id><published>2007-08-23T00:26:00.001-07:00</published><updated>2007-08-23T00:26:34.095-07:00</updated><title type='text'>Silverlight (and Ruby on the .NET CLR)</title><content type='html'>&lt;div class="entry"&gt;&lt;br /&gt;&lt;p&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2007/05/silverlight.jpg" alt="Silverlight" border="1" height="112" hspace="4" vspace="4" width="266"&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;At &lt;a href="http://visitmix.com/"&gt;MIX07&lt;/a&gt; a few days ago, Microsoft announced "&lt;a href="http://silverlight.net/"&gt;Silverlight&lt;/a&gt;", a new Flash-esque .NET-based platform for delivering "media experiences" and "rich interactive applications" on the Web. It's interesting, and &lt;a href="http://www.techcrunch.com/2007/04/30/silverlight-the-web-just-got-richer/"&gt;some people seem to think&lt;/a&gt; it's going to revolutionize the Web, but that's not why we're interested in it at Ruby Inside.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The most interesting part of the Silverlight announcement is that it's based on a subset of the CLR (Common Language Runtime) from Microsoft's .NET platform. The .NET CLR has become a common target for programming language runtimes recently, but Microsoft has officially announced C#, Javascript, VB, Python &lt;strong&gt;and Ruby support &lt;/strong&gt;for Silverlight's CLR. Microsoft are &lt;a href="http://blogs.msdn.com/hugunin/archive/2007/04/30/a-dynamic-language-runtime-dlr.aspx"&gt;also adding new features in a system called the DLR&lt;/a&gt; (Dynamic Language Runtime) to bring more dynamic features (as required by Python and Ruby) to the CLR. InfoQ &lt;a href="http://www.infoq.com/news/2007/04/ms-ironruby"&gt;has more information on this&lt;/a&gt;, in terms of Ruby.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;What all of this means is that there's baked-in support for Ruby in what could be one of the biggest runtime environments on the Web in the next few years, and this can only be a good thing for Ruby. Jon Udell sat down with John Lam (the creator of RubyCLR) and &lt;a href="http://blog.jonudell.net/2007/04/30/a-conversation-with-john-lam-about-the-dynamic-language-runtime-silverlight-and-ruby/"&gt;talked about the DLR, Ruby, and how the whole caboodle works / will work.&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Let's cross our fingers and hope this isn't ActiveX all over again.&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-8054628863211772234?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/8054628863211772234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=8054628863211772234' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/8054628863211772234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/8054628863211772234'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/08/silverlight-and-ruby-on-net-clr.html' title='Silverlight (and Ruby on the .NET CLR)'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-3846547350843385800</id><published>2007-08-23T00:25:00.000-07:00</published><updated>2007-08-23T00:26:07.047-07:00</updated><title type='text'>relative_time_helpers Plugin: time_ago_in_words on Steroids</title><content type='html'>&lt;div class="entry"&gt;&lt;br /&gt;&lt;p&gt;&lt;img alt="From Basecamp's screenshot" src="http://www.rubyinside.com/wp-content/uploads/2007/06/from_basecamp.gif" border="1"&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://activereload.net/2007/5/17/displaying-nice-relative-dates"&gt;relative_time_helpers&lt;/a&gt; is a straightforward, but very useful Rails plugin by &lt;a href="http://techno-weenie.net/"&gt;Rick Olson&lt;/a&gt; that formats timestamps to human-friendly relative dates. You're probably already using Rails' built-in &lt;tt&gt;&lt;a href="http://www.railsapi.org/actionview-helpers-datehelper-time_ago_in_words"&gt;time_ago_in_words&lt;/a&gt;&lt;/tt&gt; helper in your applications, but Rick's &lt;tt&gt;relative_time&lt;/tt&gt; gives even better results:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;%= relative_time(Time.now) %&amp;gt;&lt;br /&gt;# today&lt;br /&gt;&amp;lt;%= relative_time(1.day.ago) %&amp;gt;&lt;br /&gt;# yesterday&lt;br /&gt;&amp;lt;%= relative_time(1.day.from_now) %&amp;gt;&lt;br /&gt;# tomorrow&lt;br /&gt;&amp;lt;%= relative_time_span([Time.now, 5.days.from_now]) %&amp;gt;&lt;br /&gt;# May 17th - 22nd&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;To install it:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;script/plugin install http://ar-code.svn.engineyard.com/plugins/relative_time_helpers&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-3846547350843385800?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/3846547350843385800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=3846547350843385800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/3846547350843385800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/3846547350843385800'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/08/relativetimehelpers-plugin.html' title='relative_time_helpers Plugin: time_ago_in_words on Steroids'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-5912953486615759603</id><published>2007-08-23T00:24:00.002-07:00</published><updated>2007-08-23T00:25:34.542-07:00</updated><title type='text'>Rails performance tip - using YSlow</title><content type='html'>&lt;div class="content"&gt;&lt;br /&gt;    &lt;p&gt;YSlow from Yahoo! is a &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/5369"&gt;Firefox add-on&lt;/a&gt; to &lt;em&gt;analyse web pages and tell you why they’re slow based on&lt;/em&gt; &lt;a href="http://developer.yahoo.com/performance/index.html#rules"&gt;rules for high performance web sites&lt;/a&gt;. YSlow requires the indispensable Firebug extension.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;The 13 rules YSlow checks your site against are as follows:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;pre&gt;&lt;code&gt;1. Make Fewer HTTP Requests&lt;br /&gt;2. Use a Content Delivery Network&lt;br /&gt;3. Add an Expires Header&lt;br /&gt;4. Gzip Components&lt;br /&gt;5. Put CSS at the Top&lt;br /&gt;6. Move Scripts to the Bottom&lt;br /&gt;7. Avoid CSS Expressions&lt;br /&gt;8. Make JavaScript and CSS External&lt;br /&gt;9. Reduce DNS Lookups&lt;br /&gt;10. Minify JavaScript&lt;br /&gt;11. Avoid Redirects&lt;br /&gt;12. Remove Duplicate Scripts&lt;br /&gt;13. Configure ETags&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;This post will demonstrate that most of these are easily achievable for a Rails website through a combination of plugins and with correct configuration of a proxy web server (in front of a mongrel cluster) – in this case &lt;a href="http://wiki.codemongers.com/Nginx"&gt;Nginx&lt;/a&gt;. This guide follows experience with improving performance for &lt;a href="http://www.trawlr.com"&gt;trawlr.com&lt;/a&gt; (an online &lt;span class="caps"&gt;RSS&lt;/span&gt; reader).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;h2&gt;Make Fewer &lt;span class="caps"&gt;HTTP&lt;/span&gt; Requests, Minify JavaScript, Put &lt;span class="caps"&gt;CSS&lt;/span&gt; at the Top, Move Scripts to the Bottom, Remove Duplicate Scripts&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;The easiest way to make fewer &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests is to combine all JavaScript and &lt;span class="caps"&gt;CSS&lt;/span&gt; files into one. The &lt;a href="http://synthesis.sbecker.net/pages/asset_packager"&gt;asset packager&lt;/a&gt; plugin does exactly this, plus it will also compress the source files (in production mode) and correctly handles caching (without query string parameters).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;Moving &lt;span class="caps"&gt;CSS&lt;/span&gt; to the top (within the head section) and moving JavaScript to the bottom of the page are both manual tasks that should be done in the layout templates (such as &lt;code&gt;app/views/layouts/application.rhtml&lt;/code&gt;). Remember to use &lt;code&gt;stylesheet_link_merged :base&lt;/code&gt; and &lt;code&gt;javascript_include_merged :base&lt;/code&gt; rather than the default Rails helpers.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;By using asset packager you can also verify that scripts are only included once – another performance hit otherwise!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;Excluding the Google analytics JavaScript file, trawlr.com now uses a single css and js file (including the entire prototype library). Note: You may need to add a missing semi-colon as per this &lt;a href="http://dev.rubyonrails.org/ticket/7301"&gt;defect&lt;/a&gt; for prototype to work correctly.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;Asset Packager can be included as part of a Capistrano deployment with the following recipe:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;desc "Compress JavaScript and CSS files using asset_packager" &lt;br /&gt;task :after_update_code, :roles =&amp;gt; [:web] do&lt;br /&gt;  run &amp;lt;&amp;lt;-EOF&lt;br /&gt;    cd #{release_path} &amp;amp;&amp;amp;&lt;br /&gt;    rake RAILS_ENV=production asset:packager:build_all&lt;br /&gt;  EOF&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt; &lt;h2&gt;Use a Content Delivery Network&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;Ignoring this point for now; I’d suggest the use of Amazon S3 as a useful starting point for simple &lt;span class="caps"&gt;CDN&lt;/span&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;h2&gt;Add an Expires Header&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;blockquote&gt;&lt;br /&gt;  &lt;p&gt;A first-time visitor to your page may have to make several &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests, but by using the Expires header you make those components cacheable. This avoids unnecessary &lt;span class="caps"&gt;HTTP&lt;/span&gt; requests on subsequent page views. Expires headers are most often used with images, but they should be used on all components including scripts, stylesheets, and Flash components.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt; &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;Nginx allows adding arbitrary &lt;span class="caps"&gt;HTTP&lt;/span&gt; headers via the &lt;code&gt;expire&lt;/code&gt; and &lt;code&gt;add_header&lt;/code&gt; directives. Adding the expires header to static content is done with a regular expression looking for relevant file extensions in the request &lt;span class="caps"&gt;URL&lt;/span&gt;. This example uses the maximum expiry date but could be set to more appropriate values as required (e.g. 24h, 7d, 1M)&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;# Add expires header for static content&lt;br /&gt;location ~* \.(js|css|jpg|jpeg|gif|png)$ {&lt;br /&gt;  if (-f $request_filename) {&lt;br /&gt;        expires      max;&lt;br /&gt;    break; &lt;br /&gt;  }        &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt; &lt;h2&gt;Gzip Components&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;Nginx can gzip any responses – including those proxied from a mongrel cluster.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;gzip on;&lt;br /&gt;gzip_min_length  1100;&lt;br /&gt;gzip_buffers     4 8k;&lt;br /&gt;gzip_proxied any;              &lt;br /&gt;gzip_types  text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt; &lt;h2&gt;Avoid &lt;span class="caps"&gt;CSS&lt;/span&gt; Expressions&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;Just don’t do it!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;h2&gt;Make JavaScript and &lt;span class="caps"&gt;CSS&lt;/span&gt; External&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;Add you JavaScript and &lt;span class="caps"&gt;CSS&lt;/span&gt; styles in external files rather than inline. The added benefit here is that the content will be merged and compressed thanks to the work already done above.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;h2&gt;Reduce &lt;span class="caps"&gt;DNS&lt;/span&gt; Lookups, Avoid Redirects, Configure ETags&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;These weren’t an issue for me so I suggest the Yahoo! guidance for further information&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#dns_lookups"&gt;Reduce &lt;span class="caps"&gt;DNS&lt;/span&gt; Lookups&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#redirects"&gt;Avoid Redirects&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;p&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html#etags"&gt;Configure ETags&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-5912953486615759603?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/5912953486615759603/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=5912953486615759603' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/5912953486615759603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/5912953486615759603'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/08/rails-performance-tip-using-yslow.html' title='Rails performance tip - using YSlow'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-8920744235742007503</id><published>2007-08-23T00:24:00.001-07:00</published><updated>2007-08-23T00:24:52.265-07:00</updated><title type='text'>Calendar Date Select: A Lightweight, Prototype-based Date/Time Picker for Rails Developers</title><content type='html'>&lt;div class="entry"&gt;&lt;br /&gt;&lt;p&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2007/08/calendardateselect.jpg" alt="Calendardateselect" border="1" height="249" hspace="4" vspace="4" width="177"&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://code.google.com/p/calendardateselect/"&gt;Calendar Date Select&lt;/a&gt; is a new(ish) "date and time picker", developed by Tim Harper, designed primarily for developers to use in Rails applications. It uses the standard Prototype JavaScript library, and is easily installed as a Rails plugin:&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;script/plugin install http://calendardateselect.googlecode.com/svn/tags/calendar_date_select&lt;/p&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Take a look at the &lt;a href="http://www.restatesman.com/static/calendar"&gt;collection of demos&lt;/a&gt; of the picker to see its full range.&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-8920744235742007503?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/8920744235742007503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=8920744235742007503' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/8920744235742007503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/8920744235742007503'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/08/calendar-date-select-lightweight.html' title='Calendar Date Select: A Lightweight, Prototype-based Date/Time Picker for Rails Developers'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-2876556116179884570</id><published>2007-08-23T00:23:00.002-07:00</published><updated>2007-08-23T00:24:21.684-07:00</updated><title type='text'>10 Great New Ruby / Rails Screencasts from July 2007</title><content type='html'>&lt;div class="entry"&gt;&lt;br /&gt;&lt;p&gt;&lt;img alt="Randscrcast-1" src="http://www.rubyinside.com/wp-content/uploads/2007/07/randscrcast-1.jpg" border="1" height="283" hspace="4" vspace="4" width="357"&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://railscasts.com/"&gt;Railscasts&lt;/a&gt;, maintained by Ryan Bates, continues to release one great free screencast after another, with 9 so far this month, although we're going to include one from June 29 for good measure. We &lt;a href="http://www.rubyinside.com/railscasts-free-ruby-on-rails-screencasts-426.html"&gt;first looked at Railscasts&lt;/a&gt; a few months ago, so if you haven't visited again since, it's worth it. Here are the latest screencasts:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://railscasts.com/episodes/60"&gt;Testing Without Fixtures&lt;/a&gt; - Fed up with using fixtures for your tests? Find a better way.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://railscasts.com/episodes/51"&gt;will_paginate&lt;/a&gt; - A look at the "new way" to do pagination in Rails using the will_paginate plugin.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://railscasts.com/episodes/52"&gt;Updating Through Checkboxes&lt;/a&gt; - How to perform actions on multiple items selected with checkboxes in a Rails view.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://railscasts.com/episodes/53"&gt;Handling Exceptions&lt;/a&gt; - Learn about exceptions and how to handle them in Rails apps.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://railscasts.com/episodes/56"&gt;The Logger&lt;/a&gt; - No, it's not about felling trees. Learn how to send messages to the log and how to customize it.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://railscasts.com/episodes/58"&gt;How to Make a Generator&lt;/a&gt; - A look at building your own generator, much like the ones that come with Rails.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://railscasts.com/episodes/59"&gt;Optimistic Locking&lt;/a&gt; - How to resolve situations when two people want to update the same record at the same time.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;At the same time, Geoffrey Grosenbach, curator of PeepCode (and a new sponsor of Ruby Inside), has been storming ahead with his own set of screencasts, a few of which will be of direct interest to Rubyists / Rails developers:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://peepcode.com/products/rspec-basics"&gt;rSpec Basics&lt;/a&gt; - A look at Behavior Driven Development. An ideal starting point if you haven't touched BDD yet but have been intrigued.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://peepcode.com/products/rails-from-scratch-part-i"&gt;Rails From Scratch: Part I&lt;/a&gt; - A great up-to-date introductory "course" for getting into Rails. Even includes a free 20 page reference guide to Ruby and Rails, and an introduction to Ruby syntax. It's everything a new Rails developer needs.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://peepcode.com/products/rails-from-scratch-part-ii"&gt;Rails From Scratch: Part II&lt;/a&gt; - Another 80 minutes of great introductory material for new Rails developers.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;While Railscasts' screencasts are totally free, Peepcode screencasts cost $9 each, but for the great packaging, length, and total depth of the material covered, they're still bargains!&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-2876556116179884570?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/2876556116179884570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=2876556116179884570' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/2876556116179884570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/2876556116179884570'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/08/10-great-new-ruby-rails-screencasts.html' title='10 Great New Ruby / Rails Screencasts from July 2007'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-5595652801147734380</id><published>2007-08-23T00:23:00.001-07:00</published><updated>2007-08-23T00:23:44.294-07:00</updated><title type='text'>How to Profile Your Rails Application and Make Rails Go Vroom!</title><content type='html'>&lt;div class="entry"&gt;&lt;br /&gt;&lt;p&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2007/07/call_graph-1.jpg" alt="Call Graph-1" border="1" height="276" hspace="4" vspace="4" width="248"&gt;&lt;br&gt;&lt;br /&gt;Charlie Savage, author of &lt;a href="http://www.rubyinside.com/new-ruby-profiler-released-supports-rails-threads-irb-and-more-564.html"&gt;ruby-prof&lt;/a&gt;, recently baked in support for Rails to ruby-prof, so now it's possible to profile your Rails application, see where the delays are, and work on improving performance.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Hot on the heels of this development, Charlie wrote "&lt;a href="http://cfis.savagexi.com/articles/2007/07/10/how-to-profile-your-rails-application"&gt;How to Profile Your Application&lt;/a&gt;", an article that does just what it says on the tin, and which demonstrates how to profile the CPU time used on a single Rails request, and visualize the call tree.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This was quickly followed up with "&lt;a href="http://cfis.savagexi.com/articles/2007/07/18/making-rails-go-vroom"&gt;Making Rails Go Vroom&lt;/a&gt;", another great article that looks at what parts of Rails significantly slow things down. Charlie comes up with six key suggestions:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Don't use ActiveRecord#attributes or ActiveRecord#read_attribute&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Get your :includes right&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Don't check template timestamps ( cache_template_loading = true) &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Don't use url_for &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Don't let Rails parse timestamps &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Don't symbolize keys (local_assigns_support_string_keys = false)&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;Learn more and see how Charlie came to his conclusions &lt;a href="http://cfis.savagexi.com/articles/2007/07/18/making-rails-go-vroom"&gt;in the article&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-5595652801147734380?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/5595652801147734380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=5595652801147734380' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/5595652801147734380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/5595652801147734380'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/08/how-to-profile-your-rails-application.html' title='How to Profile Your Rails Application and Make Rails Go Vroom!'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-7475005635825224531</id><published>2007-08-23T00:22:00.000-07:00</published><updated>2007-08-23T00:23:05.673-07:00</updated><title type='text'>How To Scrape Google With Ruby In 0 Seconds</title><content type='html'>&lt;div class="entry"&gt;&lt;br /&gt;&lt;p&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2007/08/scrubytgoogle.jpg" alt="Scrubytgoogle" border="1" height="241" hspace="4" vspace="4" width="304"&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Okay, his title is a bit misleading, but Peter Szinek, developer of Ruby scraping toolkit &lt;a href="http://scrubyt.org"&gt;scRUBYt!&lt;/a&gt;, has put together a great article showing the process, from start to finish, of &lt;a href="http://scrubyt.org/scrapin-google-in-no-sec/"&gt;scraping Google results using Ruby "in no seconds"&lt;/a&gt;. In reality, it'll take you at least sixty to read the post.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-7475005635825224531?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/7475005635825224531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=7475005635825224531' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/7475005635825224531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/7475005635825224531'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/08/how-to-scrape-google-with-ruby-in-0.html' title='How To Scrape Google With Ruby In 0 Seconds'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-3580690992457967113</id><published>2007-08-09T22:06:00.000-07:00</published><updated>2007-08-09T22:13:27.500-07:00</updated><title type='text'>Framework Performance</title><content type='html'>&lt;strong&gt;Original Source : &lt;a HREF="http://wiki.rubyonrails.org/rails/pages/Framework+Performance"&gt;http://wiki.rubyonrails.org/rails/pages/Framework+Performance&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;We recently decided to switch our projects (what were they to start with? Perl / CGI?) to a MVC framework and our choice of the framework came down to three final contenders:&lt;br /&gt;&lt;br /&gt;   * Symfony on PHP http://www.symfony-project.com/&lt;br /&gt;   * Rails on Ruby http://rubyonrails.org/&lt;br /&gt;   * Django on Python http://www.djangoproject.com/&lt;br /&gt;&lt;br /&gt;To better understand the pros and cons of each, we wrote a very simple demo application in all three. The app we chose was the one built in the Ruby on Rails tutorial Rolling with Ruby on Rails http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html.&lt;br /&gt;&lt;br /&gt;We really wanted to test the framework, not static file serving or database performance. So we didn’t come up with complex queries or serve any static CSS or image files. All requests/hits/transactions are rendered pages. Also, all of the tests are GET operations (database SELECTs) for concurrent testing fairness and simplicity.&lt;br /&gt;&lt;br /&gt;Each of the tested pages was configured to have a unique number displayed on it based on microtime (to verify the pages weren’t being cached). Also, the same pages across all three apps were edited to have nearly the same number of bytes served.&lt;br /&gt;&lt;br /&gt;DISCLAIMER: There are infinitely more test scenarios we could have performed. But we wanted something done in a finite time. We feel these results, though not the whole picture, offer hints about relative performance between the three frameworks/platforms.&lt;br /&gt;&lt;br /&gt;Test Hardware:&lt;br /&gt;&lt;br /&gt;   * Dell 1U server (unknown model)&lt;br /&gt;   * Dual Xeon 3.2Ghz (6400 bogomips)&lt;br /&gt;   * 2 Gigs of RAM&lt;br /&gt;   * 2 240Gig (?) SATA drives&lt;br /&gt;&lt;br /&gt;Test OS/Software:&lt;br /&gt;&lt;br /&gt;   * OS: SuSE 10.1&lt;br /&gt;   * kernel: 2.6.16.13-4-smp&lt;br /&gt;   * database: Mysql 5.0.18&lt;br /&gt;   * stress-test software: Siege 2.64 http://www.joedog.org/JoeDog/Siege&lt;br /&gt;   * Used stock RPM’s for all software unless noted below&lt;br /&gt;&lt;br /&gt;Symfony setup:&lt;br /&gt;&lt;br /&gt;   * Apache 2.2.0 (mod_php)&lt;br /&gt;   * PHP 5.1.2&lt;br /&gt;   * APC 3.0.10 (PHP accelerator, compiled from source)&lt;br /&gt;   * Symfony 0.7.1587 (not an RPM)&lt;br /&gt;&lt;br /&gt;Django setup:&lt;br /&gt;&lt;br /&gt;   * Apache 2.2.0 (mod_python)&lt;br /&gt;   * Python 2.4.2&lt;br /&gt;   * Django 0.95-3336 (not an RPM)&lt;br /&gt;&lt;br /&gt;Rails setup:&lt;br /&gt;&lt;br /&gt;   * Apache 2.2.0 (mod_proxy_balancer)&lt;br /&gt;   * Ruby 1.8.4&lt;br /&gt;   * Rails 1.1.4 (not an RPM)&lt;br /&gt;   * Mongrel and lighttpd web server (not an RPM)&lt;br /&gt;&lt;br /&gt;Apache Prefork tuning:&lt;br /&gt;&lt;br /&gt;StartServers         5&lt;br /&gt;MinSpareServers      5&lt;br /&gt;MaxSpareServers      10&lt;br /&gt;ServerLimit          150&lt;br /&gt;MaxClients           150&lt;br /&gt;MaxRequestsPerChild  10000&lt;br /&gt;&lt;br /&gt;Results&lt;br /&gt;&lt;br /&gt;For each of the platforms, we experimented a bit with some options to try to get the best performance by running 3-minute tests. Then we ran an extended 30-minute test on each platform. (Before the actual tests, we pre-ran siege for a minute or two to prime whatever cache’s, etc.) Here are some of the results:&lt;br /&gt;&lt;br /&gt;Symfony – 50 concurrent users&lt;br /&gt;&lt;br /&gt;With PHP+APC: (30 min)&lt;br /&gt;&lt;br /&gt;Transactions:                  85862 hits&lt;br /&gt;Availability:                 100.00 %&lt;br /&gt;Elapsed time:                1801.15 secs&lt;br /&gt;Data transferred:             114.41 MB&lt;br /&gt;Response time:                  1.04 secs&lt;br /&gt;Transaction rate:             47.67 trans/sec&lt;br /&gt;Throughput:                     0.06 MB/sec&lt;br /&gt;Concurrency:                   49.63&lt;br /&gt;Successful transactions:       85862&lt;br /&gt;Failed transactions:               0&lt;br /&gt;Longest transaction:           4.15&lt;br /&gt;Shortest transaction:           0.02&lt;br /&gt;&lt;br /&gt;Mysql: 7% of CPU&lt;br /&gt;Siege: 5% of CPU&lt;br /&gt;&lt;br /&gt;With APC disabled: (3 min)&lt;br /&gt;&lt;br /&gt;Transactions:                   2256 hits&lt;br /&gt;Availability:                  99.34 %&lt;br /&gt;Elapsed time:                 181.76 secs&lt;br /&gt;Data transferred:               3.15 MB&lt;br /&gt;Response time:                  3.64 secs&lt;br /&gt;Transaction rate:             12.41 trans/sec&lt;br /&gt;Throughput:                     0.02 MB/sec&lt;br /&gt;Concurrency:                   45.19&lt;br /&gt;Successful transactions:     2256&lt;br /&gt;Failed transactions:          15&lt;br /&gt;Longest transaction:          30.57&lt;br /&gt;Shortest transaction:           0.14&lt;br /&gt;&lt;br /&gt;NOTE: NOT having a PHP accelerator yields about 12 trans/sec! Horrible! Rumor has it that APC will be included by default in PHP6. In the above tests, we also had syck (for YAML parsing). However it didn’t significantly change the results on a 3 minute test (less than 0.5 trans/sec).&lt;br /&gt;&lt;br /&gt;Rails – 50 concurrent users&lt;br /&gt;&lt;br /&gt;With 10 mongrels: (30 min)&lt;br /&gt;&lt;br /&gt;Transactions:                 158747 hits&lt;br /&gt;Availability:                 100.00 %&lt;br /&gt;Elapsed time:                1800.82 secs&lt;br /&gt;Data transferred:             211.38 MB&lt;br /&gt;Response time:                  0.57 secs&lt;br /&gt;Transaction rate:             88.15 trans/sec&lt;br /&gt;Throughput:                     0.12 MB/sec&lt;br /&gt;Concurrency:                   49.89&lt;br /&gt;Successful transactions:      158747&lt;br /&gt;Failed transactions:               0&lt;br /&gt;Longest transaction:          11.11&lt;br /&gt;Shortest transaction:           0.00&lt;br /&gt;&lt;br /&gt;Mysql: 10% of CPU&lt;br /&gt;Siege: 10% of CPU&lt;br /&gt;&lt;br /&gt;NOTE: In the test above Rails was configured with 10 stand-alone mongrel processes (production mode) and web requests were redirected through Apache using mod_proxy_balancer. In subsequent 3 minute tests, having 20 or 30 mongrels didn’t affect the transaction rate more than 0.5 trans/sec.&lt;br /&gt;&lt;br /&gt;With lighttpd+fastcgi: (3 min)&lt;br /&gt;&lt;br /&gt;Transactions:                  15415 hits&lt;br /&gt;Availability:                 100.00 %&lt;br /&gt;Elapsed time:                 180.66 secs&lt;br /&gt;Data transferred:              20.53 MB&lt;br /&gt;Response time:                  0.58 secs&lt;br /&gt;Transaction rate:             85.33 trans/sec&lt;br /&gt;Throughput:                     0.11 MB/sec&lt;br /&gt;Concurrency:                   49.89&lt;br /&gt;Successful transactions:       15415&lt;br /&gt;Failed transactions:               0&lt;br /&gt;Longest transaction:           1.25&lt;br /&gt;Shortest transaction:           0.04&lt;br /&gt;&lt;br /&gt;NOTE: The above test was run with the default lighttpd.conf, but on port 80 and in production mode. The number of trans/sec was about the same, but the longest transaction time was much smaller!&lt;br /&gt;&lt;br /&gt;Django, 50 concurrent users&lt;br /&gt;&lt;br /&gt;With mod_python: (30 min)&lt;br /&gt;&lt;br /&gt;Transactions:                 224588 hits&lt;br /&gt;Availability:                 100.00 %&lt;br /&gt;Elapsed time:                1800.52 secs&lt;br /&gt;Data transferred:             298.94 MB&lt;br /&gt;Response time:                  0.40 secs&lt;br /&gt;Transaction rate:            124.74 trans/sec&lt;br /&gt;Throughput:                     0.17 MB/sec&lt;br /&gt;Concurrency:                   49.92&lt;br /&gt;Successful transactions:      224576&lt;br /&gt;Failed transactions:               0&lt;br /&gt;Longest transaction:           9.31&lt;br /&gt;Shortest transaction:           0.00&lt;br /&gt;&lt;br /&gt;Mysql: 17% of CPU&lt;br /&gt;Siege: 11% of CPU&lt;br /&gt;&lt;br /&gt;NOTE: The above test was run with PythonAutoReload? Off and PythonDebug? Off (production mode). These are by far the best performance numbers of the three frameworks!&lt;br /&gt;&lt;br /&gt;High-load Results&lt;br /&gt;&lt;br /&gt;I re-ran 3-minute tests on all three platforms with 150 concurrent users to check high-load results.&lt;br /&gt;&lt;br /&gt;Symfony – PHP+APC, 150 concurrent users&lt;br /&gt;&lt;br /&gt;results&lt;br /&gt;&lt;br /&gt;Transactions:              14363 hits&lt;br /&gt;Availability:                  98.68 %&lt;br /&gt;Elapsed time:                 183.12 secs&lt;br /&gt;Data transferred:               3.72 MB&lt;br /&gt;Response time:                  1.34 secs&lt;br /&gt;Transaction rate:              78.43 trans/sec&lt;br /&gt;Throughput:                     0.02 MB/sec&lt;br /&gt;Concurrency:                  105.06&lt;br /&gt;Successful transactions:     122&lt;br /&gt;Failed transactions:         192&lt;br /&gt;Longest transaction:           30.67&lt;br /&gt;Shortest transaction:           0.02&lt;br /&gt;&lt;br /&gt;NOTE: You can see there were very few successful transactions. Most were “500 – Internal Server Errors” and 192 failed to connect altogether. It looks like the 500 errors were caused by something with Mysql, because the dev interface returned: “connect failed Native Error: Can’t connect to local MySQL server through socket ’/var/lib/mysql/mysql.sock”&lt;br /&gt;&lt;br /&gt;Rails – 10 mongrels, 150 concurrent users&lt;br /&gt;&lt;br /&gt;results&lt;br /&gt;&lt;br /&gt;Transactions:                  14718 hits&lt;br /&gt;Availability:                 100.00 %&lt;br /&gt;Elapsed time:                 180.61 secs&lt;br /&gt;Data transferred:              20.22 MB&lt;br /&gt;Response time:                  1.79 secs&lt;br /&gt;Transaction rate:             81.49 trans/sec&lt;br /&gt;Throughput:                     0.11 MB/sec&lt;br /&gt;Concurrency:                  146.12&lt;br /&gt;Successful transactions:      14718&lt;br /&gt;Failed transactions:              0&lt;br /&gt;Longest transaction:           18.39&lt;br /&gt;Shortest transaction:           0.00&lt;br /&gt;&lt;br /&gt;NOTE: “Transaction rate” down, and “Longest trans” time is up (from 50 concurrent users), but no failed transactions.&lt;br /&gt;&lt;br /&gt;NOTE: Attempting this test with lighttpd+fastcgi failed. The web server returned “500 – Internal Server Error”’s and absurd siege result numbers.&lt;br /&gt;&lt;br /&gt;Django, 150 concurrent users&lt;br /&gt;&lt;br /&gt;results&lt;br /&gt;&lt;br /&gt;Transactions:                  19903 hits&lt;br /&gt;Availability:                 100.00 %&lt;br /&gt;Elapsed time:                 180.78 secs&lt;br /&gt;Data transferred:              26.73 MB&lt;br /&gt;Response time:                  1.35 secs&lt;br /&gt;Transaction rate:            110.10 trans/sec&lt;br /&gt;Throughput:                     0.15 MB/sec&lt;br /&gt;Concurrency:                  148.32&lt;br /&gt;Successful transactions:       19903&lt;br /&gt;Failed transactions:             0&lt;br /&gt;Longest transaction:          20.03&lt;br /&gt;Shortest transaction:           0.01&lt;br /&gt;&lt;br /&gt;NOTE: “Transaction rate” down, and “Longest trans” time is up (from 50 concurrent users), but no failed transactions. Still the top performer.&lt;br /&gt;&lt;br /&gt;Summary&lt;br /&gt;&lt;br /&gt;Rails performed much better than Symfony. And Django performed much better than Rails.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-3580690992457967113?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/3580690992457967113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=3580690992457967113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/3580690992457967113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/3580690992457967113'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/08/framework-performance.html' title='Framework Performance'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-5989884421541820747</id><published>2007-08-09T01:59:00.000-07:00</published><updated>2007-08-09T02:27:20.114-07:00</updated><title type='text'>How to send SMTP mail in Ruby using ActionMailer (outside Rails)</title><content type='html'>&lt;div class="post-body"&gt;&lt;br /&gt;     &lt;p&gt;&lt;/p&gt;&lt;p&gt;Like most bits of Rails, &lt;a href="http://wiki.rubyonrails.org/rails/pages/ActionMailer"&gt;ActionMailer&lt;/a&gt; has an elegant and coder friendly interface. With a bit of set up, it's remarkably quick and easy to get running from vanilla Ruby outside of Rails.&lt;/p&gt; Recently I've needed to bulk email a bunch of files to an internal server for testing purposes. I've used ActionMailer inside Rails in the past, and wondered how hard it would actually be to get it up and running standalone. Sure, there are a stack of other mail gems and libraries in Ruby to do this, but they expose a lot of the internals of STMP and can be a pain to use. Definitely overkill when all you want to do is quickly fire off some mails from a script. (ActionMailer is actually built on top of a lot of those libraries, and acts like a coder friendly wrapper).&lt;br /&gt;&lt;br /&gt;&lt;p&gt;My requirements were pretty simple: Iterate over a bunch of files, and attach each one to a separate email and send to some address.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Here's what the code looks like for the ActionMailer class:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;font class="ident"&gt;require&lt;/font&gt; &lt;font class="punct"&gt;'&lt;/font&gt;&lt;font class="string"&gt;action_mailer&lt;/font&gt;&lt;font class="punct"&gt;'&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font class="constant"&gt;ActionMailer&lt;/font&gt;&lt;font class="punct"&gt;::&lt;/font&gt;&lt;font class="constant"&gt;Base&lt;/font&gt;&lt;font class="punct"&gt;.&lt;/font&gt;&lt;font class="ident"&gt;smtp_settings&lt;/font&gt; &lt;font class="punct"&gt;=&lt;/font&gt;&lt;br /&gt;&lt;font class="punct"&gt;{&lt;/font&gt;&lt;font class="symbol"&gt;:address&lt;/font&gt; &lt;font class="punct"&gt;=&amp;gt;&lt;/font&gt; &lt;font class="punct"&gt;'&lt;/font&gt;&lt;font class="string"&gt;smtp.example.com&lt;/font&gt;&lt;font class="punct"&gt;',&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font class="symbol"&gt;:domain&lt;/font&gt;  &lt;font class="punct"&gt;=&amp;gt;&lt;/font&gt; &lt;font class="punct"&gt;'&lt;/font&gt;&lt;font class="string"&gt;example.com&lt;/font&gt;&lt;font class="punct"&gt;'}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font class="keyword"&gt;class &lt;/font&gt;&lt;font class="class"&gt;FileMailer&lt;/font&gt; &lt;font class="punct"&gt;&amp;lt;&lt;/font&gt; &lt;font class="constant"&gt;ActionMailer&lt;/font&gt;&lt;font class="punct"&gt;::&lt;/font&gt;&lt;font class="constant"&gt;Base&lt;/font&gt;&lt;br /&gt;&lt;br /&gt; &lt;font class="keyword"&gt;def &lt;/font&gt;&lt;font class="method"&gt;file&lt;/font&gt;&lt;font class="punct"&gt;(&lt;/font&gt;&lt;font class="ident"&gt;to&lt;/font&gt;&lt;font class="punct"&gt;,&lt;/font&gt; &lt;font class="ident"&gt;sender&lt;/font&gt;&lt;font class="punct"&gt;,&lt;/font&gt; &lt;font class="ident"&gt;file_name&lt;/font&gt;&lt;font class="punct"&gt;,&lt;/font&gt; &lt;font class="ident"&gt;content_type&lt;/font&gt;&lt;font class="punct"&gt;,&lt;/font&gt; &lt;font class="ident"&gt;strip_ext&lt;/font&gt; &lt;font class="punct"&gt;=&lt;/font&gt; &lt;font class="constant"&gt;true&lt;/font&gt;&lt;font class="punct"&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;   &lt;font class="comment"&gt;# strip any directory fluff &lt;/font&gt;&lt;br /&gt;   &lt;font class="ident"&gt;subj&lt;/font&gt; &lt;font class="punct"&gt;=&lt;/font&gt; &lt;font class="ident"&gt;file_name&lt;/font&gt;&lt;font class="punct"&gt;.&lt;/font&gt;&lt;font class="ident"&gt;gsub&lt;/font&gt;&lt;font class="punct"&gt;(/&lt;/font&gt;&lt;font class="regex"&gt;.*&lt;font class="escape"&gt;\/&lt;/font&gt;&lt;/font&gt;&lt;font class="punct"&gt;/,'&lt;/font&gt;&lt;font class="string"&gt;&lt;/font&gt;&lt;font class="punct"&gt;')&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;   &lt;font class="comment"&gt;#remove the file extension if required&lt;/font&gt;&lt;br /&gt;   &lt;font class="ident"&gt;subj&lt;/font&gt; &lt;font class="punct"&gt;=&lt;/font&gt; &lt;font class="ident"&gt;subj&lt;/font&gt;&lt;font class="punct"&gt;.&lt;/font&gt;&lt;font class="ident"&gt;gsub&lt;/font&gt;&lt;font class="punct"&gt;(/&lt;/font&gt;&lt;font class="regex"&gt;&lt;font class="escape"&gt;\.\w&lt;/font&gt;*&lt;/font&gt;&lt;font class="punct"&gt;/,'&lt;/font&gt;&lt;font class="string"&gt;&lt;/font&gt;&lt;font class="punct"&gt;')&lt;/font&gt; &lt;font class="keyword"&gt;if&lt;/font&gt; &lt;font class="ident"&gt;strip_ext&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;   &lt;font class="comment"&gt;#standard ActionMailer message setup&lt;/font&gt;&lt;br /&gt;   &lt;font class="ident"&gt;recipients&lt;/font&gt;  &lt;font class="ident"&gt;to&lt;/font&gt;&lt;br /&gt;   &lt;font class="ident"&gt;from&lt;/font&gt;        &lt;font class="ident"&gt;sender&lt;/font&gt;&lt;br /&gt;   &lt;font class="ident"&gt;subject&lt;/font&gt;     &lt;font class="ident"&gt;subj&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;   &lt;font class="comment"&gt;#setting the body explicitly means we don't have to provide a separate template file&lt;/font&gt;&lt;br /&gt;   &lt;font class="ident"&gt;body&lt;/font&gt;        &lt;font class="punct"&gt;'&lt;/font&gt;&lt;font class="string"&gt;&lt;/font&gt;&lt;font class="punct"&gt;'&lt;/font&gt;&lt;br /&gt;  &lt;br /&gt;   &lt;font class="comment"&gt;#set up the attachment&lt;/font&gt;&lt;br /&gt;   &lt;font class="ident"&gt;attachment&lt;/font&gt;  &lt;font class="symbol"&gt;:content_type&lt;/font&gt; &lt;font class="punct"&gt;=&amp;gt;&lt;/font&gt; &lt;font class="ident"&gt;content_type&lt;/font&gt;&lt;font class="punct"&gt;,&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;               &lt;font class="symbol"&gt;:body&lt;/font&gt;         &lt;font class="punct"&gt;=&amp;gt;&lt;/font&gt; &lt;font class="constant"&gt;File&lt;/font&gt;&lt;font class="punct"&gt;.&lt;/font&gt;&lt;font class="ident"&gt;read&lt;/font&gt;&lt;font class="punct"&gt;(&lt;/font&gt;&lt;font class="ident"&gt;file_name&lt;/font&gt;&lt;font class="punct"&gt;),&lt;/font&gt;&lt;br /&gt;               &lt;font class="symbol"&gt;:filename&lt;/font&gt;     &lt;font class="punct"&gt;=&amp;gt;&lt;/font&gt; &lt;font class="ident"&gt;file_name&lt;/font&gt;&lt;font class="punct"&gt;.&lt;/font&gt;&lt;font class="ident"&gt;gsub&lt;/font&gt;&lt;font class="punct"&gt;(/&lt;/font&gt;&lt;font class="regex"&gt;.*&lt;font class="escape"&gt;\/&lt;/font&gt;&lt;/font&gt;&lt;font class="punct"&gt;/,'&lt;/font&gt;&lt;font class="string"&gt;&lt;/font&gt;&lt;font class="punct"&gt;')&lt;/font&gt;&lt;br /&gt;&lt;br /&gt; &lt;font class="keyword"&gt;end&lt;/font&gt;&lt;br /&gt;&lt;font class="keyword"&gt;end&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The only thing different from Rails, is that you need to explicitly configure the SMTP details via &lt;code&gt;ActionMailer::Base#smtp_settings&lt;/code&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;It's worth noting that you don't actually need to create a .rhtml view file if you specify the &lt;code&gt;body&lt;/code&gt; attribute of your message. I ran into a few blogs claiming there was no way to turn off the .rhtml requirement - a quick inspection of the ActionMailer source code proves otherwise. I'm sure it violates good MVC design, but if you're just throwing together a quick script, who cares. I've left the body in the example as an empty string (the server at the other end was only interested in the attachement), but you can specify whatever string you want there.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To use the mailer class, you just call it in the normal Rails ActionMailer manner. With ActionMailer you don't call the mail action method you implemented, but a generated method prefixed with &lt;code&gt;deliver_&lt;/code&gt;. So in our example, even though we implemented a method &lt;code&gt;file&lt;/code&gt;, we actually call &lt;code&gt;deliver_file&lt;/code&gt; (passing it the same parameters).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;font class="constant"&gt;FileMailer&lt;/font&gt;&lt;font class="punct"&gt;.&lt;/font&gt;&lt;font class="ident"&gt;deliver_file&lt;/font&gt;&lt;font class="punct"&gt;('&lt;/font&gt;&lt;font class="string"&gt;recipient@example.com&lt;/font&gt;&lt;font class="punct"&gt;','&lt;/font&gt;&lt;font class="string"&gt;julian@example.com&lt;/font&gt;&lt;font class="punct"&gt;','&lt;/font&gt;&lt;font class="string"&gt;my_file.csv&lt;/font&gt;&lt;font class="punct"&gt;','&lt;/font&gt;&lt;font class="string"&gt;text/csv&lt;/font&gt;&lt;font class="punct"&gt;')&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;     &lt;div style="clear: both;"&gt;&lt;/div&gt;&lt;br /&gt;   &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-5989884421541820747?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/5989884421541820747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=5989884421541820747' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/5989884421541820747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/5989884421541820747'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/08/how-to-send-smtp-mail-in-ruby-using_8944.html' title='How to send SMTP mail in Ruby using ActionMailer (outside Rails)'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-4701091991997631511</id><published>2007-08-06T03:48:00.000-07:00</published><updated>2007-08-06T03:51:54.408-07:00</updated><title type='text'></title><content type='html'>&lt;h2&gt;Schedule cron job to take back up of database.&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Step 1: Go to schedule cron job option on your server.&lt;br /&gt;   E.g. In textdrive go system&gt;scheduled cron job&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 2: Create on shell file to run command to take backup of database.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;e. g. daily_backup.sh&lt;br /&gt;&lt;br /&gt;Paste this commands in daily_backup.sh file.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# This file will run a backup of your desired MySQL database and&lt;br /&gt;&lt;br /&gt;# remove any backups older than 7 days.&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;# If you’d like to preserve backups for longer than a week, like say &lt;br /&gt;&lt;br /&gt;# 2 weeks, then set the '-mtime' value from '+7' to '+14'.&lt;br /&gt;&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;# NOTE: Make sure to create a 'backups' folder in the root of your &lt;br /&gt;&lt;br /&gt;# account and replace username, password, and database_name with &lt;br /&gt;&lt;br /&gt;# the appropriate values.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/usr/local/bin/mysqldump --opt --skip-add-locks database_name --user=username --password=password &gt; /users/home/username/backups/file_name_`date "+%Y-%m-%d"`.sql &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;cd /users/home/username/backups/ &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/usr/bin/find *.sql -mtime +7 –delete &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Keep this file in /users/home/username/script/ &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 3: Select create a new scheduled cron job option.&lt;br /&gt;&lt;br /&gt; Write in command field &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; /bin/sh /users/home/username/script/daily_backup.sh          &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 4: you can select option for when to execute select simple schedule and select daily option from drop down list. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Step 5: Save cron job.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-4701091991997631511?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/4701091991997631511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=4701091991997631511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/4701091991997631511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/4701091991997631511'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/08/schedule-cron-job-to-take-back-up-of.html' title=''/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4668750628274566893.post-6165496499704860155</id><published>2007-08-01T07:52:00.000-07:00</published><updated>2007-08-01T07:56:48.661-07:00</updated><title type='text'>How To pass Ruby Object to JavaScript function</title><content type='html'>If you want to pass ruby object to javascript function then do the followin steps...&lt;br /&gt;&lt;br /&gt;In Ruby Controller Action...&lt;br /&gt;def sample&lt;br /&gt;     ruby_variable = "Something"&lt;br /&gt;     ruby_variable.to_json&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;In Ruby RJS File&lt;br /&gt;&lt;br /&gt;page.call 'java_script_function_name', ruby_variable&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In JavaScript&lt;br /&gt;function java_script_function_name(java_script_variable){&lt;br /&gt;    alert(java_script_variable);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;java_script_variable comes in the form of array of javascript.&lt;br /&gt;Add comments if anyone wants&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4668750628274566893-6165496499704860155?l=bhushanahire.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://bhushanahire.blogspot.com/feeds/6165496499704860155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4668750628274566893&amp;postID=6165496499704860155' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/6165496499704860155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4668750628274566893/posts/default/6165496499704860155'/><link rel='alternate' type='text/html' href='http://bhushanahire.blogspot.com/2007/08/how-to-pass-ruby-object-to-javascript.html' title='How To pass Ruby Object to JavaScript function'/><author><name>Bhushan's Blog</name><uri>http://www.blogger.com/profile/11657024191712501839</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
