情報科学概論
2000.6.20


  1. 本日の作業内容

  2. 方針変更について

    授業も残りがわずかとなってきた。教科書にある内容を順次説明してきたが、2章はRubyでできることの一覧的な位置づけで網羅的にすべての機能について説明されていたため、肝心な「Rubyで何ができるか」という視点を見失いがちであった。そこで、今回からは教科書の説明よりも実用になるスクリプトの例を見ながら、Rubyの使い方のようなものを扱うことに方針を変更した。

    4月から長い期間Rubyの各機能を学習してきたので、実際には必要な知識やメソッド、機能は一通りは目を通しているし、また、必要であれば教科書を調べると何とかなるレベルにいるはずである。(実際には、なかなかそうはいかないが。)このまま、今まで通りの授業を進めていくと、結局何がおもしろくてRubyをやるのか、今後自分でRubyを勉強して何ができるのか、その辺が曖昧なまま終わってしまうことになり、せっかくの半年間の授業が活かされない。そのための緊急措置的な方針変更であるので、ご容赦願いたい。

    なお、実際に役に立つRubyのスクリプトの例は最近のプログラミングやUNIX系の雑誌に多くの連載記事があり、多数紹介され始めている。初心者用の教科書がないため、勉強意欲がなかなか上がらない場合や自分でもう少し学習したい場合にはそちらを参考にすることをおすすめする。また、最近の雑誌における扱いを見ると、Rubyがもはやかなり普及した言語であることも認識できると思うので、一度書店で見てみると良いかもしれない。Rubyを取り上げている雑誌は、

    http://www.ruby-lang.org/ja/press.html

    で参照できる。また、上記ページによると入門書の企画もあるそうなので、興味を持った人もあと少し待てば何とかなるかもしれない。


  3. 入出力

    ここで扱うのはスクリプトとファイルとのやり取りであり、実は、今までの授業や課題でgetsを頻繁に使ってきているので、すでにかなりの部分は扱っている。IOクラスでは、ファイルの引数としてファイル名を指定して、gets()で読み込む以外に、openを使ってあらかじめ指定したファイルを自動で読み込むことも可能であり、この節ではそれに関する説明がなされている。すでに学習した内容がほとんどであるので細かい説明をしなくても例を見るとわかるはずであるが、教科書には一部間違いがあるのでその修正をしておく。

    p.87 2行目のIO#getlineIO#readlineの間違い

    p.87 4行目のreadlinereadlinesの間違い

    p.87 17行目もgetlineとreadlineの誤植がある


    2.15.2に説明されているソケットに関しては、ネットワークの知識が必要なのでここでの説明は省略しておくが、Rubyを用いてCGIスクリプトを作成する場合には必要となる知識である。今後、自分でCGIスクリプトを作成する場合には参考にすると良い。一般的にはPerlでスクリプトが書かれることが多いが、Rubyが理解できれば少ない行数でより簡潔に書くことができる(はず^^;)ので将来的に役に立つかもしれない。


  4. 今日の例題

    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

    ここでは、まず、自分のホームディレクトリにあるscriptディレクトリで作業することを想定し、ファイル名はスクリプト本体をspread.rb、読み込むテキストファイルをspread.txtとしている。今日の授業の範囲である入出力に関して、openメソッドとgetsを利用している。また、次の節で詳しく紹介される配列に関しても今まで使用した知識の範囲内で理解できる程度のものである。(配列は実験データの入出力、整理など計測にコンピュータを利用する際には必須の概念なのでどの言語を使うにしても重要なポイントである。これについては次週で扱う予定。)ここで使用するテキストファイルは、例えば以下のような形式で無ければならない。

    Item	Price	No
    Apple	300	5
    Orange	40	6
    Kiwi	70	2
    

    1行目は品目、単価、個数の見出しを表し、2行目以降が実際のデータとなっている。また、各列の間は一個のTabによりそろえる必要がある。試しに何かデータを実行して結果を確かめてみること。また、教科書ではp.117に紹介されているsplitメソッドの「デリミタ」(区切り記号)を変更したり、表示方法を変えてみたりという作業を行うことにより理解が深まるはずであるので挑戦してみること。スクリプトの内容自体は今までに学習した内容でほぼカバーできるので自分で考えてみよう。


  5. 課題

    授業の進み具合によって課題を課すのでアナウンスに注意すること。


  6. 解答例

    次のページに5.16および5.23の課題に関する解答例を示す。


ページの先頭に戻る

目次ページに戻る