連載 / Pe 日活用のヒント retropt help 'retropt ' ) ; GetOptions(\%option, 'dir=s' , 'help' 述は、 の要素が引数の内容を表す。具体的には、上記の仕様の記 外の場合は、最初の要素がオプションの引数の型、 2 番目 場合は、そのオプションに引数がないことを表す。、 [ ] " 以 オプションの引数の仕様を示す。ハッシュの値が、、 [ ] " の ハッシュのキーはオプション名であり、ハッシュの値は のようなオプション一覧表小になる。 [—retropt] [-help] C-dir DIR] のような GetOptions 呼出しや、 ておきたい。そうしておけば、 Net::ReIay::TCP の処理 そのようなオプションの仕様は TCP. pm のなかで言古し どは Net::Relay::TCP クラスの処理に影響を与えるが、 拡張の点で好ましくない。コマンド行オプションのほとん ション一覧表示を別々に管理するのはプログラムの保守や tions サプルーチンに与えるオプション仕様データと、オプ クラス特有のオプションがなかったとしても、 GetOp- 不可能である。 のオプション一覧表示の部分に最初から入れておくことは —class で指定するクラス特有のオプションは、 relaytcp. pl しかし、 relaytcp の場合はそうはいかない。そもそも、 die "usage: $ 0 [-dir DIR] [-verbose] \ Ⅱ " verbose = > \$verbose) or GetOptions ( ' dir=s use Getop : : Long; 示されるオプション一覧カ甥リでも大きな問題はない。 プルーチンに与えるオプションの仕様と、 die によって表 単純なプログラムなら、以下のように GetOptions サ 理由は以下のとおりである。 一覧表示を生成していることである。このようにしている プルーチンに与えるオプション仕様データと、オプション る具体的な方法ではなく、仕様の言古から GetOptions サ こで重要なのはコマンド行オプションの仕様を言す になり、 2 つ目の要素は、、 [-dir DIR]" の、、 DIR " になる。 つまり、ハッシュのイ直の 1 つ目の要素は、、 dir=s" の s 64 に関する新たなオプションを導入する際に、 relaytcp ・ pl に は手を加えず、 TCP. pm の変更だけですませられる。 コマンド行オプションの仕様の定義場所と解析 結果の保存先 コマンド行オプションの解析の第 1 ~ 2 段階で処理 されるオプションの仕様は、それぞれ %OPT-SPECI 、 %OPT-SPEC2 に言される。これらは relaytcp. pl の 最初の部分で定義されている。解析の第 3 段階で処理され るオプションの仕様は固定されておらず、 %opt-spec3 と いうハッシュに集められる。具体的には、 %Net::Relay:: TCP::OPT-SPEC ( 当然 TCP. pm で定義されている ) と、 -class で指定されたクラスの %OPT-SPEC を合わ せたものが %opt-spec3 になる。 -class の指定がなけれ ば、 %opt-spec3 の内容は %Net::Relay::TCP::OPT- SPEC だけになる。 プログラム内で %Net::Relay::TCP::OPT-SPEC の ようなクラス名を含む名前で参照するのは柔軟性に欠ける ので、 %base-opt-spec で参照できるようにして、こうし た言古をコードから排除している。 オプション一覧表示のため、 %OPT-SPECI 、 %OPT- SPEC2 、 %base-opt-spec を合わせたものを %common -opt-spec に入れ、—class で指定されたクラスの %OPT- SPEC を %class-specific-opt-spec で参照できるように している。 コマンド行オプション全体の解析結果は最終的に % 叩 t に入り、 %opt は Net::Relay::TCP あるいは—class で 指定されたクラスのコンストラクタに渡される。コマンド 行オプションのうち、—retropt と—help はコンストラク タに渡しても未がないので % opt には入らない。 コマンド行オプションの 3 段階の解析の結果は、それぞ れ % optl 、 %opt2 、 %opt3 に入る。 各サブルーチンの概要 relaytcp. pl のサプルーチンはすべてコマンド行オプシ ョンの処理に関するもので、概要は以下のとおりである。 store-opt -retropt オプションが指定されたときに備え、コマンド 行オプションの内容をファイルに保存する。 retr-opt UNIX MAGAZINE 2003. 12
連載 / Pe 日活用のヒント ルーチンの呼出し 1 行だけだが、一殳には複数行にわたる。 私はトップレベルの実質的実行文を単純にスクリプトの末 尾にもってくるだけでなく、 main という名前のサプルー チンにしてプログラムの最後で呼び出すのカ隍ましいと考 えており、 relaytcp. pl でもそうしている。この記法に従 うと、 hello. pl は以下のようになる。 1 2 3 4 6 7 9 use strict ; my $MSG " He110 Wo て ld ! " ・ sub he110 { print $MSG, "\n" sub main { hello() ; main ( ) ; このように ma ⅲサプルーチンを設けることで、トップ レベルの実質的実行文がプログラムリストのどの部分なの かが明確になり、プログラムの理解や保守が容易になると . 。、う。また、 C や C 十十、 Java などのプログラムでは実 行が main 関数 / メソッドから始まるので、それらの言語 に慣れている人にも自然に映るだろう。 コマンド行オプションの角材斤は 3 段階で relaytcp. pl の仕事の大半はコマンド行オプションの解 析だが、これカそう単純ではない。最大の要因は、 relaytcp のオプションが固定されていないことである。 relaytcp は、原則として Net::Relay::TCP クラスを使って rrcp 通信の中継をおこなう。しかし、 -class オプションを使 えば代わりに任意のクラスを指定することができる。そし て、指定したクラスで本来は relaytcp にないオプション を使えるようになっている。オプションの指定に誤りがあ る場合や、 -help オプションが指定された場合に relaytcp が表示するオプション一覧には、クラス特有のオプション も含まれる。以下は、クラス特有のオプションを含まない オプション一覧表示である。 $ relaytcp -help usage : relaytcp [ ー [ Ⅱ 0 ] httphosthack] [-hostname HOSTNAME] [-help] [—dir DIR] ト [ Ⅱ。 ] daemon] [ ー c ount NUMBER [ : NUMBER] ] [ ー [ Ⅱ。 ] clean] [—class CLASS] UN 工 X MAGAZ 工 NE 2003. 12 [-localport PORT] [ ー [ Ⅱ 0 ] record] [ ー [ Ⅱ 0 ] relayfork] [—retropt] [ ー s uper c ount NUMBER] [—target HOST : PORT] [ ー [no]threads] C—umask UMASK] [ ー [ Ⅱ 0 ] verbose] l.—dir 、—help 、—retropt プションの解析を以下の 3 段階に分けておこなう。 こうした事情があるので、 relaytcp. pl はコマンド行オ というオプションもある。 また、前回の起動時のオプション指定を引き継ぐ -retropt で、オプションの解析を 1 回で完了するのは不可能である。 コマンド行オプションでは使用するクラスも指定するの る。—verbose は若干性格が異なるが、 relaytcp. pl 内 オプションの一種なので、この段階で処理する必要があ —class の処理をおこなう。—httphosthack は—class ラスを読み込まないと分からないので、第 2 段階として をもつ可能性がある。クラス特有のオプションはそのク —class で指定されるクラスは、クラス特有のオプション 2.—class 、—httphosthack 、—verbose している。 -retropt と共通するのでこの段階で処理 い点が—dir 、 -retr 叩 t によって引き継がれな 若干性格が異なるが、 -dir もこの段階で処理しなければならない。 -help は —retropt の処理は—dir に依存するので、 る。また、 継ぐというメタなものなので、最初に処理する必要があ —retropt の処理は前回のコマンド行オプションを引き のハッシュ ( 連想配列 ) で記述している。以下はその例で relaytcp では、コマンド行オプションの仕様をいくつか コマンド行オプションの仕様の記述 この時点でこれらのオプションの仕様は分かっている。 最後に、残りのすべてのオプションの処理をおこなう。 3. それ以外のオプションの解析 のでこの段階で処理している。 で使用される点が—class 、—httphosthack と共通する dir my %OPT_SPECI ある。 63
連載 / Pe 日活用のヒント る。ただし、 %OPT-SPECI に含まれるオプションは、 ば、ファイルに出力する内容を標準工ラー出力にも出力す opt" に保存する。 -verbose オプションが指定されていれ という行が連続する形式でテキストファイル、、 . relaytcp. オプション名 : 値 解励鮗ったコマンド行オプションは、 store-opt サプルーチン は Net::ReIay::TCP のサプクラスである。 う。実際、 Net::Relay::TCPHTTPHostHack クラス Net::Relay::TCP のサプクラスになることが多いだろ をもつ必要がある。 -class オプションで指定するのは、 は、 Net::Relay::TCP と同様の外部インターフェイス my $fh = IO: :Fi1e—>new(" く $filename") or do { 込む。 store-opt によって保存されたオプションデータを読み retr-opt サブルーチン ファイルへの保存対象からは除かれる。 末尾のリスト 2 に TCP. pm を示す。以降では TCP. TCP. pm とができる。 、 IO::FiIe- 〉 new(" く $filename")" とすればこれを防ぐこ ラムはファイルを書込み用に開いてしまう。上記のように 〉を最初にもつ名前を指定すれば、 PerI のプログ name) とすると、ユーザーがファイル名として、、〉 foo" の が指定する場合がある。このとき IO: :FiIe- 〉 new($file- relaytcp. pl にはない機能だが、ファイル名をユーザー 用に開いてしまうのを防ぐためである。 くを付けているのは、想定外の状況でファイルを書込み をファイル名に含める必要はない。それにもかかわらす してほしい。ファイルを読込み用として開く場合は、 のように、ファイル名の前に くを付けていることに注意 68 Net::Relay::TCP クラスのコンストラクタで、唯一の new TCP. pm の各メソッドの概要 pm を解説する。 クラスメソッドである。 m am 外部からの呼出しカ誤定される唯一のインスタンス・メ ソッドである。このメソッドがクライアントからの接続 を受け付け、個々のクライアントに対してプロセスまた はスレッドを作成してその処理をおこなわせる。 relay main から呼び出され、クライアントと中継先のあいだ の双方向の中継をおこなう。 fork して各プロセスが 1 方向ずつ中継する。 forward relay から呼び出され、クライアントから中継先、ある いは中継先からクライアントのいずれか 1 方向のデータ 中幻医をおこなう。 relay-nofork relay と同様に、クライアントと中継先のあいだの双方 向の中継をおこなう。 relay との違いは、名前が示すと おり fork せず、 1 つのプロセスのままで双方向の中継 をおこなう点である。 forward にあたるメソッドは使わ ず、 relay-nofork 自体か双方向の中継をおこなう。 req-filter res -filter この 2 つのメソッドについては次項で説明する。 CIean —dir -clean オプションが指定されたときに main から呼び 出されるメソッドで、ファイルの消去をおこなう。 retr—count -clean オプションが指定されなかったときに main か ら呼び出されるメソッドで、以下の処理をおこなう。 1. 記録サプディレクトリの有無を調べ、ある場合はサプ ディレクトリ名の初期値を求める。 2. 言彖ファイル番号の初期値を求める。 req-filter と res-filter の働き req-filter と res-filter の両メソッドは、 forward と relay-nofork から呼び出される。しかし、いすれも中身 は空で何もしない。 forward や relay-nofork は、何もし ないメソッドをなせ呼び出しているのだろうか。それには もちろん理由がある。 Net::ReIay::TCP のサプクラスで、 UNIX MAGAZ 工 NE 2003. 12
連載 / Perl 活用のヒント UN 工 X MAGAZ 工 NE 2003. 12 名の言を上記の行だけにするためにこのように書いて use Net::Relay::TCP;" とほば同じである。クラス 17 行目 eval 'require ' . BASE-CLASS; に十内している。 わりに労力カ寸曽えるので、配列やハッシュの定数は変数 を定数にできるだけである。これでは利点があまりない ハッシュの定数は宣言できず、配列やハッシュへの参照 て疋義している。一方で、、 use constant" では配列や relaytcp では、スカラー定数はすべて use constant 保証さ楸実行時の効率がよいといった利点がある。 constant" による定数定義には、値か変わらないことが と定義してもコーディング上は大差ない。しかし、、 use ' Net : : Re1ay : : TCP ) ・ my $BASE_CLASS 定数として使う変数を、 プルーチンである。 は引数をもたす、つねに、、 Net::Relay::TCP" を返すサ にはサプルーチンとして定義される。 BASE-CLASS stant" に書かれているように、 BASE-CLASS は実際 perldoc con- 照できるように定数宣言をおこなう。 以後、、、 BASE-CLASS" で、、 Net::ReIay::TCP" を参 ReIay::TCP' ・ 15 行目 use constant BASE-CLASS = 〉 'Net::* relaytcp. pl の先頭部分 都合上、で折り返しています。以下同様 ) 。 以下、リスト 1 のコードを具体的に解説していく ( 誌面の こまでが、 relaytcp. pl のコード解説の下準備である。 覧全体を作成し、標準工ラー出力に出力する。 opt-spec-to-usage を 1 ~ 2 回呼び出してオプション一 usage オプション一覧表小に変換する。 ハッシュで記述されたコマンド行オプションの仕様を、 opt-spec-to-usage 配列に変換する。 GetOptions サプルーチンに渡すためのオプション仕様 ハッシュで記述されたコマンド行オプションの仕様を、 opt-spec-to-array オプションの内容を読み出す。 store-opt サプルーチンによって保存されたコマンド行 つまり、 %opt の従来の内容に % 叩 t2 の内容を加えて いる。 143 行目 our (%base-opt-spec, %class-specific-* opt -sp (c) ; これに続く行では、 %base-opt-spec を %Net: :Relay ::TCP::OPT-SPEC の別名、 %class-specific-opt- spec を -class で指定されたクラスの %OPT-SPEC の別名と定義している。 %base-opt-spec と %class- specific-opt-spec は、いすれも main サプルーチンの 外から参照されることはない。そこで my を使ってレキ シカル変数と宣言したいところだが、レキシカル変数は 他の変数の別名になれない。最初に、、 use strict" と宣 言している relaytcp. pl では、変数はすべて my 、 our 、 use vars" で宣言する必要がある。そこで、この行で非 いる。 なるべく、、 use Net::Relay::TCP;" に近い動作をさせ るために、この行は BEGIN プロックのなかにある。 なぜなら、 perldoc —f use " にも書いてあるように use Module;" は、、 BEGIN {require Module; im- port Module}" と等価だからである。 BEGIN プロッ クについては、コラム「 perl プログラムの実行」を参照 してほしい。 main サブルーチン 115 行目 Getopt: :Long: :Configure( pass-through') ; 第 1 ~ 2 段階の解析の時点ではすべてのオプションが 確定していないので、認識できないオプションはエラ ーにせずに無視し、 @ARGV に残すように指示してい る。 Getopt::Long のこの機能により、コマンド行オプ ションの処理を複数の段階に分けることカ河能になって いる。 121 行目 $opt{dir} = $optl{dir} Ⅱ ' 第 1 段階で解析したオプションのなかで通信の中継処理 に関係するのは -dir だけであり、—retropt と—help は無関係なので % 。 pt にはコピーされない。 130 行目 @opt{keys %opt2} = values %opt2; この行は以下と同じ効果がある。 while ( my ($k, $v) each %opt2 ) { 65
NEWS デル構成 ) 。データ容量は最大 4.8TB 、バ 250 , 000 、容量は最大 6.9TB 。ホストと ◆ ETERNUS VT600 ックアップ容量は最大 48TB ( 圧縮時 ) 。 の I/F は OCLINK0 テープライプラリ テープ処理をディスク上で仮想的に ホストとの I/F は、 Fibre Channel 、 OC 「 ETERNUS LT160 」を接続し、データ おこなうバックアップ装置 ( 2 モデル構 LINKO 成 ) 。仮想テーブドライプ数は最大 256 、 の一括書込みが可能。 価格は 4 , 709 万円から。 価格は 1 億 6 , 065 万円から。 仮想テープ・カートリッジ数は最大 ッチ機能により 5 台以上の仮想スイッチ に分割できる。スイッチング性能 ( レイヤ 4 / レイヤ 7 ) は 280 , 000 / 100 , 000cps ( スル ネットワンシステムズ ( Tel 03 ー 5462- ーブット 4.2Gbps) 、同時セッショ尉寺 Base SXX 12 の「 N2120 」がある。いず 0841 ) は、米 Nauticus Networks のス 数は 200 万セッション、 SSL 処理性能は れも最大 2 枚のファンクション・カード イッチ、、 N2000 〃シリーズの販売を開始 ( レイヤ 7 負荷分散カードまたは SSL 処理 18 , 000cps (3.6Gbps)0 外形寸去 (HXWXD) はいすれも 8.9X カード ) を装着でき、レイヤ 4 ~ 7 アプリ I/F が 10Base T/100Base TXx 44.2 x 66cm 、重量は最大 18kgo ケーション・スイッチング、 SSL アクセ 40 、 1000Base SX x4 の「 N2040 」、 1000 価格は 700 万円から。 ーチャル・スイ ラレーションカゞ可育皀。 •NetOneSystems SS L 高速化機能付きレイヤ 4 ~ 7 スイッチ ノ、 ・ RICOH A4 判カラー・レーサープリンタ リコー (Tel 0120 ー 561240 ) は、カラー 紙は 250 枚。ページ記述言語は、 RPCS 、 レーサープリンタ「 IPSiO CX3000 」の PostScript3 ( オプション ) 、 IBM5577 工 販売を開始した。 ミュレーション ( オプション ) など。 CPU 4 連タンデムエンジンにより、印刷速 は RM7065A ( 400MHz ) 、メモリは 32 外形寸法 (HXWXD) は 39.5X41.9x 度 ( モノクロ / カラー ) は 20ppm/16ppm MB ( 最大 384AIB ) 、 HD は IOGB ( オフ 53.6cm 、重量は 31kgo ( A4 判縦 ) 。両面印刷ュニットはオプション。 ション ) 。 I/F は、パラレル、 USB 2.0 、 価格は 228 , 000 円。 解像度は 1 , 200dpi 、用紙サイズは最大 A 10Base T/100Base TX 、 IEEE802.11b 4 判、給紙は 630 枚 ( 最大 1 , 690 枚 ) 、排 ( オフション ) など。 ・ UNISYS システムの構築、基幹業務システムに必 要なミドルウェアや運用管理ソフトウェ アの提供、テクニカルサポート・サーヒ、ス クスが Linux 関連事業をおこなってい 日本ユニシス (E—maiI linuxbiz—box の強イし たが、今後はグルーフ全体で推進する。 @unisys.co.jp) は、 Linux を使用した IT 推進業務を担当する部門として、 10 月 Linux 事業の柱は、おもに官公庁、電力、 サービス事業に本格参入すると発表した。 16 日付で「 Linux ピジネスセンター」を 大手金融機関などを対象とした基幹業務 日本ユニシスグループではユニアデッ 設置した。 書や手紙であり、本や新聞、雑誌の割合は 相対的に少ない。同時期にラジオやテレ ビ、電話、インターネット上を流れた情報 カリフォルニア大学バークレイ校の Pe- 光学メディアに新たに記録された情報量 総量は約 18EB と推計され、その大半は は約 5EB で、 1999 年におこなった同様の ter Lyman 孝対受、 HaI R. Varian 孝対受ら 電話によるものだという。 調査結果の約 2 倍。これらの情報の 92 % の研究グループは、 2002 年に世界中で新 報告書は http://www.sims.berkeley. はハードディスクを中心とする磁気メデ たに作成された情報総量は推計 5EB ( ェ edu/resea rch / projects / how—much— クサバイト ) に達すると発表した。 ィアに記録されている。紙に記録された info ー 2003 / で公開されている。 2002 年に紙、フィルム、磁気メディア、 ものも増加しているが、大半はオフィス文 UN 工 X MAGAZ 工 NE 2003.12 工ンターフライズ向け Linux 事業に参入 •UCB 2002 年の情報総量 21
連載 / Pe 日活用のヒント 型グロブ 型グロプとは、言嬲リ子の前に、 * " を付けたものである。型グロ プを別の型グロプに代入すれば、変数やファイルハンドルに別名 を付けることができる。たとえば、 & f00 &bar の別名になる。つまり、 $bar に代入した値は $ f 。。から読める UNIX MAGAZINE 2003. 12 . BASE_CLASS ; eval ' ファイルの最初の部分にある、 む。 -class オプションで指定されたクラスの定義を読み込 149 行目 eval ' ' require $class" ・ 付近の、、 use strict" によって禁止している。 は禁止しておいたほうがよい。 relaytcp. pl では、先頭 なときもあるが、バグの原因になる場合があるので通常 参照 (symbolic reference) と呼ぶ。記号的参照は便利 のように変数の名前を文字列で指定することを、記号的 %abc を %{"abc"} でも参照できるからである。上記 の言当である。右辺をこのように書けるのは、たとえば Net::ReIay::TCP をここに直接書くことを避けるため 右辺は \%Net::Relay::TCP::OPT-SPEC と等価で、 してほしい。 型グロプと呼ばれる。型グロプについてはコラムを参照 EC の別名と定義している。左辺の *base-opt-spec は %base-opt-spec を、 %Net::Relay::TCP::OPT-SP- '::OPT-SPEC'}; には十分だと思う。さらに詳しく知りたい場合は、 "perldoc 以上の内容を理解していれば、 relaytcp のコードを読むの 名にはならない。 とすると、 %foo は %bar の別名になるが、 $foo は $bar の別 * f00 \%bar ; とえば、 の場合は、参照元についてのみ別名でのアクセスが可能になる。た 型グロプには、参照 (reference) を代入することもできる。そ いうファイルハンドルでも操作できる。 また、 bar というファイルハンドルで開かれたファイルは f00 と し、 $foo{"abc"} に代入した値は $ bar { ' ' abc ' ' } から読める。 * f00 *bar ・ とすると、 $ f00 , 9f00 , が、それぞれ、 $bar , @bar , % f00 , %b ar , perlmod" の「 Symbol Table 」や、 perldoc perlsub" の 「 Passing symbol TabIe Entries (typeglobs) 」の項か参 考になるだろう。後者の冒頭では、型グロプの歴史について触れ ている。 WARNING: The mechanism described ⅲ this sec- tion was originally the only way to simulate pass-by- reference ⅲ older versions of PerI. While it still works fine ⅱ 1 modern verslons, reference is generally easier t0 work with. See below. ( 警告・ の項で説明する仕組みは、元来は Perl の旧版で参照渡しを齠以 的に実現する唯一の方法だった。現行の Perl でも問題なく動作 するが、新しい参照の仕組みのほうが一 -- 殳に扱いやすい。以下を 参照してほしい ) Perl 4 のころは参照がなかった。そのため、サカレーチンに大 きな配列全体やノ、ツシュ全体を渡すときは、呼び出す側が型グロ プを渡し、呼び出された側も型グロプで受ける、ということをし ていた。 PerI 4 のころに作成され、現在でも使われている jcode. pl (http://srekcah.org/jcode/) というパッケージがある。 のなかで定義されているサプルーチンの多くは、変換対象文字列 を型グロプで受け取っており、呼び出す側は型グロプあるいは参 照を渡す必要がある。 と同様である。 163 行目 Getopt: :Long::Configure('no-pass-=> through') ; コマンド行オプション角の第 3 段階では未知のオプシ ョンはないので、 GetOptions カ第哉できないオプショ ンにはエラーを出力する。 168 行目 if ( $optl{help} ) { —help オプションが指定されたときは、オプション一覧 を表示するだけで実際の処理はせずに終了する。 -help オプションは実際の処理とは関係ないので、 %opt には 反映されない。そのため % 。 ptl を参照する必要がある。 177 行目 my $appobj = $class- 〉 new(%opt, cmdname = 〉 $cmdname) or Net::Relay::TCP クラスまたは—class オプションで 指定されたクラスのオプジェクトを new メソッドで作 成し、そのオプジェクトに対して ma ⅲメソッドを起動 見てのとおり、 する。 67 る。したがって、—class オプションで指定するクラス この手順はクラスに関係なく同じであ
連載 / Pe 日活用のヒント UNIX MAGAZINE 2003.12 る。 threads- 〉 new() にはサプルーチンへの参照を渡す クライアントの処理をさせる別のスレッドを作ってい 355 行目 my $thr = threads- 〉 new(sub { め、このようにしている。 ションを使わないかぎり問題カ起こらないようにするた る。 threads カ吏えない Per け竟でも—threads オプ は、これがコンパイル時に無条件で実行されるからであ グマが肩効になるようにしている。 use を使わない理由 -threads オプションが有効なときだけ threads プラ 354 行目 require threads; 化の残りの作業をおこなっている。 準工ラー出力をファイルに結ひイ寸けるといったデーモン IO::Socket::INET- 〉 new の処理を乗り切ったので、標 330 行目 if ( $self- 〉 {daemon} ) { ように設疋している。 カ絲冬了してしまう。そこで、 PIPE シグナルを無視する PIPE シグナルでプロセスが終了すると relaytcp 全体 クライアントを 1 つのプロセスで処理しているので、 しかし、 -threads オプションが有効な場合はすべての スが終了しても、影響が全体におよぶことはない。 理されるからである。 PIPE シグナルが発生したプロセ は問題にならない。各クライアントカ甥リのプロセスで処 PIPE シグナルは、—threads オプションが無効な場合 了である。 PIPE シグナルに対するデフォルトの動作はプロセス終 現象が発生し、 relaytcp が PIPE シグナルを受け取る。 しい手順を踏まずにソケットを閉じたときにそのような 了しない場合がある。ネットワーク障害カ起きたり、正 relaytcp のクライアントや中継先との通信が正しく完 324 行目 $SIG{PIPE} = 'IGNORE' ・ い作らないので、この設疋をする必要はない。 オプションが指定されている場合は子プロセスをいっさ ンビとして残らないようにする設定である。 -threads 前回に説明したように、子プロセスを wait しなくてもゾ ( $self- 〉 {threads} ) ; 323 行目 $SIG{CHLD} = 'IGNORE' unless からである。 を起こしたときに端末にエラーメッセージを出力したい い IO::Socket::INET- 〉 new が次に控えており、エラー 付けていない。その理由は、比較的工ラーを起こしやす こでは、、 sub {... } " によって作られた名前のな い (anonymous) サプルーチンを渡している。 この名前のないサプルーチンはクロージャとして機能す る。クロージャについてはコラムを参照してほしい。 365 行目 $self- 〉 relay-nofork($client, $target, $recorddir, $count) ; マルチスレッドで動いているプログラムを fork しては いけない。 fork をともなう relay を使うことはありえ ないので、 こでは無条件に relay-nofork を呼び出し ている。 373 行目 if ( $pid = マルチプロセス動作の場合は、クライアントからの接続 があると fork し、子プロセスにその処理をおこなわせ る。 374 行目 close($listen) ; 接続を受け付けるソケット $listen は、クライアントの 処理をする子プロセスには不要なので閉じる。 389 行目 if ( $supercount ne -supercount オプションが指定された場合は、記録サ プディレクトリを切り替えるべきかを判断する。切り替 える必要があれば、 $count を初期値に戻して $super- count を増やし、新たなサプディレクトリを作る。 relay メソッド 143 行目 my $fnamesub = $self- 〉 {record} 記録ファイル名を返すサプルーチンをクロージャとして 作り、 $fnamesub に代入している。 148 行目 if ( $pid ) { fork して、親プロセスがクライアントから中継先の方向 に、子プロセスが中継先から親プロセスの方向に中継を おこなっ。 forward メソッド 123 行目 while ( sysread($from, $block, BLOCKSIZE) ) { 8 , 192 バイトを上限として、現在届いているデータを読 み込む。 EOF を検出するとループから抜ける。 124 行目 $self- 〉 $filter(\$block); req-filter または res-filter メソッドを呼び出す。読み 込んだ内容を書き換えるかもしれないので、 $block への 71
連載 / Pe 日活用のヒント 図 2 カーソルのサイズの変更 。、 " Oygvvin " のフロバティ オプション一フォント 1 しイアウトー画面の色ー カ効サイズ 0 小 0 中 コマンドの届歴 パッフアサイズ ( パッファ数 ( 冖 表示オプション マ挿入モド 簡易偏集モード 0 編集オプション 0 全画面表示 奩ウインドウ表示 「重複する古い履歴を破棄 0 現在のコドベ”ジ 2 (ANSVOEM- 日本語訃 if ト巫 ) Relay::TCP のサプクラスで、 HTTP 要求と応をすこ Net::ReIay::TCPHTTPHostHack クラスは Net:: クトの main メソッドを呼び出す。 HTTPHostHack オプジェクトを作成し、そのオプジェ 応じて Net::ReIay::TCP あるいは Net::ReIay::TCP- relaytcp. pl はコマンド行オプションを解析し、内容に に言泉する。 記録するように指定されていれば、通信内容をファイル ライアントと中継先のあいだの通信を中継する。通信を 処理を任されたプロセス / スレッドは中継先に接続し、ク ッドを作成し、そのクライアントの処理を任せる。 ・クライアントが接続してきたら別のプロセスまたはスレ ・クライアントからの接続を待つ。 をすべておこなう。 まず、 TCP. pm が relaytcp の中心であり、以下の処理 これらの概要は以下のとおりである。 62 pl について解説する。 末尾のリスト 1 に relaytcp. pl を示す relaytcp ・ pl て親クラスを継承している。 し書き換える処理のみカ第己述されており、それ以外はすべ 以下、 relaytcp. 全体の流れ relaytcp. pl では、ファイルの最後で、、 main " サプルー チンを呼び出している。このように書くことで、変数の初 期化などの宣言的な実行文が、 main サプルーチンを実行 する時点で確実に実行済みとなる。この記法の効果を例を 使って説明しよう。 以下のプログラムが、 hello. pl というファイルに保存さ れているとしよう。 " He110 Wor1d! " ・ が、実際に表示されるのは空行である。なぜなら、 2 行目 これを実行すれば、、 HeIIo WorId!" と出力されそうだ print $MSG, " \ Ⅱ " sub he110 { my $MSG he110 ( ) ; use strict ; 6 5 4 3 2 1 UNIX MAGAZ 工 NE 2003 . 12 hello. pl ではトップレベルの実質的実行文は hello サプ ればよい。 この問題の解決法は明らかで、 2 行目を最後にもってく line 7 . Use Of uninitialized value in print at he110. p1 $ perl —w he110. pl れるが、警告のみで解決はしてくれない。 プログラムを起動すると、 $MSG が未定義であると警告さ 以下のように perl コマンドに一 w オプションを付けて よびスコープだけをもとにおこなわれる。 ログラムが実際にどう動くかは考慮せず、字面上の川印お カ見れているからである。、、 use strict" による検査は、プ に $MSG か現れた時点で、すでに 4 行目に、、 my $MSG' 定義であることについては効果がない。なぜなら、 6 行目 1 行目の、、 use strict" は、 6 行目の実行時に $ MSG が未 前に書くのが自然である。 に値を保持する変数の初期設定は、サプルーチン定義の直 内で使う定数の定義や、次回のサプルーチン呼出しのため 理由は、それが自然だからである。 -- ヨ殳に、サプルーチン ままだからだ。 4 行目の $MSG の定義がこの位置にある されていないため、 6 行目で $MSG を参照しても未定義の で hello サプルーチンを呼び出した時点では 4 行目は実行
文 % おかけさまで 1 1 % 過酷環境での安定稼動が必要な、ラックマウントー A L i n u x サーパ市場において . 】 1 % のシェア獲得 . つからですか ? い プランド品に左右され、 自分で判断する事をやめたのは・ ラックマウント I A n Ⅱ X サーバ市場において、 ※ N E X G E N 1 し Ser i es 獲得 のシェア ■ AMD 0 リ Op 「 on 円 0 ( 門 50 「 ■ 5 ・ ATA 4HDD R 州 D5 + Hot 引 d by, Hot swappable. Aut0-Build& ・ Build. ■ True 64b ⅱ Linux 05 ね n を 5 に V 部引 0 ル (Released by Logi ( Effect ( 0 「 p ■ R000i09 0 ( に ed 30 / 35 ′ 40 d09 ~ 0 by L09i0 は ct 50P ・ , 400i09 ヨし 09i0 引 Eff ・ ct patent pending) \ 2 38 0 0 0 、 「勝ち組」の「高レベル技術者」は既に知。ている。 ロジカルイフェクトのラックマウント 当社サーバ製品が選はれるのは、例えはこんな理由。 全モデルが殆ど全てのオプション選択に対応。技術責任者が不要と思う機能が省ける、低コスト・有益なシステム構築が可能。 選択仕様の「まま」 5 0 / 1 0 0 / 1 5 0 h かっ 2 5 / 3 0 / 3 5 / 4 0 ℃の高負荷動作検証後に出荷。 H A / H p c クラスタリング検証にもオプション対応。 L i n u x や B S D が無料プリ・インストール済。インストールする手間が省け、また本当に 1 台ずつ動作検証している証です。 検証するからこそ、当社で一番不良発生頻度が高いのは「配送トラブル」。だから全てのサーバを二重梱包 & 配送保険付で出荷。 出荷期間を急ぐなら短縮オプション。計画的なら価格が魅力の延長オプション。 ( 多忙につき、無計画又は横柄な人は他社で買う事。 保証期間が選べる。長期保証が必要なエンジニアは 2 ~ 3 年保証を、独自拡張が必要なエンジニアなら短期保証が選択できます。 0 E M 主体企業です。どこにも存在しない特殊仕様大歓迎。台数 1 桁は困ります。また技術的興味が湧かなけれは請け負いません。 ) 0 選はれたのは 独創性 i n 題 x / S D 搭載 標準備 オフション ※表記方法 : 「勝ち組」の「高レベル技術者」たけが使いこなせる ラックマウント 1 U サーバ ⅢⅱⅢⅢⅢ R A 印 ッステ点 日 A ー D ッステぎ . 高速・安定・最高機能を実現した上位モデル ULTRA COOL 1 U/2U/3U/4U \ 3 , 800 ~ し第い宿 / MS 系各種対応 ( L 新い / 日 SD プ屮インストール ) P4 ー 8 ~ 06G / DUAL pm/ A ー 00 / XEON 2 5 SM 日 ~ ー OG 日メそリ ■ 40GB ~ 250G 日ハードディスク・ドライプ しロ「 鷲日Ⅱⅱは こ重馞 自己解決力の高い熟線者向け製品 安定性とコストパフォ - マンスを両立 Caplyst 1U/2U/4U Raxys 1 U/2U/3U/4U Redhat/ Mi い 0 “系に対応 (Redhat Pr い引 ) ー L 剛朝日 SD / MS 系各・対応にれい / BSD プ屮インストール ) 0 を on ー 06H ~ ~ P を猷池 m4 2 6GHZ ・ C 紕 on 1 . OGH ′ ~ P4 3.06G ~ DLJAL PÆ /AtNon/XEON 128V 日 ~ 1 OG 日メモリ 256VB ~ 2 -0G3 メモリ ー 40G 日 ~ 2 5 06 日ハードディスク・ドライプ ・ 40G 日 ~ 250G 日ハード〒イスクドライプ R ′ロし - ′ステム RA ー D ンステ 高レベル技術者の為の超高速ルータ N e t b i ⅱ t y 1 U / 3 U \ 38 00 、 10 / 100 スルーブット最大 96 Ⅷ ps / G ー最大 6 ー OMbp を ADSL/FTTH/ S ”国 / G 物 3 ; MAXSPort ・ VPN(3DES)/ PPPoE/ DHCP/ 一定 IP/ NAT S 、 MP/ SMTP/ Packet F 0 れ ng / Sy 引 0 / 0 れ カスケ“ト カスケト 対 技術者の為の NAS サーバ。最大 20LAN 対応 Raxys NAS IU/2U/3U/4U \ , 80 い 1 は X K 0 引載 P をⅳ m4 3.06GHZ C を尾 r01 1.OGHz ・ 256V 日 ~ 2.0G8 メモリ 40GB ハードウェア RA の 1 ~ 3 -51 日 RAlD5 ロングセラーの安定・実績 KVM スイッチ Raxys I/O Manager \ 33 , 止 lu 日 Po 「レ 2 し一 6P0 対応 ーフロントパネルの他、 0S0 によりイ 3 での切讐にも対応 ー 1 し最大 64P0 & 2 し最大 192P0 カスケ - ド接続対応 オプションで 2 拠点のコンソール設置に対応 ネットワーク管理者の為のコンソ - ル機 Raxys AIIinIU&A 旧 /OinIU \ , 800 、 ー 1F1 液曇 & K 日 & 10 “ hP 格載 1 しコンソール型 & 1 し 8P0 KVMN& 2u16P0 KVM ・最大 64P0 & 2 し最大 192P0 残カスケ - ド接続対応 ーオプションで 2 拠点のコンソール設置に対応 MAX Gi 地 20 は N 応 ラック型 遠隔地からサーパの 0 N / 0 F F KAD 型 : P4 / XEON 用ラックキャビネット XEON 積載 / Athlonl 0 酬 e 「 on 対応モデル 遠隔地から LJ P S の 0 N / 0 F F 凵 n e n ー e 「 a c ⅱ v e & 0 N - 凵 n e IJ P S VIA Net Switch R 0 x y s X U U L T R A C 〇〇 L X U V ー A N e t U P S N E CJ P S \ 143 , 80 \ 28 , 80 ①、 \ 2 圧 ! LJ 日・ロコンセント / 00 V A または 10 0 0 A に対応 純 / 15 / 30 / 35 / 4 ル対応 ( 各覆 1 し単位で特注増滝可能 ) ・最高級性能品質を目物し実現したラックキャビネット ラインインタラクテイプ製 u P S MS 系のほか . い n い各種 ( 0 を b 朝含 ) / 日 SD 各種に対応 SNMP W 0 .rd により、ネットワーク経での強物が可物 4 1 ーし = 9 0 K と、アルミ多用ドより軽ー化を実現 2 し 1 5 0 0 V A 及び 3 u 3 0 0 0 V A に対応 ラインインタラクテイプ / オンライン u P S フロント第に強化ガラス用 ()B & し RF そデル ) カスケード機験により・大 5 4 強口まで一第一・が可 第張パッテリーにより、無限パックアップ電第が可能 サイフロント。リアドアキャスタスタンド宿準 ・一 7 基 ( S 日 & LRF)/ 34 基 ( 覊 - S は 0 ” ) の強力 FA 、格載 ラックマウント第及びタワー製をラインナップ ・各宿スケジューリングに対応 . し p 5 との道第プレー対応 V ー A N 0 ー Sw ・一 0 h との物プレーに対応 インテリジェント及びノンインテリジェント製 ・天板ポトムー 0 A タッチケープルガイド宿準 ・各種第品を宿準で載 加 g なロジカルイフェクト株式会社 50 : 50 は世界常識。 これからの日本を担う , www 」凹 a 阨い① m をに ct 私達は、世界常識を 新概念の日本企業を 朝東京都台東区浅草橋 2 -18-6 ロジカルスクエア 実践する日本企業です 私達は応援します。 ※製品名・商品名・その他本文中に記載される名称などは全て各社商品名または登録商標です . ※製品仕様・価格は予告無く変更される事があります . ※価格・仕様はオンライン見積画面上にて確認する必要があります . ※製品価格には消費税・送料は含ます . ※当社製品は技術力のある技術者の方 のみが購入でき、サポートが不要な方を基本としています . 製品価格にサポート料金は含まれません . ※製品到着後、組込済 OS にて動作確認を取らず、自ら再インストールする行為に疑問を感じない方は、当社では技術者として全く認めていません . 責社が不幸になる「だけ」ですので、絶対に講 入しないで下さい . ※ 1 : 2 0 0 3 年公表の国内各社市場鋼査機関データを元に平均価算出 . 当社調べ . ( OEM 供給数含まず . 自社プランド品のみ ) ※ 2 : 当社販売代理店からの購入は可能 . ただし必ずユーザ自身が見積画面上で仕様を決める必要があります . 対応 対応 - 0 、嗄と 特注設計の
表 1 MICROLINE シリース主要重のおもなイ策 カラープリンタ 用紙 解像度 印刷速度 メモリ ( 標準 / 最大 ) / く一・ジ言杢・茜言吾 フォント HDD ネットワーク インターフェイス 給紙容量 その他 モノクロプリンタ 用紙 解像度 印刷速度 メモリ ( 標準 / 最大 ) ノヾーシ言言吾 フォント HDD ネットワーク インターフェイス 給紙容量 M ℃ ROLINE 9500PS - F ハガキ ~ A3 ノビ True 1 , 200dpi カラー 30ppm / モノクロ 37ppm A4 ョコ ) 最大 600 枚 USB 、パラレル、シリアル 100B e TX 5GB 日本語 ( モリサワ ) 5 書体 / 欧文 136 書体 PostScript 3 ( 純正 ) 64MB / 192MB 16ppm ()4 ョコ ) True 1 , 200dpi ハガキ ~ A3 ノビ M ℃ ROLINE 1055PS 自動両面 E 明リ機能 最大 2 , 850 枚 ( オプション装着時 ) USB 、パラレル 100B e TX IOGB 日本語 ( モリサワ ) 5 書体 / 区た史 136 書体 PostScript 3 ( 純正 ) 192MB / 1 , 024MB ドットインパクト・プリンタ 用紙 印刷速度 複写育幼 インターフェイス その他 M ℃ RO 凵 NE 8480SU/SU-R 連辛氏幅 4 ~ 16 インチ 漢字 160 字 /s ( 高速モード時 ) 最大 8 枚 ( オリジナル含む ) USB 、パラレル 7 種類のバーコード印刷カ河能 NOTICE 7 種類のバーコード E 明リカ河能 USB 、パラレル 最大 6 枚 ( オリジナル含む ) 漢字 140 字 /s ( 高速モード時 ) 連彳氏幅 3 ~ 12 インチ M ℃ ROLINE 5650SU - R 最大 850 枚 ( オプション装着時 ) USB 、パラレル 100B ase TX 日を吾 ( 平成 ) 4 書体 / 欧丈 136 書体 PostScript 3 ( 互換 ) 32MB 18ppm ()4 タテ ) 1 , 200 X 600dpi ノ、ガキ ~ A4 M ℃ ROLINE 18N 日 自動両面印刷機能 ( オプション ) 最大 930 枚 ( オプション装着時 ) USB 、パラレル 100B e TX 日吾 ( 平成 ) 2 書体 / 区仗 136 書体 post script 3 ( 互換 ) 64MB / 128MB カラー 12ppm / モノクロ 20ppm ()4 タテ ) 1 , 200 X 600dpi B5—A4 M ℃ ROLINE 5300 UNIX Printing System を使って UNIX/Linux 環 境からの印刷か容易におこなえる。 ネットワーク十 PostScript 対応 表 1 に示したカラープリンタやモノクロプリンタは ネットワークに接続して利用できるだけでなく、 Post- script インタープリタを備えているため、 UNIX や Linux のアプリケーションからも簡単に出力できる。 Web ブラウザを利用した管理 ネットワーク・インターフェイスを備えたモデルでは、 web プラウザを用いた管理カ河能になっている。たと えば、トナーの残量やドラム寿命のモニタリング、デフ ォルトの印字濃度設定 ( トナーセープ ) などの設定がで UNIX MAGAZINE 2003. 12 きる。 以下では、 MICROLINE 5300 ( 写真 1 ) を例にと り、 MICROLINE シリーズのおもな機能を紹介する。 ネットワーク経由で状態を把握 Windows であれば、プリンタ固有のステータス・モ ニターをデスクトップに表示させ、プリンタか在どう いう状態にあるかを簡単に把握できる。しかしながら、 UNIX/Linux の場合には、この種のツールは ( 一部の インクジェット・プリンタを除き ) 提供されていない。 それでは、いちいちプリンタのある場所まで足を運んで 確認しなければならないのだろうか。 MICROLINE で 23