<?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-6591679413342590324</id><updated>2011-04-21T20:55:06.012-03:00</updated><title type='text'>The Ruby Rambler</title><subtitle type='html'>Cool findings and ramblings from a Ruby newbie</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rubyrambler.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rubyrambler.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Romulo</name><uri>http://www.blogger.com/profile/16190033446485298743</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>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6591679413342590324.post-1119001717729825149</id><published>2007-10-25T10:03:00.000-02:00</published><updated>2007-10-25T10:18:54.857-02:00</updated><title type='text'>Terminate batch job (Y/N)? Y</title><content type='html'>&lt;p&gt;If you happen to use Ruby/Rails on Windows then you've probably got annoyed at least a few times by the "Terminate batch job" prompt you get when typing &lt;i&gt;Control-C&lt;/i&gt; at an &lt;i&gt;irb&lt;/i&gt; or &lt;i&gt;mongrel&lt;/i&gt; session. Even though the program already terminated after a Control-C, the prompt asks anyway and you are forced to give an answer. That's because those Ruby programs are wrapped inside batch files, which have that behaviour hard-coded into &lt;i&gt;cmd.exe&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;It's possible to &lt;a href="http://www.xs4all.nl/~itsme/projects/misc/patching-cmdexe.html"&gt;patch &lt;i&gt;cmd.exe&lt;/i&gt;&lt;/a&gt;, but if your only problem is with some Ruby scripts, you can simply get rid of the batch files and replace then by pure Ruby scripts.&lt;/p&gt;

&lt;p&gt;In the case of &lt;i&gt;irb&lt;/i&gt; rename &lt;code&gt;bin\irb.bat&lt;/code&gt; to &lt;code&gt;bin\irb.rb&lt;/code&gt; and remove the lines from the beginning of the file until &lt;code&gt;goto endofruby&lt;/code&gt;. For &lt;i&gt;mongrel_rails&lt;/i&gt; delete &lt;code&gt;bin\mongrel_rails.cmd&lt;/code&gt; and rename &lt;code&gt;bin\mongrel_rails&lt;/code&gt; to &lt;code&gt;bin\mongrel_rails.rb&lt;/code&gt;. The steps are similar for other files. Sometimes the Ruby script is coded directly inside the batch file. Other times the batch file just invokes Ruby with another file without an extension. But be sure &lt;code&gt;.RB&lt;/code&gt; is appended to the &lt;code&gt;PATHEXT&lt;/code&gt; environment variable.&lt;/p&gt;

&lt;p&gt;The solution is so simple and yet I took months to finally put it in practice...&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591679413342590324-1119001717729825149?l=rubyrambler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyrambler.blogspot.com/feeds/1119001717729825149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591679413342590324&amp;postID=1119001717729825149' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/1119001717729825149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/1119001717729825149'/><link rel='alternate' type='text/html' href='http://rubyrambler.blogspot.com/2007/10/terminate-batch-job-yn-y.html' title='Terminate batch job (Y/N)? Y'/><author><name>Romulo</name><uri>http://www.blogger.com/profile/16190033446485298743</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-6591679413342590324.post-2341336510954021121</id><published>2007-10-03T09:39:00.000-03:00</published><updated>2007-10-03T10:11:19.197-03:00</updated><title type='text'>Persisting variables between partial calls</title><content type='html'>&lt;p&gt;In Rails, there are times when you need to preserve the value of a variable across partial renderings. For example, you want a partial to render a row of a table with numbered rows. How do you do that?&lt;/p&gt;

&lt;p&gt;Store the value in an instance variable:&lt;/p&gt;

&lt;pre&gt;&amp;lt;tr&amp;gt;
  &amp;lt;td&amp;gt;&amp;lt;%= &lt;span class="attribute"&gt;@row_id&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="attribute"&gt;@row_id&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="punct"&gt;+&lt;/span&gt; &lt;span class="number"&gt;1&lt;/span&gt; %&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;&lt;/pre&gt;
&lt;br /&gt;

&lt;p&gt;The variable will be preserved while the page is being rendered, in an instance of a dynamically created class, subclassed from ActionView::Base (as of Rails 1.1.6 that happened in ActionController::Base.initialize_template_class).&lt;/p&gt;

&lt;p&gt;The same variable will be available inside the corresponding helper, since the helper is included as a module of that dynamically created class. So code like the one shown above may be moved to a helper.&lt;/p&gt;

&lt;p&gt;Use the trick wisely, though! A variable seen by different files is almost a global variable.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591679413342590324-2341336510954021121?l=rubyrambler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyrambler.blogspot.com/feeds/2341336510954021121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591679413342590324&amp;postID=2341336510954021121' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/2341336510954021121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/2341336510954021121'/><link rel='alternate' type='text/html' href='http://rubyrambler.blogspot.com/2007/10/persisting-variables-between-partial.html' title='Persisting variables between partial calls'/><author><name>Romulo</name><uri>http://www.blogger.com/profile/16190033446485298743</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-6591679413342590324.post-4267143531884263926</id><published>2007-06-22T14:15:00.000-03:00</published><updated>2007-06-22T14:25:03.765-03:00</updated><title type='text'>Mocha stubs with multiple parameters/result sets</title><content type='html'>&lt;p&gt;I've just decided to give a try to some &lt;a href="http://en.wikipedia.org/wiki/Mock_object"&gt;mock framework&lt;/a&gt; for Ruby. Actually &lt;span style="font-style:italic;"&gt;a mock framework&lt;/span&gt;, since I never used one seriously before. Among other options (&lt;a href="http://flexmock.rubyforge.org/"&gt;FlexMock&lt;/a&gt;, &lt;a href="http://rspec.rubyforge.org/"&gt;RSpec&lt;/a&gt; and &lt;a href="http://raa.ruby-lang.org/project/ruby-mock/"&gt;ruby-mock&lt;/a&gt;) I came across &lt;a href="http://mocha.rubyforge.org/"&gt;Mocha&lt;/a&gt;, which looked like a rather good framework. It's not trivial to decide on the best one because, aside from ruby-mock, which is pretty old, all of them perform equally well (or bad) in the opinions I found on the Web.&lt;p&gt;

&lt;p&gt;My immediate need was for a quick way to define &lt;a href="http://www.martinfowler.com/articles/mocksArentStubs.html#TheDifferenceBetweenMocksAndStubs"&gt;stubs&lt;/a&gt;. The class I wanted to test would call some methods in another object which needed a specific behaviour. One method of that other object needed to provide the class under test with results which depended upon the parameters passed in. A pretty common scenario, I believe. However, the documentation does not state how to stub a method like that, when no particular order of calls is required. (It says you can set an expectation on the order parameters will be passed in and results returned, but that's beyond my needs.)&lt;p&gt;

&lt;p&gt;Fortunately, the &lt;code&gt;Mocha::Mock::stubs&lt;/code&gt; method may be invoked multiple times with the same method name, as I discovered trying it out. For each expectation returned you can set different parameters and return values, hence simulating an object that acts based on its parameters, without tying it to any particular order. Here's a test-case which creates a mock for a calculator object:&lt;p&gt;

&lt;pre&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mocha&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;CalculatorTestCase&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Test&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Unit&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;TestCase&lt;/span&gt;
  
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;test_add&lt;/span&gt;
    &lt;span class="ident"&gt;calculator&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;mock&lt;/span&gt;
    &lt;span class="ident"&gt;calculator&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:add&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;with&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="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;calculator&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;stubs&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:add&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;with&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&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;returns&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    
    &lt;span class="ident"&gt;assert_equal&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;calculator&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;add&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="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;
    &lt;span class="ident"&gt;assert_equal&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;10&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;calculator&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;add&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="number"&gt;3&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="number"&gt;7&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;

&lt;p&gt;I still need to better explore the world of a mock framework, but am already feeling ashamed of not having tried it before. I'm sure from now on I'll write a lot less code inside test-case files.&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591679413342590324-4267143531884263926?l=rubyrambler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyrambler.blogspot.com/feeds/4267143531884263926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591679413342590324&amp;postID=4267143531884263926' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/4267143531884263926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/4267143531884263926'/><link rel='alternate' type='text/html' href='http://rubyrambler.blogspot.com/2007/06/mocha-stubs-with-multiple.html' title='Mocha stubs with multiple parameters/result sets'/><author><name>Romulo</name><uri>http://www.blogger.com/profile/16190033446485298743</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-6591679413342590324.post-636370686973010609</id><published>2007-06-20T11:37:00.000-03:00</published><updated>2007-06-20T11:42:54.645-03:00</updated><title type='text'>Inside a class method "self" points to the class!</title><content type='html'>&lt;p&gt;I often find this kind of construct in Ruby source files (Ruby's stdlib included):&lt;/p&gt;

&lt;pre&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Parser&lt;/span&gt;

  &lt;span class="comment"&gt;# ...&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;Parser.parse_file&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;parser&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Parser&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="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;filename&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="ident"&gt;parser&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;parse&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;

&lt;p&gt;However, when you are inside a class method, the &lt;code&gt;self&lt;/code&gt; variable already points to the class of the method. Thus, prepending the call to &lt;code&gt;new&lt;/code&gt; with the class' name is unnecessary repetition. Moreover, although either &lt;code&gt;self&lt;/code&gt; or the class name is still required before the name of a class method definition, I find the former form a better option. In the event of a refactoring involving a change in the class name, you'd be less prone to mistakes.&lt;/p&gt;

&lt;p&gt;So, the code above could have been written as:&lt;/p&gt;

&lt;pre&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Parser&lt;/span&gt;

  &lt;span class="comment"&gt;# ...&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.parse_file&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;parser&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="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;filename&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="ident"&gt;parser&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;parse&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;

&lt;p&gt;There's a small caveat regarding inheritance, though. In the first construct, &lt;code&gt;parse_file&lt;/code&gt; will always create an instance of &lt;code&gt;Parser&lt;/code&gt;, while the second will create an instance of the class specified in the call to &lt;code&gt;parse_file&lt;/code&gt;. That might be desirable or not.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591679413342590324-636370686973010609?l=rubyrambler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyrambler.blogspot.com/feeds/636370686973010609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591679413342590324&amp;postID=636370686973010609' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/636370686973010609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/636370686973010609'/><link rel='alternate' type='text/html' href='http://rubyrambler.blogspot.com/2007/06/inside-class-method-self-points-to.html' title='Inside a class method &quot;self&quot; points to the class!'/><author><name>Romulo</name><uri>http://www.blogger.com/profile/16190033446485298743</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-6591679413342590324.post-6637451463520105309</id><published>2007-06-19T16:29:00.000-03:00</published><updated>2007-06-19T16:44:10.425-03:00</updated><title type='text'>E-mail address leaked from RubyCorner to spammers?</title><content type='html'>&lt;p&gt;A few minutes ago I received a spam message at my Inbox. A snippet follows:&lt;/p&gt;

&lt;pre&gt;Subject: Information
From: INFINITY LOTTERY &amp;lt;infinitylottery@yahoo.de&amp;gt;
To: Administrator &amp;lt;"#{'q'.succ}ubycorner@romulo.e#{2+2}ward.com"&amp;gt;

INFINITY LOTTERY PROMOTIONS THE NETHERLANDS
FROM:THE DESK OF THE PRESIDENT
INFINITY LOTTERY PRIMOTION/PRIZE AWARD DEPT
Ref. Number:WRH/12726/PZP
Batch Number:29/064701/904HM

ATTENTION.

Sir/ Ma/ Miss,

We are pleased to inform you of the result of the winners of the Infinity
Lottery Promotions
programs held on 14th June,2007.Your e-mail address attached to ticket
number 085---2356789--789
with serial number 8567--46 drew lucky numbers 9- -01-23455-34 which
consequently won in the
category A.You have therefore been approved for a lump sum pay of US
$1.200,000.00(one million two hundred
thousand United States Dollars)in cash credited to file Ref.
Number:WRH/12726/PZP.This is from a total
cash prize of US $16.800,000.00usd international winners in this category.
CONGRATULATIONS!!!

(...)&lt;/pre&gt;
&lt;br /&gt;

&lt;p&gt;Most interesting is the address to which the message was sent (mangled here by me), a unique one I generated on June 3, 2007 using &lt;a href="http://www.e4ward.com/"&gt;E4ward&lt;/a&gt; to sign up for &lt;a href="http://rubycorner.com/"&gt;RubyCorner&lt;/a&gt;. I didn't give it to anyone else. That leaves only two possibilities:&lt;/p&gt;

&lt;p&gt;&lt;ol&gt;&lt;li&gt;It somehow leaked from RubyCorner. I don't see anyway to get the e-mail of other users or set a specific option on my profile regarding visibility. Thus, if not intentionally leaked, it was stolen.
&lt;/li&gt;&lt;li&gt;The spammer used a dictionary attack against the sub-domain romulo.e4ward.com. That seems unlikely. What kind of idiot would perform such an onerous attack to find addresses among no more than a few dozens which are known to be from an e-mail forwarding service?
&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;

&lt;p&gt;To be really sure I need to generate a random address and sign up again for RubyCorner. Meanwhile, if you also suspect the address you have registered at RubyCorner was abused, please, let me know.&lt;p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591679413342590324-6637451463520105309?l=rubyrambler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyrambler.blogspot.com/feeds/6637451463520105309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591679413342590324&amp;postID=6637451463520105309' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/6637451463520105309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/6637451463520105309'/><link rel='alternate' type='text/html' href='http://rubyrambler.blogspot.com/2007/06/e-mail-address-leaked-from-rubycorner.html' title='E-mail address leaked from RubyCorner to spammers?'/><author><name>Romulo</name><uri>http://www.blogger.com/profile/16190033446485298743</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-6591679413342590324.post-1384918267639490867</id><published>2007-06-13T09:54:00.000-03:00</published><updated>2007-07-09T15:45:22.086-03:00</updated><title type='text'>Creating an object from the class name</title><content type='html'>&lt;p&gt;How do you create an object in Ruby given its class name as a symbol or string?&lt;/p&gt;

&lt;p&gt;It turns out that that's not as obvious as using &lt;code&gt;send&lt;/code&gt; to call methods in an already existing object. You need to use the &lt;code&gt;Kernel.const_get&lt;/code&gt; method to convert your symbol or string into a class reference (in Ruby &lt;a href="http://www.rubycentral.com/pickaxe/classes.html#UE"&gt;class names are constants&lt;/a&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;create_object&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;klass&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="constant"&gt;Kernel&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;const_get&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;klass&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;my_hash&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;create_object&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:Hash&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;

&lt;p&gt;There's no good reason to use that trick in such a simplistic example, but it could be really helpful if you were reading the class names from a file or when out of the class' scope (perhaps violating encapsulation!).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591679413342590324-1384918267639490867?l=rubyrambler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyrambler.blogspot.com/feeds/1384918267639490867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591679413342590324&amp;postID=1384918267639490867' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/1384918267639490867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/1384918267639490867'/><link rel='alternate' type='text/html' href='http://rubyrambler.blogspot.com/2007/06/creating-object-from-class-name.html' title='Creating an object from the class name'/><author><name>Romulo</name><uri>http://www.blogger.com/profile/16190033446485298743</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-6591679413342590324.post-2316325713818415783</id><published>2007-06-01T11:17:00.000-03:00</published><updated>2007-06-04T09:24:46.602-03:00</updated><title type='text'>Quick mapping between XML and Ruby objects</title><content type='html'>&lt;p&gt;Often you'll find yourself reading an XML file and writing boilerplate code with &lt;a href="http://www.ruby-doc.org/stdlib/libdoc/rexml/rdoc/"&gt;REXML&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I was in the middle of a tool that'd generate Ruby code from an XML Schema when I started feeling the pain of working directly with REXML. From that point it was only a matter of hours to come up with this simple and elegant solution:&lt;/p&gt;

&lt;pre&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;rexml/document&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;XMLDef&lt;/span&gt;
  &lt;span class="ident"&gt;attr_accessor&lt;/span&gt; &lt;span class="symbol"&gt;:text&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.xml_attribute&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;attr_name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;xml_elem&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;attr_accessor&lt;/span&gt; &lt;span class="ident"&gt;attr_name&lt;/span&gt;

    &lt;span class="attribute"&gt;@attributes&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="ident"&gt;new&lt;/span&gt; &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="keyword"&gt;defined?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="attribute"&gt;@attributes&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="attribute"&gt;@attributes&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;attr_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;xml_elem&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.xml_array&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;array_name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;xml_elem&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;xml_class&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;attr_reader&lt;/span&gt; &lt;span class="ident"&gt;array_name&lt;/span&gt;
    
    &lt;span class="attribute"&gt;@arrays&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="ident"&gt;new&lt;/span&gt; &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="keyword"&gt;defined?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="attribute"&gt;@arrays&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="attribute"&gt;@arrays&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;array_name&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;xml_elem&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;xml_class&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.xml_object&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;object_ref_name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;xml_elem&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;xml_class&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;attr_reader&lt;/span&gt; &lt;span class="ident"&gt;object_ref_name&lt;/span&gt;

    &lt;span class="attribute"&gt;@objects&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="ident"&gt;new&lt;/span&gt; &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="keyword"&gt;defined?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="attribute"&gt;@objects&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="attribute"&gt;@objects&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;object_ref_name&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;xml_elem&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;xml_class&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.load_element&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;elem&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;result&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;new&lt;/span&gt;
    
    &lt;span class="ident"&gt;result&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;elem&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;text&lt;/span&gt;
    
    &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="attribute"&gt;@attributes&lt;/span&gt;
      &lt;span class="attribute"&gt;@attributes&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&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;k&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;v&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
        &lt;span class="ident"&gt;result&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;send&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;k&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_s&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="ident"&gt;elem&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;attributes&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;v&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    
    &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="attribute"&gt;@arrays&lt;/span&gt;
      &lt;span class="attribute"&gt;@arrays&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&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;k&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;v&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
        &lt;span class="ident"&gt;result&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;instance_variable_set&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;k&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_s&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;Array&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;elem&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each_element&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;v&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="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
          &lt;span class="ident"&gt;result&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;send&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;k&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;send&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="ident"&gt;v&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;load_element&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;
        &lt;span class="keyword"&gt;end&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    
    &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="attribute"&gt;@objects&lt;/span&gt;
      &lt;span class="attribute"&gt;@objects&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&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;k&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;v&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
        &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;elem&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;elements&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="ident"&gt;v&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;result&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;instance_variable_set&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;k&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_s&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;v&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;load_element&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;))&lt;/span&gt;
        &lt;span class="keyword"&gt;end&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="ident"&gt;result&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
  
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.load_xml&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;xml&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="ident"&gt;load_element&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;REXML&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Document&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;xml&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;root&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;br /&gt;

&lt;p&gt;To create a mapping you simply inherit from XMLDef. &lt;code&gt;xml_attribute&lt;/code&gt;, &lt;code&gt;xml_array&lt;/code&gt; and &lt;code&gt;xml_object&lt;/code&gt; create the accessors. &lt;code&gt;load_element&lt;/code&gt; recursively reads the XML into the objects you define. &lt;code&gt;load_xml&lt;/code&gt; is the method you call on the root of your mapping to read the actual XML.&lt;/p&gt;

&lt;p&gt;For example, suppose you want a mapping for the following XML:&lt;/p&gt;

&lt;pre&gt;&amp;lt;planetSystem name='Solar System'&amp;gt;
  &amp;lt;dimensions diameter='100000 AU' mass='2e30 kg'/&amp;gt;
  &amp;lt;planet name='Earth' lifeFriendly='1'&amp;gt;
    &amp;lt;dimensions diameter='12745 km' mass='5.97e24 kg'/&amp;gt;
    &amp;lt;description&amp;gt;The planet were we live&amp;lt;/description&amp;gt;
  &amp;lt;/planet&amp;gt;
  &amp;lt;planet name='Mars' lifeFriendly='0'&amp;gt;
    &amp;lt;dimensions diameter='6805 km' mass='6.42e23 kg'/&amp;gt;
  &amp;lt;/planet&amp;gt;
  &amp;lt;planet name='Jupiter'&amp;gt;
    &amp;lt;description&amp;gt;Biggest planet in the solar system&amp;lt;/description&amp;gt;
  &amp;lt;/planet&amp;gt;
&amp;lt;/planetSystem&amp;gt;&lt;/pre&gt;

&lt;br /&gt;
You'll write:

&lt;pre&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Description&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;XMLDef&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Dimensions&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;XMLDef&lt;/span&gt;
  &lt;span class="ident"&gt;xml_attribute&lt;/span&gt; &lt;span class="symbol"&gt;:diameter&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;diameter&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;xml_attribute&lt;/span&gt; &lt;span class="symbol"&gt;:mass&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;mass&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Planet&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;XMLDef&lt;/span&gt;
  &lt;span class="ident"&gt;xml_attribute&lt;/span&gt; &lt;span class="symbol"&gt;:name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;xml_attribute&lt;/span&gt; &lt;span class="symbol"&gt;:life_friendly&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;lifeFriendly&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;xml_object&lt;/span&gt; &lt;span class="symbol"&gt;:dimensions&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;dimensions&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="constant"&gt;Dimensions&lt;/span&gt;
  &lt;span class="ident"&gt;xml_object&lt;/span&gt; &lt;span class="symbol"&gt;:description&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;description&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="constant"&gt;Description&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;PlanetSystem&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;XMLDef&lt;/span&gt;
  &lt;span class="ident"&gt;xml_attribute&lt;/span&gt; &lt;span class="symbol"&gt;:name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
  &lt;span class="ident"&gt;xml_array&lt;/span&gt; &lt;span class="symbol"&gt;:planets&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;planet&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="constant"&gt;Planet&lt;/span&gt;
  &lt;span class="ident"&gt;xml_object&lt;/span&gt; &lt;span class="symbol"&gt;:dimensions&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;dimensions&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="constant"&gt;Dimensions&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/pre&gt;

&lt;br /&gt;
&lt;p&gt;I don't think you could write anything more obvious. The annotations make the code pretty straightforward to understand and maintain. I was coding a lot of test-cases for my XML Schema reader. The mapper rendered them completely useless.&lt;/p&gt;

&lt;p&gt;This is how you'd read the XML above:&lt;/p&gt;

&lt;pre&gt;&lt;span class="ident"&gt;x&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;PlanetSystem&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;load_xml&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;open&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;planets.xml&lt;/span&gt;&lt;span class="punct"&gt;'))&lt;/span&gt;

&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Diameter: &lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;dimensions&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;diameter&lt;/span&gt;                     
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Mass: &lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;dimensions&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;mass&lt;/span&gt;

&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="ident"&gt;p&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;planets&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;puts&lt;/span&gt; &lt;span class="ident"&gt;p&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="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;p&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;description&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;text&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Life friendly: &lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;p&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;life_friendly&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Diameter: &lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;p&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;dimensions&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;diameter&lt;/span&gt;
&lt;span class="ident"&gt;puts&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Mass: &lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="ident"&gt;p&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;dimensions&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;mass&lt;/span&gt;&lt;/pre&gt;

&lt;br /&gt;
&lt;p&gt;That's not hard to extend the class to save data back to XML or create a new one from scratch.&lt;/p&gt;

&lt;p&gt;Today, after spending a few hours coding the class above, I found &lt;a href="http://roxml.rubyforge.org/"&gt;ROXML&lt;/a&gt;, which follows the same idea as mine. Some of the similarities are interesting, by the way. ROXML also has the methods &lt;code&gt;xml_attribute&lt;/code&gt; and &lt;code&gt;xml_object&lt;/code&gt;. And an example included in the source code references the &lt;a href="http://www.pragmaticprogrammer.com/titles/ruby/"&gt;Pickaxe book&lt;/a&gt;, which I did in the test-cases for XMLDef. I guess the author also had the book over the table when thinking out an example.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591679413342590324-2316325713818415783?l=rubyrambler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyrambler.blogspot.com/feeds/2316325713818415783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591679413342590324&amp;postID=2316325713818415783' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/2316325713818415783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/2316325713818415783'/><link rel='alternate' type='text/html' href='http://rubyrambler.blogspot.com/2007/06/quick-mapping-between-xml-and-ruby.html' title='Quick mapping between XML and Ruby objects'/><author><name>Romulo</name><uri>http://www.blogger.com/profile/16190033446485298743</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-6591679413342590324.post-4316951819311023484</id><published>2007-05-11T14:15:00.000-03:00</published><updated>2007-06-04T09:26:28.984-03:00</updated><title type='text'>Ruby and the Master File Table</title><content type='html'>&lt;p&gt;If you already investigated Ruby's installation directory, you may have noticed the huge amount of files there. I've just installed Ruby 1.8.6 and Rails 1.2.3. The disk contains now 26,978 more files and 4,142 more folders.&lt;/p&gt;

&lt;p&gt;A medium sized Windows installation has around 40,000 files and folders, meaning Ruby accounts for almost 50% of all Master File Table record entries when it is installed in an NTFS partition. The first obvious effect is that a search on the root of the drive must examine twice the number of files. The other, not so obvious, is that the MFT will fragment, because of the &lt;a href="http://support.microsoft.com/kb/174619"&gt;large number of small files&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Moreover, small files (&lt;a href="http://www.microsoft.com/technet/prodtechnol/windows2000serv/reskit/core/fncc_fil_khzt.mspx"&gt;typically 1,500 bytes or less&lt;/a&gt;) are &lt;a href="http://www.microsoft.com/technet/archive/winntas/tips/winntmag/optntfs.mspx"&gt;stored directly inside the MFT&lt;/a&gt;. From those 26,978 files 20,660 are 1,500 bytes or smaller (not to say about the directories, whose sizes I don't know how to calculate, although I bet most are considered small), i.e. most of Ruby's files are inside the MFT.&lt;/p&gt;

&lt;p&gt;If you don't want Ruby to be a big degradation factor for your hard disk performance, install it on a separate partition, which you can simply reformat latter if the MFT gets heavily fragmented.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591679413342590324-4316951819311023484?l=rubyrambler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyrambler.blogspot.com/feeds/4316951819311023484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591679413342590324&amp;postID=4316951819311023484' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/4316951819311023484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/4316951819311023484'/><link rel='alternate' type='text/html' href='http://rubyrambler.blogspot.com/2007/05/ruby-and-master-file-table.html' title='Ruby and the Master File Table'/><author><name>Romulo</name><uri>http://www.blogger.com/profile/16190033446485298743</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-6591679413342590324.post-3790887055940418984</id><published>2007-05-03T08:40:00.000-03:00</published><updated>2007-06-04T09:27:39.835-03:00</updated><title type='text'>Prime number calculator</title><content type='html'>&lt;p&gt;Do you remember back in your first classes in university when you was taught how to calculate a series of prime numbers in C or Pascal? Do you remember those tens of lines of code?&lt;/p&gt;

&lt;p&gt;You need a lot less in Ruby:&lt;/p&gt;

&lt;pre&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;primes&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;up_to&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;prev&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="number"&gt;2&lt;/span&gt;&lt;span class="punct"&gt;..&lt;/span&gt;&lt;span class="ident"&gt;up_to&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;select&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;x&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="ident"&gt;max_p&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Math&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sqrt&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;x&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;truncate&lt;/span&gt;
    &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="punct"&gt;!&lt;/span&gt;&lt;span class="ident"&gt;prev&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;y&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;y&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="ident"&gt;max_p&lt;/span&gt; &lt;span class="punct"&gt;?&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt; &lt;span class="punct"&gt;%&lt;/span&gt; &lt;span class="ident"&gt;y&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="keyword"&gt;break&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
      &lt;span class="ident"&gt;prev&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;x&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;br /&gt;
&lt;p&gt;Let's try it:&lt;/p&gt;

&lt;pre&gt;&lt;span class="string"&gt;irb&gt; primes(10)&lt;/span&gt;
&lt;span class="ident"&gt;=&gt; [2, 3, 5, 7]&lt;/span&gt;
&lt;span class="string"&gt;irb&gt; primes(100)&lt;/span&gt;
&lt;span class="ident"&gt;=&gt; [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]&lt;/span&gt;
&lt;span class="string"&gt;irb&gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;br /&gt;
&lt;p&gt;The method goes beyond naive approaches, testing each number only with previously found prime numbers that are not greater than its square root. On my machine it computes the primes up to 100,000 in under 3 seconds.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6591679413342590324-3790887055940418984?l=rubyrambler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyrambler.blogspot.com/feeds/3790887055940418984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591679413342590324&amp;postID=3790887055940418984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/3790887055940418984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/3790887055940418984'/><link rel='alternate' type='text/html' href='http://rubyrambler.blogspot.com/2007/05/prime-number-calculator.html' title='Prime number calculator'/><author><name>Romulo</name><uri>http://www.blogger.com/profile/16190033446485298743</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-6591679413342590324.post-1015772518423109810</id><published>2007-05-02T17:10:00.001-03:00</published><updated>2007-06-04T09:28:32.783-03:00</updated><title type='text'>Initializing a lookup table in Rails</title><content type='html'>&lt;p&gt;You're writing a migration script for a Rails application which will create a "Priorities" table with columns for name and position. What if you want to initialize it with well known values? Here's the Ruby way:&lt;/p&gt;

&lt;pre&gt;&lt;span class="ident"&gt;create_table&lt;/span&gt; &lt;span class="symbol"&gt;:priorities&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;t&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;column&lt;/span&gt; &lt;span class="symbol"&gt;:name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:string&lt;/span&gt;
  &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;column&lt;/span&gt; &lt;span class="symbol"&gt;:position&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:integer&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="ident"&gt;say_with_time&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Initializing priorities...&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;low&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;normal&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;high&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;].&lt;/span&gt;&lt;span class="ident"&gt;each_with_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;elem&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="constant"&gt;Priority&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;create&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:name&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;elem&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:position&lt;/span&gt; &lt;span class="punct"&gt;=&amp;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;i&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&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/6591679413342590324-1015772518423109810?l=rubyrambler.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rubyrambler.blogspot.com/feeds/1015772518423109810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6591679413342590324&amp;postID=1015772518423109810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/1015772518423109810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6591679413342590324/posts/default/1015772518423109810'/><link rel='alternate' type='text/html' href='http://rubyrambler.blogspot.com/2007/05/initializing-lookup-table-in-rails_02.html' title='Initializing a lookup table in Rails'/><author><name>Romulo</name><uri>http://www.blogger.com/profile/16190033446485298743</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></feed>
