連載 スタイルファイル活用法 罫線で囲む 岩熊哲夫 / 古川徹生 数回にわたり図表の作成に役立っスタイルファイルを紹 介してきましたが、その締めくくりとして段落や図、ペー ジ全体を罫線て悃む去について説明します。 図や表と本文とのあいだには、 \floatsep などのパラ メータで設定されたスペースが入りますが、文字だけから なる図表の場合は本文との境目カ坏明確になりがちです。 そのようなときにも、罫線で囲むと見やすくなります。 段落を罫線で囲む 段落の周囲を罫線で囲む場合、 \fbox の引数に page 竟を指定する去か考えられます。 \fbox{\begin{small} \begin{minipage}{ .8\1inewidth} \parindentlzw \begin{center}\large\bf 招待状 \end{center} みんな、元気ぃ ? 私も元気だよー 恒例の「元気パーティー」を開くからねっ ! 待ってるよーん C) ちょ。 気パーティー」を開くからねっ ! すえったいに来て みんな、元気ぃ ? 私も元気だよー。恒例の「元 招待状 \end{small}} \end{minipage} す { ぇ } { っ } たいに来てちょ。 138 ・場所 : 元気会館 2 階大元気の間 ・日時 : 1995 年 2 月 28 日 ( 火 ) Ⅱ 11n ト 例を見れは分かるように、 minipage 竟のなかでは改 段も可能 1 ですし、 itemize のようなリスト工竟も使えま す。しかし、 verbatim 竟や \verb コマンドてオ朱記 号を入力することができないので、プログラム・リストな どを罫線で囲む場合には不便です。 いくつかのスタイルファイルでは、 verbatim 環境など を用いた段落の処理も可能です。その 1 づが、 boxit ・ sty です。使い方は簡単で、 \begin{boxit} \end{boxit} とするだけです。罫線ポックスの幅は、 \linewidth に なります。文書と罫線とのあいだにはスペースがはとんど 入らないので、とくに日本語の場合は中身を minipage 環 境で括ったり、 \vspace や \vskip コマンドで調整する 必要があります。簡単な例を示します。 \begin{boxit} \vspace{. 5\base1ineskip} \begin{minipage}{ .9\1inewidth} 異星人は、 鋭い声で「 \verb + ー*ド%$#! ! + 」と誰何した。 私が笑いながら「 \verb + /\/\/\/\/\/\ + 」と答えると、 目をつりあげた彼は「 \verb ハ / ー \/ ー \/ ー \ 川」と 叫びながら突進してきた。 \end{minipage} \vspace{ .5\base1ineskip} \end{boxit} 1 ただし、デフォルトで ( 殳落の先頭の字ードげはおこなわれません。こオ功ゞ 必要な場合は、 minipage 稾竟のなかで \parindent lem のように指 定します。 UNIX MAGAZINE 1995.2
連載 7 5 ワークステーションのおと インターネット 坂下秀 たいていはなんとか意を伝えあうことかできます。最悪 の場合、 ( 相手によっては失礼かもしれませんか ) キーワ ードとなる名詞と take 、 put 、 get 、 make 、 set などの 万育垢司を並べれはなんとかなります ( ほんまかいな ) 。 電子メールは、菫加旁先か販売しているソフトウェア製品 のサポートでも威力を発揮します。 FAX や電話での対応 には、すこし間題がありました。 FAX の出力は紙ですし、 電話の声は録音でもしないかぎりどこにも残らないので、 サポート履歴の参照や検索、管理が大仕事です。これらを 電子化すれば、つまり履歴をファイルにしておけば、上交 的簡単に参照できます。 しかし、電話によるサポートでは、担当者か計算機に入 力する必要があります。 FAX で送られてきた画面のハー ドコピーを参照したい場合は、そのたびに保管されている 場所まで足を運び、ごそごそとページをめくらなければな りません。ーヨ殳に、 FAX で送られてきたハードコピーは、 つぶれて見にくいという点もあります。 サポートに必要なソースコードの受渡しにも手間がかか ります。さすがに電話で読みあげることはありませんが、 FAX で送ってもらったとしても、最悪の場合は担当者が 入力してテストしなけ川まなりません。これではあまりに も非能率的なので、たいていはテーフ。やフロッピーで送っ てもらいます。しかし、手許に届くまでに 1 日以 - ヒかかっ てしまいます。 電子メールでサポートができるのなら、これらの間題の かなりの部分が鮹夬できます。事実、勤務先では電子メー ルによる製品サポートを始めてからたいへん便利になりま した。残念ながら、すべてを電子メールでというわけには いきません。電子メールによるサポートは、割合でいえば 全体の 1 割弱という感じでしようか。ただし、ちょっと 困った点もあります。それは、相手の顔が見えないこと です。どう表現すれは・いいのかよく分かりませんが、電子 メールだけでは情報が足りないように思います。電話でも コンピュータに関する丘の流行語といえば、、、インタ ーネット " でしようか。コンピュータ関連の志だけでは なく、新聞の 1 面の見出しにまで登場するようになりまし た。幇や雑誌を読むと、インターネットはなんだかすご く派手で、ものすごい機能があるように書かれています。 たしかに、そのような一面もありますが、私にとってはど ちらかというとたいへんイ甦リな道具という感しです。 では、どこカイ更利なのでしようか。インターネットでは さまざまなサービスカ甘是供されていますが、和よく使う のは電子メールです。とくに、商用サーピスカ鯛始されて 以来、電子メールは仕事のうえでなくてはならならないも のになりました。なかでも、海タ P ) 糸との ; 叫各には重宝 しています。勤務先では、米国のソフトウェア会社が開発 した製品を日本言ヒして販売しています。その関係で開発 元の人たちと叫各をとる機会が多いのですが、そのときに は電子メールをおもに使っています。 FAX や電話という 手段もありますが、私も含めて多くの人にとっては言葉の 壁か高く、また時差の間題もあって、電話での連絡はなか なか困難です。とくに数か難関で、たとえは IOMB を つい「じゅーめがばいと」とロ走ってしまいます。 FAX ならこのような間題はありませんが、送受信は紙をベース にせざるを得ないので再利用喇呆存が面倒です。 電子メールを使えば、、、しゅーめがばいと " 問題も起こ らす、再利用や保存も自由自在です。それに、気の利いた 孑対なども、相手のメールのなかから取り出してちょっと 書き換えれは、気分はすっかり、、ネイテイプ・スピーカー です。もう 1 つ、英言韶 ) 電子メールを送るときは、当然で すが煩わしいかな漢字変換カ坏要です。初めて英語で電子 メールを出したときは、あらためてキーポードの偉大さを 感じました ( えらいおおげさやなぁ ) 。 とにかく、電子メールなら、 ( 技術的な内容であれ UNIX MAGAZINE 1995.2 75
ビットマッフ・フォントとは、方目慮氏のマス目を 1 つ 1 つ塗り潰して文字を描いたものと思えばよいでしよう。た とえば、 X の bdf ファイルや pcf ファイルがこれにあた ります。 ピットマッフ・フォントは、とにかく点 ( ドット ) を 1 っすっ打っていけばいいので、フォントに関する匁 ] 第ルア、 ほとんどない人でもそれらしきものを簡単に作れます。必 要なのは、デサインのセンスと日り、根気でしよう。作成 中に状態を見ながら作れるのか楽ですれ しかし、一ヨ殳にビットマッフ・フォントは 16 ドット 用、 18 ドット用、 24 ドット用・・ とそれぞれ専用の ドット数のフォントファイルを必要とします。ですから、 同しデザインのフォントでも、複数のファイルをディスク にオ絲タしなけれはなりません。 それに、拡大・縮小すると汚くなります。これがビット マップ・フォントの最大の弱点です。 X を使っている人は、 この、、汚さ " を日々痛感しているのではないでしようか。 これに対しべクトルフォントは、点ではなく線で文字を 作ります。文字を描くためにどの点 (control point : 制 御点 ) を通るか、その点を結ぶのは直線か曲線か、曲線な ら張り具合いはどれくらいなのか・ このようなデー タをもつフォントをベクトルフォントといいます。 、、アウトライン・フォント " はべクトルフォントの一種で、 文字の縁を描くための直線と曲線データをもっています。 そのデータをもとに専用のフログラムを使って文字の縁を 描き、内部を塗り潰して ( 白抜き文字のときは塗り潰さす に ) ピットマッフ・データに変換します。 アウトライン・フォントは文字の縁のデータでしたが、 こオ LJ ユ外にもペンの太さとその形、そのペンをどう動かす かというデータをもつべクトルフォントもあります。 べクトルフォントで極端に小さい文字を表示させる場合 を考えてみます。たとえば、 12 ドットのような小さなフォ ントのとき、ビットマップ・フォントでは 12 ドットで も読めるようにデサインしますが、べクトルフォントでは 文字が潰れて読めなくなってしまいます。ただし、べクト ルフォントのなかには修正清報 ( ヒント情報とも呼ぶ ) を もっていたり、小さい文字用のアルゴリズムを用いてこれ らの間題を回避するものもあります。 べクトルフォントでは、制御点を動かして形 (shape) の違うフォントを作ることカそきます。拡大・縮小・回転 UNIX MAGAZINE 1995.2 METAFONT の遊び方 1 行列演算などを用いて新しい制御点の位置を算出し、その 点どうしを消課か曲線で結べば、変杉フォントか簡単に作 れます。同様に、傾斜文字もちょっとした引算だけで容易 に作成できます。 きれいなピットマップ・フォントが必要な場合は、サイ ズごとにファイルを用意しなければなりません。一方、 クトルフォントでは、デサインごとにフォントファイルが 1 つあれ ( 1 算による変形処理が可能なので、ビットマッ プ・フォントのようなディスクの無馬置いが防げます。 べクトルフォントのビットマッフ・フォントへの変換 を、、ラスタライズ " といい、そのためのプログラムをラス タライサと呼びます。ラスタライズには膨大な言 t 算が必要 です。非力なマシンだと処理に日判肋ゞかかるかもしれませ んが、去も匠の CPU は一ト分に速いので気にするはどではな いでしよう。 ビットマップ・フォントは、点を並べるだけでフォン トになります。しかしべクトルフォントは、慣れないう ちは、 ・制征卩点の配置 ・曲線の張り具合 を決めるのか難しいのです。慣オ LiL は簡単だという人もい ますが、それまでの道のりは平坦ではありません 2 。 フォントによっては便利なフォントエデイタカ硬えるも のもあるようですが、すくなくとも M ETR FONT は大変 です。とくに、曲糸 ) 張り具合は徴妙な値を試イ告誤て決 めなければなりません。私が METRFONT でフォントを 作るときは、いつも「めんどくさ、これでええわ」と適当 なところで妥協してしまいます。ときどき、「 Computer Modern フォントは汚い」という声を耳にしますが、私 はこれほど手間のかかる仕事を成し遂げた Knuth 先生を 尊敬してしまいます。 画面て市忍しながらべクトルフォントを作成できれはい いのですが、私の場合はウインドウ上でデサインすると、 どうもおかしな形になってしまいます。慣れれはきれい に描けるのかもしれませんが、それまでに何カ月かかるや 。やはり、素人は方眼紙にフォントを描き、制御 ら・・ 点の座標を拾うのが一番のようです。 2 村に小さなフォントや大きなフォントを作る場合は、べクトルフォン トのほうか楽かもしれません。 147
連載 /UNIX Communication Notes 図 1 メールサーパーを作らずに電子メールを運用する場合 ( ムカ ) 「山口さんは学生さんて若いからそんなこと言えるんかも しれませんが、そんなちゃちなもんで仕事に使えると思て もろたら困りますな。そんなもんより、いま現実に使うて る電話と FAX を高機能化したはうがええんとちがいます ( ムカ、ムカ ) 「まあ、山口さんにはもっとほかの通イ謝支術の勉強もして もらわんといけませんなあ。 JUNET みたいなもんをやっ ておっても、未来は暗いですなあ」 ( もお、ほっといてくれ ) あれから 8 年がたった。当時から現在にいたるまで、ど 電子メールと分散環境 のような変イ起きただろうか。 山も広コンピュータ業界の人からもらう名刺には、 た 最近の環境構築では、 Ethernet や FDDI といった いてい電子メールアドレスか書かれている。ほかの業界で LAN 竟を前提とするのが当然になっている。 1 つのド も、電子メールで ; 叫各のつく人がかなり多い。大学では、 メインに属する LAN 竟での電子メールの運用を考えた 各種の通知やレポート窈是出、重委員会の議事録の回覧 場合、その実現方法研鶤頁かある。 など、すべて電子メールでおこなわれるようになった。物 品を購入する場合も、ます見積書がメールで送らその メールサーバーを作らない 後押印された囓顳が宅配便や郵便て届くことも珍しくな もっとも簡単ではあるが、莫が大きくなってくると い。さらに、学会関連の各不叫各にも電子メールか利用さ 苦労するのが、メールサーバーを作らすに電子メールを運 れ、メーリング・リストでさまざまな言侖がおこなわれる 用するガ去である。どの言 t 算機からもはかのドメインとの ようにもなった。 NIFTY-Serve などのパソコン通信に接 メールの交換ができるようにし、サーバー的なものはとく 続されている人たちとも電子メールが交換できるようにな に用意しない。 り、ますます使いやすくなってきた。この記事の原稿にし 図 1 を見てもらいたい。 ドメイン f00. co ・ jp に、 3 台の ても、電子メールて編集部に送っている。 t. 算機 A 、 B 、 C があったとする。そして、すべての計 利用形態についても、 MIME というマルチメディア・ 算機上て、 sendmail か家動し、ローカルにスプールを管理 データを扱うための拡張とともに大きく変貎しようとして しているとする。 いる。たとえば、写真や絵の入った電子メールは日常的に この場合のユーザーのアドレスは、一ヨ殳に なってきたし、音声を含むメールを受け取ることも珍しく user@A.f00.co. JP もはや、電子メールのない舌は考えられない。そのよ のように、計算機名を含む形式で言己される。 うに夫感している読者も多いにちがいない。 user@foo.co. JP つい先日、大判罸にの先生と食事をしたときに、 8 年前 の研究会のときに筆者に檄を飛ばした方に会われたと聞い のように言 t 算機名を含まないメールアドレスを使いたいと た。さきはど紹介したエピソードに触れたところ、 「今回 きは、 f00. co ・ jp. の MX レコードとして、言算機 A— の会合の予定は電子メールで調整していたんやけど、〇〇 C のいすれかを指定するようにしなけれは・ならない。つま さんなあ、『電子メールははんまにイ叫リですなあ。 り、このアドレスが付いたメールは、特定の言算機に集め うちの 若いもんにも、積極的に使わなあかんてハッパかけとるん るように設定する。 SMTP MTP ですわ』って、言うとったで」ということであった。 まさしく、「昔は昔、今は今」である。 一三ロ 46 UNIX MAGAZINE 1995.2
連載 / 転ばぬ先のセキュリティー⑩ 段階 3 はそんなに時間がかかりませんが、段階 4 は場 合によっては SPARCstation 2 などで 2 日ぐらいかか ることもあります。 Crack は、段階 4 からバックグラウ ンドて夫行されるので、段階 4 に入ったらログアウトして もかまいません。 Crack の言求ファイルは、 $crack に out で始まるファ イル名として作成されます。図 8 をパスワード・ファイ ルに指定した場合の実行結果を図 9 に示します。 Guessed で始まる行を見てください。 pass 1 で kazu のパスワー ドが名則の kazuhiko 、 pass 2 で hidenori のノ、スワード カ陣語 password であることカ甘隹測されています。 Crack は、実行されるとフィードバック・ファイルを作ります。 次に Crack を実行するとこのフィードバック・ファイル を読み込み、以前孑則できたにもかかわらすパスワードを 変えていないユーザーを表示します。また、パスワードの 変更があった人だけを対象に孑則をおこなうので、実行に かかる時間か減少します。 このよ引ンヾスワードカ甘隹測できたユーザーには、でき るだけ早くしかも丁寧に、パスワードの変更を促したほう がよいでしよう。 Crack は、ユーサーの権限で実行できま す。ですから、管理者が Crack を実行する前にユーザー か実行している可能陸もあるので注意してください。その 場合には、めんどうですがすべてのユーサー ( ンヾスワード の変更を促すべきです。管理者は、日常の仕事として月に 1 回程度は Crack を実行し、パスワードをチェックした ほうがよいと思います。はじめて Crack を使用したとき は、経験的にいうと 1 割から 2 割のユーサーのパスワー ドカ甘則できます。のちほど説明するな去て辞書を増やす と、この割合は大きくなっていきます。 NIS 、 NFS 、 FTP 、 TFTP などで、ノヾスワード・ファ イルを盗んでいくクラッカーは、 Crack などを利用して攻 撃先の系目織のアカウントを手に入れる場合があります。管 理者は、パスワード・ファイルか盜まれないように気をつ けるとともに、万が一盗られても、 Crack で ( 対リできな い適切なパスワードをユーザーに使ってもらうよう努力す べきです。 これまで説明してきたように、 UNIX のパスワードは 辞書攻撃に弱いため、丘の UNIX では影のパスワード (shadow password) を用いて、パスワード・エントリを ひらがな / カタカナをローマ字に直します。今回は、 コードには JIS を使うとよいでしよう ) 。 ます、第 1 カラムだけを awk で取り出します ( 日本語 して使用できませんが、以下のような手段があります。 があったとしましよう。このままでは、 Crack の辞書と にひらがなやカタカナで人名か第己されている辞書 x-dic たとえば、 1 行か複数のエントリからなり、第 1 カラム れらの辞書の利用が可能です。 リーの辞書がたくさん出回っています。 Crack では、 れも甘い考えです。たとえば、アイドルなどの日本言韶 ) フ から、ローマ字なら安全だと思う人がいるでしようが、そ Crack では、標準で英語の辞書しか利用しません。です % head 2 x—dic みほ美穂 ざーど ZARD % nkf -j x-dic ー awk —e % head 2 f00 みほ ざーど '{print $ 1 } ' > f00 ー殳ューサーに見せません。 130 kakasi というプログラムを利用してみますにのプログ ラムのインストールは簡単ですから省略します ) 。 % kakasi —iJis —Ha —Ka く f00 > bar % head 2 bar miho za¯do 複数あるエントリを 1 つにまとめます。 % sort bar ー uniq > baz kakasi の変換で、気に入らないところがあれば、 sed な どで加工します。 kakasi では、カタカナの、、 ( 長音符 ( ハイフン ) —dic—crack /—/g' baz > x—dic—crack に変換されますので、これを Z a—dO miho % head 2 x % sed 's/\A に変えます。 号 ) が UNIX MAGAZINE 1995.2 から、 Crack を実行します。 Crack のソースを展開しなおし、ます辞書をコピーして 推測をおこなうようになります。うまくいかない場合は、 消し、ふたたび Crack を実行すれは、この辞書を用いて して、 $CrackSrc/Dicts/bigdict . Z , . lockfile を できあがったファイルを $ CrackSrc に置きます。そ
図 3 Line descipline による実装 PPP IP ppp line switch /ppp if 手への発呼カ鮗了して相丁イ則の PPP を起動することかで きた日点で、 tty を PPP 用の処理ルーチン (line desci- pline) に付け変えてしまいます。ここでは通常の端末入出 力の処理の代わりに、 ppp のフレームの処理がおこなわ れるようになっています。 受信した PPP のフレームが IP データグラムを運ん でいる場合には、 PPP 用のネットワーク・インターフェ イスを介して IP の処理に引き渡されます。それ以外のフ レームの場合には、その tty を read しているユーサープ ロセスである ppp ソフトウェアに引き渡されます。した がって、 LCP や IPCP のバケットはユーサープロセス て処理されることになるわけです。 同様に送信の場合は、 LCP や IPCP のバケットは PPP ソフトウェアが tty に write することにより、 PPP 用の処理ルーチンに入り ppp のフレームが組み立てら れたあと、実際のデバイスへと送出されます。 IP 層から PPP インターフェイスに出力されたバケットも同しルー チンを通ってフレーム化され出力されます。 NetBSD/FreeBSD に付属する PPP は、この方式で 実装されています。 Sun 用の dp や PPP-2.1 は、 line descipline の代わりに stream を使っていますが、基本 的なイはみは同しです。 一方、トンネルデバイスを使う方式 ( 図 4 ) では、トン ネルデバイスというイ瓦想デバイス (/dev/tun) を使って ネットワーク・インターフェイス (tun (f) とのやりとり をおこないます。 トンネルデバイスは IP 層との切口をイ反想デバイスとし て提供するメカニズムです。図に示したように /dev/tun tty device 38 図 4 トンネルデパイスによる実装 PPP tty device IP tun dev / tun if に書き込まれた IP データグラムは、 tun if を介してカー ネルか読み出すことかできます。逆に、カーネルの IP 層 から tunif に送出された IP データグラムは、 IP データグ ラムの形式で /dev/tun からユーザープロセスか読み出せ ます。このデバイスを利用すると、 IP データグラムを任意 の形式にカプセル化して既存のデバイスとのあいだでやり とりすることが可能になります。これを開発した Julian Onion は、 IP データグラムを X. 25 にカプセル化し、パ ケット網を利用した IP 接続に利用していたようです。 のように、 IP バケットを別のバケットでカプセル化する ことにより既存の網のなかにもぐり込ませる ( トンネリン グ ) のに利用できるということが、このデバイスのネー ングのゆえんです。 この方式を PPP に利用した場合は、 tty から受信した PPP のフレームはユーザープロセスである PPP プロセ スによって処理されます。そして、 IP データグラムを運ん でいる場合はトンネルデバイスを介して IP の処理に引き 渡されます。逆に IP 層から出力された IP データグラム は、トンネルテンヾイスを介して読み出され PPP のフレー ムとして組み立てられてから tty デバイスに書き出されま す。 LCP や IPCP のバケットの場合には、 IP 層に引き 渡されすに PPP プロセスが自分で処理してしまいます。 この方式では、バケットの不頁にかかわらすすべての処 理はユーサープロセスである PPP ソフトウェアによって おこなわれます。 IP データグラムを送受信する場合でも、 かならすューザープロセスとカーネルとのあいだを往き来 してしまうのでオーバヘッドが生しますが、すべてをユー サープロセスで処理しているために、ソフトウェアの開発 やデバックか谷易であるという利点があります。 Morning star Technologies (MST) の PPP や IIJ-PPP は、 の方式で実装されています。 UNIX MAGAZINE 1995.2
連載 / インターネットの不堋と仕組みー② 図 2 多段の proxy サー′く一 図 3 ファイアウォールを用いたインターネット 犬 0 ロ 尾 wa 〃 図 4 ネットワーク例 インターネットから見えるのは 1 段目のサ→ヾーだけ。 httpd proxy 、 delegate などがありますが、それぞれ実 物「彡態は異なります。共通している点は、 proxy サ→ヾー を利用した場合、アクセスを受けた側のコンピュータには pr 。 xy サーバーか川乍するコンピュータからのアクセスと ロ ロ ロ ロ ロ して見え、ユーサーカ躾際に利用しているコンピュータが 分からないことです ( 図 1 ) 。このため、アクセスを受ける 側で統言などをとる際に問題となります。これは、 proxy ケーションをとれるように設定できます。こオ功ゞファイア サーバーが Dual Homed Gateway などのファイアウ ウォール ( 図 3 ) の技術で、現在提供されているインター ォールの彳割をはたしているかどうかとは物係です。 ネット・サービスにはこの仕組みに相当するものがあり また、 WWW では漢字コードを変換するために dele- ます。 gate がよく使用されます。プロバイダの用意する公開さ ダイヤルアップ IP サーピスは、大半はこの形態に相 れた delegate を利用したり、 CERN httpd を使用して 当します。 IIJ のダイヤルアップ IP サーピスをはじめと キャッシュをおこない、さらに多段のキャッシュ・サーバー して、インターネット接続用のコンピュータだけか接続で を設定した場合などには、実際のユーサーか誰かというこ きます。ューザヨ則ネットワークの糸登剳青報は流さないの とカ竕かりにくくなります ( 図 2 ) 。 で、ユーサー側の LAN からはインターネットとの直接 このような設定は、悪用されてルータによる IP アドレ のやりとりはできません。この形態では重加勺な IP アドレ スのアクセス缶卩の抜け道にもなりかねません。 Proxy サ スを割り当てることで、接続するマシンそれぞれにあらか ーバーを設定する場合には、そのサーバーへのアクセスを しめ IP アドレスを割り当てる必要がなく、運用が非常に ー午す囲をよく考える必要があります。 楽になります。もちろん、これはアドレスの節約にもなり ます。 1 つのホストだけにしかインターネットへのアクセスを 許していない場合は、 proxy サーバーを利用して LAN な このサービスの場合でも、ダイヤルアップ IP を利用す どにつながるコンピュータがインターネットとコミュニ るホストで proxy サーバーを動力せば、 LAN に接続され 59 UNIX MAGAZINE 1995.2
LJN Ⅸ流プログラミング 52 リスト 2 ファイル一覧表示プログラム ( その 2 ) #include く stdio . h> #include く fcntl . > #include く sys/types . 五 > #include く sys/dir. h> if ((fd ー long u_short int int char char main( ) exit(l); fprintf (stderr, "Can 't open . \ Ⅱ " ) ; open(" . ” , O-RDONLY)) く 0 ) { bas e ; d_reclen; retval ; fd; buf [BUFSIZ] ; d-reclen = * (u—short *)p; p + = sizeof (u-long) ; while (p く buf + retval) { p = buf ; exit(l); perror("getdirentries") ; if (retval く 0 ) { while (retval = getdirentries(fd, buf , BUFSIZ, &base)) { p + = sizeof (u—short) + sizeof (u—short) ; printf("%s\n", p) ; p = q + d-reclen; exit(0) ; / * NOTREACHED * / には、直前の dnamlen て示される長さの文字列と、そ の文字列を終端する文字だけか骼納されています。 次の要素を参照する場合は、ディレクトリを直接見て いたときと同様に、 d-reclen の値を用います。都合の よいことに、 getdirentries ではある要素の途中までを 読み込むことはありません。ふたたび getdirentries を おこなったときに、すぐ次の要素を読み込める位置に移 動されています。 言葉の説明だけではよく分からないでしようから、実 際のプログラムを紹介します。リスト 2 のプログラムは、 リスト 1 と同様にカレントディレクトリにあるファイル の一覧を出力します。リスト 2 の長さはリスト 1 とあま り変わりませんが、どのディレクトリに対しても使えま す。ヘッダファイルがみつからす、リスト 1 を実行でき なかったという人も、こちらならは実行できるでしよう。 リスト 2 のプログラムでは、 read システムコールを 使ってすこしすっ読み込んでいたものを、 getdirentries でまとめて読んでいる点を除けば、リスト 1 のプログラ UNIX MAGAZINE 1995.2 ムとさほど変わりません。ただし、 1 つだけ注意しては しいことがあります。 d-reclen の値をとるために d—reclen = *(u—short *)p; としている部分です。以前 ( 1993 年 6 ~ 9 月号 ) 紹介し た lint プログラムを使って調べてみると、システムのな かにはこの代入文で警告が発せられるものがあるかもし れません。これは、 p の値によっては右辺の詔面中にバ スエラーを起こしてしまうからです。たとえば、 short 型の値を得る場合に、 p の値が偶数となっていないと正 しく動作しないマシンがあります。このようなマシンの 場合は、 p が奇数のときにバスエラーとなります。 こで挙げたプログラムでは問題なく動作すると思い ますが、しつは、このような代入は p に対応する値を確 実に把握している場合以外はあまり勧められません。不 u_Short us ; char c [ 2 ] ; union { 安な場合は、 179
表 1 Predictor による圧縮の効果 接続去Ⅱなし日第あり 非同期 38.4K 3.7 KB/s 6.1 KB/s 11.0 KB/s 同期 64K 7.5 KB/s ので、両者を上交することでフィルタが正しく設定されて とるトレースにはフィルタがかかる前か後かの違いがある う。しかしながら、 PPP でとるトレースと tcpdump で 対応しているので、 tcpdump を使ったほうカイ更利でしょ 上はトンネルテンヾイスが bpf (Berkley Packet Filter) に バケットの角励皀力は簡単なものでしかありません。実用 グファイルに書き出す機能も用意されています。しかし、 同様にデバッグ用として、 IP バケットのトレースを口 も許さないようになっています。 ていますが、外からのアクセスに対しては telnet も ftp へのアクセスとして telnet 、 ftp の利用を許すようになっ ケットは自由に通れるようになります。また、こ刎列は外 ことはできませんが、いったん接続してしまえは ping パ 含め ICMP バケットをきっかけとして自重加勺に平する いるかを石忍できます。 データ圧能 42 カーネルのなかに組み込まねばなりませんが、本実装の場 Line descipline を使った実装では圧宿をおこなうには トがさらに圧縮されて送られることになります。 ヘッ夘宿カリ用できる場合にはヘッ夘丑宿されたバケッ る RTT もバケットの長さカくなるのてま旨さ TCP バケット本を圧縮します。そのため、 ping で言欟リされ データ圧縮機能はネットワーク層のプロトコルとは独立に ットに対しては効果がありませんでしたが、 CCP カう ヘッタ部分だけを ) 丑宿するもので、 UDP や ICMP バケ TCP のヘッダ圧縮 ()J 圧縮 ) は TCP バケットの いのではないかと思います。 使った場合の数字です。 V. 42bis が使える場合の保は薄 を表 1 に示しておきます。これらはいすれも ISDNTA を 利用してテキストファイルを仕 p て沖幻医して得られた数字 に処理できる利点があります。実際に Predictor 圧縮を ムが単純でしかも公開されているために実装か容易で高速 はおよそ 1.5 : 1 とさほど優れてはいませんが、アルゴリズ dictor-l をサポートしています。 Predictor の圧縮効率 データ圧縮機能としては、さきにも名前を挙げた Pre- 合にはすべてをユーサープロセスて処理しています。した がって、実装も簡単にできました。圧縮機能はデフォル トでは有効となるように設定されていますが、実際には CCP か相手側が Predictor-1 を利用可能であるかどう かを調べにいくので、相引則がこの機能をもっていなけれ は物はおこないません。 同期式 64K で続 UNIX MAGAZINE 1995.2 ような点で非同期で利用する際との違いカ吽します。 には同期式のインターフェイスの利用にともない、以下の り、 PPP の使用が可能になります。しかしながら、実際 の部分を N2 に置き換えて考えることができます。つま キャラクタデバイスとして扱えるのならは、図 4 の tty しています。 ラクタデバイスとしてポードを扱うようにドライバを変更 し、著者の場合は自分の PPP のコードを使うためにキャ イヤリングに対応するという解決法も考えられます。しか ングはできません。適当な ioctl をドライバに j 助日してダ 接続する場合にはこれでも問題はありませんが、ダイヤリ たしかに、 BSD/386 に付属の PPP を使って専用線で ク・インターフェイスとして用意されているにすぎません。 はドライバがサポートされているといっても、ネットワー の PC-LINK/TA を接続しています。 BSD/386 の場合 RISCom/N2 を利用し、 RS232C でこのポードと沖電気 ライバがサポートされている SDL Communication の 著者は UNIX として BSD/386 を使用しているので、ド 次に期式のインターフェイスが UN Ⅸ側に必要です。 いるので HDLC お尺しておきます。 PPP はそもそも HDLC に準拠したフレー去を利用して のフレームのフォーマット窈旨定という項目もあります。 す。 TA 側の設定にはダイヤリング・コマンドの送受の際 期 / 同期を DIP スイッチで尺できるようになっていま ます TA ですが、ほとんどの欟重は通信方式として非同 している竟を紹介します。 する必要が生します。ここでは、現在筆者かま馬剱勺に使用 合には同期式のインターフェイスを用いて UNIX と接続 は 38.4Kbps が通信速度の上限です。 64K を使いたい場 ISDN TA で非同期インターフェイスを使った場合に
UN Ⅸ流プログラミング 52 リスト 3 ファイル一覧表示プログラム ( その 3 ) #include #include #include #include #include main ( ) く stdio . h> く fcntl . h> く sys/types . h> く unistd . h> く sys/dirent . > char char i nt i nt off_t buf [BUFSIZ] ; fd; retval ; d_off; , O-RDONLY)) くの { if ((fd = open(" fprintf (stderr, "Can't open . \ がつ ; exit(l); while (retval = getdents(fd, buf , BUFSIZ) ) { if (retval く 0 ) { perror("getdents") ; exit(l); p = buf ; d_off p + = sizeof(off—t) + sizeof (u—long) ; p + = sizeof(u—short) + sizeof (u—short) ; printf("%s\n", p) ; lseek(fd, d—0ff , SEEK—SET) ; exit(O) ; / * NOTREACHED * / ら連想すれはそれぞれの役割はおは、ろげながら見当がつ くでしよう。 opendir は、はかの 5 つの関数を使うために最初にお こなわなければならない処理です。ファイルを扱うとき に、ます最初に実行しなければならない fopen 関数と同 様なものと考えてください。引数には、調べたいディレ クトリを文字列で指定します。 fopen ではファイル・ス トリームへのホインタを返しましたが、叩 endir はディ レクトリ・ストリームへのポインタを返します。ここで は、ディレクトリ・ストリームへのポインタを、、ディレ クトリ・ポインタ " と呼ぶことにしましよう。 ディレクトリ・ストリームは /usr/include/dirent . h で定義されていて、 DIR という型をもっています。っ まり、 opendir が返す値は DIR * という型になります。 このディレクトリ・ストリームには、現在注目している 位置などの情報が含まれています。これもファイル・ス トリームとまったく同しですね。もし、指定したディレ クトリを正しくオープンできなかった場合には、 NULL が返されます。 readdir は、引数にディレクトリ・ポインタをとりま UNIX MAGAZINE 1995.2 す。そして、現在注目している場所から 1 つのディレ クトリに関する情報を読み取り、それを構造体 dirent こで作られる 型の値へのポインタとして返します。 構造体 dirent 型の領域は関数のなかで自動的に作られ るので、使用する側で作成しておく必要はありません。 構造体 dirent 型は、 getdents システムコールにより 得られるものと同様です。つまり、 d-off 、 d-fileno 、 d-reclen 、 d-namlen 、 d-name の要素から構成されて います。ディレクトリの内容を正しく読み出せなかった 場合は、 readdir は NULL を返します。また、ディレ クトリの最後まで読み込んで、これ以上読み出せない場 合にも NULL を返します。この 2 つを区別するには、 readdir を実行する前に errno の値を 0 にしておきま す。もし readdir が NULL を返したときに ク ) 値が 0 のままならば、ディレクトリを最後まで読み込ん だことを示し、 0 以外 (EBADF) であれば工ラーが起 こっています。 telldir は、現在注目している位置を得るための関数で す。引数には、やはりディレクトリ・ポインタを指定し ます。一方 seekdir は、 telldir により得られた値を用い 181