HomePage講座     Yukiの休息所
 Yukiの休息所(趣味の部屋)
 ホームページ講座
 CGI活用講座
次の項目へ>>
<<前の項目へ

 CGIとPerlの知識を蓄えよう

CGI活用講座、第9回は、作成編です。

 CGIはHTMLの知識が無いと、扱えない物と思ってください、 HTMLをPerlで記述すると思っていただいて良いと思います。
 使用ソフトは、TeraPadとFFFTPのみ、

 その他、必要な物は、CGI&Perlが使えるサーバーですね。

 出来れば、自宅にサーバ環境を構築して、Perlをインストールし、 ローカルでテスト出来る環境が望ましい。

  では、CGI活用講座第9回、最終回です。
    
 CGI,活用講座、第9回 
 ダウンロード&テストは、 「http://pc-sup.com/sub/index.html」、 旅の思いで写真集「当講座の教材Pageです」
 CGI活用講座→第9回に進んでください。
   
 今回は、CGIで動作する、グラフィックカウンタです。
 テキストカウンタは、SSIを使用するものをHTML活用講座・HPB活用講座で紹介してますが、 色々と設定があって、簡単に使えるものではありません。
 一方グラフィックカウンタは、 CGIが使えるサーバであれば、簡単に設置できます。
 設置方法を含めて、プログラムを解説して見ます。

 ファイル名「gcount.cgi ver1.0」です。
 1行目は、小生の自前サーバで動かすための設定、設置場所にあわせてください。

 ちなみに、lolipopの場合は、「#!/usr/bin/perl」になります。 改行コード「LF」ですから、間違えないように、TeraPad等を使ってください。

 8行目は、画像連結ライブラリ、Gif画像専門です。
 11行目は、乱数の初期化です。

 12行目は、sleepコマンドを0.1秒単位に変えるもの。
 15行目から個人設定項目、内容はコメントに書いておきました。

 17行目と23行目のファイル名は、ディレクトリの設定に注意してください。
 19行目の秒数は、1時間なら、60×60=3600秒に設定してください。

 27行目のファイルの置き場所は、ディレクトリの設定に注意してください。
 33行目は、環境変数から、グローバルIPを引き出すもの。

 34行目は、ホスト名に変換しています。

 37行目、$time = time; timeは、サーバの持つ時間関数、localtime(time)とすると、 時間や曜日も取り出せます。
43行目から、メイン処理、$countは、カウント記録ファイルを示します。

 45行目で、0.1秒sleepを使いたいために、12行目の設定があるわけです。

 10回オープンをトライする内に、成功したらそこで終了となります。

 47行目は、ファイルハンドルINから、$cntにカウント記録を読み出します。

 51行目、$ccheckが0に等しいの逆、なら、サブルーチンccheckを呼び出します。
 モット簡単に、if ($ccheck) { としても同じでしょうね。

 52行目、サブルーチンccheckの返り値($res)が1の逆なら、 サブルーチンcountupを呼び出す。
 どちらも規定値で比較して、で無ければを使用しているんです。
 54行目は、カウンタの初期オフセットの処理です。
 58行目は、数値を6桁の文字列に変えるものです。6を7にすれば7桁表示になります。

 62行目は、sprit(//,$cnt)、何も無いもので区切りますから、 ひと文字ずつ取り出せますね。

 63行目は、画像名を、@image配列の最後に挿入ですね。

 67行目で、gif出力を宣言し、出力方法をバイナリーに指定。

 gifcat画像連結ライブラリを使用して、一括送信します。

 71行目で、プログラム終了です。
 75行目のexit;は、サブルーチン前に置いたものが残っているだけ、意味ないです。
ここから、サブルーチンです。
 最近の訪問時間チェック、$logfileは、訪問者ファイルを示します。
 ファイル名をrenameで変えてしまう方法を採用したため、読み出せない場合もありえるので、 読み出し側でも、0.1秒10カウントをとってます。

 無事読み出せたら、89行目から、サーチに入ります。
 90行目、@tempの配列から、一行づつ取り出して、$tempに代入、 区切り文字<>で切り分けて、ホスト名で一致するものを探します。

 見つかったら、時間を比較して、条件が合えば、$res=1として、 カウンタを更新しないようにします。

 97行目から、}が並びますが、小生の字下げ方法では、数を間違えません。
 
 こちらは、カウントアップサブルーチンです。

 105行の$uselockは、ロック機能の使用の有無、
 106行で、乱数(100)+1、これで1〜100の乱数が発生できるはず、$fooに代入します。

 107行、$logdirは、ログファイルの保存場所です。

 $countファイルの使用中を考慮して、0.1秒10カウント、rename成功すれば抜けます。

 114行、$dummyに書き込み準備

 118行で、カウントを一つ増やし、ファイルハンドルOUTに出力します。

 122行、元の$countにrenameして処理終了。
 rename処理は行数が増えてしまいますね。

 127行からは、$uselookが未使用の場合、
 rename処理がない分だけ簡単ですね。

 ファイルの入出力は、()があったり、「,」が無かったり、書式が覚えにくい、 <>で囲むものもあります。
 
 書き込みサブルーチンの続きですが、 こちらはログファイル$logfileを更新します。

 155行に、レコード数のチェックが入り、最大値$dmaxと同じであれば、最終行を削除。

 新データを先頭行に挿入して、$dummyに書き込み、$logfileにrenameして終了です。

 173行以降も、rename処理が入らない以外は同じですね。

 renameによる、ファイル保護と確実なファイル処理を考えて見ましたが、 少々、ファイルが長くなりますね。

 ファイル移動とは違い、処理は早いと思うんですが・・・

 今後の拡張&修正点

 jcood.plとの共存策が必要ですね、 ログファイルを、アクセス解析のデータ取りに利用するなら尚の事、

 日ごとの、ログファイルに変更して、アクセス数の日変化を表やグラフで表すのも面白い。

 ただ、この場合、管理者メニューが必要になりますね。

 カウンタの外枠は、テーブルタグで画像を挟んだだけ、HTMLで簡単に出来ます。

 ソース表示で確認して見てください。
 
 今回で、CGI活用講座は最終回

 新たなソフトは、完成した時点で、取り扱いと設置方法を紹介する事にしますので、 そちらにご期待ください。

 では、また合いましょう。