連載 / IJN Ⅸ知恵袋ー⑩ Ghostscript で VFlib を使うにはパッチが必要です。 さらに日本語 PDF 文書を表示させるために、 VFlib 対応 の Ghostscript に日本語 PDF パッチを当てます。ます 次のファイルを用意しましよう。 ・ ghostscript-5.10. tar. gz ・ gs5. IO-vflib-1.6. tar. gz ・ gs5.10- jpdf -0.2.1. tar. gz ・ jpegsrc. v6b. tar. gz ・ libpng-l. 0.3. tar. gz ・ z ⅱ b ー 1.1.3. tar. gz 表 1 からも分かるように、それぞれ、 Ghostscript 本 体、 VFIib 対応バッチ、日本語 PDF 対応パッチ、 JPEG ライプラリ、 PNG ライプラリ、日鯀宿展開ライプラリです。 次に、 Ghostscript がリンクする画像ライプラリと、圧 . / gs5.10 ー jpdf ー 0.2.1 / gs5.10 ー jpdf ー 0.2.1. diff $ patch —pl く - . / gs5 . 10 ー vflib ー 1 . 6 / gs5 . 10 ー vflib ー 1 . 6 . diff $ patch —pl く - cd gs5.10 zcat gs5.10—jpdf—O.2.1. tar ・ gz ー tar xf zcat gs5. lO¯vf1ib—1.6. tar ・ gz ー tar xf zcat ghostscript—5.10. tar ・ gz ー tar xf ます、 Ghostscript ( ン、ツチを当てます。 展開ライプラリのソースを Ghostscript のソース・ディ $ zcat . / zlib ー 1 . 1 . 3. tar. gz ー tar xf $ zcat . /libpng—l. 0.3. tar. gz ー tar xf $ zcat ・ /jpegsrc. v6b. tar. gz ー tar xf $ cd Ghostscript のソース・ディレクトリ レクトリに展開します。 114 GCC を使う場合 ・ gcc-head. mak 非 ANSI C コンパイラを使う場合 ・ cc-head. mak GCC 以タ ) ANSI C コンパイラを使う場合 ・ ansihead. mak 以下のいすれかになります。 す。 UNIX の場合、編集しなければならないファイルは ません。自分でコンパイル前の設定をする必要がありま Ghostscript には configure スクリプトが伺属してい 図 8 VFIib ライプラリ名彦正 $ (ADDMOD) kfvflib —lib VF1ib2 $(ADDMOD) kfvflib —ps kfvflib $ (ADDMOD) kfvflib —oper zkfVF1ib $(SETMOD) kfvflib $ (kfvflib—) kfvflib . dev: $(kfvflib—) kfvflib_=zkfvflib. $(OBJ) Kanj i Font (VF1ib) UNIX MAGAZINE 1999.7 ストールしているなら、ソースを颶刑する必要はありません。 ださい。こクメ昜合、 PNG ライプラリとⅱ第展開ライプラリをすでにイン きます。立ファイルのコメントに書かれている指示に従って言してく 5 PNG ライプラリと日展開ライプラリは共有ライプラリを使うこともで これを実行します。 tar-cat というサホート・スクリフトが付属しているので、 最後に、変更した設定項目を makefile に反映させます。 $ 1 Ⅱ -s unix—gcc. mak makefile ← GCC の場合 $ ln —s unix—cc . mak makefile ← 非 ANSI C の場合 $ 1 Ⅱ -s unixansi . mak makefile ← ANSI C の場合 ます。 いるので、環境に合わせてシンポリック・リンクを作り 非 ANSI C コンパイラ用、 GCC 用の芻制彡が用意されて 次に、 makefile を作ります。 ANSI C コンパイラ用、 イスを利用する場合に追加する。 Ghostscript の出力デバイスの指定。特殊な出力デバ ・ DEVICE-DEVSn gz を使う場合は zlib -1.1.3 。 日第展開ライプラリのディレクトリ名。 zlib ー 1.1.3. tar. ・ ZSRCDIR gz を使う場合は libpng ー 1.0.3 。 PNG ライプラリのディレクトリ名。 libpng-l. 0.3. tar. ・ PSRCDIR . gz を使う場合は jpeg-6b0 JPEG ライプラリのディレクトリ名。 jpegsrc. v6b. tar ・ JSRCDIR インストールする場所。デフォルトは /usr/localo ・ prefix いでしよっ ムに合わせて変更してください。次の変数を変更す川まよ これらのファイルで定義されている値を、自分のシステ
スがあれ ( 対商してくれます。その後、 testparm は入力 待ちの状態で一イ舸亭止します。 連載 / UN Ⅸの玉手箱ー・ こでリターンキーを押す レクトリ (/var/spool/samba) と、セクション work で す。さきほどの設定例の場合、プリンタ用のスプール・ディ 作成し、ディレクトリのパーミッションを石忍しておきま 最後に、 smb. c 。 nf て指定したディレクトリがなけれは たときにはかならすチェックしておきましよう。 る程度まで防げるので、とくに初めて smb. conf を作成し あります。しかし、単純なケアレスミスは testparm であ してみたり、彳あする smbclient コマンドを使う必要が す。重川信忍には実際に Windows マシンからアクセス からの要求を意図どおりに処理するかどうかは別の間題で ラーは起こりませんが、これらのデーモンがクライアント すれば、 smbd や nmbd が smb. conf を読み込む際に工 まではチェックしてくれません。 testparm でチェック ただし、 testparm はパラメータの値か正しいかどうか 1 帯長を出力して終了します。 conf に日当のないパラメータのデフォルト値も含む設疋 と、定義されているすべてのセクションについて、 smb. 1777 /var/spool/samba /var/spool/samba 指定したディレクトリを以下のように作っておきます。 bash# ■ bash# chmod 1777 /work bash# mkdir /work bash# chmod bash# mkdir UNIX MAGAZINE 1999.7 刷データはいったん samba のスプール・ディレクトリに サーバーカ甘是供するプリンタに印植腰求があった場合、印 ディレクトリとは異なります。クライアントから samba 溜めておく場所であり、 lpr や lpd か利用するスプール・ は、クライアントから送られてきた印刷データを一判勺に なお、 smb. conf で指定するスプール・ディレクトリ す石忍しておきましよう。 ら利用できなくなるので、ディレクトリの作砌にかなら クトリのパーミッションカ墹違っているとクライアントか たとえ smb. c 。 nf の言当主が正しくても、これらのディレ ことかできなくなります。 ビットをオンにしておけば、他人のファイルを勝手に消す ミッションの値を 777 にセットします。さらに、 sticky をもっすべてのユーサーか書き込めるようにするため、パ これらのディレクトリは samba サーバーにアカウント ファイルとして置かオそれから smbd デーモンが lpr コ マンドを実行します。したがって、プリンタごとに samba のスフ。ール・ディレクトリを分ける必要はありません。 デーモンの起動 ディレクトリも含めた設定力鮗ったら、 nmbd および smbd デーモンを起動します。起測イ士方としては、デー モンモードて夫行する去と、 inetd 経由で実行するガ去 の 2 通りがあります。 デーモンモードで起ける場合は、 -D オプションを付 けて実行します。すると、プログラムは標準入出力 ( およ ひ驃準ェラー出力 ) から切り離さバックグラウンド・ プロセスとしてシステムに常駐します。 たとえば、テストのためにコマンド行から手動で起動す る場合は以下のように実行します。 bash# nmbd —D bash# smbd —D bash# ロ それぞれのプロセス ID が /usr/local/samba/var locks/{nmbd,smbd}. pid に記録されるので、デーモン を終了させるときは次のように実行します ( 誌面の都合 上で折り返しています。以ード同様 ) 。 また、これらのデーモンに SIGHUP シグナルを送ると ( cat /usr/local/samba/var/locks/smbd. pid' ( cat /usr/local/samba/var/locks/nmbd. pid' bash# k 土 11 bash# bash# ki11 -HUP" を実行しても、そ窈点てま行中の子プロセスには変史 12 smbd はアクセスごとに子プロセスを生成して処理をおこないますが、 fi /usr/local/samba/bin/smbd —D /usr/local/samba/bin/nmbd —D echO ) samba servers' if [ —f /usr/local/samba/lib/smb. conf ] ; then # samba local の最後に以下のような行を追加しておきます。 マシンのプート時に自重加勺に起動したければ、 /etc/rc. 映させることができます 12 -HUP" を実行すれば、デーモンを再起動世すに変更を反 conf を書き換えた場合はこれらのデーモンに対して、、 kill 成正ファイルを読み込みなおします。したがって、 smb. が一郊央されません。 61
使い方 リスト 1 のパッチを当てた plug-gw は、 TCP 接続の 宛先 IP アドレスを調べ、それに従って次のように重川し ます。ただし、 -ssl オプションを指定したルールに該当 する plug-gw の場合は、透顳勺な接続をおこないません。 1. 自ホストの IP アドレスである場合 -plug-to オプションの引数に指定されている計算機 に接続する。 2. 他ホストの IP アドレスである場合 TCP 接続の宛先 IP アドレスの計算機に ( 透過的に ) 接続する。 その他の乍は、透過機能のない plug-gw とい膕です。 本来、 plug-gw は一定の制限のもとで使用すべきです。 しかし、 plug-gw を j 茴機能に対応させると、すべての計 算機への中継か許可されてしまいます。したがって、透茴 機能に対応した plug-gw を使用する場合は、 -dest オプ ションを付けて接続の中継先を制限することを強くお勧め します。 たとえは、ファイアウォールの外側に 2 つの NetNews サーノヾー ( ホスト名は newsl. doubutsu. co. jp と news2. doubutsu. co. (p) があり、これらのサーバーへの接続を ファイアウォール内部のユーサーに許可するときは、次 のようなルールを netperm-table に言当すればよいでし よっ。 plug-gw: port nntp 192.168.255. * 52 ( しらさき・ひろお ) くできたプログラム・ファイルをインストールします。 gw を再コンパイルします。コンパイルカ鮗ったら、新し 末尾のリスト 1 のパッチを plug-gw. c に当て、 plug- パッチを当てる することをお勧めします。 かどうかを再確認し、さらに、彳のガ去で中継先を制限 plug-gw を透過機能に対応させる場合は、本当に必要 ファイアウォールでは防げません。 そのまま中継するので、不正なデータが送り込まれても、 かし、前述のように plug-gw は通信の内容を角斤せすに に ) 通信内容のデータにある程度の制限がかかります。し ロキシー・サーバーならは、 ( 通信の内容を解釈するため トだけ筒抜けになってしまうおそれがあります。専用プ えてしまい、アクセス缶衂カリかなくなると、特定のポー 書き間違えたり、タイプミスなどによってルールを書き換 せるのはお勧めできません。 netperm-table のルールを とくに必要もないのに、 plug-gw を透過機能に対応さ 透過機能 とすることができます。 nntp : port any のように起動した場合、 netperm-table には、 plug-gw nntp plug-gw —daemon nntp nntp 前で言当することかできます。つまり、 ラム識別名を plug-gw ではなく、 service に指定した名 引数 service を指定すると、 netperm-table のフログ —exec /usr/local/etc/plug—gw nntp netacl—nntp : permit—hosts ん os れ佖 7 れ e = 〉 て起動する場合は引数として nntp ' を指定します。 します。たとえは、上記の例の plug-gw を netacl 経由 /etc/services に登録されたサービス名または数字を言当 ポートのサーピス名や番号を指定します。 service には、 みつけることができません。そこで、引数 service で 調べられないため、 netperm-table から自分のルールを 自分がどのようなポートを受け付けるサーバーなのかを inetd や netacl 経由で起動した場合、 plug-gw は news2. doubutsu ・ co ・ jp } -dest { newsl . doubutsu ・ co. JP - —plug-to newsl . doubutsu ・ co ・ jp できます。ファイアウォール・ホストを指定した場合は、 る箇所に newsl と news2 のどちらかを指定することが ースリーダー・プログラムのサーバーのホスト名を設定す この場合、ファイアウォール内部のユーサーは、ニュ 次回は、ログの設定について説明します。 今月の竹喋はここまでです。 ☆ newsl ー材妾続されます。 UNIX MAGAZINE 1999.7
ディスク I/O 性能 ディスク I/O 関連の性能のうち、バンド幅は iozone と Bonnie て引・測できる。 今回の言れ則では、 UNIX MAGAZINE 1999.7 性能 - E 限となる。ディスク I/O 性能の誌則条件の設定に ウェアの実際の速度 ( ヘッドシーク速度、書込み速度 ) が 史新 / 実データ更新 ) が同期的に更新されるため、ハード 果である。この場合、すべてのディスク I/O ( メタデータ 性育旨氏下は、 sync オプションの未を考えれば当然の結 したがって、上記のような sync オプション指定時の 的である。 示しており、データ更新については非同期であるのカイ殳 、、同期 / 非同期 " はメタデータ更新における同期 / 非同期を キストか明らかでなく誤解を招くと思われる。通常状態の という説明を目にすることがあるが、これだけではコンテ Linux は非同期、 FreeBSD は同期だから Linux が速い 2 つの作業がおこなわれる。ときどき、 と呼ばれる管珊、帯に部分の更新と、実際のデータの更新の めたように、ディスク書込み操作では、、メタデータ更新 " こで簡単に説明しておこう。表 11 ( 23 ページ ) にまと sync オプションについて、誤解か広まっているため、 などか観測できる。 I/O 性能は極度に低下する ・明示的に sync オプションを指定した場合、ディスク ライバのチューニングによる効果が大きいと思われる ) 環境でも OS ごとに稼重加か変動するため、デバイスド ・ DMA を利用した場合の CPU 下力率は低くなる ( 同一 る。たとえは、 それぞれのオプションの有無による挙動の変化などが分か これらの計測結果から、 ードウェアの特匪、および に掲載した測定結果 ) 。 における言測結果か得られた ( 19 ページ表 6 ~ 9 、 6 月号 の言 t 算機、 3 不鶤頁の OS の組合であるため、多数の場合 の組合をにより言則した。また則工竟としては、 2 不頁 ・ファイルシステムに関するオプション 有無 ) デバイスドライバに関するオプション (DMA 転送の 3 PC UN Ⅸのヘンチマーク 、、明示的な sync オフションイ寸加 " がなかったため、 Linux 2.2.5 の言測値しか掲載していないが、 NetBSD 1.4 や FreeBSD 3.1 でも同様の性育氏下がみられる。 一方、 FreeBSD の softupdates オプションや、 async オプションの効果は、今回のべンチマーク結果でははっき りとはみられない。これは、今回のべンチマークク剞生と して、これらのオプションか i). 保を囎軍する操作 ( 激しい メタデータ操作 ) をおこなっていないからである。 このように、オプションによっても変重肋ゞあまりみられ ない項目がいくつかあることから、さらに幅広い場面を想 定した測定が必要であることも分かる。 メモリアクセス性能 メモリ性能については、以下のシステム要素がある。 ードウェア構成 ( キャッシュ、メモリ、バス・アー キテクチャ ) ・カーネル ( 仮想記應管理システム ) ・ユーサーコード ( メモリ操作ライプラリ ) 今回の言測では、メモリアクセス性能に関連しているの は lmbench の以下の項目である。 ・ローカル通信のレイテンシ ・ローカル通信のバンド幅 ・ファイルと VM のレイテンシ ・メモリレイテンシ これらがどのシステム要素に関係しているかを十分に理 解しなければ、結果は分析できない。たとえば、ローカ ル通信バンド幅 (bw-mem) では、メモリ操作ライプラリ (bcopy 、 bzero) の使用の有無による変イゞ上交できる。 表 17 に、テストマシン 1 における各 OS ごとの lm - bench の結果をまとめた。 メモリ性能の測定を目的としないべンチマークでも、メ モリ性能の景受けることは多い。 多くの PCUNIX では、ディスクアクセスの効率を向 上させるために、イ瓦想記憶管理の機能と協調重川乍する統合 ファイルシステムをもっている。ファイルへの言売み書き は、メモリ上のディスク・キャッシュを通しておこなわ れる。 iozone や Bonnie などのディスク I/O 性能を言れ則す るべンチマークでは、ディスク・キャッシュ : コ乂まる大き 29
連載 128 ワークステーションのおと 坂下秀 前回の補足 先月号で、 UNIX MAGAZINE 1999.7 ンターフェイスに接続して使います ( 写真 2 ) 。内部的に ・携帯電話インターフェイスは、本本横にある FDD イ フェイスは使えません。 は、ネットワーク・インターフェイスと VGA インター へん危険です。また、ヾッテリーを装着した状態で ので、物刻長バッテリーを装着したまま持ち運ぶのはたい のです。しかも、本体との接続部うゞそれほど強くない そうです。本体のスマートさにくらべでなんとも大きい と思います ( 写真 1 ) 。 実物を見て、可能なら本体に取り付けてみたはうがいい 買いに行こ」と思うかもしれません。しかし、買う前に 短時間しか使えなくて困っていた人は、「ほな、明日、 が、長バッテリーを付けると 6 噸弱になります。 ・内蔵バッテリーだけでは 1 時間半ほどしかもちません で、使ってみた感想を書いておきます。 拡張バッテリーと携帯電話インターフェイスが届いたの というノート PC を紹介しました。その後注文していた もう 1 つ、シャーフ。のメビウス PJ プラック (PC-PJ2) 不具合は出ていません。 の後も CPU のファンを外して使っていますが、とくに というメールをいただきました。たしかにそのようで、そ いますか」 「そんなもんやから、気にせんと使わはったらええんちゃ と書いたところ、何人かの読者の方から、 ところが、 LinuxTft うと 35 ~ 40 度ぐらいにしかなら のままにしておくと CPU の温度が 55 度くらいになる。 「 PC の CPU のファンを外した場合、 BIOS の設定画面 写真 1 写真 2 写真 3 なんとも大きい拡張パッテリー 携帯舌を とれてしまった蓋 はシリアルポートに接続されているようにみえるので、 PC カードとくらべて抜き挿しの手間がかかりません。 小さくて軽いのもいいですね。 残念ながら矢可斤もあります。 FDD インターフェイスを 覆う蓋をなくしやすいのです。携帯電話インターフェイ スを使う場合には、もちろん蓋を開けています。そんな とき、蓋がどこかに引っかかってとれてしまうのです ( 写真 3 ) 。このサイズのノート PC は外出先で使う機 会が多いので、このようなところも改良してほしいもの です。 全般によくできているとはどいますが、そのぶんどうし 129
ク 3 PC UN Ⅸのヘンチマ て性能か劇的に矼 E することもあるため、サポートの有無 メモリレイテンシ、パンド幅 も評価対象になる。 メモリアクセス時のレイテンシおよびバンド幅は、ハー ドウェアによるメモリ・サプシステムの構成に依存する。 ファイ ) レシステム性肯皀 山もの PC では、メモリ階層が多段になったシステム ファイルシステムに関する性能は、 OS の 2 次記憶サ が一ヨ殳的であり、キャッシュの挙動によってさまざまな ポートのうち上位 ()S 寄り ) の部分の性能である。 場合がある。たとえば、ある階層のキャッシュのヒット / ソフトウェア的な景グ礬か大きいため、ファイルシステム ミスが発生すると、メモリのさらに奧の階層の遅いメモリ に関する性能評価は、そのファイルシステムて提供される に対するアクセスが発生するため、レイテンシおよびバン 機能や実現アルゴリズムを謝面することになる。 ド幅生能が 1 ~ 2 桁悪くなる。 こで評価される機能としては、 したがって、システムのメモリ帯域といった場合は、あ ・安全性 る使用場面を想定したイ瓦想的なメモリアクセス・パターン を実行した際の平均的帯域を孑ーことが多い。 ハードウェア的なキャッシュの挙動については、 の 2 つがある。これらは互いに相反する要素で、 OS 言 のポリシーが色農く反映される部分でもある。 ・メインメモリの生能 ファイルシステムの速度についての性能を評価するに ・チップセットの性能 は、提供されているオフションのいくつかを試してみると 置換アルゴリズムの処理生能 よい。結果の分析により、有意義な情幸師碍られるかもし など、 CPU やチップセットによるところが大きいため、 れないからである。 ードウェアの匪能として扱う。 カーネルか闕与・するほかのサプシステムと同様、カーネ lmbench などでは、、、アクセス量 " や、、アドレスのス ルのはかの部分との里を理解しなけれは正確な分析はで トライド " を変えたさまざまなパターンで言れ則することで、 きない。たとえば、バッフア・キャッシュとイ瓦想記慮な ある範囲におけるメモリアクセスに関する動向かオ当屋でき どの煢力によって、ファイルアクセスの速度か変化する場 る。したがって、最初の足がかりとしてはきわめて有用で 合などがある。 ある。 メモリアクセス性能 lmbench におけるメモリレイテンシは、 メモリ・サプシステムの性能は、大きく分けて、 ・アドレスの連続するメモリ領域を確保 ・ストライド何変 ) 分離されたアドレスへのアクセスの ・ OS のメモリ管理樹冓 ( 佖想記慮樹冓 ) 区し ・ハードウェアの性能 によって測定 (lat-mem-rd. c) される。また、 lmbench によって決定される。 のバンド幅 : 則定のメモリアクセス・パターンを表 16 に示 また、性能孑票としては、 す。 ・レイテンシ : メモリアクセスに伺髄する遅延要素 ・バンド幅 : メモリからのデータストリームの量 こでは扱わなかったが、はかにも、演算性能、各種デ の 2 つがある。 バイスドライバの生能などか引側封象となる。 べンチマークの結果は、これらの組合を反映したもの ハードウェアからて抽象イゞ進む上位層になればな になる。したがって、目的の要素を示す部分を抽出する必 るはど、かかわる要素の数は増加するため、べンチマーク 要がある。 の対象および結果に対する綿密な謝面が必要となる。 たとえば、演算匪能を調則する場合には、 そ也 27 UNIX MAGAZINE 1999.7
, けつま 3 びっ u ド たりすると、通信代はかさむ、ノート PC の電池は減る、 メールの取得に時間がかかっていらいらする、と何もいい ことはありません。しかも、そうやって届くメールの大半 は緊急性のないメーリングリストからのものなので、よけ ( もり・ゆずこ ) 師匠に相談してみると、 せん。 ふだん使っているメールスプールにメールが配送されま いにむなしくなったりします。 外出先でメールを読む場合 ( 現在 ) 外出先で読みたいメールとは、 大事なメール 緊急生の高いメール 124 れるのですが、それではあとで返信などがあったときに、 From: アドレスをプロバイダのものにすれば送ってく い設定になっているようです。 として、 From: のアドレスが自系目レトの場合はリレーしな プロバイダの SMTP サーバーは、 SPAM メール対策 になってしまうのです。 前述した電子メールをリレーしてくれない症状と同じ状態 て、 SMTP サーバーをプロバイダのものにしておくと、 Config の設定で、アドレスをふだんのサイトのままにし きに困ったのは、 SMTP サーバーの定でした。 広ノート PC の OS をインストールしなおしたと くに悩むこともありません。 契約しているプロバイダのものを指定します。これは、と サーバーを設定しなければなりません。 POP サーバーは、 の SMTP サーバー、電子メールを受け取るための POP 上記のようなノート PC では、電子メールを送るため SMTP サーパー、 POP サーバー は、機会を改めてお話ししたいと思います。 というアプリケーションを利用しています。言岩田について できます。メールの転送とフィルタリングには、 procmail することで、読みたいメールの占める割合をかなり大きく をフィルタで間引いてから中幻することにしました 緊急生の低いメール 重要ではないメール らないので、明示的に指定することは困難です。 です。しかし、このようなメールはどこからくるのカ吩か 「ふだん自宅で使っている SMTP サーバーを利用すれは いい」 とアドバイスされました。たしかに、 POP サーバーと SMTP サーバーが同じサイトにある必要はありません。 アドバイスに従い、自宅の SMTP サーバーの設疋をすこ し変更しました 8 。それから自サイトの SMTP サーバー を利用するようにしてメールを送ると、問題なく醋され るようになりました。 SMTP サーノヾーや POP サーノヾーの設定って、思っ ていたより融通か利くものなんだなあと去も丘は感じていま す。 ☆ 今回は、コマンドの話題と、 Emacs で電子メールを利 に関係する話題を中心にとりあげるつもりです。 用するための設定について書きました。次回も、 UNIX MAGAZINE 1999.7 たのでした。ちょっとインチキかもしれません。 8 自うそのとき使っている IP アドレスからだけはリレーできるようにし
などがこれに相当します。これらは、見たところは識別子 とまったく同しです。ですから、識別子だと思って安じ、 してはいけません。さらに、 d 。がキーワードだとすると、 done はどう判断すればいいのでしようか。キーワード do と識別子 ne に分けるか、あるいは done という識別子だ と判断するかの 2 通りか考えられます。キーワードを処理 するときは、どう処理すべきかを十分に考える必要があり ます。 記号には、 = や十などの単純なものもあれば、く = や ー > といった複数の文字からなるものもあります。 1 文字 の記号はその文字自身の値をトークンの値として扱えます が、複数の文字からなる記号の場合には、かならすトーク ンとして定義された値を使わなければなりません。前回の 例のように、複数の記号を 1 つのトークンに割り当てるこ ともあるので注意が必喫です。 数値の解析 数値を角財斤するときは、前回 yylex 関数を用いておこ なったような処理をします。ここでは、実数 ( 小点を含 んだ数値の並び ) も処理できるようにしてみました。 while (isdigit(c = getchar() ) ) { 1 . 0 ; dO goto exitpoint ; if ( c ! = } while (isdigit(c = getchar()) ) ; d = d * 10 . 0 + do { d = 0 . 0 ; if (isdigit(c)) { c = getchar() ; (double) (c UNIX MAGAZINE 1999.7 作っています。たとえは、 1.03 の 3 という文字を読み込 の値に読み込んだ文字カ俵す数を掛けることで目的の値を 現在処理している桁に対応した値を d0 としコ尉寺し、そ 半では、小数部分の処理をおこなっています。ここでは、 分の処理です。ここは前回とあまり変わっていません。後 字であれば数値としての処理に入ります。前半は、整数部 このコードでは、ます c に文字を読み込み、そ刎直か数 return NUMBER ; yylval. val = d; ungetc(), stdin) ; exitpoint : プログラミング・テクニック んだ場合、 d0 は 0.01 になっています。この値と文字が 表す 3 を掛け、すでに 1.0 となっている d に足して 1.03 という値を得ます。 この関数は完璧ではありません。たとえは、 0 から始ま る 010 のような数値に対してこの関数を使うと値は 10 に なります。ところが、 0 から始まる直は UNIX では標 勺に 8 進数として解釈されるため、 010 は 8 になりま す。この処理を : 見するには、 : 麪頁が 0 か否かて場合分け をしなければなりません。 さらに、小数部分の最後が 0 で終っている 1.20 のよ うな値、あるいは 1. のように ( ドット ) で終る値を 許さない場合には、関数はさらに複雑になります。とく 、 1. を許さないときは複雑な処理が必要です。という 、、 . " を読んだだけでは、処理を続けるべきなのか、 のは、 それともそこまでの数値を返すべきなのかが分からないか らです。ドットに加えてさらに 1 文字を読み、それが数 値でなければ初めて値を返すことができます。しかし、 の段階ではすでに 2 文字を読み込んでいるため、 ungetc では対応できません (ungetc では、ストリームには 1 文 字しか戻せないからです ) 。 キーワードの解析 今度は、いろいろなキーワードを処理する例をみてみま しよう。キーワードとして、 while 、 do 、 done の 3 つを 扱います。文字列の処理では、さきはどのように 1 文字す つ読むのでは煩雑になります。ます、入力の行がバッファ に入っているものとしてプログラムを考えます。 文字列の上交というとます strcmp 関数が思い浮かびま すが、この場合には使えません。文字列はバッフアに入っ ているので上罅交はできますが、上交するのは行のなかの一 部であり、目的とする単語の後ろにほかの文字がつながっ ている場合があるからです。したがって、 0 ) return WHILE; if (strcmp("while" , buf) のようにしただけでは、 while に続く文字があると正しく みつけられません。 この間題を角夬するには、 strncmp を用いて文字列を 上交します。ただし、この場合にはキーワードを処理する 順番が重要です。 do と done がありますが、 do をさきに チェックすると、 d 。 ne の場合にも d 。であるとみなして 135
介した去では括弧などの一部の文字しか利用していませ んが、構文角斤器が入力の誤りを検出できるようにするた めに、このような規則がよく使われます。 規則部の地頁に次のような規則を置くこともよくおこな われます。 / * eat up * / [ \t] これは、空白やタブを読み込んだ場合にはアクションと しては何もしない、つまり、すぐに次の入力の角斤にとり かかることを意味しています。この規則を頁に置いてお けは、結果的に空白とタブを空白文字として無見できるよ この字句解析器の規則をもうすこし編集してみましょ うになります。 #include #include く stdlib . h> ツ . t ab. h" { yylval. tok { yylval. tok [ 1 ー 9 ] [ 0 ー 9 ] * 0 *yytext ; *yytext; return ADD MUL ; } return *yytext ; yylval . val = strtod(yytext , return NUMBER ; NULL) ; 今度は、十と一の規則がまとめられています。則記の例 のようにわざわざ別々のパターンとして指定しなくても、 同しアクションであればこのように正規表現としてまとめ ることができます。 * と / は、これとは別のガ去でまとめ ています。こちらは * のアクションとして一だけを指定し、 次のパターンのものと同しアクションであると指定してい ます。結果として、 * と / は同しアクションを利用するこ とになります。 数値を扱う規則でも同じアクションを用いていますが、 整数としてはおかしい 01 などの入力を受け付けないよう にパターンを変えています。さらに、小数点を含む数列 にも対応できるように変更しています。 138 バターンマッチの規則 こで、パターンマッチがどのようにおこなわれるかを 説明しておきましよう。 複数のパターンカ甘旨定されたときには、 1 つの文字列が 複数のパターンにあてはまることがあります。この場合、 その文字列と一致する部分がもっとも長いパターンとマッ チしたと角物 ( されます。したがって、パターンとして、 do done の 2 つのキーワードカ甘旨定されていて、文字列が d 。 ne の UNIX MAGAZINE 1999.7 次か識別子の文字でなけれはキーワード do を読み込んだ 様に処理します。。であ川まキーワード d 。の一甫なので、 の文字が。か否かか調べられます。。でなけれは最初と同 み込んで識別子である旨を返します。 d であるときは、次 れは識別子ですから、識別子の終りがくるまて繰り返し読 ます、最初の文字が d か否かか調べられます。 d でなけ 場合、どんなトークンかは図 2 のように決められます。 あとは識別・子となるような規則を考えてみましよう。この 話を簡単にするため、キーワードは do と done のみ、 にしておきます。 文字に一一 - 一致する規則を加えてこの処理か起動されないよう 常は標準出力への出力は避けたはうがいいので、任意の 1 に出力さ次の文字から再隻処理カ髞り返されます。通 一致するパターンがなかったら、 : 頁の文字かオ票準出力 きだけ識別子と一致するようにしておく必要があります。 をさきに言己し、そのなかのいずれにも一数しなかったと ワードと識別子があるような場合は、かならすキーワード ものと一 -- ・致することになっています。したがって、キー 字です。このようなときは、規則のなかでさきに書かれた 場合には、 done も識別子も一致する文字列の長さは 4 文 文字列が入力された場合にはどうなるのでしようか。この それでは、一屬己の 3 つのパターンがあり、 done という 含む識別子も正しく角斤できます。 ちらのパターンとマッチします。このため、キーワードを などがあると、 doned という文字列は d 。 ne ではなく、こ [a-zA-Z] Ca-zA-ZO-9] * ンとして、 場合には、 done と一致します。さらに、識別子のパター
連載 / IJN Ⅸの玉手箱ー・ 表 2 おもなサービス・パラメータ パラメータ名 browseable comment create mask directory mask guest account guest 0k read list valid users write list writeable hide dot files hosts allow hosts deny path printable 型 わ 0 司 stT 、 str str str 600Z 60 司 str str s 行、 stT 、 str str str 60 司 クライアントで samba サーバーのサーピス一覧を表示する際、 ファイル作ー ) マスク値 セクションで定義されたサーピスに対するコメント サーピス名をみせるかどうか path でオ旨定したディレクトリを書込み可能で提信い - るかどうか 書込みを許可するユーサーのリスト アクセスを許可するユーザーのリスト 書込みを許可しないユーサーのリスト レクトリに印刷したいファイルを書き込めるかどうか サーピスカワ。リンタである場合、クライアントがスプール・ディ 場合はスプール・ディレクトリク色対パス サービスがファイルの場合は提供するディレクトリ、プリンタの アクセスを拒否するユーサーのリスト アクセスを拒否するクライアントのリスト てのクライアントかアクセス可能 アクセスを許可するクライアントのリスト。省略した場合はすべ ントにみせる 名前がドットで始まるファイルを隠しファイルとしてクライア たユーサーになる か。 yes にした場合、アクセス権限は guest account てオ定し パスワード・チェックなしでサーピスにアクセスできるかどう guest ok 刎直を yes にした場合のアカウント名 ディレクトリ作成時のマスク値 yes ( なし ) 0744 0755 nobody ( コンノヾイル時に変ー更可 ) yes ( なし ) ( なし ) ( なし ) ( なし ) デフォルト値 ( なし ) ( なし ) ( なし ) したがって、 /etc/printcap ファイルをどこかにコピー し、クライアントに提供したいプリンタのエントリ以外 の部分は削除してそのファイルをパラメータで指定すれ は、 samba サ→ヾーて利用可能なプリンタの一部だけ を提供することもできます。 以 E のように、ホーム・ディレクトリとプリンタに関し てはそれぞれ homes および printers セクションでまと めて言殳定できるため、ホーム・ディレクトリ以外のディレ クトリを提供する場合にのみ、ディレクトリごとに異なる セクションを定義すオ L ばいいでしよう。 これらのセクションで指定できるパラメータにはさま ざまなものがあります。なかには、まったく同し制御を おこなうのに複数のパラメータ名が使えたり、正反対の意 味をもつパラメータが使えるものがあります。たとえば、 ディレクトリに対する書込みを制御するには、 writeable 、 writable 、 write ok というまったく同し意味をもつ 3 つ のパラメータと、これらとは反対の未をもつ read only というパラメータがあります。したがって、書込みを許可 する場合は以下の 4 通りの記主去があります。 UNIX MAGAZINE 1999.7 writeable = yes writable = yes write Ok = yes read 0 Ⅱ 1y = no 59 10 空白を含む文才 : 列であっても、引用符などても必要はありません。 ータはかなりの数になります。パラメータは、 global セ メータを考慮に入れても、 smb. conf で指定できるパラメ これら、、同義語 " 的なパラメータや、、反対語 " 的なパラ ずれか 1 つに統一して言当主するはうがよいでしよう。 くなります。したがって、パラメータ名喇直の書き方はい 題はありませんが、設定ファイルを石忍する際にややこし これらの書き方を混在させても設定自体が正しけれは問 ます。 述するのに 4 x 3 = 12 通りの書き方かできることになり 書込み制御用のパラメータは 2 値型なので、同し設定を記 0 / 1 、 true/false という 3 不鶤頁があります。さきはどの ます。 2 値型のパラメータでは、値の書き方に yes/no 、 定します 10 。もう 1 つは 2 値型で、オン / オフを指定し ことができます。 1 つは文字列型で、値として文字列を指 さらに、パラメータは値の不鶤頁によって 2 つに分ける