授業も残りがわずかとなってきた。教科書にある内容を順次説明してきたが、2章はRubyでできることの一覧的な位置づけで網羅的にすべての機能について説明されていたため、肝心な「Rubyで何ができるか」という視点を見失いがちであった。そこで、今回からは教科書の説明よりも実用になるスクリプトの例を見ながら、Rubyの使い方のようなものを扱うことに方針を変更した。
4月から長い期間Rubyの各機能を学習してきたので、実際には必要な知識やメソッド、機能は一通りは目を通しているし、また、必要であれば教科書を調べると何とかなるレベルにいるはずである。(実際には、なかなかそうはいかないが。)このまま、今まで通りの授業を進めていくと、結局何がおもしろくてRubyをやるのか、今後自分でRubyを勉強して何ができるのか、その辺が曖昧なまま終わってしまうことになり、せっかくの半年間の授業が活かされない。そのための緊急措置的な方針変更であるので、ご容赦願いたい。
なお、実際に役に立つRubyのスクリプトの例は最近のプログラミングやUNIX系の雑誌に多くの連載記事があり、多数紹介され始めている。初心者用の教科書がないため、勉強意欲がなかなか上がらない場合や自分でもう少し学習したい場合にはそちらを参考にすることをおすすめする。また、最近の雑誌における扱いを見ると、Rubyがもはやかなり普及した言語であることも認識できると思うので、一度書店で見てみると良いかもしれない。Rubyを取り上げている雑誌は、
http://www.ruby-lang.org/ja/press.html
で参照できる。また、上記ページによると入門書の企画もあるそうなので、興味を持った人もあと少し待てば何とかなるかもしれない。
ここで扱うのはスクリプトとファイルとのやり取りであり、実は、今までの授業や課題でgetsを頻繁に使ってきているので、すでにかなりの部分は扱っている。IOクラスでは、ファイルの引数としてファイル名を指定して、gets()で読み込む以外に、openを使ってあらかじめ指定したファイルを自動で読み込むことも可能であり、この節ではそれに関する説明がなされている。すでに学習した内容がほとんどであるので細かい説明をしなくても例を見るとわかるはずであるが、教科書には一部間違いがあるのでその修正をしておく。
p.87 2行目のIO#getlineはIO#readlineの間違い2.15.2に説明されているソケットに関しては、ネットワークの知識が必要なのでここでの説明は省略しておくが、Rubyを用いてCGIスクリプトを作成する場合には必要となる知識である。今後、自分でCGIスクリプトを作成する場合には参考にすると良い。一般的にはPerlでスクリプトが書かれることが多いが、Rubyが理解できれば少ない行数でより簡潔に書くことができる(はず^^;)ので将来的に役に立つかもしれない。p.87 4行目のreadlineはreadlinesの間違い
p.87 17行目もgetlineとreadlineの誤植がある
Rubyの主要な目的はテキスト処理である。では、テキスト処理というのはどのような場合に利用されるのか。一つは文書の修正や校正において特定の文字列を検索して置き換えたり、並べ直したり、また、段落を整理したりということが考えられる。UNIXのgrepやsed、awkというコマンドを組み合わせても実現できる機能であるが、繰り返し行う場合にはスクリプト化しておいて、適当に設定を変更して作業するのが効率がよい。他には、当然、CGIのようなwebと連携して動作するスクリプトもある。また、データベースの構築にもキーワードや分類などテキストを扱う処理が多いので、特に大きなデータ量でない限りRubyは威力を発揮する。
今回扱う例は上記以外のもう一つの分野である表計算を取り上げる。知っている人も多いと思うが、表計算とはスプレッドシートと呼ばれる升目を持つ表に数値を入力し、列や行に対して自分で計算処理を行うことによりデータ処理を行い、結果をグラフや図にして整理するアプリケーションであり、マイクロソフトのExcelが有名である。最近ではLinuxで動く表計算ソフトも(当然フリーで\(^o^)/)出回り始めており、GnumericがExcelのデータ読み込み機能などを持っているので重宝されているようである。また、商品としてApplixwareというオフィス統合ソフトの中にも表計算機能がある。しかし、Linuxを始め、UNIXでは表計算ソフトはこれまであまり利用されていなかった。原因としては文化の違いが大きいが、UNIXは基本的にプログラマが使用する機会が多く、表計算のような単純な作業であれば基本コマンドのAwkや各種スクリプト言語を利用して自分で計算できるからである。(実際に研究で行う数値計算や解析のプログラムに比べると表計算自体の処理は簡単である。)
Rubyを用いた表計算のもっとも基本的な例を以下に示す。
#!/usr/bin/ruby #spread.rb total = 0 file = open("/virtual/home/b00**/script/spread.txt") while line = file.gets() line.chomp! ary = line.split(/\t/) if /^[A-Za-z]*$/ =~ ary[1] ary << "Amount" for i in 0..3 print ary[i], "\t" end print "\n" else product = ary[1].to_i * ary[2].to_i total += product ary << product for i in 0..3 print ary[i], "\t" end print "\n" end end printf "Total:\t\t\t%d\n", total
Item Price No Apple 300 5 Orange 40 6 Kiwi 70 2
授業の進み具合によって課題を課すのでアナウンスに注意すること。
次のページに5.16および5.23の課題に関する解答例を示す。