場合 - みる会図書館


検索対象: UNIX MAGAZINE 2004年12月号
121件見つかりました。

1. UNIX MAGAZINE 2004年12月号

for 文の本体を実行します。設疋ファイルでは、サーバー などの仕様を複数並べてできるので、 こでは 1 つの 仕様をそれぞれチェックすることになります。 for 文の本体では、ます先頭のトークンが EXCEPT で はないことを確認しています。 EXCEPT であれは構文と して誤りなので、この場合にはマッチしなかったことを示 す NO という値を返します。 if (STR_EQ(tok, "EXCEPT") ) return (NO) ; 先頭が EXCEPT でなければ、みつけたトークンを第 3 引数で指定された関数に渡し、要求と一致しているかを調 べます。 if (match—fn(tok, request) ) { この関数が真となるのはトークンと要求が一致している ときなので、この場合には EXCEPT トークンがみつかる か、すべての文字列を処理するまでトークンを読み飛ばし ます。 while ((tok = strtok((char * ) 0 , sep)) & & STR_NE (tok , "EXCEPT" ) ) / * VOID * / ここに到達したときに t 。 k が 0 になるのは、すべての文 字列の処理が終った場合なので、関数として真を返します。 一方、 EXCEPT がみつかったために while ループを 抜けるときには、 list-match 関数を再帰的に呼び出して、 EXCEPT 以下の部分が - ー - ・致するかどうかを調べます。 致する場合には全体を偽とし、一致しない場合には全体を 真としなければならないので、一致していない ( 関数が 0 を返した ) ときに自分自身は真を返せるような式となって います。 return (tOk 0 Ⅱ list-match((char * ) 0 , 疇 - request , match—fn) また、最初の for 文ですべてを処理してしまった場合な どは、一致しなかったと判断しなければなりません。その ため、関数の値としては NO を返しています。 再帰呼出しの際には、第 1 引数に文字列を指定していな い点に注意してください。なんとなくおかしな気がします が、これはなかなかよくできています。第 1 引数に NULL が指定された状態で呼び出されると、最初の for 文の実行時 にも直前の strtok 関数呼出しの場所の次の場所からトー UN 工 X MAGAZINE 2004. 12 プログラミング・テクニック : 99 server_match 関数 調べます。後者の場合はデーモン名とホスト名が、、@" で か、デーモン名とホスト名の両方が指定されているのかを この関数では、まずデーモン名だけが指定されているの struct request—info *request ; *tok; char static int server—match(tok, request) を表す request-info 構造体へのポインタを指定します。 マッチを検査する文字列が第 1 引数で、第 2 引数には要求 引数は、 list-match 関数から呼び出される形式と同様、 とマッチするかを検査するためのものです。 の関数は、文字列をサーバーに関する言とみなし、要求 すときに引数として渡される server-match 関数です。 次は、 table-match 関数から list-match 関数を呼び出 利用していても問題は発生しません。 イプラリ側 ) で保持できるため、別の場所で同様な関数を 合も、途中の状態をプログラム側 ( この場合は libwrap ラ をもつ strsep 関数も利用できます。いすれを利用した場 出しのインターフェイスは若干異なりますが、同様の機能 第 3 引数として受度しするようになっています。また、呼 関数です。この関数は再入可能とするために、文脈情報を これを解決するのが、 strtok 関数とよく似た strtok-r べきです。 tok 関数のように状態をもつ関数は呼び出さないようにす 作するはずがありません。ライプラリ関数のなかでは、 str- うに変更されてしまうかもしれません。これでは正しく動 strtok 関数の呼出しによって、ほかの文写冽に注目するよ した文字列からトークンを切り出すつもりでいても、別の すると、何カ起こるでしよう。プログラムでは自分の指定 ラムのソースコードでも strtok 関数を呼び出していたと ません。たとえば、このライプラリ関数を利用するプログ 関数のなかで strtok のような関数を使うのはお勧めでき こで提供しているのはライプラリ関数です。ライプラリ ラリとして流用しているために生じる問題点があります。 この関数には、 TCP Wrappers 用のコードをライプ 図どおりの動作をすることになります。 クンを切り出した次の場所のトークンを切り出すので、意 クンを切り出すことになります。つまり、 EXCEPT トー

2. UNIX MAGAZINE 2004年12月号

文房具としての 図 11 ティスクレス文房具のカーネルに要なオプション 連載…、 08 file—system options #ident #ident tftp #tftp #comsat Starting dhcpd. NFS # Network Fi1e System client NFS_BOOT_DHCP , NFS_BOOT_BOOTPARAM 図 12 TFTP サーバーの言聢 (/etc/inetd. conf) stream tcp stream tcp6 dgram udp dgram udp6 dgram udp nowait nobody nowait nobody wait wait wait て 00t て 00t /usr/libexec/identd /usr/libexec/identd /usr/libexec/tftpd /usr/libexec/tftpd /usr/libexec/comsat # mkdir /tftpboot identd ー 1 ー 0 OTHER —e identd ー 1 ー 0 OTHER -e tftpd ー 1 —s /tftpboot tftpd ー 1 —s /tftpboot comsat なお、図 10 に DHCP サーバーの設疋ファイル /etc/ 120 い。また、このディレクトリがなければ作成しておきます。 トリです。ほかの場所にしたい場合は適宜変更してくださ boot は、 TFTP で取得できるファイルを置くディレク だけでかまいません。なお、 # を外した行の末尾の / tftp ー 有効にするのは IPv4 (udp6 ではなく、 udp のほう ) # を外して有勠にします ( 図 12 ) 。 は、 TFTP のサービスはコメントアウトされているので、 ずです。 OS インストール後の標準の /etc/inetd. conf で という設疋をおこなえば、 TFTP サーバーカ陏効になるは /etc/rc. conf で inetd を起動するようにする /etc/inetd. conf で TFTP サービスを有効にする がって、 です。 TFTP サーバーは inetd から起動されます。した ですから、起動するようにすれは設定はほとんどおしまい TFTP サーバー自体には設定ファイルはありません。 TFTP のステップに進んでください。 ルしてはいけません。コンパイルが終ったら、そのまま次 同じようにコンパイルしてください。ただし、インストー プションは図 11 のとおりです。サーバー用のカーネルと るためにサーバー用とは異なるものが必要です。必要なオ クライアント用のカーネルは、 NFS のクライアントにな クライアント・カーネル dhcpd. conf の全体を示しておきます。 これに対し、 inetd のほうはデフォルトの : 大態で起動す るようになっています。したがって、 /etc/rc. conf に以下 の行がなけれは凋題ないでしよう。 inetd=NO ただし、デフォルト値は、、その値をとくに設定しない場 合に問題が発生しないような適当な値 " です。そのため、積 極的に起動したいサービスは、デフォルト値と同じでも明 示的に定することをお勧めします。 inetd=YES それでは、 TFTP サーバーを有効にしましよう。すで に inetd か起動している場合は、さきほと畯更した言定を inetd に読み込ませるだけです。 # /etc/rc . d/inetd reload ReIoading inetd config files . 起動していない場合には、新たに起動しましよう。 # /etc/rc . d/inetd start Starting inetd. TFTP サーバーカ働き出したら、 PXE 用プートローダ と前項で作ったクライアント用のカーネルを TFTP 経由 で取得できるように、 /tftpboot ( ほかの場所に設定した 場合はそのディレクトリ ) にコピーしておきます。プート ローダは /usr/mdec にあります 7 7 mdec は、 Machine DEpendent Code" という未で、重依存コ ードカかれています。たとえは : PC/AT 互換機の場合は i386 に依存 したコードカかれています。 0 UNIX MAGAZINE 2004. 12

3. UNIX MAGAZINE 2004年12月号

文房具としての 図 8 DHCP サーバーの言綻 (PXE 対応ブートローダからのリクエストに対する部分 ) } elsif option vendor—class—identifier "NetBSD: i386 : libsa" { 連載 ~ 08 filename "tftp:netbsd" ・ } else ←図 9 の設定が続く 図 9 DHCP サーバーの言聢 ( カーネルからのリクエストに対する部分 ) } else { option root—path "/usr/exports/root " option host—name "diskless—stationery option routers 192.168.11.1 ; option broadcast—address 192.168.11.255 ; option subnet—mask 255 . 255.255.0 ; fixed-address 192 .168.11.3 ; hardware ethernet 00 : 0c : 29 : 5b: ac :bf ; host diskless—stationery { subnet 192.168.11.0 netmask 255 .255.255.0 { ddns—updates off ; ddns—update—style none ; 図 10 DHCP サーバーの言聢 (/etc/dhcpd. conf) ← NFS で提供されるルート・ディレクトリのサーバー側のパスを指定 if substring (option vendor—class—identifier, 0 , 9 ) "PXEC1ient filename pxeb00t—ia32. bint' } elsif option vendor—class—identifier "NetBSD : i386 : libsa" { option root¯path "/usr/exports/rootll } else { filename "tftp:netbsd" ・ は TFTP サーバーは指定していません。 サーバーと TFTP サーバーが同一の場合、 TFTP サーバ ーの設定は省略することができるためです。明示的に指定 する場合は、 next-server というキーワードを使って以下 のような行を追加します。 next—server 192 .168.11.2 ; これは、 DHCP るプロトコルを教える必要があるからです。なお、 TFTP TFTP と NFS の 2 つのプロトコルカ鉢リ用でき、利用す PXE 対応プートローダでは、カーネルを読み込むために 、 tftp:" という文字列カ咐いている点に注意してください。 カーネルのファイル名です ( 図 8 ) 。こではファイル名に i386:Iibsa" という文字列が含まれています。返す情報は のリクエストには vendor-class-identifier に、、 NetBSD: 2 回目のリクエストはプートローダからのものです。 じ要領で指定します。 DHCP サーバーと TFTP サーバーが異なる場合も、同 UN 工 X MAGAZINE 2004. 12 サーバーに関してはさきほどと同じように省略しています。 最後はカーネルからのリクエストです。ここでは NFS のルートノヾスを指定します ( 図 9 ) 。図では /usr/exports /root にしていますが、ほかの場所に置きたい場合は適宜 変更してください。 dhcpd. conf の設定は以上でおしまいです。サーバーを 再起動しても dhcpd が自動的に動くように、 rc. conf に以 下の行を追加しておきましよう。 dhcpd=YES dhcpd-flags="—q fxp0" dhcpd-flags で指定している fxpO は、サーバーのネッ トワーク・インターフェイスに合わせて変更してください。 追加したら dhcpd を起動します 6 。 # /etc/rc . d/dhcpd start 6 リースファイルがないために正常に起動できない場合には、 /var/db/ dhcpd. leases という空のファイルを作成してください。 119

4. UNIX MAGAZINE 2004年12月号

作系では使用しないことにしました。 8 方向定点ライブカメラ UNIX MAGAZINE 2004. 12 コロナグラフから太陽を観測した画像です ( カラーでお見 います。写真 2 は公開している乗鞍イ寸近の風景、写真 3 は では、 30 分ごとにカメラを動かし、 8 カ所の画像を更新して 作成した Web ページを図 12 に示します。このページ ジを更新します。 字列からなる画像 ) にサムネールや日付を入れ、 web ペー された no-data ・ jpgo 、、情報が届いていません " という文 ダウンロードに失敗した場合は、 livecaml. jpg ( コピー "http : //hostname/SnapJPEG ftp ー 0 1ivecam2 ・ jpg \ "http : //hostname/SnapJPEG ftp ー 0 livecaml ・ jpg \ cp no-data ・ jpg 1ivecam2 ・ jpg cp no—data ・ Jpg livecaml ・ jpg イメージとしては、次のような感じです。 ロードして処理する方法が簡便です。 る画像データを用意し、カメラからの画像を上書きダウン ロート則に、、、情報が届いていません " という文字列からな きない旨のメッセージに切り替えるべきでしよう。ダウン きないこともあります。このようなときは、画像が表示で たとえば、回線やカメラカ材く調で画像がダウンロードで です。 ポイントは、画像がダウンロードできない場合への対処 バーのディレクトリにコピーすれは完成です。 対してサムネールを作成し、日付などを入れて Web サー す。そして、ダウンロードした画像ファイル (JPEG) に 作と画像ダウンロードをプリセット地点ごとにおこないま まず、さきほど紹介したスクリプトを応用し、カメラ操 かなりおいしいシステムでしよう。 ます。 1 台のカメラで 8 方向の異なる画カ陬得できるので、 サムネールなどを作成して Web ページ上の画像を更新し とにカメラを動かし、画像をダウンロードします。そして、 今回作ったシステムでは、一定間隔でプリセット地点ご ページに反映するカメラです。 メラとは、あらかじめ言定した 8 カ所の画像を入手し、 Web 向定点ライプカメラ " を作りました。 8 方向定ライプカ カメラの操作や映像入手のプログラムを応用して、、、 8 方 国立天文台のネットワーク 6 0 6 1 9 6 Yo 。「れ壷 印下C.AM@NAO了ー 方イル ( E ) 編集仮 ) 表示お気に入りツールヘルプ 図 12 8 方向の画像を表示した、 veb ページ 戓。 [ MARI 礙Ⅱー下 NDARE ( 2873m ). NOR : 1 . A は A を第ユー Live Snapshots from Norikura solar OBS. 亟。 0 10 8 : 15 : 02 @NAOJ ー DAISEKREI 2004 / 10 / 2 15.02 @NAOJ 、。 , 200 鼾 10 / 28-1 : 02@ NO ( 人 1 み 0 n 打 AII ー 2004 / 10 / 28-15 : KX-HCM180 は屋内用カメラですが、国立天文台では 屋外で運用しています。もちろん、このような使い方は保 証対象外でしよう。山岳地帯にありますから、空気力い http://live.mtk.nao.ac.jp/norikura/Iivecam2/ せできないのカ曵念です ) 。 忘れちゃいけない太陽対策 当り前ですが、カメラで太陽を直孑最ってはいけません。 レンズを太陽に向けた状態でカメラを放置すると、最悪の 場合は CCD が焼きつく可能性があります。したがって、 太陽の通過する方向に対して、カメラを長時間向けないよ うにする工夫カ必要になります。 これも、設置場所が決まれば、太陽がどの時間にどの方 向を通過するかが分かります。その情報をもとに、その時 間帯にはカメラを長時間太陽に向けないように制御すれば よいことになります。 乗鞍の場合は、プリセット地点の 1 つが日の出方向にな っています。そこで、 cron を使って日の出の時間帯はカメ ラを太陽の方向に向けないようにし、カメラが太陽方向を 向いた場合は、 8 方向定点カメラや on-demand スクリプ トで、日の当たらない方向 ( 日の当たらないプリセット地 点 ) へ移動する処理を加えています。 話は続く 63

5. UNIX MAGAZINE 2004年12月号

図 1 ホスト名が@で始まっている場合のタ歩里 if (tok [ 0 ] #ifdef NETGROUP static char *mydomain = 0 ; if (mydomain yp-get-default—domain(&mydomain) ; return (innetgr(tok + 1 , eval—hostname(host) , tcpd—warn("netgroup support is disabled") ; #else = の され、なければ NULL が返されるので、これを使って判 ます。 @がある場合はその後ろの部分が host 変数に代入 区切られているので、 split-at 関数を使ってこれを分離し #endif return (NO) ; (char * ) 0 , mydomain) ) ; / * 取 ot tcpd-jump() * / host_match 関数 次に紹介するのは、ホスト名が一致しているかどうか 断しています。 split—at(tok + 1 , ' @ ) ) ) if ( (host return (string—match (tOk , - eval-daemon(request) ) ) ; 100 ます。 が、基本的には server-match 関数と同じものとなってい host-match のどちらを用いるかといった点が異なります 求のなかから取り出す値や、比較の際に string-match と ーザー名とホスト名を書くことになります。そのため、要 を書きますが、クライアントの場合には、ホスト名のみかユ 場合には、デーモン名のみかデーモン名とホスト名の両方 クライアントの指定方法が異なるところです。サーバーの er-match 関数との違いは、設疋ファイル内でのサーバーと かを調べる client-match 関数も定義されています。 serv- サーバーではなく、クライアントが要求と一致している request—>server) ) ; & & host—match(host , - eval—daemon(request) ) return (string—match(tok, - } else { 合にのみ真を返します。 match 関数を使って両者を調べ、両方とも一致している場 ため、 string-match 関数とホスト名の一致を調べる host- 両方が一致するかどうかを調べなければなりません。その ホスト名も含まれる場合には、ホスト名とデーモン名の 結果を返します。 関数を呼び出して文字列がデーモン名と一致するかを調べ、 求のなかからデーモン名の部分を取り出し、 string-match デーモン名だけの場合には、 eval-daemon マクロで要 を調べる host-match 関数です。この関数は、調べるホ スト名を表す文字列と、要求のなかでホストを示すための host-info 構造体へのポインタを引数にとります。 static int host—match(tok, host) char *tOk ; struct host_info *host ; 関数の本体は、設定ファイルに書かれた文字列の種類に よって場合分けをしながら、ホスト名が一 - 一致しているかを 順番に調べる構造になっています。最初はホスト名が@で 始まっている場合です。この場合には、指定されたホスト が NIS のネットグループに含まれているかどうかを調べま す ( 図 1 ) 。 ネットグループの機能を使うかどうかはマクロで制御で きるようになっていますが、この機能を使う場合には、 yp- get-default-domain 関数により NIS のドメイン名を取 得し、さらに innetgr ライプラリ関数を利用して、指定さ れたホストがネットグループに含まれているかどうかを調 べます。ネットグループの機能を使わない設定になってい る場合には、 NO を返して関数を終了します。 ホスト名の部分が、、 / " で始まる場合、実際の指定は別の ファイルに言当されていることを示します。 } else if (tokCO] return (hostfile—match(tok, host) ) ; この場合には、 hostfile-match 関数を呼び出してファ イルの中身との一致を調べます。 hostfile-match 関数は、 ファイルをオープンし、その各行ごとに host-match 関数 を呼び出すことで、ファイルの中身をすべて調べます。 ホスト名として KNOWN が指定されていれば、ホスト UN 工 X MAGAZINE 2004. 12

6. UNIX MAGAZINE 2004年12月号

図 1 パースペクテイプのカスタマイズ E'I•釦′。・ Ref•qtor 、、・当。 h き。獸。 , 面青蜘の Java ・ P t ー 0 " れ . も - す。このエデイタは、作成中の GUI をビジュアルに表 ほかに、、 Visual Editor" というエデイタが追加されま Visual Editor プラグインをインストールすると、この 波線で示すといった機能があります。 Java のキーワードを色分けで表示する、エラーを赤い は Java 工デイタや XML 工デイタが付属しており、 ファイルを編集するためのウインドウです。 Eclipse に / ヾースペクティブのカスタマイズ 示します。 には Java パースペクテイプの最後のレイアウトが表示さ パースペクテイプに切り替えたとき、 Eclipse の開発環境 したがって、次回に新しいプロジェクトを作成して Java Java パースペクテイプのカスタマイズとみなされます。 れている状態でビューの配置を変更しています。これは、 こでは、 Eclipse に Java パースペクテイプが表示さ を示しています。 ある、、 2 " というマークは、ビューが 2 つ隠れていること 重なっています。 Package Explorer ビューのタブの横に ている場所には、 Hierarchy ビューと Outline ビューが 図 1 の場合、、、 Package ExpIorer" ビューが配置され をドロップします。 向き矢印または下向き矢印が表示されているときにビュー ッグ先でビューを 2 つのウインドウに分けたい場合は、上 ンが表示されている状態でビューをドロップします。ドラ されているタフィ寸きペインの 1 つにするには、タブアイコ クしたまま目的の場所へドラッグします。同じ場所に表示 ば、ビューを起動するには、ビューのタブの部分をクリッ パースペクテイプの構成は自由に変更できます。たとえ spective ダイアログが表示されたら [OK] ボタンをクリ メニューから、、 Reset Perspective パースペクテイプをもとの状態に戻すには、 Window れます。 " を選び、 Reset Per- 158 ックします。 図 2 Java 工テイタのカスタマイズ p 「 0f0 「 en ( 25 - ) ・ 0 ーお 0 を日 0 0 気翩 4 d ・ A00 ・ 500 ) BuddPath ) Code 洫 ) Debug ・ E.dft.or Cde A 、就 M 物 0003 「” 0 ” Inst"dJREs TaskTags V 駅 E 日え 0 T ・聞 1 Ed 朮 0 「 山” Ed 代 0 「“は Ap ”第。・ s ” . 1 新一物 1 E 。旧 D ølay ・ d 上め w れ @ーー・・ き m 第朝 100 : 80 凶新 0W0 へ朝 wn ′ 凶心田 ch 物曜ト k こ新 0 立 m 第ー こ朝いあ 89k “製はを 凶ト d•c ・聞れ 0 を汚ⅳ物曲、 nckF ⅸ ve 杙引「 凶山 00 3E0 を En±le 新 & 0 第 ADP ・第 0 ・ 00 叩ーめ 0 ま P m 置 1 を 000 ・ OK A00 ん 表 1 Java 工テイタの言頁目 タブ名 Appearance ソースコードの外観 ( 行番号の表示など ) Syntax Typing Hovers ソースコードのキーワードの色分け表示など 入力麪爰 ( 開き瓜を入力したときに閉じキ刮瓜 も自動的に入力するかどうか、など ) コードの折畳み ( インポート文がいくつも続い ている場合、それらを折り畳んで非表示にす る ) Java 工テイタのカスタマイス Eclipse で Java アプリケーションを開発するときは Java 工デイタ " を使うので、作業しやすいようにカスタ マイズするとよいでしよう。これは、 Window メニュー から、、 Preferences" を選ぶと表小される Preferences ダ イアログで設疋します。 Preferences ダイアログの左のペ インで、 Java → Editor の順に展開すると、 Java 工ディ タの設疋が表示されます ( 図 2 ) 。 Java 工デイタの設疋は、 おもに表 1 に示す 4 つのタブでおこないます。 また、 Preferences ダイアログの左側にあるべインで 、、 Editor" を展開すると、、℃ ode Assist" という項目カ俵 示されます ( 図 3 ) 。 こでは、 Eclipse のコードアシスト 機能を調整します。たとえば、そのクラスで呼び出せるメ ソッドー覧の自動表示や、コードアシスト機能をアクティ UNIX MAGAZINE 2004. 12 すると、 Eclipse に VisuaI Editor プラグインをインスト ■ VisuaI Editor を使いこなすには プにするまでの待ち時間などか第できます。 ール

7. UNIX MAGAZINE 2004年12月号

文房具としての 図 14 /usr/exports/root に /etc のファイルをインストール # cd /usr/src/etc # DESTDIR=/usr/exports/root make install—etc—files create etc/MAKEDEV MACHINE=i386 MACHINE_ARCH=i386 NETBSDSRCDIR=/usr/src awk —f /usr/src/etc/MAKEDEV. awk /usr/src/et c/MAKEDEV. tmpl > MAKEDEV STRIP=/usr/src/0bj/t001dir. NetBSD—2.0G—i386/bin/i386-—netbsde1f-strip /usr/src/obj/tooldir. NetBSD— 2 .0G—i386/bin/nbinsta11 -N /usr/src/etc -c —r ー 0 て 00t —g wheel —m 444 sendmail . cf /usr/expo rts/root/etc/mail/sendmail . cf 図 15 fstab の言綻 (/usr/exports/root/etc/fstab) 192 .168.11.2 : / usr / exports / root / nfs rw 0 0 192.168.11.2 : /usr/exports/swap none swap sw,nfsmntpt=/swap 図 16 rc. conf のネ月状態 (/usr/exports/root/etc/rc. conf) # If this is not set to YES, the system wi11 drop into single—user mode . 連載 ,. 08 rc-configured=NO # Add 10Ca1 overrides below 書きしてしまうと、運用中のシステムを破壊することに なりかねないからです。今回は初期状態の / etc ( すなわ ち /usr/exports/root/etc) を構築したいので、別途イン ストールすることにします。インストールは、 /etc のソ ースが置かれた場所でおこないます ( 図 14 ) 。、、 DEST- DIR=/usr/exports/root" の部分を忘れると、サーバー の /etc カ皮壊されるので注意してください。 さきほど作ったクライアント用のカーネルも、 ( ディスク レス文房具の ) ルート・ディレクトリにコピーしておきま す。今回の設定ではカーネル自体は TFTP で取得するの で、とくにカーネルを置かなくても動きます。しかし、ユ ーザーランドのいくつかのプログラムがカーネルのファイ ルを参照することがあるため、コピーしておいたほうがい いでしよう。 # cp カーネルを作った場所 /netbsd /usr/exports/root / etc のファイルがインストールできたので、いくつか 必須となるファイルの設定をしていきましよう。最初は fstab です。このファイルはファイルシステムの構成表で、 デバイスとその種類、マウントボイントなどの対応力第杢 されています。通常はインストール時に自動的に生成され るので、編集したことがない人も多いかもしれません 8 。と 8 まったく、いし弋になりました・ 122 ころが、 /usr/exports/root 以下はインストーラでイン ストールしたわけではないので、自分で fstab を書かなけ ればなりません。今回の構成では、ルート・ファイルシス テムとスワップに関する言当があれば十分です ( 図 15 ) 。 2 行目の末尾のオプションは、スワップファイルのマウント ポイントを示しています。ほかの場所にしたい場合は変更 してください。また、このディレクトリか存在しない場合 は作成します。 # mkdir /usr/exports/root/swap # ロ こでは /swap をマウントボイントにしていますので、 root-path である /usr/exports/root の直下に swap デ ィレクトリを作成しています。なお、 swap ファイル自体 ( ここでは /usr/exports/swap) はあとで作成します。 デフォルトの ) 大態の rc. conf は、図 16 のようになって いるはすです。コメントにも書かれているとおり、 rc-con- figured が YES に設疋されていないとシングルユーザー モードに落ちるので、 YES に書き換えます。また、 wscons UNIX MAGAZ 工 NE 2004. 12 ホストのタイムゾーンを決定するのは、 /etc/localtime を有効にするために、以下の行を末尾に付け加えておくと wscons=YES いいでしよう。

8. UNIX MAGAZINE 2004年12月号

この場合には文字列の長さを調べ、その長さだけ要求か ら得た文字列と比較します。 これら以外の場合には文字列としての正確な一致を調べ ますが、 IPv6 アドレスの可能性もあるため、まずはそち らを確認します。 IPv6 アドレスであれは全体が、、「と ] で括られているはすなので、まずはそのような形式になっ ているかどうかを調べます。 strlen(tok) ; len ' [ ' & & tok[len ー 1 ] if (*tok この条件が成立する場合、設疋ファイルで指定されてい る文字列は IPv6 アドレスのはずです。アドレスとしての 構造が正しいかを確認するために、 getaddrinfo ライプラ tok[len ー 1 ] ch ; freeaddrinfo(res) ; memcpy(&pat , res->ai—addr, sizeof (pat) ) ; &res)) if ( (ret = getaddrinfo(tok + 1 , NULL, &hints , hints. ai—flags = AI-PASSIVE ー AI—NUMERICHOST; hints . ai—socktype SOCK_STREAM ; hints . ai-family = AF—INET6; memset (&hints , 0 , sizeof (hints) ) ; tok C1en ー 1 ] ch = tok[len ー 1 ] ; リ関数を使ってアドレスをバイナリ形式に変換します。 UNIX MAGAZ 工 NE 2004. 12 ていることを確認しています。 れていたら、それが要求のほうのアドレスにも同様に付い 設疋ファイルから得たアドレスにスコーフ。識別子がイ寸けら これらも等しいことを確認する必要があります。そこで、 スコーフ。識別子を用いる場合には、アドレスだけでなく addr にオ内されます。 れていたアドレスが pat に、要求から得られたアドレスが アドレス変換が成功した場合には、設疋ファイルに書か freeaddrinfo(res) ; memcpy(&addr, res¯>ai—addr, sizeof (addr) ) ; return NO ; &hints, &res) ! = 0 ) if (ret ! = 0 Ⅱ getaddrinfo(string, NULL, - 致しないことを示します。 らかの getaddrinfo が失敗した場合には NO を返し、 イナリ形式の IPv6 アドレスに変換します。ここで、どち さらに、要求から得られた文字列についても、同様にバ プログラミング・テクニック : #ifdef NI_WITHSCOPEID return NO ; pat . sin6-scope-id) addr. sin6—scope—id ! = - if (pat . sin6-scope-id ! = 0 & & #endif &addr . sin6—addr , return ( ! memcmp (&pat . sin6—addr , , し、値カ賻しいかどうかを返します。 あとは、バイナリ形式となっているアドレスを直接比較 ことを示します。 スコーオ嬲リ子が異なる場合は NO を返し、一致しない in6-addr)) ) ; sizeof (struct 。 # , #endif return (ret) ; return (STR-EQ (tok, string) ) ; どうしの比較をおこない、一致するかどうかを判断します。 IPv6 アドレス形式でなかった場合には、単純に文字列 ☆ いずれ TCP Wrappers でも strsep 関数を使うように変 ルには strsep 関数を利用すべきと明記されていますから、 ある実装です。ただ、 strtok 関数のオンライン・マニュア イプラリとして利用することを考えると、ちょっと問題の 把握していれば、問題にはならないからです。しかし、ラ ードのほかの部分で strtok 関数を使っているかどうかを はありません。というのも、 TCP Wrappers の作者がコ Wrappers のソースコードとして考えるのならとくに支障 では strtok 関数をそのまま使っています。これは、 TCP 「 list-match 関数」の節で述べたように、ソースコード る関数群を紹介しました。 れた条件にマッチしているかどうかを検査する際に利用す 今回は、サービスに関する要求カ羸疋ファイルに指定さ 更されるのでしよう。 103 ( たじみ・ひさかず )

9. UNIX MAGAZINE 2004年12月号

図 15 作成中の MusicCatalog クラス ( 2 ) , ic ( 載ま 表 3 オ件 / ヾネルロするコンポーネント (jPaneII) プロバティ コンポーネント タイトル : JLabel text columns JTextField 23 アーティスト・ JLabel text colurnns JText Field 23 ジャンル : JLabel text JComboBox preferredSize 257 , 25 し、 Visual Editor 工デイタでコンテナをポイントすると にの時点では、まだクリックしません ) 、そのコンポーネ ントを追加できる場所が四角形や直線のガイドとして表示 されるので、それを目安にするとよいでしよう。 jPane11 のレイアウト・マネージャーは FlowLayout なので、前 のコンポーネントの右横に次のコンポーネントを追加する と、コンポーネントの配置が自動的に調整されます。 ラスの addltem() メソッドを呼び出し、コンポポックスの 1 つの項目を Object 型で指定します。ジャンル・コンボ 同様に、検索条件パネル (jPane11) に表 3 の残りのコ ポックスは getJComboBox() メソッドで生成されます。 ンポーネントをこの順番で追加します。 Outline ビューの getJComboBox() をクリックすると、 1 行のテキストを入力するフィールドは、 JTextField ク Java 工デイタに getJComboBox() メソッドのコードが ラスで作成します。複数行にわたるテキスト入力を可能に 表示されます。ここで、 getJComboBox() メソッドの if したい場合は、 JTextArea クラスを使用します。 文の最後に以下のように addltem() メソッドの呼出しを JComboBox クラスは、コンポポックスを作成します。 追加します ( 下線部 ) 。 リストを最初から表示したい場合は、 JList クラスを使用 します。 JComboBox クラスには editable というプロバ private JComboBox getJComb0Box ( ) { ティがあり、これを、、 true " に設疋するとテキスト・フィ = 皿 11 ) { if (jComb0Box ールドと同様に編集できるようになります。ただし、そう jComb0Box. addltem(" すべて ") ; いう使い方は一ヨ殳的ではないようで、デフォルト値は false になっています。 MusicCatalog クラスは、この時点で図 15 のようになります。 、 jComboBox. " とピリオドまで入力してしばらく待つ コンポポックスの項目の追加 と、 Eclipse のコードアシスト機能によって JComboBox 、、ジャンル " コンポポックスには音楽 CD の検索条件に指 クラスのメソッドの一覧が表示されます。続いて、、、 addl" 定できるジャンルの一覧を表示しますが、現時点ではまだ まで入力すると、メソッドの一覧は addl で始まる 3 つのメ 空です。最終的には、う朝頁の、、すべて " とデータベースに登 ソッドに絞られます ( 図 16 ) 。ここで、、 addltem " を選択 録されているジャンルを表示しますが、今回は頁の、、すべ して Enter キーを押すと、 addltem() というコードが入力 て " だけを譿定します。 され、引数の入力待ちの状態になります。デフォルトでは、 こでの作業には Outline ビューを使用します。この 括弧や引用符は必要に応じて自動的に挿入されますが、同 ビューが表示されていない場合は、 Window メニューか じ文字を入力するとカーソルがその文字の上を移動してい ら、、 Show View" →、、 OutIine" と選びます。 OutIine ビ きます。なお、コードアシスト機能による補完が始まるま ューには、インポート、メンバー変数、メソッドの一覧が で時間がかかる場合は、 Preferences ダイアログで、、 Java" 表示されます。 、 Editor" →、、 Code Assist" を選択し、、、 Auto activa- tion delay" フィールドの値を減らしてみてください。 コンポポックスに項目を追加するには、 JComboBox ク 言値 図 16 コードアシスト旨 00 , ・・ ) ー、一一を引 0 ー J 以・ゝ 030 ー 0 戸」 01 聞をれ JC ( 動聞 OXO ー 「 1 、 C い第第 」 08b 聞代びをに・ ( を」一躔 a•t 0 増を 0 れ ( お 1 2 引リ物、物・ にのを : 第町を斌 P 新・ ・第都ト 0 れ“”・市 0 ま t•n• , JCo ”め 0 日ぃ 0 、” 0 - 鹵 l• d ′め d 賛 d ド・ 、。浦田”鉙“第地・ ( 物 Ch い口つを 物は一をを ′山い。物い。 C 引 卩 ) ー物癶ー引・ 0 0 return 」 ComboBox ; 166 UNIX MAGAZ 工 NE 2004. 12

10. UNIX MAGAZINE 2004年12月号

連載 / ネットワークとセキュリティ 39 行目付近にある、 という行の頁の、、 # " を削除してください。 snortruIes—snapshot—2—1. tar ・ gz # urI = http ://www.snort.org/dl/rules/=> 目の、 という行のう頁に、、 # " を j 助日してコメントアウトし、 42 行 snortruIes—snapshot—2_2. tar. gz urI = http://www.snort.org/dl/rules/=> 92 行目付近の use-external-bins の値を次のように変 設疋します。 になっていますが、今回は外部プログラムを利用するよう ないます。標隼定では、 PerI モジュールを利用するよう を利用するか、 PerI モジュールを利用するかの設定をおこ 次に、ファイルのダウンロードなどに外部のプログラム ともできます。 つながっていない場合、 scp を通じてルールを更新するこ なお、 Snort を利用するマシンカ値接インターネットに skipfile threshold. conf ・変更後 # skipfile threshold. conf ・変更前 行目付近の skipfile のコメント設定を外します。 また、変更した設疋ファイルを上書きされないよう、 194 1 use_external bins ・変更後 # use_external_bins = 0 ・変更前 更します。 70 ールがあり、 /usr/local/etc/snort/backup にバックア たとえば、 /usr/local/etc/snort/rules に Snort のル ディレクトリを指定します。 す。また、引数ー b で変更前のルールをバックアップする で Snort のルールが保存されたディレクトリを指定しま oinkmaster を利用してルールを更新するには、引数ー o oinkmaster の利用 これで oinkmaster の言定は完了です。 # mkdir /usr/local/etc/snort/backup を作成します。 次に、変更前のルールをバックアップするディレクトリ ップをとる場合には、以下のコマンドを実行します。 # /usr/local/bin/oinkmaster. pI - ー 0 /usr/local/etc/snort/rules , -b /usr/local/etc/snort/backup とくにエラーがなければ、更新されたルールの情報カ哂 面に表示され、指定されたディレクトリに新しいルールフ ァイルが展開されているはずです。 なお、変更前のルールはバックアップ先として指定され tar と gzip でア た /usr/local/etc/snort/backup に ーカイプされて保存されます。 ルールを更新したあと、 Snort カ第又疋を再言ムみするよ うにします。 # kill —HUP ' /sbin/pidof snort' これは Linux での例です。 FreeBSD の場合は ports の sysutils/psmisc 、 NetBSD の場合は pkgsrc の sysu- tils/psmisc をインストールすると、 pidof コマンドカ坏リ用 できます 3 。 その他の UNIX 系 OS の場合は以下のようにします。 # ki11 —HUP 'ps ax ー grep snort ー - grep -v grep ー awk '{print $ 1 } , ' Snort を chroot 環境下や root 以外のユーザーで動作 させていると、 HUP シグナルで設疋の再読込みをおこな うことができません。この場合にはいったん Snort を完全 に終了させ、起動しなおしてください。 RPM から Snort をインストールした場合には、 Snort をユーザー snort で 動作させる定 ( ) になっているので、 # /etc/init . d/snortd restart というコマンドを実行してください。 また、引数ー D を使って Snort をデーモンモードで起動 する場合、 HUP シグナルで設疋の再読込みをおこなうに は、フルノヾスで Snort を起動する必要があります。 定期的にルールを更新する こでは、 cron を使って定期的に oinkmaster を起動 し、 Snort のルールファイルを更新する方法を説明します。 実行時に通知をおこなうことなくルールを更新するに は、 /etc/crontab ファイルの末尾に図 3 の行を追加しま す。 /etc/crontab の PATH 変数の指定に /usr/local/ 3 わざわざインストールするほどのものでもない気もしますが・ UNIX MAGAZINE 2004. 12