<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US">
  <title>Nick Sieger</title>
  <id>tag:blog.nicksieger.com,2005:Typo</id>
  <generator uri="http://www.typosphere.org" version="4.0">Typo</generator>
  
  <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/" />
  <updated>2012-01-13T21:00:24+00:00</updated>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/nicksieger" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="nicksieger" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:b0ad9201-5e73-47b4-8a5a-f3330f9a7d86</id>
    <published>2012-01-13T21:00:24+00:00</published>
    <updated>2012-01-13T21:00:24+00:00</updated>
    <title>Letter to My Congresspeople Regarding SOPA/PIPA</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2012/01/13/letter-to-my-congresspeople-regarding-sopa-pipa" />
    <category term="democracy" scheme="http://blog.nicksieger.com/articles/tag/democracy" />
    <category term="government" scheme="http://blog.nicksieger.com/articles/tag/government" />
    <category term="politics" scheme="http://blog.nicksieger.com/articles/tag/politics" />
    <content type="html">&lt;p&gt;Dear Sen&amp;#46; Klobuchar, Sen&amp;#46; Franken, and Rep&amp;#46; Ellison,&lt;/p&gt;

&lt;p&gt;I am writing to express my deep concern about the pending SOPA/PIPA legislation&amp;#46; I have seen reports that Sen&amp;#46; Franken and Sen&amp;#46; Klobuchar are both in favor of this legislation&amp;#46; This troubles me&amp;#46;&lt;/p&gt;

&lt;p&gt;I see the intense legal pressure applied by the movie and recording industries to Congress as evidence that they simply don&amp;#8217;t understand how to run their businesses in an ever changing technological landscape&amp;#46; They should realize that they could &lt;a href="http://steveblank.com/2012/01/04/why-the-movie-industry-cant-innovate-and-the-result-is-sopa/"&gt;increase revenues by embracing new channels of distribution&lt;/a&gt; instead of wasting time tracking lost revenues due to piracy or fraud&amp;#46;&lt;/p&gt;

&lt;p&gt;Based on this view, I see SOPA/PIPA as yet another misguided government attempt to intervene, prop up, and rescue an industry that doesn&amp;#8217;t know how to alter its own business models to align with the current economic and technological climate&amp;#46; This attempt comes at the expense of taxpayers and citizens who view freedom of speech and information as inherent, unalienable rights&amp;#46;&lt;/p&gt;

&lt;p&gt;Frankly, I find the amount of money raised for &lt;a href="http://sopatrack.com/congressperson/F000457-sen-al-franken"&gt;Sen&amp;#46; Franken&lt;/a&gt; and &lt;a href="http://sopatrack.com/congressperson/K000367-sen-amy-klobuchar"&gt;Sen&amp;#46; Klobuchar&lt;/a&gt; to be a disgusting example of special interests buying legislation&amp;#46; As a constituent of the the state of Minnesota and its fifth congressional district, I urge Sen&amp;#46; Franken, Sen&amp;#46; Klobuchar, and &lt;a href="http://sopatrack.com/congressperson/E000288-rep-keith-ellison"&gt;Rep&amp;#46; Ellison&lt;/a&gt; to return all funds contributed for and against this legislation and to remove any support for this bill&amp;#46;&lt;/p&gt;

&lt;p&gt;Regards,&lt;/p&gt;

&lt;p&gt;Nick Sieger&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:8663d835-d0b5-47ae-a5ea-fa8141ec5222</id>
    <published>2011-01-20T17:47:21+00:00</published>
    <updated>2011-01-20T17:47:22+00:00</updated>
    <title>RSpec 2 Matcher Fun</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2011/01/20/rspec-2-matcher-fun" />
    <category term="ruby" scheme="http://blog.nicksieger.com/articles/tag/ruby" />
    <category term="rspec" scheme="http://blog.nicksieger.com/articles/tag/rspec" />
    <content type="html">&lt;p&gt;I was troubleshooting some JRuby code that transforms Java &lt;code&gt;camelCase&lt;/code&gt; method names into Ruby &lt;code&gt;snake_case&lt;/code&gt; form&amp;#46; We had a bunch of specs that did this, for example:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;describe&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Java instance method names&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="ident"&gt;it&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;should present javabean properties as attribute readers and writers&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="ident"&gt;methods&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;MethodNames&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;instance_methods&lt;/span&gt;

    &lt;span class="ident"&gt;methods&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;should&lt;/span&gt; &lt;span class="ident"&gt;include&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;getValue2&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
    &lt;span class="ident"&gt;methods&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;should&lt;/span&gt; &lt;span class="ident"&gt;include&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;get_value2&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
    &lt;span class="ident"&gt;methods&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;should&lt;/span&gt; &lt;span class="ident"&gt;include&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;value2&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;

    &lt;span class="ident"&gt;methods&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;should&lt;/span&gt; &lt;span class="ident"&gt;include&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;setValue2&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
    &lt;span class="ident"&gt;methods&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;should&lt;/span&gt; &lt;span class="ident"&gt;include&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;set_value2&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
    &lt;span class="ident"&gt;methods&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;should&lt;/span&gt; &lt;span class="ident"&gt;include&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;value2=&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;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The problem comes when these specs fail&amp;#46; The default error message made by the &lt;code&gt;#include&lt;/code&gt; matcher looks like:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;Failures:

  1) Java instance method names should present javabean properties as attribute readers and writers
     Failure/Error: methods.should include(&amp;quot;get_value2&amp;quot;)
       expected [...full contents of array here...] to include &amp;quot;get_value2&amp;quot;
       Diff:
       @@ -1,2 +1,186 @@
       -get_value2
       +[...all entries, one per line here...]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That&amp;#8217;s not a terrible message, but when your array contains over 100 entries (like an array of method names), it could be a lot better&amp;#46; In particular, I kept scanning the failure message&amp;#8217;s big list, unable to clearly see why the methods I was expecting weren&amp;#8217;t there&amp;#46;&lt;/p&gt;

&lt;p&gt;What I wanted to see was how my changes to the regex which splits a Java &lt;code&gt;camelCase&lt;/code&gt; name affected the conversion&amp;#46; So, what I needed was a report of which method names were the closest to the ones that were not in the list&amp;#46; Hey, sounds like a good reason to implement a custom matcher, and take a diversion into fuzzy string matching algorithms!&lt;/p&gt;

&lt;p&gt;I settled on porting the &lt;a href="http://en.wikipedia.org/wiki/Levenshtein_distance"&gt;pseudocode in Wikipedia for the Levenshtein distance&lt;/a&gt;, which calculates how close in content two strings are to each other&amp;#46; I looked around and there are existing Levenshtein ports for Ruby, but they use native code for performance&amp;#46; I don&amp;#8217;t need performance because I&amp;#8217;m only using the Levenshtein function when there is a failure&amp;#46;  Of course, pure Ruby code is more portable too!&amp;#46;&lt;/p&gt;

&lt;p&gt;The other change I made in the specs was to pass all strings in a single matcher rather than one name per expectation, so we can see all names that fail, not just the first&amp;#46;&lt;/p&gt;

&lt;p&gt;So now, the new spec looks more like this:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;describe&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Java instance method names&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="ident"&gt;let&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:members&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="constant"&gt;MethodNames&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;instance_methods&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;

  &lt;span class="ident"&gt;it&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;should present javabean properties as attribute readers and writers&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="ident"&gt;members&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;should&lt;/span&gt; &lt;span class="ident"&gt;have_strings&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;getValue2&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;get_value2&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;value2&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;setValue2&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;set_value2&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;value2=&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;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The custom RSpec matcher &lt;code&gt;#have_strings&lt;/code&gt; is declared like so:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;RSpec&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Matchers&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;define&lt;/span&gt; &lt;span class="symbol"&gt;:have_strings&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;strings&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
  &lt;span class="ident"&gt;match&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;container&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
    &lt;span class="attribute"&gt;@included&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="attribute"&gt;@missing&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;strings&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;flatten&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;s&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;container&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;include?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
        &lt;span class="attribute"&gt;@included&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;s&lt;/span&gt;
      &lt;span class="keyword"&gt;else&lt;/span&gt;
        &lt;span class="attribute"&gt;@missing&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;s&lt;/span&gt;
      &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
    &lt;span class="attribute"&gt;@missing&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;empty?&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="ident"&gt;failure_message_for_should&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;container&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;expected array of &lt;span class="expr"&gt;#{container.length}&lt;/span&gt; elements to include &lt;span class="expr"&gt;#{@missing.inspect}&lt;/span&gt;.&lt;span class="escape"&gt;\n&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&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;&lt;span class="expr"&gt;#{closest_match_message(@missing, container)}&lt;/span&gt;&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="ident"&gt;failure_message_for_should_not&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;container&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;expected array of &lt;span class="expr"&gt;#{container.length}&lt;/span&gt; elements to not include &lt;span class="expr"&gt;#{@included.inspect}&lt;/span&gt;.&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;def &lt;/span&gt;&lt;span class="method"&gt;closest_match_message&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;missing&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;container&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;missing&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;map&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;m&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;groups&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;container&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;group_by&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;levenshtein&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;m&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="punct"&gt;}&lt;/span&gt;
      &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;  closest match for &lt;span class="expr"&gt;#{m.inspect}&lt;/span&gt;: &lt;span class="expr"&gt;#{groups[groups.keys.min].inspect}&lt;/span&gt;&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="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;join&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="escape"&gt;\n&lt;/span&gt;&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;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I omitted the &lt;code&gt;#levenshtein&lt;/code&gt; function here for brevity&amp;#46; (&lt;a href="https://github.com/jruby/jruby/blob/f36a117ea2c2dac0f35ee6ff4e650354358ad668/spec/java_integration/spec_helper.rb"&gt;You can view the full source for details&lt;/a&gt;&amp;#46;) Now our failing spec output looks like:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_default "&gt;Failures:

  1) Java instance method names should present javabean properties as attribute readers and writers
     Failure/Error: members.should have_strings(&amp;quot;getValue2&amp;quot;,
       expected array of 185 elements to include [&amp;quot;get_my_value&amp;quot;, &amp;quot;my_value&amp;quot;, &amp;quot;set_my_value&amp;quot;, &amp;quot;my_value=&amp;quot;].
         closest match for &amp;quot;get_my_value&amp;quot;: [&amp;quot;get_myvalue&amp;quot;, &amp;quot;set_myvalue&amp;quot;]
         closest match for &amp;quot;my_value&amp;quot;: [&amp;quot;myvalue&amp;quot;]
         closest match for &amp;quot;set_my_value&amp;quot;: [&amp;quot;get_myvalue&amp;quot;, &amp;quot;set_myvalue&amp;quot;]
         closest match for &amp;quot;my_value=&amp;quot;: [&amp;quot;myvalue=&amp;quot;]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now the failure message is giving me exactly the information I need&amp;#46; Much better, don&amp;#8217;t you think?&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:54d64c3a-a08a-49b3-ac89-480bf1064714</id>
    <published>2010-11-22T18:30:00+00:00</published>
    <updated>2010-11-22T18:31:54+00:00</updated>
    <title>War on Perfect</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2010/11/22/war-on-perfect" />
    <category term="rubyconf" scheme="http://blog.nicksieger.com/articles/tag/rubyconf" />
    <category term="lightning" scheme="http://blog.nicksieger.com/articles/tag/lightning" />
    <category term="ruby" scheme="http://blog.nicksieger.com/articles/tag/ruby" />
    <category term="programming" scheme="http://blog.nicksieger.com/articles/tag/programming" />
    <category term="life" scheme="http://blog.nicksieger.com/articles/tag/life" />
    <content type="html">&lt;p&gt;&lt;em&gt;I intended to give this brief as a lightning talk at RubyConf 2010, but unfortunately did not get a chance&amp;#46; Though I kept the message simple, I think if you sympathize with being a perfectionist you can find some part of these points that rings true&amp;#46; I know I still &lt;a href="https://rubygems.org/profiles/nicksieger"&gt;have a ways to go&lt;/a&gt; in heeding my own advice, and not only in software but in my life as a whole&amp;#46;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks to &lt;a href="http://jruby-ja.blogspot.com/"&gt;Hiro Asari&lt;/a&gt; for the Japanese translations and &lt;a href="http://www.copiousfreetime.org/"&gt;Jeremy Hinegardner&lt;/a&gt; for the Rubygems&amp;#46;org numbers&amp;#46;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;War on Perfect&lt;/h2&gt;

&lt;p&gt;I want to start a war&amp;#46;&lt;/p&gt;

&lt;p&gt;宣戦布告&lt;/p&gt;

&lt;p&gt;A war on Perfection!&lt;/p&gt;

&lt;p&gt;完璧主義への宣戦布告！&lt;/p&gt;

&lt;p&gt;Perfect&amp;#46;&lt;/p&gt;

&lt;p&gt;完璧&lt;/p&gt;

&lt;p&gt;I hate this word&amp;#46;&lt;/p&gt;

&lt;p&gt;この言葉が大嫌いです。&lt;/p&gt;

&lt;p&gt;I want to eliminate it from our vocabulary&amp;#46;&lt;/p&gt;

&lt;p&gt;私達の語彙から抹消したいのです。&lt;/p&gt;

&lt;p&gt;What is Perfect?&lt;/p&gt;

&lt;p&gt;そもそも完璧とは何でしょう。&lt;/p&gt;

&lt;p&gt;Ask 10 people, get 10 answers&amp;#46;&lt;/p&gt;

&lt;p&gt;訊けば十人十色の答えが返ってくるでしょう。&lt;/p&gt;

&lt;p&gt;Different answers means disagreement&amp;#46;&lt;/p&gt;

&lt;p&gt;答えが違うという事は、いずれ食い違いが起こるという事に他なりません。&lt;/p&gt;

&lt;p&gt;Perfection cannot accept compromise&amp;#46;&lt;/p&gt;

&lt;p&gt;完璧主義には妥協の余地がありません。&lt;/p&gt;

&lt;p&gt;Without compromise, we cannot get along, or get anything done&amp;#46;&lt;/p&gt;

&lt;p&gt;妥協無しには、仲良くやって行ったり
何かを成し遂げる事は出来ないでしょう。&lt;/p&gt;

&lt;p&gt;(Just look at politics in the USA&amp;#46;)&lt;/p&gt;

&lt;p&gt;アメリカの政治を見れば解りますね。&lt;/p&gt;

&lt;p&gt;Perfect is lonely if you can&amp;#8217;t agree or share with anyone else&amp;#46;&lt;/p&gt;

&lt;p&gt;他人と合意や共有が出来ないので
完璧主義とは孤独でもあります。&lt;/p&gt;

&lt;p&gt;We are human&amp;#46; No one wants to be alone&amp;#46;&lt;/p&gt;

&lt;p&gt;僕らは人間。孤独は厭です。&lt;/p&gt;

&lt;p&gt;Perfect is contagious&lt;/p&gt;

&lt;p&gt;完璧主義は伝染し易い。&lt;/p&gt;

&lt;blockquote&gt;
    &lt;p&gt;If you’re not embarrassed when you ship your first version you waited too long&amp;#46;&lt;/p&gt;
    
    &lt;p&gt;「初めのリリースで恥ずかしくないのはリリースを遅らせ過ぎた証。」&lt;/p&gt;
    
    &lt;p&gt;&amp;#45;&amp;#45; &lt;a href="http://ma.tt/2010/11/one-point-oh/"&gt;Matt Mullenweg  マット・マレンウェグ&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How many Ruby gems have never seen 1&amp;#46;0?&lt;/p&gt;

&lt;p&gt;Rubyのgemで1&amp;#46;0に到達しないものは幾つありますか。&lt;/p&gt;

&lt;p&gt;Any guesses?&lt;/p&gt;

&lt;p&gt;けんとうはつきますか。&lt;/p&gt;

&lt;p&gt;17864 Rubygems
86837 versions バージョン&lt;/p&gt;

&lt;p&gt;13496 gems without a version that does not start with “0”&amp;#46; 75 Percent!&lt;/p&gt;

&lt;p&gt;&lt;img src="http://img.skitch.com/20101122-8aetibipqg3s9ei7bntsmbhgb3.jpg" alt="75%"/&gt;&lt;/p&gt;

&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;p&gt;I challenge you all to release 1&amp;#46;0 on your first push to Rubygems next time&amp;#46;&lt;/p&gt;

&lt;p&gt;この次にRubygemsにプッシュする時はバージョンを1&amp;#46;0にしましょう。&lt;/p&gt;

&lt;p&gt;Perfect is impossible&lt;/p&gt;

&lt;p&gt;完璧は不可能&lt;/p&gt;

&lt;p&gt;If you seek it, you will never quite attain it&amp;#46;&lt;/p&gt;

&lt;p&gt;求めても得る事は難しい。&lt;/p&gt;

&lt;p&gt;You will worry it&amp;#8217;s not perfect enough, and it will escape your grasp&amp;#46;&lt;/p&gt;

&lt;p&gt;あなたが完璧か心配しているうちに完璧は逃げて行ってしまう。&lt;/p&gt;

&lt;p&gt;Perfect keeps you too focused on one thing&amp;#46;&lt;/p&gt;

&lt;p&gt;完璧主義は視野を狭くする。&lt;/p&gt;

&lt;p&gt;Your mind will cripple you&amp;#46;&lt;/p&gt;

&lt;p&gt;そして足枷になる。&lt;/p&gt;

&lt;p&gt;You won&amp;#8217;t be able to finish it&amp;#46;&lt;/p&gt;

&lt;p&gt;プロジェクトを完成出来ずに&lt;/p&gt;

&lt;p&gt;You&amp;#8217;ll feel helpless because nothing is ever good enough&amp;#46;&lt;/p&gt;

&lt;p&gt;よくやったと思えずに、絶望感に襲われる。&lt;/p&gt;

&lt;p&gt;Perfect ruins your productivity&amp;#46;&lt;/p&gt;

&lt;p&gt;完璧主義では生産性が損なわれる。&lt;/p&gt;

&lt;p&gt;You&amp;#8217;ll feel like your work is never done&amp;#46;&lt;/p&gt;

&lt;p&gt;いつまで経っても仕事が終わらないように思えるから。&lt;/p&gt;

&lt;p&gt;Perfect is harmful to your health&amp;#46;&lt;/p&gt;

&lt;p&gt;完璧主義は健康に悪い。&lt;/p&gt;

&lt;p&gt;We work too hard to achieve perfection&amp;#46;&lt;/p&gt;

&lt;p&gt;完璧を求め、働き過ぎる。&lt;/p&gt;

&lt;p&gt;We set our personal standards too high&amp;#46;&lt;/p&gt;

&lt;p&gt;水準が高過ぎる。&lt;/p&gt;

&lt;p&gt;And rarely reach them&amp;#46;&lt;/p&gt;

&lt;p&gt;しかも滅多に到達する事もない。&lt;/p&gt;

&lt;p&gt;So we worry about not being good enough&amp;#46;&lt;/p&gt;

&lt;p&gt;だから、「これで充分」と思えずに心労する。&lt;/p&gt;

&lt;p&gt;This makes us ANXIOUS&amp;#46;&lt;/p&gt;

&lt;p&gt;それで不安になる。&lt;/p&gt;

&lt;p&gt;Anxiety can give you stress,&lt;/p&gt;

&lt;p&gt;不安はストレスに繋がり&lt;/p&gt;

&lt;p&gt;make you sick,&lt;/p&gt;

&lt;p&gt;病気に繋がることもある。&lt;/p&gt;

&lt;p&gt;or even kill you&amp;#46;&lt;/p&gt;

&lt;p&gt;最悪の場合死ぬことすらある。&lt;/p&gt;

&lt;p&gt;We can&amp;#8217;t be happy if we&amp;#8217;re anxious or unhealthy&amp;#46;&lt;/p&gt;

&lt;p&gt;不安だったり不健康では幸せにはなれない。&lt;/p&gt;

&lt;p&gt;We can&amp;#8217;t be happy if we accept no compromises&amp;#46;&lt;/p&gt;

&lt;p&gt;妥協無しには幸せにはなれない。&lt;/p&gt;

&lt;p&gt;We can&amp;#8217;t be happy if we&amp;#8217;re alone&amp;#46;&lt;/p&gt;

&lt;p&gt;独りぼっちでは幸せにはなれない。&lt;/p&gt;

&lt;p&gt;We can&amp;#8217;t be happy if we strive for perfection&amp;#46;&lt;/p&gt;

&lt;p&gt;完璧主義では幸せにはなれない。&lt;/p&gt;

&lt;p&gt;Matz knows this&amp;#46; He is WISE!&lt;/p&gt;

&lt;p&gt;Matzはこのことを知っています。聡明なまっつ。&lt;/p&gt;

&lt;p&gt;Ruby is not perfect&amp;#46;&lt;/p&gt;

&lt;p&gt;Rubyは完璧ではない。&lt;/p&gt;

&lt;p&gt;(Matz knows this too!)&lt;/p&gt;

&lt;p&gt;これもMatzは知っています。&lt;/p&gt;

&lt;p&gt;Matz made Ruby so we could be happy&amp;#46;&lt;/p&gt;

&lt;p&gt;まっつは私達の幸せのためRubyを作りました。&lt;/p&gt;

&lt;p&gt;Perfection keeps us from:&lt;/p&gt;

&lt;p&gt;完璧主義では&lt;/p&gt;

&lt;p&gt;making compromises,&lt;/p&gt;

&lt;p&gt;妥協は許されない。&lt;/p&gt;

&lt;p&gt;getting things done,&lt;/p&gt;

&lt;p&gt;何かを成し遂げる事は出来ない。&lt;/p&gt;

&lt;p&gt;enjoying each other&amp;#8217;s company,&lt;/p&gt;

&lt;p&gt;他人と同じ時間を過ごす喜びを見いだせない。&lt;/p&gt;

&lt;p&gt;being happy&amp;#46;&lt;/p&gt;

&lt;p&gt;幸せになれない。&lt;/p&gt;

&lt;p&gt;And that&amp;#8217;s why I hate it&amp;#46;&lt;/p&gt;

&lt;p&gt;私が完璧主義を嫌う理由です。&lt;/p&gt;

&lt;p&gt;So you can either try to be:&lt;/p&gt;

&lt;p&gt;選択肢は二つ&lt;/p&gt;

&lt;p&gt;Perfect [and be]&lt;/p&gt;

&lt;p&gt;完璧である換わりに&lt;/p&gt;

&lt;p&gt;Lonely&lt;/p&gt;

&lt;p&gt;独りぼっちで&lt;/p&gt;

&lt;p&gt;Unproductive&lt;/p&gt;

&lt;p&gt;非生産的で&lt;/p&gt;

&lt;p&gt;Unhealthy&lt;/p&gt;

&lt;p&gt;不健康であるか&lt;/p&gt;

&lt;p&gt;or you can be HAPPY&amp;#46;&lt;/p&gt;

&lt;p&gt;或いは、幸せであるか。&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll choose to be happy&amp;#46; I hope you do too&amp;#46;&lt;/p&gt;

&lt;p&gt;私は後者を選びます。あなたはどうですか。&lt;/p&gt;

&lt;p&gt;ありがとうございました！&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:6ea91e85-04db-4944-aecb-c5060fd9ec20</id>
    <published>2010-11-11T18:38:00+00:00</published>
    <updated>2010-11-22T18:03:42+00:00</updated>
    <title>New Orleans live music this weekend during RubyConf</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2010/11/11/new-orleans-live-music-this-weekend-during-rubyconf" />
    <category term="nola" scheme="http://blog.nicksieger.com/articles/tag/nola" />
    <category term="rubyconf" scheme="http://blog.nicksieger.com/articles/tag/rubyconf" />
    <content type="html">&lt;p&gt;My boy Erik Jacobson from way back and also of &lt;a href="http://www.mamadigdown.com/" title="Mama Digdown's Hot Tunes!"&gt;Mama Digdown&amp;#8217;s Brass Band&lt;/a&gt; is a New Orleans regular and knows the local scene well&amp;#46;&lt;/p&gt;

&lt;p&gt;He graciously gave me the lowdown for this weekend&amp;#46; I&amp;#8217;d like to make a few of these gigs; probably at least the Stooges at Hi Ho tonight, maybe Hot 8, Ellis and/or Cotton Mouth Kings tomorrow, and one of Shannon Powell or Wes Anderson on Saturday&amp;#46; Let me know if you&amp;#8217;re interested by &lt;a href="http://twitter.com/nicksieger"&gt;messaging me on Twitter&lt;/a&gt;&amp;#46;&lt;/p&gt;

&lt;p&gt;Erik also mentioned that there might be a &lt;a href="http://en.wikipedia.org/wiki/Second_line"&gt;Second Line&lt;/a&gt; happening on Sunday afternoon that I might try to check out before I take off in the evening&amp;#46; Let me know too if you are up for that&amp;#46;&lt;/p&gt;

&lt;p&gt;Ok, here&amp;#8217;s Erik&amp;#8217;s take:&lt;/p&gt;

&lt;h3&gt;Thursday&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Shamarr Allen @ Irvin Mayfields Jazz Playhouse&amp;#46;  8:00pm&amp;#46;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;He&amp;#8217;s a fantastic young trumpet player and a friend of mine&amp;#46; This is the nice/upscale club that is in the hotel on Bourbon Street&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kermit Ruffins @ Vaughn&amp;#8217;s&amp;#46;  8:00pm&amp;#46;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You probably know, but Kermit is a trumpet player and is a quintessential New Orleans character&amp;#46;  Vaughn&amp;#8217;s is a great local dive bar that is in the Bywater neighborhood out by the Navy Yard&amp;#46; You&amp;#8217;ll want to take a cab there&amp;#46;  There is also free beans and rice at his shows&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stooges Brass Band @ Hi Ho Lounge probably around 10:00pm&amp;#46;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I got a hold of Walter from the Stooges and he said they were playing tonight&amp;#46;  They are a fantastic brass band and it&amp;#8217;s a great local spot to catch them&amp;#46; Good friends of Mama Digdown&amp;#8217;s&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Soul Rebels Brass Band @ Le Bon Temps Roulee @ 11:00pm&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is always a good hangout&amp;#46;  There will be a ton of people there&amp;#46;  The Soul Rebels are awesome and always play pretty late into the night&amp;#46;&lt;/p&gt;

&lt;p&gt;If you felt like being adventurous, you could hit either Vaughn&amp;#8217;s or the Playhouse from like 9&amp;#45;10, then take a cab to the Hi Ho for a set until around 11:30 and then finish with the Rebels&amp;#46;  That is a lot of music, it&amp;#8217;s just so hard to pick which ones to leave out&amp;#46;&lt;/p&gt;

&lt;h3&gt;Friday&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Hot 8 Brass Band @ 12Bar&amp;#46; 7:00pm&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HOT, HOT brass band&amp;#46;  They are good friends who have been up north many times&amp;#46;  This is a new club that is pretty close you your hotel&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hot Club of New Orleans @ DBA&amp;#46; 6:00pm&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a great Django style band&amp;#46;  I went to college with the violin player Matt Rhoady&amp;#46;  He also hails from Mpls and went to Henry High/  This club is over on Frenchman Street near Snug Harbor&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kid Chocolate Brown @ Irvin Mayfields Jazz Playhouse&amp;#46;  8:00pm&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cool young trumpet player and singer&amp;#46;  He also plays in Los Hombres Calientes from time to time&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ellis Marsalis Quartet @ Snug Harbor  8:00pm&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is certainly worth going to and I am sure he&amp;#8217;ll have a good band with him&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New Orleans Cotton Mouth Kings @ Spotted Cat&amp;#46; 10:00pm&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This place is really close to Snug Harbor and would be fun to hit after Ellis&amp;#46;  Great traditional band with young cats&amp;#46;  Good people watching too&amp;#46; This is a cool scene here I think it&amp;#8217;s free too!&lt;/p&gt;

&lt;h3&gt;Saturday&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Soul Rebels @ DBA&amp;#46; 11:00pm&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you missed them on tonight, you can catch them here&amp;#46; This would be a good place to hear them&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shannon Powell @ Irving Mayfields Jazz Playhouse&amp;#46;  8:00pm&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;He is so badass&amp;#46; You should really try to swing by if you can&amp;#46;  He is the drummer that was on that Orchestra Hall gig I played this summer&amp;#46;  Cool dude too&amp;#46;  At 11:00pm there is also a brass band playing this club called the KinFolk Brass Band&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wessell Andersen @ Snug Harbor&amp;#46; 8:00pm&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I am sure you know him from Wynton records&amp;#46;  He is amazing&amp;#46;  It is a hard decision between him and Shannon Powell&amp;#46;  &lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:8f70150f-ec57-4646-afaa-c3e07b6df7c3</id>
    <published>2010-10-14T15:25:51+00:00</published>
    <updated>2010-11-22T18:03:42+00:00</updated>
    <title>activerecord-jdbc-adapter 1.0.0</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2010/10/14/activerecord-jdbc-adapter-1-0-0" />
    <category term="jruby" scheme="http://blog.nicksieger.com/articles/tag/jruby" />
    <category term="jdbc" scheme="http://blog.nicksieger.com/articles/tag/jdbc" />
    <category term="activerecord" scheme="http://blog.nicksieger.com/articles/tag/activerecord" />
    <category term="rails" scheme="http://blog.nicksieger.com/articles/tag/rails" />
    <category term="rails3" scheme="http://blog.nicksieger.com/articles/tag/rails3" />
    <content type="html">&lt;p&gt;Just a quick note that &lt;code&gt;activerecord-jdbc-adapter&lt;/code&gt; has finally hit 1&amp;#46;0&amp;#46;0&amp;#46; Install it today:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem install activerecord-jdbc-adapter
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Included are adapters for &lt;a href="http://www.mysql.com/" title="MySQL ::  The world's most popular open source database"&gt;MySQL&lt;/a&gt;, &lt;a href="http://www.postgresql.org/" title="PostgreSQL: The world's most advanced open source database"&gt;PostgreSQL&lt;/a&gt;, &lt;a href="http://www.sqlite.org/" title="SQLite Home Page"&gt;SQLite3&lt;/a&gt;, &lt;a href="http://db.apache.org/derby/" title="Apache Derby"&gt;Derby&lt;/a&gt;, &lt;a href="http://hsqldb.org/" title="HSQLDB"&gt;HSQLDB&lt;/a&gt;, &lt;a href="http://www.h2database.com/" title="H2 Database Engine"&gt;H2&lt;/a&gt;, and &lt;a href="http://www.microsoft.com/sqlserver/2008/en/us/" title="SQL Server 2008 Overview, data platform, store data | Microsoft"&gt;Microsoft SQL Server&lt;/a&gt;&amp;#46;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem install activerecord-jdbcmysql-adapter
gem install activerecord-jdbcpostgresql-adapter
gem install activerecord-jdbcsqlite3-adapter
gem install activerecord-jdbcderby-adapter
gem install activerecord-jdbchsqldb-adapter
gem install activerecord-jdbch2-adapter
gem install activerecord-jdbcmssql-adapter
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can also use &lt;code&gt;activerecord-jdbc-adapter&lt;/code&gt; with Oracle, DB2, Sybase, and Informix&amp;#46; Just ensure that the database JDBC driver jar files are mentioned in &lt;code&gt;$CLASSPATH&lt;/code&gt; or &lt;code&gt;require&lt;/code&gt; them directly in your script or application&amp;#46; Then, configure &lt;code&gt;database.yml&lt;/code&gt; with &lt;code&gt;adapter:&lt;/code&gt; set to one of &lt;code&gt;oracle&lt;/code&gt;, &lt;code&gt;db2&lt;/code&gt;, &lt;code&gt;sybase&lt;/code&gt;, or &lt;code&gt;informix&lt;/code&gt;&amp;#46;&lt;/p&gt;

&lt;p&gt;This release promises superb compatibility with Rails 3&amp;#46; We now have the ActiveRecord test suite &lt;a href="http://ci.jruby.org/view/Rails"&gt;running in CI&lt;/a&gt; and the 1&amp;#46;0&amp;#46;0 release is 100% green when run on MySQL&amp;#46; (SQLite3 is right behind with just 13 failures, and we hope to fix those soon&amp;#46;)&lt;/p&gt;

&lt;p&gt;As &lt;a href="/articles/2010/02/24/jruby-and-rails-3-sitting-in-a-tree"&gt;mentioned before&lt;/a&gt;, to get started with Rails 3, JRuby and &lt;code&gt;activerecord-jdbc-adapter&lt;/code&gt;, simply run:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ rails new app --database mysql --template http://jruby.org
   ...
   apply  http://jruby.org
   apply    http://jruby.org/templates/default.rb
    gsub      Gemfile
    gsub      config/database.yml
$ cd app &amp;amp;&amp;amp; bundle install
...
Using activerecord-jdbc-adapter (1.0.0) 
...
Using jdbc-mysql (5.0.4) 
...
Using rails (3.0.0) 
Your bundle is complete! Use `bundle show [gemname]` ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;One new feature in 1&amp;#46;0&amp;#46;0 is the ability to define an extension adapter for your proprietary JDBC database without needing to hack the &lt;code&gt;activerecord-jdbc-adapter&lt;/code&gt; source code&amp;#46; To get you started we extracted the &lt;code&gt;activerecord-cachedb-adapter&lt;/code&gt; and &lt;a href="http://github.com/nicksieger/activerecord-cachedb-adapter"&gt;put it on Github&lt;/a&gt; for you to use as a template&amp;#46;&lt;/p&gt;

&lt;p&gt;The 1&amp;#46;0&amp;#46;0 release had over 200 commits poured into it and lots of great help from the community&amp;#46; Thanks to David Kellum, Dmitry Denisov, Dwayne Litzenberger, Gregor Schmidt, James Walker, John Duff, Joshua Suggs, Nicholas J Kreucher, Peter Donald, Geoff Longman, Uwe Kubosch, Youhei Kondou, Michael Pitman, Alex B, and Ryan Bell for their contributions to this release&amp;#46;&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:4e126d73-7107-4a0b-8591-1ad3d1c1ab16</id>
    <published>2010-09-15T20:12:00+00:00</published>
    <updated>2010-11-22T18:03:42+00:00</updated>
    <title>Polyglot Doesn't Fix Your Messy Architecture</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2010/09/15/polyglot-doesnt-fix-your-messy-architecture" />
    <category term="polyglot" scheme="http://blog.nicksieger.com/articles/tag/polyglot" />
    <content type="html">&lt;p&gt;My &lt;a href="http://streaming.java.no/tcs/?id=4B97D830-9118-4386-A36D-D056D36A4BFD"&gt;talk last week at JavaZone&lt;/a&gt; is now available&amp;#46; (I&amp;#8217;ve put &lt;a href="http://jruby.org.s3.amazonaws.com/presentations/JavaZone2010-JRuby-Now-With-More-J-1280x480.mp4"&gt;1280x480&lt;/a&gt;&amp;#45; and &lt;a href="http://jruby.org.s3.amazonaws.com/presentations/JavaZone2010-JRuby-Now-With-More-J-320x240.mp4"&gt;320x240 (iPod)&lt;/a&gt;&amp;#45;sized copies of the &amp;#46;mp4 files on S3 as well if you don&amp;#8217;t have Silverlight&amp;#46;)&lt;/p&gt;

&lt;p&gt;One of the problems we have as members of the JRuby team is to convince a Java&amp;#45;based audience that programming in a new language is worthwhile&amp;#46; As a result, we consider ourselves proponents of so&amp;#45;called &amp;#8220;polyglot programming&amp;#8221;&amp;#46; One of the opening points I made in my talk addressed arguments for and against polyglot programming&amp;#46;&lt;/p&gt;

&lt;p&gt;I usually try to make a case along the lines of &amp;#8220;learning a new language is good for you anyway&amp;#8221;, which can come off sounding a little patronizing, like I&amp;#8217;m reminding the audience that they should take their vitamins&amp;#46; While I do believe practicing multilingualism (or polyglotism) with computers is good for your programming career, I wouldn&amp;#8217;t like to be admonished by the speaker if I was in the audience&amp;#46;&lt;/p&gt;

&lt;p&gt;This time I took a different tack&amp;#46; I&amp;#8217;m not sure if it&amp;#8217;s a convincing (or even supporting) argument in favor of Ruby or polyglot, but true nonetheless&amp;#46;&lt;/p&gt;

&lt;p&gt;First, I likened a software project to a physical workspace&amp;#46; When you use a new language in your project, you make a new space for stuff&amp;#46; Maybe like adding a bookshelf or some binders or a filing system&amp;#46;&lt;/p&gt;

&lt;p&gt;Problem is, if your idea of organization is analogous to the cluttered desk below, adding a new language is just going to pile one more binder onto the mess&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/sindesign/238419364/" title="I love clutter by sindesign, on Flickr"&gt;&lt;img src="http://farm1.static.flickr.com/93/238419364_ce0edb6c45.jpg" width="500" height="333" alt="I love clutter" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;p&gt;On the contrary, if you have a well&amp;#45;organized project, adding a new language also doesn&amp;#8217;t necessarily automatically make your project better, but it does give you capabilities that you didn&amp;#8217;t have before&amp;#46;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/hawksanddoves/1423312308/" title="Workbench by recursion_see_recursion, on Flickr"&gt;&lt;img src="http://farm2.static.flickr.com/1008/1423312308_80cb02f1cd.jpg" width="500" height="333" alt="Workbench" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div style="clear:both;"&gt;&lt;/div&gt;

&lt;p&gt;In the end, polyglot programming won&amp;#8217;t fix the messy architecture and organization of your project&amp;#46; If you think adding Ruby to the project will make things better by itself, you probably shouldn&amp;#8217;t be thinking about it in the first place&amp;#46; Ruby can be used as a tool to clean up the mess, but only if you actually &lt;em&gt;clean up and remove it&lt;/em&gt;, and not just paper over it&amp;#46;&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:4c6d6645-1832-4ed6-b947-51f55231f41f</id>
    <published>2010-08-30T17:12:07+00:00</published>
    <updated>2010-11-22T18:03:42+00:00</updated>
    <title>JRuby at JavaZone 2010</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2010/08/30/jruby-at-javazone-2010" />
    <category term="jruby" scheme="http://blog.nicksieger.com/articles/tag/jruby" />
    <category term="javazone" scheme="http://blog.nicksieger.com/articles/tag/javazone" />
    <content type="html">&lt;p&gt;I&amp;#8217;m pleased to be able to return to Oslo for JavaZone 2010&amp;#46; Whether you&amp;#8217;re checking out JRuby for the first time or a veteran JRuby user, I&amp;#8217;ll have something for you! And if I don&amp;#8217;t, I encourage you to come badger me after the talk is finished&amp;#46;&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://javazone.no/incogito10/events/JavaZone%202010/sessions/JRuby:%20Now%20With%20More%20J!"&gt;JRuby: Now With More J!&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Additionally, if you&amp;#8217;re interested in meeting up for some JRuby discussion next week in Oslo, do drop me a note at the address in the upper right&amp;#46;&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:055dd055-5fd2-4b4b-ab36-41f806396627</id>
    <published>2010-08-30T17:06:52+00:00</published>
    <updated>2010-11-22T18:03:43+00:00</updated>
    <title>Deploying, Monitoring and Troubleshooting Rails on JRuby</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2010/08/30/deploying-monitoring-and-troubleshooting-rails-on-jruby" />
    <category term="jruby" scheme="http://blog.nicksieger.com/articles/tag/jruby" />
    <category term="rails" scheme="http://blog.nicksieger.com/articles/tag/rails" />
    <content type="html">&lt;p&gt;I am pleased that my Engine Yard webinar on JRuby and deployment is available for general viewing&amp;#46; While the JRuby deployment story is still evolving and maturing, and the 60 minute time frame is too short to cover the issues in depth, I hope you&amp;#8217;ll find the content at least gives you some ideas or directions to look&amp;#46;&lt;/p&gt;

&lt;p&gt;As always, feel free to contact me with any questions!&lt;/p&gt;

&lt;p&gt;&lt;iframe src="http://player.vimeo.com/video/14435288" width="400" height="300" frameborder="0"&gt;&lt;/iframe&gt;&lt;p&gt;&lt;a href="http://vimeo.com/14435288"&gt;Deploying, Monitoring and Troubleshooting Rails on the JVM with JRuby&lt;/a&gt; from &lt;a href="http://vimeo.com/engineyard"&gt;Engine Yard&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;&amp;#46;&lt;/p&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:ad80f955-5d56-4031-8b14-bd5b00c39bce</id>
    <published>2010-04-10T16:40:00+00:00</published>
    <updated>2010-11-22T18:03:43+00:00</updated>
    <title>I was Paul Gonsalves</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2010/04/10/i-was-paul-gonsalves" />
    <category term="flow" scheme="http://blog.nicksieger.com/articles/tag/flow" />
    <category term="life" scheme="http://blog.nicksieger.com/articles/tag/life" />
    <content type="html">&lt;p&gt;I was Paul Gonsalves in the shower this morning&amp;#46; Most people sing in the shower, but when I get going I play air sax&amp;#46; For a fleeting moment I felt like I was blowing with the Ellington band at Newport in 1956&amp;#46; The way obscure things flow in and out of consciousness is a weird thing&amp;#46;&lt;/p&gt;

&lt;p&gt;If you haven&amp;#8217;t checked out the 1956 Ellington at Newport live recording of &lt;em&gt;Diminuendo and Crescendo in Blue&lt;/em&gt;, you really should&amp;#46; I hadn&amp;#8217;t heard the recording for years until my lovely wife put it on a great jazz mix playlist that we listened to on the road last weekend&amp;#46; The recording is completely infectious; my foot was tapping within a few moments of the start of the song&amp;#46; The Newport concert is infamous in Jazz lore &amp;#45;&amp;#45; Gonsalves blew 27 choruses and put the crowd into a frenzy&amp;#46; The great thing about the recording, even though it&amp;#8217;s a little bit scratchy, is that you can hear and feel the energy of the crowd coming through&amp;#46; Although it&amp;#8217;s probably a bit hyperbolic, some Jazz writers claim that Gonsalves single&amp;#45;handedly revived Ellington&amp;#8217;s career that day&amp;#46;&lt;/p&gt;

&lt;p&gt;Why was my mind in that state at that moment? I wish I knew&amp;#46; The mystery of heightened awareness that is &lt;em&gt;flow&lt;/em&gt; is an elusive quality&amp;#46; At lunch at RubyNation yesterday a discussion arose of just how rare it is to attain that awareness&amp;#46; Glenn Vanderburg described how only a few times in his double&amp;#45;digit year career as a conference speaker has he felt like he has had that hyper&amp;#45;aware state, where he was receiving feedback from the crowd during a talk and able to adjust mid&amp;#45;stream and feel completely on&amp;#46; The difference of timing and how that affects an audience&amp;#8217;s response is striking&amp;#46; The difference between being on and having a joke or a point fall flat is incredibly sensitive, as any performance artist will tell you&amp;#46; Just to think about it gives me a newfound respect for stand&amp;#45;up comedians, where timing is so crucial&amp;#46;&lt;/p&gt;

&lt;p&gt;I myself haven&amp;#8217;t quite felt that heightened state while delivering a conference talk, but I &lt;em&gt;have&lt;/em&gt; felt it while playing jazz&amp;#46; Still, it has happened only once or twice in my life&amp;#46; If you&amp;#8217;ve felt that flow, you know rare it is and how you absolutely cannot manufacture it at will&amp;#46; The feeling is such a high that I suspect it leaves artists, performers, and creative types feeling unfulfilled and half&amp;#45;desperately searching for it for the rest of their careers&amp;#46;&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m not very well read in this area, but I&amp;#8217;d like to learn more&amp;#46; Any suggestions for reading material? &lt;/p&gt;

&lt;p&gt;I tend to stew on these things for a while but fail to put together a coherent, digestible conclusion, I thought I&amp;#8217;d at least write something up, get it out there, and start a conversation&amp;#46; When have you felt that flow, and have you noticed how you get into it?&lt;/p&gt;

&lt;p&gt;Other tangential thoughts swirling around in my head:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is flow related to a search for perfection? Instead, should we coach ourselves to cope with life&amp;#8217;s imperfections? Dave Thomas gave his &amp;#8220;Ruby sucks&amp;#8221; talk last night at RubyNation and eloquently made the point that Ruby is not perfect, and that&amp;#8217;s what makes it great&amp;#46; I&amp;#8217;ve struggled with not settling for less than perfect and it ends up usually being more detrimental to my production than anything else&amp;#46;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dyske.com/paper/778"&gt;Why Americans Don&amp;#8217;t Like Jazz&lt;/a&gt;&amp;#46; Have we lost an appreciation for things we can&amp;#8217;t put to words?&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <author>
      <name>Nick Sieger</name>
    </author>
    <id>urn:uuid:a2ff03a8-5c6c-4bf0-b000-8a169b441be8</id>
    <published>2010-04-06T17:11:17+00:00</published>
    <updated>2010-11-22T18:03:43+00:00</updated>
    <title>Warbler 1.0</title>
    <link rel="alternate" type="text/html" href="http://blog.nicksieger.com/articles/2010/04/06/warbler-1-0" />
    <category term="jruby" scheme="http://blog.nicksieger.com/articles/tag/jruby" />
    <category term="warbler" scheme="http://blog.nicksieger.com/articles/tag/warbler" />
    <content type="html">&lt;p&gt;It&amp;#8217;s past due time to &amp;#8220;carry the 1&amp;#8221; over and roll over to a 1&amp;#46;0 version of &lt;a href="http://caldersphere.rubyforge.org/warbler/"&gt;Warbler&lt;/a&gt;&amp;#46; This time around, the changes in the codebase are significant enough that I hope you&amp;#8217;ll find many past usability issues resolved&amp;#46;&lt;/p&gt;

&lt;h2&gt;Assemble in&amp;#45;place&lt;/h2&gt;

&lt;p&gt;The biggest change is that Warbler now creates a war file in place, without an intermediate copy&amp;#45;to&amp;#45;assemble step&amp;#46; Warbler does this using the &lt;code&gt;rubyzip&lt;/code&gt; gem, or alternatively using a small Java extension when run under JRuby 1&amp;#46;5 or greater&amp;#46; This should reduce processing and confusion due to the extra copy, which can sometimes get out of sync&amp;#46; The downside is that Warbler cannot be used easily for exploded directory development, though you can always create the war file and unpack it to a staging area&amp;#46; &lt;/p&gt;

&lt;h2&gt;Simpler extension&lt;/h2&gt;

&lt;p&gt;Warbler also underwent an internal refactoring that should make extending it much easier&amp;#46; Here&amp;#8217;s how you add Warbler tasks to your &lt;code&gt;Rakefile&lt;/code&gt;:&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;warbler&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="constant"&gt;Warbler&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Task&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In versions prior to 1&amp;#46;0, if there were deploy steps that created new files that didn&amp;#8217;t exist at the time the &lt;code&gt;Rakefile&lt;/code&gt; was loaded (such as what the &lt;code&gt;asset:packager:build_all&lt;/code&gt; task does in the &lt;a href="http://synthesis.sbecker.net/pages/asset_packager"&gt;asset_packager&lt;/a&gt; plugin), it was tricky to get Warbler to recognize them&amp;#46; No longer &amp;#45;&amp;#45; now the expected Rake configuration should do the trick&amp;#46;&lt;/p&gt;

&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;warbler&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="constant"&gt;Warbler&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Task&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;task&lt;/span&gt; &lt;span class="symbol"&gt;:war&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;asset:packager:build_all&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Bundler support&lt;/h2&gt;

&lt;p&gt;Another exciting development in the Ruby development world is &lt;a href="http://gembundler.com/"&gt;Bundler&lt;/a&gt;, and Warbler 1&amp;#46;0 supports packaging your bundled gems with it&amp;#46; Warbler even creates a &lt;code&gt;.bundle/environment.rb&lt;/code&gt; file inside the war file that loads the gems from relative paths to where Warbler puts the gems in the war file&amp;#46;&lt;/p&gt;

&lt;h2&gt;More configuration&lt;/h2&gt;

&lt;p&gt;There are a number of new configuration options, so &lt;a href="http://github.com/nicksieger/warbler/blob/master/warble.rb"&gt;check out the new configuration&lt;/a&gt; and see if any are useful to you&amp;#46;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;config.gem_home&lt;/code&gt; allows you to control the path inside the war file where Warbler will pack your application&amp;#8217;s gems&amp;#46; For use with older versions of Bundler or other custom gem vendoring schemes&amp;#46;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config.webinf_files&lt;/code&gt; is a file list that can contain multiple files, XML or otherwise&amp;#46; If the files named in this list have &lt;code&gt;.erb&lt;/code&gt; extensions, they will be expanded in the same manner as &lt;code&gt;web.xml&lt;/code&gt;&amp;#46;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Rails 3 support&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://jruby-rack.kenai.com/"&gt;JRuby&amp;#45;Rack&lt;/a&gt;, the servlet adapter component bundled by Warbler, also received a version bump, and there are no longer any Java libraries included in the Warbler gem, so the two components can be versioned independently&amp;#46; With the release of both Warbler 1&amp;#46;0 and JRuby&amp;#45;Rack 0&amp;#46;9&amp;#46;7, Rails 3 applications can be warbled and deployed seamlessly, often without any additional configuration&amp;#46;&lt;/p&gt;

&lt;p&gt;Please continue to send feedback to the &lt;a href="http://xircles.codehaus.org/lists/user@jruby.codehaus.org"&gt;JRuby mailing list&lt;/a&gt; or the &lt;a href="http://kenai.com/jira/browse/WARBLER"&gt;Warbler bug tracker&lt;/a&gt;&amp;#46; Enjoy!&lt;/p&gt;</content>
  </entry>
</feed>

