「IT見聞録」

第六話「7つの橋を渡れ 」

「数学ができない日本人は、カレー屋になったほうが良い」と言われて、途方に暮れて、とぼとぼと、足取り重く本屋へ向かった。まさか、今から受験参考書というわけにも行かないので、自然科学の棚で数学の本を探した。代数学、幾何学、解析学あたりは名前を知っていたが、トポロジー(注1)というものがあるらしいことがわかった。
 そこで、今日習っていたことに関連する本を見つけ、パラパラとめくっているとそこには、地図のようなものに「ケーニヒスベルクの7つの橋」問題と書いてあった。
 18世紀初頭にオイラー(Euler)という天才数学者がいた。オイラーの時代、ロシアのケーニヒスベルグ(Konigsberg)という町を流れるプレーゲル川には、中央に島があって、その島と川の両岸との間には図1のように7つの橋がかかっていたという。昔から、その町に住む人々が議論していた問題は、「7つの橋すべてを、1つの橋を複数回渡ることなくすべて渡り終えるような橋の渡り方を見つけられるのか?」であった。

図1.図1. 図2.図2.

 オイラーは「そのような渡り方は不可能」と、答えを導き出した。(後に「オイラーの一筆書きの定理」と呼ばれるようになった。)一体、オイラーは、どうやって、この問題を解いたのだろうか? ここで、グラフ理論が登場する。グラフ理論とは、簡単に言えば、幾つかの点と、それを結ぶ幾つかの辺からなる図形を『グラフ(graph)』と定義し、その構造の性質を研究する数学のことである。同じ数学といっても、学校で習っていた微分積分・代数学とはかなり様子が異なるが、どちらかといえば、論理学に近い感じである。オイラーは、その問題の解答に到達するために図2のように陸地を頂点(vertices)、橋を辺(edge)とするグラフで問題を表現し、証明したと言われている。
 この「問題の構造を表現し理解するために」数学を使うという事実に、ショックを受けた。そんなふうに、数学を使うなんて、いままで知らなかった。それは、まるで日常生活の中で、何か相手に伝えようとして言葉で表現しているかのように必要があれば分かりやすく絵を書いて説明するかのように使われていた。ここでは、数学は言葉や絵と同様にコミュニケーションの道具の一つなのだった。
 その後、グラフ理論は、数学でありながら、ネットワークや集積回路などのコンピュータに関係がある分野に数多く使用されていることもわかった。しかし、なにしろ数学だけに、理解さえできれば便利かもしれないが、「分かる人には分かるが、分からない人には、さっぱりわからん!」というのも、まぎれもない事実だ。「7つの橋は一筆書きで渡れない」ように、こちら(数学)も、どうやら一筋縄ではいかないようである。

(注1)トポロジー(topology)
任意の空間と、その空間内の要素の位置や場所に関して定義される論理のこと。
ここでいう論理には、各要素の上下関係、前後関係、集合論的関係、時間的順序などがある。

参考文献:Lafore, Robert【著】・岩谷 宏【訳】「Javaで学ぶアルゴリズムとデータ構造」ソフトバンク (1999-01-14出版)

(2002年8月)

▲戻る

第五話「数学か?さもなくばカレー屋か?」

 子供の頃、受験勉強のために数学の問題を解きながら、ふと思ったことがある。
「こんなこと勉強して、将来なんの役に立つのだろうか?」と。
 数学が大嫌いという訳ではなかったが、(たしか物理は苦手だったけど)何のために、こんな問題を解くのか意味が分からなかったのである。普通に生活するのに、三角関数や微積分が絶対に必要とは思えなかった。受験戦争を勝ち抜いて、少しでも偏差値の高い学校に入って、一流といわれる優良企業に就職すれば、人生はバラ色に輝く、、とも、思えなかった。やがて、気がつけば、大学は数学とは無縁の学科に進んでいた。
 あれから何年かの月日が流れて、もちろん日常生活で数学を使うことも無く、平穏無事に暮らしていた私の身の上に、ある日突然、数学との劇的再会の時がやってきた。大学院生活も早くも2週間目を迎え、1週目のオリエンテーション的なものとは異なり講義内容が、(あたりまえのことであるが)断りもなしに急激に難しくなっていた。
 月曜日Discrete Systems(離散数学)、火曜日Image Processing & Recognition(画像処理・認識)、木曜日Algorithms and data structures(アルゴリズムとデータ構造)は、基本の理論は数学で構成され、演習で出される課題は、数学を解く問題が多かった。そのうち、夜中の2時過ぎまで、数学を解かなくてはいけないありさまとなった。といっても、数学の内容自体は、おそらく高校生レベルで十分理解できるはずなのだが、深い眠りについていたであろう過去の記憶は、そう簡単によみがえらない。 sin(サイン)・cos(コサイン)、log(ログ)、スカラー、マトリックス、√(ルート)みんな懐かしい名前だけど、どう使うんだったか、さっぱり覚えていないのである。
 大学で数学科だったという、わずかな人を除き、周囲の人も同様に苦しんでいた。高校生の数学の教科書をどこからか探してきて、問題を解き始めた人もいた。その一方で「私は高校2年から数学をやっていない文系だから、今更無理だわ」と早々に諦めた人もいた。ともかく苦しかった。天災と数学は、忘れた頃にやってくる。
 さらに追い討ちをかけるかのように、数学ができないのであればコンピュータ産業に従事するのは無理だから、いまから修行してカレー屋になった方が良いのでは?と勧める人が現れた。それは、インド人は「掛け算九九」を100の位まで暗記しているのは本当かという、講義の中での話題だった。100の位までの掛け算の暗記が本当に必要かどうかは別にして、シリコンバレーで成功しているのは中国系かインド系が多いこと、インドのソフトウエア産業が私たちの想像以上に発展していることをみれば、複雑な計算は数学が得意なインド人に任せて、数学が苦手な日本人は日本のソフトウエア会社で働く。インド人のためにカレー屋を開業した方が確実に儲かるのではないかと言うのだ。「確かに、それは一理ある。」と不覚にもうなずいた。(カレー屋になるのも、結構大変だと思うが、、、)ここ(大学院)まで来たのは、なにもカレー屋になるためではない。
 プラトンが創設したアカデメイアの扉には、「数学の知識なきもの入るべからず」という文字が刻まれていたという。実は、この教室の扉にも、目には見えない文字で、そう書かれていたのかもしれない。その後、私は「数学を勉強して、なんの役に立つのだろうか?」という積年の疑問を解き明かすヒントを、ついに発見することになる。

(2002年8月)

▲戻る

第四話「道はつながっている」

「PATHが通っていません。」とコンピュータに拒絶されて、途方に暮れる私は、PC演習室のある地下から3Fの教室に異動するためにエレベータに乗り込んだ。
「なんか最初からハードで疲れますねー」と通路をはさんで一つ後ろの席に座っているケイちゃんがエレベータの中で話し掛けてきた。エレベータの中は、私たち以外に2人の人が乗っていた。「PATHが通っていませんって、さっきからコンピュータに言われているんだけど、パスって何だか知っている?」と私が尋ねると、プログラミング初心者のケイちゃんは、「何でしょう?よくわからないことだらけですよね」と答えた。
 そんな私たちの会話を狭いエレベータの中で聞いていた、海外でプラント建設をしていたというエンジニアのK氏の顔に、ほんの一瞬、(かわいそうに。この人たちは、こんなことも知らないのか)と呆れた表情が浮んだ。
(ハー。あんな顔されてしまったよ。できない自分にホトホト呆れて愛想が尽きているのは私自身なのに)と思うと、情けなくて悲しかった。しかし、落ち込むのは、まだまだ早い。なんせ、入学してからまだ1週間しか経っていないのだから。
 パス(PATH)とは、英語で「道」を意味し、この場合は、作成したソースプログラムをCPUなど機械が理解できる形式のプログラムに変換するコンパイラ=「Javacのプログラム」が入ったファイルやフォルダへ通ずる道筋のことをいう。
 MS-DOSプロンプトの画面で「javac+ソースファイル名」を入力する前に、まずJavacのプログラムファイルが、どのドライブの、どのディレクトリにあるかを教えてあげないといけないのだ。
 私のPCの場合、javacのプログラムはCドライブの¥jdk1.3¥binにコピーされているので、コマンドプロンプトで「cd c:¥jdk1.3¥bin\javac」と入力することになる。(cdとは、Change Directoryのことで、「ディレクトリを移動しなさい」と言う意味であり、MS-DOSではフォルダのことをディレクトリと呼んでいる。)ここでようやく「javac+ソースファイル名」を入力すると無事コンパイルが実行される。
 しかし、コンパイルするたびに毎回毎回、Javacのプログラムファイルがどこにあるかを教える作業は面倒である。この手間を省くために、市販されている本では「パスを通す」と呼ばれる設定作業が最初の方で紹介されている。
 当時使用していたマシンのOSは、Windows2000であったので、Windows2000を例にとって説明する。(Windowsのバージョンによってパスの通し方が異なっているので注意!)
 コントロールパネル->システム->「詳細」のタブをクイックして「環境変数」のボタンを押す->「システム環境変数」の中にある「PATH」を選択して編集をクイック->「変数値」の最後に「;c:¥jdk1.3¥bin」と追加してOKボタンを押す。
 といった一連の作業が必要であることを、その日の帰り道に立ち寄った本屋ではじめて知った。なーんだ。分かってしまえば簡単だ。あらゆることは、いったん分かってしまえば、今まで悩んだのがウソみたいに思えてくるほど単純だ。しかし、そこに辿り着くまでの道のりの、なんと苦しいことか。
 新しい環境で、新しい技術を身に付けるために毎日奮闘しているといえば聞こえはいいかもしれない。でも、実際の自分は情けないほど何にもできない。そんな無力な自分と向き合って、ひたすら孤独な戦いを続けなければならない。
 その翌日、本で読んだとおりに「パスを通す」設定をして、エラーメッセージが消えたときの感動は言葉にできないものであった。たかが「PATHが通った」くらいで喜んでは、人に笑われるかもしれない。しかし、わずかではあるが、昨日よりも今日は前進した。なぜなら、道を意味するパス(PATH)が、今はつながっているのだから。

(2002年8月)

▲戻る

第三話「Java使いへの道 」

 「Java」というプログラミング言語について、前回少し触れたが、私の大学院生活1週目のある日の授業で「この擬似コードをJavaで実装してくるように。」と当然のように言われた。まずもって、その言葉の意味が理解できなかった。「実装?」「擬似コード?」「Javaってどうやるの?」同時に数多くの???(ハテナ)が、頭の中を駆け巡った。この言葉を合図に悪戦苦闘の長い戦いが始まったのある。
 プログラミングの経験がある方ならば、ご存知だろう。プログラミングとは、パソコンでワープロ(文字が打てる程度)が使えるくらいの人がすぐ分かるような内容である。。。はずもなく、気が遠くなるほどの時間と努力が必要である。ただし、プログラミングが好きな人には、たまらなく面白いものであるらしい。残念ながら私には未だに理解しがたい境地であるが、当時の私は、やるからには目標は高く掲げ、「目指せ。Java使い!」と思ったのである。
 プログラミング言語には、マシン語 (Machine language)と高級言語がある。マシン語は人間には理解しにくく、コンピュータが理解できる形式で書かれているが、高級言語はその逆で人間には理解しやすい形式であるために、コンピュータに高級言語を理解させるためには、高級言語からマシン語に翻訳するコンパイラ(complier)というソフトウェアが別に必要となる。
 FORTRAN、COBOL、Pascal、C、C++、Javaなどが高級言語の代表と言えるが、これらの高級言語の中でもJavaは特別な言語であるという。
 Javaには、どんな環境(WindowsやMac OS、Unix)でも実行できWebブラウザのなかにアプリケーションを組み込めるといった特徴があり、インターネットの普及に伴いネットワーク対応言語としてあっという間に広まった。
 パソコンだけではなくPDAや携帯電話の中にも組み込まれている。
 Java プログラムは、大きく二つの種類に分けることができる。一つは、Javaアプレットであり、もう一つはJavaアプリケーションである。 ここでは、Javaアプレットについて、少し説明をする。
 Javaアプレットとは、 WWWブラウザーによって呼び出されて、実行できるプログラムである。
 Javaアプレットのプログラムの作成手順は JDKというソフトウエアをまずマシンにインストールし、テキストに書いたプログラムをコンパイルしてソースファイルを作成し、用意したHTMLファイルを使って実行すれば良い。詳しくは、次のとおりである。

1)Javaソースプログラムの作成する。テキストファイルを利用して内容を記述し、拡張子を「.java」に変える。
 (Editorを利用すると便利である。Editorソフトとしてはメモ帳や秀丸エディタなどが有名である。)

2)「MS-DOSプロンプト」を使用して、作成したソースプログラムはCPUなど機械が理解できる形式のプログラムに変換する。MS-DOSプロンプトの画面でファイルのある場所にディレクトリを指定して「javac+ソースファイル名」を入力する。「.class」というファイルが生成されていれば、コンパイル成功である。

3)HTML ファイルを作成し、名前を付けて保存する。
 HTMLファイルは、<> でくくった記述:タグと呼ばれるもので構成されている。
 例えば、こんな感じである。
  1: <html>
  2: <applet code=''ファイル名.class'' width=275 height=250>
  3: </applet>
  4: </html>

4)作成したHTMLファイルをダブルクイックしてアプレットを実行する。

 以上のようなステップを踏むと、Javaアプレットが無事に動いてくれる。。。と思ったら大間違いなのである。人生はそんなに甘くないように、上記の2)のMS-DOSプロンプトのところでエラーメッセージが表示される。「PATHが通っていません。」と、拒絶される。サッカーじゃあるまいし、「パスって一体なに?」と途方に暮れる私であった。

(2002年7月)

▲戻る

第二話「この世界の地図を手に入れよう〜コンピュータ・サイエンスのコア科目とは何か〜 」

 大学院生活の第1週目にして、プログラミングの習得という高い壁に行く手を阻まれて、お先真っ暗になった私であった。プログラミング言語のルールに従った命令文をエディタというソフトを使用してタイプして、コンパイルしてエラーがなければ実行できるという手順が分かった(第1話参照)。しかし、“分かること”と“できること”の間にはかなりの差がある。たとえば、たった1つ間違ってスペースを入れたり、“;”と“:”を間違えたりしただけでエラーメッセージが出る。(考えてみれば当たり前だけど)コンピュータは正確に入力しないと、こちらの思い通りに動いてはくれないシロモノである。
 この「プログラムに含まれる間違えを“バグ”(Bug=虫)というのだよ。この虫がねー。邪魔なんだよね」と後ろの席の人が教えてくれた。すると、「一人でバグ取りのために残業していると、なかなか取れなくて、ついドナドナドーナとか暗く歌っちゃうんだよねー。」と前の席の人も振り向いて話しかけてくれる。やがてドナドナな気持ちを私も実感する。何度やってもエラーメッセージばかり繰り返されて、どうして動いてくれないの?と泣きたくなるとドナドナドーナと頭の中で“例の歌”が響き渡る。
 初心者の私は、まずはC言語(注1)の基礎を習得するために、お手本のソースプログラムをタイプして、「Ctrl-x, Ctrl-sで名前を付けて保存して、“%gcc ファイル名.c”でコンパイル、エラーがでなけりゃ、“%. /a .out ”」とのんきに歌いながら、ただひたすら、毎日毎日、単純作業を繰り返した。テキストの基本的なところをタイプして、エラーが消えるまでバグを取り続けた。不思議なもので、あたりまえに動くだけでほんとに嬉しかったし、徐々にタイプミスも減り、バグを発見するのも早くなっていった。やがて、単にタイプしていただけから少し成長して、コマンドの意味がわかるようになり始めた。ここまで来るのもずいぶん時間がかかったが、C言語の次はJava(注2)が待っている。 喜びに浸っている暇はない。でも、かすかに、不安が消えて、費やした時間の分だけ自信がうまれた。

図

 依然として、周りの人々(クラスメイトや講師の先生)が何の話をしているのか話が見えなくて、そのことが何よりつらかった。こちらは自慢じゃないが“超”が付くほど初心者なのである。ペースが遅いのは、しかたがないと自分に言い聞かせた。“学問に王道はなし”と昔の人もそう言っているじゃないか。(そうだ!そうだ!)地道に行こうと心に誓う。
 そうは言っても、あまりに進み具合が遅いので、「なんとか、ならないものかなー」と考えていた。ふと、「そうだ、この世界の地図がほしいな」とひらめいた。あるとき、教授に“この世界の地図はどうしたら手に入れることができますか?”と質問をした。教授曰く、の基本フレームワークの知識は次の科目を習得することで培われると言う。

[コンピュータ・サイエンスのコア科目10科目]
  1. データ構造とアルゴリズム
  2. コンピュータ・アーキテクチャ
  3. オブジェクトオリエンテッド・プログラミング
  4. クライアント・サーバー・データベースシステム
  5. オペレーティングシステム(UNIX,Linuxを含む)
  6. ソフトウェア工学
  7. ビジュアルコンピューティング(コンピュータグラフィックス、パターン認識、可視化技術を含む)
  8. コンピュータネットワーク(サーバー構成技術、ネットワークセキュリティ技術を含む)
  9. コンパイラー(コンパラージェネレータを含む)
  10. 数値解析(NUEBS等の曲面近似関数を含む)、プロセス中心の企業管理技術(情報駆動企業管理技術、リストラクチャリング技術を含む)、代数的位相幾何学などの近代学

 この10科目をすべて修得するのはかなり時間がかかりそうである。(こんなたくさんできるのかな?と思うでしょ。私も“そりゃ、全部は無理でしょ”と正直思いましたよ。)この世界の地図を手に入れよう」と目標を設定したのは良いが、どこから手をつければ良いのか、質問したら、ますます分からなくなってしまったのである。
 何しろ、その頃の私といえば、“アルゴリズム(注3)って、どんな音楽?”というレベルだったのである。物心ついたときからアルゴリズムを知っていたという人もいるというのに(そういう人もかなり珍しいと思うが、私の席の近くに座っていた)である。その後に、アルゴリズムで毎週、毎週、想像を越えた苦しい思いをすることになるとは、このときは想像もつかなかったのである。

(注1)C言語
 1970年代にアメリカのベル研究所(現在のAT&T)でKernighanとRitchieによって開発された、OSであるUNIXを記述するために開発されたプログラミング言語。簡潔な表現で柔軟なプログラムが作成できるため、事務処理システムからOSに至るまで幅広くシステム開発に利用できるほどの汎用性を持っている。

(注2)Java
1995年にアメリカのサン・マイクロシステムズが発表したプログラミング言語。「ジャバ」と読む。どんな環境(WindowsやMacOS)でも実行でき、Webブラウザのなかにアプリケーションを組み込めるといった特徴があり、インターネットの普及に伴いネットワーク対応言語として広まった。

(注3)アルゴリズム
リズムといっても、もちろん音楽とは関係ない。アルゴリズム(algorithm)とは、算法と翻訳される。ある問題を解くための手順のことである。
詳しくは第3話以降で説明予定。

(2001年12月)

▲戻る

第一話「Hello World〜そこからすべてが始まった〜 」

 ある日、突然コンピュータ・サイエンスを大学院で勉強することになった。
 それまでの私は、仕事でワープロと表計算ソフトを使用し、自宅でメールとインターネットを利用するといった、簡単に言えば、どこにでもいるような一ユーザーだった。そんな自分が、奇跡的に大学院の入学試験に合格し、工学研究科の大学院に入学する?という本人も予想しえなかった展開が、ある日突然嵐のように始まった。
 自分以外の人がとても優秀に見え、どうしてこんなところに来てしまったのかという気持ちを抱いたまま、入学ガイダンスに臨んだ。運営担当責任者のK教授のスピーチと講師の先生方の挨拶があり、事務室の方から施設利用の説明が終わった時点で、学生の一人から質問が出た。「寝袋を持ち込んで、徹夜で研究しても当然いいですよね?」という問いかけに、(ひょえー。すごいことになってきた)と内心私は驚いた。そういうのが、この世界の常識なのかーと自分の認識の甘さを悟った。帰り道、桜が咲き誇る、お堀端の道を歩きながら、すっかり場違いな場所に来てしまった現実(実は文系出身者の私)に、気分はすっかりグレーになった。
 一番の不安の種は、プログラミングがすぐに修得できるのだろうかということだった。自慢ではないが、生まれてこの方、一度もプログラムなど組んだことはない。入試の面接でも、試験官の方から「プログラム経験ゼロだとかなり厳しいと思うよ」とアドバイスされていたので、(だのに何故?合格したのだろう。謎である)ある程度は予想していた。
 予想通りに?壁はすぐに出現した。しかも、その壁は恐ろしく高かった。画像処理の授業の初日、「では、先ほど説明したとおり、SUN(UNIX) を立ち上げて、emacsで次のコマンドを打ち込んで、%gccファイル名.cでコンパイルして、画像を動かしてみてください」と突然言われたのである。一体何が起こったのか、さっぱり理解できなくて、すでにグレーだった気分はもはや第1週目にして、お先真っ暗になった。
 これは、C言語をマスターしている人にとっては、ごく簡単な課題であることが後で判明したのであるが、そのときの私には“使用言語が異なるために話しが見えていない外国人”であった。日常会話すら成り立たない状況は、さながら異国の地にたった 1人で放り出された人の感覚に似ていた。でも、そこからすべては始まったのである。


#include <stdio.h>
main ( ) {
printf ( "Hello World \n");
}


 上記は、その日後の夜に行なわれたC言語プログラミング補講において、一番最初に習ったプログラムである。教えに来てくれた院生のOさんは、初心者の私にわかるように丁寧に教えてくれた。最初は深く考えずに、おまじないだと思って#include<stdio.h>と入力してくださいと言われて、そういうものかと思った。自転車の乗り方とか泳ぐようになることと同じで、身体に覚えさせるものなのかもしれない。(これはかなり個人的見解)

<プログラムを実行するための手順>
 @ UNIX(注1)でツール->端末エミュレータを選択し、emacsを立ち上げる。(%emacs&と打ち込む)
 A このエディタ(注2)を利用してソースプログラム(注3)を入力する。
 B emacsでCtrl-x, Ctrl-sで適当な名前を付けて(例えば、ex1.c)保存する。
 C % gcc ex1.c と打ち込み、コンパイル(注4)を実行するためにリターンキーを打つ。
 D エラーメッセージが特になければ、% ./a.out と打ち込み、実行させる。 この結果、以下のようになればOK。


%gcc ex1 .c
% ./a.out.
Hello World
%

 “Hello World”と表示させるプログラムは、今から20年以上前に出版された本“The C programming language ”の著者Brian W. Kernighan, Dennis M. Ritchieによれば「最初に書くべきプログラムはどのような言語でも同じである」そうである。そういわれてみれば、C言語でも、その後に学習したJavaでも、やっぱり最初は “Hello Worldだった。
 かくして、“Hello World”の洗礼を受けて、私はコンピュータ・サイエンスの入り口の扉を無理矢理に押し開けたのである。こんにちは、新しい世界!といったところだろうか。

(注1)UNIX
オペレーティングシステムのひとつで、おもにワークステーション用に大学や研究機関などで利用されている。大勢のユーザーが同時に利用可能で(=マルチユーザー)、複数のプログラムを同時に動作させることができ(=マルチタスク)、セキュリティやネットワークに強いと言った特徴を持つ。

(注2)エディタ
Windowsの付属標準ソフト「メモ帳」やシェアウェアの「秀丸」などがある。エディタ(editor)とは、プログラムやデータをコンピュータの補助記憶装置(ハードディスクやフロッピーディスクなど)二格納し、編集・修正するためのプログラム。UNIXではviエディタが有名。

(注3)ソースプログラム
プログラムの源(ソース)で、各プログラミングの言語のルールに則って書かれた命令文という。単にソースと呼ぶこともある。

(注4)コンパイル
ソースプログラムをコンピュータに理解できる機械語に翻訳する作業のことをいう。翻訳するのに使用するソフトをコンパイラと呼ぶ。

“The C progtamming language” / Brian W. Kernighan, Dennis M. Ritchie 2nd ed Enblewood Cliffs, N.j. ; Tokyo : Prentice Hall , 1988

(2001年12月)

▲戻る