NavigationBar RubyRingHome Prev Next
←前】 【一覧】 【輪頁】 【次→

Rubyのページ

変更履歴

2003年4月17日
wwwsrvのバージョン0.15.3をリリースしました。
2003年1月6日
wwwsrvのバージョン0.15.2をリリースしました。 multipart/form-dataパーサの書き直し。
2002年12月28日
wwwsrvのバージョン0.15.1をリリースしました。 ruby-1.6.8とruby-1.8.0-preview1に対応するための修正と、 コマンドラインオプション処理のバグを修正しました。
2002年12月9日
wwwsrvのバージョン0.15.0をリリースしました。 0.14のリリースから一年近くもあいてしまったなあ。
2002年4月1日
wwwsrvのCVSレポジトリをcvswebで公開しました。 wwwsrvがバージョン0.14.2になりました。 CGIやeRubyがPATH_INFOに対応しました。古いクラス・モジュール・メソッド 等の定義をwwwsrv/obsolete.rbまたはwwwsrv/*_obs.rbに移しました。

Rubyについて

Rubyはまつもとゆきひろさんが作られたオブジェクト指向のスクリプト言語で す。かゆいところによく手がとどき、なおかつ使いやすいという魔法のような 言語だと思います。わたしは趣味でC, C++, Java, Perl等を一応かじってきま したが、Rubyに初めて触れたとき、「オブジェクト指向ってこんなに使いやす かったんだ!」と目から鱗が落ちました。みなさんも、気にいったらぜひ使っ てみてください。

メモ
Ruby Home Page

自作スクリプト

わたしの作ったアプリケーションやライブラリなどを公開しています。

wwwsrv - ウェブサーバ

アーカイブ
wwwsrv-0.15.3.tar.gz
RAA
開発版スナップショット
CVSレポジトリ

Rubyで作ったウェブサーバです。まだ開発中ですが、CGIやSSIなども動きます。 一応HTTP/1.1準拠のつもりなのですが、RFCを通読してないので、ひょっとし たら変なところがあるかも(汗)。

ちなみに開発版スナップショットは一時間毎にCVSからupdateしたものを自動 的にアーカイブにまとめているので、いつも整合性が取れているとは限りませ ん、あしからず。

MP3プレーヤ

アーカイブ
rmp3-1.1f.tar.gz

UNIX上で動く日本語対応のcursesベースのMP3プレーヤです。 コマンドラインMP3プレーヤー mpg123のフロントエンドなので、 こちらもインストールしておく必要があります。 さらにRuby 1.7以降だと、色付き表示も出来るようになります。

こがさん提供のパッチをもとにして、RIFF形式のMP3ヘッダに 対応しました。

Rubyの小技集

Rubyを使っていて「これは便利かもしれない!」と思ったちょっとした小技な んかをメモしています。なお、あまりに古くなったり、あまり正確でなかった りする情報はこっそりと削除しています ^_^;

BASICみたいに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インタープリタの情報のいくつか、たとえばバー ジョンなどは、定数で定義されています。

RUBY_VERSIONRubyのバージョン。
RUBY_RELEASE_DATERubyがリリースされた日付。
RUBY_PLATFORMRubyを実行している環境の名前。

手続きオブジェクトをブロックとして渡す方法

ブロックを受け取るメソッドでは、引数の最後に手続きオブジェクトを &を付けて渡すことで、手続きオブジェクトがイテレータと して使われるように呼び出すことができます。

[ "a", "b", "c" ].each &proc{ |i| p i }
結果
"a"
"b"
"c"

逆にブロックを受け取るメソッドの内部で、ブロックを手続きオブジェクトと して使いたいときは、メソッドを定義するとき最後の引数に &を付けると、この引数でブロックを手続きオブジェクトと して受け取れます。

プライベートメッドのアクセス

実はModule#class_evalやObject#instance_evalを使うと、プライベートなク ラスメソッドやインスタンスメソッドにもアクセスできてしまいます。しかし カプセル化を壊してしまうので、乱用には注意した方がいいでしょう。

スレッドのデバッグ

スレッドを使うときは、最初のうちは Thread::abort_on_exceptiontrueに設定してお くと便利かもしれません。デフォルトではfalseに設定されてい て、スレッド内でエラーが生じてもそのスレッドが黙って終了するだけで、他 のスレッドにはエラーが感知されないので、なかなかエラーに気づきにくいこ とがあります。

IO#fcntlのコマンドとフラグについて

IO#fcntlに指定できるコマンドとフラグの定数は、標準で入っ ているfcntl拡張ライブラリのFcntlモジュールで定義されてい ます。コマンドとフラグの値はOS(UNIX?)によって異なるので、互換性を保つ にはこのモジュールの値を使う必要があります。しかしfcntl(2)自体はUNIX 環境でしか動かなそう。

String#splitの第二引数

String#splitで文字列を分割するとき、最後に空のフィールド が連続していると、消えてしまいます。Perlのsplitと互換性を 保つためにこうなっているらしいです。空フィールドが消えてしまったら困る 場合は、String#splitの第二引数にフィールド数かもしくは -1を指定すればよいです。

Rubyでデーモンを作るときのメモ

実は恥ずかしながらあんまりよく分かってないんだけど、 とりあえずこうしとけばよいみたい。

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
参考文献
Unix Programmer FAQ 日本語訳
1.7 プログラムをデーモンとして動かすにはどうすればいいですか?

デバッガの使い方

デバッガの使い方は簡単で、-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命令で一つずつステップを進めたりして、動作 がおかしくないか調査します。

Emacsからデバッガを起動する

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と入力することで、カーソルのある場所に一時停止のためのブレークポイン トを設定することができます。


[表紙へ戻る]

Since August 2nd, 2000
土岐 仁謙 (TOKI Yoshinori) <toki@freedom.ne.jp>

GnuPG公開鍵
GnuPG指紋: 2968 565F 0550 57D3 1AF8  E03F 520A 03B6 FAC1 4744