日本でできあがったオブジェクト指向スクリプト言語がRubyです。覚えたいのでこのページを作りました。日本人が作っているというだけでちょっと自分側についてもらえているという感覚があります。オブジェクト指向というのが今の自分にかなり苦手なものとしてあるのでそれを克服したいという意味もあります。 インタープリタというのは実行させるのが楽というのもあるし、CGIなんかでも使い勝手がいい(本当はC言語でCGIとかつくるとかっこいいんだけど)というのもあるし、とにかく楽しそうだから勉強してみるというきっかけで始めてみることにします。Perlをすこしだけかじったことがあるので覚えやすいと勝手に解釈(インタプリタ)してますが。。。 あと、僕自体が初心者というのもありますが大目にみてもらえなくなるようにがんばりたいとおもいます(^^;;;です。 あと、いろいろ書いてますが、かなりうそが多いです。これは僕の性格上仕方のないことでもありますが、人間真実を吟味しながら喋るのが非常に難しい生物なのでその辺は多めに見てください(さっそく大目に見てほしくなった。。。)。
(Last Modified 2003/04/11 Fri..)

1.まずは準備!
Rubyと言う言語
Rubyを使うためには?
Rubyのインストール
Rubyを僕はWindowsで使いたい!
Rubyにはいろいろある。
Rubyをどこからでも使いたい。PATHを通す。
まずはruby -vから
最初の記念すべきプログラム
Rubyの遊び方1
Rubyの遊び方2

2.下ごしらえに何を知っていればいいんだろう?
Rubyに実行させるファイルの書き方
実行権限(Linixの場合)









3.具体的なプログラム
ハッシュ
引数
数々のぼくのRubyたち
4.結局、Rubyに何をやらせる訳?
それが問題
それが引数
5.いろいろ楽しそうなこと
BioRubyにつかみかかる
クマムシゲノム
6.僕に頼らないで
役立つリンク集
謝辞

1.まずは準備!
Rubyと言う言語
Rubyという言語のまえにPerlという言語があります。この二つはいろいろな経緯があるけど、双子の兄弟のようなものなかんじがします。PerlもPerl5になってからオブジェクト指向をとりいれるようになったようですが、だんだん機能をいれこんでいるうちにかなりの化け物になってきているようです。 あと、PerlもRubyもモジュールというのがあるんですけど、それらがまたまた多すぎる(^^;;; CPANというところが一番大きくて、そこからモジュールをいれてくるみたい。 Rubyにもモジュールがあっていろんなところを探すとでてくるんだけど、ぼくが面白いと思ったのはBioRuby。これは最近流行りのバイオインフォマティクス関係のモジュールをとってあるところ。モジュールというのは要はよくつかう関数をいちいちつくらなくてもよくするものなので楽をするためのものです。

Rubyを使うためには?
Rubyをインストールしなければ使えないです。プラットフォームは現在、WindowsとUNIXが大きくあると思います。この2つに限れば、たとえばWindowsではCygwinというWindowsで動かせるUNIXエミュレータがあるんですけどそれをまずいれてその上でRubyが動かせるようにするというのが順当な手順のようです。
Cygwin環境下でRubyを動かす
http://www.vector.co.jp/soft/win95/prog/se063778.html
インストールの仕方は、ここなんかにも書いてあります。。。
http://www.swlab.csce.kyushu-u.ac.jp/~kurisu/ruby/win32-install.html
というか、UNIXでRubyを動かすのがそもそも本筋なんでしょうね。
Rubyを僕はWindowsで使いたい!
Windows環境でプログラムをするためにはやっぱりCygwinを入れるのが無難のようです。結局、WindowsでUNIXをやるようなかんじになってくるんですね。たしかPerlの場合はActivePerlなんてのがあって、別にCygwinをいれなくてもよかったはず。なれるとUNIX環境があるほうがいいんですけど、それは人の好みなのかもしれない。というか、指の問題で、自然にコマンドがlsと打っていたりするんでそれを考えると、、、とにかくCygwinをいれましょう。初心者だったころはCygwinを入れるだけでもかなり大変だった気がします。大体、プログラムをする前の環境設定が大変だったりしてそこで挫折することがかなりおおいです。なんとかその壁を乗り越えるようにいっしょにがんばりましょう。

まずはruby -vから
Cygwin環境もセットアップできて、Rubyも無事インストールできたことを前提にします。Cygwinのbashから、ruby -vと打ってみましょう。

[hide@elizabethae ~]$ ruby -v
ruby 1.6.4 (2001-06-04) [i386-cygwin]

どうでしょう?できましたか?hide@elizabethaeというのはぼくの環境なのでそれはひとそれぞれいろいろひょうじがでるはずです。$bashとかってでるのかな?ちなみにelizabethaeというのはぼくがはまっている熱帯魚の学名でアピストグラマという南米ドワーフシクリッドという小型魚の種名です。ルージュがひいてあるような可愛い魚なんです。アピストグラマ・エリザベサエ

最初の記念すべきプログラム
そろそろ簡単なプログラムを打ってみたいと思います。これができればRubyでプログラムを組んだ経験があることになりますから。

[hide@elizabethae ~]$ mkdir rwork
[hide@elizabethae ~]$ cd rwork
[hide@elizabethae ~]$ vi 1st.rb

まず、rworkというディレクトリを掘ります(Rubyの専用のディレクトリというような意味でつくってみました)。つぎに、rworkに移動して、1st.rbという名前のファイルをつくります。これはviで作ってみました。viというのはUNIXでは標準のエディタなんですが、Windowsなんかでつくっていれば秀丸でもなんでもいいです。とにかく書きます。
#!/usr/local/bin/ruby
print "hello"
このスクリプトファイル(1st.rb)の説明をします。 まず、最初の行はShebang行と呼ばれていて(Rubyでは呼ばないのかも。。。)、Rubyのインストールされているところを宣言するのです。ぼくは、/usr/local/bin/にインストールしたので、こうやって宣言しました。インストールした先がわからなければ、which rubyと打つとそのものずばりPATHが表示されます。つぎに、実際に実行させるところですが、print "hello"とかきます。これはhelloという文字を標準出力に書いてくださいという命令です。Perlと違うのが、行の最後にセミコロン(;)をつけないところです。 それでは、実行させて見ましょう。

[hide@elizabethae ~/rwork]$ ruby 1st.rb
hello[hide@elizabethae ~/rwork]$
どうです?helloとでましたか?なんか表示がくずれてますね。これはhelloのあとに改行をしていないからです。なので、print "hello"とかいたところをprint "hello\n"と変えて表示してみてください。ちゃんとプロンプトが次の行からはじまってますよね?

Rubyの遊び方1
というわけで、とりあえずRubyでなんらかの仕事をさせることに成功しました。いろいろやってみると面白いと思います。あとはほかのプログラム言語のように条件、分岐、繰り返し、なんかをif文、for文、while文なんかを使ったりするんですが、それはまた微妙にRuby独特のものがあります。それが言語の方言というやつなんでしょうか。 たとえば、変数を宣言して、それを計算し、それを表示させるなんてことをやる場合にはこうします(2st.rb)。
#!/usr/local/bin/ruby
a = 1
b = 2
c = a + b
print "c = #{c}\n"

実行するとこんなかんじ。

[hide@elizabethae ~/rwork]$ ruby 2st.rb
c = 3
今回の肝は、#{c}とやってるところ。cという変数の中身を表示させたい場合、#{c}という風にやると中身をとりだせます。当然、a,bの中身を取り出したい場合は、#[a},#{b}とやるととりだせます。実際に実行して確かめてみてください。

Rubyの遊び方2
ここまで読んできて、文法とか決まりとかいろいろ言わないでなんかおもしろいことができればきっとはまるに違いない?と思った人もいると思います。なのでなんかおぉ!これは!というものを作ってみようと思いました。でも、結論から言うとあんまりあなたを驚かすことには成功しませんでした。・゚(´□`)゚・。 カレンダーを作ってみようと思います。この辺の簡単な事情はここRubyCgi.org http://www.rubycgi.org/cgi_explanation/index.htm さんが詳しいです。というか、RubyでCGIを作りたい!というひとはこのサイトがお勧めです。と、ほかの人の宣伝ばかりですが(^. ^; そこで紹介されていたCGIでカレンダーを表示!というのをちょっとアレンジしてCGIでなくても動かせるようにしました。CGIをいきなりやるのは設定の段階でつまずいてしまうからまずはスクリプトで動かせるようにしてみようというねらいです。どこまでもしょぼくいく路線で行きます。
#!/usr/local/bin/ruby
year = Time.now.year
month = Time.now.month
print "#{year}年#{month}月\n"
まず、このスクリプトファイル(cal.rb)を着実につくりあげていきます。ついてきてください(自分だけかも)。もうすでにオブジェクト指向がでてきてます。それにめげずにつくっていきます。 1行目はShebang行です。 2行目はyearという変数にTime.now.yearとして、年がはいります。 3行目はmonthという変数にTime.now.monthとして、月が入ります。 4行目は改行して(みやすくして) 5行目に?年?月、と表示させます。ruby cal.rbとして、実行してみましょう。どうですか?できましたか?ぼくは、

[hide@elizabethae ~/rwork]$ ruby cal.rb
2003年4月
とでました(2003年4月現在)。あってますか?あってない場合はパソコンの時計が狂ってるかもしれません。Windowsの場合は桜時計とか電話で時報を聞いてあわせてみましょう。 んでは、次に、カレンダーをとりあえず表示させてみました!という感じのプログラムを作ります。 それは次のようです(cal.rb)。
#!/usr/local/bin/ruby
year = Time.now.year
month = Time.now.month


print "\t\t\t#{year}年#{month}月\n"
(1..31).each do |day|
itsday = Time.local(year, month, day,0,0,0)
wday = itsday.wday
#print "wday = #{wday}"

if day == 1
print "\t"*wday
elsif wday == 0
print "\n"
end

if day > 28 && itsday.month != month
break
end

print "#{day}\t"

if wday == 6
print "\n"
end
end
print "\n"
まずは、解説。
1行目はShebang行。
2,3行目は、さっきのスクリプトと同じ。年と月を変数に入れているのです。
それで、5行目で表示させます。
print "\t\t\t#{year}年#{month}月\n"
となってます。¥tというのは、タブ文字を表現する記号です。タブというのはTabキーを打ったときに打ち込まれる文字の一種です、って説明になってないですが。とりあえず打ってみてください。きっとわかります。わからせます。
7行目は、1〜31までループさせるという命令です。なんとなく1ヶ月の日付に関係してるんだろう。。。という推測ができると思います。eachでループさせるんですがここでもオブジェクト指向になってます。
(1..31).each do |day|
1から31までの数字がオブジェクトとして解釈されてそれにそれぞれeachするんでしょうね。よくわかりませんが。。。そのひとつひとつをdayという変数にいれて(つまり、1〜31の数字が代入されていくんです)いくわけです。8行目のitsdayというのはdayでの日付のクラスを入れていますもうオブジェクト指向そのものです。なので、理解できなくてもとりあえず打っておけ!というのが今の段階での理解の仕方でもいいとおもいます。
9行目のwdayは、dayの曜日をいれます。
10行目は実は動いてません。コメント行です。Debugするときにちょっと動かして、コメントアウトしたのです。
#print "wday = #{wday}"
行の最初に#が付いていると思いますが、これをつけるとその行は解釈されません。
# この行はコメントです。
という風に、ソースの中に説明書きを入れるときに使います。
12行目は、もしdayが1だったときの条件を書いています。カレンダーって、その月の最初の週って1日(ついたち)が何曜日から始まるかによって表示がちがうでしょう?あれを表現したいがための条件です。いきなり無条件に日曜日から始まったりすると困るわけです。逆に最初が何曜日から始まるかがわかればカレンダーはしあがります。
それで、13行目で、始まった曜日分をタブ文字で埋めるという処理をしています。
14行目ではもしdayが0(つまり、日曜日だったら)だったら次の行にするという命令です。
16行目はif文に対するendです。if〜endがひとつの条件になっているわけです。
18行目は、うるう年にかんする条件です。
18行目はなんかうまいことやるんだなぁって感じです。
if day > 28 && itsday.month != month
とりあえずどんな月も28日まではあるわけです。問題は28日以降の日付の扱いが難しいので、 まず、28以上のときにかんがえる(day > 28)ことにして、&&はその条件が満たされるとき(日本語で「かつ」のこと)で、次が肝で、itsday.monthというのがmonthでないときという条件です。もし、29という数字のときのitsday.monthが4でなければ29日はその年の4月には存在しないということです。 なんかそういう仕様になっているらしいです(ぼくは危なくなると『仕様』という言葉で逃げることにしてます)。
19行目は、その条件のときに逃げるということです。
22行目は単純に1〜31までの数字を表示させます。ただし、いままでの条件を満たしているときに表示をさせることになるので、当然29日以降は表示されないということになります。カレンダーになってきているわけです。
24行目は1週間を表示させたら次は改行して日曜日から始めるということです。
28行目は、全部表示させたら最後に改行をします(あまり意味がない行です)。
どうでしょうか?よくわかんないですね。・゚(´□`)゚・。
とりあえず動かしてみるとわかります。カレンダーは視覚でうったえるものなのでそういったものをコーディングするとどうしても言葉にするのが難しくなるのです。それはぼくも経験上なんとなくわかります。
でも、一行一行、順に実行していくので上から順に解釈するように理解してみましょう。Ruby自体もそうやって実行するので。

[hide@elizabethae ~/rwork]$ ruby cal.rb
2003年4月
     1  2  3  4  5
6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30

最後に、プログラムは『うごいてなんぼ!』です。ぼくもあんまり綺麗なソースが書けなくて四苦八苦してますが、とりあえず目的のことができるプログラムが仕上がることが第一です。そのためにがんばりましょう>Me!







本家・Rubyのページへ