1999 年度「計算機基礎論3B」 1999-11-12

きょうは最初にいろいろ“おはなし”があります。

クラッキング行為は厳禁です

クラッキングとは、 自分に権利のないコンピュータのデータを不正に読み書きすること、 といっていいと思います。 よく新聞などで「ハッカーが侵入」と書いているのがこれですが、 「ハッカー」は元々はコンピュータにくわしい人に対する尊称です。

※ 新聞の見出しは 「**のコンピュータにハッカー侵入」と書かなくても 「**のコンピュータに侵入者」で十分意味がわかると思うのだが……。

これには、 「ひろった紙に書いてあったログイン名とパスワードでログインしてみた」 ようなケースと 「コンピュータのセキュリティーホールをついて侵入」 のようなケースがあると思います。 「セキュリティーホール」とは、 設計上のミスなどでできてしまった管理上の「穴」のことです。

どちらにせよ、このような行為は厳禁です。 コンピュータは使用者の記録をとっています。 実習用 WS で一番簡単なのは「last | more」で見られる、 過去にその WS を使った人の一覧ですが、 そのほかの記録も残っています。 それらからクラッキングをしかけた本人が特定できた場合、 法律で罰せられることもありますから各自で注意してください。

パスワードの変更について

パスワードはときどき変更したほうがいいと言われています。 これは実習用アカウントだから変更しなくてもいいですけど。

最初に配ったままのパスワードは、私が一覧をもっています。 「忘れてしまった」とかの場合には(しかたないから)お教えしています。

※ あんまりそんなことが続くと 「一回聞くごとに出席点から減点」 とかするかも知れない。

緊急事態ででもない限り、 そのパスワードを使ってみなさんのアカウントにログインすることはしません。 した場合は必ず事後に連絡します。

自分でパスワードを変更すれば、 私は変更後のパスワードを知りえないので、 もしパスワードを忘れたら実習ができなくなります。 センターの人にお願いして新しいパスワードを設定してもらう、 あるいは最初のパスワードに戻してもらう、 ということになるでしょう。

※ その場合は自分でセンターの人にお願いしてね。 ついていってあげてもいいけど。

そのあたりのこともありますから、 パスワードを変更するかどうか、 自分でよく考えてください。 でも、特にそそっかしい人以外には、 どちらかといえば変更しておくことをすすめます。

この実習室のマシンは、 一台でパスワードを変更すれば全部のマシンのパスワードが変更されます。 また、一度変えていやなら何度でも変えられます。 ただし、続けて変えられるかどうかはよくわかりません。 変更直後にログアウトしてまたログインしようとすると、 前のパスワードでなければログインできないこともありますから、 前のも忘れてしまわないように。 30分もすれば新しいパスワードになるようです。

変更のコマンドを実行する前に新しいパスワードを考えておきましょう。 よいパスワードの条件は

普通はこれにさらに という条件がつきます。 メモをとったりするとパスワードがもれる心配があるので頭に入れておけるものを、 というわけです。 しかし、 それは「これが何のパスワードか」に依存すると私は考えます。 国家機密ならそのようなことも当然でしょう。 しかし、これは実習用アカウントなので、 どこかにそっとパスワードをメモしておいてもいいと思います。 私の経験では、 全くランダムにキーボードから選んでパスワードを作り、 ひとにはわからないようにどこかに書いておくのがよいと思います。 数回打っているうちには覚えてしまいますので、 メモは見る必要はなくなります。

変更のやり方は以下の通りです。

    ws47{cf7175}2% passwd                      ← 「passwd」と打つ
    passwd:  Changing password for cf7175
    Enter login(NIS+) password:                ← 現在のパスワードを打つ
    New password:                              ← 新しいパスワードを打つ
    Re-enter new password:                     ← 新パスワードをもう一度打つ
            NIS+ password information changed for cf7175
            NIS+ credential information changed for cf7175
    ws47{cf7175}3% 
今度は失敗例を。
    kenroku{iwase}1% passwd
    passwd:  Changing password for iwase
    Enter login(NIS+) password:
    Sorry: wrong passwd                        ← 現パスワードを間違えた
    パーミッションが与えられていません。
    kenroku{iwase}2% 
また別の失敗例です。
    kenroku{iwase}2% passwd
    passwd:  Changing password for iwase
    Enter login(NIS+) password:
    New password:
    Password is too short - must be at least 6 characters. ← 新パスワードが短すぎる
    New password:
    Re-enter new password:
    They don't match; try again.                           ← 二度打ったものが一致しない
    New password:
    Password is too short - must be at least 6 characters.
    New password:
    Password is too short - must be at least 6 characters.
    Too many failures - try later.                         ← 間違いが多すぎるので叱られた ;_;
    パーミッションが与えられていません。
    kenroku{iwase}3% passwd

ちょっと一息いれて、ふり返ってみましょう

前に WS を使ったことがある人を別にすれば、 一カ月半ほど前にこの授業が始まったばかりのときはログインのしかたもわからなかったことでしょう。 それを思い出してみれば、 ずいぶん進歩したといえるでしょう。

私たちが学んできたのは、 ディレクトリとファイルの基本操作でした。 そして、 「これこれのディレクトリを作ってそこにこれこれのファイルを置けば、 それがホームページとして大学じゅうから見えるよ」 ということを知って、それをやってみました。 コンピュータを使って一つの仕事をなしとげたわけです。

これからも、 このようにしてコンピュータにいろいろな仕事をやらせてゆきましょう。

いますぐパソコンを買ったほうがいいか?

みなさんの中にはコンピュータに興味をもち、 パソコンを買おうかと考え始めた人もいるようですが、 いますぐ買ったほうがいいかどうかはわかりません。

まず、 これからみなさんは数学で忙しくなるでしょう。 パソコンを使う時間がとれないかも知れません。 パソコンは一年一年性能がよくなっていますから、 買って使わなければとても損です。

学部を卒業して会社にはいったり、学校に勤めるようになれば、 そこのコンピュータを使うことになるでしょう。 そうなってから会社と同じメーカーのパソコンを買う、 という方法もあります。

また、この実習室のコンピュータ(WS)はかなり高性能ですし、 インターネットでデータが読み込まれるスピードも家庭で電話回線経由のときとは全然違います。 家庭でこれと同じことができると期待すると、 期待がはずれるかも知れません。

もしもパソコンを入手したら何ができるか?

でも、もしもパソコンを入手したら、 いままで実習でやってきたことのうちどんなことができるか、 ちょっと説明しておきましょう。

たぶん、買うとしたら Windows マシンか、Mac となるでしょう。 Windows マシンというのは Microsoft Windows という OS が動いているコンピュータのことです。 Mac では Mac OS という OS が動きます。 一方、実習室の WS では unix という OS が動いています。 これらは別物ですが、似たところもあります。 「ディレクトリ」「ファイル」と呼ぶかどうかは別として、 Windows にも Mac にも同じようなしかけがあります。 ls, cp, mv などのファイル操作コマンドにも、似た操作があります。 (ファイルマネージャのようなものを使うのが最近は普通のようです。) また、textedit にあたるエディタもあるでしょう。 そして、おそらく、netscape のようなブラウザ (インターネット閲覧ソフト)がはいっていますので、 パソコンの中で自分のホームページを作ることができます。

いまのパソコンはたいてい「モデム」を内蔵しています。 モデムというのはパソコンと電話をつなぐ装置です。 そして「プロバイダ」と呼ばれる業者と契約を結べば、 電話回線経由でインターネットに接続できます。 つまり、ある操作をしてパソコンをプロバイダのコンピュータに接続し、 それからパソコンのブラウザを使えば、 実習室から見るのと同じようにインターネットのホームページが見られます。 ただし、電話回線の中をデータが流れる速度は遅いので画像データがパソコン側にくるまでには少々時間がかかりますが。 また、プロバイダのメールも使えます。 つまり、いま WS の「メールツール」でメールをやりとりしているように、 自宅のパソコンで全世界とメールのやりとりができます。 実習用メールアドレスは3月で終わりになってしまいますが、 プロバイダのアドレスは長く使えます。 プロバイダのコンピュータにホームページを開設することもできます。 つまり、 パソコンの中に作ったホームページのファイルをプロバイダのコンピュータにコピーすると、 全世界の人に見てもらえるホームページになるのです。

ちょっと“お値段”の話もしておくと、 私が契約しているプロバイダは一カ月 2000 円で 15 時間まで使えます。 一日平均約 30 分ですから、なかなか使い切れないぐらいです。 これとは別に電話代がかかります。 テレホーダイとかを利用して安くすることもできます。

最後にもう一つ。 いまの実習のファイルやメールは学期が終わればなくなってしまいますが、 パソコンのディスクにとっておけばあとからいつでも見ることができます。

インターネットにつながっているコンピュータ間でできる操作

実習室には複数の WS が並んでいます。 隣の実習室にはパソコンが並んでいます。 これらは全てネットワークにつながっています。 みなさんがパソコンを買ってプロバイダと契約すると、 プロバイダに電話をかけて接続している間はそのパソコンもインターネットにつながっていることになります。 これらのコンピュータ間でできる操作について、お話ししておきます。

telnet については、前にちょっとふれました。 自分がアカウントをもっている WS へは、 他の WS あるいはパソコンから telnet でログインすることができます。 ログインするとプロンプトが出てきます。 そこにコマンドを打ち込めば WS を操作できます。 だから、 パソコンを買ってプロバイダと契約すれば自宅からセンターの WS が使えることになります。

※ 私はそうやってメールを書いたりしています。:-)

もう一つは ftp です。 自分がアカウントをもっている WS へは、 他の WS あるいはパソコンから ftp で接続し、 ファイルのやりとりをすることができます。 つまり、接続したあとで定められた操作をすると、 WS のファイルを「他の WS あるいはパソコン」にコピーしたり、 逆に「他の WS あるいはパソコン」のファイルを WS にコピーしたりできます。

※ 私はそうやってホームページを置いたりしています。:-)

telnet でのログイン

いま実習室で試してみたい人は、シェルツールを 80 字× 24 行ぐらいの大きさにして、 その中から実習室内の適当な WS に telnet してみるとよいでしょう。

自宅のパソコンからの場合、接続後に 「telnet ws??.ipc.kanazawa-u.ac.jp」 としてください。 このコマンドはパソコンに命令するのですから、 やり方はパソコンの種類に依存します。 「??」にはいつものように 01 から 48 までの数がはいりますが、 ときどき電源の入っていないマシンがあるので注意が必要です。

実習室からの場合、プロンプトが出ているところで 「telnet ws??」と打ってください。

いつものようなログイン画面が出ますから、 ID とパスワードを入力すればプロンプトが出るはずです。 プロンプトが出ている画面が一つだけですから、 普段とは使い勝手が違います。 textedit は使えません。 mule を使ってみて画面に字の出る位置がヘンだったらいったん mule を終了してプロンプトの出ているところから 「set term=vt100」としてください。 メールツールも使えないので、 メールは Mail という名前のコマンドで読みます。 Mail とだけ打って起動すると Mail コマンドの“サブプロンプト”が出ます。

    ws47{eb00d48}2% Mail
    mailx version 5.0 Thu May  2 21:00:21 PDT 1996  コマンドの概要については ?
    をタイプしてください。
    "/var/mail/eb00d48": 2 個のメッセージがあります。 2 個新規。
    >N  1 iwase@mailedu2.ipc Wed Nov  4 17:40   16/516   a test
     N  2 eb00d48@mailedu2.i Wed Nov  4 17:41   16/524   hello!
    ?
これがメール一覧です。 読みたいメールの番号を打てばメールの内容が画面に表示されます。 メールのひとつを読んだあとでまたメール一覧に戻りたいときは「h」です。 上のメール一覧が画面に収まりきれないときは「z」で次画面、 「z-」で前画面に移ります。 Mail の終了は「x」です。 こうすれば unix のプロンプトに戻ります。 ほかにも Mail にはいろいろな使い方があり、 一部は昨年度のページにも書いてあります。 ただし、 昨年度のやり方のうち上で説明したこと以外と今年度のやり方を混ぜて実行するとどうなるかわかりませんので、 試す人は自分の責任でやってください。 一画面に収まりきれないときは、 パソコンの telnet 側でログを残すなどの工夫をすればいいと思います。

使い終わったら、 プロンプトの出ているところで「exit」「logout」などと打てば終了します。

ftp の使い方

telnet と同じく、いま実習室で試してみたい人はシェルツールの中から適当な WS に ftp してみるとよいでしょう。 cp と実質的には同じですが、練習にはなります。

自宅のパソコンからの場合、接続後に 「ftp ws??.ipc.kanazawa-u.ac.jp」 としてください。 このコマンドはパソコンに命令するのですから、 やり方はパソコンの種類に依存します。 「??」にはいつものように 01 から 48 までの数がはいりますが、 ときどき電源の入っていないマシンがあるので注意が必要です。

実習室からの場合、プロンプトが出ているところで 「ftp ws??」と打ってください。

いつもとは違ったやり方でログイン名とパスワードを聞かれますから、 打ち込んでください。

これから打ち込むコマンドは telnet でログインしたときのものとは別物ですから注意してください。 「ls」とか「ls -la」で接続先(向こう側)のファイル名一覧が出るはずです。 「cd ディレクトリ名」で接続先(向こう側)のディレクトリ間移動。 unix マシンと DOS や Windows マシンの間で ftp を使うときは、 テキストファイルとバイナリファイルで少々切りかえが必要です。 「ascii」とすると以後テキストファイルをやりとりするモード、 「binary」とすると以後バイナリファイルをやりとりするモードになります。 手元のファイルを接続先に置くには「put ファイル名」、 接続元のファイルを手元にもってくるには「get ファイル名」です。 いずれも、すでに同名のファイルがあると上書きされます。 こちら側のマシンのディレクトリ移動はできる ftp ソフトもありますができないと思っておいてください。 つまり、ftp をする前にしかるべきディレクトリに移っておくべきです。 「quit」とすると ftp を終了します。 また、“向こう側”にコピーしたファイルのパーミッションが 666 になってしまう ftp が時々あります。 これだと誰かに内容を変更される恐れがあるので、 私は 700 のサブディレクトリに“置く”ようにしています。 それから telnet でログインして chmod して mv します。

半角カタカナについて

世界中のコンピュータがネットワークにつながってデータのやりとりをする時代ですので、 以前とは違った、いくつかの約束ごとができてきています。 「半角カタカナを使わない」もその一つです。 これは機種によっては対応できず、文字化けの原因になりますから、 ホームページやメールでは避けるべきです。 また、将来は半角カタカナは廃止される予定だそうです。

半角文字とは何か、については説明しました。 その中でカタカナと

 。「」、・゛゜
にあたるものが「半角カタカナ」です。 スペースにも半角カタカナ用のがあるみたいです。 あればそれも含まれます。 実習室の WS ではどこかのキーを押してこれを打ち込むモードに切りかえないと打てないはずなので、 間違って打つ心配はあまりないはずですが、 ちょっと頭に入れておいてください。

なぜC言語を選んだか

プログラミング練習に使えるのはC言語だけではありません。 それらの中からなぜC言語を選んだのかを説明しておきます。

まず第一に、私に教えられるのはほとんどC言語だけだから。 また、unix 自体がC言語で書かれており、 unix のコマンドのほとんどはC言語で書かれているはずです。 それだけ、C言語はいろいろなことができる、 本格的な言語です。 一方、C言語はよく規範化されています。 ANSI C という規格があって、 それに準拠したコンパイラがよく出まわっています。 その規格に合うように書いたプログラムはそれらのどのコンパイラでもコンパイルできます。 同じプログラムが unix でも Windows(実際は DOS のことが多い)でも Mac でも動くわけです。 前に紹介した K&R2 はこの規格に準拠した教科書です。

また、C言語のあとから出てきた C++, Java, JavaScript などの言語は、 Cの構文などをかなりまねしています。 それだけCはスタンダードになっている、ということです。 もしもみなさんがそれらに乗りかえる場合でも、 C言語をやっておくことは有利といえると思います。

私の知っているかぎりでほかの言語についても書いておきます。 Fortran は数値計算では伝統があります。 この分野ではいままでに書かれた大量のプログラムが利用できるのが強みでしょう。 ひとむかしまえは教育用には Pascal, 実用にはC言語、と言われたこともあるようですが、 Cが Pascal に対してひけをとっていた点は ANSI C で解決したといえると思います。 細かいことですが、 Pascal は割る数×商+余りが割られる数に等しくないことがあります。 BASIC は、よく工夫された処理系もあるようですが、 処理系ごとにばらばらという感じがします。

みなさんのアカウントの所属グループが変わりました

みなさんのアカウントは iwase グループに属していたのですが、 センターの都合で iwase1 に変わりました。 普通に使う分にはまったく問題ないと思いますが、 お知らせしておきます。

C言語での関数の自作方法

C言語では、自分で関数を作ることができます。 きょうのプログラムもサブディレクトリ ~iwase/prog に置いてありますので、 必要なかたはコピーして利用してください。

== power.c ====================================================================
#include <stdio.h>                  /* K&R2 より、一部改変して引用 */

int power(int base, int n);         /* プロトタイプ宣言 */

int main() {                        /* ベキ乗関数をテストする */
    int i;

    for (i = 0; i < 10; i++) {
        printf("%d %d %d\n", i, power(2, i), power(-3, i));
    }
    return 0;
}

int power(int base, int n) {        /* base の n 乗を返す (n >= 0) */
    int i, p;

    p = 1;
    for (i = 1; i <= n; i++) {
        p = p * base;
    }
    return p;
}
===============================================================================

まずは「プロトタイプ宣言」の行は飛ばして、 「power(x,y) は x の y 乗を計算するもの」 と思って main の終わりまでを読んでみてください。 関数 power を何回か利用して、 2 と -3 のベキ乗を計算しているプログラムであることがわかると思います。

※ 実は main にもいままでと違う点が二箇所ある。それはあとで。

※ 「power(2, i)」などとしてその値を計算させることを 「関数 power を呼び出す」と言うときがある。

この power は、C言語に元々そなえつけの関数ではなく、 自分で作ったものです。

※ 本当は自分で作ったのではなく本から引用したんだけどそのへんはつっこまないように。

main のあとの残りの部分が関数 power の定義です。 そこを説明します。

関数は、cos(0) が 1 であるように、値をもっています。 その値のことを「返り値(かえりち)」と言います。 「int power」の int は、 power の返り値が int 型であることを示しています。

また、 関数を使うときには power(x,y) のようにして使いますが、 この x と y のことを「引数(ひきすう)」と言います。 この power の場合は x, y は int 型と決めましたので、 「int 型の引数を二つとる」と言ったりします。

関数の定義のところでも x と y と書いてもいいのですが、 引数の意味がわかりやすいように、 最初の引数を base, あとの引数を n と呼ぶことにしましょう。 「int power」 のあとの小カッコの中には引数の型と名前を、 引数ごとにカンマで区切って書きます。 この例では第一引数は int 型で名前は base, 第二引数も int 型で名前は n, というわけです。

※ 引数には「仮引数」と「実引数」の区別があるがここではふれない。

その次の行の「int i, p;」は、 関数 power の中で使う変数の宣言です。 いままで main の中で宣言していたのと全く同じスタイルになっています。

そのあとの部分では base の n 乗を計算していることがわかりますか? そして最後の「return p;」でその値を返しています。 つまり、return のうしろに書かれた式の値がこの関数の値になる、 というわけです。

「プロトタイプ宣言」に戻りましょう。 ここには、power の定義の一行目と同じものを書きます。 ただし、最後の開き中カッコ「{」の代わりにセミコロン「;」をつけます。 これはコンパイラに 「これから出てくる power というのはこういう関数なんだぞ」 と教えるためのものです。

※ C言語に元々そなえつけの関数(printf, sin など) を使う場合はプロトタイプ宣言を自分で書く必要はなかった。 実はそれらは include された stdio.h や math.h に書いてあるのだ。 これらのファイルはディレクトリ /usr/include にある。

さて、 main を注意深く読んだ人は、 いままで「main() {」となっていた部分が「int main() {」となっていること、 main の最後に「return 0;」があることに気づいたでしょう。

main も関数の一つなので返り値があります。 実は main は OS に int 型の値を返します。 その使いみちについてはこの実習では説明しませんが、 プログラムが正常に終わったときは 0 を、 そうでないときは 0 以外を返すのが普通とされています。

このプログラムは main の中で変数 i を使い、 関数 power の中でも変数 i を使っています。 しかし、どちらもそれぞれの関数の中だけの変数なので、 両者は全く無関係です。 すなわち、 power の中で i の値が変わっても、main 側の i は変わりません。

※ return は、必要なら一つの関数の中に複数個おいてもよい。

    if (...) {
        return 0;
    } else {
        return 1;
    }
のように。

※ 実用の上では、 ベキ乗関数は前に紹介した pow を使うのがよい。 なお、 二乗や三乗の場合は pow(x,2), pow(x,3) よりも x*x, x*x*x のほうが速い。

== power2.c (単独では動かない) ==============================================
int power(int base, int n) {            /* K&R2 より、一部改変 */
    int p;

    for (p = 1; n > 0; n--) {
        p = p * base;
    }
    return p;
}
===============================================================================

power.c のうちの関数 power の定義の部分だけを上の power2.c で置き換えても、 プログラムは同じように動きます。

main の中の for ループを何度か回わって、 i = 3 となって power(2, i) が実行されるときのことを考えてみてください。 power の側では最初 base が 2, n が 3 です。 その n をだんだん減らしながら power 内の for ループを回わり、 n が 0 になるとループを抜けて main に帰ります。 main に戻ったとき、i は 0 に減っているのでしょうか?

そうではありません。 i は 3 のままです。 power(2, 3) を計算するときに power に渡した 3 は i のコピーであって変数 i そのものではない、 というのがC言語の約束です。

このことを「call by value(値による呼び出し)」ということがあります。

いろいろな関数を書いてみよう

いろいろな関数を書いて、くり返しと関数の両方の練習をしましょう。 (課題ではありません。)

まずは階乗を計算する関数 factorial を書いてみましょう。 引数の型、名前はどうしますか? 返り値の型は? 自分で考えて書いてください。 「関数を書いてみる」というのは、 「テキストファイルとして作成して終わり」ではなく、 検査用の main を書いて、コンパイルして実行し、 思ったように動くことを確認することです。 main では

    0 の階乗は 1 です.
    1 の階乗は 1 です.
    2 の階乗は 2 です.
    3 の階乗は 6 です.
    4 の階乗は 24 です.
     ...
のように出力させてみるとよいでしょう。 ここでもループの練習ができます。

初等超越関数を自作してみるのも面白いでしょう。 たとえば

                     2      3      4
                    x      x      x
  exp(x) = 1 + x + ---- + ---- + ---- + ...
                    2!     3!     4!

                   2     3     4
                  x     x     x
  log(1+x) = x - --- + --- - --- + ...
                  2     3     4


                 3      5      7
                x      x      x
  sin(x) = x - ---- + ---- - ---- + ...
                3!     5!     7!

                 2      4      6
                x      x      x
  cos(x) = 1 - ---- + ---- - ---- + ...
                2!     4!     6!
と、 Taylor 展開を利用して計算します。 log では x の範囲は -1 < x <= 1 ですから注意してください。 ほかの三つでは x は全ての実数で OK ですが、 x の絶対値が小さいほど速く収束しますから、 三角関数では 2π が周期であることなどを利用して |x| を小さくしてから計算するなどの工夫がいるところですが、 最初は気にしなくてもいいでしょう。 テスト用 main ではもともとある関数と自作の関数を呼んだ結果を並べて出力するようにすれば、 “答え合わせ”も簡単です。:-)

※ 自作の exp や sin に「exp」「sin」という名前をつけると、 もともとある関数の名前と重複してしまってまずい。 こんなときは「myexp」「mysin」とするのも一案だ。 「私の exp」「私の sin」といった感じ。


岩瀬順一 <iwase@kappa.s.kanazawa-u.ac.jp>