MacRubyについて

 Rubyはまつもと ゆきひろさん作のオブジェクト指向スクリプト言語です。Rubyそのものについては <http://www.netlab.co.jp/ruby/> などをご覧ください。

 MacRubyはRubyをMacOSで使えるようにしたものです。MacRubyという名称はMacOSで動作するRuby環境を表わす仮の名前でauthorizeされたものではありません。

 MacRubyは、Ruby本体(共有ライブラリ)、Ruby本体を利用するアプリケーション、ライブラリ、拡張モジュールなどで構成されます。Ruby本体は共有ライブラリになっています。MacRuby本体(共有ライブラリ)を利用するアプリケーションを、MacRubyアプリケーションと呼びます。MacRubyのユーザは、通常、MacRubyアプリケーションを介してRubyを利用することになります。

 現在のMacRubyはかなり実験的なものです。ここに書かれていることは予告なしに変更することがあります。動作させることにより何かしらトラブルが起こる可能性がありますが、その点ご理解ください。いまのところ68Kマッキントッシュでは動きません。

MacRubyに含まれているファイル、フォルダ

RubyCorePPC.shlb

 Ruby本体を含む共有ライブラリです。

SimpleRuby PPC

 もっともシンプルなMacRubyアプリケーションです。オリジナルのrubyコマンドと同じコマンドライン引き数をダイアログボックスを介して指定しRubyを動かすことができます。

:libフォルダ

 Rubyのライブラリファイルを入れるためのフォルダです。

:lib:ppc-macosフォルダ

 拡張モジュールを入れるためのフォルダです。

:sampleフォルダ

 Rubyのサンプルスクリプトが入っています。

RubyAppleScriptI/F

 AppleScript経由でRubyスクリプトを実行するためのMacRubyアプリケーションです。

RubyDropletBase

 Rubyドロップレット(後述)のベースとなるMacRubyアプリケーションです。リソースレベルで簡単にカスタマイズ可能です。

MacRubyEval

 eval.rbをリソースに組み込んだMacRubyアプリケーションです。リソースレベルで簡単にカスタマイズ可能です。

MacRubyRbc

 rbc.rbのファイル位置をリソースに組み込んだMacRubyアプリケーションです。MacRubyEvalとほとんど一緒です。

RubyAppleScriptIFを終わらせる

 単にRubyAppleScriptIFアプリケーションを終了させるためのアプリケーション(AppleScript)です。なんでこんなもんがあるかというと、RubyAppleScriptIFはときどきマウスやキーボードでQuit出来なくなるためです、原因不明 (^^;。

Ruby本体(共有ライブラリ)を置く場所

 MacRubyアプリケーションを使うためには、Ruby共有ライブラリ、あるいはそのエイリアスを

  1. そのアプリケーションと同じフォルダ
  2. 機能拡張フォルダ以下のどこか

のうちのどこかに置く必要があります。

ライブラリ、拡張モジュールを置く場所

 Rubyのライブラリや拡張モジュールは

  1. MacRubyアプリケーションのあるフォルダの下のlibフォルダ
  2. その下のppc-macosフォルダ
  3. 機能拡張フォルダの下のMacRuby:libフォルダ
  4. その下のppc-macosフォルダ

のうちのどこかに置く必要があります。

AppleScriptインターフェース

 AppleScriptの中でRubyのスクリプトを実行する場合には、RubyAppleScriptIFアプリケーションを使います。スクリプト編集プログラムなどで簡単な用語説明を見ることが出来ます。

Rubyアプリケーションクラス

属性

args -- Rubyワールドの$macruby_args

イベント

open file -- Rubyスクリプトファイル

do script anything -- Rubyスクリプト、またはRubyスクリプトファイル

 結果: anything -- Rubyワールドの$macruby_replyの値

 

 AppleScriptワールドとRubyワールドでやり取りできるデータの型は、テキスト、真偽値、整数、実数、リストのみです。あまり意味のない例ですが例1例2をご覧ください。 

Rubyドロップレット

 Finder上でファイルやフォルダをドラッグ&ドロップしたとき、それに対してRubyスクリプトを実行するRubyアプリケーションをRubyドロップレットと呼びます。AppleScriptのドロップレットのRuby版だと思ってください。前述のファイルRubyDropletBaseは、Rubyドロップレットのベースとなるアプリケーションです。(もちろん)必須AppleEventに対応しています。

 RubyドロップレットのRubyスクリプトでは、$macruby_argsというグロバール変数に、ドロップされたファイル、フォルダ名のリストが入っています。(例、日本語テキストをjisコードに変換するドロップレットのrubyスクリプト)

Rubyドロップレットの作り方

 今のところ、簡単に作る方法は用意していませんが、ResEditなどの使い方やアプリケーションのリソースについてある程度理解している方は、次の手順で作ることが出来ます。

  1. RubyDropletBaseをコピーして適当な名前を付ける
  2. 'TEXT'リソースID=1000にrubyスクリプトを作る、あるいは書き換える

 これでドロップレットとして機能します。必要に応じて'BNDL'、'FREF'などのリソースを適当にいじるとよいでしょう。

MacRubyEval, MacRubyRbcについて

 MacRubyEvalやMacRubyRbcも、Rubyドロップレットと同様にリソースレベルでカスタマイズすることが可能です。次のような仕様になっています。

  1. 'STR 'リソースID=1000にスクリプトファイルへのパスが書いてあればそのスクリプトファイルを実行
  2. 'TEXT'リソースID=1000にスクリプトが書かれていればそのスクリプトを実行
  3. SimpleRuby PPCと同じコマンドライン入力ダイアログによってrubyを実行

 また、'SIOU'リソースID=1000で、コンソールウィンドウの振る舞いやフォントなどを多少変更することが出来ます。ResEditではなくResourcerer用ですが'TMPL'リソースもついています。

オリジナルRubyとの違い

 困ったことにオリジナルとの違いはたくさんあるのですが... (^^;

 オリジナルと違ってよく落ちます (^^;。sample以下のスクリプトの中には、動かすとエラーになったり、ひどい場合は爆弾を出したりフリーズしたりするものがあります。すみませんが、まだまだ完成度は低いです。

 Processモジュール、IOクラスの一部など、processやpipeなどによるprocess間通信に関する部分はまともに実装されていません。もともとMacOSにはバイトストリームによるプロセス間通信という考え方がなく、プロセス間通信(というかアプリケーション間通信)はAppleEventという構造を持ったデータを介して行われます。MacOSとUNIXとではモデルがあまりにも違い過ぎます。

その他考えていることなど

 AppleEvent、AEOMを扱う拡張モジュール、簡単に言うとRubyをAppleScriptのように使うための拡張モジュール。RubyレベルでAppleEventハンドラを組み込む方法。ファイルタイプ、クリエータなどを扱うためのしくみ。Frontier ODB Engineの拡張モジュール。などなど...

 

Ruby for MacOS, BeOSページ

藤本尚邦 hisa@imasy.or.jp