| 目次 |手順 0 |1 |2 |3 |A |B |C |D |E |F |G |H | I |J |K |L |M |N |O |P |Q |
作成日:2002年02月21日、更新日:2004年04月03日 作成:鷹の巣
自宅サーバーにおけるPerl で記述されたCGI(Common Gateway Interface)に特化した質疑応答集を作成致しました。
自宅サーバー用CGI(Common Gateway Interface)の質疑応答集
Perlに関して、私は全くの初心者です。このページに書いている内容は、私が、自宅サーバーでCGIを行うのに必要であった最低限の知識を整理した覚書です。詳細な解説は、リンク先を是非、ご参照願います。
尚、動作確認は、Windows 2000 ProfessionalのActive Perl 5.6.1buld633にて、行いました。
注)拡張子が「PL」になっているものは、CGIでは、ありませんので、コマンドラインから、実行して下さい。
CGI を改造する場合は、自己責任で、実施して下さい。又、CGI改造に関して、作者の方へ絶対にご質問しないで下さい。
この質疑応答集は、制約の多いWindows用のPerl5(Active Perl)で記述されたCGIに重点を置いていますので、ご了承願います。
質問番号の先頭が「W」の場合は、Windows サーバー固有の問題です。
質問A001.CGIで困った場合のお薦めのWebページは? (2002.2.21)
質問W002.Windows用CGIのロック設定で、symlink関数は使えますか。 (2002.2.21)
質問W003.Windows用CGIのPerl.exeのパス指定の方法は? (2002.2.21)
質問A004.相対パス指定で、現在のフォルダの三つ上のフォルダのその下のフォルダ内のファイルを指定したい場合は、どうすればよいか。 (2002.2.21)
質問W005.Windows NTサービスとしてPerlスクリプトを実行させるにはどうすればよいのでしょうか? (2002.2.21)
質問W010.WindowsのActive Perlに同梱されているperl.exeとperlis.dllの違いは? (2003.04.28)
質問W011.WindowsのActive Perlにモジュールを追加する方法は? (2002.11.12)
質問W100.Windows用のArGosoft Mail Server Freeware versionを使用してWeb上からフォームメールは送れるか。 (2002.6.15)
質問W101.Windows用のArGosoft Mail Server Freeware versionを使用して、KENT WEBさんのPostMailでフォームメールは送れるか。 (2002.6.15)
質問W102.sendmail.cgiで、CCとBCCにメールが送れない。(プロバイダに設置して、sendmail.exeでは、メールが送れる。) (2002.6.25)
質問A150.Perlだけで、メールを送るには?(モジュールを使用して、メールを送るには?) (2002.8.21)
質問W170.BASP21(Windowsの汎用コンポーネント)を使用して、メールを送るには? (2002.8.21)
質問W200.Perlソースリストのコメントをperlを使用して削除するには? (2002.11.24)
質問W201.Micrsoft Front Page 4.0等で作成したHTMLファイルの行頭と行末に入る無駄なスペースをperlを使用して削除するには? (2002.11.23)
質問A202.あるディレクトリ下の全てのファイル名を取得する方法は? (2003.2.21)
質問A203.httpdドキュメントルート下の全てのhtmlファイルにリンクするクローラー用htmlページを自動作成するには? (2003.2.21)
質問A204.ロボット型検索エンジン対策の為、ホームページ(Webページ)の単語の使用頻度を測定するPerlスクリプトは? (2003.4.4)
質問A205.ロボット型検索エンジンへ複数のWebページのURLを一括して自動登録するPerlスクリプトは? (2004.4.3)
質問W301.WWWサーバーのAN HTTPDのrefererファイルから、アクセス元や検索キーワードを抽出する簡単な方法は? (2003.2.16)
質問W302.WWWサーバーのAN HTTPDのログファイルから、本格的なアクセス解析を行なうには? (2003.3.8)
質問A500.インターネットからアクセスして来た人にURLを入力させて、Webページを表示するサービスを提供するには? (2002.8.17)
質問A510.他サイトのURLを入力させて、そのサイトのサーバー稼動検査を行うには? (2002.8.17)
質問A600.プロバイダのWebサイトのデータを自宅サーバー内のPerlで編集するには? (2002.8.21)
質問A900.KENT WEBさんの掲示板等で、LAN内からアクセスすると表示し始めるのに10秒以上かかる。 (2002.2.21)
質問A901.KENT WEBさんのカウンタで、「IPアドレスの二重カウントチェック」を有効にしても訪問者数が多く計数されてしまう。 (2002.6.10)
質問A902.KENT WEBさんの掲示板(WEB FORUM)の過去ログファイルから、htmlファイルを作成するには? (2002.11.26)
質問A903.KENT WEBさんのAccess Reportで、リンク元の取得情報の一部が文字化けを起こす。 (2002.11.12)
質問A950.「print MAIL "Cc: user@example.com\n";」と書くとカーボンコピー送信先にメールが届きません。(「鷹の巣」がはまりました。) (2002.6.25)
●参考になる関連FAQ
AN HTTP Server Home Page さんのAN HTTP Server FAQ/Search 、
いとのページ さんのAN HTTP Server FAQ2 とWinsock Error Code とAN HTTPDエラーメッセージ集 、
WWWサーバーのHTTP Logファイルの読み方
質問番号の先頭が「W」の場合は、Windowsサーバー固有の問題です。
□質問A001 .CGIで困った場合のお薦めのWebページは?(2002.2.21)
KENT WEB さんのサポート・コーナー 内のリンク先やFAQのページ や過去ログ・キーワード検索 が参考になると考えます。また、Perl for Newbie(Perl初心者の部屋) です。Windowsユーザーは、このサイトの「MS-WindowsでPerlのページ 」は、必読。
□質問W002 .Windows用CGIのロック設定で、symlink関数は使えますか。(2002.2.21)
Windowsでは、シンボリックリンクが使用出来ません。flock関数かmkdir関数を使用する設定にして下さい。KENT WEB さんの「ロックファイルの使用可否をチェックしたい。 」のCGIを使用して、調べることも出来ます。その他の関数については、「AN HTTPD上ではCGIがエラーになるがプロバイダのサーバにアップすると動く 」が参考になります。
□質問W003 .Windows用CGI のPerl.exeのパス指定の方法は?(2002.2.21)
CGI スクリプトの先頭行で、「#!/usr/local/bin/perl」や「#!D:\Perl\bin\perl」や「#!D:/Perl/bin/perl.exe」の様に絶対パス指定をしますが、WindowsのAN HTTPDの場合は、無視出来ます。AN HTTPDでも「#!」行を読込む設定にして、CGI スクリプトの先頭行で絶対パスを指定する方法もあります。
□質問A004 .相対パス指定で、現在のフォルダの三つ上のフォルダのその下のフォルダ内のファイルを指定したい場合は、どうすればよいか。(2002.2.21)
「../../../folder_shita/sample.html」とします。詳細は、KENT WEB さんのFAQのページ の「絶対パス(フルパス)と相対パスの違いは? 」をご参照願います。
□質問W005 .Windows NTサービスとしてPerlスクリプトを実行させるにはどうすればよいのでしょうか?(2002.2.21)
perlwin32faq のperlwin32faq4 の「Windows NTサービスとしてPerlスクリプトを実行させるにはどうすればよいのでしょうか? 」に回答があります。(このサイトのFAQは、全て読んで頂きたい内容ばかりです。)
□質問.
.
□質問W010 .WindowsのActive Perlに同梱されているperl.exeとperlis.dllの違いは?(2003.04.28)
まずWindowsの拡張子である「exe」と「dll」の違いですが、「exe」はexecute(実行する)という意味で、「dll」というのは、Dynamic Link Library(動的結合サブルーチン集?)という意味です。拡張子が「exe」のファイルは、「dll」と違って、COMMAND.COM(Windows95系)またはCMD.EXE(Windows NT系)のDOS窓のshellの外部コマンドとして実行されます。
「perl.exe」を使用して、Webサーバーからsample.plを実行する場合は、上記のDOS窓が起動され、このプロセス上からperl.exeが起動されてsample.plが自動コンバイルされて実行されることになります。ISAPI(Internet Server Application Program Interface) のためにIIS(Internet Information Server) のplug-inとして設計された「perlis.dll」の場合は、DOS窓が起動されません。(IISだけでなく、AN HTTPDでも動作可能 )
従って、「perl.exe」を使用するとDOS窓が起動される分、処理速度は低下しますが、PC-UNIX上で動作するCGIとの互換性が高くなります。実際にsendmail.cgiやsendmane.exeのようなsendmail wrapper(sendmail互換インターフェィスソフト)を使用していると、shellのパイプ(引数のメモリ渡し等)がperlis.dllではうまく動作しません。CGIの改造が出来るのでしたら、メモリ渡し引数を一時ファイルに書き出して、読み込むようにソフトを改造したり、CGI環境変数を利用すればperlis.dllでも使用可能です。
以上のような理由から、通常は、perl.exeを使用 します。私も遅くても確実に動作するperl.exeを使用しています。(現在は、Intel celeron 1GHz ,Base clock 100MHz)もし、CGIのアクセスによる負荷が多くてperlis.dllを使用する場合は、まずperl.exeで正常に動作することを確認してから、perlis.dllを使用すれば、うまく動作しない場合の問題点の切り分けがしやすくなります。
注)php.exeとphp4isapi.dllの関係も同様です。ISAPIとよく混同される(?)ASP(Active Server Pages) は、IISでのみ動作が可能です。
□質問W011 .WindowsのActive Perlにモジュールを追加する方法は?(2002.11.12)
色んな方法がありますが、最も簡単な方法の一例をWindows用Jcode.pmのインストール方法 に示します。
□質問.
.
□質問W100 .Windows用のArGosoft Mail Server Freeware version を使用してWeb上からフォームメールは送れるか。(2002.6.15)
可能です。詳細は、「Windows自宅サーバー用フォームメールの設定例(sendmane.exe編)」 をご参照願います。「Windows自宅サーバー用フォームメールの設定例(sendmail.cgi編)」 もあります。
□質問W101 .Windows用のArGosoft Mail Server Freeware version を使用して、KENT WEB さんのPostMail で、フォームメールは送れるか。(2002.6.15)
可能です。Postmail Ver1.6以降での実績があります。下記の一行に# 印を追加し、コメント行にすれば、フォームメールが送れる様になります。こちらの全文検索 で、いとさんが既に書かれていましたが、詳細は、上記の「質問W100」のリンク先をご参照願います。
# メールプログラムのパスチェック/種類チェック
# unless (-e $mailprog) { &error("メールプログラムのパスが不正です"); }
if ($mailprog =~ /blat/i) { $prog_type=2; } else { $prog_type=1; }
□質問W102 .sendmail.cgiで、CCとBCCにメールが送れない。(プロバイダに設置したsendmailでは、メールが送れる。)(2002.6.25)
sendmail.cgiを使用する場合は、「Cc 」「Bcc 」と書いて下さい。複数の宛先に送る場合は、「, 」で、区切って下さい。[回答者:HAL2000さん]
$mailto = 'user\@example.com'; # 送信先メールアドレス
$mailcc = 'cc1user\@example.com, cc2user\@example.com'; # カーボンコピー送信先メールアドレス
$mailbcc = 'bcc1user\@example.com, bcc2user\@example.com'; # ブラックカーボンコピー送信先メールアドレス
$mailfrom = 'senduser@example.com'; # 送信元メールアドレス
.....中略.....
open (MAIL,"| $mailprog -t") || &error("メール送信に失敗しました");
print MAIL "To: $mailto\n";
print MAIL "Cc : $mailcc\n";
print MAIL "Bcc : $mailbcc\n";
print MAIL "From: $mailfrom\n";
□質問A150 .Perlだけで、メールを送るには?(モジュールを使用して、メールを送るには?)(2002.8.21)
「ActivePerlからメールを送る」の「Perlでメールを送る 」のサイトに解りやすい説明と実例があります。是非、一度試してみましょう。モジュールを使用すると自宅SMTPサーバーを使用しなくてもプロバイダのSMTPサーバーが利用出来ます。スクリプトの改造が平気な方には、お薦めします。
私も下記の様なスクリプトを使用しています。
○ メール送信Perlスクリプトその1(Net::SMTPモジュール版)
□質問.
.
□質問W170 .BASP21(Windowsの汎用コンポーネント) を使用して、メールを送るには?(2002.8.21)
「ActivePerlからメールを送る」の「Basp21の力でメールを送る 」のサイトに解りやすい説明と実例があります。Windowsユーザーでしたら、是非試してみましょう。
私もこのサイトを参考に以下のスクリプトを動作試験用にPerlで書いて実験しました。
○ メール送信プログラムその1(Windowsサーバー専用PerlスクリプトBASP21版)
○ メール送信プログラムその2(Windowsサーバー専用PerlスクリプトBASP21版)
□質問W200 .Perlソースリストのコメントをperlを使用して削除するには?(2002.11.24)
perlは、起動時、CPUに負担をかけるので、少しでもサーバーへの負担を少なくする為に精神衛生上、作成してみました。
以下のスクリプトをPerlの練習用として、書いて実験しました。簡単な判断しかしていません。(安全第一です。)
○ Perlソースリストのコメントを削除するPerlスクリプト
□質問W201 .Micrsoft Front Page 4.0等で作成したHTMLファイルの行頭と行末に入る無駄なスペースをperlを使用して削除するには?(2002.11.23)
行頭の空白を削除する正規表現は、^\s+で、行末の空白を削除する正規表現は、\s+$です。
私は、以下のスクリプトをPerlの練習用として、書いて実験しました。
○ HTML表示ファイルの行頭や行末スペースを削除するPerlスクリプト
□質問A202 .あるディレクトリ下の全てのファイル名を取得する方法は?(2003.2.21)
指定ディレクトリ以下の全てのディレクトリ内のファイル名を取得する方法は、通常、DNSサーバーのように再帰呼び出しを行います。この再帰呼び出しの練習用として、ファイル一覧のhtml作成用Perlスクリプト を作成しました。このスクリプトの中で、使用していますのでご参考にして下さい。尚、C言語での作成例が、SAK Streets さんのパソコン基礎知識 C 言語編 (その九) 再帰呼び出し処理 - ディレクトリ検索 - SAK Streets にありましたので、再帰呼び出しのコツなどを理解して下さい。
□質問A203 .httpdドキュメントルート下の全てのhtmlファイルにリンクするクローラー用htmlページを自動作成するには?(2003.2.21)
Perlのスクリプトで良ければ、ファイル一覧のhtml作成用Perlスクリプト をコマンドラインから「perl FileList.pl」と実行すれば、サイト内ファイル一覧 のようなクローラー用のページが作成できます。
□質問A204 .ロボット型検索エンジン対策の為、ホームページ(Webページ)の単語の使用頻度を測定するPerlスクリプトは?(2003.4.4)
ホームページ(Webページ)の単語の使用頻度測定Perlスクリプト にまとめましたので、ご一読願います。
□質問A205 .ロボット型検索エンジンへ複数のWebページのURLを一括して自動登録するPerlスクリプトは?(2004.4.3)
Perlスクリプトは、検索エンジンへのURL自動登録用Perlスクリプト(IO::Socketモジュール使用) にありますが、手順N.自分のホームページの宣伝の検索エンジンへの登録 もご一読願います。
□質問.
.
□質問W301 .WWWサーバーのAN HTTPDのrefererファイルから、アクセス元や検索キーワードを抽出する簡単な方法は?(2003.02.16)
refererファイルの解析Perlスクリプト を作成しました。AN HTTPDのログタブの設定で、「ログ更新」を「毎日」に設定していても利用できます。
逆に「毎月」に設定している場合は、ファイル名を毎日のログファイルのファイル名(例.referer.20030201.log)に変更して下さい。
○ AN HTTPD用refererファイル解析Perlスクリプト(jcode.pm や Encode モジュール使用)
□質問W302 .WWWサーバーのAN HTTPDのログファイルから、本格的なアクセス解析を行なうには?(2003.3.8)
AN HTTPDのログファイルのNCSA 共通ログファイル形式(NCSA Common Log Format)から、combined log format (NCSA combined/XLF/ELF log format)に変換するPerlスクリプトのAN HTTPD専用ログファイル変換Perlスクリプト(jcode.pmを使用) を作成しました。
詳細は、AN HTTPD用アクセス解析ソフト(AWstats)設定例 をご参照願います。
□質問.
.
□質問A500 .インターネットからアクセスして来た人にURLを入力させて、Webページを表示するサービスを提供するには?(2002.8.17)
方法は、色々ありますが、WWWサーバのテスト やみえ~たぞ君 のサイトが実際にサービスをご提供されています。この様にPerlで、httpクライアントを作成する方法を以下に示します。簡単に設置出来ますから、是非試してみましょう。但し、NPHスクリプトのCGIProxy は、CGI負荷が大きいので、簡単に設置出来ても使用しない方が無難です。
私も以下の様なhttpクライアントを動作試験用にPerlで書いて実験しました。
○ Webページ表示チェックPerlスクリプトその1(Socketモジュール使用例)
○ Webページ表示チェックPerlスクリプトその2(IO::Socketモジュール使用例)
○ Webページ表示チェックPerlスクリプトその1(Windowsサーバー専用BASP21版)
○ Webページ表示チェックPerlスクリプトその2(Windowsサーバー専用BASP21版)
私が参考にしたサイトを以下に示します。
基本的には、「とほほのperl入門 」の「Socket関数 」に記載されている様なスクリプトを9行書けば、可能です。(内容説明なし。)
68user's page さんのHTTP クライアントを作ってみよう(1) とHTTP クライアントを作ってみよう(2) に解りやすい説明と実例があります。
ASH Multimedia lab さんのネットワークプログラミング とPerlでブラウズ(HTTP) に解りやすい説明と実例があります。
BASP21(Windows用汎用のコンポーネント) のBASP21のメソッド一覧。
□質問.
.
□質問A510 .他サイトのURLを入力させて、そのサイトのサーバー稼動検査を行うには?(2002.8.17)
httpクライアントを作成する方法(A500)と同様に行います。A500では、GETメソッドを使用して、ドキュメントルート下の「/index.html」等を
取得していました。サーバー稼動(応答)検査を行うには、OPTIONSメソッドを使用すると、検査対象のサイトに設置しているカウンタを
上げませんし、検査対象のサイトから受信するデータ量を小さく抑えることが出来ます。
これらは、自宅サーバー道 さんの「自宅サーバ稼動チェックプログラムとは 」で、既に紹介されており、勉強しました。
Perlのスクリプトで書いてあるDream-Seedさんのサーバー稼動チェックを参考に私も動作試験用にPerlで書いて実験しました。
○ サーバー稼動監視チェックPerlスクリプトその1(Socketモジュール使用例)
○ サーバー稼動監視チェックPerlスクリプトその2(IO::Socketモジュール使用例)
○ サーバー稼動監視チェックPerlスクリプトその1(Windowsサーバー専用BASP21版)
○ サーバー稼動監視チェックPerlスクリプトその2(Windowsサーバー専用BASP21版)
私が参考にしたサイトを以下に示します。
68user's page さんのHTTP クライアントを作ってみよう(1) とHTTP クライアントを作ってみよう(2) に解りやすい説明と実例があります。
ASH Multimedia lab さんのネットワークプログラミング とPerlでブラウズ(HTTP) に解りやすい説明と実例があります。
BASP21(Windows用汎用のコンポーネント) のBASP21のメソッド一覧。
□質問.
.
□質問A600 .プロバイダのWebサイトのデータを自宅サーバー内のPerlで編集するには?(2002.8.21)
プロバイダのWebサイトに設置するCGIには、パケットフィルタリングがしてあったり、色々と制約があります。
そんな時、Perlで、FTPクライアントを作成し、自宅サーバーに設置すれば、プロバイダのWebサイトのCGIデータを自宅サーバーに
ダウンロードして、このデータを編集して、アップロードすれば、その制約から開放されます。
又、毎日、定時にプロバイダのWebサイトのCGIデータバックアップ等、色々応用出来ます。
私も必要にせまられて、以下の様なFTPクライアントを動作試験用にPerlで書いて実験しました。
○ FTPクライアントPerlスクリプトその1(NET::FTPモジュール使用例)
○ FTPクライアントPerlスクリプトその1(Windowsサーバー専用BASP21版)
○ FTPクライアントPerlスクリプトその2(Windowsサーバー専用BASP21版)
私が参考にしたサイトを以下に示します。
68user's page さんのHTTPクライアントを作ってみよう(1) とHTTPクライアントを作ってみよう(2) に解りやすい説明と実例があります。
ASH Multimedia lab さんのネットワークプログラミング とPerlでブラウズ(HTTP) に解りやすい説明と実例があります。
BASP21(Windows用汎用のコンポーネント) のBASP21のメソッド一覧。
□質問.
.
□質問A900 .KENT WEBさんの掲示板等で、LAN内からアクセスすると表示し始めるのに10秒以上かかる。(2002.2.21)
セキュリティ上自宅サーバーのLAN内にプライベートIPアドレスからホスト名への逆引きの名前解決を行っていない場合に、gethostbyaddr 関数でtime outになり、時間がかかります。
LAN内で逆引き名前解決(サーバー機のhostsファイルにLAN 内のアドレスとホスト名を設定する等)を行う。
ブラウザにインターネット上のプロキシサーバーの設定を行う。
下記の改造を実施する。(改造は、自己責任にて実施し、kent-web さんへの質問は行わないで下さい。)
CGIを改造する場合は、CGIの中で、$hostがどのように使用されているかどうかが、不明ですから、下記の改造を推奨します。
以下の改造例では、アクセス元がLAN内の192.168.1.* である場合、gethostbyaddr関数が実行されない様にしています。
下記の改造部分をカット&ペーストされる場合は、このテキストファイル(HostCgi.txt) をご利用願います。
#------------#
# 基本設定 #
#------------#
.....中略.....
# ------- 追加改造開始 ------
# LAN 内のプライベートセグメントアドレス(192.168.1.0)を設定して、
# LAN 内からのアクセス(192.168.1.*)に対して、gethostbyaddr関数が実行されないようにします。
# わかない場合は、LAN 内のクライアント機のプライベートアドレスを設定して下さい。
$PrivateSegAddr = '192.168.1.0';
# ------- 追加改造終了 ------
.....中略.....
#------------#
# 設定完了 #
#------------#
.....中略.....
#----------------#
# ホスト名取得 #
#----------------#
sub get_host {
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
# ------- 追加改造開始 ------
# LAN 内からのアクセスに対して、gethostbyaddr関数が実行されないようにします。
if (pack("C3", split(/\./, $addr)) eq pack("C3", split(/\./, $PrivateSegAddr))) {
$host = $addr;
} elsif ($host eq "" || $host eq $addr) {
# ------- 追加改造終了 ------
# 変更 if ($host eq "" || $host eq $addr) {
$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2) || $addr;
}
}
.....以下略.....
□質問A901 .KENT WEBさんのカウンタで、「IPアドレスの二重カウントチェック」を有効にしても訪問者数が多く計数されてしまう。(2002.6.10)
「IPアドレスの二重カウントチェック」を有効にしても記憶されているのは、一つ前にアクセスしたIPアドレスだけです。より正確に訪問者数を計数するには、以下の様に改造し、アクセスした複数のIPアドレスを記憶します。下記の改造部分をカット&ペーストされる場合は、このテキストファイル(CountCgi.txt) をご利用願います。
#│ DAY COUNTER-EX v3.3 (2001/10/20)
#│ Copyright(C) KENT WEB 2001
.....中略.....
#============#
# 設定項目 #
#============#
.....中略.....
# IPアドレスの二重カウントチェック
# 0 : チェックしない
# 1 : チェックする
$ip_check =1 ;
# ----------------追加改造開始-----------------
# IPアドレス記録数で指定したIPアドレスは、記録されカウントされません。
# 従って、自サイトのURLから、カウンタを設置しているトップページに
# 戻ってくるカウントを防止出来ます。
# IPアドレス記録ファイル
$ipalogfile = "./ipa.dat";
# IPアドレス記録数(2以上にしないと機能しません。)
# 1日の総カウント数の約10分の1を目安にしますと、
# 2時間程度のIPアドレスを溜め込むことが出来ます。
$ipa_num = 100;
# LAN 内のプライベートセグメントアドレス(192.168.1.0)を設定して、
# LAN 内からのアクセス(192.168.1.*)に対して、カウントされないようにします。
# 分からなければ、ルータやクライアント機のIPアドレスを入力して下さい。
$PrivateSegAddr = '192.168.1.0';
# ----------------追加改造終了-----------------
#============#
# 設定完了 #
#============#
.....中略.....
# IPチェック
$flag=0;
if ($ip_check) {
$addr = $ENV{'REMOTE_ADDR'};
if ($addr eq "$ip") { $flag=1; }
# ----------------追加改造開始-----------------
# LAN 内からのアクセスに対して、カウントされないようにします。
if (pack("C3", split(/\./, $addr)) eq pack("C3", split(/\./, $PrivateSegAddr))) { $flag=1; }
if (!$flag && $ipa_num > 1) {
# IPアドレス記録データの読み込み
open(IN,"$ipalogfile") || &error;
$ipadata = <IN>;
close(IN);
# IPアドレス記録ファイルを分解して、配列に格納
@ipa[0..$ipa_num - 2] = split(/<>/, $ipadata);
# IPアドレスチェック(アクセスしたIPアドレスが存在したら、カウントしない)
foreach (@ipa) {
if ($_ eq $addr) { $flag=1; last; }
}
}
if (!$flag) {
# アクセスしたIPアドレスが存在しなかったら、
# IPアドレスを追加して、記録ファイル様式に変換
$ipa = $addr . '<>';
foreach (@ipa) { $ipa .= $_ . '<>'; }
# IPアドレス記録ファイルを更新
open(OUT,">$ipalogfile") || &error;
print OUT $ipa;
close(OUT);
}
# ----------------追加改造終了-----------------
}
.....以下略.....
注)IPアドレス記録ファイルの"ipa.dat"は、予め、空ファイルを作成しておいて下さい。ファイルがないとエラーになります。
□質問A902 .KENT WEBさんの掲示板(WEB FORUM)の過去ログファイルから、htmlファイルを作成するには?(2002.11.26)
KENT WEBさんの掲示板WEB FORUMの過去ログから、HTML 4.01 strict、XHTML 1.0 strict、XHTML 1.1用のhtmlファイルを生成するPerlスクリプト を作成しました。
自動作成した目次用htmlファイルの表示例 と各スレッド用htmlファイルの表示例 をご覧下さい。その際、ブラウザから、htmlファイルのソースのタグも是非、ご覧願います。
htmlファイルを作成する目的および特徴は、
利点:HTMLファイルの為、サーバーへの負荷が小さい。検索エンジンに収集させることも出来る。
欠点:HTMLの文法を忠実に守った為、過去ログのファイル容量が100倍以上に巨大化する。
(過去ログの約12Kバイトからは、約1Mバイト以上のHTMLファイルが生成されます。)
特徴:ご投稿者によるご投稿内容のURIの書式が正しければ、Another HTML-lint gateway で、100点満点が取れることを確認。
となっています。従って、Webファイルの容量の制限のない自宅サーバー用と言えます。
注)
このスクリプトは、KENT WEBさんのソースコードを流用しています。
従って、ご利用するには、KENT WEBさんのCGIスクリプト利用規定 を遵守する必要があります。
尚、このスクリプトは、KENT WEBさんとは、全く無関係ですから、KENT WEBさんへは、絶対にご質問しないで下さい。
□質問A903 .KENT WEBさんのAccess Reportで、リンク元の取得情報の一部が文字化けを起こす。(2002.11.12)
これは、検索エンジンのGoogleなどが、UTF-8コードを使用しているからです。これについては、文字コードライブラリをJcode.plからJcode.pmに変更することで、解決します。Windows用Jcode.pmのインストール方法 の「おまけ」をご参照願います。OSが、Windows以外の方は、PPMなどで、Jcode.pmをインストールして下さい。
perlのバージョンが5.8以後では、Jcode.pmと同じ機能のEncodeモジュールが標準モジュールとなりました。詳細は、アクセス元のrefererの文字化け対策 をご参照願います。
□質問A950 .「print MAIL "Cc:user@example.com\n";」と書くとカーボンコピー送信先にメールが届きません。(私もはまりました。)(2002.6.25)
@の前にバックスラッシュ(¥で代用)を入れて、「print MAIL "Cc: user\ @example.com\n";」と書けば届きます。追記、下記のいずれでもメールは、届きます。シングルクォーテーション(’)を使用しましょう。[回答者:かつさん ]
1)$mailto = " Cc: user\@ example.com" ;
print "$mailto\n";
2)$mailto = ' Cc: user@ example.com' ;
print "$mailto\n";
□質問.
.
|目次 |▲頁先頭 |