<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <title>Dangosaur.us - Home</title>
  <id>tag:blog.dangosaur.us,2008:mephisto/</id>
  <generator uri="http://mephistoblog.com" version="0.7.3">Mephisto Noh-Varr</generator>
  <link href="http://blog.dangosaur.us/feed/atom.xml" rel="self" type="application/atom+xml"/>
  <link href="http://blog.dangosaur.us/" rel="alternate" type="text/html"/>
  <updated>2008-06-30T20:46:57Z</updated>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2008-06-30:358</id>
    <published>2008-06-30T20:44:00Z</published>
    <updated>2008-06-30T20:46:57Z</updated>
    <link href="http://blog.dangosaur.us/2008/6/30/moved" rel="alternate" type="text/html"/>
    <title>Moved...</title>
<content type="html">
            &lt;p&gt;You can find my new posts over at &lt;a href='http://jamieorc.wordpress.com/'&gt;http://jamieorc.wordpress.com/&lt;/a&gt;&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2007-05-10:111</id>
    <published>2007-05-10T23:15:46Z</published>
    <updated>2007-05-10T23:15:46Z</updated>
    <category term="Capistrano"/>
    <category term="Deployment"/>
    <category term="Programming"/>
    <category term="Rails"/>
    <category term="Ruby"/>
    <link href="http://blog.dangosaur.us/2007/5/10/capistrano-and-solaris" rel="alternate" type="text/html"/>
    <title>Capistrano and Solaris</title>
<content type="html">
            &lt;p&gt;Recently I&#8217;ve been using &lt;a href='http://www.capify.org/'&gt;Capistrano&lt;/a&gt; to deploy projects to Solaris. One client uses a &lt;a href='http://joyent.com/'&gt;Joyent&lt;/a&gt; &lt;a href='http://joyent.com/accelerator'&gt;Accelerator&lt;/a&gt; (OpenSolaris) and another (&lt;a href='http://virginia.edu'&gt;University of Virginia&lt;/a&gt;) uses Solaris 5.8. The &lt;a href='http://joyent.com/accelerator'&gt;Accelerator&lt;/a&gt; is great as it has &lt;a href='http://www.sun.com/2004-0914/feature/'&gt;&lt;span class='caps'&gt;ZFS&lt;/span&gt;&lt;/a&gt;, the new Solaris Services, speed, etc. But Solaris is not the same as Linux or FreeBSD when it comes to certain common utilities and this has caused me problems on both servers.&lt;/p&gt;


	&lt;h2&gt;ln&lt;/h2&gt;


	&lt;p&gt;The main culprit is &lt;code&gt;ln&lt;/code&gt;. Capistrano use &lt;code&gt;ln -nfs&lt;/code&gt; all over the place to make soft links. Unfortunately, the version in Solaris&#8217;s &lt;code&gt;/usr/bin&lt;/code&gt; does not remove existing soft links with this command. Oy. My first response was to rewrite the tasks like &lt;code&gt;:symlink&lt;/code&gt; and &lt;code&gt;:on_rollback&lt;/code&gt; to add &lt;code&gt;rm -rf&lt;/code&gt; in front of the link command. After forgetting to do this once or twice in new deploy scripts, I posted to the TextDrive forums. Someone mentioned that the &lt;a href='http://www.blastwave.org/'&gt;Blastwave&lt;/a&gt; version of &lt;code&gt;ln&lt;/code&gt; (&lt;a href='http://www.gnu.org/'&gt;gnu&#8217;s&lt;/a&gt; version) worked. Well I&#8217;m using &lt;a href='http://www.blastwave.org/'&gt;Blastwave&lt;/a&gt; (and you should too), but I don&#8217;t remember seeing that. It turns out that &lt;a href='http://www.gnu.org/'&gt;gnu&#8217;s&lt;/a&gt; &lt;code&gt;ln&lt;/code&gt; is in &lt;code&gt;/opt/csw/gnu/&lt;/code&gt;, not &lt;code&gt;/opt/csw/bin/&lt;/code&gt;.&lt;/p&gt;


	&lt;p&gt;So I just needed that in front of my path, but when &lt;a href='http://www.capify.org/'&gt;Capistrano&lt;/a&gt; logs in through &lt;code&gt;ssh&lt;/code&gt;, it doesn&#8217;t pick up either &lt;code&gt;/etc/profile&lt;/code&gt; or &lt;code&gt;~/.profile&lt;/code&gt;. (I don&#8217;t have links handy, but apparently this depends on how &lt;code&gt;bash&lt;/code&gt; was compiled.) There are two ways of dealing with this. You can add a path to your &lt;code&gt;ssh&lt;/code&gt; config (&lt;a href='http://forum.textdrive.com/viewtopic.php?id=12629'&gt;here&#8217;s some info&lt;/a&gt;), but I prefer making the change in &lt;code&gt;/etc/default/login&lt;/code&gt;. I want the &lt;a href='http://www.blastwave.org/'&gt;Blastwave&lt;/a&gt; stuff to take precedence all the time.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2007-05-07:108</id>
    <published>2007-05-07T18:45:32Z</published>
    <updated>2007-05-07T18:45:32Z</updated>
    <category term="Programming"/>
    <category term="Ruby"/>
    <link href="http://blog.dangosaur.us/2007/5/7/more-on-should" rel="alternate" type="text/html"/>
    <title>More on Should</title>
<content type="html">
            &lt;p&gt;I was reading a post to Rails Studio mailing list today when I came across this:&lt;/p&gt;


	&lt;blockquote&gt;
		&lt;p&gt;If you&#8217;re using mocha/stubba, you can say:
&lt;code&gt;@user_notifier.expects(:deliver_activation).never&lt;/code&gt;&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;blockquote&gt;
		&lt;p&gt;If you&#8217;re using flexmock, you can say:
&lt;code&gt;flexmock(@user_observer).should_receive(:deliver_activation).never&lt;/code&gt;&lt;/p&gt;
	&lt;/blockquote&gt;


	&lt;p&gt;Which would I rather use? Disregarding the frameworks, if you read my previous post, you know the answer: &lt;em&gt;use the active verb!&lt;/em&gt; &lt;code&gt;expects&lt;/code&gt; is far preferable to &lt;code&gt;should_receive&lt;/code&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2007-05-04:107</id>
    <published>2007-05-04T19:56:40Z</published>
    <updated>2007-05-04T19:56:40Z</updated>
    <category term="Programming"/>
    <link href="http://blog.dangosaur.us/2007/5/4/hackety-hack-the-manifesto" rel="alternate" type="text/html"/>
    <title>Hackety Hack: the Manifesto</title>
<content type="html">
            &lt;p&gt;&lt;a href='http://whytheluckystiff.net'&gt;_why&lt;/a&gt; has started a new and interesting project: &lt;a href='http://hacketyhack.net/manifesto/'&gt;Hackety Hack: the Manifesto&lt;/a&gt;. The accompanying blog is &lt;a href='http://hackety.org/'&gt;http://hackety.org/&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2007-05-02:105</id>
    <published>2007-05-02T16:33:00Z</published>
    <updated>2007-05-02T16:51:08Z</updated>
    <category term="Ruby"/>
    <category term="testing"/>
    <link href="http://blog.dangosaur.us/2007/5/2/bdd-we-shouldn-t-use-should" rel="alternate" type="text/html"/>
    <title>BDD: We shouldn't use "Should"</title>
<content type="html">
            &lt;p&gt;I like behavior driven development. Even though I still using Ruby and Rails built-in testing framework, I write test names descriptive of behavior.&lt;/p&gt;


	&lt;p&gt;But I have stopped using &lt;em&gt;should&lt;/em&gt;.&lt;/p&gt;


	&lt;p&gt;&lt;em&gt;Should&lt;/em&gt; has become a bunch of noise in &lt;span class='caps'&gt;BDD&lt;/span&gt; that needs to be expunged. What&#8217;s wrong with &lt;code&gt;test_should_move_resource_lower_and_return_to_edit_exhibit&lt;/code&gt;? One alone is fine, but to read a bunch of &lt;em&gt;should&lt;/em&gt; phrases over and over is mind-numbing:&lt;/p&gt;


&lt;pre&gt;
test_should_require_email_on_signup
test_should_require_password_confirmation_on_signup
test_should_require_password_on_signup
test_should_remember_me
&lt;/pre&gt;

	&lt;p&gt;What a lot of noise! Who wants to keep hearing the word &#8220;should&#8221; in their head over and over? Or writing it over and over? Not me!&lt;/p&gt;


	&lt;h2&gt;Use the Active Verb!&lt;/h2&gt;


	&lt;p&gt;So how do I write my test names? Using the &lt;em&gt;active verb&lt;/em&gt;:&lt;/p&gt;


&lt;pre&gt;
test_moves_resource_lower_and_returns_to_edit_exhibit
test_requires_email_on_signup
test_requires_password_confirmation_on_signup
test_requires_password_on_signup
test_remembers_me
&lt;/pre&gt;

	&lt;p&gt;Much easier to read, the ugly repetition of &lt;em&gt;should&lt;/em&gt; is gone, and the method names are shorter. Recently, at Rails Edge in Reston, VA, Jim Weirich gave a test-first presentation where he used active verbs instead of &lt;em&gt;should&lt;/em&gt;. I went up after and thanked him profusely.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2007-03-30:88</id>
    <published>2007-03-30T14:31:00Z</published>
    <updated>2007-03-30T14:32:01Z</updated>
    <category term="Programming"/>
    <category term="Rails"/>
    <category term="Ruby"/>
    <link href="http://blog.dangosaur.us/2007/3/30/form-test-helper-plugin" rel="alternate" type="text/html"/>
    <title>Form Test Helper Plugin</title>
<content type="html">
            &lt;p&gt;This week I found the &lt;a href='http://form-test-helper.googlecode.com/svn/form_test_helper'&gt;FormTestHelper&lt;/a&gt; plugin by &lt;a href='http://www.jasongarber.com/articles/2006/10/24/easier-testing-of-forms-form_test_helper'&gt;Jason Garber&lt;/a&gt;. It both enhances and simplifies form testing in Rails functional and integration tests. The great thing is the FormTestHelper tests the form, not just the submission of the form data. For example, if you try to set a form element that doesn&#8217;t exist, an error is thrown.&lt;/p&gt;


	&lt;p&gt;Here&#8217;s my first pass at using FormTestHelper:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;14&lt;tt&gt;
&lt;/tt&gt;15&lt;tt&gt;
&lt;/tt&gt;16&lt;tt&gt;
&lt;/tt&gt;17&lt;tt&gt;
&lt;/tt&gt;18&lt;tt&gt;
&lt;/tt&gt;19&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;21&lt;tt&gt;
&lt;/tt&gt;22&lt;tt&gt;
&lt;/tt&gt;23&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;assertions = proc &lt;span class='r'&gt;do&lt;/span&gt; |response|&lt;tt&gt;
&lt;/tt&gt;  assert_response(response)&lt;tt&gt;
&lt;/tt&gt;  assert(exhibit = assigns(&lt;span class='sy'&gt;:exhibit&lt;/span&gt;), &lt;tt&gt;
&lt;/tt&gt;   &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;Should have assigned :exhibit&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;  assert(exhibit.errors.empty?, &lt;tt&gt;
&lt;/tt&gt;   &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;@exhibit should not have errors: &lt;/span&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;#{&lt;/span&gt;exhibit.errors.inspect&lt;span class='dl'&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;exhibit_count = &lt;span class='co'&gt;Exhibit&lt;/span&gt;.count&lt;tt&gt;
&lt;/tt&gt;get(&lt;span class='sy'&gt;:new&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;assertions.call(&lt;span class='sy'&gt;:success&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;submit_form(&lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;new_exhibit&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;span class='r'&gt;do&lt;/span&gt; |f|&lt;tt&gt;
&lt;/tt&gt;  f.exhibit.title = &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;New Exhibit&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  f.exhibit.exhibit_type_id = &lt;span class='i'&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  f.exhibit.license_id = &lt;span class='i'&gt;1&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  f.exhibit.annotation = &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;Exhibit notes.&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;assert_equal(exhibit_count += &lt;span class='i'&gt;1&lt;/span&gt;, &lt;span class='co'&gt;Exhibit&lt;/span&gt;.count )&lt;tt&gt;
&lt;/tt&gt;assertions.call(&lt;span class='sy'&gt;:redirect&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;assert_redirected_to(edit_exhibit_path(assigns(&lt;span class='sy'&gt;:exhibit&lt;/span&gt;)))&lt;tt&gt;
&lt;/tt&gt;assert(flash[&lt;span class='sy'&gt;:notice&lt;/span&gt;])&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
          </content>  </entry>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2007-01-29:70</id>
    <published>2007-01-29T19:19:00Z</published>
    <updated>2007-01-30T02:49:30Z</updated>
    <category term="Rails"/>
    <category term="Ruby"/>
    <link href="http://blog.dangosaur.us/2007/1/29/the-rails-edge" rel="alternate" type="text/html"/>
    <title>The Rails Edge</title>
<content type="html">
            &lt;p&gt;Last week I attended &lt;a href='http://pragmaticstudio.com/therailsedge/'&gt;The Rails Edge Reston&lt;/a&gt;. I can honestly say that it was the best workshop or conference I have attended. I&#8217;ve been to 3 or 4 &lt;a href='http://www.nofluffjuststuff.com/'&gt;No Fluff, Just Stuff&lt;/a&gt; conferences, &lt;a href='http://www.railsconf.com/'&gt;Rails Conf&lt;/a&gt;, and &lt;a href='http://www.rubyconf.com/'&gt;Ruby Conf&lt;/a&gt;. It&#8217;s true that I&#8217;ve seen many of the same speakers at these other events. Perhaps the presenting team has gelled into some sort of uber-team, but the pacing of the event and the little touches by Mike and Nicole put it over the edge for me.&lt;/p&gt;


	&lt;p&gt;It&#8217;s often said that Ruby has a very strong and positive community. The Rails Edge bore this out. One small example of this was during the MacBook Pro give-away. When the winner was announced, I heard nothing but wild, enthusiastic cheering for him.&lt;/p&gt;


	&lt;p&gt;As I told &lt;a href='http://clarkware.com/'&gt;Mike Clark&lt;/a&gt; and a few others, this is the first conference I have attended where I was not disappointed by a single presentation. Highlights for me were all of &lt;a href='http://www.pragmaticprogrammer.com/'&gt;Dave Thomas&#8217;s&lt;/a&gt; and &lt;a href='http://weirichhouse.org/'&gt;Jim Weirich&#8217;s&lt;/a&gt; presentations. I also liked the presentation team of &lt;a href='http://chadfowler.com/'&gt;Chad Fowler&lt;/a&gt; and &lt;a href='http://codefluency.com/'&gt;Bruce Williams&lt;/a&gt;. But as I said before, I was not disappointed in any of the presentations. The lightning and &lt;span class='caps'&gt;VGA&lt;/span&gt; presentations were fantastic, too. Quick exposure to what the some of the participants are doing with Ruby and Rails was an invaluable part of the conference.&lt;/p&gt;


	&lt;p&gt;Thanks to all the presenters and attendees, and especially &lt;a href='http://clarkware.com/'&gt;Mike&lt;/a&gt; and Nicole for organizing the event.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2007-01-26:69</id>
    <published>2007-01-26T15:46:00Z</published>
    <updated>2007-02-05T20:08:30Z</updated>
    <category term="Elemental"/>
    <category term="Rails"/>
    <category term="Ruby"/>
    <link href="http://blog.dangosaur.us/2007/1/26/introducing_elemental" rel="alternate" type="text/html"/>
    <title>Introducing Elemental</title>
<content type="html">
            &lt;h2&gt;&lt;span class='caps'&gt;HTML&lt;/span&gt; Element Names as Helper Methods&lt;/h2&gt;


	&lt;h2&gt;Summary&lt;/h2&gt;


	&lt;p&gt;repository: &lt;a href='http://svn.dangosaur.us/svn/elemental/'&gt;http://svn.dangosaur.us/svn/elemental/&lt;/a&gt;&lt;/p&gt;


	&lt;p&gt;Introduces builder-like syntax to rhtml:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; p &lt;span class='iv'&gt;@item&lt;/span&gt;.content &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; p span &lt;span class='iv'&gt;@person&lt;/span&gt;.first_name, &lt;span class='sy'&gt;:id&lt;/span&gt; =&amp;gt; dom_id(&lt;span class='iv'&gt;@person&lt;/span&gt;, &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;name_&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

or even
&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; table &lt;span class='r'&gt;do&lt;/span&gt; &lt;span class='iv'&gt;@list&lt;/span&gt;.each &lt;span class='r'&gt;do&lt;/span&gt; |item| tr &lt;span class='r'&gt;do&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; td item.name &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; td item.content &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; &lt;span class='r'&gt;end&lt;/span&gt; &lt;span class='r'&gt;end&lt;/span&gt; &lt;span class='r'&gt;end&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;Elemental allows you to use &lt;span class='caps'&gt;XHTML&lt;/span&gt; Transitional tags as helper methods in your rhtml. With traditional ERb, the code above would be written:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='ta'&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; &lt;span class='iv'&gt;@item&lt;/span&gt;.content &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='ta'&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;span&lt;/span&gt; &lt;span class='an'&gt;id&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; dom_id(&lt;span class='iv'&gt;@person&lt;/span&gt;, &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;name_&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;gt;&lt;/span&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; &lt;span class='iv'&gt;@person&lt;/span&gt;.first_name &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

and
&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='ta'&gt;&amp;lt;table&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; &lt;span class='iv'&gt;@list&lt;/span&gt;.each &lt;span class='r'&gt;do&lt;/span&gt; |item| &lt;span class='dl'&gt;-%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='ta'&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class='ta'&gt;&amp;lt;td&amp;gt;&lt;/span&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; item.name &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class='ta'&gt;&amp;lt;td&amp;gt;&lt;/span&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; item.content &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='ta'&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; &lt;span class='r'&gt;end&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='ta'&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;That&#8217;s more code, more noise as angle-brackets (especially embedded inside the html tag), and more lines. Elemental&#8217;s syntax is also cleaner and terser than when using &lt;em&gt;content_tag&lt;/em&gt;:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; content_tag &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;p&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class='iv'&gt;@item&lt;/span&gt;.content &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; content_tag &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;p&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, content_tag &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;span&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class='iv'&gt;@person&lt;/span&gt;.first_name, &lt;span class='sy'&gt;:id&lt;/span&gt; =&amp;gt; dom_id(&lt;span class='iv'&gt;@person&lt;/span&gt;, &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;name_&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;and you can&#8217;t send a block to &lt;em&gt;content_tag&lt;/em&gt;&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='ta'&gt;&amp;lt;table&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; &lt;span class='iv'&gt;@list&lt;/span&gt;.each &lt;span class='r'&gt;do&lt;/span&gt; |item| &lt;span class='dl'&gt;-%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='ta'&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; content_tag &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;td&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, item.name &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    &lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; content_tag &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;td&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, item.content &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='ta'&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; &lt;span class='r'&gt;end&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='ta'&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='ta'&gt;&amp;lt;table&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;h2&gt;Usage&lt;/h2&gt;


	&lt;p&gt;Elemental has three basic usages:&lt;/p&gt;


	&lt;p&gt;1. Self-closing tags: no argument, or hash only for argument:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; br &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; br &lt;span class='sy'&gt;:class&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;someClass&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
      

	&lt;p&gt;2. Content tags: first argument is the value of the content:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; p &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some content&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; p &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some content&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class='sy'&gt;:id&lt;/span&gt; =&amp;gt; dom_id(&lt;span class='iv'&gt;@object&lt;/span&gt;) &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;3. Content tags with a block argument:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; div &lt;span class='sy'&gt;:class&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some-class&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class='r'&gt;do&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;      ...&lt;tt&gt;
&lt;/tt&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; &lt;span class='r'&gt;end&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;You can nest Elemental methods:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; p span &lt;span class='iv'&gt;@object&lt;/span&gt;.value &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  or&lt;tt&gt;
&lt;/tt&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; p(span(&lt;span class='iv'&gt;@object&lt;/span&gt;.value)) &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  generates:&lt;tt&gt;
&lt;/tt&gt;&lt;span class='ta'&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;span&amp;gt;&lt;/span&gt;the object's value&lt;span class='ta'&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;The same thing with attributes (pay attention to your parentheses):&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; p span &lt;span class='iv'&gt;@object&lt;/span&gt;.value, &lt;span class='sy'&gt;:id&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some_id&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class='sy'&gt;:class&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some_class&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  generates:&lt;tt&gt;
&lt;/tt&gt;&lt;span class='ta'&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;span&lt;/span&gt; &lt;span class='an'&gt;id&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some_id&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class='an'&gt;class&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some_class&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;gt;&lt;/span&gt;the object's value&lt;span class='ta'&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  while&lt;tt&gt;
&lt;/tt&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; p span(&lt;span class='iv'&gt;@object&lt;/span&gt;.value, &lt;span class='sy'&gt;:id&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some_id&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;), &lt;span class='sy'&gt;:class&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some_class&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  generates:&lt;tt&gt;
&lt;/tt&gt;&lt;span class='ta'&gt;&amp;lt;p&lt;/span&gt; &lt;span class='an'&gt;class&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some_class&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;span&lt;/span&gt; &lt;span class='an'&gt;id&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some_id&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;gt;&lt;/span&gt;the object's value&lt;span class='ta'&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;You can nest the methods in blocks:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; p &lt;span class='r'&gt;do&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; span &lt;span class='sy'&gt;:class&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;someClass&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class='r'&gt;do&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    Lorem ipsum dolor sit amet, consectetur adipisicing elit, &lt;tt&gt;
&lt;/tt&gt;    sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; &lt;span class='r'&gt;end&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; &lt;span class='r'&gt;end&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

    or
&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; p &lt;span class='r'&gt;do&lt;/span&gt; span &lt;span class='sy'&gt;:class&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;someClass&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class='r'&gt;do&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  Lorem ipsum dolor sit amet, consectetur adipisicing elit, &lt;tt&gt;
&lt;/tt&gt;  sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.&lt;tt&gt;
&lt;/tt&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; &lt;span class='r'&gt;end&lt;/span&gt; &lt;span class='r'&gt;end&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

which both generate:
&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='ta'&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='ta'&gt;&amp;lt;span&lt;/span&gt; &lt;span class='an'&gt;class&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;someClass&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    Lorem ipsum dolor sit amet, consectetur adipisicing elit, &lt;tt&gt;
&lt;/tt&gt;    sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='ta'&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='ta'&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;This is useful for loops:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; ul &lt;span class='r'&gt;do&lt;/span&gt; [&lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;one&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;two&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;three&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;].each &lt;span class='r'&gt;do&lt;/span&gt; |item| &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; li item &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%&lt;/span&gt; &lt;span class='r'&gt;end&lt;/span&gt; &lt;span class='r'&gt;end&lt;/span&gt; &lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;

which generates:
&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='ta'&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='ta'&gt;&amp;lt;li&amp;gt;&lt;/span&gt;one&lt;span class='ta'&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='ta'&gt;&amp;lt;li&amp;gt;&lt;/span&gt;two&lt;span class='ta'&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='ta'&gt;&amp;lt;li&amp;gt;&lt;/span&gt;three&lt;span class='ta'&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='ta'&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;h2&gt;Options/Attributes Hash&lt;/h2&gt;


	&lt;p&gt;Options are converted to regular html attributes. None are filtered, so you can certainly insert invalid attributes.&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;&amp;lt;%=&lt;/span&gt; span &lt;span class='sy'&gt;:id&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some_id&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class='sy'&gt;:bogus_attribute&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some_value&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  generates:&lt;tt&gt;
&lt;/tt&gt;&lt;span class='ta'&gt;&amp;lt;span&lt;/span&gt; &lt;span class='an'&gt;id&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some_id&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class='an'&gt;bogus_attribute&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;some_value&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;h2&gt;Omitted Tags&lt;/h2&gt;


	&lt;p&gt;Rails&#8217; ActionView::Helpers already defines &lt;em&gt;form&lt;/em&gt;, &lt;em&gt;select&lt;/em&gt;, and &lt;em&gt;input&lt;/em&gt;, so these are omitted from Elemental.&lt;/p&gt;


	&lt;h2&gt;Motivation&lt;/h2&gt;


	&lt;p&gt;Afer using Markaby a bit, I decided there were situations where I wanted a Markaby or Builder-type syntax within rhtml&#8217;s context. I had been using &lt;em&gt;content_tag&lt;/em&gt; quite a bit for convenience, but wanted more &lt;em&gt;legible&lt;/em&gt; and &lt;em&gt;concise&lt;/em&gt; code, espcially for loops.&lt;/p&gt;


	&lt;h2&gt;Acknowledgments&lt;/h2&gt;


	&lt;p&gt;_why for Markaby and its list of &lt;span class='caps'&gt;XHTML&lt;/span&gt; and &lt;span class='caps'&gt;XHTML&lt;/span&gt; Transitional tag lists, which I used.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2006-12-30:66</id>
    <published>2006-12-30T05:46:00Z</published>
    <updated>2006-12-30T05:47:53Z</updated>
    <link href="http://blog.dangosaur.us/2006/12/30/out-with-typo-in-with-mephisto" rel="alternate" type="text/html"/>
    <title>Out with Typo, In with Mephisto</title>
<content type="html">
            &lt;p&gt;I finally finished the basic change-over to Mephisto tonight. Looks like I&#8217;ll need to restyle the code examples, as they are puny and lack any syntax-coloring.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2006-09-13:45</id>
    <published>2006-09-13T08:00:54Z</published>
    <updated>2006-12-07T05:19:33Z</updated>
    <link href="http://blog.dangosaur.us/2006/9/13/88" rel="alternate" type="text/html"/>
    <title>88</title>
<content type="html">
            &lt;p&gt;Today would be my father&#8217;s 88th birthday, if he were still alive. Happy Birthday, dad!&lt;/p&gt;


	&lt;p&gt;Bill was a heavy-duty programmer in the early days of computing, contributing quite a lot to linear programming. He wrote a &lt;a href='http://www.alibris.com/search/books/author/William%20Orchard-Hays'&gt;book&lt;/a&gt; on it and co-authored at least one &lt;a href='http://links.jstor.org/sici?sici=0891-6837%28195404%298%3A46%3C64%3ATPFFTI%3E2.0.CO%3B2-C'&gt;article&lt;/a&gt; on the &lt;a href='http://en.wikipedia.org/wiki/Simplex_algorithm'&gt;Simplex Method&lt;/a&gt; with &lt;a href='http://www.umass.edu/wsp/statistics/tales/dantzig.html'&gt;George Danzig&lt;/a&gt;.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2006-08-31:44</id>
    <published>2006-08-31T07:20:00Z</published>
    <updated>2006-12-31T16:58:23Z</updated>
    <link href="http://blog.dangosaur.us/2006/8/31/dumping-a-table-to-yaml" rel="alternate" type="text/html"/>
    <title>Dumping a Table to Yaml</title>
<content type="html">
            &lt;p&gt;I decided I wanted all 356 rows of a table dumped to a fixture, but  
&lt;span class='caps'&gt;CSV&lt;/span&gt; was a disaster. So:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;require &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;yaml&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;js = &lt;span class='co'&gt;Journal&lt;/span&gt;.find_all&lt;tt&gt;
&lt;/tt&gt;&lt;span class='co'&gt;File&lt;/span&gt;.open (&lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;dump.yml&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;w&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span class='r'&gt;do&lt;/span&gt; |f|&lt;tt&gt;
&lt;/tt&gt;  js.each &lt;span class='r'&gt;do&lt;/span&gt; |j|&lt;tt&gt;
&lt;/tt&gt;    f.print &lt;span class='co'&gt;YAML&lt;/span&gt;.dump ({&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;j_&lt;/span&gt;&lt;span class='il'&gt;&lt;span class='dl'&gt;#{&lt;/span&gt;j.id&lt;span class='dl'&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; =&amp;gt; j.attributes})&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='r'&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;(I actually did it from script/console.) The only caveat is I got a  
line of &#8220;&lt;del&gt;-&lt;/del&gt;&#8221; between each entry that I had to delete.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2006-06-09:43</id>
    <published>2006-06-09T14:58:31Z</published>
    <updated>2006-12-07T05:19:33Z</updated>
    <link href="http://blog.dangosaur.us/2006/6/9/macbook-pro-battery-grows" rel="alternate" type="text/html"/>
    <title>MacBook Pro Battery Grows</title>
<content type="html">
            &lt;p&gt;A couple of days ago my MacBook Pro started shutting down randomly while running on battery. I called Apple, they had me reset the power manager and the &lt;span class='caps'&gt;PRAM&lt;/span&gt;. The next day, it shut down again, so I called Apple and they agreed to ship a new battery. Yesterday, while still on the original battery, I noticed my clicker acting funny-&lt;del&gt;it felt scratchy. Today it got worse&lt;/del&gt;-it wouldn&#8217;t push down very far. Then I remembered a buddy who had had the same issue (our machines were made and shipped together&#8212;they tracked together all the way from Shanghai). First his &lt;span class='caps'&gt;MBP&lt;/span&gt; randomly shut down on battery power. Then the battery &lt;i&gt;swelled&lt;/i&gt;. The swelling was so bad, it caused permanent damage to his clicker. I pulled out my battery, and sure enough, my clicker returned to normal. I looked sideways at the battery. It&#8217;s started bulging in the middle and the aluminum bottom is starting to separate.&lt;/p&gt;


	&lt;p&gt;How can there not be a recall on these batteries yet?&lt;/p&gt;


	&lt;p&gt;Here&#8217;s Anoop&#8217;s &lt;a href='http://ranganath.com/~anoop/blog/articles/2006/05/23/my-apple-is-a-lemon'&gt;post&lt;/a&gt;. I have the same heat and whine issues. Apple agreed to service it a few months ago, but I&#8217;ve needed it too much to send it in. Hopefully in July.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2006-05-16:42</id>
    <published>2006-05-16T12:38:27Z</published>
    <updated>2006-12-07T05:19:33Z</updated>
    <link href="http://blog.dangosaur.us/2006/5/16/prototype-bindaseventlistener" rel="alternate" type="text/html"/>
    <title>Prototype: bindAsEventListener()</title>
<content type="html">
            &lt;p&gt;I&#8217;ve been working on some javascript code for a client site and found a good use for binding event listeners through javascript rather than inline. There are several pages I need to add javascript code to expand each textarea on focus and collapse it on blur. So I wrote this simple function using &lt;a href='http://wiki.script.aculo.us/scriptaculous/show/Prototype'&gt;Prototype&lt;/a&gt;:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;var&lt;/span&gt; expandTextArea = &lt;span class='r'&gt;function&lt;/span&gt;(&lt;span class='pt'&gt;event&lt;/span&gt;){&lt;tt&gt;
&lt;/tt&gt;    Event.element(&lt;span class='pt'&gt;event&lt;/span&gt;).rows = 10;&lt;tt&gt;
&lt;/tt&gt;}.bindAsEventListener(&lt;span class='pc'&gt;this&lt;/span&gt;);&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;The part I was unfamiliar with was &lt;code&gt;.bindAsEventListener(this)&lt;/code&gt;. It comes from the Prototype framework and is defined:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='pt'&gt;Function&lt;/span&gt;.prototype.bindAsEventListener = &lt;span class='r'&gt;function&lt;/span&gt;(object) {&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='r'&gt;var&lt;/span&gt; __method = &lt;span class='pc'&gt;this&lt;/span&gt;;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='r'&gt;return&lt;/span&gt; &lt;span class='r'&gt;function&lt;/span&gt;(&lt;span class='pt'&gt;event&lt;/span&gt;) {&lt;tt&gt;
&lt;/tt&gt;    &lt;span class='r'&gt;return&lt;/span&gt; __method.&lt;span class='fu'&gt;call&lt;/span&gt;(object, &lt;span class='pt'&gt;event&lt;/span&gt; || &lt;span class='pt'&gt;window&lt;/span&gt;.&lt;span class='pt'&gt;event&lt;/span&gt;);&lt;tt&gt;
&lt;/tt&gt;  }&lt;tt&gt;
&lt;/tt&gt;}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;While studying this, I found Simon Willison&#8217;s &lt;a href='http://simon.incutio.com/slides/2006/etech/javascript/js-reintroduction-notes.html'&gt;A Reintroduction to Javascript&lt;/a&gt;. I highly recommend it. At the bottom of his discussion of &lt;a href='http://simon.incutio.com/slides/2006/etech/javascript/js-reintroduction-notes.html#customobjects'&gt;custom objects&lt;/a&gt;, he describes how to use &lt;code&gt;apply()&lt;/code&gt; and &lt;code&gt;call()&lt;/code&gt;. I&#8217;m not sure if my understanding is correct, but it reads to me as:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;em&gt;this&lt;/em&gt; is passed as the Window object to &lt;em&gt;bindAsEventListener(this)&lt;/em&gt;&lt;/li&gt;
		&lt;li&gt;&lt;em&gt;bindAsEventListener()&lt;/em&gt; returns a function that when called back by the event&lt;/li&gt;
		&lt;li&gt;attaches &lt;em&gt;expandTextArea(event)&lt;/em&gt; (in this case) to &lt;em&gt;object&lt;/em&gt; (&lt;em&gt;Window&lt;/em&gt;) and then calls the method.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;The callbacks and closures are really interesting, if a bit difficult to understand, in Javascript. I welcome comments!&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2006-05-06:41</id>
    <published>2006-05-06T19:55:43Z</published>
    <updated>2006-12-07T05:19:32Z</updated>
    <link href="http://blog.dangosaur.us/2006/5/6/markaby-rules" rel="alternate" type="text/html"/>
    <title>Markaby Rules</title>
<content type="html">
            &lt;p&gt;I&#8217;ve been playing with &lt;a href='http://rubyforge.org/projects/markaby/'&gt;Markaby&lt;/a&gt; the past few nights. I love it! I&#8217;m in the camp that would rather write everything in Ruby rather than mix with html and ERb. I find reading this code:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;13&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;error_messages_for &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;laptop&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;p &lt;span class='r'&gt;do&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;  label &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;Name&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class='sy'&gt;:for&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;laptop_name&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  text_field &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;laptop&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;name&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;div &lt;span class='r'&gt;do&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  label &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;Condition&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class='sy'&gt;:for&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;laptop_condition&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;div &lt;span class='r'&gt;do&lt;/span&gt; &lt;tt&gt;
&lt;/tt&gt;  collection_select(&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;laptop&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;condition_id&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class='iv'&gt;@conditions&lt;/span&gt;, &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;id&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;description&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;much easier and enjoyable than this code:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&amp;lt;%= error_messages_for &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;laptop&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;span class='k'&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;p&lt;/span&gt;&lt;span class='dl'&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&amp;lt;label &lt;span class='r'&gt;for&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;laptop_name&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;span class='co'&gt;Name&lt;/span&gt;&amp;lt;&lt;span class='rx'&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;span class='k'&gt;label&amp;gt;&amp;lt;br&lt;/span&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;%= text_field &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;laptop&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;name&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;  &lt;span class='s'&gt;&lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;span class='k'&gt;&amp;lt;/p&lt;/span&gt;&lt;span class='dl'&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;div&amp;gt;&amp;lt;label &lt;span class='r'&gt;for&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;laptop_condition&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&amp;gt;&lt;span class='co'&gt;Condition&lt;/span&gt;&amp;lt;&lt;span class='rx'&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;span class='k'&gt;label&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;div&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;%=  collection_select(&amp;quot;laptop&amp;quot;, &amp;quot;condition_id&amp;quot;, @conditions, &amp;quot;id&amp;quot;, &amp;quot;description&amp;quot;) %&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;&lt;/span&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;/span&gt;div&amp;gt;&lt;tt&gt;
&lt;/tt&gt;&amp;lt;&lt;span class='rx'&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;span class='k'&gt;div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;The ERb code is much noisier and therefore harder to read. The Markaby code is cleaner and more elegant.&lt;/p&gt;
          </content>  </entry>
  <entry xml:base="http://blog.dangosaur.us/">
    <author>
      <name>jamie</name>
    </author>
    <id>tag:blog.dangosaur.us,2006-04-26:40</id>
    <published>2006-04-26T11:19:22Z</published>
    <updated>2006-12-07T05:19:32Z</updated>
    <link href="http://blog.dangosaur.us/2006/4/26/class-level-accessors-in-ruby" rel="alternate" type="text/html"/>
    <title>Class-level accessors in Ruby</title>
<content type="html">
            &lt;p&gt;While looking at the source code for Capistrano today, I came across a nice idiom for making class-level accessors:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;4&lt;tt&gt;
&lt;/tt&gt;5&lt;tt&gt;
&lt;/tt&gt;6&lt;tt&gt;
&lt;/tt&gt;7&lt;tt&gt;
&lt;/tt&gt;8&lt;tt&gt;
&lt;/tt&gt;9&lt;tt&gt;
&lt;/tt&gt;&lt;strong&gt;10&lt;/strong&gt;&lt;tt&gt;
&lt;/tt&gt;11&lt;tt&gt;
&lt;/tt&gt;12&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;Actor&lt;/span&gt;  &lt;tt&gt;
&lt;/tt&gt;  &lt;span class='r'&gt;class&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class='cl'&gt;self&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    attr_accessor &lt;span class='sy'&gt;:connection_factory&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    attr_accessor &lt;span class='sy'&gt;:command_factory&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    attr_accessor &lt;span class='sy'&gt;:transfer_factory&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;    attr_accessor &lt;span class='sy'&gt;:default_io_proc&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='r'&gt;end&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='pc'&gt;self&lt;/span&gt;.connection_factory = &lt;span class='co'&gt;DefaultConnectionFactory&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='pc'&gt;self&lt;/span&gt;.command_factory = &lt;span class='co'&gt;Command&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;  &lt;span class='pc'&gt;self&lt;/span&gt;.transfer_factory = &lt;span class='co'&gt;Transfer&lt;/span&gt;&lt;tt&gt;
&lt;/tt&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;


	&lt;p&gt;Now you can use these class-level accessors:&lt;/p&gt;


&lt;table class='CodeRay'&gt;&lt;tr&gt;
  &lt;td title='click to toggle' class='line_numbers'&gt;&lt;pre&gt;1&lt;tt&gt;
&lt;/tt&gt;2&lt;tt&gt;
&lt;/tt&gt;3&lt;tt&gt;
&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;
  &lt;td class='code'&gt;&lt;pre&gt;&lt;span class='co'&gt;Actor&lt;/span&gt;.connection_factory&lt;tt&gt;
&lt;/tt&gt;&lt;span class='co'&gt;Actor&lt;/span&gt;.command_factory&lt;tt&gt;
&lt;/tt&gt;...&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;&lt;/table&gt;
          </content>  </entry>
</feed>
