![]() |
Rubyはまつもとゆきひろさんが作られたオブジェクト指向のスクリプト言語で す。かゆいところによく手がとどき、なおかつ使いやすいという魔法のような 言語だと思います。わたしは趣味でC, C++, Java, Perl等を一応かじってきま したが、Rubyに初めて触れたとき、「オブジェクト指向ってこんなに使いやす かったんだ!」と目から鱗が落ちました。みなさんも、気にいったらぜひ使っ てみてください。
メモ | ||
---|---|---|
|
わたしの作ったアプリケーションやライブラリなどを公開しています。
アーカイブ | ||||||||
---|---|---|---|---|---|---|---|---|
|
Rubyで作ったウェブサーバです。まだ開発中ですが、CGIやSSIなども動きます。 一応HTTP/1.1準拠のつもりなのですが、RFCを通読してないので、ひょっとし たら変なところがあるかも(汗)。
ちなみに開発版スナップショットは一時間毎にCVSからupdateしたものを自動 的にアーカイブにまとめているので、いつも整合性が取れているとは限りませ ん、あしからず。
アーカイブ | ||
---|---|---|
|
UNIX上で動く日本語対応のcursesベースのMP3プレーヤです。 コマンドラインMP3プレーヤー mpg123のフロントエンドなので、 こちらもインストールしておく必要があります。 さらにRuby 1.7以降だと、色付き表示も出来るようになります。
こがさん提供のパッチをもとにして、RIFF形式のMP3ヘッダに 対応しました。
Rubyを使っていて「これは便利かもしれない!」と思ったちょっとした小技な んかをメモしています。なお、あまりに古くなったり、あまり正確でなかった りする情報はこっそりと削除しています ^_^;
BASICってどんな言語だったっけ... もうおぼろげにしか覚えてませんが、と りあえず文を一行書いてリターンを押すと実行する、という環境がプログラミ ングを始めたばかりのころには非常に使いやすかった気がします。このBASIC みたいにすぐに反応が帰ってくる便利な環境がRubyにもありまして、それが irbです。Rubyのアーカイブを展開してインストールしたら、sampleディレク トリの中に入っているirb.rbを実行してみてください。
irb(main):001:0>
というプロンプトが出てきます。ここからRubyの文を打ち込んでリターンを押 すと、BASICのようにすぐに結果が帰ってきて確認できます。
Rubyにはプロファイラもついてきます。プロファイラというのは、コードのど の部分がよく実行されているのかを調べる道具です。Rubyのプロファイラは標 準でインストールされています。スクリプトのプロファイルを取りたいときは、 Rubyに-r profileオプションを付けて実行すると、スクリプト終 了後に結果を表示します。ただ、ちょっと(いや、かなり、かな)実行速度が遅 くなるのが難点です。
while
をつかえばどうとでもなるのですが、やはりイテレータ
(正式にはブロック付きメソッドと呼ぶのが正しいようです)を使う方がRuby
らしい気がします。
C言語 |
for (i = 0; i < 100; ++i) { ... } |
---|---|
Ruby |
for i in 0..99 ... end 100.times do |i| ... end 0.upto(99) do |i| ... end |
C言語 |
for (i = 99; i >= 0; --i) { ... } |
---|---|
Ruby |
99.downto(0) do |i| ... end |
C言語 |
for (i = 0; i < 100; i += 2) { ... } |
---|---|
Ruby |
0.step(99, 2) do |i| ... end |
C言語 |
for (i = 99; i >= 0; i -= 2) { ... } |
---|---|
Ruby |
99.step(0, -2) do |i| ... end |
しかしRubyには便利なイテレータ(なかには繰り返さないのもあるけど)がたく さんあるので、あんまり使わないような気もします。
スクリプトを実行しているRubyインタープリタの情報のいくつか、たとえばバー ジョンなどは、定数で定義されています。
RUBY_VERSION | Rubyのバージョン。 |
---|---|
RUBY_RELEASE_DATE | Rubyがリリースされた日付。 |
RUBY_PLATFORM | Rubyを実行している環境の名前。 |
ブロックを受け取るメソッドでは、引数の最後に手続きオブジェクトを
&
を付けて渡すことで、手続きオブジェクトがイテレータと
して使われるように呼び出すことができます。
例 |
[ "a", "b", "c" ].each &proc{ |i| p i } |
---|---|
結果 |
"a" "b" "c" |
逆にブロックを受け取るメソッドの内部で、ブロックを手続きオブジェクトと
して使いたいときは、メソッドを定義するとき最後の引数に
&
を付けると、この引数でブロックを手続きオブジェクトと
して受け取れます。
実はModule#class_evalやObject#instance_evalを使うと、プライベートなク ラスメソッドやインスタンスメソッドにもアクセスできてしまいます。しかし カプセル化を壊してしまうので、乱用には注意した方がいいでしょう。
スレッドを使うときは、最初のうちは
Thread::abort_on_exception
をtrue
に設定してお
くと便利かもしれません。デフォルトではfalse
に設定されてい
て、スレッド内でエラーが生じてもそのスレッドが黙って終了するだけで、他
のスレッドにはエラーが感知されないので、なかなかエラーに気づきにくいこ
とがあります。
IO#fcntl
のコマンドとフラグについて
IO#fcntl
に指定できるコマンドとフラグの定数は、標準で入っ
ているfcntl拡張ライブラリのFcntl
モジュールで定義されてい
ます。コマンドとフラグの値はOS(UNIX?)によって異なるので、互換性を保つ
にはこのモジュールの値を使う必要があります。しかしfcntl(2)自体はUNIX
環境でしか動かなそう。
String#split
の第二引数
String#split
で文字列を分割するとき、最後に空のフィールド
が連続していると、消えてしまいます。Perlのsplit
と互換性を
保つためにこうなっているらしいです。空フィールドが消えてしまったら困る
場合は、String#split
の第二引数にフィールド数かもしくは
-1
を指定すればよいです。
実は恥ずかしながらあんまりよく分かってないんだけど、 とりあえずこうしとけばよいみたい。
def daemon catch(:RUN_DAEMON) do unless (fork) then Process::setsid unless (fork) then Dir::chdir("/") File::umask(0) STDIN.close STDOUT.close STDERR.close throw :RUN_DAEMON end end exit! end end
参考文献 | ||||
---|---|---|---|---|
|
デバッガの使い方は簡単で、-rオプションでdebugを 指定するだけです。
ruby -r debug [デバッグ対象のスクリプト]
このようにRubyを起動すると、デバッグ対象のスクリプトをデバッガにロード してから、次の様な画面が表示されて待機状態に入ります。
Debug.rb Emacs support available. wwwsrv.rb:6:require "thread" (rdb:1)
ここからデバッガに色々と指示を出してデバッグを行います。hを 入力するとデバッグ命令の説明がたくさんでてきてちょっとびっくりしますが、 よく使う命令は少ないのですぐに覚えられます。
b [file:]<line> | ブレークポイント(実行を一時停止させる場所)を設定します。 |
---|---|
c | 実行を再開します。 |
s | 次の1ステップだけ実行して先に進みます。 |
p expression | 式を実行します。 |
実際にデバッグするときは、まずb命令でデバッグしたい所に一時 停止のブレークポイントを設定してから、c命令で設定した場所ま で一気に実行します。それからp命令で変数の中身やメソッドの結 果を評価したり、s命令で一つずつステップを進めたりして、動作 がおかしくないか調査します。
RubyのデバッガはEmacsから起動して使うこともできます。Emacsからデバッガ を使うためには、まず最初に必要なファイルをインストールしなければなりま せん。Rubyのアーカイブに入っているmiscディレクトリの下の rubydb3x.elというファイルをload-pathの通ったディレ クトリに置きます。そして次の設定を.emacsに追加します。
(autoload 'rubydb "rubydb3x" "run rubydb on program file in buffer *gud-file*. the directory containing file becomes the initial working directory and source-file directory for your debugger." t)
以上でインストールは終了です。なお、Emacsのバージョンが19.2x以前の場合 は、rubydb3x.elの代わりにrubydb2x.elをインストー ルします。
Emacsからデバッガを起動するときは、まずEmacs上でM-x rubydb というコマンドを実行します。するとミニバッファに次の様に表示して入力待 ち状態になります。
Run rubydb (like this): ruby
ここでデバッグしたいRubyスクリプトを入力してリターンを押すと、デバッガ 用のウィンドウとデバッグ対象スクリプトのウィンドウを開いて、デバッグを 開始します。
デバッガ起動の例 |
---|
Run rubydb (like this): ruby wwwsrv.rb -f wwwsrv.conf.sample |
デバッガ用ウィンドウの例 |
Current directory is ~/ruby/proj/wwwsrv/ Debug.rb Emacs support available. (rdb:1) |
デバッグ対象スクリプトウィンドウの例 |
#!/usr/local/bin/ruby # $Id: ruby.xml,v 1.54 2003/04/17 13:57:10 toki Exp $ # - # Easy WWW server =>quire "thread" require "socket" module WWWsrv SRVNAME = 'WWWsrv' VERSION = '0.1' CODENAME = 'Skeeve' |
デバッガ用ウィンドウでは、通常のデバッガと同様にデバッグ命令を実行でき ます。デバッグ対象スクリプトのウィンドウでは、デバッガが実行している個 所が常に=>で表示されているので、どこを実行しているのかが一 目で把握できます。またデバッグ対象スクリプトのウィンドウでC-x spaceと入力することで、カーソルのある場所に一時停止のためのブレークポイン トを設定することができます。