わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

「Rubyリファレンスマニュアル刷新計画」スナップショットをシェルとブラウザからアクセスしやすくする

毎月1回のアナウンスですね.昨夜届きました.現時点では先頭のリンクは無効で(たぶんまだファイルが登録されていないのでしょう),

$ wget http://doc.okkez.net/archives/201012/ruby-refm-1.9.2-dynamic-20101229.tar.bz2

としてダウンロードできました.ついでに*1

$ mv ruby-refm-1.9.2-dynamic-20101229.tar.bz2 ~/src
$ cd ~/src
$ tar xf ruby-refm-1.9.2-dynamic-20101229.tar.bz2
$ mv ruby-refm-1.9.2-dynamic-20101229 ruby-refm; ln -s ruby-refm ruby-refm-1.9.2-dynamic-20101229

refeの使い方は,http://redmine.ruby-lang.org/wiki/rurema/ReleasePackageHowToで知ることができます.正確にはrefe2と言うんですか.それはそれとして,試しに

$ ruby -I ~/src/ruby-refm/bitclust/lib ~/src/ruby-refm/bitclust/bin/refe.rb -d ~/src/ruby-refm/db-1_9_2 String#length

としてみると,「zsh: no matches found: String#length」と出ます.「#」を,シェルが何か解釈しようとして,トラブったようです.かわりに

$ ruby -I ~/src/ruby-refm/bitclust/lib ~/src/ruby-refm/bitclust/bin/refe.rb -d ~/src/ruby-refm/db-1_9_2 String length

とすれば,うまくいきます*2
じゃあ今後はすべてコマンドラインで引けばいいのかというと,少し問題もあります.

  • ライブラリ以外,具体的には,コマンドラインオプションや制御構造などを確認したくても,引けません.
  • 当雑記に乗せるとき,doc.okkez.netを含むURLを出典とし,あとで参照できるようにしたいのですが,refeの出力では,そのための情報が得られません.

なので自分にはサーバ版も必要です.前述の引数解釈問題の解決と合わせて,~/.zshrcに書き加えました:

export RUBY_REFM=$HOME/src/ruby-refm
if [ -d $RUBY_REFM ]
then
    export RUBY_REFE=ruby
    for f in /usr/bin/ruby
    do
        [ -f  $f ] && RUBY_REFE=$f
    done
    function rubyman-server () {
        RUBYMAN_PORT=10080
        echo "go http://localhost:${RUBYMAN_PORT}/"
        $RUBY_REFE $RUBY_REFM/server.rb --port=$RUBYMAN_PORT >/dev/null 2>&1 &
    }
    function rubyman-server-verbose () {
        RUBYMAN_PORT=10080
        echo "verbose mode"
        echo "go http://localhost:${RUBYMAN_PORT}/"
        $RUBY_REFE $RUBY_REFM/server.rb --port=$RUBYMAN_PORT
    }
    function rubyman19f () {
        $RUBY_REFE -I $RUBY_REFM/bitclust/lib $RUBY_REFM/bitclust/bin/refe.rb -d $RUBY_REFM/db-1_9_2 $@
    }
    function rubyman18f () {
        $RUBY_REFE -I $RUBY_REFM/bitclust/lib $RUBY_REFM/bitclust/bin/refe.rb -d $RUBY_REFM/db-1_8_7 $@
    }
    alias rubyman19="noglob rubyman19f"
    alias rubyman18="noglob rubyman18f"
    alias rubyman=rubyman19
    # alias rubyman=rubyman18
fi

それで,シェルを起動すると,環境変数としてRUBY_REFEとRUBY_REFM,コマンドとしてrubyman-server, rubyman-server-verbose, rubyman19f, rubyman18f, rubyman19, rubyman18, rubymanが利用可能となります.
「for f in /usr/bin/ruby」と,forなのに要素が一つというのは不自然ですが,変数名を隠蔽したいのと,rubyコマンドを複数記述できるようにしたいためです.このforコマンドは,rubyコマンドを実行する際にデフォルト以外のパスにするためのものです.これが必要なのは,Ruby 1.9*3でサーバ版を起動し,ブラウザで,組み込みライブラリの各ページを参照すると,文字コードに起因するエラーが発生したからです.
サーバの起動には,WEBrickの出力をすべて捨てるタイプのrubyman-serverと,そのまま出力するrubyman-server-verboseの2つを作りました.前者は,起動してもシェルを占有されない,後者は,Ctrl+Cで終了できるというメリットがあります.
またnoglobは,便利コマンドを作るで学びました.
rubyman18とrubyman19の動作確認は:

$ rubyman18 String#length
String#length
--- length -> Integer
--- size -> Integer

文字列のバイト数を返します。

$ rubyman19 String#length
String#length
--- length -> Integer
--- size -> Integer

文字列の文字数を返します。バイト数を知りたいときは bytesize メソッドを使ってください。

@see [[m:String#bytesize]]

bash対応,サーバ版(ローカルの)URLからhttp://doc.okkez.net/以下へのマッピングについては,今後の課題としたいと思います.

*1:各コマンドは冗長に見えますが,「cd ~/src」を実行するときは,「cd 」だけ普通に打ち込んでから,Alt-. とすれば,直前のコマンドの最後の引数が追加されますし,mvとln -sを含むコマンドは,セミコロンで区切って1回で実行させることにすれば,「ruby-refm-」のあとにTabによる補完が効きます.

*2:じゃあ常に「#」は使わなければいいのかというと,Array#*を引こうとして「(略) Array *」とすると,やっぱり失敗します.

*3:動作確認したバージョンは「ruby 1.9.3dev (2010-12-26 trunk 30376) [i386-cygwin]」.