******* 様 あなたは、 100万人の候補者のなかから、厳しい審査の結果会員制クラブ「東 京大学」の会員資格があると認定されました。つきましては、当社にお越しい ただいてクラブの内容、特典等について詳しく御説明差し上げたく存じますの で、4月1 日 15時に東京大学教養学部1号館 109 室にお越しいただけるようお 願いいたします。 クラブ「東京大学」 担当 蓮見送りたい人については、例えば名前と住所がわかっていて、先週の試験の点の例と同様なデータファイルがあるものとする。
1 牧野淳一郎 東京都目黒区駒場 XXX-XXX 2 白石 東京都目黒区駒場 XXX-XXX 3 山口 東京都目黒区駒場 XXX-XXXこの時、したいことは、
実際に、プログラムを書く場合でも、シェルスクリプトという 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 という行がでてきたら名前を書くとかいう具合にし
ている(そういう特別な行でなければ読んだものをそのまま書く)。このよう
にしておけば、手紙の内容を変更するのが簡単になる。
本当は、ネットワークがどんなもので、無理な使い方をするとどんなことが起 きるかというのは、自分でいろいろ経験して学んでいくのがいいのだが、現在 の ECC のシステムではそれをやった時に迷惑が掛かる範囲が広過ぎるので、 どうしても「あれもだめ、これもだめ」というようなことをいうことになって しまう。
悪意を持って行なうメイル爆弾などは、送られた人に迷 惑がかかるのはもちろんであるが、そうでない、単に沢山の人にメイルを送る というだけでも計算機システム全体に大きな負担が掛かり、トラブルの原因に なることがある。
計算機を使ったコミュニケーションの大きな特徴として、比較的手間を掛けず に大量の人に情報を送れるということがある。例えば1000人に 手紙を送るのには、例え手紙は印刷出来たにしてもかなりの手間と費用がかか るが、電子メイルであれば簡単なプログラムを実行するだけですみ、(東大のよう にほとんど無制限に送れるところならば)人はわずかな時間を使うだけであと は計算機がやってくれる。
このような、ネットワークの便利さは、すでにいろいろ悪用の対象になってい る。具体的には、まさに上のような、「大量に宣伝ダイレクトメールを送りつ けるための、メイルアドレスのリスト」というようなものがあちこちで販売さ れていたり、またそういうメイルを自動で送るプログラムも、ただのもの、あ るいは有料のものがあったりする。
ネットワークは非常に便利なものであるが、それだけに悪用にも便利なもので あるということは、考えておかないといけないことである(といっても、なか なかどうすればいいかわからないのだが)
また、どのようなことをやってはいけないかというのは、計算機の能力、容量 によって変わってくるので、例えば「xxx kバイト以上のファイルを送るのは いけない」とか簡単に規則を作ってしまうことができないのも難しいところで ある。
現行のここの計算機システムは、ファイル容量が全体で 100 G バイト(G は M のさらに1000倍で、 10億。従って、大体 1000億文字分くらい)、一人あた りのファイル容量の制限が 15 Mバイトとなっている。従って、例えば 1 Mバ イトのメイルを 1000人に送りつけるのは「極めて非常識」な行動ということ になる。一人に送るのでも結構問題かもしれない。が、ファイル容量に余裕が ある計算センターなら、1Mバイトくらいはたいしたことはない。
1000人に送りつけることのもうひとつの問題は、1000人から苦情のメイルがく るかもしれないということである。それも、 To: に 1000個アドレスを書き並 べて送ったりすると、それに下手に苦情の返事をだすとそれがまた 1000 人に、 またその苦情が 1000人にという具合、瞬間的に計算機システムがダウンする ほどのメイルが飛び交うことがある。こういうことを決してしてはいけないの はそういうわけである。 プログラムを書いて1通ずつ送ったばあいは、苦情は出した人にしかいかない からシステムの被害は小さい。
と、細かいことをいろいろ書いたが、結局のところ、「ネットワークを使って コミュニケーションしていく」というのはまだ新しく、技術的にも社会的にも 成熟したものではないということが混乱の元である。自分がやることがどう いう帰結をもちうるかということをちゃんと考えてから行動することが必要な のだと思う。
可能であれば、レポート自体を HTML 形式で書き、文書の中に図へのリンクを埋め込むのでも構わない。
なお、今回のレポートは、適当な時期に WWW 上で公開するかもしれないので、公開さ れても構わないような内容にすること。締切は、情報処理試験日の情報処理棟 閉館時刻とする。(なお、すでに部分的に閉まっているはずなので、注意)
なお、このレポートは、出さなくても試験の点が良ければ満点になりえる。試 験の点がある程度悪い場合にのみレポート点が入るような採点方式になる。