その他
    ホーム 技術発信 DoRuby utility_beltでwirble以上にirbを拡張する

    utility_beltでwirble以上にirbを拡張する

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    はじめまして。

    KBMJでプログラマとして働いているkuromatuと申します。

    今回は、rubyのコーディングの際によく使われるinteractive ruby(irb)を拡張するgemプラグインのwirbleを基に、更なる拡張を加えるutility_beltというgemプラグインについて紹介します。

    インストール方法

    gem install utility_belt
    

    実行すると、utility_belt-1.1.0(2009/02/27現在)がインストールされます。

    使い方

    ホームディレクトリに以下の記述の.irbrcを置きます。

    require 'rubygems'
    require 'utility_belt'
    

    utility_beltをrequireした際にwirbleもrequireされているので、wirbleに関する記述は必要ありません。

    そのままirbを起動すると、wirbleの拡張機能と、utility_beltにデフォルトで設定されている機能を利用できるようになります。

    デフォルト設定で適用される設定

    irbがカラフルになる

    これは、utility_beltが依存しているwirbleというgemプラグインで実装されている機能ですが、色設定がutility_beltで再定義されています。

    色設定セットはdarkとlightの2種類が定義されていて、デフォルトではdarkが選択されています。

    色をlightに変更したい場合には、

    $RUBYGEMS/gems/utility_belt-1.1.0/lib/utility_belt.rb

    というファイルの22行目にある記述を次のように書き換えてください。

    UtilityBelt::Themes.background(:dark) if defined? UtilityBelt::Themes
    ↓
    UtilityBelt::Themes.background(:light) if defined? UtilityBelt::Themes
    

    ハッシュの追加・削除

    + – でハッシュの追加・削除ができます。

    >> hoge = {:fuga => "bar" }
    => {:fuga=>"bar"}
    >> hoge += {:hige => "baz"}
    => {:fuga=>"bar", :hige=>"baz"}
    >> hoge -= :fuga
    => {:hige=>"baz"}
    

    わざわざmergeやrejectを使わなくて良いので楽ですね。

    コマンドヒストリが参照できる

    wirbleの機能として、コマンド履歴の保存と参照(Ctrl-p、Ctrl-n)が利用できます。

    utility_beltでは、その機能に関連するメソッドを追加しています。

    h(history)                     - 履歴一覧を呼び出せます。引数として表示履歴数を指定できます。
    h!(history_do)                 - 最後に実行したコマンドを実行できます。
    hvi(history_to_vi)             - 履歴一覧をviで開き、編集できます。
    history_write(filepath, lines) - 履歴一覧を指定したファイルの指定行に書き込みます。
    

    実行例:/home/hoge/fugaというファイルに、履歴の0~100行目を書き込む

    history_write(/home/hoge/fuga, 0..100)
    

    irb中にエディタが呼び出せる

    vi、emacs、textmate(MacOSのエディタ)が呼び出せます。

    vi    - viの実行
    emacs - emacsの実行
    mate  - textmate
    

    emacsclientを使用している方への対応はまだのようですが、

    TODOとしてコメントが残されているところを見ると、今後のアップデートで実装されるかもしれません。

    irb_options

    irbの自動インデント設定をONにします。

    irbの出力結果の有無を切り替えられる

    v(verbose)  - irbの出力結果を表示する
    q(quiet)    - irbの出力結果を非表示にする
    

    その他の機能

    デフォルトの機能以外にも有用な機能が実装されているので、すべて利用できるようにしてみましょう。

    利用方法

    $RUBYGEMS/gems/utility_belt-1.1.0/lib/utility_belt.rb

    というファイルの16行目にある記述を書き換えてください。

    UtilityBelt.equip(:default) unless UtilityBelt.equipped?
    ↓
    UtilityBelt.equip(:all) unless UtilityBelt.equipped?
    

    Windows・Linuxの場合には、書き換え後にirbの実行でエラーが出る可能性があります。その時は、先に挙げた行を以下のように書き換えて下さい。

    UtilityBelt.equip(:all, :except => ["clipboard", "pastie", "google"]) unless UtilityBelt.equipped?
    

    デフォルト設定以外の機能

    findメソッドを省略できる(Rails用)

    Ruby On Rails(Rails)でruby script/consoleを使う際に有効な機能です。

    >> memo(1)
    memo(1)
      Memo Load (0.0ms)   SELECT * FROM "memos" WHERE ("memos"."id" = 1)
    => #<memo id: 1, body: "test", created_at: "2009-02-25 12:00:00", updated_at: 12:00:00">
    

    memo(1)と書くと、Memo.find(1)と挙動となります。

    memo(:all, :order => “id”)などのように、

    オプションも普通に渡すことができます。

    標準出力に実行されたSQLログが流せる(Rails用)

    こちらもRailsでruby script/consoleを使う際に有効な機能です。

    logコマンドを実行すると、その後に実行されたSQLログを標準出力として表示します。

    普段から別画面でログファイルをtailしている人にはあまり必要がないかもしれません。

    ActiveRecord::Baseのメソッドを使ったコードの検証には役立つと思います。

    log
    => #<logger:0x35ae4e0 ...>
    >> memo(1)
    memo(1)
      Memo Load (0.0ms)   SELECT * FROM "memos" WHERE ("memos"."id" = 1)
    => #<memo id: 1, body: "test", created_at: "2009-02-25 12:00:00", updated_at: 12:00:00">
    

    notメソッドが使える

    論理値を反転させることができます。

    >> true.not
    => false
    

    各オブジェクトのメソッドや、ロード済みのクラスがgrepできる

    >> grep_classes "True"
    => ["TrueClass", "RubyToken::TkTRUE"]
    >> String.new.grep_methods "split"
    => ["split"]
    

    Symbol#to_proc、String#to_procが使える

    Symbol#to_procはruby1.9系で実装されていますね。

    >> plus = :+.to_proc
    => #<proc:0x03fe6930 @...>
    >> puts plus.call(1,2)
    3
    => nil
    

    String#to_procも出番は少なさそうですが、面白い機能だと思います。

    (1..3).map(&'*2')
    => [2, 4, 6]
    

    is_an?メソッドが使える

    is_a?メソッドのaliasとして、is_an?メソッドを定義しています。

    文法の厳密さを求める方には良いかもしれません。

    >> [].is_an? Array
    => true
    

    クリップボードを操作する(Mac OS X用)

    クリップボードの内容にアクセスする機能が利用できます。

    MacClipboard.read          - クリップボードから読み込み
    MacClipboard.write("hoge") - クリップボードへ書き込み
    

    その他には、Amazon S3のアップロードコマンドとGoogle検索コマンド(どちらもMac OS X用)があります。

    筆者の環境(Windows+Linux)では利用できなかったため、今回の紹介には含めませんでしたが、興味のある方は以下のページ(英文)にて利用方法をご確認いただければ幸いです。

    http://utilitybelt.rubyforge.org/usage.html

    その他

    難点

    Railsの1.2系だと、irbを起動していない場合でも、常に.irbrcが読み込まれてしまうという不具合が存在するようです。

    そのため、常にutility_beltの拡張が有効となってしまいます。

    この影響で、一部のRails Aprricationでscript/consoleを実行した際に、utility_beltとアプリケーションの一部のメソッドが競合する可能性があることに注意してください。

    過去のバージョンで作者の方も苦労されたようです。

    http://gilesbowkett.blogspot.com/2007/12/utility-belt-vs-rails.html

    個人的な意見

    rubyメソッドの確認・Railsのscript/console上での検証作業や、ruby-debugと組み合わせたデバッグ作業に利用しています。

    問題解決、今書いているロジックの検証にとても役立っています。

    最後に

    最後までお読み頂き、誠にありがとうございます。

    irbをよく利用される方、面白そうと思われた方は、ぜひ一度utility_beltを使ってみてはいかがでしょうか。

    参考URL

    Utility Belt

    http://utilitybelt.rubyforge.org/

    Rubyforge Projectページ

    http://rubyforge.org/projects/utilitybelt/