連載 / 凵眈 Language¯ リスト 1 hello. tk 6 # 9 # 10 # 13 } 1 3 5 12 14 19 # ! /usr/local/bin/vish —f # tk による He110 Wor1d . he110 という名前のボタンを作る 7 # 表示する文字列は " he110 , orld " 8 # そのボタンが押されたときに実行するコマンドは、 「まず標準出力に " He110 , world" と表示して、プログラムを終了」 というものである by srekcah@sra. co. JP 20 # プログラムは自動的にイベント・ディスパッチループに入る 18 pack append . he110 {top} 17 # 上で作った . he110 ボタンオプジェクトを張り付けるためのコマンド 16 # 最上位のオプジェクトである。 pack append はその最上位オプジェクトに 15 # . ( ビリオド ) で表されるオプジェクトが、アプリケーションの puts stdout " He110 , world" ; destroy 11 button . he110 —text " be110 , world" -command { 図 1 hello world 実彳」 囹れ 0 ・ れ e 0 学 wodd リスト l(hello. (k) に最初の例題を示します。 UNIX の世界における究極の例題プログラム、、 hello world' を実行させるものです。 % wish —f he110. tk と実行すると、図 1 のようなウインドウが画面上に現れ ます。、、 hello, world" と表示された部分はいわゆる、、ポ タン " で、マウスの左ボタンをクリックすると、標準出 力に、、 Hello, world" という文字が出力され、プログラ ムを終了します。プログラムリストの 11 行目が、ボタ ンを生成しているところです。 tk のリストを初めて見る と . 、 ( ピリオド ) と一 ( ハイフン ) が妙に目立つように " は UNIX のノヾ 感しると思います。 tk の世界では、 ス名の区切り文字、、 / " に、 ーは通常の UNIX のオプ ションを与える一に相当します。 すなわち UNIX の世界では、、オプジェクト " を表す のは / を使ったノヾス名でしたが、 tk の世界では、 . から 始まり . で区切られた、パス名 " がオプジェクトを一意に 指定します。たとえば、リスト 1 のなかに現れる、、 . hello' というオプジェクトは、アプリケーション ( インタープ リタ ) の根元から直接ぶら下がっているものを指していま す。もし、 120 . framel . frame2. buttonl という指定があれば、それは SSframeI の下の frame2 の 下に付いた buttonl" というオプジェクトということに なります。 tk はこのような名前で指定されるオプジェクトを生成 し、そのオプジェクトを一定の規則に従って配置すると いう 2 段階の手順て構成されています。 tk の GUI オフジェクト tk カ甘是供する GUI オプジェクトは、、、ウィジェット・ と呼はれます。 X に標準で付いてくるツールキットの部 品もやはりウィジェットと呼ばれますが、両者はまったく 別物です。以下に、 tk か現在用意しているウィジェット の一覧を示します。 ・ button 押しボタンを提供します。通常マウスポタンを押すこ とにより、対応する手続きを呼び出すことができます。 ・ canvas 構造をもつグラフィックスを提供します。つまり、た んに図形か表示できるだけではなく、その図形をオプ ジェクトとみなして対話することができます。 ・ checkbutton チェックボタンを提供します。通常マウスポタンによっ UNIX MAGAZINE 1993.6
連載 /UNIX Communcation Notes—⑩ 表 1 waisindex がサポートするファイルタイプ タイプ text bibtex bio dash dv i emacsinfo first_line filename gif 1 て g 」 argon mail—digest mail ftp cmapp nhyp rmai 1 medline mh_bboard netnews one_line para pict PS refer server tiff 意味 通常のテキストファイル BibTVfX ファイル biology abstract フォーマット ファイルの内容がダッシュ列で区切られ ているようなファイル dvi ファイル GNU Emacs lnfo ファイル ファイルの頁の行をタイトルに使う ファイル名をその文書のタイトルに使う GIF ファイル lnternet Resource Guide フォーマット Jargon File 2.9.8 フォーマット lnternet Mail Digest フォーマット メール (UNIXMail) フォーマット・ファ イル MedIine フォーマットのファイル MH での bboard フォーマット USENET news の記事 各行が 1 つのドキュメントを構成するよ うなファイル 各パラグラフが空行で分かれているような テキストファイル PICT ファイル ( ファイル名だけがイン デックス化される ) PostScript ファイノレ refer ファイル ニュースリーダーてⅡで保存された USE ー NET の記事 WAIS での Directory-of-Servers の記 述に使われるフォーマット TIFF ファイル ( ファイル名だけがイン デックス化される ) FTP archive のインデックスに使う ( ヨ勺でない ) ( ヨ勺でない ) 1 5 工ラーメッセージおよび警告メッセージのみを出力 します。 さらに、どのファイルをインデックス化しているか という情報を出力します。 このオプションか指定されると、インデックス作成中の 工ラーが filename に言泉されます。 filename を扣疋 しないと、エラーはいっさい出力されません。 ー 1 level インデックス作成中のログ出力をどの程度おこなうかの 孑票を level で与えます。現在は、 0 、 1 、 5 、 10 カ甘旨定 できます。各レベルは、次のような出力を生成します。 0 ログを何も出力しません。 UNIX MAGAZINE 1993.6 10 すべてのログ情報を出力します。 —mem mb リ インデックス作成に使用するメモリの量を、 MB 単位 で指定します。大量のファイルからデータベース ( イ ンデックス ) を作成する場合、この値を大きくしてお くと処理か高速化されます。 -POS 語 (word) がファイル内のどこにあるかという情報を 作成します。標準ではこの情報は得られません。この情 報を作成すると、インデックスがかなり大きくなります が、語の検索スピードは速くなります。 ¯nopalrs 大文字だけからなる単言リのインデックスは作成しませ ん。標準では作成されます。 —nocat 標準では、インデックス作成時にどのファイルをデー タベースに加えたかというカタログが作られますが、 のオプションを指定すると作成されません。データベー スを構成するファイルが多いときにこれを指定すると、 インデックスが矢可間で作れます。 意 1 -register オプションを指定すると、 Thinking Ma- chines の Directory-of-Servers データベースに登求されま す。このデータベースに当求されるべき WAIS サーバーは、イ ンターネットから利用できるノワ。リックな WAIS サーバーで す。したがって、 -register オプションを指定するときには、 十分な注意が必要です。登録する場合は、はかのデータベース と名前か重複しないことはもちろん、る当素後は WAIS サーバー の安定運用をするなどの責任も負わなければなりません。 waisindex の使用例 さて、使用例をみてみましよう。 /wais/rfc1000 に は RFC1000 ~ 1099 まてが用意されています。これをも とにデータベースを作成してみましよう。作成するデータ べース名は C1000 とします。リスト 1 にその実行例を 示します。 こで、次の 7 つのファイルが作成されます。 53
図 5 x-gaintool 再生音量 録音音量 出力の切替え 録音モニター音量 囹焦 conu•ol 凹 Play Gain: 旦ー - ー Record Gain: 50 ー 0 れ社此 VO ⅳ me : 0 ー Output: SPW 」 ack Pause Play 出力の一時停止 内蔵スピーカーライン出力 いずれの設定も、数値 ( 0 ~ 100 ) またはマウスでポリュームをスラ イドさせて指定できる 図 6 x-soundtool ファイル形式の表示 一時停止 録音ボタン 再生ボタン Play Rec«d 再生音量 Play 0 me 50 ー eco ん 0 ⅳ me 50 ー [ 00Pi09. Off On データァイルを置くディレクトリ outputto: ー←出力先 ( ←ファイル追加書込み ( 。←ファイル書込み ( ←ファイル読込み 繰返し出力 録音音量 波形を拡大 マウスで指定した部分の Z00 m 592 厄 : sample.au ←データファイル名 全体の波形 ( マウスのドラッグで、一部分だけ の再生を指定することもできる ) さて、この 64Kbps は一定の数を束ね、多重化されて 送られています。この束ね方は日本、米国、ヨーロッパ で微妙に異なります ( 図 3 ) 。そして、この束ねられた 太い単位でのサーピスも受けることができます。 ISDN で は、 INS1500 が 24 本束ねた単位でのサーピスに対応し ます。 24 本を束ねて 1.5Mbps て利用するはかに、 6 本 あるいは 12 本を束ねたり、 1 本すっ利用することもでき ます ( 図 4 ) 。なお、よく専用線の広域ネットワークで見 かける TI (1.5Mbps) や T3 (45Mbps) というのは、 の束ねた単位を表す米での呼称です。 /dev/audio の利用 SPARCstation の場合、オーディオ・インターフェイ スの特殊デバイスファイルは、 /dev/audio という名前で 提供されています。ハードウェアとしては、入力はマイク ジャック、出力は内蔵スピーカーまたはライン出力ジャッ クを切り替えて使用します ( とくに指定しなければ、内蔵 114 スピーカーになります ) 。 オーディオだからといって、意識することはあまりあり ません。 % cat /dev/audio > save . au を適当な時間だけ実行して中断し、 % cat save . au > /dev/audio とすれは再生できます。また、 UNIX MAGAZINE 1993.6 続しますが、その場合はマイクのレベルに落とすための抵 注意してください。たいていはイヤホンかライン出力を接 ジオを接続するときは、マイクのレベルに合わせるように こともできます。マイクの代わりにテープレコーダーやラ のワークステーションで仕事中の同僚の邪魔 ( ! ? ) をする ( 2 秒度の遅れは生しますが ) インターホンのように別 を実行してからマイクに向かって「ヤッホー」と叫ぶと、 % rsh xxxx ' cat > /dev/audio ' く /dev/audio
特集ドン一ときたら困るけど、ネットワーク卸里・・ 2 /etc/exports ファイルで設定します。 SunOS の場合、 マシンを導入した時点ではこのファイルは存在しませんか ら、自分で ( もちろんスーパーユーザーになって ) 新しく 作る必喫があります。 /etc/exports ファイルは次のように記述します。 ディレクトリのパスーオプション [ , オプション ] ・ ディレクトリのパス " は、工クスポートしたいディレ クトリを糸寸パスで言当します。ここでは /project です ね。、、オプション " には、工クスポートするクライアント や、アクセス権限などを記述し、複数のオプションがある 場合は ( カンマ ) で区切ります。おもなオプションに は、以下のものがあります。 ・ access = hostname [ :hostname] ・ hostname" で指定したクライアントに対してだけ、 ェクスポートします。複数のクライアントを指定する場 合は、ホスト名を、、 ( コロン ) で区切ります。このオ フションを省略すると、すべてのマシンに対してェクス ポートします。 読出し専用でェクスポートします。このオプションを 指定した場合、クライアントが、 r でマウントしよう としても書込みはできません。書き込む必要のないディ レクトリや、むやみに書き込んでほしくないディレクト リをェクスポートするときに用います。また、このオプ ションを指定しなければ、クライアントはマウントした ディレクトリに対して読み書き可能になります。 ・ rw = hostname [ :hostname] ・ 指定したクライアントだけか読み書き可能になり、それ 以外は書き込めません。ホスト名を何も指定しないと、 クライアントのスーパーユーザー以外はすべて読み書き 可能になります。 ・ root = hostname [ :hostname] ・ 指定されたクライアントのスーパーユーサーは、その権 限でディレクトリにアクセスできます。ホスト名を指定 しない場合、すべてのクライアントに対して、スーパー ューサーの権限でのアクセスは不可能になります。 このオプション自体を省略すると、クライアントのス ーパーユーサーは、、匿名ューザー " として扱わ anon UNIX MAGAZINE 1993.6 オプションて指定されたユーザー ID となります。 たとえは、 monkey 君がマシン coconut の /project に対して、、、マシン banana だけがアクセス可能で、スー パーユーザーのアクセスも許す " 設定にしたい場合、 / etc /exports は次のようになります。 /proJect —access=banana,root=banana スーパーユーサーのアクセス (root オプション ) は慎 重に扱いましよう。スーパーユーサーのアクセスを許した 場合、いつの間にかファイルか書き換えられたり、消え てしまうような、不注意による、、事故 " カ起きたりします。 したがって、 root オプションは必要最小限のクライアン トにだけ指定するようにしましよう。また、ホスト名を指 定するオプションに関しては、ホスト名の省略とオプショ ン自体の省略では、意味がまったく異なるので注意が必要 です。 exportfs コマンド /etc/exports に記述した設定をマシンに反映させる コマンドが、 exportfs です。さまざまなオプションが ありますが、普通は、 exportfs —a または、 exportfs パス名 といった使い方をします。 /etc/exports に書かれたディレクトリのパスを引数 に指定すると、そのエントリだけを工クスポートします。 ー a ・オプションは、 これに対し、 /etc/exports の 全工ントリを工クスポートする " ことを意味します。また、 引数を省略すると、現在工クスポートしているディレクト リ ( およびオプション ) を表示します。 coconut# cd / coconut# exportfs —a coconut# exportfs /project coconut# —access=banana, root=banana このほかにも、工クスポートを取り消すオプションなど がありますが、これらについては exportfs(8) のオンライ ン・マニュアルなどを参照してください。 31
% cat 1 2 実彳」 6 18 } —n sum . C extern void 3 main (argc , argv) 4 5 7 8 9 10 11 12 13 14 15 16 17 % lint int char sum . C argc ; int int first exit() ; atoi(* + + argv) ; first, 1ast; i , sum = 0 ; last = at0i (* + + argv) , for (i = first; i く = last; (void)printf("%d\n" , sum) ; exit(O) ; / * NOTREACHED * / sum. c ( 4 ) : warning : argument argc unused in function main も 2 つ目の引数のほうが大きいことなどを検査しなけ ればなりません。これらの検査をおこなえば矼 gc 引数 を使うこともあるでしようが、この例では引数の検査を 省略しているので使われていません。 lint コマンドは、使われていない引数をみつけたとき にはそれを出力します。使われていない引数カワ。ログラ ム中にあっても、とくに間題はないでしよう ( プログラ ムのサイズが大きくなるという欠点はありますが ) 。た だし、プログラムを修正する段階で、引数に正しい値が 入っているものとして修正してしまうと、正しく動かな くなる可能生もあります。 通常の関数の場合は、使われていない引数はたんに プログラムから削除して、その関数を呼び出している箇 所を修正すれば問題ないのですが、 main 関数の引数で はそうもいきません。 argc 引数を削除すると、プログ ラム起重加芋のコマンド行引数を正しく受け取れなくなっ てしまいます。 main 関数でなくても、ほかの関数の引 数として使うようなときは、インターフェイスを合わせ るために必要としない引数を指定することもあります。 これに対処するために、 lint コマンドには一 v オプショ ンがあります。これを指定することにより、関数の引 数のなかに使われていないものがあっても警告を出さ ないようになります。 ただし一 v オプションを指定すると、すべての関数に 152 対して指定か有効になるので注意が必要です。実彳引列 6 の例ではプログラム中の関数が 1 つだけなので問題は ありませんが、複数の関数を含むファイルを lint コマ ンドにかける場合、あらかしめ分かっている引数を使 わない 1 つの関数のために、そのほかの関数に対する 使われていない引数のチェックがおこなわれなくなって しまいます。これでは、機能を十分に使いこなしている とはいえません。 じつは lint コマンドには、ある特定の関数について だけ、使わない引数があるということを示す指定も準備 されています。これも、さきほどと同様にコメントで指 定します。今度は、 ARGSUSED という単語を指定し ます。実行例 6 では戻らない関数の後ろに指定しまし たが、これは使わない引数がある関数定義の直前に指 定します。 % cat sum. c extern void main (argc , argv) / * ARGSUSED * / exit ( ) ; int char **argv ; argc ; int int first 1ast fro (i i , sum = 0 ; first, 1ast ; atoi (* + + argv) ; atoi(* + + argv) ; = first; i く = last; i + + ) { UNIX MAGAZINE 1993.6
図 9 プリントアウト士組み ワークステー / e p 叩 : プリントアウト : してね ! あとは任せた ファイル よし、引き受けた ! 任せなさい ! フィルタ ファイルのコピー スプールディレクトリ 表 1 /etc/printcap のオプションの意味 : br # 19200 : mx # 0 :sf : sh:rw: sb: :ms=¯isig, igncr,cstopb,—echok: \ : fc # 0177777 : fs # 003 : \ : if=/usr/local/lib/lpdfilters/psif : \ : af=/usr/adm/okips . acct : \ : lf=/usr/spool/okips—log : \ : lp=/dev/ttya: sd=/usr/spool/okips : \ okipsl durianlOKI MicroLine 801PS \ # PostScript Printer for Monkey Project 図 10 /etc/printcap 」 名称 lp sd If af if 、 of br mx sf sh rw sb df nf tf vf rf 内容説明 プリンタがつながるテンヾイス名 スフ。ーノレ・ディレクトリ 工ラーメッセージを書き込むファイル名 アカウント情報を書き込むファイル名 デフォルトのテキストフィルタ名 tty につながったプリンタの中応も玉度 プリントアウトするファイルの最大サイズ 改ページのコードを出力しない ヘッダべージを出力しない プリンタデバイスを読み書きできるモードて開く 1 行だけの短いへッダを出力する rIbX の dvi ファイル用のフィルタ ditroff 用のフィノレタ troff 用のフィルタ ラスタイメージ用のフィルタ Fortran(ratfor) 用のフィルタ それでは、この図に載っているオプションのなかで今回 使うものについて、設定を考えながらすこし詳しくみてい 36 きましよう。 プリンタがつながるデバイス名を指定します。 今回は、 RS232C ポートに接続するので /dev/ttya と 指定します 11 ・ sd プリントアウトするファイルは、 lpr によってここで 指定されるスプール・ディレクトリにコピーされます。 /usr( または v 矼 ) / SP001 / 2 厩 e れ me というディ レクトリにすることが多いようです。 ・ If lp や lpd からのエラーメッセージがこのファイルに書 き込まれます。 ・ af アカウント機能を利用するとき、その情報を書き込むた めに指定するファイルです。アカウント機能について は、『 SUN システム管理』などを参照してください。 ・ if プリントアウトするファイルの内容を、プリンタに合っ た形式に直すのに利用するフィルタ ( プログラム ) あるいはプリンタドライバ " と呼ばれるプログラムを 指定します。 ・ br RS232C などのシリアル・インターフェイスに接続する 場合、データの転送速 . 度を指定しなくてはなりません。 11 RS232C ポートが /dev/ttya や /dev/ttyb など複数ある場合、対 応するデバイスファイルを石忍、してください。 UNIX MAGAZINE 1993.6
NIS を使っている環境では、かならすマップ (services) も更新してください。 以 - ヒで準備は終了です。 WAIS サービスの構築 こからは、 RFC (Request For Comments) の 1000 番台のドキュメントをデータベース化し、 WAIS サ ービスを提供することを例にして、その手順を説明してい きます。なお、さきはどの Makefile での $ ( TOP ) には /usr/local/wais を指定し、必要なプログラムはすべ て /usr/local/wais/bin にあるものとします。 テータの収集 ます、データベースに求するデータを集めます。 こでは、 RFC1000 ~ 1099 のドキュメントをディレクト リ /wais/rfc1000 の下に置きます。各ドキュメントは、 、 RFC 番号十拡張子 (. txt)" という名前のファイルにな っているものとします。たとえば RFC1041 が、 /wais/ て fC1000 / 1041. txt という具合にです。 データを集める段階では、 1 つのデータベースを構成する ファイル群 (f 列では /wais/rfc1000/* . txt) を 1 つのディ レクトリにまとめておくと、あとの管理が簡単です。量が多い 場合は、いくっかのサプディレクトリに分割して保存するとよ いでしよう。 連載 UN Ⅸ Communcation Notes—⑩ waisindex によるテータベースのイ乍成 次に、情幸財是供のための WAIS 用のデータベースを作 成します。これには waisindex コマンドを用います。デ ータベースのデータとなるファイルが川 e だとすると、 -d れ佖 me は、次のものが用意されています。 というようにデータベースを作成します。オプションに % waisindex 0 0 れ s file file た場合は、データベース名として f 。。が用いられ、イン 定できます。 dbname として /wais/db/foo を指定し クトリに作成されます。れ佖 me にはパス (path) も指 定された名前のインデックス・ファイルか現在のディレ 作成するデータベースの名前を指定します。通常は、指 52 デックス・ファイルは / wais / db に作成されます。この オフションを省略すると、データベース名には index か使われ、現在のディレクトリにインデックス・ファ イルが作成されます。 データベースを構成するファイルをいくっかのサプディ レクトリに分けて保存しているときに使用します。この オプションを使うと、再帰的にサプディレクトリを探索 し、インデックスを作成します。 —export 作成したデータベースを、 waisserver によってネット ワーク経由で公開する場合に指定します。このオプショ ンを指定すると、あとで説明するソースファイルに、 ・データベースを提供するホスト名 ・データベースカ甘是供される TCP のポート番号 の記述が追加されます。 ¯register Thinking Machines が管理している Directory-of- Servers データベースに自重加勺に登録されます。このオ プションの指定には注意してください ( 次ページのラも意 1 参照 ) 。 則号でも説明したように、 WAIS では高速かっ質の高 い検索ができるように、ソースに関する独自のインデッ クスを作成しています。このために利用するプログラム が waisindex です。インデックスの作成では、ファイ ルの構造に合わせてインデックス作成アルゴリズムを変 更しています。現在の waisindex は、表 1 に示したファ イルをサポートしています。このオプションでは、もと になるファイルのタイプを匆としてインデックスを 作成します。これを省略すると、 text か驃準のタイプ として指定されます。 すでに存在するインデックスに対して、差分を加える場 合に使います。たとえば、毎日ファイルか増加するメー ルの保存ディレクトリのインデックスを作るために、毎 回すべてのファイルのインデックスを作成するのは大変 です。このオプションを付けると、 waisindex は変更 部分のみのインデックスを作成し、既存のインデックス に追加します。 UNIX MAGAZINE 1993.6
特集ドン一ときたら困るけど、ネットワーク卸里・・ 2 ウントがないと、工クスポートされているディレクトリを 調べることはできません ( 誰かに頼めるなら別ですが ) 。 このようなリモートマシンの工クスポート状況を調べ る便利なツールとして、 showmount コマンドがありま す。使い方は簡単で、 /usr/etc/showmount —e NFS サーパーのホスト名 です。たとえば、 NFS クライアントである ba Ⅱ ana から、 NFS サーノヾー coconut の工クスポ のようになります。 banana% /usr/etc/shovmount —e export list fO て coconut : /project banana banana% ートを調べる場合は次 coconut 読み書きできるか、あるいはスーパーユーサーでのアク セスか可能かなどは分かりませんが、とりあえす、どのデ ィレクトリがどのマシンに工クスポートされているかは分 かります。このはかに、オプションを指定してクライアン トがマウントしているディレクトリなどの情報を調べるこ ともできます。これらについては、オンライン・マニュア ル showmount(8) などを参照してください。 NFS 使用上の注意点 NFS を使ってネットワーク上でファイルを共有すると、 ディスクの量か節約でき、インストールなどの竹業も省力 化できるなど、大変に便利です。しかし、設定ミスや NFS サーバーのダウンなどによって、思わぬトラブルが発生す ることもあります。そこで、 NFS を使ううえでの注意点 を挙げておきます。 ( 1 ) ハードマウントにはラも意 NFS クライアント側の設定オプションとして、 soft あ るいは五矼 d が選べます。前者を、、ソフトマウント " 、後 者を、 ードマウント " と呼びます。 NFS のサーバーが なんらかの原因で応答しなくなると、ソフトマウントの場 合はエラーを返しますが、ハードマウントの場合は応答が あるまで ( または retry オプションで指定された回 要求を繰り返しおこないます。 実際の運用を考えた場合、 NFS サ→ヾー上のファイル カリ用できないと仕事にならないことが多いので、通常は ハードマウントにします。ハードマウントにしておくとデ UNIX MAGAZINE 1993.6 ータは保証されますが、 NFS サーバーの応答がなくなる と、クライアントも沈黙してしまいます。これを防ぐには、 intr オプションを同時に指定し、キーポードから処理を 中断できるようにするとよいでしよう。 ( 2 ) ユーサー ID とグループ ID の管理はしつかりと ! ! たとえば、マシン banana に登録された saru 君と、マ シン coconut に登録された monkey 君のユーザー ID が同じだったとしましよう。 m 。 nkey 君のファイルがあ る coconut のディスクを banana がマウントした場合、 ューサー ID が同しなので saru 君は monkey 君のファ イルか読み書きできてしまいます。 NFS を使っている竟では、ディスクを共有している すべてのマシンで、ユーザー ID やグループ ID を統一す る必要があります。マシンの数か増えてくると、これはた いへん手間のかかるイになります。これらの情報を集中 的に管理するシステムとして、 NIS (Network lnforma- tion Service) がありますが、これについては次号以降で 紹介します。 ( 3 ) 転んでも大丈夫ーーパックアップ NFS を使ってファイルをサーバー上で集中管理すると、 ソフトウェアのインストールイ樔なども一度ですむのでと ても楽です。しかし、サーバーにファイルを集中させるは ど、サーバーのディスクがクラッシュしたときのダメージ は大きくなります。 このため、 NFS サーバーの定期的なバックアップが必 要になります。ハードディスクの内容をテープなどにバッ クアッフするガ去については、特集の後半で紹介する予定 ですので、もうしばらく待ってください。 フリンタの接続 ディスクの接続と NFS サーバーの設定力絲冬った翌日の ことです。 「 NFS サーバーのはうはなんとか動いてるみたいやな。 ええと、きようは何をするんやったつけ ? 」 と monkey 君、ばんやりしていると sarumata さんが やってきました。 sarumata: どないしたんや ? monkey: いや、ちょっと。 NFS サーノヾーの成疋もでき たし、偉いなあと自分を褒めてたとこです。 ロ 33
IJN Ⅸ流プログラ ミング 32 % cat 1 2 実彳」 5 17 } —n sum . C extern VOid 3 main(argc , argv) 4 5 7 8 9 10 11 12 13 14 15 16 % lint int char sum . C argc ; int int first exit ( ) ; at0i (* + + argv) ; first , 1ast ; i , sum = 0 ; 1ast = atoi(* 十十 argv) ; for (i first ; i く = last; (void)printf("%d\n" , sum) ; exit( の ; sum. c ( 4 ) : warning : argument argc unused in function main su.m. C ( 17 ) : : main() returns random value tO invocation environment を増やす ・ lint コマンドだけが処理する部分を # ifdef などで括 る ・コメントを使いその内容も検査させる などが考えられます。実際、 lint コマンドは最後の方 法を用いています。もし最初の方法を実現するならは、 C 言語のソースファイルを処理するすべてのプログラ ムを変更しなければなりません。 2 番目の方法は現実 的だとは思うのですが、 #ifdef で括る以 - E 、コンパイ ルするソースファイルと lint コマンドで処理するソー スファイルが異なるものとなってしまいます。最後の 方法を用いると、 C のプリプロセッサが # ⅲ clude や #define などの処理はおこなうが、コメントを削除す る処理はしないようにしておけば (じつは lint コマン ドは C のプリプロセッサを使っています ) 、はかの多 くのプログラムに変更を加える必要はなくなります。 lint コマンドに対して、プログラムに埋め込むことの できない情報を伝えるには、知らせたい位置に大文字で コメントを書いて指定します。この場合、知らせたい情 報は独立した単語として ( つまり前後には空白文字を入 れて ) 指定します 5 。今回は exit 関数カ唳らないことを 5 テストしたマシンでは、コメントを日本語とつなげても正しく動きま した。ただし、すべてのマシンで正常に動くとはかぎらないので注意 してください。 UNIX MAGAZINE 1993.6 示すために、 exit 関数の直後に / * NOTREACHED * / と いうコメントを加えます。これは、コメントカ甘旨定され た位置には、実行の制御がこないということを示すメッ セージです。この処理をおこなうと、実行例 6 のよう になります。 これで、 main 関数の戻り値に関する警告を消すこと ができました。 exit 関数カ唳らないことを指定したた めに、関数の最後まで実行がおこなわれて未定義の値 が返される場合を考慮しなくてよくなり、 main 関数の 戻り値に関するエラーか消えています。 本来ならば exit 関数の戻り値の型として、けして戻 らないことを示す値を使うべきなのでしようが、 C 言語 にはそのような型は定義されていません。 ANSI C で もそういう型は定義されていないようです。残念なが ら、 lint とうまくつき合っていくためには、このコメン トとは末長くお友だちでいなけれはならないようです。 使われていない引数 最後に 1 つだけ残っている警告は、 main 関数の引数 である argc が使われていないことに関するものです。 このプログラムは引数を 2 っとり、最初の引数から 2 つ目の引数までの値を加えた結果を出力するものです。 本来、引数が 2 っとも指定されていることや指定され た引数がそれぞれ整数値であること、最初の引数より 151
連載 /UNIX Communication Notes—O リスト 2 waisindex によって作成されるソースファイル ( : SOUrCe : verS1011 3 : ip—address " 133.1.84.1 " : ip¯name "raicho. rd. ecip. osaka—u. ac ・」 p : tcp—port 210 : database—name " RFC1000 " : cost 0 .00 : cost—unit :free : maintainer " suguru@raicho . rd. ecip. osaka—u. ac. JP :description "Server created with WAIS release 8 b5.1 0 Ⅱ Apr 19 10 : 45 : 47 1993 by suguru@raicho.rd. ecip ・ osaka—u. ac ・」 p The files of type text used in the index were : /wais/rfc/1000. txt /wais/rfc/1001. txt /wais/rfc/1097. txt /wais/rfc/1098. txt のようになります。 データベースをメンテナンスする人のメールアドレスで す。 waisindex では、プログラムを実行した人をこ に指定します。必要に応じて適切なメールアドレスに変 更してください。 ・ descripti011 提供されるデータベースを説明する言当です。ここには 自由に記述できます。 waisindex では、データベースを 構成するファイルの一覧しカ咐けないので、データベー スの内容をより分かりやすく伝える文章に変更するはう がよいでしよう。 WAIS サーバーの起動設定 こまで準備ができたら、次に WAIS サー ノヾーの走 動設疋をおこないます。サーバーは /usr/local/wais/ 番号を指定します。標準では 210 番を用います。 WAIS サーバーがサーピスを受け付ける TCP ポート のものが用意されています。 bin/waisserver です。サーノヾーのオプションには、次 ァイノレ、 —d dir ソースファイルが格納されるディレクトリを サーバーか提供するデータベースのインデックス・フ UNIX MAGAZINE 1993.6 市 7 、で指定します。このとき、下記の点に注意してくだ ・同時に複数のデータベースを提供する場合は、この ディレクトリにすべてのデータベースのインデック ス・ファイルとソースファイルを入れておかなけれ ばなりません。 ・サーバーの UID で、このディレクトリに対して読み 書きができるようにしなければなりません。 —e . 〃 le れ佖 7 れ e サーバーのログファイルです。このオプションが指定 されないときは、すべてのログ情報は捨てられます。 ー 1 level サーバーのログ情報の出力をどの程度おこなうか窈票 を level で与えます。現在は 0 、 1 、 5 、 10 カ甘旨定でき ます。各レベルは、次のような出力を生成します。 0 ログを何も出力しません。 1 工ラーメッセージおよび警告メッセージのみを出力 します。 5 さらに、どのファイルをアクセスしているかという 情報を出力します。 10 すべてのログ情報を出力します。 —u サーバーをユーサー user て起動します。 このオプショ 55