場合 - みる会図書館


検索対象: UNIX MAGAZINE 2003年5月号
129件見つかりました。

1. UNIX MAGAZINE 2003年5月号

特集・プログラミング入門 なお、この処理をおこなう際に、探索文字列の末尾の文 字に対する引・算はしていません。もし探索文字列の末尾の 文字を調べているときに不一致が発生するのであれは、 の文字ではないことは明らかです。ほかの場所で不一致が 発生した場合も、探索文字列の末尾の文字を不一致の発生 した位置に移動する必要はありません。移動しなけれはな らないのは、不一致が発生した場所よりも左側にある探索 文字列内の文字だからです。このように、末尾の文字を考 慮する必要はないため、 skip 配列の言算には含まれていま せん。 不一致を検出したときは、この配列を使って、探索文字 列をどれだけ進めてよいのかを匐十ヾます。この配列に↑巒内 されている値は、探索文字列の末尾の文字を十ヾていて不 一致が発生したときにどれだけ動かしてよいかを表してい るので、実際に移動する際には、末尾から何文字目を処理 している状態なのかを考慮に入れたうえで移動する必要が あります。このために作った関数は次のようなものです。 search(char *t , char *s) int 図 9 同じ文字か複数回出現する場合 a 図 10 a 図 11 a b a b a a e a b b a e i をインクリメントした場合 b a b a a a b b 2 文字進めた場合 b a b a a a b e a e b d d e d a a a a e int i , j ; int tlen, slen; tlen = strlen(t) ; strlen(s) ; slen 1 while (i く = tlen for (j SIen if (j くの return i ; slen) 1 ; j > = 0 return ー 1 ; if (skip[(int)t[i + j]] く 十十・ else i + = skip[(int)t[i + j] & & sCj] (slen ー 1 slen ー j) この関数では、 i は文字列のインデックスとして、 j は 探索文字列のインデックスとして利用しています。ます、 i を文字列のう巨頁に設定し、探索文字列の末尾から調べる ために j を slen—l から 0 になるまでデクリメントしな がら繰り返します。ここでチェックするのは文字列の一 分と探索文字列が -- ー・致していることです。もし、探索文字 列のすべてが・一致していれは、内側のループを終えたとき UNIX MAGAZINE 2003.5 に j の値は負の数になるはすです。この場合には、一致し た文字列の地可立置を表す i の値を返します。 不一致が発生した場合にも内側のループを終了します。 このとき、 j の値は 0 以 E で、不一致が発生した文字は探 索文字列側が s[j] 、文字列側が t[i + j] となります。 こで、文字列側の不一致文字に対応する skip 配列の値が slen—j よりも小さい、つまり skip 配列に登録されてい る値を言 fr 算するために利用した文字か不一致文字よりも右 側にある場合には、たんに i をインクリメントします。そ れ以外の場合、つまり skip 配列に登録されている値を計 算するために利用した文字か不一致文字よりも左側にあれ は、その文字のところまですらすために skip 配列の値を i に加えます。 skip 配列に登録されている値を計算するために利用し た文字か不一致文字よりも右側にある場合、実際には 1 文 字より多く移動させられる場合があります。図 9 の例を見 てください。 不一致が発生している文字列の文字は a です。この探 索文字列では、 skip 「 a'] は 1 となっています。これは注 目点よりも右にある文字 a に対して引・算された値です。 の場合、さきほどのプログラムでは i をインクリメントし ているので、次の探索の様子は図 10 のようになります。 しかし、文字 a は探索文字列の注目点よりも 2 文字左 まで存在しないので、実際には 2 文字進めることができま 95

2. UNIX MAGAZINE 2003年5月号

tsort コマンドにはオフションがいくつか用意されてお り、いすれも依存関係の循環を検出したときの重川乍を制御 するためのものです。ー 1 は、依存関係の循環を発見したと きに、それらの循環のなかから最長のものをみつけるため のオプションです。 -d は、循環が発生した原因をより詳 しく表示し、循環を解消する丁掛かりを提供します。 最後の一 q は、上記の 2 つのオフションとは考え方が異 なります。これは、循環があってもそれをエラーとして扱 わすに処理を続けるためのオプションです。 こで、 tsort コマンドの生い立ちを紹介しておきまし よう。もともと、 tsort はライプラリに登録するファイル の順番を決めるために使われるコマンドでした。ライプラ リへの追加はファイル単位でおこなわれます。このとき、 ファイルに含まれる複数の関数はまとめて追加することに なります。あるライプラリ関数をプログラムのなかて利用 すると、その関数が含まれるファイルがライプラリ・ファ イルから取り出され、プログラムのリンク時に結合されま す。ここで問題となるのは、プログラムで用いられるライ プラリ関数自身が、別のライプラリ関数を利用することが ある点です。 このような場合には、間接的に利用されるライプラリ関 数もリンク時に結合する必要があります。これらの関数か 同じライプラリに登録されているとき、間接的に利用する ライプラリ関数のはうか現在処理している場所より後ろに オ内されていれは、ライプラリを一度処理するだけで必要 な関数をすべて結合することができます。しかし、現在処 理している場所よりも前にオ内されていると、もう一度ラ イプラリ全体を処理しなけれは結合できません。 プログラムが printf 関数を利用する場合を考えてみま しよう。 printf 関数は、内部で write 関数を呼び出して います。 libc ライプラリに printf 、 write の順にオ内され ている場合、プログラム側で printf 関数が必要なときに libc ライプラリを前から順番に処理していってそれを結合 します。この段階で write 関数も必要なことが分かります が、そのまま libc ライプラリの処理を進めていけばこれ も結合できます。 一方、 write 、 printf の順に登録されている場合はどう でしよう。 libc ライプラリを処理していき、 printf 関数を 結合するところまでは同じです。しかし、 write 関数が必 要なことが分かった段階で、 libc ファイルの write 関数 114 か登録されている場所はすでに処理を終えているため、 のまま libc ファイルの末尾まて処理しても write 関数を 結合することはできません。けっきよく、もう一度 libc ライプラリを : 麪頁から処理しなおさなければなりません。 このような条件下で、できるかぎり 1 回の処理でリン ク作業を終らせるには、ライプラリ関数間の依存関係を抽 出し、その関係がイ尉寺される順番でライプラリに登録すれ ばよいでしよう。この順番を引算するために作られたのが tsort 関数です。 現在はライプラリ内にインデックスが作成されている ので、後ろに登録された関数から前に登録されている関数 を呼び出せないといった制限はありません。したがって、 tsort 関数は当初の彳難リを終えたわけですが、コマンド自 体は残り、オプションも当時の名残をとどめています。 -q オフションが作られたのは、ライプラリを構築する 際にやむをえす循環か生じるような場合に、いちいち工ラ ーか報告されるのを避けるためでしよう。このオプション を指定すると、ライプラリに登録するファイルの順番を決 める際に循環カ吽しても、エラーメッセージを表示しない ようになります。 tsort コマンドでのテータベースの利用 tsort コマンドでは、入力として・与えられたグラフの情 報をイ寺しておかなけれは、、出力を引算することができま せん。 tsort コマンドは、このグラフの情報を一尉寺するた めにデータベースを利用しています。 データベースを検索するときのキーになるのは、ノード の名前です。データベース検索の結果として得られるデー タ構造には、ノードに必要帯に ( たとえば、そのノード から出ているアークの一覧など ) か含まれています。 こて利用しているデータ構造は、もちろん構造体の形 式で定義されています。しかも、あるノードから出るアー クの数はあらかしめ決定できないため、データ構造として はポインタ寺し、その先に複数のアークを登録できる ようにしています。また、データ構造のなかにはノードの 名前も含まれますが、これも長さによって実際に占める領 域のサイズが変わります。 こで扱うデータ構造は可変長のデータであ つまり、 り、固定長のデータを登録するデータベースには向いてい UNIX MAGAZINE 2003.5

3. UNIX MAGAZINE 2003年5月号

特集 SoIaris 9 の管理と運用 図 17 パッチのインストール兄認 op@blade$ showrev —p ー grep 112785 Patch: 112785 ー 12 Obs01etes : Requires : lncompatibles : SUNWxwp1x , SUNWxwman , SUNWxwinc , SUNWxws1b , SUNWxwsrv Patch: 112785 ー 04 Obs01etes : Requires : lncompatibles : Packages : Packages : SUNWxwf nt , SUNWxwp1t , SUNWxwpIt , SUNWxwsrv コードが表示された場合は、 /var/sadm/install-data/ Solaris-9-Recommended 」 og ファイルを参照して原因 をヾ、適切な対策を講しる必要がある。 パッチのインストールカ鮗了したら、システムを再起動 する。推奨パッチクラスタにはカーネルのパッチが含まれ ていることも多いので、 : 起動は避けられない。 システムにインストールされているパッチは、 showrev —p で一覧表示できる。 Sun では、、、パッチ番号ーリリース番 号 " という形式でパッチ名を管理している。そのため、あ るパッチがシステムにインストールされているかを調べる には、図 17 のように showrev コマンドの出力から grep コマンドでパッチ番号を検索すれはよい。 この図の例では、 X ウインドウ・システム用パッチの リリース 12 とリリース 04 か、適用されていることが分か る。新しいリリースは、つねに旧いリリースを完全に含む ので、リリース 12 の適用前にリリース 04 を適用してお く必喫はないにの例の場合は、おそらくパッチクラスタ を 2 回インストールしたのであろう ) 。 バッチのバックアウト 残念ながら、パッチがつねに完全であるとはかぎらな い。パッチ自体にバグがあり、適用することによってシ ステムの重乍がおかしくなることもある。あるいは、パッ チの適用によってコマンドの設定方法や挙動が以前とは異 なってしまう場合もある。不幸にしてパッチに不具合が あったときは、 patchrm コマンドを用いてパッチを適用 する前の状態に戻す ( バックアウトする ) ことができる。 ただし、パッチをバックアウトするには、当然ながら、パ ッチ適用前のファイルをバックアップしてあることか則 提となる。図 16 の例のように、オプションを付けすに install-cluster を実行した場合は、 /var/adm ディレク トリにパッチをバックアウトするためのファイルがバック アップされている。 48 パッチの適用後になんらかの不具合が生じたときは、ま す、どのパッチが原因なのかを突き止めねばならない。こ れはなかなか面倒なイ業である。だが、経験を積んで、シ ステムのどこに何があり、ドキュメントのどこに何か書い てあるかが分かるようになると、調査も効率的におこなえ るようになる。おおまかな手順は、次のようになる。 1. マニュアルを読み、異常な重川乍をしているコマンドがど のパッケージに含まれるかを調べる。オンライン・マニ ュアルのツ朝匠くにある AVAILABILITY ( 和文では 、使用条件 " ) 、または末尾近くの ATTRIBUTE ( 和文 では、、属性 " ) という項目に、属するパッケージか書か れている。たとえば、 X のフォントサーバーの重川乍が おかしいとしたら、、 man xfs" を夫行し、 SUNWxwfs パッケージに含まれていることを突き止める。 2. showrev—p コマンドを実行し、そのノヾッケージを変更 しているパッチ番号を調べる。上記の例であ川ま次のよ うにする。 op@fire$ showrev -p ー grep SUNWxwfs Patch: 113923 ー 02 ObsoIetes : Requires : lncompatibles : Packages : SUNWxwfs 3. パッチの README ファイルを読んで変更点を石忍 する。このファイルは、 /var/sadm/patch ディレク トリの下に保管されている。パッチに依存関係がある場 合などは README に明記されているはすなので、十 分に確認する。 4. 、、あたり " をつけたら、 patchrm コマンドでパッチを バックアウトする。 root@fire$ patchrm 113923 ー 02 これはごく単純な例だが (f 列示したパッチが不正なわけ ではない ) 、パッチがいくつも適用されているパッケージ や、含まれるファイルの多いパッケージなどの場合は、ど のパッチが原因かを突き止めるだけでもかなりの手間がか かる。試行錯誤を繰り返すとサービスの停止時間カ張くな りがちなので、次に紹介する solaris Live Upgrade を UNIX MAGAZINE 2003.5

4. UNIX MAGAZINE 2003年5月号

特集・プログラミング入門 り返します。もう文字列か残っていないという状態になっ たときには、目自勺の探索文字列が含まれなかったことにな るため、文字列が存雀しないことを示す一 1 を返します。 while (i く = tlen) { if (hs (t) return 」 ; ()t + ASIZE * PRIME * b) % PRIME; ()t * ASIZE + t [ i + + ] ) ht return ー 1 ; % PRIME; ハッシュ値の更新においては、すでに計算してあるハ ッシュ値から、ハッシュ値の引算に関与・しなくなる先頭 の文字 ( 新 ) による景彡響をなくすために減算し、全体を ASIZE 倍したあとに新たな末尾の文字 (t[i]) の景斧加 えるために加算しています。 最初の行の計算で ASIZE x PRIME を加えているの は、その直後の減算により全体が負の数になってしまうの を避けるためです。残念ながら、負の数の値に対する剰余 演算の結果が正の数になる処理系と負の数になる処理系が あるため、どちらの処理系でも正しく動作するようによけ いな値を加えています。ここで加えた値は、最後に剰余演 算によって消えてしまうので、この値を加えたためにおか しくなるようなことはありません。 こで作成したプログラムは、 0 ( m 十れ ) で動作しま す。ところが、厳密にはこのプログラムは正しくありませ ん。というのも、ハッシュ値カ尊しい場合に文字列が一一致 していると判断していますが、これはかならずしも真では ありません 、で 1 ・算しているのはあくまでハッシュ値 ですから、ハッシュの衝突か起きる場合もあります。その ため、実際にはハッシュ値か等しいときにかならす文字列 自身の上交をおこなう必要があります。文字列の上師交をお こなって等しいときにのみ、探索文字列を検出したとする のです。 ノ、ツシュ値カ尊しいときに文字列を石忍するコードを付 けると、最悪の場合の引算量は 0 ( m れ ) となってしまいま す。これは、すべての部分文字列のハッシュ値か 1 司し値に なった場合を考えてみれは分かると思います。すべての部 分文字列を調べるために広そのそれぞれについて文字列 自身か等しいかどうかを調べるために m の手間がかかる ので、けっきよく 0 ( れ m ) となってしまいます。しかし実 98 際には、さきはども述べたように PRIME を大きな値に できるため、ハッシュの衝突はほとんど発生しないように することができます。したがって、実用的には 0 ( rn 十れ ) と考えても間題はありません。 実際のプログラミングにあたって これまでみてきたように、同じ問題を鮹夬するにも複数 の去があります。実際に間題を解決するためには何をす れはよいのでしようか。最初にやるべきことは間題の整理 問題の整理と分析 ーロに探索といっても、前回までにとりあげた、ある データ集合のなかから単一のデータを探しだす方法と、今 回紹介した文字列のなかから探索文字列を探しだす方法で は、利用するアルゴリズムか異なります。文字列のなかか らある探索文字列を探しだすために普通の探索のアルゴリ ズムを使おうとすれは、探索文字列の長さ倍の領域や時間 がかかるでしよう。 というのも、通常のでは、要素がキーの値と等しい かどうかは 1 回の上交で判定できるという前提て考えて きました。しかし文字列探索の場合には、それぞれの文字 の上交に対して手間を言算します。単純に考えても、上交 のために探索文字列の長さ倍の手間がかかってしまうはす です。 領域についても同様です。文字列として捉えれば途中の どこから始まっても同しだということが分かりますが、通 常の探索ではそれぞれのデータが独立して存在しているも のと仮定しています。すると、なえられた文字列から取り 出すことが可能な探索文字列と同じ長さのすべての文字列 か存在するものとして処理を進めることになるでしよう。 この場合には、領域カ甘架索文字列の長さ倍必要になってし まうわけです。 間題を分析して、どのような処理が可能かを検詞するこ とも重要になります。探索が必要となる場面は、これまで みてきたようなデータの探索や文字列架索といった基本 的な問題だけとはかぎりません。一見すると、もっと複雑 にみえるような間題の場合もあります。 たとえは、 DNA のなかから特定の遺伝子の部分を抽出 UNIX MAGAZINE 2003.5

5. UNIX MAGAZINE 2003年5月号

•Xserve 情報を利用してファイルへのアクセスが許可されたり、 プリンタなどのテンヾイスか利用できるかどうかか決定さ れたりします。 これらの情報を個々のシステムか独自に管理していた のでは、整合生をイ尉寺したり、データの新規登録などを おこなうたびに大変な手間がかかります。そこで、これ らをサーバーに集中させ、、、ディレクトリ・ドメイン " と 呼はれる大きな 1 つのデータベースとして扱うガ去が考 案されました。このディレクトリ・ドメインにあるデー タを検索したり取得したりすることを、、、ディレクトリ・ サーピス " といいます。代表的なディレクトリ・サービ スには、 Sun か発した NIS (YP) や Windows 2000 の Active Directory などがあります。 Open Directory とは、 Mac OS X におけるディレ クトリ・サーピスのアーキテクチャです。 Open Direc- tory では、下記のものをディレクトリ・ドメインとし て利用できます。 ・そのコンピュータ自体、およびその他の MacOSX Server のディレクトリ・ドメイン ・ Apple 以汐トのサーノヾーの LDAP (Lightweight Di- rectory Access Protocol) ディレクトリ・ドメイン と Active Directory ドメインを含むはかのサーノヾー のディレクトリ・ドメイン 8 BSD UNIX て利用されている /etc/passwd や /etc/group な 11 のウインドウか現れます。さきほどの Server As- 成功すると、このユーティリティの概要が示され、図 スワードを訊かれます。これらを正しく入力して認証が 設定するサーバーのホスト名、管理者のユーサー名とパ ータ上で Open Directory Assistant を起測けると、 Open Directory を成疋してみましよう。管理コンピ それでは、 Open Directory Assistant を使って ことによってディレクトリ・サーピスを実現しています。 を、一己のディレクトリ・ドメインから検索、取得する Open Directory では、プロセスから要求された情報 バーなどのネットワーク・サービス ビス検出プロトコルによって認識されたファイルサー Protocol) 、 SMB (Server Message Block) サー ・ Rendezvous 、 AppleTalk 、 SLP (Server Location ・コンピュータに置かれた BSD 設定ファイル 8 20 どのファイルのことてす。 図 11 場所 場所認 0 ディレクトツの使用方法 0 設定 ・セキィ 0 、仕上ツ オープンディレクトリアシスタント サーバのアドしスとサプネットは、デイしクトリサービス - を使用するための設定方法に影響します。サーバで一時的な ア、ドレスまたはサプネットを使用する場合は、使用できる設定 オョンが制限されます。 必要にじて、後でもう一度オープンディレクトリアシスタン トを実し、ディレクトリの使用方法の設定を変更できます。 04 時的なアドしスとサプネットを使用しています @固定のアドレスとサプネットを使用しています サーバ serve.kyoto-wu. ac. jp 192.168.174.16 続けるには、右矢印をクリックします。 図 12 ディレクトリ吏用方法 テイしクトリの使用方法 オープンアイレクトリアシスタント サーバでアイしクトリ情報を吸うには、 3 つの方法がありま 、場所 。既存のデイしクトリシステムからデイしクトリ情報を取得 か、ほかのコンビュータに情報を提供するデイしクトリの ホスとして使用するか、サーバ自体でのみ使用できる共有さ 0 、ディレクトリの使用方法 \ 0 設定 セキューイ 0 社上げ れなし一カルアイレクトリを使用することができます。 サーバはまのことを行います 0 既存のシステムからディレクトリ情報を取得する @共有されないローカルディレクトリを使用する 0 かのコンピュータにアイレクトリ情報を提供する 続けるには、右矢印をクリックします。 sistant の場合と同様、ウインドウの左側に乍業の手順 か書かれています。 このウインドウでは、サーバーに付けられた IP アド レスカ個定的なものか第勺なものかを答えます。ウイン ドウ内の説明にあるように、どちらの不頁の IP アドレ スを使っているかによって、利用可能なサービスに若干 の違いカ吽します。 適切な IP アドレスの種別を尺すると、図 12 のウィ ンドウか現れます。 このサーノヾーを NetInfo や Active Directory など の既存のシステムに参加させたいときは、一番上の、、既 存のシステムからディレクトリ情報を取得する " を選び ます。一方、このサーバー上て豸虫自のディレクトリ メインを作成する場合は、下 2 つのうちのどちらかを選 択します。このとき、そのディレクトリ・ドメインをほ かのコンピュータにも利用させたければ一番下の、、はか のコンピュータにディレクトリ↑帯長を提供する " を、 のサーバー以外では使わないのなら 2 番目の、、共有され UNIX MAGAZINE 2003.5

6. UNIX MAGAZINE 2003年5月号

特集・プログラミング入門 いのて探索文字列の長さぶんだけ進めることができます。 次の上交は文字 c で、これは一致しますから、その左の文 字を比較することになります。ここでは不一致が発生しま す。このとき、不一致の E{ した文字である a は探索文字 列の左側にあるため、探索文字列に含まれるもっとも右の a か現在注目している位置にくるように探索文字列を移動 します。この例では、探索文字列が 1 文字ぶん右へ移動す ることになります。 さらに探索文字列の末尾を上交すると、今度も不一一致が 発生します。不一一致の発生した文字はやはり a ですが、今 度は 2 文字ふ、ん探索文字列を移動することになります。す ると、ちょうど目的の探索文等冽と -- ーー・致する部分になるた め、 c 、 b 、 a と 3 文字を上交することて探索文字列か文字 列に含まれていることが分かります。 BM 法のポイントは、文字列探索においては探索文字列 に含まれない文字が多数存在するという点です。文字列の 探索をおこなっていく際に、最初の文字を上交したときに それか探索文字列に含まれないものであれは、一気に探索 文字列ぶんを進めてしまうことができます。多くの場合に 探索文字列ぶんを進めることができるのであれは、探索に かかる手間はれ + m となるのです。 BM 法で窈架索にかかる手間は、最悪の場合を考えると アルゴリズムの引・算量としては力すくの探索 1 去と変わらな い 0 ( れ m ) です。しかし、上記のように多くの場合には れ + rn の手間で探索をおこなうことができます。一般的 には、探索文字列カ張けれは長いほど BM 法による探索 は高速になります。前述の KMP 法とくらべても、実際に はある程度の長さ ( 5 文字程度 ) 以 E の探索文字列であれ は、 BM 法を用いるはうか効率がよいといわれています。 それでは、この BM 法を実現するプログラムをみてみ ましよう。 KMP 法では、不一致を発見したときにそれが 探索文字列の何文字目なのかにもとづいてどこから探索を 再開したらよいかを示す next 配列を計算しました。今度 は、どの文字が不一致文字となったかによってどれだけ進 めてよいのかを表す skip 配列を準備することになります。 さきほどの abc という探索文字列の場合、 a は 2 、 b は 1 、それ以外はすべて 3 となっている配列を準備します。 BM 法の実現 94 この配列を作成するのは簡単です。最初に配列自身を宣 言する必要がありますが、今回は文字列として 8 ビットの 文字すべてを考えましよう。そのため、配列のサイズとし ては 256 ( 28 ) を用います。 #define ASIZE 256 int VOid skip [ASIZE] ; search—sub(char *s) i nt i nt 1en len; strlen(s) ; for (i = 0 ; i く ASIZE; i + + ) skip [i] 1e ; for (i = 0 ; i く 1en ー 1 ; skip[(int)s[i]] len 1 ます、配列のすべての要素を文字列の長さに設定しま す。つまり、ほとんどの場合には文字列の長さぶんを進め ることができるわけです。このあと、探索文字列に使われ ている文字について特別な処理をおこないます。 特別な処理といっても、しつはたいした処理ではありま せん。探索文字列の i 文字目にその文字があれは、、、探索 文字列の長さー i ー 1 " を skip 配列に↑褓内すればよいの です。 探索文字列に同し文字が 2 つあったときには、右側の 文字に対して言算した値をイ褓内します。右側の文字と左側 の文字とでは、右側の文字に対する値のほうか移動する量 が少なくなります。左側の文字に対して引・算した値を採用 すると、本当は - ーー - - 数するかもしれない場所を通り越して移 動してしまう可能性があります。そのため、もっとも右に ある文字に対して計算した値を skip 配列にオ褓内するよう にします。 このために、探索文字列の : 頁から、すべての文字につ いて順番に値を計算し、 skip 配列にオ褓内しています。同 じ文字が複数存在する場合、最初は左側にある文字に対す る値かオ褓内されますが、あとから右側にある文字に対して 引算した値かオ褓内されるため、すべての計算カ鮗了したあ とは一 - 一番右にある文字に対する値かオ褓内されていることに なります。 UNIX MAGAZINE 2003.5

7. UNIX MAGAZINE 2003年5月号

図 22 /opt を / にまとめるとき認 ウインドウ編集 ( りオアション⑨ ktive Bcot. Ewiroment ・ - ris9.-202 ー地 T 〉 Size ( ) 物 t POint 0 10 4 ( 3 /var 21 9 2 /emrt/hoce 7 8192 /opt ufs 特集 SoIaris 9 の管理と運用 いなけ川ま、ファイルのコピーになんらかの間題があった ことになる。その場合は、いったん新しい環竟を削除し、 ディスクスライスの割当て容量などを石忍したうえで作業 を最初からやりなおす。 パッチのインストール 新たに作成した工竟に対してパッチやアップグレードを インストールする場合は、 luupgrade コマンドを使う ( ま たは、ⅲコマンドの Upgrade メニューを j 尺 ) 。 これ以降の作業は比較的単純なので、 luupgrade コマ ンドについて説明する。 luupgrade は、新しい環境を構 F4 新 F6 ロ田 AD E.% F2 F3 SLICE PRItn CÆtEL D 乢 E SPLIT M 正 CLR 町」 HELP CffJICE SAVE 成しているディスクスライスを作業用にマウントし、そこ に対して所定のコマンドを実行する働きをする。パッチの ドキュメントには、、新しい竟を有効に ( 図 23 ) 。なお、 適用や OS のアップグレードなどでは、その後におこな する際におこなうファイル上交などのために、使用中のデ う同期処理のためのデータベースを更新しておく必要があ イスク容量に対して約 30 % 増しのスライスサイズが必要 " る。したがって、新しい竟のファイルをいきなり操作す と書かれている。 るわけにはいかない。 format コマンドを終了すると、ⅲコマンドの画面に 新しい環竟 0 ンヾッチを適用するには、次のようにする。 戻る。 次は、システムファイルかオ褓内されているファイルシス luupgrade -t —n 環境名 -s ノヾッチファイノレのノヾス パッチ名 テムを新しい竟のどのディスクスライスに置くかを指定 する。 / にカーソルを合わせて F2 CHOICE を押すと、未 、パッチファイルのパス " は、糸寸パスで指定しないと工 使用のディスクスライスか表示されるので、 / ファイルシ ラーになる。複数のパッチを指定する場合は、パッチ名を ステムを置きたいディスクスライスを〕尺する ( 図 24 ) 。 空白で区切って列挙す川まよい。 同様に、 / var ファイルシステムを置くディスクスライ -t オプションによってパッチの適用を指定された luup- スも指定する ( 図 25 ) 。必要があれば、アプリケーション grade コマンドは、内部で patchadd コマンドを繰り返 をインストールしたファイルシステムに対して新しいディ し呼び出して新しい竟にパッチを適用していく ( 図 27 ) 。 スクスライスを指定し、そのファイルシステムを、、切り替 そのため、推奨パッチクラスタをインストールする場合で えて " 使うようにすることもできる。 も、付属の install-cluster スクリプトは使えない。さい これで指定は完了である。すぐにファイルシステムのコ わい、 luupgrade コマンドは指定された ) でパッチを適 ピーをおこなうときは F3 SAVE を、あとでコピーする 用していくので、推奨パッチに付属する patch-order ファ ときは F7 SCHEDULE を押す。後者を尺すると、 at イルをそのまま、、パッチリスト " として使用すれはよい。 コマンドを用いてコピー竹璞を実行する時刻の入力を求め 適用済みのパッチや、そのシステムに不要なパッチが含 られる。どちらの場合も、ファイルのコピーと上交に必要 まれていた場合は、推奨パッチクラスタの install-cluster なデータベースを作成するためにかなりの日判肋ゞかかる。 よりも詳しいエラーメッセージか表示さそのパッチの コピー作業カ鮗了すると再度ⅲコマンドの画面に戻る 適用はスキップされる。 ので、 Exit お尺してプログラムを終了する。 lustatus アップグレード コマンドでファイルのコピー状態を石忍したら ( 図 26 。 lu ーを使ってもよい ) 、新しい環 コマンドの Status メニュ Solaris 8 からは、機能強化された OS が、、アップデー 境の変更イ乍業に進む。 ト・リリース " と呼ばれるかたちでリリースされるように なった。 SoIaris9 でも、約 3 カ月に 1 回の割合でアップ 新しい工韆竟の CompIete ステータスが、 yes" になって 0 : 工ミュレータ ヘルプ c0t0d0s0 c0t2d0sl c 此 0 /opt 1 ærged /. PI mnfim? (), 司 : c % 1 c 0dCs7 Size(t'ß) 聞 t P /var / expo れ月に / 叩し 3 51 UNIX MAGAZINE 2003.5

8. UNIX MAGAZINE 2003年5月号

NO 引 CE 図 14 言聢終了と再起動 仕上げ オープンデイしクトリアシスタントによって、サーバでのアイし 0 なうこ、 トリの使用方法が正常に設定されました。 朝場所 ディレクトリの使用方法新し、設定を適用するために、サーバを再起動してください。 0 設定 0 仕上 図 13 パスワード・サーパーの設定 オープンディレクトリアシスタント セキュリティ アイレクトリの使用方法と同様に、サーパからバスワードおよ 認証情報にアクセスするには、」っの一般的な方法がありま ほかのシステムから情報を取得するか、ほかのシステムに 情報を提供するか、ユーザしコードの一部として情報をローカ ルに存およびアクセスすることができます。 オープンディレクトリアシスタント ' ー 000 もなうこ 、や場所 ディレクドの使用方法 セキィ 0 仕上げ , パスワー ; ドおよび認証情報は次のように様作されます 0 ほ々、のシステムから取得する 0 ほ小のシステムに提供する @子」ザしコードとしてローカルに保存およびアクセスする 続けるには、右矢印をクリックします。 ないローカルディレクトリを使用する " を選びます。 次は、、、パスワード・サーバー " に関する設定です ( 図 13 ) 。パスワード・サー ーとは、ユーサーのパスワー ドを一元管理するサーバーのことで、 MD5 や SHA-I などによるユーザー認証をおこないます。 ( 亟」 ) 色三壅の一 すでに別のパスワード・サーバーがあり、このサー ノヾーでのユーサー認証もそこに統合するときは一番上の いて説明します。このような設定の変更には、管理コン 、、ほかのシステムから取得する " を、このサーバーで新た ピューター E で Server Settings や Workgroup Man- にパスワード・サーバーを起動する場合は、、ほかのシス ager を利用します。 テムに提供する " を、パスワード・サーバーを使わない server Settings では各種サーピスの開始やイ亭止、詳 ときは、、ユーサレコードとしてローカルに保存およびア 細なオプション設定などが、 Workgroup Manager で クセスする " を選びます。 はアカウントやグルーフ。の」助日や削除、変更、ファイル パスワード・サーバーを利用するように Open Direc- 共有のための共有ポイントの成疋やパーミ、、 ノンヨンク ) 言殳 tory を設定すると、ディレクトリ・ドメインにはパス 定などがおこなえます。 ワードではなく、パスワード・サーバーによって割り当 server Settings や Workgroup Manager など、稼 てられた ID が保存されます。図 13 の一番下の項目を 動中の Mac OS X Server に接続して操作するアプリ 選んだ場合だけ、パスワードはディレクトリ・ドメイン ケーションを起動けると、図 15 のようなウインドウが に直接保存されます。 表示さ接続先サーバー名とユーザー名、パスワード 以 E の設定力鮗了すると、さきほどと同様に、 Open の入力を求められます。もちろん、 こでそのサーバー Directory の設定内容をテキストファイルとして保存す の管理権限をもつューサー名とパスワードを正しく入力 るためのウインドウが表示されます。これを終えると、 しなければ、設定変更などはできません。 図 14 のように再起動を促されます。 たとえば、 Server Settings を利用した場合、一信己の 正常に再起動できれば、初期設定はひとます終了で ューサー認証に成功すると図 16 のようなウインドウが 表示されます。これは、 Mac OS X Server か驃準で提 す。 供するサーピスをアイコンで表示し、目的別にタブに分 けたものです。ここでサーピスを表すアイコンをクリッ クすると、田な設定をおこなうためのウインドウか現 れるイ督みになっています。すでに動いているサービス サーバーのネノ期匿がすんだところで、、、ファイル共 に関しては、アイコンの右下に小さし長のマークカ咐 有 " を例に、設定終了後にサーピスを起動ける方法につ UNIX MAGAZINE 2003.5 図 15 、 vorkgroup Manager てサーパーに接続 ワークグルーブマネージャの接読 アドしス : xserve. kyoto—wu ・ ac.jp ユーザ名 : miyasita バスワード : コキーチェーンに追加する 0 0 0 サーバーの設定変更 21

9. UNIX MAGAZINE 2003年5月号

特集・プログラミング入門 殞則のループでは文字列全体に対してルーフすると述べ ましたが、実際には文字列の長さから探索文字列の長さを 引いたぶんまでをループしています。う可立置がこれより も後ろになると、探索文字列の長さぶんの文字か残ってい ないため、この部分には探索文字列カ唸まれないことか明 らかだからです。もちろん、文字列の長さすべてについて 探索を実行してもかまいませんが、ありえない場合を幇餘 することで無駄な処理をおこなわないようにしています。 それでは、このアルゴリズムの計算量を考えてみましょ う。、、最悪の場合 " は、すべての位置から探索文字列の長 さぶん上交をおこなう場合です。ただし、、、すべての位置 から " といってもれではありません。末尾の rn に満たな い部分は調べないので、れ一 rn 十 1 通りあることになり ます。そして、探索文字列の長さは m ですから、 rn(n ー m 十 1 ) 回程度の上師交が必要になります。通常、文字列の 探索をおこなう場合にはれにくらべて m は十分小さいと 考えてよいので、けっきよく 0 ( れ m ) となります。 この最悪の場合となるような入力は、探索文字列とつね に一致しつつ、最後の文字でかならず異なってしまうとい う場合です。つまり、文字列は単一の文字か連続したもの であり、探索文字列としては単一の文字カ里続し、その後 ろに別の文字が付いたものが与えられた場合になります。 たとえば、 文字列 : 00000000000000000000000000000000000 探索文字列 : 00001 などと指定された場合か最悪の入力であり、その手間は上 て言算したような値になります。 さきはどのプログラムは、アルゴリズムをそのままプロ グラムに変換したものなので、すこし工夫すればアルゴリ ズムを変えすにプログラムを高速化することができます。 最悪の入力を考えると、内側のループを毎回佃度も実行す ることはありますが、はとんどの場合には麪頁の文字の比 較のみで一致しないことか判明すると思います。そこで、 探索文字列の地頁文字をあらかしめ取り出しておいて、そ の文字だけは特別に上交をおこない、それか等しいときに 限って探索文字列の 2 文字目以降をヾるというガ去が使 えます。 また、線幵架索を高速化するために使われる番兵の手法 こでも利用できます。たとえば、文字列の後ろに探 は、 UNIX MAGAZIN E 2003.5 索文字列を連結しておけは、探索はかならすそこで成功す るわけですから、文字列の長さを調べる必要はなくなりま す。逆に、探索文字列の後ろにどの文字とも一致しない文 字 ( 文字列に出現しない文字 ) を加え、文字列と探索文字 列との比較がかならずその文字で失敗するようにしておく こともできます。この場合には、上交が失敗したときにそ れまでに成功していた上交の回数か、探索が失敗したとき に調べていた探索文字列内の文字を確認することで、探索 文字列のすべてが含まれているかどうかカ吩かります。 ただし、実際にプログラムを作成してみたところ、番兵 として末尾に探索文字列を追加するガ去を用いたバージョ ンでは、それほど高速化されませんでした。というのも、 文字列の末尾に新たに文字を追加しなければならないの で、末尾をみつけるために ) 巨頁から順に 1 文字すっチェッ クする必要があるからです。この作業にかかる手間が番兵 を利用することで省ける手間とくらべて小さくないため、 さはど高速化にはつながらなかったわけです。文字列の末 尾がすぐに分かるような場合には有効なのですが、そうで ない場合には注意して用いる必要があります。 また、無理に 2 重ループを作らなくても、ループの内部 でおこなう更新処理を工夫すれば、 1 重のループ構造とす while (t Ci] ! = ) \ 0 , ) { int i , j ; search(char *t , char *s) int ることもできます。 if (t [i] if (s[j] } else { return ー 1 ; , \ 0 ' ) return i ただし、ループが 1 重になったからといって、計算量 も 0 ( れ rn ) からたとえは〇 ( れ ) に下がるわけではありませ ん。あくまでもループのまわし方を変えただけであって、 最悪の場合に 0 ( れ m ) の手間がかかるのは同しです。 89

10. UNIX MAGAZINE 2003年5月号

図 10 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1056 1057 1058 1051 1052 1053 1054 1055 連載 / IPv6 の実装ー⑩ IPv4/IPv6 以外のアドレス・ファミリーの場合のタ里 default : family) ) ; "unknown address family=%d. \ " ipseclog( (LOG—DEBUG, "key-allocsa: continue ; goto found ; break; sizeof(sin) ; SI Ⅱ . Sin_len bcopy(dst , &sin. sin—addr, sizeof(sin. sin—addr)) ; if (key—sockaddrcmp ( (struct sockaddr*)&sin, (struct sockaddr * ) &sav—> sah—>saidx. dst , 0 ) ! = 0 ) continue ; 芝芋点では、 IPv4 と IPv6 以外のアドレス・ファミリー の SAD 工ントリ検索には対応していません ( 図 10 ) 。 1077 splx(s) ; 1078 return NULL ; 検索条「牛に適合する SAD 工ントリが発見できなかった 場合、 1080 1081 1082 1086 1087 1 , 078 行目で NULL を返します。 found : splx(s) ; sav—>refcnt 十十 ; SAD 工ントリはアドレス・ファミリーに依存しないた め、 IPv4 アドレスをもつ場合もあれは、 IPv6 アドレス をもつ場合もあります。 key-allocsa() の呼出し時に検索 条件としてアドレス・ファミリー (family) を指定してい るので、確認中の SAD 工ントリカ甘旨定されたアドレス・ ファミリーの終点アドレスをもっているかを調べます。 key-allocsa() で IPv4 アドレス・ファミリーの検索か 指定されている場合は、確認中の SAD 工ントリが IPv4 アドレスをもっていると仮定して上交します。 keysock- addrcmp() はアドレス・ファミリーに応して 2 つのアド レスを上交する関数です。 1059 case AF_INET6 : 条件に適合する SAD 工ントリがみつかったら、 SAD 工ントリの参照カウンタ (sav->refcnt) を増やし、発見 したエントリを返します。 SAD 工ントリは参照カウンタて管理されるため、 key- allocsa() で検索した SAD 工ントリが不要になったら keyfreesav() て解放しなけれはなりません。 1117 void 1118 key—freesav(sav) 1119 1120 { struct secasvar 1060 1061 1062 1063 if (key-sockaddrcmp ( (struct sockaddr * ) dst , (struct sockaddr *)&sav—> sah—>saidx . dst, 0 ) ! = 0 ) continue ; break; keyffreesav() は解放する SAD 工ントリへのポインタ を引数にとります。 1 , 059 ~ 1 , 063 行目は IPv6 の SAD 工ントリの検索 カ甘旨定されている場合のアドレス上交です。 IPv4 の場合 はいったん sockaddr-in 構造体に上交対象となるアドレ スをコピーしており、 IPv6 の場合 ( 鹵耐妾 key-sockaddr- cmp() を呼び出しています。これは旧いコードの名残で、 現在は IPv4 でも単純に keysockaddrcmp() を呼び出 すだけで動胙します。 UNIX MAGAZINE 2003.5 1125 1130 1131 1133 1134 } sav—>refcnt— if (sav—>refcnt = の key—delsav(sav) ; return ; 1 , 125 行目で参照カウンタ (sav->refcnt) を減らしま す。カウンタが 0 になった場合、その SAD 工ントリは 誰からも利用されていないことになるため、 key-delsav で SAD 工ントリを削除します。 75