<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 <title>Dejan Simic</title>
 <link href="http://rors.org/articles.xml" rel="self"/>
 <link href="http://rors.org/"/>
 <updated>2012-02-21T18:46:17+01:00</updated>
 <id>http://rors.org/</id>
 <author>
   <name>Dejan Simic</name>
   <email>desimic@gmail.com</email>
 </author>

 
 <entry>
   <title>Don't wish it were easier</title>
   <link href="http://rors.org/2011/12/03/dont-wish-it-was-easier.html"/>
   <updated>2011-12-03T00:00:00+01:00</updated>
   <id>http://rors.org/2011/12/03/dont-wish-it-was-easier</id>
   <content type="html">&lt;blockquote&gt;
&lt;p&gt;“Don&amp;#8217;t wish it were easier; wish you were better. Don&amp;#8217;t wish for less problems; wish for more skills. Don&amp;#8217;t wish for less challenges; wish for more wisdom.” ~ Jim Rohn&lt;/p&gt;
&lt;/blockquote&gt;</content>
 </entry>
 
 <entry>
   <title>Compiling Ruby on a fresh Lion install</title>
   <link href="http://rors.org/2011/10/25/compiling-ruby-on-a-fresh-lion-install.html"/>
   <updated>2011-10-25T00:00:00+02:00</updated>
   <id>http://rors.org/2011/10/25/compiling-ruby-on-a-fresh-lion-install</id>
   <content type="html">&lt;p&gt;During the setup of my development environment on my new iMac, I&amp;#8217;ve run into these two issues while trying to install first Ruby (1.8.7-p352) inside &lt;a href='https://github.com/sstephenson/rbenv'&gt;rbenv&lt;/a&gt;:&lt;/p&gt;

&lt;h3 id='latest_xcode_42_does_not_install_nonllvm_gcc42_anymore'&gt;Latest XCode 4.2 does not install (non-llvm) gcc-4.2 anymore&lt;/h3&gt;

&lt;p&gt;I was getting this error:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;./configure: line 3211: /usr/bin/gcc-4.2: No such file or directory
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Setting the CC environment variable to use /usr/bin/gcc did fixed compiling, but Ruby was throwing segfaults.&lt;/p&gt;

&lt;p&gt;The real fix is to install the &lt;a href='https://github.com/kennethreitz/osx-gcc-installer'&gt;osx-gcc-installer&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id='os_x_provides_the_bsd_libedit_library_which_shadows_libreadline'&gt;OS X provides the BSD libedit library, which shadows libreadline&lt;/h3&gt;

&lt;p&gt;I was getting this error:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='text'&gt;readline.c: In function ‘username_completion_proc_call’:
readline.c:730: error: ‘username_completion_function’ undeclared (first use in this function)
readline.c:730: error: (Each undeclared identifier is reported only once
readline.c:730: error: for each function it appears in.)
make[1]: *** [readline.o] Error 1
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;#8217;ve fixed it by installing readline with &lt;a href='https://github.com/mxcl/homebrew'&gt;brew&lt;/a&gt; and configuring Ruby compilation to use it:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;brew install readline
&lt;span class='nv'&gt;$ CONFIGURE_OPTS&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;--with-readline-dir=$(brew --prefix readline)&amp;quot;&lt;/span&gt; rbenv install 1.8.7-p352
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Inline logging in Rails console</title>
   <link href="http://rors.org/2011/07/17/inline-logging-in-rails-console.html"/>
   <updated>2011-07-17T00:00:00+02:00</updated>
   <id>http://rors.org/2011/07/17/inline-logging-in-rails-console</id>
   <content type="html">&lt;p&gt;While trying out some code in console that deals with storage I find it really useful sometimes to have log output inline (and not in another window that tails the environment log) so I can see right there what&amp;#8217;s going on - generated SQL that hits database as well as interaction with the cache store.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s how you can set it up when needed:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='c1'&gt;# ActiveRecord - Rails 2&lt;/span&gt;
&lt;span class='no'&gt;ActiveRecord&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Base&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;connection&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;instance_variable_set&lt;/span&gt; &lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='vi'&gt;@logger&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='no'&gt;Logger&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='no'&gt;STDOUT&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

&lt;span class='c1'&gt;# ActiveRecord - Rails 3&lt;/span&gt;
&lt;span class='no'&gt;ActiveRecord&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Base&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;logger&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;Logger&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='no'&gt;STDOUT&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;

&lt;span class='c1'&gt;# Cache Store - Rails 2 &amp;amp; 3&lt;/span&gt;
&lt;span class='no'&gt;ActiveSupport&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Cache&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Store&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;logger&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;Logger&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='no'&gt;STDOUT&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;You can set this to run every time you&amp;#8217;re in console by adding this in environment.rb&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;irb&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='vg'&gt;$0&lt;/span&gt;
  &lt;span class='no'&gt;ActiveRecord&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Base&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;logger&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;Logger&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='no'&gt;STDOUT&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
  &lt;span class='no'&gt;ActiveSupport&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Cache&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Store&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;logger&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;Logger&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='no'&gt;STDOUT&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This is how it looks like in my console while I&amp;#8217;m developing my upcoming Rails plugin for caching:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;User&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;last&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;cached&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:profile&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
  &lt;span class='no'&gt;User&lt;/span&gt; &lt;span class='no'&gt;Load&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='mo'&gt;0005&lt;/span&gt;&lt;span class='mi'&gt;81&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='no'&gt;Row&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;   &lt;span class='no'&gt;SELECT&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='no'&gt;FROM&lt;/span&gt; &lt;span class='sb'&gt;`users`&lt;/span&gt; &lt;span class='no'&gt;ORDER&lt;/span&gt; &lt;span class='no'&gt;BY&lt;/span&gt; &lt;span class='n'&gt;users&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;id&lt;/span&gt; &lt;span class='no'&gt;DESC&lt;/span&gt; &lt;span class='no'&gt;LIMIT&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;
&lt;span class='no'&gt;Cache&lt;/span&gt; &lt;span class='n'&gt;miss&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='no'&gt;User&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;65&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='c1'&gt;#profile&lt;/span&gt;
  &lt;span class='no'&gt;Profile&lt;/span&gt; &lt;span class='no'&gt;Load&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='mo'&gt;000454&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt; &lt;span class='no'&gt;Row&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;   &lt;span class='no'&gt;SELECT&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='no'&gt;FROM&lt;/span&gt; &lt;span class='sb'&gt;`profiles`&lt;/span&gt; &lt;span class='no'&gt;WHERE&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='sb'&gt;`profiles`&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;user_id&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;65&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='no'&gt;LIMIT&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;
&lt;span class='no'&gt;Cache&lt;/span&gt; &lt;span class='n'&gt;write&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;will&lt;/span&gt; &lt;span class='n'&gt;save&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='mi'&gt;64&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt;&lt;span class='p'&gt;):&lt;/span&gt; &lt;span class='no'&gt;User&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;65&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='c1'&gt;#profile&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='c1'&gt;#&amp;lt;Profile id: 65, first_name: nil, last_name: nil, ...&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Sweet, though I&amp;#8217;d prefer if Cache Store would log raw commands to cache store (Redis, MemCache,&amp;#8230;) just like ActiveRecord logs SQL.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Kids, don't try this at work</title>
   <link href="http://rors.org/2011/07/09/kids-dont-try-this-at-work.html"/>
   <updated>2011-07-09T00:00:00+02:00</updated>
   <id>http://rors.org/2011/07/09/kids-dont-try-this-at-work</id>
   <content type="html">&lt;p&gt;A user is experiencing a nasty bug in your webapp in production that you can&amp;#8217;t reproduce locally, and you need to fix it super fast. What do you do?&lt;/p&gt;

&lt;h3 id='start_the_ssh_tunnel_to_your_production_database'&gt;Start the SSH tunnel to your production database&lt;/h3&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;ssh -f killerapp.db.example.com -L 3307:127.0.0.1:3306 -N
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;3306 is the port MySQL usually runs on. 3307 is the local port we&amp;#8217;re opening for the tunnel. We&amp;#8217;ll use SSH tunnel so that we don&amp;#8217;t have to deal with firewall poking or mysql granting.&lt;/p&gt;

&lt;h3 id='configure_your_app_to_use_the_tunnel_as_database'&gt;Configure your app to use the tunnel as database&lt;/h3&gt;

&lt;p&gt;Basically you just need to change connection settings to use port:3307 and host:127.0.0.1 and the login/password of course.&lt;/p&gt;

&lt;h3 id='have_some_haxor_backdoor'&gt;Have some haxor backdoor&lt;/h3&gt;

&lt;p&gt;This will allow you to login as a user without user password. It&amp;#8217;s best to make this code work only in development environment in case of the accidental commit - &lt;a href='http://www.tekgoblin.com/2011/06/20/dropbox-was-accessible-with-no-password-oops/'&gt;ring any bells?&lt;/a&gt; Here&amp;#8217;s one example in Rails: &lt;a href='http://mislav.uniqpath.com/rails/haxor-backdoor-in-development'&gt;http://mislav.uniqpath.com/rails/haxor-backdoor-in-development&lt;/a&gt;. Adjust it to work with your system and your use case.&lt;/p&gt;

&lt;h3 id='handle_subdomains_if_any'&gt;Handle subdomains if any&lt;/h3&gt;

&lt;p&gt;If your app is using subdomains you should already be using &lt;a href='http://tbaggery.com/2010/03/04/smack-a-ho-st.html'&gt;Tim Pope&amp;#8217;s smackaho.st&lt;/a&gt; which saves you the trouble of messing around with /etc/hosts&lt;/p&gt;

&lt;h3 id='be_fucking_careful'&gt;Be fucking careful!&lt;/h3&gt;

&lt;p&gt;Your local code will now work with production data and you&amp;#8217;ll be able to login as a user which means you should really be careful about what you do with data.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>The opposite</title>
   <link href="http://rors.org/2011/01/26/the-opposite.html"/>
   <updated>2011-01-26T00:00:00+01:00</updated>
   <id>http://rors.org/2011/01/26/the-opposite</id>
   <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;a href='http://sivers.org/jaddr'&gt;Derek Sivers&lt;/a&gt;: &amp;#8220;In China there are doctors that believe that their job is to keep you healthy. So any month you&amp;#8217;re healthy - you pay them, any month you&amp;#8217;re sick - you don&amp;#8217;t have to pay them, they job is to get you healthy again so they can get paid again. It&amp;#8217;s kind of cool that they get rich when you&amp;#8217;re healthy, not sick.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;</content>
 </entry>
 
 <entry>
   <title>Resolve all errors in Hoptoad for free</title>
   <link href="http://rors.org/2011/01/23/resolve-all-errors-in-hoptoad-for-free.html"/>
   <updated>2011-01-23T00:00:00+01:00</updated>
   <id>http://rors.org/2011/01/23/resolve-all-errors-in-hoptoad-for-free</id>
   <content type="html">&lt;p&gt;Apparently one needs a paid account to resolve all errors in &lt;a href='http://hoptoadapp.com'&gt;Hoptoad&lt;/a&gt;. Fortunately there&amp;#8217;s an &lt;a href='http://help.hoptoadapp.com/kb/api-2/api-overview'&gt;API&lt;/a&gt; for the rest of us cheap bastards. Bellow is the Rake task that saves me $5 per month. Note that API doesn&amp;#8217;t have bulk-resolve operation as I&amp;#8217;ve expected, so time of execution depends directly on the number of unresolved errors.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;httparty&amp;#39;&lt;/span&gt;

&lt;span class='n'&gt;namespace&lt;/span&gt; &lt;span class='ss'&gt;:hoptoad&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
  &lt;span class='n'&gt;task&lt;/span&gt; &lt;span class='ss'&gt;:resolve_all&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
    
    &lt;span class='c1'&gt;# your credentials&lt;/span&gt;
    &lt;span class='n'&gt;subdomain&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;killerapp&amp;#39;&lt;/span&gt;
    &lt;span class='n'&gt;auth_token&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;ca140f0d8076e0f4e09237d0f45c70d0f4fc56e3&amp;#39;&lt;/span&gt;

    &lt;span class='n'&gt;url&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;http://&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;subdomain&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;.hoptoadapp.com/errors.xml?auth_token=&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;auth_token&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;
    &lt;span class='k'&gt;while&lt;/span&gt; &lt;span class='n'&gt;errors&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;HTTParty&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;get&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;url&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;groups&amp;#39;&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
      &lt;span class='n'&gt;errors&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;each&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
        &lt;span class='no'&gt;HTTParty&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;put&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;url&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;gsub&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;.xml&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;/&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;e&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;),&lt;/span&gt; &lt;span class='ss'&gt;:headers&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;Content-length&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;},&lt;/span&gt; &lt;span class='ss'&gt;:query&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='ss'&gt;:group&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='ss'&gt;:resolved&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='kp'&gt;true&lt;/span&gt;&lt;span class='p'&gt;}})&lt;/span&gt;
      &lt;span class='k'&gt;end&lt;/span&gt;
    &lt;span class='k'&gt;end&lt;/span&gt;
  &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Release process</title>
   <link href="http://rors.org/2010/11/11/release-process.html"/>
   <updated>2010-11-11T00:00:00+01:00</updated>
   <id>http://rors.org/2010/11/11/release-process</id>
   <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;a href='http://itc.conversationsnetwork.org/shows/detail301.html'&gt;Kent Beck&lt;/a&gt;: &amp;#8220;I remember hearing a description of the release process at Microsoft, and someone likened it to jello. You got this software and it&amp;#8217;s like jello. And people are making changes and it&amp;#8217;s shaking and it&amp;#8217;s shaking, and you think you&amp;#8217;re getting close but the software is still shaking. And then it stops shaking just for a second and that&amp;#8217;s when you ship it!&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;</content>
 </entry>
 
 <entry>
   <title>espeak-ruby</title>
   <link href="http://rors.org/2010/10/21/espeak-ruby.html"/>
   <updated>2010-10-21T00:00:00+02:00</updated>
   <id>http://rors.org/2010/10/21/espeak-ruby</id>
   <content type="html">&lt;p&gt;espeak-ruby is a small Ruby API for utilizing &lt;a href='http://espeak.sourceforge.net/'&gt;espeak&lt;/a&gt; and &lt;a href='http://lame.sourceforge.net/'&gt;lame&lt;/a&gt; to create Text-To-Speech mp3 files.&lt;/p&gt;

&lt;h2 id='demo'&gt;Demo&lt;/h2&gt;

&lt;p&gt;Tweak options, enter some text, hit enter and listen!&lt;/p&gt;
&lt;form onsubmit='return false;' action=''&gt;
  &lt;select name='v' id='v'&gt;&lt;option selected='selected' value='en'&gt;English&lt;/option&gt; 
  &lt;option value='de'&gt;German&lt;/option&gt; 
  &lt;option value='fr'&gt;French&lt;/option&gt;
  &lt;option value='es'&gt;Spanish&lt;/option&gt;
  &lt;option value='ro'&gt;Romanian&lt;/option&gt;
  &lt;option value='sr'&gt;Serbian&lt;/option&gt;&lt;/select&gt; 

  &lt;select name='p' id='p'&gt;&lt;option value='0'&gt;low pitch&lt;/option&gt; 
  &lt;option selected='selected' value='40'&gt;midium pitch&lt;/option&gt; 
  &lt;option value='99'&gt;high pitch&lt;/option&gt;&lt;/select&gt; 

  &lt;select name='s' id='s'&gt;&lt;option value='80'&gt;slow&lt;/option&gt; 
  &lt;option selected='selected' value='140'&gt;normal&lt;/option&gt; 
  &lt;option value='370'&gt;fast&lt;/option&gt;&lt;/select&gt; 

  &lt;input name='t' id='t' type='text' /&gt; 
&lt;/form&gt;&lt;style type='text/css'&gt;
#t {
  width:320px;
}

form {
  padding: 10px;
  margin-top:0;
}

input {
  padding: 3px;
}
&lt;/style&gt;&lt;script type='text/javascript'&gt;
  function play() {
    params = 'text=' + $('#t').val() + '&amp;voice=' + $('#v').val() + '&amp;pitch=' + $('#p').val() + '&amp;speed=' + $('#s').val();
    soundManager.createSound({id: params, url: 'http://espeak.rors.org/tts?' + params}).play();
    $('#t').focus();
  }

  $('#t').keyup(function(e) {
    if (e.keyCode == 13) {
      play();
    }
  });

  $(function() {
    $('#t').focus();
  });
//]]&gt;
&lt;/script&gt;
&lt;h2 id='example_usage'&gt;Example usage&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;espeak-ruby&amp;#39;&lt;/span&gt;

&lt;span class='kp'&gt;include&lt;/span&gt; &lt;span class='no'&gt;ESpeak&lt;/span&gt;

&lt;span class='c1'&gt;# Creates hello.mp3 file in working directory&lt;/span&gt;
&lt;span class='n'&gt;espeak&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;hello.mp3&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:text&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; 

&lt;span class='c1'&gt;# Creates /home/espeak/hello-de.mp3 file&lt;/span&gt;
&lt;span class='n'&gt;espeak&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;/home/espeak/hello-de.mp3&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:text&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Hallo Welt&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:voice&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;de&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='features'&gt;Features&lt;/h2&gt;

&lt;p&gt;Currently, only subset of espeak features is supported, but the important ones are there:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='ss'&gt;:voice&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;en&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;   &lt;span class='c1'&gt;# use voice file of this name from espeak-data/voices&lt;/span&gt;
&lt;span class='ss'&gt;:pitch&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;50&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt;     &lt;span class='c1'&gt;# pitch adjustment, 0 to 99&lt;/span&gt;
&lt;span class='ss'&gt;:speed&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;170&lt;/span&gt;     &lt;span class='c1'&gt;# speed in words per minute, 80 to 370&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;These are default values, and they can be easily overriden:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;espeak&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;zdravo.mp3&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; 
  &lt;span class='ss'&gt;:text&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Zdravo svete&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; 
  &lt;span class='ss'&gt;:voice&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;sr&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:pitch&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;90&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:speed&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;200&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='sinatra_example'&gt;Sinatra example&lt;/h2&gt;

&lt;p&gt;If you&amp;#8217;ve been wondering about the demo above, it&amp;#8217;s powered by this simple Text-To-Speech &lt;a href='https://github.com/dejan/espeak-http'&gt;micro webapp&lt;/a&gt; in Sinatra:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;  &lt;span class='sx'&gt;%w(rubygems &lt;/span&gt;
&lt;span class='sx'&gt;     sinatra &lt;/span&gt;
&lt;span class='sx'&gt;     espeak-ruby&lt;/span&gt;
&lt;span class='sx'&gt;     digest/sha1)&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;each&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;l&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='n'&gt;l&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;

  &lt;span class='kp'&gt;include&lt;/span&gt; &lt;span class='no'&gt;ESpeak&lt;/span&gt;

  &lt;span class='n'&gt;get&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;/tts&amp;#39;&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
    &lt;span class='n'&gt;filename&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;tmp/&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='no'&gt;Digest&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;SHA1&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;hexdigest&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;params&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;to_s&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt;.mp3&amp;quot;&lt;/span&gt;
    &lt;span class='n'&gt;espeak&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;filename&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;params&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;200&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Content-type&amp;#39;&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;audio/mpeg&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;},&lt;/span&gt; &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;read&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;filename&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
  &lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='install'&gt;Install&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;gem&lt;/span&gt; &lt;span class='n'&gt;install&lt;/span&gt; &lt;span class='n'&gt;espeak&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='n'&gt;ruby&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;In order to use the gem you must have &lt;a href='http://espeak.sourceforge.net'&gt;espeak&lt;/a&gt; and &lt;a href='http://lame.sourceforge.net/index.php'&gt;lame&lt;/a&gt; installed. On Ubuntu Linux, it&amp;#8217;s easy as:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;sudo apt-get install lame espeak
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='source'&gt;Source&lt;/h2&gt;

&lt;p&gt;Find it on GitHub: &lt;a href='https://github.com/dejan/espeak-ruby'&gt;https://github.com/dejan/espeak-ruby&lt;/a&gt;&lt;/p&gt;

&lt;h2 id='credits'&gt;Credits&lt;/h2&gt;

&lt;p&gt;Author: &lt;a href='https://github.com/dejan'&gt;Dejan Simic&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>auto_html</title>
   <link href="http://rors.org/2010/08/15/auto_html.html"/>
   <updated>2010-08-15T00:00:00+02:00</updated>
   <id>http://rors.org/2010/08/15/auto_html</id>
   <content type="html">&lt;p&gt;auto_html is a Rails extension for transforming URLs to appropriate resource (image, link, YouTube, Vimeo video,&amp;#8230;). It&amp;#8217;s the perfect choice if you don&amp;#8217;t want to bother visitors with rich HTML editor or markup code, but you still want to allow them to embed video, images, links and more on your site, purely by pasting URL.&lt;/p&gt;

&lt;h2 id='demo'&gt;Demo&lt;/h2&gt;
&lt;form method='post' action='/comments' id='comment_form'&gt;
&lt;h3&gt;Type or paste URLs&lt;/h3&gt;
&lt;span id='examples'&gt;
   Examples: &lt;a href='http://farm4.static.flickr.com/3171/2622922160_afc2ca4cff.jpg' title='click to copy/paste' onclick='return false'&gt;image&lt;/a&gt;, &lt;a href='http://www.dailymotion.com/relevance/search/fleet+foxes/video/x8bob0_fleet-foxes-mykonos_music' title='click to copy/paste' onclick='return false'&gt;dailymotion&lt;/a&gt;, &lt;a href='http://www.youtube.com/watch?v=8JMO-hxYRq4' title='click to copy/paste' onclick='return false'&gt;youtube&lt;/a&gt;, &lt;a href='http://rubyonrails.org' title='click to copy/paste' onclick='return false'&gt;plain page&lt;/a&gt;, &lt;a href='http://video.google.com/videoplay?docid=7442132741322615356' title='click to copy/paste' onclick='return false'&gt;google video&lt;/a&gt;, &lt;a href='http://vimeo.com/1747316' title='click to copy/paste' onclick='return false'&gt;vimeo&lt;/a&gt;.
&lt;/span&gt;

&lt;textarea name='comment[body]' id='comment_body' rows='20' cols='40'&gt; &lt;/textarea&gt;

&lt;h3&gt;Code&lt;/h3&gt;
&lt;div id='code'&gt; &lt;/div&gt;

&lt;h3&gt;Preview&lt;/h3&gt;
&lt;div id='preview'&gt; &lt;/div&gt;
&lt;/form&gt;&lt;style type='text/css'&gt;
#comment_body {
  width:580px;
  height:50px;
}

form {
  padding: 10px;
}

form p {
  border: none;
  margin: 0;
  padding: 5px;
}

form h3 {
  margin-left: 0;
  margin-right: 0;
}

#code {
  padding: 5px 10px;
  overflow: auto;
}

#preview {
  padding: 0;
}

#code, #preview {
  background: #F0E5D3;
}
&lt;/style&gt;&lt;script type='text/javascript'&gt;
function load(request) {
  $('#code').text(request);
  $('#preview').html(request);
}

function preview(value) {
  $.getJSON(&quot;http://auto_html.rors.org/comments/preview?callback=?&quot;, value, function(data){
    load(data);
  });
}

function previewComment() {
  preview({'t':$('#comment_body').val()});
}

$('#examples a').click(function() {
  $('#comment_body').focus(); 
  $('#comment_body').val( $(this).attr('href'));
  previewComment();
});

$(function () { 
  $(&quot;#comment_body&quot;).focus();
  previewComment();
});

$('#comment_form').delayedObserver(1, function(element, value) { previewComment() })
&lt;/script&gt;
&lt;h2 id='example_usage'&gt;Example usage&lt;/h2&gt;

&lt;p&gt;Transforming string with text and URLs is done with &lt;em&gt;auto_html&lt;/em&gt; method:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;inlcude&lt;/span&gt; &lt;span class='no'&gt;AutoHtml&lt;/span&gt;

&lt;span class='n'&gt;auto_html&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;Hey! Checkout out: http://vukajlija.com&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt; &lt;span class='n'&gt;simple_format&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='n'&gt;link&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:target&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;blank&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&amp;lt;p&amp;gt;Hey! Checkout out: &amp;lt;a href=&amp;#39;http://vukajlija.com&amp;#39; target=&amp;#39;blank&amp;#39;&amp;gt;http://vukajlija.com&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;You&amp;#8217;ll probably have user input stored in model, so it&amp;#8217;s a good place to automate and even store this conversion for performance reason. This is done with &lt;em&gt;auto_html_for&lt;/em&gt; method. Let&amp;#8217;s say you have model Comment with attribute body. Create another column in table Comments called body_html (this is optional, but recommended for performance reasons). Now have something like this:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Comment&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='no'&gt;ActiveRecord&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Base&lt;/span&gt;
  &lt;span class='n'&gt;auto_html_for&lt;/span&gt; &lt;span class='ss'&gt;:body&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
    &lt;span class='n'&gt;html_escape&lt;/span&gt;
    &lt;span class='n'&gt;image&lt;/span&gt;
    &lt;span class='n'&gt;youtube&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:width&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;400&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:height&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;250&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='n'&gt;link&lt;/span&gt; &lt;span class='ss'&gt;:target&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;_blank&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:rel&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;nofollow&amp;quot;&lt;/span&gt;
    &lt;span class='n'&gt;simple_format&lt;/span&gt;
  &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;#8230; and you&amp;#8217;ll have this behaviour:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='no'&gt;Comment&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;create&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:body&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Hey check out this cool video: http://www.youtube.com/watch?v=WdsGihou8J4&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;  
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='c1'&gt;#&amp;lt;Comment id: 123, body: &amp;#39;Hey check out this cool video: http://www.youtube.com/watch?v=WdsGihou8J4&amp;#39;, body_html: &amp;#39;&amp;lt;p&amp;gt;Hey check out this cool video: &amp;lt;iframe class=&amp;quot;youtube-player&amp;quot; type=&amp;quot;text/html&amp;quot; width=&amp;quot;587&amp;quot; height=&amp;quot;350&amp;quot; src=&amp;quot;http://www.youtube.com/embed/WdsGihou8J4&amp;quot; frameborder=&amp;quot;0&amp;quot;&amp;gt; &amp;lt;br /&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/p&amp;gt;&amp;#39;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Note that order of invoking filters is important, ie. you want html_escape as first and link amongst last, so that it doesn&amp;#8217;t transform youtube URL to plain link.&lt;/p&gt;

&lt;p&gt;Now all you have to do is to display it in template without escaping, since plugin took care of that:&lt;/p&gt;

&lt;p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='sx'&gt;% for &lt;/span&gt;&lt;span class='n'&gt;comment&lt;/span&gt; &lt;span class='k'&gt;in&lt;/span&gt; &lt;span class='vi'&gt;@comments&lt;/span&gt; &lt;span class='sx'&gt;%&amp;gt;&lt;/span&gt;
&lt;span class='sx'&gt;   &amp;lt;li&amp;gt;&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;%=&lt;/span&gt; &lt;span class='n'&gt;comment&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;body_html&lt;/span&gt; &lt;span class='sx'&gt;%&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='sx'&gt;% end &lt;/span&gt;&lt;span class='o'&gt;%&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;If you need to display preview, no problem. Have something like this as action in your controller:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;preview&lt;/span&gt;
  &lt;span class='n'&gt;comment&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;Comment&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;params&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:comment&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
  &lt;span class='n'&gt;render&lt;/span&gt; &lt;span class='ss'&gt;:text&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;comment&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;body_html&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Plugin is highly customizable, and you can easily create new filters that will transform user input any way you like. For instance, this is the image filter that comes bundled with plugin:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='no'&gt;AutoHtml&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;add_filter&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:image&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;text&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
  &lt;span class='n'&gt;text&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;gsub&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='sr'&gt;/http:\/\/.+\.(jpg|jpeg|bmp|gif|png)(\?\S+)?/i&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;match&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
    &lt;span class='sx'&gt;%|&amp;lt;img src=&amp;quot;&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='n'&gt;match&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='sx'&gt;&amp;quot; alt=&amp;quot;&amp;quot;/&amp;gt;|&lt;/span&gt;
  &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='nonactiverecord_models'&gt;Non-ActiveRecord models&lt;/h2&gt;

&lt;p&gt;AutoHtml uses standard ActiveModel API, which means that you can include AutoHtmlFor module (that automates transformation of the field) in any non-ActiveRecord model that uses ActiveModel. Here&amp;#8217;s working &lt;a href='http://mongoid.org/'&gt;mongoid&lt;/a&gt; example:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Post&lt;/span&gt;
  &lt;span class='kp'&gt;include&lt;/span&gt; &lt;span class='no'&gt;Mongoid&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Document&lt;/span&gt;
  &lt;span class='kp'&gt;include&lt;/span&gt; &lt;span class='no'&gt;AutoHtmlFor&lt;/span&gt;

  &lt;span class='n'&gt;field&lt;/span&gt; &lt;span class='ss'&gt;:body&lt;/span&gt;

  &lt;span class='n'&gt;auto_html_for&lt;/span&gt; &lt;span class='ss'&gt;:body&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
    &lt;span class='n'&gt;simple_format&lt;/span&gt;
    &lt;span class='n'&gt;link&lt;/span&gt;
  &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='rake_and_capistrano_tasks'&gt;Rake and Capistrano tasks&lt;/h2&gt;

&lt;p&gt;AutoHtml has a Rake task for rebuilding cached in DB column values. Usage:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;rake&lt;/span&gt; &lt;span class='n'&gt;auto_html&lt;/span&gt;&lt;span class='ss'&gt;:rebuild&lt;/span&gt; &lt;span class='no'&gt;CLASS&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='n'&gt;yourmodel&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Where &amp;#8216;yourmodel&amp;#8217; is the name of model which values you want to rebuild.&lt;/p&gt;

&lt;p&gt;If you want to run it on remote server, just add this to your deploy.rb:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;auto_html/capistrano&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now you can run:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;cap&lt;/span&gt; &lt;span class='n'&gt;auto_html&lt;/span&gt;&lt;span class='ss'&gt;:rebuild&lt;/span&gt; &lt;span class='no'&gt;CLASS&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='n'&gt;yourmodel&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='bundled_filters'&gt;Bundled filters&lt;/h2&gt;

&lt;p&gt;For filter list and options they support check: &lt;a href='http://github.com/dejan/auto_html/tree/master/lib/auto_html/filters'&gt;http://github.com/dejan/auto_html/tree/master/lib/auto_html/filters&lt;/a&gt;&lt;/p&gt;

&lt;h2 id='install'&gt;Install&lt;/h2&gt;

&lt;p&gt;Specify the gem in Gemfile of the project&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;gem&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;auto_html&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='source'&gt;Source&lt;/h2&gt;

&lt;p&gt;As everything these days it&amp;#8217;s on github: &lt;a href='http://github.com/dejan/auto_html'&gt;http://github.com/dejan/auto_html&lt;/a&gt;&lt;/p&gt;

&lt;h2 id='credits'&gt;Credits&lt;/h2&gt;

&lt;p&gt;Author: &lt;a href='http://github.com/dejan'&gt;Dejan Simic&lt;/a&gt;&lt;br /&gt; Contributors: &lt;a href='https://github.com/crossblaim'&gt;Claudio Perez Gamayo&lt;/a&gt;, &lt;a href='https://github.com/mattpolito'&gt;Matt Polito&lt;/a&gt;, &lt;a href='https://github.com/mysmallidea'&gt;Ryan Heneise&lt;/a&gt;, &lt;a href='https://github.com/fabrikagency'&gt;Caleb Wright&lt;/a&gt;, &lt;a href='https://github.com/robustdj'&gt;Derrick Camerino&lt;/a&gt;, &lt;a href='https://github.com/danielweinmann'&gt;Daniel Weinmann&lt;/a&gt;, &lt;a href='https://github.com/ebeigarts'&gt;Edgars Beigarts&lt;/a&gt;, &lt;a href='https://github.com/henningthies'&gt;Henning Thies&lt;/a&gt;, &lt;a href='https://github.com/rbq'&gt;rbq&lt;/a&gt;, &lt;a href='https://github.com/kirs'&gt;Kir Shatrov&lt;/a&gt; (&lt;a href='https://github.com/evrone'&gt;Evrone Company&lt;/a&gt;), &lt;a href='https://github.com/tinoutinou'&gt;Demange Anthony&lt;/a&gt;, &lt;a href='https://github.com/hinrik'&gt;Hinrik Örn Sigurðsson&lt;/a&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Yesterday's Weather</title>
   <link href="http://rors.org/2010/07/03/yesterdays-weather.html"/>
   <updated>2010-07-03T00:00:00+02:00</updated>
   <id>http://rors.org/2010/07/03/yesterdays-weather</id>
   <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;a href='http://sivers.org/book/Pomodoro'&gt;Pomodoro Technique Illustrated Book&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;A national weather service spent a gigantic amount of money on a new forecast system. All the emerging technology was included, and it had an accuracy rate of almost 70 percent.&lt;/p&gt;

&lt;p&gt;Then a clever person challenged the super machine with a much simpler algorithm. It was called Yesterday’s Weather, and it said, &amp;#8220;Tomorrow will be like today.&amp;#8221; Guess what? It had the same accuracy as the super machine.&lt;/p&gt;
&lt;/blockquote&gt;</content>
 </entry>
 
 <entry>
   <title>Distinct values in Rails</title>
   <link href="http://rors.org/2010/05/23/distinct-values-in-rails.html"/>
   <updated>2010-05-23T00:00:00+02:00</updated>
   <id>http://rors.org/2010/05/23/distinct-values-in-rails</id>
   <content type="html">&lt;p&gt;First of all don&amp;#8217;t do this http://snipplr.com/view/21497/distinct-in-rails. I&amp;#8217;m not even linking it since somehow that&amp;#8217;s already ranked #5 for &amp;#8220;rails distinct&amp;#8221; on Google.&lt;/p&gt;

&lt;p&gt;One way is to use :select option in ActiveRecord finder.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;User&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;all&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:select&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;distinct(ip)&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='c1'&gt;#&amp;lt;User ip: &amp;quot;80.74.172.18&amp;quot;&amp;gt;, #&amp;lt;User ip: &amp;quot;80.74.172.13&amp;quot;&amp;gt;, ... ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;As you can see this will give you ActiveRecords with only that attribute initialized. Often you need to do something with those distinct values (and not just display them) so it&amp;#8217;s more suitable to have &lt;em&gt;values&lt;/em&gt; (instead of ActiveRecords) in an array. Use &lt;a href='http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#M001932'&gt;select values&lt;/a&gt; for that:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;User&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;connection&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;select_values&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;select distinct(ip) from users&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;80.74.172.18&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;80.74.172.13&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;.&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='o'&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>10 Rails console tricks</title>
   <link href="http://rors.org/2009/12/20/10-rails-console-tricks.html"/>
   <updated>2009-12-20T00:00:00+01:00</updated>
   <id>http://rors.org/2009/12/20/10-rails-console-tricks</id>
   <content type="html">&lt;h2 id='invoking_helper_methods'&gt;Invoking helper methods&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;helper&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;number_to_currency&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;123.45&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='method_definition_finder_irb'&gt;Method definition finder (irb)&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;helper&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;method&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:truncate&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='c1'&gt;#&amp;lt;Method: ActionView::Base(ActionView::Helpers::TextHelper)#truncate&amp;gt;&lt;/span&gt;

&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;method&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:camelize&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='c1'&gt;#&amp;lt;Method: String(ActiveSupport::CoreExtensions::String::Inflections)#camelize&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='method_finder_irb'&gt;Method finder (irb)&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;gem install what_methods
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='nb'&gt;require&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;what_methods&amp;#39;&lt;/span&gt;
&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;foo &amp;quot;&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;what?&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;
&lt;span class='s2'&gt;&amp;quot;foo &amp;quot;&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;chop!&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;
&lt;span class='s2'&gt;&amp;quot;foo &amp;quot;&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;chop&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;
&lt;span class='s2'&gt;&amp;quot;foo &amp;quot;&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;strip!&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;
&lt;span class='s2'&gt;&amp;quot;foo &amp;quot;&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;strip&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;
&lt;span class='s2'&gt;&amp;quot;foo &amp;quot;&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;rstrip!&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;
&lt;span class='s2'&gt;&amp;quot;foo &amp;quot;&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;rstrip&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;chop!&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;chop&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;strip!&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;strip&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;rstrip!&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;rstrip&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='method_lookup_irb'&gt;Method lookup (irb)&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;methods&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;grep&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='sr'&gt;/case/&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;sort&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;camelcase&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;casecmp&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;downcase&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;downcase!&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;swapcase&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;swapcase!&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;titlecase&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;upcase&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;upcase!&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='avoid_screenfuls_of_objects_irb'&gt;Avoid screenfuls of objects (irb)&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;people&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;Person&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;all&lt;/span&gt;&lt;span class='p'&gt;;&lt;/span&gt; &lt;span class='kp'&gt;nil&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='kp'&gt;nil&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='rollback_database_modifications_on_exit'&gt;Rollback database modifications on exit&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='nv'&gt;$ &lt;/span&gt;./script/console --sandbox
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='last_expression_irb'&gt;Last expression (irb)&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;Person&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;first&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='c1'&gt;#&amp;lt;Person id: 1, first_name: &amp;quot;Dejan&amp;quot; ... &amp;gt;&lt;/span&gt;
&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;_&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;first_name&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Dejan&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='reload_code_changes'&gt;Reload code changes&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;reload!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='better_object_format_irb'&gt;Better object format (irb)&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;y&lt;/span&gt; &lt;span class='no'&gt;User&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;first&lt;/span&gt;
&lt;span class='o'&gt;---&lt;/span&gt; &lt;span class='o'&gt;!&lt;/span&gt;&lt;span class='n'&gt;ruby&lt;/span&gt;&lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='n'&gt;object&lt;/span&gt;&lt;span class='ss'&gt;:User&lt;/span&gt; 
&lt;span class='n'&gt;attributes&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; 
  &lt;span class='n'&gt;hashed_password&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;123456789&lt;/span&gt;&lt;span class='n'&gt;cde83xa9b86e36e4627360&lt;/span&gt;
  &lt;span class='n'&gt;last_seen_at&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;2009&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;12&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;09&lt;/span&gt; &lt;span class='mi'&gt;13&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='mi'&gt;16&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='mi'&gt;44&lt;/span&gt;
  &lt;span class='n'&gt;username&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='n'&gt;dejan&lt;/span&gt;
  &lt;span class='nb'&gt;id&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;1&amp;quot;&lt;/span&gt;
  &lt;span class='n'&gt;created_at&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='mi'&gt;2007&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mo'&gt;01&lt;/span&gt;&lt;span class='o'&gt;-&lt;/span&gt;&lt;span class='mi'&gt;14&lt;/span&gt; &lt;span class='mi'&gt;17&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='mi'&gt;30&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt;&lt;span class='mo'&gt;00&lt;/span&gt;
&lt;span class='n'&gt;attributes_cache&lt;/span&gt;&lt;span class='p'&gt;:&lt;/span&gt; &lt;span class='p'&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='scriptconsole_logging'&gt;script/console logging&lt;/h2&gt;

&lt;p&gt;You need &lt;a href='http://rors.org/2011/07/17/inline-logging-in-rails-console.html'&gt;this&lt;/a&gt;.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;User&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;cached&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:first&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='o'&gt;==&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;Got&lt;/span&gt; &lt;span class='no'&gt;User&lt;/span&gt;&lt;span class='ss'&gt;:first&lt;/span&gt; &lt;span class='n'&gt;from&lt;/span&gt; &lt;span class='n'&gt;cache&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='mi'&gt;10173&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
  &lt;span class='no'&gt;User&lt;/span&gt; &lt;span class='no'&gt;Load&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;300&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='n'&gt;ms&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;   &lt;span class='no'&gt;SELECT&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='no'&gt;FROM&lt;/span&gt; &lt;span class='sb'&gt;`users`&lt;/span&gt; &lt;span class='no'&gt;LIMIT&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;
&lt;span class='o'&gt;==&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;Set&lt;/span&gt; &lt;span class='no'&gt;User&lt;/span&gt;&lt;span class='ss'&gt;:first&lt;/span&gt; &lt;span class='n'&gt;to&lt;/span&gt; &lt;span class='n'&gt;cache&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='mo'&gt;01512&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='c1'&gt;#&amp;lt;User id: 1, username: &amp;quot;dejan&amp;quot;, ... &amp;gt;&lt;/span&gt;

&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;User&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;cached&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:first&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='o'&gt;==&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;Got&lt;/span&gt; &lt;span class='no'&gt;User&lt;/span&gt;&lt;span class='ss'&gt;:first&lt;/span&gt; &lt;span class='n'&gt;from&lt;/span&gt; &lt;span class='n'&gt;cache&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='mo'&gt;00061&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='c1'&gt;#&amp;lt;User id: 1, username: &amp;quot;dejan&amp;quot;, ... &amp;gt;&lt;/span&gt;

&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;User&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;expire_cache&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:first&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='o'&gt;==&amp;gt;&lt;/span&gt; &lt;span class='no'&gt;Deleted&lt;/span&gt; &lt;span class='no'&gt;User&lt;/span&gt;&lt;span class='ss'&gt;:first&lt;/span&gt; &lt;span class='n'&gt;from&lt;/span&gt; &lt;span class='n'&gt;cache&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='mo'&gt;0005&lt;/span&gt;&lt;span class='mi'&gt;9&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='kp'&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='links'&gt;LINKS&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://stackoverflow.com/questions/123494/whats-your-favourite-irb-trick'&gt;http://stackoverflow.com/questions/123494/whats-your-favourite-irb-trick&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://slash7.com/2006/12/21/secrets-of-the-rails-console-ninjas'&gt;http://slash7.com/2006/12/21/secrets-of-the-rails-console-ninjas&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://drnicwilliams.com/2006/10/12/my-irbrc-for-consoleirb'&gt;http://drnicwilliams.com/2006/10/12/my-irbrc-for-consoleirb&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://railscasts.com/episodes/48-console-tricks'&gt;http://railscasts.com/episodes/48-console-tricks&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://pablotron.org/software/wirble'&gt;http://pablotron.org/software/wirble&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>Accountability</title>
   <link href="http://rors.org/2009/02/15/accountability.html"/>
   <updated>2009-02-15T00:00:00+01:00</updated>
   <id>http://rors.org/2009/02/15/accountability</id>
   <content type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;a href='http://blog.jayfields.com/2009/01/cost-of-net-negative-producing.html'&gt;Jay Fields&lt;/a&gt;: &amp;#8220;I heard once that in Great Britain’s MOD if you design software for a plane you go up in the test plane when the software is beta-tested. If all programmers were held with that level of accountability, how many do you think would still be in our field? How many would you want to collaborate with before you went up in the plane together?&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;</content>
 </entry>
 
 <entry>
   <title>simple_captcha while developing</title>
   <link href="http://rors.org/2008/10/29/simple_captcha-while-developing.html"/>
   <updated>2008-10-29T00:00:00+01:00</updated>
   <id>http://rors.org/2008/10/29/simple_captcha-while-developing</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Type less&lt;/em&gt; is my motto these days. Not just the code, but everything.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re developing an app with the excellent &lt;a href='http://expressica.com/simple_captcha/'&gt;simple_captcha plugin&lt;/a&gt; do your fingers a favor and monkey patch it in development.rb:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='c1'&gt;# type less. autosolve captcha while developing&lt;/span&gt;
&lt;span class='no'&gt;ActionView&lt;/span&gt;&lt;span class='o'&gt;::&lt;/span&gt;&lt;span class='no'&gt;Base&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;module_eval&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt;
  &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;simple_captcha_field&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;options&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt;&lt;span class='p'&gt;{})&lt;/span&gt;
    &lt;span class='n'&gt;options&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:object&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt; &lt;span class='p'&gt;?&lt;/span&gt;
      &lt;span class='n'&gt;text_field&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;options&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:object&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:captcha&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:value&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;simple_captcha_value&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;simple_captcha_key&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt;
        &lt;span class='n'&gt;hidden_field&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;options&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:object&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='ss'&gt;:captcha_key&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='ss'&gt;:value&lt;/span&gt; &lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;options&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='ss'&gt;:field_value&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='p'&gt;})&lt;/span&gt; &lt;span class='p'&gt;:&lt;/span&gt; 
      &lt;span class='n'&gt;text_field_tag&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='ss'&gt;:captcha&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='n'&gt;simple_captcha_value&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;simple_captcha_key&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt;
  &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Don't escape in Strings</title>
   <link href="http://rors.org/2008/10/26/dont-escape-in-strings.html"/>
   <updated>2008-10-26T00:00:00+02:00</updated>
   <id>http://rors.org/2008/10/26/dont-escape-in-strings</id>
   <content type="html">&lt;p&gt;So don&amp;#8217;t do:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='nb'&gt;name&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='s2'&gt; said: &lt;/span&gt;&lt;span class='se'&gt;\&amp;quot;&lt;/span&gt;&lt;span class='s2'&gt;Clap your hands!&lt;/span&gt;&lt;span class='se'&gt;\&amp;quot;&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;It&amp;#8217;s ugly and you don&amp;#8217;t need it. Ruby has excellent support for arbitrary delimiters for string literals.&lt;/p&gt;

&lt;p&gt;So above can be rewritten as:&lt;/p&gt;

&lt;p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='sx'&gt;%-&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='vi'&gt;@name&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='sx'&gt; says: &amp;quot;Clap your hands!&amp;quot;-&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;&amp;#8230; or if String contains dash:&lt;/p&gt;

&lt;p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='sx'&gt;%/&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='vi'&gt;@name&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='sx'&gt; says: &amp;quot;Play tic-tac-toe!&amp;quot;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;&amp;#8230; or if String contains dash and slash:&lt;/p&gt;

&lt;p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='sx'&gt;%Q|&lt;/span&gt;&lt;span class='si'&gt;#{&lt;/span&gt;&lt;span class='vi'&gt;@name&lt;/span&gt;&lt;span class='si'&gt;}&lt;/span&gt;&lt;span class='sx'&gt; says: &amp;quot;Try ftp://ruby-lang.org/pub/ruby/1.9/&amp;quot;|&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;&amp;#8230; and so on. No need to escape.&lt;/p&gt;

&lt;p&gt;Excerpt from the great book &lt;a href='http://www.amazon.com/Ruby-Programming-Language-David-Flanagan/dp/0596516177'&gt;The Ruby programming Language&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;The sequence %q begins a string literal that follows single-quoted string rules, and the sequence %Q (or just %) introduces a literal that follows double-qouted string rules. The first character following q or Q is the delimiter, and the string literal continues until a matching delimiter is found. If the opening delimiter is (, [, {, or &amp;lt;, then the matching delimiter is ), ], }, or &amp;gt;. Otherwise, the closing delimiter is the same as the opening delimiter.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;</content>
 </entry>
 
 <entry>
   <title>Alternative join and split in Ruby</title>
   <link href="http://rors.org/2008/07/09/alternative-join-and-split-in-ruby.html"/>
   <updated>2008-07-09T00:00:00+02:00</updated>
   <id>http://rors.org/2008/07/09/alternative-join-and-split-in-ruby</id>
   <content type="html">&lt;h2 id='join'&gt;Join&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='sx'&gt;%w(tic tac toe)&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;-&amp;quot;&lt;/span&gt; 
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;tic-tac-toe&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 id='split'&gt;Split&lt;/h2&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;tic-tac-toe&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;-&amp;quot;&lt;/span&gt; 
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;tic&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;tac&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;toe&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Unfortunately, for &lt;em&gt;split&lt;/em&gt; you&amp;#8217;ll need this of course:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;String&lt;/span&gt;
  &lt;span class='k'&gt;alias&lt;/span&gt; &lt;span class='o'&gt;/&lt;/span&gt; &lt;span class='ss'&gt;:split&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;;)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Self or default if empty, DRY way</title>
   <link href="http://rors.org/2008/03/19/self-or-default-if-empty-dry-way.html"/>
   <updated>2008-03-19T00:00:00+01:00</updated>
   <id>http://rors.org/2008/03/19/self-or-default-if-empty-dry-way</id>
   <content type="html">&lt;p&gt;I really appreciate following idiom in Ruby:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;person&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;phone&lt;/span&gt; &lt;span class='o'&gt;||&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;N/A&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;It&amp;#8217;s DRY. No need for conditional structures, and repeating person.phone in condition and as return value.&lt;/p&gt;

&lt;p&gt;But lets say you don&amp;#8217;t control your data source, and there is an empty string instead of nil when data is not available (sounds familiar?). How would you deal with that and keep things simple and DRY?&lt;/p&gt;

&lt;p&gt;Well, basicly all you need is a String method that will return nil if string is empty, or self if it&amp;#8217;s not empty. String object doesn&amp;#8217;t have that kind of method, at least not that specialized. Regexp to rescue. Lets try this:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;[/.&lt;/span&gt;&lt;span class='n'&gt;+&lt;/span&gt;&lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='n'&gt;m&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='kp'&gt;nil&lt;/span&gt;

&lt;span class='o'&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;ruby&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;[/.&lt;/span&gt;&lt;span class='n'&gt;+&lt;/span&gt;&lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='n'&gt;m&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
&lt;span class='o'&gt;=&amp;gt;&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;ruby&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Nice. So solution for the problem above is:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;person&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;phone&lt;/span&gt;&lt;span class='o'&gt;[/.&lt;/span&gt;&lt;span class='n'&gt;+&lt;/span&gt;&lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='n'&gt;m&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt; &lt;span class='o'&gt;||&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;N/A&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Throw &lt;a href='http://rors.org/2008/3/18/andand'&gt;andand&lt;/a&gt; in game to support both nil and empty value with no cost in complexity:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;person&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;phone&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;andand&lt;/span&gt;&lt;span class='o'&gt;[/.&lt;/span&gt;&lt;span class='n'&gt;+&lt;/span&gt;&lt;span class='o'&gt;/&lt;/span&gt;&lt;span class='n'&gt;m&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt; &lt;span class='o'&gt;||&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;N/A&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>andand</title>
   <link href="http://rors.org/2008/03/18/andand.html"/>
   <updated>2008-03-18T00:00:00+01:00</updated>
   <id>http://rors.org/2008/03/18/andand</id>
   <content type="html">&lt;p&gt;I really, really like &lt;a href='http://andand.rubyforge.org'&gt;andand&lt;/a&gt;. Try it and stop repeating yourself.&lt;/p&gt;

&lt;p&gt;I mean, why would you want to write this:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;entry&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;at&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;description&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='o'&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class='n'&gt;entry&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;at&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;description&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;inner_text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;when you can write this:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;entry&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;at&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s1'&gt;&amp;#39;description&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;andand&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;inner_text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</content>
 </entry>
 
 <entry>
   <title>Eleventh</title>
   <link href="http://rors.org/2008/02/11/eleventh.html"/>
   <updated>2008-02-11T00:00:00+01:00</updated>
   <id>http://rors.org/2008/02/11/eleventh</id>
   <content type="html">&lt;p&gt;Did you know that Ruby was Matz&amp;#8217; eleventh take on creating a programming language? &lt;a href='http://podcast.rubyonrails.org/system/audio/2006/rails-040-Yukihiro_Matz_Matsumoto.mp3'&gt;Listen&lt;/a&gt;. So don&amp;#8217;t despare next time you fail, you are right on track.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I sat down and counted the other day and Ruby was eleventh language I&amp;#8217;ve tried to write. Out of those 4 only had names, 3 of them didn&amp;#8217;t work at all&amp;#8230; the rest of them was just experiments. Ruby is the only one that really worked, so I guess that makes Ruby the first one, but it was one out of eleven attempts.&lt;/p&gt;

&lt;p&gt;~ Matz&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;p&gt;The road to wisdom? &amp;#8211; Well, it&amp;#8217;s plain and simple to express: Err and err and err again but less and less and less.&lt;/p&gt;

&lt;p&gt;~ Piet Hein&lt;/p&gt;
&lt;/blockquote&gt;</content>
 </entry>
 
 <entry>
   <title>Nested Ternary Operator</title>
   <link href="http://rors.org/2008/01/20/nested-ternary-operator.html"/>
   <updated>2008-01-20T00:00:00+01:00</updated>
   <id>http://rors.org/2008/01/20/nested-ternary-operator</id>
   <content type="html">&lt;p&gt;I was going through some of my old Java code and found this interesting piece of code. It’s basically alternative way of creating switch structure.&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='java'&gt;  &lt;span class='kd'&gt;public&lt;/span&gt; &lt;span class='n'&gt;Object&lt;/span&gt; &lt;span class='nf'&gt;getValueAt&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;row&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt; &lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;col&lt;/span&gt;&lt;span class='o'&gt;)&lt;/span&gt; &lt;span class='o'&gt;{&lt;/span&gt;
    &lt;span class='n'&gt;Person&lt;/span&gt; &lt;span class='n'&gt;person&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;data&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;get&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='n'&gt;row&lt;/span&gt;&lt;span class='o'&gt;);&lt;/span&gt;
    &lt;span class='k'&gt;return&lt;/span&gt; 
      &lt;span class='n'&gt;col&lt;/span&gt;&lt;span class='o'&gt;==&lt;/span&gt;&lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='n'&gt;person&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;getFirstName&lt;/span&gt;&lt;span class='o'&gt;()&lt;/span&gt; 
      &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;col&lt;/span&gt;&lt;span class='o'&gt;==&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='n'&gt;person&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;getLastName&lt;/span&gt;&lt;span class='o'&gt;()&lt;/span&gt; 
      &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;col&lt;/span&gt;&lt;span class='o'&gt;==&lt;/span&gt;&lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='n'&gt;person&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;getAge&lt;/span&gt;&lt;span class='o'&gt;()&lt;/span&gt;            
      &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='n'&gt;col&lt;/span&gt;&lt;span class='o'&gt;==&lt;/span&gt;&lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='o'&gt;?&lt;/span&gt; &lt;span class='n'&gt;person&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;getAddress&lt;/span&gt;&lt;span class='o'&gt;()&lt;/span&gt;
      &lt;span class='o'&gt;:&lt;/span&gt; &lt;span class='kc'&gt;null&lt;/span&gt;&lt;span class='o'&gt;;&lt;/span&gt; 
  &lt;span class='o'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unlike switch, there is no compile time error for duplicated cases&lt;/li&gt;

&lt;li&gt;this is not a standard way of dealing with different values of a variable so you could leave wondering the person that will read your code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more control over branching logic since expressions are used (switch must use constants as case values)&lt;/li&gt;

&lt;li&gt;this is not a standard way of dealing with different values of a variable so you could be seen as hacker in the eyes of the person that will read your code ;)&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 
</feed>
