0 sub epilogue { local($year) = ー $lastyear = $year—l ; $nextyear = $year + 1 ; print くく EOF ; . /$lastyear/">${lastyear} 予定表く /a> く a href= . /$nextyear/">${nextyear} 予定表く /a> く a href= く /body> く /html> EOF リスト 4 pim ・ pl リスト 1 ~ 3 のプログラムを実行するには、 - 己の pim. pl が必要です。 Web プラウザから 参照可能な URL とディレクトリを $rooturl 、 $rootdir に設定すれはよいでしよう。 # pim ・ pl sub getdate { # 時刻から年月日を得る local($t) local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) ; ($sec , $min, $hour , $mday , $mon, $year , $wday , $yday, $isdst) = localtime($t) ; if ($year > = 70 & & $year く 100 ) { $year + = 1900 ; } elsif($year く 40 ) { $year + = 2000 ; } $ mon 十十 ; ($year,$mon,$mday,$hour,$min,$sec) ; sub dayofweek { # 年月日から曜日を得る local ($year , $mon, $mday) if ($mon = = 1 Ⅱ $mon $year- $mon + = 12 ; ($year + int ($year/4) int ($year/100) + int ($year/400) + int ( ( 13 * $ mo Ⅱ + 8 ) / 5 ) + $mday) % 7 ; sub mkdir { # 階層的にディレクトリ作成 local($dir) local(@d.$i.$h) ; mkdir($dir,0755) unless -d $dir; $daysec = 24 * 60 * 60 ; "http://bird.cs1.sony ・ co ・ jp/-masui/DOC" $ rootu て 1 $rootdir = "/user/masui/pub1ic—htm1/DOC" " / 000 , / 0000i / DOC / 、 00P10 、 0 ! $templatedir 168 UNIX MAGAZINE 1999.5
インターフェイスの街角 printf ( " く a name=%04d%02d%02d>\n" , $year , $mon, $mdey) ; print " く tr valign=top>\n't ・ for $day ( 0..6 ) { ($year , $mon, $mday) = &getdate ()t + ($week*7 + $day) *$daysec) ; printf ( " く t 五 bgcolor=#ffcccc width=%d%%>" " く a href=\" ”く a href=\" . /$year/$mon/$mday/\">%d く /a> (%s) く /th>\n" ($day==O ? 10 15 ) , $mon, $mday , $dayname [$day] ) ; print ”く /tr>\n" ・ print ”く tr valign=top>\n" for $day ( 0..6 ) { ($year , $mon, $mday) = &getdate ()t + ($week*7 + $day) *$daysec) ; printf ( ”く td width=%d%%> く ! ーー %d/%d(%s) ($day==O ? 10 15 ) , $mon, $mday , $dayname [$day] ) ; $dir = "$rootdir/$year/$mon/$mday" ; $event "$dir/event" if ← f $event){ open(in, "nkf —e く $event ) ; ⅶ ile ( く洫 > ) { chop ; print " $ ーく b て > \ Ⅱ " ・ close(in) ; else { print " く br>\n" ・ $image = "$dir/index ・ jpg if()f $image){ $ref . /$year/$mon/index. html#$mday" . /$year/$mon/$mday/index ・ jpg\"> く /a> く br>\n" print " く a href=\"$ref\"> く img src=\" UNIX MAGAZINE 1999.5 EOF く . /$nextyear/">${nextyear} 予定表く /a> く a href=" . /$lastyear/">${lastyear} 予定表く /a> く hl > 予定表 ($year) く /五1> く body bgc010r=#FFFFDD> く /head> く title> 予定表く /title> く head> く html > print くく EOF ; $nextyear = $year + 1 ; $lastyear = $year—l ; local($year) = ー sub prologue { close(out) ; &epilogue ($yy) ; print ”く /table>\n" ・ print " く /tr>\n" ・ print " く /td>\n" ・ 167
0 $time = shift ; if ($date $year = $ 2 if $ 1 ; $mon = $ 3 ; $mday = $ 4 ; $hour = $min = $sec = 0 ; if($time $hour = $ 1 ; $min = $ 2 ; $sec = $ 3 ; &mkdir ( "$rootdir/$year/$mon/$mday") ; $f = "$rootdir/$year/$mon/$mday/$progname" # テンプレートがある場合は日付と時刻を置換して利用 if (open(in, "$templatedir/$progname" ) ) { $time = sprintf ( " % 02d : % 02d : % 02d " ,$hour,$min,$sec) ; $date = sprintf ( ” % 4d / % 02d / % 02d " , $year , $mon, $mday) ; while( く in>){ s/%Date%/$date/g; s/%Time%/$time/g ; print out $ ー close(in) ; close(out) ; # 編集コマンドを起動 system " $EDITOR $f " リスト 3 makecalendar コマンド # ! /usr/local/bin/perl require P1m. pl ' ; require 'getopts. pl ' ; require 'timelocal. pl ' ・ &Getopts('ay: ' ) ; ($year , $mon, $mday) @years = ($year) ; @years = ( 1991 .. 2030 ) if $opt—a; @years = ($opt-y) if $opt-y; for $yy (@years){ next unless "$rootdir/$yy" open(out , ” > $rootdir/$yy/index. html" ) ; select(out) ; # 1 月 1 日の週の日曜日の時刻を求める $t = &time10ca1(O,O,O, 1 , 0 , $ yy く 2000 ? $ yy ー 1900 &dayofweek($yy, 1 , 1 ) * $daysec ; &prologue ($yy) ; for $week ( 0 .. 53 ) { &getdate (time) ; : $ yy ー 2000 ) ; print " く table border unit=relative width=100%>\n" ・ for $day ( 0..6 ) { ($year , $mon, $mday) &getdate()t + ($veek*7 + $day)*$daysec) ; 166 UNIX MAGAZINE 1999.5
0 リスト 1 meetingroom コマンド # ! /usr/local/bin/perl require pxm ・ p1 ' ; require ' getopts . pl ' ; require 'timelocal. pl' ; # Web プラウサから閲覧可能な共有ディレクトリ $ d 土て ' /wvv/local/meetingroom' ; chdir($dir) ; $EDITOR = —nw $EDITOR = $ENV{ , EDITOR' } if $ENV{ , EDITOR' } ; sub addroom { local($room,$name,$attr) = push(@rooms , $room) ; $name{$room} $attr{$room} &addroom( ' 104 ' &addroom( ' 105 ' &addroom( ' 201 ' &addroom( ' 305 ' &addroom( 'big' $room = shift; $name ; $attr; ' 104 会議室 ' ' 105 会議室 ' 201 会議室 ' , 305 会議室 ' ' 大会議室 ) ' color=orange ) ) ; ' color=red' ) ; ' C010 て = blue ' ) ; 'color=green') ; 'color=black') ; unless($name{$room}){ , @rooms) exit; print STDERR " % meetingroom [ " , j 0in ( ' 164 く /he ad> く title > 会議室予約状況く / title > く head> く html> print くく EOF ; ー = &dayofweek($year , $mon, $mday) * $daysec ; $ year く 2000 ? $year—1900 : $ yea て一 2000 ) ; $t = &time10ca1(O,O,O,$mday,$mon-1 , select(out) ; open(out , " > index. html" ) ; close(in) ; $event{$room,$1,$3,$4} while( く in>){ open()n , $ て 00m ) ; foreach $room (@rooms) { chmod 0666 , $room; system "$EDITOR $room" link($room, ”$r00m. bak") ; ($year , $mon, $mday) &getdate(time); # きようの日付を取得 UNIX MAGAZINE 1999.5
く body bgc010r=#FFFFDD> く hl > 会議室予約状況く / hl > く p> EOF foreach $room ()て ooms ) { print " く font $attr{$room}>$name{$room} く /font> ー \ Ⅱ " print " く code>% meetingroom $room く /code> く br>\n" for $week ( 0 .. 20 ) { print " く font $attr{$room}>$a く /font> く br>\n't for $a (@a){ if ($-=$event{$room,$year,$mon,$mday}){ foreach $room (@rooms) { ($day==O ? 10 : 15 ) , $mon, $mday, $dayname [$day] ) ; printf ( " く td width=%d%%>\n" ($year , $mon , $mday) = &getdate ()t + ($week*7 + $day) *$daysec) ; for $day ( 0..6 ) { print " く tr valign=top>\n" ・ print " く /tr>\n" ($day==O ? 10 : 15 ) , $mon, $mday, $dayname [$day] ) ; printf ( " く t 五 bgcolor=#ffcccc width=%d%%>%d/%d (%s) く /th>\n" ($year , $mon , $mday) = &getdate ()t + ($week*7 + $day) *$daysec) ; for $day ( 0 .. 6 ) { print " く tr valign=top>\n" ・ print " く table border unit=relative width=IOO%>\n" print " く br> く /td>\n" print ”く /tr>\n" print ”く /table>\n" ・ print くく EOF ; く /body> く /html > EOF close(out) ; リスト 2 event コマンド # ! /usr/local/bin/perl requlre P1m. pl' ; $EDITOR = $ENV{ ) EDITOR ' } ; $EDITOR = "mule —nw" unless $EDITOR ; # 現在の日付 / 時刻または引数による指定を取得 ($year , $mon , $mday , $hour , $min, $sec) $date = shift ; UNIX MAGAZINE 1999.5 &getdate (time) ; インターフェイスの街角 165
連載 UNIX Communication Notes ログ ク管理 ( 15 ) 山口英 ネットワー 2000 年問題 34 もなかなか手がつけられなかったと、複数の企業で聞いた ステムになるほど、 2000 年問題について認識はしていて コストを算定できなかったからである。とくに、巨大なシ を検査する必要があるのかが分からす、問題鮹夬にかかる るだろう。これは、いったいどれくらいの数のプログラム 解決を先延ばしにしてきたマネージメント側の問題もあ る機会はほとんどなく、問題の発見カ貘隹しい。 ているプログラムであっても、利用する側がそれを認識す った例が多いようだ。この場合には、 2000 年問題を抱え せすにプログラムを納品し、そのまま運用されているとい 年問題の発生を予期していたにもかかわらず、それを明記 想していなかったのではないだろうか。結果として、 2000 開発者自身が西暦の上 2 桁の変わり目まて使われるとは予 1970 年代や 1980 年代に作られたプログラムの多くは、 ろうか。 きたはすだ。それでは、なぜこれまで放置されてきたのだ バッグの際につねに注意しなければならないと教えられて ものであり、プログラマーであれば、プログラム開発やデ 生じる。これは、いわゆる境界条件での不具合と呼ばれる 、、誤解 " によって、プログラムの動作にさまざまな問題が ラムでは 1999 年から 1900 年に逆行してしまう。この れてきたからである。 2000 年になると、この種のプログ て西暦を表すコンピュータ・プログラムが数多く開発さ 2000 年問題の原因はごく単純で、下 2 桁だけを使っ がしばしはとりあげられるようになってきた。 雑誌や新聞でも 2000 年問題 (Year 2000 または Y2K) 西暦 2000 年まで残すところ約 8 カ月となり、一ヨ殳の ことがある。 それでは、 2000 年問題はどのような障害を惹き起こす のだろうか。すでにさまざまな予想か立てられているので 不劫ゞ紹介するまでもないが、この問題の理解に役立ちそう な本を 2 細紹介しておこう。 1 冊は SF である。最広書て府リ本を眺めていたと ころ、『パニック Y2K 』 [ 1 ] という文庫本が目にとまり、 題名に惹かれて購入した。この本の著者は、 2000 年問題 をひどく悲径聊勺に捉えているうえに、フィクションとして のおもしろさを加味するためにかなり荒吾無稽な展開をし ている。、、ほんとうにここまでなるかあ " という印象を抱 かはするが、ついつい読み進んでしまった。この本を読 むと、 2000 年問題の景を受けそうなありとあらゆる領 域を具イ勺に思い描けるようになる。ーヨ殳の人にとって、 2000 年問題の、、ひどく悲観的な " 入門書として薦めても いいかもしれない。 もう 1 冊は、『 Year 2000 ln A NutsheII 』 [ 2 ] である。 こちらは、まじめに、かっ技術的に 2000 年問題の原因、 景皹用、間題鮹夬のための方策などを分かりやすく解説 している。英語ではあるが、言当は上如勺平易で読みやす く、技術者のための入門書としてお薦めできる。本書には COBOL の Quick Reference がイ寸いているので、かっ て COBOL プログラマーだった人は懐かしいものをみる ような気持ちになるかもしれない ( 私も、 10 年以ーヒ前にア ルバイトで COBOL プログラムを作成したときのことを 思い出した ) 。 さて、システム管理者は 2000 年問題をどう捉えるべき なのだろうか。ます、どんなシステムでも、 2000 年問題 が発生する可有があるという前提に立っことか重要であ る。管理・運営に携わっているすべてのシステムが危険生 UNIX MAGAZINE 1999.5
2. 情報のフィルタリング ログの保管 たとえば、収集したログを管理者かすべて叫なければ ならない状況を考えてみよう。記録されたログの多くは、 ログの保管は、管理者の悩みの種である。しかし、匠 システムが正しく稼動していることを知らせるものであ は大容量の媒体か数多く登場してきたので、大量のログも る。したがって、これらのファイルには、同しような内容 簡単に言求できるようになった。 CD-R なら 600MB 程 のログカ髞り返し現れる。管理者が、毎日のようにこれら 度、 DVD-RAM なら片面最大で 2.6GB の言求ができ のログのすべてに目をとおしていると、見慣れてしまって る。面なシステムであれば、 ZIP で 100MB の言求が 異常を見過ごすことがある。そのような事態を招かないた 可能である。 めにも、ログはかならすフィルタリングし、管理者にとっ ログの保管で重要なのは次の 2 点である。 て意味のある情報すなわち管理者がチェックすべきもの 最低でも、 1 日に 1 回はログをバックアップする だけを残すようにする。このとき注意しなければならない これは、 cron で実行する daily スクリプトを改造すれ のは、里者にとって無意味な情報だけを破棄し、そス ば簡単に寒見できる。 外はすべて残すことである。こうすれば、情報の見落しを ・ログは将来的にも利用可能な状態で保管する 防ぎやすい。 私は、 ZIP ディスク上に BSD Fast File System を構 これとは逆に、管理者にとって未のある情報だけを抜 成し、そこにファイルをコピーするかたちでログを言求 き出すフィルタを作ってしまうと、管理者か想定してい している。しかし、 ZIP ディスク上の BSD Fast File なかった状況を見逃す可能か高くなり、結 : 描勺に新手の System を扱えるがなくなったら、日求していたロ 不正アクセスに対処できないといったことにもなりかねな グは読み出せなくなってしまう。ログは、すくなくとも い。ログを処理するプログラムを作成するときは、これら 1 ~ 2 年は保管し、必要に応してアクセスできるように の点にも十分注意する必要がある。 すべきである。可能であれは、システムに依存しない形 3. ログだけに頼らない 式で言求するとよい。たとえば、 CD-R に IS09660 形 式で言求しておけば、 UNIX や Windows からもアク ログは、システムの異常を発見するためのセンサーと セスできる。このように、汎用的な形式の媒体を利用す して利用できるが、ログ自体は比較的脆弱な情報源である るのも 1 つのガ去であろう。 ことも忘れてはならない。たとえば、システムに侵入して r 。。 t の権限を得たクラッカーが、ログを言求しているファ ☆ イルを突き止めて内容を書き換える可能生もある。 今回はログ管理について角見した。次回からは、ネット syslog では、どのユーサーも希望する facility と level ワークにおけるセキュリティ管理について角見する。 を設定してメッセージをログとして追加できる。つまり、 ( やまぐち・すぐる奈良先懿膨オ支術大学ギ完大学 ) ー隹でも偽の情報を syslog に書き込めるのである。悪意を [ 赭文献 ] もったユーサーが、管理者を混乱させるために誤ったログ [ 1 ] ジェイソン・ケリー著、田畑智通訳「バニック Y2K ム集英 を言させる場合もあるだろう。しかし、もっとも可能生 社文一 1999 年 ( 原題 : Jason Kelly, Y2K: れ 's ad リ の高いのは、 syslog. conf の設定を間違えて本来言求すべ t00 late, 1998 ) きログ情報が残されていないといった状況である。 [ 2 ] Norman Shakespeare, Year 2000 1 れス Nutshell, このようなことから、収集されたログを鵜呑みにするの O'ReiIIy & Associates, 1998 は危険である。本当に必要な情報か求されているか、偽 の情報か紛れ込んでいないか、といった点にも注意しなが らログをする姿勢が大切である。さらに、かならすロ グの監査以タ P ) ガ去も併用してシステムの運用状態を把屋 しておく。 0 連載 /UNIX Communication Notes— ニ一口 41 UNIX MAGAZINE 1999.5
・ ookshelf 『 PocketBSD インストールキット』 『 Bison 入門』 インストールキット Bison 入門 ・ CharIes DonneIIy 、 Richard M. StaIIman 著 ・石川直太訳 ・榊隆著 ・アスキー ・アスキー ・ B5 判変型、 118 ページ ・ A5 判、 207 ページ ・ 1 , 500 円 ・ 2 , 800 円 ・ 1999 年 3 月 21 日 ・ 1999 年 3 月 9 日 汎用構文解析器生成ツール Bison ( バージョン 1.25 ) の PocketBSD (DOS 版 Mobile Gear シリーズ用の Free- 解説書。 1 ~ 2 章で Bison の概念と具体例を紹介し、 3 章以 BSD) のインストールと各種の利用法を解説。 Pocket- 降では、文法ファイル、構文解析器の C 言語インターフェ BSD の概要、インストール、 PC とのデータ転送、アプリ イス、生成された構文解析器のアルゴリズム、エラーから ケーションの追加、各種ツール、ネットワーク接続、 Web の回復、文脈依存性の処理、デバッグ、実行について解説 と電子メールの設定などを紹介している。インストーラ、 している。 専用プログラムなどを収録した CD - ROM が付属。 『入門 UN Ⅸシェルプログラミング』 『 Effective PerI 』 入門 UN Ⅸンルプログラミング E ・ 0 ・ PerI ・ Joseph N. Hall 、 Randal L. Schwartz 著 ・ Bruce Blinn 著 ・吉川邦夫訳 ・山下哲典訳 ・アスキー ・ソフトバンク ・ B5 判、 270 ページ ・ B5 判変型、 430 ページ ・ 2 , 800 円 ・ 3 , 200 円 ・ 1999 年 3 月 21 日 ・ 1999 年 3 月 27 日 PerI の基礎知識をもつプログラミング経験者を対象に Bourne Shell によるシェル・スクリプトの作成テクニッ より高度な処理や効果的なプログラミング手法について実 クを基本から解説。シェル変数、シェル関数、組込みコマ 例を挙げながら紹介。 Perl の慣用的な記法、正規表現、サ ンド、ファイル操作、コマンド行の解析と処理、環境、フィ ルタの使用法、各種の機能、デバッグなどの章で構成さ プルーチン、リファレンス、デバッグ、パッケージとモ ジュールの使い方 / 書き方、オプジェクト指向プログラミ れ、シェル関数 / スクリプトの例を多数紹介している。 ングなどの 10 章構成。 『し inux インストールキット第 2 版』 『ジャンクバーツ設定全書』 ・ Sco れ MueIIer, 高橋敏也著 ・小島三弘、小山裕司、川井俊、木村稔著 ・伊勢雅英監訳・中川和夫訳 ・ソフトバンク トッノヾン ・ B5 判変型、 202 ページ ・ B5 判、 511 ページ ・ 2 , 400 円 ・ 3 , 600 円 ・ 1999 年 3 月 10 日 ・ 1999 年 3 月 5 日 Plamo Linux 1.4.1 などを収録した CD-ROM ( 3 枚組 ) 付 マザーポード、ハードディスク、サウンドカードでよく きのインストール・ガイド。各種 Linux ディストリビュー 利用されている製品を数多くとりあげ、ジャンパーやス ションの紹介、インストール前の作業と実際のインストー イッチの仕様、設定、注意点などを概略図付きで紹介して ル手順、管理者 / ユーザー別の各種設定、アップグレード いる。 3 部構成で、各部の冒頭では各ハードウェアの歴史 ( カーネルの再構築など ) 、さまざまな情報入手法について や仕組み、技術などについて解説している。 解説している。 定 、ヤ Linux インストルキット 139 UNIX MAGAZINE 1999.5