情報科学概論
2001.5.15



  1. 本日の作業内容


  2. 課題提出に関するアナウンス

    先週から課題の難易度が急激に高くなったが、基本的なことだけ押さえておくと必ずできあがるようなものなので、きちんとスクリプトを作成しよう。さて、5-1までの課題に関して、何度か提出してもそのたびに不合格のマークが付く場合がある。そのようなときは、自分で間違いが何処にあるのかなかなか見つけられないことが多いので、なるべく質問して確認すること。そのために提出した課題の控えは消さないこと。

    また、先週の課題に関しては、一見かなり良くできていても、動作させると問題があるものが結構見られた。ちょっとしたミスなどが原因だが、自分ではなかなか見つけられないものである。元号の切り替えの年を中心にきちんと実行が出来ていることを確認してから(再)提出すること。そのためには、年や月をいろいろと変更して実行しておく必要がある。

  3. スクリプト実行とターミナル

    この授業はRuby用のスクリプトを書いてそれを実行する、と言うことの繰り返しであるが、スクリプトの作成はエディタを使用して行い、スクリプトの実行はターミナルで行うのがそのやり方である。もし、まだよく分かっていない場合には、先日のコンピュータセミナーの自習用テキストの中にそれに関する部分があるので、目を通しておくこと。

  4. コマンドライン引数

    教科書p.22

    先週の課題において、変換させるべき西暦年と月はあらかじめスクリプトの中に書いておかなければならなかった。実際の動作では

    $ ruby task.rb 1912 8

    のように実行コマンドの引数として年月を与えることが出来るとスクリプトの検証が大幅に楽になる。実際に使えるようなスクリプトを書くためには重要なことであり、ここで扱う「コマンドライン引数」として与えるためのARGVという定数がそのために役に立つ。教科書のp.23に太字であるように、Rubyにおいてコマンドから操作する際、-が付くと起動オプションになり、-の付かない最初の引数がスクリプトの名前、それ以降はスクリプトへの引数、という約束があるので、それを取り出すためにARGVを使用する。また、shiftというメソッドとあわせることにより、引数が複数あっても対応できるようになっている。

    例にある教科書p.22のスクリプトは、引数の数があらかじめ決まっていなくても、あるだけ読み込んで無くなれば終わるという動作をさせるためにwhile構文を使用している。すなわち、読み込む引数が無くなると代入するべき値が無いため「無いこと」を意味するnilを返し、その結果whileの条件が偽となるのでそこでループが止まることになる。

  5. 出力関数print

    教科書p.23

    先週の課題のためにすでに予習していると思うが、putsというただ表示するだけの出力コマンドよりも便利に使えるのがprintである。複数の定数や変数、文字列を一行に順に出力するために使用される。しかし、行末に自分で改行文字を入れる必要もあるので、注意すること。(課題でも忘れている例があった。)逆に読み込んだ入力に余分な改行文字があるときにはあらかじめ削除する必要がある。そのためのchompとchopがある。

  6. ファイルからの入力: open

    教科書p.24

    先ほどはコマンドラインからの引数入力を紹介してあったが、ここではテキストファイルなどあらかじめ用意されているデータを入力として利用する方法を学習する。例えば、先週の課題で言うと、

    1868 10
    1910 5
    1912 8
    1920 7
    1926 10
    1926 12
    1945 8
    1989 1
    2001 5
    

    の様な内容のdata.txtというファイルをあらかじめ用意しておき

    $ ruby task.rb data.txt

    としてRubyを動作させると同じディレクトリのdata.txtを読み込んで変換結果を表示する、というような使い方が考えられる。openというメソッドで指定したファイルを開いて内容を読み、終わるとcloseする、という流れになる。

    さて、教科書ではここから同じ処理を行うのに複数のスクリプトを紹介することを行っている。There's more than one way to do it.という言葉通り、あることを実行するための方法は一つではない。初めは複雑な書き方を使わないで初歩的でなおかつきっちりしたものを作ればよい。慣れてくるとどんどん簡単に書けるのもRubyの長所である。

    教科書にあるのは、UNIXに標準で備わっているcatの代用スクリプトである。catは

    $ cat hoge.txt

    と言うようにコマンドライン引数で指定したファイルの内容を表示するコマンドである。p.24のスクリプトはコマンドライン引数を受け付けるためのARGVによりファイル名を取り込む。また、catは複数のファイル名を並べて指定するとそれらを連結して表示するので、例でもshiftメソッドにより複数のファイル名(引数)に対応するようになっている。その次にopenでファイルを開いたらその内容をfという名前の変数に格納し、getsで一行ずつ読み込んでlineという変数に代入し、それを出力する。出力するものがある限りwhileでループが回る。

    p.25の上側のスクリプトではdo ... endの構文が使用されている。do ... endの構文については、p.40やp.70以降の繰り返しのところでより詳しく紹介される。最後にp.26にARGFを用いた例が紹介されている。このように簡潔にスクリプトを書くために覚えておくことはたくさんあるが、今は、それよりも多少長くなっても構造のわかりやすいスクリプトを書いて勉強することから始めよう。

  7. 文字コード変換

    教科書p.27

    この節に書いてある内容は実際に動作させれば動くものであるが、それ以前に、文字コードについて最低限の知識が必要になるので少し解説する。文字コードに関しては厳密に書くと非常に込み入った内容になるのであくまで概説である。

    コンピュータは合衆国において主に発展してきたことは周知の事実であるが、英語文化圏においては使う文字はアルファベット、数字、いくつかの記号だけなので必要な文字数は少ない。実際に、タイプライターによる書類作成の伝統があったが、タイプライターに標準で備わっているキーは60以下である。それだけで基本的なことは表現できていた。そこで、8ビット( = 1バイト)で文字を表現する約束が1960年代に出来た。0か1かで表現する情報が1ビットであるので、8ビットであれば2の8乗すなわち256種類の文字が使用できることになる。実際にはその半分の7ビット(128文字)があらかじめ登録して使用できるようになっていた。

    コンピュータの発展とともに、東アジアの漢字文化圏を始め、文字種、文字数の多い国の言語にも対応する必要が生じたため、文字の表し方を工夫する必要があった。日本においてはパソコン上で日本語を表示する約束は1970年代に規格が定まり、その後順次改訂されてきたが、その中で複数の表示方法が提案され使用されることになった。基本的には1バイトでは表現できないため二つ組み合わせて2バイトで日本語に対応させようと言うもので原理的には約32,000文字が表現できる。しかし、いろいろな制約のため実際に使用できる文字数はそこまでは無い。

    一つの方式は、通信など7ビットの文字表現に対応するために7ビットしか利用しない形態で、JISコードと呼ばれる。現在でも電子メールの送受信にはこのJISコード(規格としてはiso-2022-jpと呼ぶコード体系で、電子メールのヘッダをよく見るとその手のものが書いてある。)が推奨されている。JISコードはESCシーケンスと呼ばれる制御文字による1バイトと2バイト表現の切り替えであり、通信途中でそのESC文字が欠落すると文字が化けたりする。

    二つ目にシフトJISコードと呼ばれるものがある。これはエスケープしなくても1バイトと2バイトの文字の混乱が無いようにするために、2バイト文字の1バイト目はどの文字とも重ならないようにしてあり、そのためにある約束に従ってコードを変換しているため「シフト」JISと言う。別名はMS漢字コードであり、マイクロソフトといくつかの会社が作成した方式である。ほとんどのパソコンで使用されている文字コードであるが、半角カナが一部の英語圏の記号と重なったコードになっているので、時として混乱が生じる。

    さらに拡張UNIXコード (Extended Unix Code, EUC) と呼ばれるものがあり、主としてUNIX環境で使用されてきた。シフトJIS同様1バイト目が他の1バイト文字と重ならないようになっており、しかも、半角カナの問題なども無い。現在教室で使用しているのもデフォルトではEUCである。lsでファイル名を表示するときに、パソコンで作成したシフトJISによる日本語のファイル名は表示できない。パソコンとのファイルのやり取りにはファイル名に日本語を使用しないのが無難である。

    最近の新しい潮流としてUTF系のコードがある。いわゆるユニコードと呼ばれるもので2-4バイトを使用して一文字を表現するため今までよりも格段に多い文字数が使用できる。しかし、東アジアの漢字を全て表現することは出来ないので、古文書などの古い自体や歴史的に近いけれども別の方に発展した漢字などは全てを表現することは出来ない。現在、活発な議論が行われている。

  8. 改行問題

    教科書p.28

    この節の内容も実際にパソコン同士でファイルをやり取りする際や、ネットワーク越しにデータを送受信する際に生じる改行コードについて説明してある。教室の環境だけではなかなか再現できないが、自分でパソコンなどを持っている場合には良く覚えておくこと。ここでは蛇足的な説明を少し。

    教科書にあるように改行文字はUNIXがLF、MacintoshがCR、DOSがCR+LFと言うようになっている。ところで、ここで出てきたLF (Line Feed) やCR (Carriage Return) とは何のことであろうか。タイプライターがキーボードの原型であることは良く知っていると思うが、原始的なタイプライターの動作に関して知っている人は最近は少ない。英文タイプライタはドラムに紙を巻き付けるように挟み込み、キー入力により文字の型を有する金属がインクリボンをたたいて紙にインクを転写するものである。文字を入力するとドラムは順に左側に移動するようになっており、あらかじめ設定した端の位置まで来ると、人間が手でドラムを右に戻していた。その戻す作業がCarriage Return であり、戻すとまた自動的にあらかじめ設定した量だけドラムが向こう向きに回転し新しい入力行に移動していた。その移動がLine Feedである。ということで、DOSの方式はタイプライターの改行そのものをエミュレートしていることになる。

  9. 本日の実習

    作業1
    教科書にあるスクリプトを適宜改良しながら実行してみること。特に、ARGVやARGFの使用を試みること。

    作業2
    先週の課題のスクリプトに関して、本日の内容を取り込んでコマンドライン引数やテキストデータを入力にするための改良について検討せよ。

  10. 宿題

    授業の終わり頃に次回までに提出する課題を発表するのでアナウンスに注意すること。また、発表されたら課題を表示するためには、一度このページを再読み込みする必要があるのでNetscapeのボタンをクリックする。そうしないと、課題のページは表示されない。


目次ページに戻る