トップ «前の日記(2009-08-10) 最新 次の日記(2009-08-12)» 編集

Route 477



2009-08-11

[ruby] ruby-talkウォッチ

しばらく見てなかったruby-talkのANN関係で気になったものを。 後に行くほどおもしろい…かも知れない。

allgems

RubyForgeの全gem(?)のrdocが見れる。テーマにはhannaを使用(インクリメンタル検索があるやつ)。

looksee

pみたいな「lp」メソッドを提供するライブラリ。あるオブジェクトに対して呼べるメソッドを、Class/Module別に表示する。

 irb(main):001:0> lp []
    => Array
      &            concat      frozen?      push          taguri
      *            count       hash         rassoc        taguri=
 ...

jake

js用のRake? JavaScriptのライブラリのパッケージを作るためのツールらしい。

gibbler

Gitのようなハッシュ(例:c8027100ecc54945ab15ddac529230e38b1ba6a1)をオブジェクトに付加するライブラリ。 オブジェクトの変更履歴を残したりもできるらしい。

sequence

Enumerableの拡張版のような、Sequenceというクラスを提供する。

RedParse

Pure RubyのRuby言語パーサ。まだ100%ではないけど、99%のRubyスクリプトはパースできるそうな。

RubyMacros

RubyにLisp的マクロを追加するプリプロセッサ。README。マクロスとは関係ないw

  macro loop(body)
    :(while true
        ^body
      end
    )
  end

マクロの例。

Rubyの場合、requireをフックすればかなり透過的にプリプロセッサを噛ませられるんだね。

LiveConsole

ネットワーク越しのIRBを提供する。

Ruby Beutifier

ビューティファイアー。Rubyスクリプトの自動整形を行うらしい。

hijack

動いているRubyスクリプトを乗っ取る(笑)。

       $ ruby hijack 16451
       => Hijacking...
       => Mirroring: 100%
       => Hijacked 16451 (my_script.rb) (ruby 1.8.7 [i686-darwin9])
       >>

乗っ取られる側にhijackのコードを埋め込む必要は*ない*らしい。どうなってんのこれ!? (gdbを使ってなんかするらしいが…)

BitStruct

Rubyでバイナリデータを扱うためのライブラリ。もうpack/unpackは嫌だお!という人に。

 class IP < BitStruct
   unsigned    :ip_v,     4,     "Version"
   unsigned    :ip_hl,    4,     "Header length"
   unsigned    :ip_tos,   8,     "TOS"
   unsigned    :ip_len,  16,     "Length"

retrograph

「late-80s 8-bit game」みたいな描画方式を実現するライブラリらしい。READMEにメモリマップが載ってるw

string19

最後は、ライブラリではなくドキュメント…なのだが、Rubyスクリプト。 Ruby1.9の文字列クラスについて、「動くスクリプト」を例にしながら解説したもの。

感想

世にライブラリの種は尽きまじ!

[ruby] Rubyの拡張ライブラリをgem化する方法

まずextconf.rb → make → make install でインストールできるようにする。 それができたら、あとは gemspecのextensionに["ext/foo/extconf.rb"]とか設定するだけ。

すると、gemのインストール時に

 $ cd ext/foo
 $ ruby extconf.rb
 $ make
 $ make install

的なコマンドが実行されるようになる。

「的」というのは、ソース読めばわかるのだが(lib/rubygems/ext/builder.rb)、こんなことをしてたりするからだw

    mf = File.read('Makefile')
    mf = mf.gsub(/^RUBYARCHDIR\s*=\s*\$[^$]*/, "RUBYARCHDIR = #{dest_path}")
    mf = mf.gsub(/^RUBYLIBDIR\s*=\s*\$[^$]*/, "RUBYLIBDIR = #{dest_path}")

    File.open('Makefile', 'wb') {|f| f.print mf}

この辺の話を仕様に書いといてほしいな、と思った。

ちなみにextconf.rb以外にも、以下のようなバリエーションがある。

  • /configure/パターン
    • sh configure --prefix=なんちゃら
    • make
    • make install
  • /rakefile/iパターン
    • rake
  • /mkrf_conf/iパターン
    • ruby mkrf_conf
    • rake

まあextconf.rbが一般的かな、と思う。

extensionでコンパイルできるのはライブラリだけで、実行コマンドをCで書くことはできないことに注意 (少なくとも簡単にはできないと思う)。 まあコンパイルまではできるので、実行コマンド用のRubyスクリプトを書いて(bin/foo)、execしてやればいいんじゃないかな。

…という方法でとりあえずrsdlのgem化には成功した。最終的には gem install rubysdl でrsdlコマンドがインストールされるようにしたい。