<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:admin="http://webns.net/mvcb/" xml:lang="ja">
<channel rdf:about="http://wota.jp/ac/">
<title>ヽ( ・∀・)ノくまくまー</title>
<link>http://wota.jp/ac/</link>
<items><rdf:Seq><rdf:li rdf:resource="http://wota.jp/ac/?date=20081202#p01" />
<rdf:li rdf:resource="http://wota.jp/ac/?date=20081202#p02" />
<rdf:li rdf:resource="http://wota.jp/ac/?date=20081202#p03" />
<rdf:li rdf:resource="http://wota.jp/ac/?date=20081202#p04" />
<rdf:li rdf:resource="http://wota.jp/ac/?date=20081202#p05" />
<rdf:li rdf:resource="http://wota.jp/ac/?date=20081202#p07" />
<rdf:li rdf:resource="http://wota.jp/ac/?date=20081202#p08" />
<rdf:li rdf:resource="http://wota.jp/ac/?date=20081202#p09" />
<rdf:li rdf:resource="http://wota.jp/ac/?date=20081202#p11" />
<rdf:li rdf:resource="http://wota.jp/ac/?date=20081201#p01" />
<rdf:li rdf:resource="http://wota.jp/ac/?date=20081129#p01" />
<rdf:li rdf:resource="http://wota.jp/ac/?date=20081127#p01" />
<rdf:li rdf:resource="http://wota.jp/ac/?date=20081126#p01" />
<rdf:li rdf:resource="http://wota.jp/ac/?date=20081126#p02" />
</rdf:Seq></items>
</channel>
<item rdf:about="http://wota.jp/ac/?date=20081202#p01">
<title> Extlib</title>
<link>http://wota.jp/ac/?date=20081202#p01</link>
<dc:date>2008-12-02T00:00:00+09:00</dc:date>
<content:encoded><![CDATA[
<p>Ruby をより便利に、あるいは暗黒的に使うために、誰もが基本classを拡張したことがあるだろう。その中で、フレームワークが利用するレベルになると、汎用的な拡張ライブラリとして gem や github で公開されることが多い。Rails であれば ActiveSupport が有名であるが、Merb では Extlib というライブラリを利用している。</p>
<p>    <h3 class="lead">なぜActiveSupportを使わないの？</h3>
</p>
<p>Merb は最低限で動くから ActiveSupport すら必須ではない！みたいな売り文句にしておきながら Extlib を裏で使ってたら卑怯じゃね？朝三暮四じゃね？という気もするが、ActiveSupport は太りすぎていてロードにすら時間がかかるのも事実。</p>
<table class='ruby'><tr><td><pre><font color="#000080">% irb </font>-r rubygems 
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:001</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> start <font color="4444FF">=</font> <font color="red">Time</font>.now; <font color="a52a2a"><b>require</b></font> <font color="#000080">'activesupport'</font>; <font color="red">Time</font>.now - start
<font color="4444FF">=&gt;</font> <font color="#FF0000">0.532759</font></pre></td></tr></table><p>Q6600(2.4G)でも0.5秒待たされてしまう。</p>
<table class='ruby'><tr><td><pre><font color="#000080">% irb </font>-r rubygems 
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:001</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> start <font color="4444FF">=</font> <font color="red">Time</font>.now; <font color="a52a2a"><b>require</b></font> <font color="#000080">'extlib'</font>; <font color="red">Time</font>.now - start
<font color="4444FF">=&gt;</font> <font color="#FF0000">0.270429</font></pre></td></tr></table><p>無視できるとは言わないが、一応 ActiveSupport の約半分のロード時間で済んでいるから、AS よりはマシかな。</p>
<p>    <h3 class="lead">名前はどうなよ</h3>
</p>
<p>しかしながら、extlib という名前は一般的すぎていささか池沼な香りがするし、せめて merb-extlib にして欲しいと思うのが人情であるが、実際は両方の gem が存在する。なるほど、いよいよ自分の愚かさに気付いて、extlib -&gt; merb-extlib に変名したのかと思いきや、その逆の変遷を辿っているのが現実である。どうやら、merb 用の拡張ライブラリとして作っていたが、かなり汎用的なので名前も汎用的にしてみました、という流れのようだ。実際 Merb を含めて3つの Web フレームワークで利用されているらしい。1つは halcyon で、もう1つは・・・(※誰か教えて下さい)。まぁ、名前の愚かさは自信の現れだと好意的に解釈して、Merb から離れた1 Rubyist として、積極的に Extlib だけでも利用してみるのもいいだろう。</p>
<table class='ruby'><tr><td><pre># gem install extlib</pre></td></tr></table><p>    <h3 class="lead">使い方</h3>
</p>
<p>Merb では必須なので、Merb 内ではいきなり利用できるし、生の irb からであれば extlib gem を require すれば良い。</p>
<table class='ruby'><tr><td><pre>% irb -r rubygems -r extlib
irb(main):001:0&gt; Extlib
=&gt; Extlib</pre></td></tr></table><p>ということで、Extlib で提供されている機能を、徒然と紹介してみる。</p>]]></content:encoded>
</item>
<item rdf:about="http://wota.jp/ac/?date=20081202#p02">
<title> Dictionary class</title>
<link>http://wota.jp/ac/?date=20081202#p02</link>
<dc:date>2008-12-02T00:00:00+09:00</dc:date>
<content:encoded><![CDATA[
<p>OO 世界では一般的な辞書クラス。通常の Hash とは違い、代入した順序も保持してくれる。ActiveSupport::OrderedHash と同じ。</p>
<p>    <div align=right style="font-size:90%;color:#660000;">(※ Ruby1.9 になると Hash 自体がこの機能を持つため不要になる)</div>
</p>
<h3 class='lead'>Extlib</h3><table class='ruby'><tr><td><pre>irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:001</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash <font color="4444FF">=</font> <font color="red">Dictionary</font>.new
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:002</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash<font color="4444FF">[</font><font color="#B8860B">:a</font><font color="4444FF">]</font> <font color="4444FF">=</font> <font color="#FF0000">1</font>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:003</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash<font color="4444FF">[</font><font color="#B8860B">:b</font><font color="4444FF">]</font> <font color="4444FF">=</font> <font color="#FF0000">2</font>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:004</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash<font color="4444FF">[</font><font color="#B8860B">:c</font><font color="4444FF">]</font> <font color="4444FF">=</font> <font color="#FF0000">3</font>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:005</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash.keys
<font color="4444FF">=&gt;</font> <font color="4444FF">[</font><font color="#B8860B">:a</font><font color="4444FF">,</font> <font color="#B8860B">:b</font><font color="4444FF">,</font> <font color="#B8860B">:c</font><font color="4444FF">]</font>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:007</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash
<font color="4444FF">=&gt;</font> <font color="4444FF">{</font><font color="#B8860B">:a</font><font color="4444FF">=&gt;</font><font color="#FF0000">1</font><font color="4444FF">,</font> <font color="#B8860B">:b</font><font color="4444FF">=&gt;</font><font color="#FF0000">2</font><font color="4444FF">,</font> <font color="#B8860B">:c</font><font color="4444FF">=&gt;</font><font color="#FF0000">3</font><font color="4444FF">}</font>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:008</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash.each_pair
<font color="red">LocalJumpError</font><font color="#B8860B">: </font>no block given</pre></td></tr></table><h3 class='lead'>ActiveSupport</h3><table class='ruby'><tr><td><pre>irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:001</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash <font color="4444FF">=</font> <font color="red">ActiveSupport</font><font color="#B8860B">::</font><font color="red">OrderedHash</font>.new
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:002</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash<font color="4444FF">[</font><font color="#B8860B">:a</font><font color="4444FF">]</font> <font color="4444FF">=</font> <font color="#FF0000">1</font>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:003</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash<font color="4444FF">[</font><font color="#B8860B">:b</font><font color="4444FF">]</font> <font color="4444FF">=</font> <font color="#FF0000">2</font>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:004</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash<font color="4444FF">[</font><font color="#B8860B">:c</font><font color="4444FF">]</font> <font color="4444FF">=</font> <font color="#FF0000">3</font>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:005</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash.keys
<font color="4444FF">=&gt;</font> <font color="4444FF">[</font><font color="#B8860B">:a</font><font color="4444FF">,</font> <font color="#B8860B">:b</font><font color="4444FF">,</font> <font color="#B8860B">:c</font><font color="4444FF">]</font>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:006</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash
<font color="4444FF">=&gt;</font> <font color="4444FF">[</font><font color="4444FF">[</font><font color="#B8860B">:a</font><font color="4444FF">,</font> <font color="#FF0000">1</font><font color="4444FF">]</font><font color="4444FF">,</font> <font color="4444FF">[</font><font color="#B8860B">:b</font><font color="4444FF">,</font> <font color="#FF0000">1</font><font color="4444FF">]</font><font color="4444FF">,</font> <font color="4444FF">[</font><font color="#B8860B">:c</font><font color="4444FF">,</font> <font color="#FF0000">1</font><font color="4444FF">]</font><font color="4444FF">]</font>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:007</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash.each_pair
<font color="red">NoMethodError</font><font color="#B8860B">: </font>undefined method `each_pair' <b><font color="mediumblue">for</font></b> <font color="4444FF">[</font><font color="4444FF">[</font><font color="#B8860B">:a</font><font color="4444FF">,</font> <font color="#FF0000">1</font><font color="4444FF">]</font><font color="4444FF">,</font> <font color="4444FF">[</font><font color="#B8860B">:b</font><font color="4444FF">,</font> <font color="#FF0000">1</font><font color="4444FF">]</font><font color="4444FF">,</font> <font color="4444FF">[</font><font color="#B8860B">:c</font><font color="4444FF">,</font> <font color="#FF0000">1</font><font color="4444FF">]</font><font color="4444FF">]</font><font color="#B8860B">:ActiveSupport</font><font color="#B8860B">::</font><font color="red">OrderedHash</font></pre></td></tr></table><p>OrderedHash は Array ベースであるに対して、Dictionary は Hash ベースであるため、何かと精神衛生上よろしい。</p>
<p>Extlib++</p>]]></content:encoded>
</item>
<item rdf:about="http://wota.jp/ac/?date=20081202#p03">
<title> Mash class</title>
<link>http://wota.jp/ac/?date=20081202#p03</link>
<dc:date>2008-12-02T00:00:00+09:00</dc:date>
<content:encoded><![CDATA[
<p>文字列とシンボルをキーとしては同一視する Hash。ActiveSupport::HashWithIndifferentAccess と同じであるが、名前の短さのみで圧倒的に使い勝手がよい。正直、AS の方は名前を思い出すまでに時間がかかる。</p>
<h3 class='lead'>Extlib</h3><table class='ruby'><tr><td><pre>irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:001</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash <font color="4444FF">=</font> <font color="red">Mash</font>.new
<font color="4444FF">=&gt;</font> <font color="4444FF">{</font><font color="4444FF">}</font>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:002</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash<font color="4444FF">[</font><font color="#B8860B">:maiha</font><font color="4444FF">]</font> <font color="4444FF">=</font> <font color="#000080">'aho'</font>
<font color="4444FF">=&gt;</font> <font color="#000080">&quot;aho&quot;</font>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:003</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash<font color="4444FF">[</font><font color="#000080">&quot;maiha&quot;</font><font color="4444FF">]</font>
<font color="4444FF">=&gt;</font> <font color="#000080">&quot;aho&quot;</font></pre></td></tr></table><h3 class='lead'>ActiveSupport</h3><table class='ruby'><tr><td><pre>irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:001</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> hash <font color="4444FF">=</font> <font color="red">ActiveSupport</font><font color="#B8860B">::</font><font color="red">HashWithIndiff</font><font color="4444FF">...</font> まんどくせ</pre></td></tr></table><p>短い名前は正義。</p>
<p>Extlib++</p>]]></content:encoded>
</item>
<item rdf:about="http://wota.jp/ac/?date=20081202#p04">
<title> LazyArray class</title>
<link>http://wota.jp/ac/?date=20081202#p04</link>
<dc:date>2008-12-02T00:00:00+09:00</dc:date>
<content:encoded><![CDATA[
<p>配列要素の lazy loading を実現するクラス。lazy は eager の逆。AR だと eager loading という言葉が馴染み深いだろう。eager loading の場合、最初に必要なモノを全てまとめて取ってくるのに対して、lazy loading では、必要になるまでデータの取得を遅延させる。準備に時間がかかるが、使われるかどうかも微妙、といったデータに重宝する。</p>
<h3 class='lead'>Extlib</h3><table class='ruby'><tr><td><pre>prefs <font color="4444FF">=</font> <font color="red">LazyArray</font>.new
prefs.load_with <font color="4444FF">{</font>|array|
  <font color="a52a2a"><b>p</b></font> <font color="#B8860B">:lazy_loading</font><font color="4444FF">!</font>
  array.push <font color="#000080">'北海道'</font>
  array.push <font color="#000080">'青森'</font>
  array.push <font color="#000080">'岩手'</font>
  <font color="#A52A2A"># ...
</font><font color="4444FF">}</font>

<font color="a52a2a"><b>puts</b></font> <font color="#000080">&quot;代入&quot;</font>
a <font color="4444FF">=</font> prefs

<font color="a52a2a"><b>puts</b></font> <font color="#000080">&quot;参照&quot;</font>
<font color="a52a2a"><b>puts</b></font> prefs<font color="4444FF">[</font><font color="#FF0000">0</font><font color="4444FF">]</font></pre></td></tr></table><h3 class='lead'>実行結果</h3><table class='ruby'><tr><td><pre style=>代入
参照
:lazy_loading!
北海道</pre></td></tr></table><p>参照されるまではデータの取得(構築)作業がされていないことがわかる。なお、Merb が利用するデフォルトの ORM である DataMapper では、全ての select クエリがこの lazy loading で実行されている。</p>
<p>Extlib++</p>]]></content:encoded>
</item>
<item rdf:about="http://wota.jp/ac/?date=20081202#p05">
<title> Extlib::SimpleSet class</title>
<link>http://wota.jp/ac/?date=20081202#p05</link>
<dc:date>2008-12-02T00:00:00+09:00</dc:date>
<content:encoded><![CDATA[
<p>凄く単純な集合クラス。Ruby bundle の Set (set.rb)よりも恐らく速い。これはなぜか Extlib module 下のクラスになっている。</p>
<table class='ruby'><tr><td><pre>rb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:001</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> cute <font color="4444FF">=</font> <font color="red">Extlib</font><font color="#B8860B">::</font><font color="red">SimpleSet</font>.new<font color="4444FF">(</font><font color="4444FF">[</font><font color="#B8860B">:chisato</font><font color="4444FF">,</font> <font color="#B8860B">:nksk</font><font color="4444FF">]</font><font color="4444FF">)</font>
<font color="4444FF">=&gt;</font> <font color="#A52A2A">#&lt;SimpleSet: {:chisato, :nksk}&gt;
</font>irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:002</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> cute.include?<font color="4444FF">(</font><font color="#B8860B">:nksk</font><font color="4444FF">)</font>
<font color="4444FF">=&gt;</font> <b><font color="mediumblue">true</font></b>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:003</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> cute.include?<font color="4444FF">(</font><font color="#B8860B">:maiha</font><font color="4444FF">)</font>
<font color="4444FF">=&gt;</font> <b><font color="mediumblue">false</font></b>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:004</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> cute <font color="4444FF">&lt;&lt;</font> <font color="#B8860B">:airi</font>
<font color="4444FF">=&gt;</font> trueirb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:005</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> cute
<font color="4444FF">=&gt;</font> #<font color="4444FF">&lt;</font><font color="red">SimpleSet</font><font color="#B8860B">: </font><font color="4444FF">{</font><font color="#B8860B">:chisato</font><font color="4444FF">,</font> <font color="#B8860B">:nksk</font><font color="4444FF">,</font> <font color="#B8860B">:airi</font><font color="4444FF">}</font><font color="4444FF">&gt;</font></pre></td></tr></table></div>
<div class="section">
<h3><a href="http://wota.jp/ac/?date=20081202#p06"><span class="sanchor">●</span></a> [<a href="http://wota.jp/ac/?year=2008;month=4Q;category=Merb">Merb</a>] VirtualFile class</h3>
<p>StringIO にパス情報を追加したクラス。短いのでクラス定義を見た方が早い。</p>
<table class='ruby'><tr><td><pre><b><font color="mediumblue">class<b><font color="red"> VirtualFile</font></b> <font color="0000ff"><b><font color="4444FF">&lt;</font> StringIO</b></font></font></b>
  attr_accessor <font color="#B8860B">:path</font>
  <b><font color="mediumblue">def<b><font color="forestgreen"> initialize</font></b><font color="2040a0"><font color="4444FF">(</font>string, path<font color="4444FF">)</font></font></font></b>
    <b><font color="mediumblue">super</font></b><font color="4444FF">(</font>string<font color="4444FF">)</font>
    <font color="#A020F0">@path</font> <font color="4444FF">=</font> path
  <b><font color="mediumblue">end</font></b>
<b><font color="mediumblue">end</font></b></pre></td></tr></table><p>inline template 用らしい。</p>]]></content:encoded>
</item>
<item rdf:about="http://wota.jp/ac/?date=20081202#p07">
<title> Extlib::Hook module</title>
<link>http://wota.jp/ac/?date=20081202#p07</link>
<dc:date>2008-12-02T00:00:00+09:00</dc:date>
<content:encoded><![CDATA[
<p>Hook Operationパターンを実現するモジュール。include すると、before,after クラスメソッドが定義される。DataMapper の callback で利用されている。</p>
<table class='ruby'><tr><td><pre><b><font color="mediumblue">class<b><font color="red"> Maimi</font></b></font></b>
  include <font color="red">Extlib</font><font color="#B8860B">::</font><font color="red">Hook</font>

  <b><font color="mediumblue">def<b><font color="forestgreen"> speak</font></b><font color="2040a0"><font color="4444FF">(</font>string<font color="4444FF">)</font></font></font></b>
    <font color="a52a2a"><b>puts</b></font> string
  <b><font color="mediumblue">end</font></b>

  after<font color="4444FF">(</font><font color="#B8860B">:speak</font><font color="4444FF">)</font> <font color="4444FF">{</font> <font color="a52a2a"><b>puts</b></font> <font color="#000080">&quot;とか言ってw&quot;</font> <font color="4444FF">}</font>
<b><font color="mediumblue">end</font></b>

maimi <font color="4444FF">=</font> <font color="red">Maimi</font>.new
maimi.speak <font color="#000080">&quot;ありがとう！&quot;</font></pre></td></tr></table><h3 class='lead'>実行結果</h3><table class='ruby'><tr><td><pre style=>ありがとう！
とか言ってw</pre></td></tr></table><p>以下のように、メソッド指定でも動く。</p>
<table class='ruby'><tr><td><pre>  <b><font color="mediumblue">def<b><font color="forestgreen"> favorite_phrase</font></b></font></b>
    <font color="a52a2a"><b>puts</b></font> <font color="#000080">&quot;とか言ってw&quot;</font>
  <b><font color="mediumblue">end</font></b>
  after <font color="#B8860B">:speak</font><font color="4444FF">,</font> <font color="#B8860B">:favorite_phrase</font></pre></td></tr></table><p>public なメソッドにしか利用できない、という仕様が疑問。public かどうかは可視性であって、公開APIとは違う話なので、private メソッドにも適用できていいと思うんだけどなぁ。謎。</p>
<p>Extlib++</p>]]></content:encoded>
</item>
<item rdf:about="http://wota.jp/ac/?date=20081202#p08">
<title> Inflection module</title>
<link>http://wota.jp/ac/?date=20081202#p08</link>
<dc:date>2008-12-02T00:00:00+09:00</dc:date>
<content:encoded><![CDATA[
<p>ActiveSupport::Inflection と同じで、文字列変化用の関数が定義されている。</p>
<h3 class='lead'>Extlib</h3><table class='ruby'><tr><td><pre>irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:001</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> <font color="red">Extlib</font><font color="#B8860B">::</font><font color="red">Inflection</font>.classify<font color="4444FF">(</font><font color="#000080">'data_mapper'</font><font color="4444FF">)</font>
<font color="4444FF">=&gt;</font> <font color="#000080">&quot;DataMapper&quot;</font>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:002</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> <font color="red">Extlib</font><font color="#B8860B">::</font><font color="red">Inflection</font>.underscore<font color="4444FF">(</font><font color="#000080">'DataMapper'</font><font color="4444FF">)</font>
<font color="4444FF">=&gt;</font> <font color="#000080">&quot;data_mapper&quot;</font>
irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:003</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> <font color="red">Extlib</font><font color="#B8860B">::</font><font color="red">Inflection</font>.foreign_key<font color="4444FF">(</font><font color="#000080">'Plugin::User'</font><font color="4444FF">)</font>
<font color="4444FF">=&gt;</font> <font color="#000080">&quot;user_id&quot;</font></pre></td></tr></table><p>foreign_key は少し嬉しいが、基本は AS と同じ。というか、ASよりメソッド数も機能も少ない。</p>
<p>Extlib--</p>]]></content:encoded>
</item>
<item rdf:about="http://wota.jp/ac/?date=20081202#p09">
<title> Assertions module</title>
<link>http://wota.jp/ac/?date=20081202#p09</link>
<dc:date>2008-12-02T00:00:00+09:00</dc:date>
<content:encoded><![CDATA[
<p>assert_kind_of でオブジェクトの型を実行時に検証する。主に引数に対して利用されている。</p>
<h3 class='lead'>Extlib</h3><table class='ruby'><tr><td><pre>  <b><font color="mediumblue">class<b><font color="red"> Property</font></b></font></b>
    include <font color="red">Assertions</font>

    <b><font color="mediumblue">def<b><font color="forestgreen"> initialize</font></b><font color="2040a0"><font color="4444FF">(</font>model, name, type, options = {}<font color="4444FF">)</font></font></font></b>
      assert_kind_of <font color="#000080">'model'</font><font color="4444FF">,</font> model<font color="4444FF">,</font> <font color="red">Model</font>
      assert_kind_of <font color="#000080">'name'</font><font color="4444FF">,</font>  name<font color="4444FF">,</font>  <font color="red">Symbol</font>
      assert_kind_of <font color="#000080">'type'</font><font color="4444FF">,</font>  type<font color="4444FF">,</font>  <font color="red">Class</font></pre></td></tr></table><p>俺には must があるからいらない。</p>
<h3 class='lead'>must</h3><table class='ruby'><tr><td><pre>  <b><font color="mediumblue">class<b><font color="red"> Property</font></b></font></b>
    <b><font color="mediumblue">def<b><font color="forestgreen"> initialize</font></b><font color="2040a0"><font color="4444FF">(</font>model, name, type, options = {}<font color="4444FF">)</font></font></font></b>
      <font color="#A020F0">@model</font> <font color="4444FF">=</font> model.must.be.kind_of<font color="4444FF">(</font><font color="red">Model</font><font color="4444FF">)</font></pre></td></tr></table></div>
<div class="section">
<h3><a href="http://wota.jp/ac/?date=20081202#p10"><span class="sanchor">●</span></a> [<a href="http://wota.jp/ac/?year=2008;month=4Q;category=Merb">Merb</a>] Pooling module</h3>
<p>インスタンスのpoolingによる高速化を支援するモジュール。省略。（ちょっと疲れてきた）</p>]]></content:encoded>
</item>
<item rdf:about="http://wota.jp/ac/?date=20081202#p11">
<title> 基本クラス拡張</title>
<link>http://wota.jp/ac/?date=20081202#p11</link>
<dc:date>2008-12-02T00:00:00+09:00</dc:date>
<content:encoded><![CDATA[
<h3 class='lead'>Object#meta_class</h3><table class='ruby'><tr><td><pre>  <b><font color="mediumblue">def<b><font color="forestgreen"> self</font></b>.extended<font color="2040a0"><font color="4444FF">(</font>a_module<font color="4444FF">)</font></font></font></b>
    a_module.meta_class.module_eval <b><font color="mediumblue">do</font></b>
      attr_accessor <font color="4444FF">...</font></pre></td></tr></table><p>No more &quot;class &lt;&lt; self; self end&quot;！</p>
<p>Extlib++</p>
<h3 class='lead'>ObjectSpace#classes</h3><table class='ruby'><tr><td><pre>irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:001</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> <font color="#000080">&quot;%d classes are defined in Ruby with Extlib&quot;</font> <font color="#000080">% ObjectSpace.classes.size
=&gt; </font><font color="#000080">&quot;447 classes are defined in Ruby with Extlib&quot;</font></pre></td></tr></table><p>each_object(Class) で回すの面倒だよね</p>
<p>Extlib++</p>
<h3 class='lead'>String#snake_case,camel_case</h3><table class='ruby'><tr><td><pre>irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:001</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> <font color="#000080">&quot;DataMapper&quot;</font>.snake_case
<font color="4444FF">=&gt;</font> <font color="#000080">&quot;data_mapper&quot;</font></pre></td></tr></table><p>AS とは微妙に名前が違う上に互換性もなし (:lowerオプションを取らない)</p>
<p>Extlib--</p>
<h3 class='lead'>String#/, Symbol#/</h3><table class='ruby'><tr><td><pre>irb<font color="4444FF">(</font>main<font color="4444FF">)</font><font color="#B8860B">:001</font><font color="#B8860B">:0</font><font color="4444FF">&gt;</font> <font color="#000080">&quot;vendor&quot;</font> <font color="4444FF">/</font> <font color="#000080">&quot;plugins&quot;</font>
<font color="4444FF">=&gt;</font> <font color="#000080">&quot;vendor/plugins&quot;</font></pre></td></tr></table><p>このためだけに &quot;/&quot; なんて定義しちゃいました！的な！みたいな！ねぇ。Extlib 最大の汚点。池沼。</p>
<p>Extlib /= 10</p>
<h3 class='lead'>String#t, String.translatioins</h3><table class='ruby'><tr><td><pre>catalog <font color="4444FF">=</font> <font color="4444FF">{</font>
  <font color="#000080">&quot;Name&quot;</font>  <font color="4444FF">=&gt;</font> <font color="#000080">&quot;名前&quot;</font><font color="4444FF">,</font>

  <font color="#000080">&quot;%s must not be %s&quot;</font> <font color="4444FF">=&gt;</font> <font color="#000080">&quot;%sは%sです&quot;</font><font color="4444FF">,</font>
  <font color="#000080">&quot;%s must not be blank&quot;</font> <font color="4444FF">=&gt;</font> <font color="#000080">&quot;%sは必須です&quot;</font><font color="4444FF">,</font>
  <font color="#000080">&quot;%s is not accepted&quot;</font> <font color="4444FF">=&gt;</font> <font color="#000080">&quot;%sの値が正しくありません&quot;</font><font color="4444FF">,</font>
  <font color="#000080">&quot;%s has an invalid format&quot;</font> <font color="4444FF">=&gt;</font> <font color="#000080">&quot;%sの形式が正しくありません&quot;</font><font color="4444FF">,</font>
<font color="4444FF">}</font>

<font color="red">String</font>.translations.merge<font color="4444FF">!</font><font color="4444FF">(</font>catalog<font color="4444FF">)</font>

field_name <font color="4444FF">=</font> <font color="#000080">&quot;Name&quot;</font>
message <font color="4444FF">=</font> <font color="#000080">&quot;%s must not be blank&quot;</font>

message.t<font color="4444FF">(</font>field_name.t<font color="4444FF">)</font>
<font color="4444FF">=&gt;</font> <font color="#000080">&quot;名前は必須です&quot;</font></pre></td></tr></table><p>Merb(DataMapper) のローカライズの基本ぽい。とはいえ、&quot;t&quot; はあかん。&quot;/&quot; と並んで String の二大汚物。消毒したい。</p>
<h3 class='lead'>Struct#attributes</h3><table class='ruby'><tr><td><pre><font color="red">Item</font> <font color="4444FF">=</font> <font color="red">Struct</font>.new<font color="4444FF">(</font><font color="#B8860B">:name</font><font color="4444FF">,</font> <font color="#B8860B">:price</font><font color="4444FF">)</font>
item <font color="4444FF">=</font> <font color="red">Item</font>.new<font color="4444FF">(</font><font color="#000080">'CD'</font><font color="4444FF">,</font> <font color="#FF0000">1050</font><font color="4444FF">)</font>
item.attributes
<font color="4444FF">=&gt;</font> <font color="4444FF">{</font><font color="#B8860B">:price</font><font color="4444FF">=&gt;</font><font color="#FF0000">1050</font><font color="4444FF">,</font> <font color="#B8860B">:name</font><font color="4444FF">=&gt;</font><font color="#000080">&quot;CD&quot;</font><font color="4444FF">}</font></pre></td></tr></table><p>AR,DMとの多様性的にGJ。</p>
<p>Extlib++</p>
<p>    <h3 class="lead">感想</h3>
</p>
<p>基本的にいいクラスが多い！特にネーミングが素晴らしい。基本クラスへの追加メソッドとしては、Object#meta_class と ObjectSpace#classes が実用的。meta_class は特に、殆どの人が自前で定義してそうだし、エコ的にも Ruby 本体に取り込みたい。Merb とは関係なしに、Ruby でなんか書くときにも相当使えそう＞Extlib。</p>
<p>    <h3 class="lead">参考</h3>
</p>
<ul>
<li>Extlib <a href="http://github.com/sam/extlib">http://github.com/sam/extlib</a></li>
<li>halcyon <a href="http://halcyon.rubyforge.org/">http://halcyon.rubyforge.org/</a></li>
<li>must <a href="http://github.com/maiha/must">http://github.com/maiha/must</a></li>
</ul>]]></content:encoded>
</item>
<item rdf:about="http://wota.jp/ac/?date=20081201#p01">
<title> 月刊 Github</title>
<link>http://wota.jp/ac/?date=20081201#p01</link>
<dc:date>2008-12-01T00:00:00+09:00</dc:date>
<content:encoded><![CDATA[
<p>はーい！こちらキューテーブルー♪毎月ご機嫌な Github 情報をお届けしちゃうぜ！</p>
<p>まずはレポジトリ情報をチェキラっ！！</p>
<h3 class='lead'>2008.12.1付</h3><table class="list"><TR><TH>ユーザ数</TH><TH>レポジトリ数</TH><TH>ディスク使用量</TH></TR><TR><TD>11823</TD><TD>28340</TD><TD>(計算中...)GB</TD></TR></table><p>ユーザ別の利用レポジトリ数を・・・、カウントダウンっ！</p>
<pre style='border: 2px solid #ccc; background-color: #FFFFEE; padding: 5px;'>github=# select owner, count(*) as count from repositories
           group by owner order by count desc limit 10;
      owner      | count 
-----------------+-------
 rjbs            |   176
 android         |   104
 tekkub          |    72
 nshah           |    55
 defunkt         |    47
 dustin          |    47
 nakajima        |    45
 smtlaissezfaire |    45
 elliottcable    |    43
 drnic           |    42
(10 rows)</pre><p>前大会で初の3桁突入した android を大きく突き放しての初登場1位！という脅威の新人が現れた。ジャニーズの新譜並に強力な彼の名は rjbs。米国、ベツレヘム部屋出身〜♪Perl使い〜♪</p>
<p><a href="http://github.com/rjbs/">http://github.com/rjbs/</a></p>
<pre style='border: 2px solid #ccc; background-color: #FFFFEE; padding: 5px;'># select count(*) from repositories where owner = 'rjbs' and description ~ 'perl ';
 count 
-------
    82
(1 row)</pre><p>やはり、Perl のライブラリが多いですね。</p>
<p>レースはまだ序盤戦。この後どんなハプニングが起こるかわかりませんよねー！</p>]]></content:encoded>
</item>
<item rdf:about="http://wota.jp/ac/?date=20081129#p01">
<title> Rails勉強会＠東京第35回</title>
<link>http://wota.jp/ac/?date=20081129#p01</link>
<dc:date>2008-11-29T00:00:00+09:00</dc:date>
<content:encoded><![CDATA[
<p>ust で参加。IRC経由で質問もできるし、いい時代だ。インターネットの進化がいよいよ現実世界をもロケーションフリーにしつつある。(ust の中の人、乙！)</p>
<p>    <h3 class="lead">まつもとさんとRails使いの対談コーナー</h3>
</p>
<p>最近あちこちで</p>
<ul>
<li>Matzが(Railsよりも)Merbが良いと言った</li>
</ul>
<p>という噂話を耳をしていて、その理由をずっと知りたかったのだが、というのもRails(ActiveSupport)は基本クラスをいじりまくって色んな暗黒魔術を駆使していて、そういう所をまつもとさんは好きじゃないはずなんだけど、Merbも実は結構極悪なダークサイドを持っているので、そういう意味ではどこに差異を見出してるのだろうと疑問だった訳で、それを見事に聞き出してくれた司会者の会長とmoroさんに感謝であります。</p>
<p>    <h3 class="lead">MatzがMerb Love!なソース</h3>
</p>
<p>前提：</p>
<ul>
<li>Matzは「自分が使ってないものを評価したくない」という主義</li>
<li>Matzは Rails も Merb も使ってない</li>
<li>Matzは社交辞令を忘れない日本人である</li>
</ul>
<p>事実：</p>
<ul>
<li>カンファレンスで Rails について聞かれる→「あぁ、いいですね」</li>
<li>カンファレンスで Merb について聞かれる→「あぁ、いいですね」</li>
</ul>
<p>結果：</p>
<ul>
<li>Merb開発側がプロモーション的に「Matzが好評価」と言質を利用</li>
</ul>
<p>した形！？というのがどうも真相なようだ。DHHの営業(宣伝)能力は凄いけど、なるほどEzraもしたたかである。</p>
<p>    <h3 class="lead">メモ</h3>
</p>
<ul>
<li>Ruby 1.8 trunk には merb-action-args 的な機能が既に入ってる！！(Matz++)</li>
<li>NilClass#method_missing #=&gt; nil な実装はかつて Ruby に存在していた (バグの検出が難しいと不評で消えた)</li>
</ul>
<p>    <h3 class="lead">参考</h3>
</p>
<ul>
<li>Rails勉強会＠東京第35回 <a href="http://wiki.fdiary.net/rails/?RailsMeetingTokyo-0035">http://wiki.fdiary.net/rails/?RailsMeetingTokyo-0035</a></li>
</ul>]]></content:encoded>
</item>
<item rdf:about="http://wota.jp/ac/?date=20081127#p01">
<title> do_sqlite3-0.9.8</title>
<link>http://wota.jp/ac/?date=20081127#p01</link>
<dc:date>2008-11-27T00:00:00+09:00</dc:date>
<content:encoded><![CDATA[
<p>Merb 1.0.3 にすると do_sqlite3-0.9.8 が入るが、バグってるぽい。</p>
<table class='ruby'><tr><td><pre>% merb -i
Loading init file from /data/home/maiha/merb/override/config/init.rb
Loading /data/home/maiha/merb/override/config/environments/development.rb
 ~ Connecting to database...
/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:
in `gem_original_require': no such file to load --
  /usr/lib/ruby/gems/1.8/gems/do_sqlite3-0.9.8/lib/do_sqlite3_ext.bundle (LoadError)</pre></td></tr></table><p>do_sqlite3_ext.bundle というファイルが本当になくて驚いた。</p>
<h3 class='lead'>vi /usr/lib/ruby/gems/1.8/gems/do_sqlite3-0.9.8/lib/do_sqlite3.rb</h3><table class='ruby'><tr><td><pre>- require File.expand_path(File.join(File.dirname(__FILE__), 'do_sqlite3_ext.bundle'))
+ require File.expand_path(File.join(File.dirname(__FILE__), 'do_sqlite3_ext'))</pre></td></tr></table><p>とりあえず、0.9.7 と同じように do_sqlite3_ext に戻したら動いた。</p>
<h3 class='lead'>% merb -i</h3><table class='ruby'><tr><td><pre>Loading init file from /data/home/maiha/merb/override/config/init.rb
Loading /data/home/maiha/merb/override/config/environments/development.rb
 ~ Connecting to database...
 ~ Loaded slice 'MerbAuthSlicePassword' ...
 ~ Parent pid: 29893
 ~ Compiling routes...
 ~ Activating slice 'MerbAuthSlicePassword' ...
irb: warn: can't alias context from irb_context.
irb(main):001:0&gt; </pre></td></tr></table><p>irb_context の warning が気になるけど、とりあえず気にしない。</p>]]></content:encoded>
</item>
<item rdf:about="http://wota.jp/ac/?date=20081126#p01">
<title> Merb 1.0.3</title>
<link>http://wota.jp/ac/?date=20081126#p01</link>
<dc:date>2008-11-26T00:00:00+09:00</dc:date>
<content:encoded><![CDATA[
<p>数日見ない間に 1.0.1 -&gt; 1.0.3 へと一気に上がっていた。</p>
<ul>
<li>1.0.2 (11/24) 新機能 override! を実装</li>
<li>1.0.3 (11/25) すまん、override! バグってたw</li>
</ul>
<p>という流れらしい。なるほど。他にも小さな修正点はあるがセキュリティFIXではないので、1.0.1 のままでも問題はないようだ。が、それでも 1.0.3 に上げておくのがお薦め！なぜなら・・・</p>]]></content:encoded>
</item>
<item rdf:about="http://wota.jp/ac/?date=20081126#p02">
<title> override!</title>
<link>http://wota.jp/ac/?date=20081126#p02</link>
<dc:date>2008-11-26T00:00:00+09:00</dc:date>
<content:encoded><![CDATA[
<p>override! は Merb::Controller の既存メソッドの衝突を回避してくれる新機能。正確に言えば、Merb::Controller では既存メソッドの上書きは禁止(例外)されている。例えば Rails で、</p>
<table class='ruby'><tr><td><pre><b><font color="mediumblue">class<b><font color="red"> MailController</font></b> <font color="0000ff"><b><font color="4444FF">&lt;</font> ApplicationController</b></font></font></b>
  <b><font color="mediumblue">def<b><font color="forestgreen"> send</font></b></font></b>
    <font color="#A52A2A"># 送信
  </font><b><font color="mediumblue">end</font></b>
<b><font color="mediumblue">end</font></b></pre></td></tr></table><p>というアクションを作ってヘコむのは、誰もが一度は通る道であろう。</p>
<p>    <h3 class="lead">Merb 1.0.3</h3>
</p>
<p>同じものを Merb 1.0.3 で実装してみると</p>
<table class='ruby'><tr><td><pre><b><font color="mediumblue">class<b><font color="red"> Mail</font></b> <font color="0000ff"><b><font color="4444FF">&lt;</font> Application</b></font></font></b>
  <b><font color="mediumblue">def<b><font color="forestgreen"> send</font></b></font></b>
    <font color="#A52A2A"># 送信
  </font><b><font color="mediumblue">end</font></b>
<b><font color="mediumblue">end</font></b></pre></td></tr></table><table class='ruby'><tr><td><pre>% merb
Loading init file from /data/home/maiha/merb/override/config/init.rb
Loading /data/home/maiha/merb/override/config/environments/development.rb
 ~ Connecting to database...
 ~ Loaded slice 'MerbAuthSlicePassword' ...
 ~ Parent pid: 27631
/usr/lib/ruby/gems/1.8/gems/merb-core-1.0.3/lib/merb-core/controller/merb_controller.rb:479:in `method_added':
 You tried to define send on Mail but it was already defined on Merb::Controller.
 If you meant to override a core method, use override! (Merb::ReservedError)
        from /data/home/maiha/merb/override/app/controllers/mail.rb:2</pre></td></tr></table><p>このように、サーバ起動時に見事に &quot;send&quot; アクションを定義することが池沼であることを指摘してくれる。</p>
<p>    <h3 class="lead">override!</h3>
</p>
<p>&quot;send&quot; の場合は Ruby の基本メソッドなのでピンと来るが、自分にとってまだ未知であるフレームワークのマイナーなメソッドである場合、謎のエラーで相当な時間を潰すことになる。具体的には Merb::Controller で status が予約メソッドであることはまず知り得ないだろう。逆に言えば、status の挙動を熟知しており、それを自分で改良したい場合もあるが、それができないのはおかしい。そこでオーバーライドを明示的に宣言する override! が用意されている。.NET の override キーワードと同じだと思えばいい。</p>
<table class='ruby'><tr><td><pre><b><font color="mediumblue">class<b><font color="red"> Mail</font></b> <font color="0000ff"><b><font color="4444FF">&lt;</font> Application</b></font></font></b>
  override<font color="4444FF">!</font> <font color="#B8860B">:status</font>
  <b><font color="mediumblue">def<b><font color="forestgreen"> status</font></b></font></b>
    some_code || <b><font color="mediumblue">super</font></b>
  <b><font color="mediumblue">end</font></b>
<b><font color="mediumblue">end</font></b></pre></td></tr></table><p>    <h3 class="lead">ロードマップ</h3>
</p>
<p>惜しむらくは、こんなオープンクラスで重要でありがたい機能が Merb::Controller 専用である点。Controller だけでなく Model のカラム名の衝突回避でも使いたいよ、ママン。いや、Rails にもバックポート(?)したい！いやいや、むしろ、Ruby 本体にまでフィードバックしたいくらいだ！！ということで、今後の展開予想。</p>
<ol>
<li>Merb::Controller から Merb::Overridable module へ切り出し</li>
<li>Merb::Overridable から overridable gem へ切り出し</li>
<li>ActiveSupport へ組み込み</li>
<li>Ruby 本体への採用</li>
</ol>
<p>年内に少なくとも 2 までは行く。なんとなれば、機能の粒度を小さくし再利用するのが Merb 流であるし、なによりも、誰もやらないなら俺がやるから。</p>]]></content:encoded>
</item>
</rdf:RDF>
