UN Ⅸ便利帖 宮下健輔 伝言板システムを作ろう この連載では、 UNIX を便利に使うために、いろいろ なシステムを作ったり各種のアプリケーションを紹介して いきます。 今回は、前号の特集で作成した日記帳システムの閲覧用 プログラム (nikki. (h) を拡張して、はかの家族もコメン トを書き込めるようにします。さらに、もとになる日記を 書かすにコメントだけを蓄積するような仕掛けにすれば、 伝言板システムにもなりそうです。朝早く出勤して夜遅く 帰ってくるお父さんのために、家族との会話の助けになる ようなシステムを作ってみようと思います。 日記帳システムの拡張 ます、はかの家族がコメントを書き込めるように日記帳 システムを拡張します。日記ファイルの作成にはふだん使 いれているエデイタを利用していますが、コメントはほ かの家族も使いやすいように Netscape Communicator 似ード、 netscape と略 ) を使って書き込むイ兼にします。 作業の具ー純勺な手順は次のようになります。 1. コメントを書き込む欄を表示するように nikki. sh を改 造する。 2. コメントを受け付けてそれを保存する CGI プログラム を作成する。 3. 保存されたコメントを日記とともに表示する仕組みを用 意する ( これも nikki. sh ので見します ) 。 こでは、家族しか使わす、しかもネットワークには常 日罸妾続していない言 t 算機を前提としているので、コメント 書込み時のセキュリテイや排他制脚、認証などは思いきっ て省略します。つまり、はかの人になりすましてコメント 98 を書き込むこともできてしまいますが、これは各人の良心 にイモせ、多少のいたすらは笑ってすませましよう。 コメント入力欄の表示 ます前回の nikki. sh を改造して、コメントを書き込 む欄を表示するようにします。これには、前回も使った HTML の form というタグを利用します。リスト 1 か改 造した nikki. sh です。 10 行目と、 23 ~ 31 行目が追加した部分です。 10 行目では、書き込まれたコメントを保存しておくファ イルの名前を定義しています。これは、日記ファイルの名 . comment" を付けたものになります。 則に 23 行目で、前回も使ったく hr > タグを用いて区切りと なる水謦泉を引き、続く行で「コメントを記入してくださ い」という見出しを表示して、 f 。 rm タグを使ったコメン ト記入欄を作ります。 コメントを受け付けて保存する CGI プログラムは comment ・ cgi という名前にし、引数は get を使って渡 すことにします ( 25 行目 ) 。 CGI プログラムは -/public- html/nikki/bin のなかに作ります。これは nikki. sh が 置かれているのと同しディレクトリなので、 nikki. sh に はパス名を省略してファイル名だけを書けばよいことにな ります。 26 行目で、コメントを誰か書いたのかが分かるように 、 Fr 。 rn : " の後ろに名前を記入する欄を作ります。 input タ グの type を text にして 1 行の記入欄を作り、そのなか に入力してもらうことにします。 次に、コメント自体を記入する欄を、、 Comments:" の 後ろに作ります。これは名前と同様に text 型としてもい いのですが、何行にもわたるコメントでも書きやすいよう UNIX MAGAZINE 1999.12
■ Web サーバーの性能評価 有できるように私まで送ってほしい。 ■ Lincoln D. Stein Usage : $ 0 ー [options] URL $US AGE = くく USAGE ; use Getopt : : Std; use POSIX 'WNOHANG' ・ use IO: :Pipe; use IO : :Socket ; ' sleep use Time : :HiRes ) # Torture test Web servers and scripts . # file: torture. pl # ! /usr/local/bin/perl # The main body of torture . p1 リスト 1 torture. pl fe-iltps. htm http://www.platinum.com/products/appdev/ [ 5 ] Platinum Final Exam WebLoad http://www.merc-int.com/products/ [ 4 ] Mercury lnteractive Astra SiteTest http://www.loadtesting.com [ 3 ] LoadTest ing.com Portent http://stein.cshl.org/&lstein/torture/ [ 2 ] torture. pl Horne Page http://www.perl.com/CPAN/ [ 1 ] Comprehensive Perl Archive Network (CPAN) [ 赭 URL] 「 WEB Techniques 」の Webmaster's Domain のコラムニスト。 [ 6 ] RadView WebLoad http://www.radview.com/webload/ [ 7 ] Rational PerformanceStudio http://www.rational.com/products/pstudio/ index. jtmpl [ 8 ] Segue Software SilkPerformer http ・ //www.segue.com/htrnl/s-solutions/ s-performer/s-performer. htm [ 9 ] SPECweb96 benchmark http://www.spec ・ org/osg/web96/ [ 10 ] ZD WebBench http://www.zdnet.com/zdbop/webbench/ webbench. html 「 The Dark Side of Perl: Torture-Testing Web Servers 」 WEB Techniques 1999 年 7 月号より ◎ 1999 , WEB Techniques (). S. A. ) Torture—test Options : ー 1 く integer> —t く integer> —c く integer> —d く float> ¯P USAGE Web servers and CGI scripts Mean delay between serial accesses Number of copies of program to run Number Of times tO run the test Max length 0f random URL t0 send [ 0 bytes] [ 1 ] [ 1 ] [ 0 sec] Use POST method rather than GET method Attach random data t0 path rather than query string Send raw (non—escaped) data $VERSION = ' 1 . 05 , ; # process command line getopts('1:t:c:d:Pprx') Ⅱ die $USAGE; # get parameters $URL $MAXLEN $TIMES $COPIES $DELAY $POST 64 shift $opt-l $opt-t $opt-c = $opt-d = $opt-P Ⅱ Ⅱ Ⅱ Ⅱ Ⅱ Ⅱ die $USAGE ; 0 ; 1 ; 1 ; 0 ; 0 ; UNIX MAGAZINE 1999.12
連載倉敷芸術科学大学のネットワーク構築ー⑩ 図 6 ログのローテーションをおこなうスクリプト # ! /bin/csh foreach i ( ' ls $DIR/$FILE ー sort —r $SORT—OPTION つ set counter = 10 set SORT_OPTION = , —t . + 2n ' set FILE = 'detail . * ' set DIR = /var/adm/radacct/tc()l . kusa ・ ac ・ jp 122 発生を予測するトトカルチョでも始めようかと思うはど、 出合えないような楽しみなイベントかもしれません。問題 見方を変えると、 2000 年問題は、もしかすると 2 度と くのあいだは大変な日々か読きそうです。 ョンや PC の対応をおこなわなけれはなりません。しばら 効に使って、研究室に個別配置されているワークステーシ が立っているものばかりです。あとは残り少ない時間を有 群についての対策は、すでに実施されているか対策のめど も、基幹ネットワークと全学で共同利用しているサーバー 領分がネットワークだからという理由です ) 。すくなくと 分についての対策を優先して実施しています ( たんに私の 倉敷芸科・大では、とりあえすネットワークに里する部 ジョンアップを実施するといった経験もしました。 っていた製品がじつは対応できておらず、後日さ引ンヾー 理不尽なことに、 1 度メーカーから対応斉みと返答をもら を法律で義務っ財ている米国では考えられない返答です。 いただいたことも多々あります。べンダーによる情報開示 ては答えられない」といういかにももっともらしい返事を に間い合わせても、「保守契約に入っていない機器につい 2000 年問題に関する情報カ針・分に公開されていないため ンアップする作業も、それほど簡単には実施できません。 ペレーティング・システムやアプリケーションをバージョ 2000 年問題に対応させるためのパッチを当てたり、オ 算すると、急激にやる気が失ぜてしまいます。 対策を必喫とする機材リストと対策に必喫なコストを計 あきらめの境地 しないので、検富印こは発見できなかったのです。 end endi f rm $i else @ counter— if ( $counter ! = 0 ) then 描丘は楽しみにさえ感しています ( ものすごく不謹慎です が・・・・・ ) 。あとすこしですので、読者の皆さんも気を抜か すに頑張ってください。 皆さんは、スーパーマーケットの鮮魚コーナーや魚屋さ んでかかっている、耳に残る曲をご存しですか ? 「おさか な天対」というタイトルで、里 ( 全国漁業協同組合連 合会 ) という漁協の親分 ( ? ) が魚の販売止のために制作 したアニメのテーマソングだそうです。この曲が全国 10 万 ( ? ) カ所のさかな売場でヘピー・ローテーションされて いるのです 子どもができて食品の買物につきあう回数か増えた私 は、どうしてもこの曲が頭から離れすにいました。そん なある日、車に同乗していた学生が口ずさんでいるのを聞 き、 Web を使って正体を突き止めようということになり ました。さっそく司をもとに十館きしたところ、全鮖里の ホームページ (http://www.zengyoren ・ or. jp/seafood /seaindex. html) で販売されていたので、思わす買って しまいました。いまでは、私の車のヘピー・ローテーショ ンに仲間入りしています。 「さかな、さかな、さかな ~ 。さかなを食べると ~ 」 妙に魚が食べたくなるこの曲、皆さんもいかがですか ? にばやし・かずまさ倉敷芸斗学大学 / 奈良先端科判支術大完大学 ) 今月のあんか UNIX MAGAZINE 1999 ユ 2
連載 / 倉敷芸術科学大学のネットワーク構築ー⑩ 図 3 logflush シェル・スクリプト # ! /bin/csh set DIR=/var/adm/radacct/$1 set LOGDIR=$DIR/ 'date + %EY' set LOGFILE=detai1 if ! ()d $LOGDIR) then mkdir $LOGDIR endif cp $DIR/$LOGFILE $LOGDIR/$LOGFILE. ( date + %y%m%d' ↑問題の箇所 0 0 1 * * /var/adm/radacct/logflush tc01. kusa ・ ac ・ jp >/dev/null 2 > & 1 # radius 10g flush 図 4 crontab の記述 ↑問題の箇所 compress $LOGDIR/$LOGFILE. 'date + %y%m%d ( cp /dev/null $DIR/$LOGFILE cp $DIR/$LOGFILE $DIR/$LOGFILE. 01d 図 5 言泉していたログのファイル名 detail .990501. Z detail .990601 . Z detail .990701. Z detail .990801. Z detail .990901. Z detail .991001 . Z いては、 2000 年間題に対処するために必要な情報か不足 していて [ 11 ] 、実際に何が起こるかを予測できていませ ん。万一 2000 年間題でサーバー機能がだめになった場合 には、 PC などで代わりのサ→ヾーを立ち一日ナることにし ています。 Windows 95 / 98 や Windows NT など Microsoft 製 品については、 Web ページ [ 12 , 13 ] で対大況が公開さ れています。 ネットワーク機器 今回のネットワーク更新て導入した製品は、もちろん 2000 年ド。地に対応しています [ 14 ] 。 Cisco[15] や 3Com [ 16 ] 、 Nortel Networks[17] など の製品で倉敷芸科大か所有しているものは、すでにはとん ど対応力院了しています。言岩田は Web に開示されていま す。 このはかにも、 Fore Systems の ATM スイッチや NEC の ATOMIS スイッチ、日立の HS -150-2 などネッ トワーク系の製品を多数所有していますが、対応ははとん ど完了しています ( 導入が上如罅斤しいものと、日頃から ソフトウェアの更新をおこなっていたものの多くは対応斉 UNIX MAGAZINE 1999.12 みです ) 。 最近みつけた 2000 年問題 オペレーティング・システムの対応か完了したからと いって、かならすしも 2000 年間題に対応できていると はかぎりません。自分では忘れていても、つい 2 桁表示を 使ってしまっていることがあります。私もしつかりはまっ ていました ( 新しいダイヤルアップ・サーバーを新設しな かったら、みつけられなかったかもしれません ) 。 倉敷芸科大では、ダイヤルアップ・サーバーで利用し ている RADIUS サ→ヾーでのアクセスログを、日付をも とに自動更新していました。 date コマンドの出力を加工 してログファイルのファイル名として活用していたのです ( 図 3 ~ 5 ) 。 このままだと、描丘のものから 10 世代ぶんのログを保 存するつもりが、 2000 年以降のログが旧い言求として誤 認識され、まったく記録されなくなってしまいます ( 図 6 ) 。オペレーティング・システムに関しては対応か完了 したことになっており、 date コマンドにも 4 桁表示する オプション ( + (Y) がきちんと用意されています。作成し たシェル・スクリプトやプログラムについても慎重に調査 と対応をおこなう必要があるということでしよう。ー信己の 現象は、日時を 2000 年に進めたテストでは表面化しませ んでした。 1 カ月経たないとログのローテーションが発生 121
図 5 swatch の東習用ファイル ( その 1 ) /su: \S + tO root/ mail=root この空白はタブ文字 「 /var/log/messages ファイルは、 1 日に ションされてしまう」 ことです。具イ列を示して説明しましよう。 ↑ 最初の書式では、んん時 mm 分に swatch を再起動し ます。日骸リに続けてと pm を指定することができます ( 省略するととして扱われます ) 。たとえば、 swatch —r 02 :00am ・ 1 回ロ と指定すると、午前 2 時ちょうどに swatch を再起動し ます。 時間の前に、、 + " を書くと、んん日 rnm 分後に swatch を再起動します。たとえは、 % swatch —t /var/log/messages & のように起動した swatch は、 /var/log/messages に記 録されるログメッセージを監視し続けます。 こで、夜 間にログファイルのローテーションがおこなわれること を思い出してください。ローテーション処理がおこなわ れると、 /var/log/messages の実体 ( ディスク上に書 かれたデータブロック ) はそのままですが、ファイル名 が /var/log/messages. 0 に変更されます。すると、 /var /log/messages を監視していたはすの swatch は、いつ のまにか /var/log/messages. 0 というファイルを監視す ることになってしまうのです ( 図 7 ) 。 ローテーション・プログラムは、ログファイルをロー テーションしたあと、新たなログファイルとして /var/log /messages を作成します ( 図 7 ) 。そして、 syslog カ当求 するログメッセージは、この新しく作成されたログファイ ルに書き込まれていきます。 swatch は、もはやログか書かれることのないファイル をみて、 「ログメッセージ、全然書かれへんなあ。平和やなあ。そ れにしても暇や」 などとつぶやきながら余生を過ごしています。ところが、 その一方でログは別のファイルにどんどん書き込まれま す。 このまま見当はすれの監視を続けていても意味がありま せん。現在動いている swatch を停止し、新たに起動し なおす必要があります。 swatch には、このような場合に 備えて再起動オプション、一 r ' が用意されています。この オプションは 1 つの引数を必要とし、次の書式で指定し swatch ーて + 01 : 00 ます。 swatch swatch 28 -r んん : mrn [ lpm] 十んん : 7 〃 7 れ とすると、その時点から 1 時間後に swatch を再起動し ます。 要するに、 messages ファイノレのローテーション一彳麦に swatch を 再起動すればよい」 ことになります。しかし、たとえは、 ・午前 2 時 0 分にログファイルをローテーションする 午前 2 時 0 分に swatch を再起重丿ける と設定した場合、タイミングによっては swatch の再起 重丿ほうがさきに実行されてしまうかもしれません。そこ で、再起重ル ) タイミングはローテーション処理から 1 分ぐ らいすらしておくとよいでしよう。 間題はまだあります。理由は分かりませんが、 フションではうまく再起動できないのです。 swatch 2.2 はかなり古いプログラムなので、もしかすると大昔の Perl では動いたのかもしれません。とりあえす、再起動できる ようにするパッチを末尾のリスト 1 に載せておきます。イ ンストール後に、次のコマンドを実行してこのパッチを当 ててください。 # cd /usr/local/bin # patch くノ、ツチファイル またまた強引ですが、とりあえすログファイルを監視す る去は理解できたことにしましよう。次は、システムの 状態の監視です。 現在のシステムの状態、たとえば CPU の負荷やディス クの使用率などはログファイルを見ただけでは分かりませ ん。そこで、次のようにして df の結果を logger コマンド UNIX MAGAZINE 1999 ユ 2
は、 UNIX らしいといえるのではないでしようか 2 。さら に、 xstr プログラムの仕様で、プログラムを処理した結 果が x. c という 1 つのファイルにオ内されるため、複数 のファイルを処理するのはちょっと面倒という問題もあり ます。 -c オプションを付けて xstr コマンドを実行した場合、 すべてのソースコードを処理したあとで、 xs. c ファイルを 作成しなけれはなりません。これには、引数なしで xstr コ マンドを実行します。これにより、 strings の内容が xs. c ファイルに反映されます。 xstr のソースコード それでは、 xstr のソースコードをみていきましよう。 FreeBSD では、 /usr/src/usr. bin/xstr に置かれていま す。ファイル名は xstr. c です。 ます目に留まるのが、次のようなコメントです。 * xstr ー extract and hash strings in a * C program * Bi11 Joy UCB * November , 1978 あの Bill Joy の作品だったのですれ その直後には、ちょっとしたマクロが定義されていま if (signa1(SIGINT, SIG—IGN) signa1(SIGINT, onintr) ; これにより、割込みシグナルを受けたときに onintr 関 数か呼び出されるようになります。 onintr 関数は、中間 ファイルを削除するなど、後処理をおこなうためのもので す ( 後します ) 。 次は、 strings から xstr 配列の初期値を得るかどうか を決める部分です。 if (cflg Ⅱ (argc inithash() ; = SIG_DFL) 0 & & !readstd)) else strings = mktemp (strdup (—PATH—TMP) ) ; 最初の if 文の牛は、 ・ -c オプションカ甘旨定されている ・ ( 標準入力を示す一も含めて ) 引数カ甘旨定されていない のいすれかが成り立っ場合に真となります。 条件が真にならない、つまり -c オプションを付けすに 単軸のファイルを処理する場合には、データベース・ファ イルを指す strings 変数に一ファイルの名前を指定して います。 -PATH-TMP は、同じディレクトリの path- name. h で定義されているマクロで、 #de f ine _PATH_TMP "/tmp/xstrXXXXXX" す。 #define ignore (a) このマクロは、 ignore (unlink (s) ) ; ((void) a) のように使い、関数の戻り値を無視することをコンパイラ に知らせるためのものです。もちろん、毎回、 (void)unlink(s) ; などとしてもよいのですが、マクロを使ったはうかプログ ラマーの意図カ転わりやすくなります。 main 関数の最初で引数の処理をおこなったあと、 sig- nal でシグナルハンドラを登録しています。 2 コードクで文字列を削除 ( もしくは変した場合、 xstr 酉リによけ いな文字列カ略 : 干残ってしまうことがあります。せつかく苦労して文列 を共有しているのにもったいないと思うかもしれませんが、プログラムの 開発中には少々の無馮太には目をつぶって開多餃丿蟀を優先させ、プログラム の完友後に xstr 酉改リを最初から作りなおせは地はありません。 130 となっています。一方、通常のデータベース strings はカ レント・ディレクトリに作成するので、カレント・ディレ クトリからの相対パスとなっています。この違いが、あと で未をもってきます。 次は、 main 関数のメインループです。 while (readstd Ⅱ argc > 0 ) { argv 十十 ; argc¯ readstd = 0 ; 標準入力を読むべき ( 引数として一カ甘旨定された ) か、引 数か残っているあいだは、メインループを回ります。ファ イルを処理した場合には、 argc と argv の値を調整しま す。標準入力から読み込んだ場合には、 readstd を 0 に することで再度読み込まないようにしています。 if (readstd = = 0 ) else UNIX MAGAZINE 1999 ユ 2
連載 / IJN Ⅸ便利帖ー① cess というファイルを作っておきます。 それでは、この伝言板の仕様を決めましよう。一日のよ うに、 index ・ cgi という CGI プログラムがこの伝言板に 関するすべての処理をおこなうようにします。つまり、伝 言を表示する処理と、新しい伝言を受け付けて保存する処 理です。 伝言の表示は、日記と同様のイ督はみとし、空行を段落の 区切りと考えます。 また、伝言を保存するファイルはこの CGI プログラム と同しディレクトリに messages という名前で用意し、新 たな伝言はそれを書き込んだ人の名前と日該リを添えてファ イルに追加することにします。 以 E のような仕様をもとに作成した CGI プログラムが 19 } リスト 9 です。 まず 3 行目で CGI. pm の利用を宣言しています。今回 は、新しい伝言を受け付ける仕事もこのプログラムにさせ るので、 form タグを使った HTML を作成するための関 数のセットである f 。 rm の使用も旦暠しています。 5 行目は伝言を保存するためのファイルの名前を定義し ています。 7 ~ 19 行目で新しい伝言をこのファイルに保存します。 8 ~ 9 行目では、 Perl の関数である time と localtime を使って伝言か書き込まれた ( 現在の ) 日付と時刻を取得 しています。 11 ~ 18 行目では、この情報をもとに、この CGI プログラムに渡された引数とともに伝言をファイル に追加しています。 以 - ヒカイ云言を受け付けるための部分です。 次に 21 行目からの 3 行で、すでにある伝言を表示して 新しい伝言を受け付けるべージの見出しを作ります。 25 ~ 35 行目では、すでに存在する伝言を表示するため に、伝言を保存しているファイルの内容を一 - ・覧表示させま す。 28 ~ 33 行目では、日記ファイルのときと同伝言 中の空行を段落の区切りに変換しています。 最後に 37 行目から始まる部分で、新しい伝言を書き込 むための記入欄を生成しています。さきほど nikki. sh で 作成したのと同しような記入欄を 2 個作ります。 CGI プログラムを作成したら、実行できるように属性 を変更します。 um% chmod + x -/public—html/dengonban/index ・ cgi リスト 9 index. cgi の内容 7 if (param()) { $file = "messages" use CGI qw/ : cgi :htm12 # ! /usr/bin/perl 1 2 3 4 5 6 8 9 10 11 12 13 14 15 16 17 18 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 } 35 36 37 38 39 40 41 42 43 44 45 46 47 48 : form/ ; ($sec,$min,$hour,$mday,$mon,$year, $wday , $yday , $isdst) localtime(time) ; open(FILE, " > > $file") Ⅱ die; param( 'from' ) , print FILE "From: $mday , $min , $mon + 1 , $sec, $hour , ")\n\n", param('message'), c10se(FILE) ; print header , start—html( 'Message Board' ) , hl ( 'Message Board' ) ; print p ; open(FILE, ”く $file") Ⅱ die; while ( く FILE>) { print p ; else { print $ ー 104 c10se(FILE) ; print hr , start—form, textfield(—name=>'from' —default=>' ' —size=>20) , p, "Message: textarea(—name=>'message —default=> 冖 —rows=>5 , ー C011 加 ns = > 80 ) , p, submit , end_form; UNIX MAGAZINE 1999 ユ 2 um% touch messages um% cd -/public—html/dengonban ミッションを変更します。 ファイルのパ メントファイルと同様、 httpd か書き込めるようにこの ためのファイルを作っておきます。日記帳システムのコ CGI プログラムを実行する前に、伝言を保存しておく 49 print end—html ;
インターフェイスの街角 く code>wtangle く /code> プログラムは、 HTML ファイルとして記述された、 簡易文芸的プログラミング文書から プログラム部分だけを抽出する Per1 プログラムである。 本 HTML 文書に対してく code>wtangle く /code> を適用すると く code>wtangle く /code> プログラムが得られるので、 コンパイラのようにプートストラップ式に 開発していくことができるはずである。 以下にく code>wtangle く /code> プログラムの全ソースと その解説を記述する。く p> く h3 > プログラムく / h3 > く a href="#prologue"> く code>prologue() く /code> く /a> で プログラムの初期化をおこない、 く a href="#main"> く code>main() く /code> く /a> で HTML ファイルからのプログラム抽出処理をおこない、 く a href="#epilogue"> く code>epilogue() く /code> く /a> で ファイル書出しをおこなう。 く p> く div style="border: thin S01id black; margin: 0 0 く pre f ile=wtangle> # ! /usr/local/bin/perl # wtangle ー Web Tang1e &prologue ; &main ; &epilogue; く /pre> く /div> く name=initialize> く h3 > 初期化処理く / h3 > 0 図 4 、 veb プラウサでの ( プログラム部 ) 下 - E はいを第ー = 0 - 新 00 を w ねれ gle アログラム 田円アログラムは . 日 TM しファイルとしてぎ己さをしに簡易文芸的アログラミンク書からアじグラム部分た、 けをは出する p 司フ。ログラムてあを本日 TML 文書に対して・。・を適用すると。 1 ・アログラムが得られる のて . コンパイラのよ ) にノートストラッフ ( に開発していくことかてきるはすてめる . 以下に・れ・プ 0 クラ ムの全ソースとその解説を記述町る。 アログラム をまてフ・ログラムグ】期化をおこない・雪凸住て HTML ファイルカ、らのアログラム植出知理をおこな 6 物「 1109 リ・ : ・北 0 : ・ - を北 : ・ ng 工 0 4 ・ ! 加 3 ェな 00 みしは 0 / ⅵ い、」亠しでノアイル書出しをおこな ーンケナれ名ーの関数カはれる . こでま SIG Ⅸ T なとを受け取ったときにカ ? はれるようにしている . を罍霪ては変数の初期化などをおこなう、いⅡをに強名を足 : しておくと . n が生 . したとさに 5 引 G ~ ー名 30 ミ 新 - もをに 14 、 ~ ト = 朝 0 い気ド をスをマの毛 ”、新す物数フツイル出力ライプラッ = 「。第を第疉轗を , なう。 く a href="#prologue"> く code>prologue() く /code> く /a> では変数の初期化などをおー く code > % SIG く / code > に関数名を指定しておくと、 signal が発生したときにく code > $ SIG { シグナル名 } く / code > の関数が呼ばれる。 こでは SIG 工 NT などを受け取ったときに く a href="#finish"> く code>finish() く /code> く /a> が呼ばれるようにしている。 く div class=gray> く a name=' prologuetl> く /a> く pre f ile=wtangle> sub prologue { print STDERR "Usage : wtangle documentfiles\n" print STDERR "wtangle Web Tang1e\n" if ($#ARGV く 0 ) { require 'cacheout. pl ' ; # く 0 Ⅱ 000 = 0a0h000t > 複数ファイル出力ライプラリく /a> exit 0 ; $SIG{'INT'} $SIG{'QUIT'} く /div> く /pre> $lt $SIG{'TERM'} $SIG{'HUP'} 173 UNIX MAGAZINE 1999.12
連載 /PERL ADVISOR—@ ログラムが扱える年代を近年に限定する。コマンド行イン ターフェイスを用いるのは cal コマンドと同じである。 これは、以下のようなプログラムになる。 if (@ARGV) { my $year = shift; if (@ARGV) { Today Day—0f—Week Days—1n—Month use Date : :Ca1c qw( use StriCt ; # ! /usr/bin/perl —w Month—t0—Text Day—of—Week—Abbreviation my $month = $year ; my $year = shift; die "year $year must be unless $year > 1752 ; &do-cal ($year, $month) ; } else { die "year $year must be unless $year > 1752 ; for my $month ( 1 .. 12 ) { &do—cal ($year , $month) ; 1752 " 1752 " print ” \ Ⅱ " unless $month = = } else { 12 ; my ($today—year , $today—month, $today—day) my $start—dow my $month—nam e my $ cal —month my $cal—year = shift ; sub do—cal { T0day ; Month—to—Text ($cal_month) ; shift ; &do—cal ($today-year , $today_month) ; Day—0f—Week( $start-dow % 7 ; my $curday = 1 $cal—year , $cal—month my $end—day = Days_in—Month( $cal-year , $cal—month , 1 pr int $month—name $cal-year\n" print map { sprintf ” % 4.4s ” Day—of-Week—Abbreviation($_) } 7 , 1 .. 6 ; print "\n" for ($curday.. ($curday + 6) ) { if ( $ ーく 1 ) { print " くくくくくく " ・ 126 } elsif ( $ ーく = $end-day) { printf " [ %2d ] " } else { pr int ” \n " $curday + = 7 ; red0 if $curday く = $end_day ; こで Date : ℃ alc パッケージを、 1. 現在の月と年を得る (Today) 2. 月の名前を得る (Month-to-Text) 3. 月可瞿日から始まるかを調べる (Day-of-Week) 4. 月カ可日までかを詩ヾる (Days-in-Month) UNIX MAGAZINE 1999.12 ・ Randal L. Schwartz ◎ 1999 , Performance Computing (). S. A. ) Performance Computing 1999 年 4 月号より 「 Getting a Y2K Date 」 れも、原著は O'ReiIIy & Associates 刊 ) 。 グラミング Perl 改言引跖、オライリー・ジャパン ) がある ( いず との共著に tProgramming PerlJ ( 邦訳 : 近藤嘉雪訳『プロ ) 反ムオライリー・ジャノヾン ) 、 Larry ⅥⅡ、 Tom Christiansen 著書に『 Learning Perl 』 ( 邦訳 3 丘藤嘉雪訳『初めての perl 第 2 レーニングをおこなっている。 道の専門家。米国内で UNIX のコンサルティングや perl のト 1977 年にコンピュータ・サイエンスの世界に足を踏み入れたこの ごせるということを。 えたと思う。もしくは、すくなくとも楽しいひとときを過 すくなくとも PerI を使えは時カ吩かることを知ってもら がまだ PerI をそれはど便利ではないと思っているなら、 回は、私もこのアドバイスに従うつもりだ。もし、あなた ・くまなくドキュメントを読め」ということだ。次 私からの重要なアドバイスは、「車輪を再発明する 成してから初めてこのことを知ったのだ ラムはさらに簡単になっていた。私はプログラムがはは完 ・ということに最初から気づいていたら、プログ きる・・ Calendar というルーチンでほとんど置き換えることがで 貴重な &do-cal ルーチンが、 Date::Calc モジュールの ラムを書くのがたいへん簡単だった。ただし、私か書いた これらのルーチンがすでに用意されているため、プログ ために使用している点に注目してほしい。 5. 曜日の名前を得る (Day-of-Week-Abbreviation)
連載 / UN Ⅸ便利帖ー① 図 2 コメントを入力してもらう ) 社ー再読込ー ~ ~ す : 当 . ~ 」案権印豊亠 ~ ~ 保護 戻る を、・ブックマーク , と場新叩 oca 第 0 % な m 呼ね′ rnk れ新Ⅳ k 紅山 ? YEA 1333 & MONTH , 10 ノ ( ' 関連サイ ー 9 / 10 ′ 15 んおん猿しなってきたよう一そのせいか阜く自があたのでく出効す 6. のままく退出しがっのだがそプうまくはいず、 = やはり時こるに宅す ・面 d ( omme Ⅱお er 図 1 コメント勧、 3 口された 戻る二をち」 = ー再読込↓ホー : ム験素 N 山「 刷保護 。、さ ' ブッグマグ、多 . 場所 : 市叩衂 0 「 3 物 05V % 7 部 n ツ加 kk b ⅱは朝れ ? YEAR = 1333 & MONTH = 10 わ ' 関連サイ 19 / 10 / 15 , んたん朝物みしくなツてきたようだ ; そのせいか里イ日がめたので阜く出効する . そのまま阜退出しが ? のがそううえくはいかず”やはり 2 時ころに備宅する . ~ お e dcommen な たかい もっと早く編ってきてね . I リスト 2 comment. cgi の内容 # ! /usr/bin/perl 数のセットです。 1 5 行目の if 文では、この CGI プログラムに引数か渡さ 2 3 use CGI qw/: cgi :htm12/; れたかどうかを判断して、渡されていた場合はプログラム 4 本体を実行し、渡されなかったときには何もせすに終了す 5 if ( p 矼 ( ) ) { $CFILE param('file'); るようにしています 1 。 6 open CFILE Ⅱ die; 7 コメントを保存するファイルの名前は file という引数 param( 'from') , pr int CFILE "from 8 param( ' comment ) ) , てされている ( リスト 1 の 29 行目 ) ので、 6 ~ 7 行目 9 close CFILE; 10 でこの名前のファイルを、、追加書込みモード " でオープン 11 し、 CFILE というファイノレ、ンドルで操作できるように pr int header , 12 start-html ( ' Thanks for comments ) ) , 13 します。、、追加書込みモード " では、そのファイルがすで hl ( ) Thanks fo て your comments. ' ) , 14 に存在するときは単純にファイルの末尾に追加書込みをお end_html ; 15 16 } こない、ファイルが存在しないときには新たにファイル を作成してから書込みをおこないます。また、 CFILE を 成します。 オープンできなかったときにはプログラムを終了するよう PerI 5 には、 CGI プログラムの作成にイリなクラスや にしています。 ライプラリを集めた CGI. pm というパッケージがありま そして、コメントの内容を、、 from 名前 : 本文 " という す。前回、 search. sh を作るときにもその一部を使いまし 形式でファイルに追加し、コメントの区切りとして空行も た。このパッケージを活用すれば、 CGI プログラムを手 入れます ( 8 ~ 9 行目 ) 。 軽に作成できます。 10 行目で CFILE をクローズし、次に続く 3 行で リスト 2 はコメントを受け付けて保存するための CGI Thanks for your comments. " という文章を表乃ヾする プログラム comment. cgi ですが、 CGI. pm を利用して HTML を生成します。この文章は、コメントを受け付け 作成してあります。 たあとでプラウザに表示されます。 ます 1 行目でこのファイルが PerI スクリプトであるこ たったこれだけのスクリプトで、受け付けたコメントを とを宣言し、 3 行目で CGI. pm を利用することを宣言し ファイルに追加して「ありがとう」と書かれたページを表 ています。 示する CGI プログラムができてしまいました。前回苦労 CGI. pm では、関数群を用途に応じていくつかのセッ した 16 進数の変換なども、 CGI. pm の内部で処理される トに分類しています。 comment. cgi では、そのなかから のでたいへん便利です。 cgi と htm12 というセットを使っています。これらはそ このファイルは CGI プログラムとして実行できなけれ れぞれ、 CGI プログラムを作るときに便利な関数のセッ トと、 HTML 2.0 で定義されたタグを生成するための関 1 本来ならエラー処理をするべきてすが、 こでは省略しました 100 UNIX MAGAZINE 1999.12