[トップ] [掲示板] [F.A.Q.] [コラム] [ひとりごと] [利用規約] [履歴] | |
kabalib.plのパッチ |
kabalib.plはここのCGIが参照する共通ライブラリです。最新バージョンのVer.1.20で次のような重要な修正が入っていますので、古いバージョンのkabalib.plを使っている方はすぐVer.1.20またはVer.1.20bに置き換えてください。
CGIを利用していると、データの一部または全部が消滅する現象が発生することがあります。これは誰かがデータ・ファイルに情報を書き込んでいる間、他の人が同じデータ・ファイルに書き込んでしまうことが原因です。
2重の書き込みによるデータの破壊を防ぐために、常に1人しかデータ・ファイルへの書き込みができないようにすることをファイル・ロック(排他処理)と言います。ここのCGIにもこの機能を付けていますが、ファイルへの書き込みと、ロックが有効になるまでの間に一瞬のスキがあることが分かりました。このスキを改良したのがVer.1.11です。
と言ってもファイル・ロックの難しさはネット上でも話題になるくらいで、改良後のVer.1.11も残念ながら100%と安全と断言できるものではありません。
2004年のカレンダー表示がおかしいという指摘から日付計算の基本サブルーチンのバグが発覚し、それを訂正したのがVer.1.20です。
31日に1を足したら32日ではなく1日です。30日に1を足したら1日だったり31日だったりします。このように日付の計算は単純ではありません。それを普通の整数同様に加算・減算したり比較するために、任意の日時をPerlのtime関数が返す形式(1900年1月1日0時0分0秒グリニッジ標準時から何秒後か)に変換するサブルーチンをつくってkabalib.plに入れています。
このサブルーチンの閏年処理部分にタイプミスによるバグがあり、一番近い閏年である2004年の処理がおかしくなっていました。
Ver.1.11でファイル・ロックを変更してから、「更新日ファイルが開けません」のメッセージで「会議室予約」が動かないトラブルが続出しました。私が利用可能な環境(Solaris+Apache、RedHat+Apache、WinXP+AN HTTP)では再現できないので、根本的な原因解明ができません。差し当たり、Ver.1.20の修正を生かしたままファイル・ロック方法を元に戻したものを作りました。トラブルがある方はこちらをお試しください。
Ver.1.11とVer.1.20bの両方のファイル・ロック方式を統合し、変数で選択できるようにしました。デフォルトはVer.1.20b方式です。今現在ファイル・ロックに問題がない場合には、特にバージョンアップする必要はありません。
まず、上のファイルをダウンロードして、解凍します。解凍すると、"kabalib.pl"というテキスト・ファイルができます。
ftpソフトなどでサーバーのCGI用ディレクトリ内の"kabalib.pl"と置き換えてください。下は「会議室予約」の例です。
cgi-bin/ ├-- lib/ | ├-- jcode.pl | ├-- cgi-lib.pl | └-- kabalib.pl └-- resroom (755)/ ├-- data (777)/ ├-- resroom.cgi (755) └-- *.gif
weberror | HTML形式でエラーメッセージを出す |
error | メッセージをprintしてexitする |
warning | "Warning! "とメッセージをprintするだけ |
reversetime | (年、月、日、[時、分、秒])をTIME形式にする |
correcttime | TIME形式を(年、月、日、曜日(漢字)、時、分、秒)で返す |
deltadays | (年A、月A、日A、年B、月B、日B)でA-Bの日数を返す |
caldays | (年、月、日、±n)で日付からnを加算した日付を(年、月、日)で返す |
getcookie | クッキーを読んでデコードする |
cookielimit | (年、月、日、期限までの日数)をクッキーの形式にして返す |
unique | リスト中の文字列をユニーク化する |
getweek | (年、月、日)を入れると曜日0-6を返す |
getJholiday | (年、月、日)を入れると曜日0-6と祝日・平日などの属性を返す |
lockopen | ロック付きでファイルをオープンする |
lockclose | lockopenで開いたファイルを閉じる |
2003/05/27 | Ver.1.21 | 旧ロック方法とVer.1.11以降の方式を選択可能にした。 |
2003/01/28 | Ver.1.20 | &reversetimeの閏年処理の重大なバグを修正。 |
2002/12/30 | Ver.1.11 | ファイルロックを改良。 |
2002/10/29 | Ver.1.10 | &getJholiday追加。 |
2001/11/12 | Ver.1.03 | &reversetimeの閏年処理のバグ修正。 |
2001/03/17 | Ver.1.02 | getweek、lockopen、lockclose追加。 |
2001/01/29 | Ver.1.01 | &getcookieのLOG出力をやめた。 |
2000/12/29 | Ver.1.00 | uniqueのバグ修正 |