講義第13回:まとめ: 文書処理の例と計算機資源の利用について

今回は、最後ということもあるので、まず、計算機を使った文書処理(という よりは、文書生成)について例を考えた後、最近、マスメディア等で話題になるネッ トワークの不正利用や、計算機を使ったコミュニケーションにおける迷惑行為 等について、
  1. そういったものはどのようにして出来るのか
  2. なぜそういうことをしてはいけないのか
というようなことを少し考えてみようと思う。

ダイレクトメール

例えば、以下のような文面を、メールで沢山の人に送りたいとしよう:

******* 様

あなたは、 100万人の候補者のなかから、厳しい審査の結果会員制クラブ「東
京大学」の会員資格があると認定されました。つきましては、当社にお越しい
ただいてクラブの内容、特典等について詳しく御説明差し上げたく存じますの
で、4月1 日 15時に東京大学教養学部1号館 109 室にお越しいただけるようお
願いいたします。

クラブ「東京大学」
担当 蓮見

送りたい人については、例えば名前と住所がわかっていて、先週の試験の点の例と同様なデータファイルがあるものとする。
1
牧野淳一郎
東京都目黒区駒場 XXX-XXX
2
白石
東京都目黒区駒場 XXX-XXX
3
山口
東京都目黒区駒場 XXX-XXX
この時、したいことは、
  1. 個人名宛の手紙を印刷する
  2. 封筒の宛名を印刷する
というようなことであろう。こういった作業は、データベースソフトやワープ ロソフトを使っても実行できるが、ここでは、それをプログラムを書いてやっ てみることにする。

実際に、プログラムを書く場合でも、シェルスクリプトという UNIX のコマン ドを組み合わせて処理する機能や、あるいは perl のような簡易言語を使うと いう方法もあるが、ここでは考え方を示すということですべて PASCAL でやっ てみよう。なお、実用性という観点からはちょっと問題だが、いろいろ面倒な のでとりあえず「手紙を印刷する」というところだけにして、封筒の宛名のこ とは練習問題ということにしておく。

野蛮な方法

program directmail(input, output);
procedure   system(textstring: string); external;

type customer_record = record
      id   : integer;
      name : varying[30] of char;
      address : varying[60] of char;
     end;
var    infile			     : text;
       outfile			     : text;
   customer			     :  customer_record;
procedure read_customer(var customer : customer_record);
begin
    readln(infile,customer.id);
    readln(infile,customer.name);
    readln(infile,customer.address);
end;
procedure write_directmail_to_customer(customer : customer_record);
begin
   writeln(outfile,'\documentstyle[12pt]{jarticle}');
   writeln(outfile,'\begin{document}');
   writeln(outfile,'ID = ', customer.id);
   writeln(outfile);
   writeln(outfile, '\vskip 3 cm');
   writeln(outfile);
   writeln(outfile,customer.name, '様');
   writeln(outfile);
   writeln(outfile, '\vskip 3 cm');
   writeln(outfile);
   writeln(outfile,'あなたは、 100万人の候補者のなかから、厳しい審査の結果会員制クラブ「東');
   writeln(outfile,'京大学」の会員資格があると認定されました。つきましては、当社にお越しい');
   writeln(outfile,'ただいてクラブの内容、特典等について詳しく御説明差し上げたく存じますの');
   writeln(outfile,'で、4月1 日 15時に東京大学教養学部1号館 109 室にお越しいただけるようお');
   writeln(outfile,'願いいたします。');
   writeln(outfile,'');
   writeln(outfile,'\vskip 2 cm');
   writeln(outfile,'');
   writeln(outfile,'クラブ「東京大学」');
   writeln(outfile,'');
   writeln(outfile,'\vskip 2 cm'); 
   writeln(outfile,'');
   writeln(outfile,'担当 蓮見');
   writeln(outfile, '\end{document}');
end;

procedure write_customer(customer : customer_record);
begin
   writeln('ID = ', customer.id);
   writeln('NAME = ', customer.name);
   writeln('ADDRESS = ', customer.address);
end;

begin
    reset(infile, 'customer.dat');
    while not eof(infile) do begin
         read_customer(customer);
         write_customer(customer);
       rewrite(outfile,'tmpfile.tex');
       write_directmail_to_customer(customer);
       close(outfile);
       system('jlatex tmpfile');
       system('dvi2ps tmpfile.dvi > tmp.ps');
    end;
end.
これは一見大がかりなプログラムだが、やっていることはたいしたことはない。 要するに、プログラムの中で Latex のファイルをつくって、それを Latex で 処理して印刷もしてしまおうというわけである。ファイルを作るのはすでにやっ たが、jlatex のようなコマンドを実行するには、上にでやっているように
       system('jlatex tmpfile');
というふうに、 system という手続きを使えばいい。これを使うには、 PASCAL の普通の手続きと違って
procedure   system(textstring: string); external;
とあらかじめ宣言しておく必要がある。

なお、上のプログラムでは、jlatex を実行した結果は tmp.ps というファイ ルに書かれて、それはプリンタに送られたりしないので、最終的には最後の人 に対応する結果が残るだけである。これで、プリンタに出そうとするなら、

       system('dvi2ps tmpfile.dvi |lpr');
と変更すればよい。

このようなプログラムを使えば、たくさんの人に、それぞれ個別の名前の入っ た手紙を送るとかいうことができる。

もうちょっと賢い方法

procedure write_directmail_to_customer(customer : customer_record);
var line   : varying[120] of char;
   infile2 : text;
begin

   reset(infile2, 'template.tex');
   while not eof(infile2) do begin
      readln(infile2, line);
      if line = 'NAME' then begin
	 writeln(outfile, customer.name);
      end else if line = 'ID' then begin
	 writeln(outfile, customer.id);
      end else begin
	 writeln(outfile,line);
      end;
   end;
   close(infile2);
end;
上のプログラムで、手続き write_directmail_to_customer だけを上のように 変更してみる。ここでは、手紙の本文自体は template.tex というファイルに 書いてあり、そこで NAME という行がでてきたら名前を書くとかいう具合にし ている(そういう特別な行でなければ読んだものをそのまま書く)。このよう にしておけば、手紙の内容を変更するのが簡単になる。

大量のメイルを送ることと、その問題点

上では、Latex の文書を作るということを考えたが、同様な考え方で上のよう な文書を沢山の人に電子メイルで直接送りつけることができる。が、ここでは そのやり方を説明するのは控えておく。というのは、そのようなプログラムに は以下のような問題があるからである:
  1. プログラムの間違い等で、大量に間違いメールをばらまいてしまうこと がありえる
  2. 間違いでなくても、例えば 1000 人の人とか、教養学部生全員にメイルを 送りつけるというようなことをするのはそれほど難しくはないが、そういった ことを何人もの人がすると計算機ネットワーク、特にメイルサーバーになって いる計算機に大きな負担が掛かって、最悪の場合には止まってしまったり、ま メイルサーバーのディスクが溢れてしまったりする。
  3. いわゆる「メイル爆弾」のような、他人に大量のメイルを送る嫌がらせに も使えてしまう。
最初は、講義で説明しようかと思ったが、この講義ノートは公開であ り、場合によっては悪意を持つ人が見ているかもしれない。実際、検索エンジ ンとかで「メイル爆弾」で捜せば、このようなページはすぐに見つかってしま う。

本当は、ネットワークがどんなもので、無理な使い方をするとどんなことが起 きるかというのは、自分でいろいろ経験して学んでいくのがいいのだが、現在 の ECC のシステムではそれをやった時に迷惑が掛かる範囲が広過ぎるので、 どうしても「あれもだめ、これもだめ」というようなことをいうことになって しまう。

悪意を持って行なうメイル爆弾などは、送られた人に迷 惑がかかるのはもちろんであるが、そうでない、単に沢山の人にメイルを送る というだけでも計算機システム全体に大きな負担が掛かり、トラブルの原因に なることがある。

計算機を使ったコミュニケーションの大きな特徴として、比較的手間を掛けず に大量の人に情報を送れるということがある。例えば1000人に 手紙を送るのには、例え手紙は印刷出来たにしてもかなりの手間と費用がかか るが、電子メイルであれば簡単なプログラムを実行するだけですみ、(東大のよう にほとんど無制限に送れるところならば)人はわずかな時間を使うだけであと は計算機がやってくれる。

このような、ネットワークの便利さは、すでにいろいろ悪用の対象になってい る。具体的には、まさに上のような、「大量に宣伝ダイレクトメールを送りつ けるための、メイルアドレスのリスト」というようなものがあちこちで販売さ れていたり、またそういうメイルを自動で送るプログラムも、ただのもの、あ るいは有料のものがあったりする。

ネットワークは非常に便利なものであるが、それだけに悪用にも便利なもので あるということは、考えておかないといけないことである(といっても、なか なかどうすればいいかわからないのだが)

また、どのようなことをやってはいけないかというのは、計算機の能力、容量 によって変わってくるので、例えば「xxx kバイト以上のファイルを送るのは いけない」とか簡単に規則を作ってしまうことができないのも難しいところで ある。

現行のここの計算機システムは、ファイル容量が全体で 100 G バイト(G は M のさらに1000倍で、 10億。従って、大体 1000億文字分くらい)、一人あた りのファイル容量の制限が 15 Mバイトとなっている。従って、例えば 1 Mバ イトのメイルを 1000人に送りつけるのは「極めて非常識」な行動ということ になる。一人に送るのでも結構問題かもしれない。が、ファイル容量に余裕が ある計算センターなら、1Mバイトくらいはたいしたことはない。

1000人に送りつけることのもうひとつの問題は、1000人から苦情のメイルがく るかもしれないということである。それも、 To: に 1000個アドレスを書き並 べて送ったりすると、それに下手に苦情の返事をだすとそれがまた 1000 人に、 またその苦情が 1000人にという具合、瞬間的に計算機システムがダウンする ほどのメイルが飛び交うことがある。こういうことを決してしてはいけないの はそういうわけである。 プログラムを書いて1通ずつ送ったばあいは、苦情は出した人にしかいかない からシステムの被害は小さい。

と、細かいことをいろいろ書いたが、結局のところ、「ネットワークを使って コミュニケーションしていく」というのはまだ新しく、技術的にも社会的にも 成熟したものではないということが混乱の元である。自分がやることがどう いう帰結をもちうるかということをちゃんと考えてから行動することが必要な のだと思う。

追加レポート

これまでの「練習」の中から、2つ以上を選んで解き、 をまとめて提出すること。 なお、提出は、メイルで、いままでと同様に TA の加藤さんのアドレスに Subject を kadai-4 として提出すること。グラフィックスの出力結果を提出 する場合には、xvを使って gif ファイルにし、ファイル名(サブディレクト リに置いた場合はそのディレクトリ名もつけて)をレポート中に書くこと。

可能であれば、レポート自体を HTML 形式で書き、文書の中に図へのリンクを埋め込むのでも構わない。

なお、今回のレポートは、適当な時期に WWW 上で公開するかもしれないので、公開さ れても構わないような内容にすること。締切は、情報処理試験日の情報処理棟 閉館時刻とする。(なお、すでに部分的に閉まっているはずなので、注意)

なお、このレポートは、出さなくても試験の点が良ければ満点になりえる。試 験の点がある程度悪い場合にのみレポート点が入るような採点方式になる。