コンダラ道を進む上で、いかにもこれはマズイ。ダサダサである。だもんで、師匠に相談してみたのだ。そうしたら師匠はキッパリ、今さらPerlでもないでしょ、Rubyを覚えなさい、とのたまったのだ。
Rubyというのは、まつもとゆきひろさんという方がお作りになった、オブジェクト指向なscript言語だ。公式ホームページを見るべし。実は、コレを書いている今の時点で、オレはまだたったの1行たりともRubyのプログラムを書いていない(笑) だが、公式ホームページに張ってあるリンクからFAQやチュートリアルを読み、さらにRubyメーリングリストにも参加し、もうすっかりRubyが好きになってしまったのだ。
まだ意味は全然取れないけど、パッと見ると、すげぇ昔、まだ小僧だった頃(笑)に実はハマッていた、GAME言語とかTL/1(PL/1じゃないよ。知ってるかな?)とかをちょっとホウフツとさせる面影なんかある気がして、いい感じ。
さらに、Rubyは機能拡張が容易(とお歴々はかる〜くおっしゃるが(笑))で、実際にいろいろと作業が行われているようだ。tcl/tkと組み合わせてみたり、XFormsと組み合わせてみたりという、RubyでXのWidgetセットを扱う拡張なんて、むっちゃ面白そう。実際、Rubyのサンプルに付いてくるRuby/tkで書かれたオセロ・ゲームなんて、え!?てくらいシンプルで短いのだ。でも充分面白く遊べた。ハニーなんてしばらくオセロ猿になってたぞ(笑)
中でも興味シンシンなのがRuby/GTKってヤツだ。今一番お気に入りなGTK+がRubyからどうやって使えるのだろう。ワクワク。
script言語というくらいだから、インタプリタで書いてすぐ試せるし、さらにオブジェクト指向言語として最初から設計されているので書式もシンプルそのものだ(まだ意味取れないけど綺麗で短いってことはわかる(笑))。さらに当然ながら様々な組み込みクラスを持っていて、socketなんかもサクサク使えるようだ。クライアントは当然として、サーバだって書けば書けそうだぜ。CPANのPerlライブラリ集に劣らないRubyライブラリ集みたいなものが、今にきっとまとまっていくに違いない。オレもそれに参加できるものならぜひしたいものだ。
さらに、Rubyメーリングリスト(これがハイレベルでオレにはついていけないの(泣))には、オレのお気に入りのmutt(メーラ)やjed(エディタ)を使っている方々がいたのだ! オレ、自分と師匠以外のmuttユーザからのMailを初めて見たよ(笑) で、さらに素晴らしい計画が進行していて、なんとjedにRubyを組み込んでしまおうというでわないか。う〜む、すげぇぜ。jedの機能をRubyで拡張できるようになったらどんなに素敵だろう。
Rubyはsocketを使えるんだから、ndtpもきっと喋れるハズだ。jedで、ある単語の上にcursorを置いて、M-x lookup とかやったら、実は内部ではRubyがそっとndtpを喋って辞書鯖とお話しして辞書を引き、jedのスクリーンを2つに割って、引っ張った結果を表示してくれる、なんてのが書けるやも知れぬ。くぅ〜、カッコいいぜ! え?んなもんとっくにmuleとelispでできてるだろって?
甘いな。そこをjedとRubyでやるのがコンダラなんじゃねぇか(笑)
おっと、脱線してしまったが、てなワケで、オレは今後Rubyをとほほる標準script言語として正式採用することに決めたのだった(笑) まずはできることから、というのでRuby 1.1c6(今のところ最新版ね)をrpm化してみた。例によってパッケージ置き場に置いた。
赤帽5.1ではどうやら、基本的には/usr/local以下はなるべく使わない、という方向に進んでいる(おそらくFSSTNDとかそういった線で)ようなので、Rubyもそういう構成でパッケージ化した。インストールすると、/usr/doc/ruby-1.1c6の下にサンプルが多数置かれるが、これらのサンプルもすべて、一行目は#!/usr/local/bin/rubyから#!/usr/bin/rubyにしてあるので、そのままで動く。が、世に出回っているであろうRubyのプログラム(公式ホームページからたどれるのも含めて)は、おそらく#!/usr/local/bin/rubyで始まっているだろうから、そういうものを手に入れた場合は申し訳ないが修正が必要だ。Perlなども今後は/usr/bin/perlに置かれるのが主流となるんではないかと思うので、もう今のうちからそうしてしまったよ(笑)
で、さらに姑息なマネをしてあるのだが、rubyをshared library化しておいた。標準的な手順でRubyをmakeすると、libruby.aというライブラリができ、ruby本体はこのライブラリをstaticにlinkするのだが、実は./configureする際に --enable-shared というありがちな呪文(笑)を唱えると、libruby.soをmakeしてくれて、rubyはそっちをlinkするようになるのだった。
といっても、Rubyをsharedにしたところで、今のところ実際にそれを必要とするのはRuby以外にはjedしかないらしい。が、師匠と共謀してjedのRuby拡張に萌え萌えなオレとしては、やはりsharedにするのがお約束だったのだ。
./configure に --enable-shared の呪文を授けてくれたのは立石さんという方らしいのだが、ここで一つ問題が。libruby.soそのものは確かにmakeされてできているんだが、インストールに失敗するのだ。
赤帽でrpmなパッケージを作る場合、/usr/src/redhat/BUILDなどという、あらかじめ指定したディレクトリにソースを展開し、configureなどの前処理の後にmakeする。で、makeが済んだら、/var/tmpの下などの、これまたあらかじめ指定したディレクトリに一旦ほんとうにインストールするという処理をする。仮想インストールなどというらしい。
で、この仮想インストールをするためには、単にmake installするのではダメ(これでは本来のディレクトリに本当にインストールしにいっちゃうから)で、make prefix=/var/tmp/ruby-root installなどとして、/var/tmp/ruby-root があたかも/であるかのようにしてインストールさせるのだが、ここで失敗するのだった。それも、--enable-sharedをつけた時だけ。
make installを実行すると、minirubyというrubyのサブセットのようなものが走り、インストール先のディレクトリがなければ必要に応じて掘るなどすべて面倒を見てくれるのだが、上の例でいうと、どうも/var/tmp/ruby-root/usr/libというディレクトリをちゃんと掘ってくれてないようだった。
libruby.soを/var/tmp/ruby-root/usr/libにコピーするのだが、実際にはこのlibが掘られていないので、libruby.soをlibというファイルとしてコピーしちゃうんだよね。で、その次のフェーズで、/var/tmp/ruby-root/usr/lib以下にさらにディレクトリを掘ろうとして失敗する。shared libraryじゃない場合は、libruby.soをコピーするロジックはすっ飛ばされるので問題が起きていなかったのだ。
わからなかったら師匠に聞こう、と思ってinstruby.rbを見てみたら、
for lib in ["libruby.so", "libruby.so.LIB"] if File.exist? lib File.install lib, "#{prefix}/lib", 0644, TRUE end end File.makedirs libdir, TRUE
などという箇所がある。makedirsなどといういかにもなメソッドがlibruby.soのコピーをしているらしき部分よりも下だ(笑) これかなぁ?などと半信半疑で
File.makedirs libdir, TRUE for lib in ["libruby.so", "libruby.so.LIB"] if File.exist? lib File.install lib, "#{prefix}/lib", 0644, TRUE end end
などと逆にならべるようにパッチをこさえてあててみたら、めでたくインストールできるようになったよ。オレが初めて中を見て、ほんの少しとはいえ触ってみたRubyのプログラムは、instruby.rbということになったのだ(笑)
もともとRubyのRedHat向けパッケージのメインテナをなさっていた小澤@日立さんからSPECファイルとpatchを頂いてあったので、それらをベースにしたおかげでrpm化の際に必要な作業は労せずしてできた。ありがとうございます>小澤さん
PowerPCなど、Intel以外のマシンは残念ながら持っていないので確かめられないが、ソース・パッケージから作ればPowerPC用のパッケージも作れるようになっていると思う。
組み込みクラスや各種の拡張を実装しているファイル類は、/usr/lib/rubyの下にコピーされるようになっている。さらにヘッダ・ファイルやDynLoadされるモジュール類はIntel系マシンなら/usr/lib/ruby/i386-linuxの下に、PowerPCなどの場合は恐らく/usr/lib/ruby/ppc-linux?に入ると思う。そして、shared libraryなRuby、libruby.soは、/usr/libにコピーするようになっている。インストール時にldconfigを実行するのでsharedになっていることを何も意識にする必要はない。
さて、こうして無事にRubyもインストールできた。で、師匠からもらったRuby対応patchのあたったjedも、実はすでにパッケージ化もできて、動いているんだ。もうすでにオレの標準エディタとして日々の人柱モードに突入している。というか、今これを書いていたりする(笑) もちろん、まだ全然Rubyなことはしていないけど、まぁ少しずつ楽しみながらやるさ。Rubyはこれからもどんどんバージョンが上がると思うので、バージョンアップするたびに追っかけをしてパッケージのメンテをしようと思っているんだ。
やっぱ、Rubyでしょ、これからは。
メール | 戻る |