設置基礎知識
最終更新日 2000.05.17
■ このページは、CGI設置に必要な基礎知識を少しだけ解説します。
UNIX、Linux、Perl等について詳しく勉強したい方は、
ネットサーフレスキュー等、CGI関連解説サイトへどうぞ。
個別のサーバーや、FTPソフト等についてはそれぞれのサイトへ。。
  1. 初めての設置
  2. 転送モード
  3. パーミッション
  4. .htaccess
  5. クッキー
  6. スクリプト改造
  7. サポートの受け方
  8. その他

■ 初めての設置 TOP
初めて、CGIを設置する方はとりあえず読んでみてください。

通常、ホームページのファイル類(HTMLファイル、画像ファイル)はビジターから見ると読取専用です。 ビジターはサーバーにあるファイルを読み取る事はできますが、それを書き換えたり書き加えたりする事はできません。 CGIとは、このビジターでもサーバ上のファイルの書込みや検索などを実行できるようにする為のプログラムです。 これが、サーバー上で実行許可されていれば、そのプログラムのもつ機能を使う事ができます。 一般的なCGIは Perlと言う言語で書かれている物が多く、このサイトで配布している物もすべてPerlです。
とりあえず、CGIとはこういう物です。次に初めての設置にあたっての準備です。

【 CGIプログラムを利用する為の下調べ 】
  1. ユーザー設置のCGIプログラムが許可されている事が大前提
    CGIが許可されていないサーバーでは何をしても無理です(^^;)

  2. CGIを使えるディレクトリを調べる
    『CGIは cgi-bin のみで実行可能』等の制限がある場合があります。

  3. あなたのサーバーでのPerlのパス
    Perl言語かれたプログラムは、Perlと言うプログラムによって解釈され
    実行されます。perlやjperlなどがありますが perlのパスを調べてください。
    perlのバージョンがある場合なるべくPerl5を使うようにしてください。

  4. CGIの拡張子を調べる
    拡張子はWindows(デフォルトでは非表示)でも使われていますが、
    そのファイルの種類を識別決定する識別子です。
    CGIはサーバーがCGIとして実行できる拡張子になっていなければなりません。
    当サイトでは拡張子は 一般的な cgi とアナウンスしていますが、plの場合もあります。
    また、別記の .htaccess に 登録を自分でする必要がある場合もあります。

  5. BBSのメール機能を使う場合、sendmailが使えるかを調べる
    あまり開放されていない場合が多いようですが、このsendmailが使えるかを調べます。
    sendmailが使える場合、そのパスがアナウンスされているはずです。

  6. パーミッションの値をチェック
    パーミッションとは別記してありますが、そのファイルのアクセス権です。
    読取りのみ、や プログラムとして実行可能などがあります。
    こちらでは一般的な 755や666 とアナウンスしていますが、サーバーによっては
    755→705、666→606 などの様に、多少違う場合があります。

これらは基本的にプロバイダ側でアナウンスされている場合が多いです。
少なくとも perl のパスは必ずと言っていいほどアナウンスされているはずです。
それ以外特にアナウンスが無い場合一般的な設定でOKだと思います。
sendmailに関しては許可されていてもアナウンスが無い場合等もあります。

サーバーそれぞれの事に関してはサポートで相談されても、
サーバー管理者側(プロバイダー等)に相談してくださいとしか答えられません。
ここまでは、自分でしっかり調べてください。

設置したいCGIプログラムとその他必要と書かれているファイル等を
指定のモードで転送し、パーミッションを設定します。
設定解説をちゃんと読み指示どおりに、初期動作確認を必ず行ってください。
初心者に近いほど、初期動作確認をしてもらえない事が多いようです。


■ FTP・転送モード TOP
■ 転送モードは ASCII と Binary の 2種類あります。
スクリプトファイルは ASCIIモードで転送してください。
各 配布ファイルでは、転送モードも書いておきますので
必ず ASCIIのものは ASCIIでBinayのものは Binaryでお願いします。

■ 付属画像ファイルがある場合は、画像ファイルはすべて Binaryです。

■ データファイルをディレクトリ移動する場合は、DLもULも ASCIIでやってみてください。

■ 転送モードを間違えて送ってしまった場合 サーバー側から一度そのファイルを削除してから送り直した方がいいかもしれません。

■ HTMLファイル等はどちらでも大丈夫だと思いますが UL時とDL時が同じモードでないと改行がおかしくなる場合がおおいと思います。

■ パーミッション TOP
パーミッションとはファイルやディレクトリに対してのアクセス権です。

普段 HTMLファイルでは気にしていないと思いますが、 複数が同居していて、なおかつ、インターネット上から不特定多数がアクセスしてくるファイルですから そのファイルに対して、読み取りが可能、書き込みが可能、実行が可能 等のアクセス権と言う物がついています。 通常 HTMLファイルは、ビジターは読取りだけが可能な【 644 】 になっていると思います。

さて、この【 644 】や 【 755 】、【 666 】等の数字ですが
次の表を参考にして考えてください。
Owner(管理者)Group(所属)Other(ビジター)
Read (読取り)444
Write (書込み)222
Execute (実行)111
パーミッション縦 合計縦 合計縦 合計
↑【表1】
例として 実行スクリプトファイル【 755 】の場合を【表1】に当てはめてみると
Owner(管理者)Group(所属)Other(ビジター)
Read (読取り)
Write (書込み)××
Execute (実行)
パーミッション755
という事になります。
CGIスクリプトは、実行ファイル(プログラム)ですから ビジターに対して、これを読み取る事と実行する許可が必要になります。
オーナー以外が何らかの方法でこのファイルを変更できない様に書込みはできない様にしておきます。
オーナー(管理者)は、これに加えてFTPやTelnetでの編集や、上書き転送ができるように 書込みが可能になっています。
555にしても、ブラウザでの実行などに支障は無いと思いますが 内部作業 編集や上書き転送が不可能になってしまうと思います。

一般的に、拡張子が .cgi や .pl の物は実行を目的としているファイルなので パーミッションは【 755 】と思ってください。
次の例として、データファイル【 666 】の場合を【表1】に当てはめてみると
Owner(管理者)Group(所属)Other(ビジター)
Read (読取り)
Write (書込み)
Execute (実行)×××
パーミッション666
という事になります。
BBSの場合データファイルはCGIスクリプトが実行される時に、 まず、読み取る事が必要ですし、投稿された物を書き込む事が必要になります。 プログラムではないので実行は必要ありません。
一般的にこの様なデータファイルは、【 666 】になります。

Owner・Group・Other について
Ownerとは、そのファイルの持ち主・管理者 あなた自信です。
GroupとOtherは、同じと思ってください
あなた以外で、ファイルにアクセスしてくる人の事です。
ちなみに、ブラウザで普通にインターネットアドレスから ファイルにアクセスする場合は あなたも自信もOtherという事になります。
FTPやTelnetでアクセスして作業している場合はOwnerと言う事です。

例:WS_FTPの場合の変更方法

目的のファイルを右クリックして
chmod(UNIX)を選択します。(画像1)

次に表1と同じウィンドが出ますので(画像2) 必要な場所にチェックを入れOKを押します。
↑ 【 画像1】 【 画像2】 ↓


WS_FTPでのパーミッションの確認

1.ディレクトリ内の適当なファイルを右クリックして
コンテキストを出します。(画像3)

2.Directory List をクリックします。

Notepadで、ディレクトリ内の、ファイルやディレクトリのリストが出ます。(表2)
↑【 画像3】 【 表2】 ↓
drwxr-xr-x3 artemis webuser512 Dec 15 00:33 .
drwxrwxr-x3 artemis webuser512 Dec 17 03:33 ..
-rwxr-xr-x1 artemis webuser21963 Dec 15 00:40 bbs.cgi
-rw-rw-rw-1 artemis webuser59036 Dec 15 00:33 bbs.dat
このリストの見方ですが、右端がファイル名です。
左端の drwxr-xr-x の部分を見てください。これを解析すると。

種類OwnerGroupOther
d | - readwriteexecute readwriteexecute readwriteexecute
421 421 421
先頭は d - ですが これは、ディレクトリ(d) と ファイル (-) です。
それ以下は、単純に許可になっているものは 頭文字
不可になっている物は になっています。

-rwxr-xr-x
この場合は【 755 】と言う事になります。

他のFTPソフトや Telnetでパーミッションを変更・確認する場合
パーミッション設定コマンドは chmod (change mode)
ディレクトリリストは lsです、
全てのファイルを表示し 且つ、情報まで表示するには ls -a -l 又は ls -alです。
( ls 、-l 共に l は エル です)

これに類するソフトウェア内のコマンドを見つけて行ってください。

初心者の方はFTPソフトの説明書などもしっかり読んでおいてください。
■ .htaccess TOP
サーバー側で既に設定されているのがほとんどだと思います。
CGIが許可されているサーバーなのに、CGIファイルタイプが設定されていない場合は
.htaccessと言う名前のファイルをホームディレクトリ内、 或いは、CGIを実行するディレクトリ内に作ってみてください。
ピリオドで始まりますので、Windows内でこの名前を作成できませんから 転送してから、名前の先頭にピリオドをつけてください。
ファイルの内容は
AddType application/x-httpd-cgi .cgi
と書込んでください。
これで、cgiファイルタイプを認識されるかもしれません。

SSIを実行する場合には、SSIを記述するファイルの拡張子を登録します。
AddType text/x-server-parsed-html .shtml

.htaccess ファイルは ディレクトリ毎のパスワード設定や、 ホスト名によるアクセス制限などにも使い、とても便利です。 ネットサーフレスキューに解説がありますので必要な方は探してください。

【 Postoネット ユーザーへ 】
ネットサーフレスキューでも解説されている、パスワードによる認証を 少し修正する必要があります。

AuthUserFile  (ホームディレクトリより上位のパス)/xxx/.xxxx
AuthGroupFile  /dev/null
AuthName  Members_Only ※1
AuthType  Basic
<limit GET> ※2
require valid-user
</limit>
※1 AuthNameはパスワード入力ウィンドウに表示される名前でもありますが この名前は、スペースで区切るなどして 2語になると認証されずエラーになります。
アンダーバーなどでつなぐかMembersOnlyのように繋げてください。

※2 Limit GETの部分ですが、この部分のGETは 大文字にしてください。
小文字だとこれもエラーになります。

以前は 2語になっていても、getが小文字でも大丈夫でしたが
サーバーのバージョンアップに伴い変更になったとの事です。
他のプロバイダーでも該当する場合もあると思います。 .htaccessによる認証がエラーになる場合は試してみてください。

■ Cookie TOP
■ クッキーって?
クッキーとは簡単に言うとホームページ側からあなたのブラウザに向けて
今度来た時の為に情報を保存しておくように手渡されたテキストです。
これでも良くわからないとは思いますけど(゜ー゜;)
例えば、ネットサーフレスキューさんで配布しているBBSですが
投稿をすると、名前・メールアドレス・削除用パスワードを
次回来た時に入力しなくて済むようにクッキー発行しています。
このBBSの場合は、投稿をするとクッキーを発行しているわけです。
クッキー発行は、CGIで行っています。
この他にJavaScriptで行う事もできます。
CGIにせよ、JavaScriptにせよ、ブラウザがクッキーシステムを
サポートしている物に限ります。

他によく使われるのが、クッキーカウンタなどで、
CGIのページを開くとその時点で回数をクッキーを発行します。

クッキーの読取りは発行したURLを開いた時、或いは クッキー発行時に設定されたパスを開いた時にサーバー側で要求があれば
サーバー側でそれを読み取る事ができます。
従って、このサイトで発行したクッキーを、通常
他のサイトで読み取る事はできない、と思ってください。

先ほどのBBSは、この読取りを行い必要な物を取り出し
それを、自動的に名前欄などに表示させるようにプログラムしてあります。
クッキーカウンタの場合は訪問回数データをクッキーから読み取り
それに 1 を足して、また再度クッキー発行し、読み取ったデータを
サーバー側で保存したりします。

このサイトでは、未読記事お知らせモードをメインにして
色々な Type を配布しています。
このお知らせモードも クッキーが無ければ実現できません。
お知らせモードの仕組みは、訪問の際の時間や記事番号をクッキーとして発行し
次回来た時にその時間より後の物に対して NEWマークを付けているだけです。

クッキーで訪問回数や時間などを知られるのが嫌な方もおります
本来は、投稿した方、なお且つ、クッキー発行を受けるチェックを入れた方にのみ
クッキー発行するのがベストなのかもしれません。

あと最後に、クッキーには有効期限をつける事になっています。
クッキーはその有効期限を過ぎると自動的に消滅します。

こんなもんで、クッキーの役割はおわかりでしょうか?
JavaScriptでの処理の仕方等はARTEMIS本館にあります。

■ Key変更の危険性
クッキーに情報が保存される時には Key=Value という形で保存するのが一応規則です。
さて、配布BBSではどうなっているかというと
Key(設定したURL) = Value(名前:○○,メアド:△△,パスワード:□□)
という形で保存しています。
CGIでは 自分のURL と同じKeyを探し、その値を取り出します。
その値を今度はカンマ(,)で分割して、各ペアとし、
各ペアをコロン(:)で分割して 名前=○○ メアド=△△ のように
取り出しているのです。

本来のクッキーの使い方から言えば
Key(名前)=Value(○○) でクッキー発行。
Key2(メアド)=Value2(△△) でクッキー発行。
Key3(パスワード)=Value3(□□) でクッキー発行。
この様にするらしい?のです。これだと Key=Valueの形で 余計な処理をせずにすぐに取り出せます。

何故?
クッキー発行を何度もしなければならない
また、一度にアクティブにできるクッキーの数の制限や
クッキー自体のファイルサイズなども関係してくるでしょう。

しかし、それよりもっと重要な事もあります。
それは、例えば同じCGIを同じディレクトリ内に2つ設置した時
Keyの名前が同じになってしまうという事です。
例えば 同じスクリプトで bbs.cgiと bbs2.cgi を 同じディレクトリの場合
bbs.cgiで NAME=Lime とした後で、bbs2.cgiでNAME=らいむ
とした場合、後で発行された方が前で発行された
同じKeyの値を書き換えてしまいます。
また、このサイトのお知らせモードの場合 bbs.cgiで
LASTVISIT=199901201200 と発行され、次に1時間後に bbs2.cgiで
LASTVISIT=199901201300 と発行されると、bbs.cgiで この1時間の間に
投稿された記事は、既読として扱われてしまう事になります。

この場合CGIスクリプト内で、きちんとKeyを変更するように
書き換えれば問題はありませんけど・・・。
配布スクリプトを使用するユーザーが、自分でPerlを書けるなら
簡単な指示でこれらを行ってもらってもかまいませんが
書ける人なら、自分で最初から作っているでしょうし・・・。

この様にバラバラにしない場合でも注意事項はあります。
せっかくスクリプト内で
Key(設定したURL) = Value(名前:○○,メアド:△△,パスワード:□□)
としているにもかかわらず、このKeyが URLなので長いから?かわかりませんが
例えば、ARTEMIS にしてしまうとか、スクリプトの名前だけにする(bbs.cgi)とか。
これも 2つ同じディレクトリに設置した場合、必ず書き換えねばなりません
結果的にトラブルの原因になり勝ちです。

そのスクリプトのURLなら問題が起きない?
URLとは インターネット上に 唯一無二の アドレスです。
従って、同じKeyが存在する事はありえないのです。
これで、無用なトラブルに巻き込まれずに
Keyの心配などせずに設置できているわけです。

先ほど同じディレクトリの・・と書いていますが
違うディレクトリで同じKeyの場合はどうなるのでしょうか?
これは、上書きされません。下層のディレクトリのスクリプトでは Name=Lime と Name=らいむが 読み取るクッキー上に存在できます。
同位のディレクトリであれば、クッキー上に2つ存在しません。
良くわからないかもしれませんが これなら使っても良いのでしょうか?
これは、駄目です。
CGIなどでクッキーを読み取る場合は Key=Valueの群れの中から
特定のKeyの名前を探して、その値Value を読み取ります。
同じ名前が2つ存在した場合、最初に見つかった方、或いは
最後に見つかった方などになってしまいます。(処理による)
つまり、処理の時点で見分けがつかなくなってしまうという事です。
CGIの方でこれを予測した処理をすればいいのですが、余計な処理をするより
Keyを唯一無二のURLにする事で簡単に解決ができるわけです。

不思議に思う方も居るかもしれませんので・・・。
ディレクトリや、発行CGIが違うなら、クッキーは別では?
これも理解していないと、処理ができませんね。

例えば、次のCGI全てクッキー発行しているとします
1.host/artemis/index.cgi
2.host/artemis/cgi-bin/bbs.cgi
3.host/artemis/cgi-bin/chat/chat.cgi
4.host/artemis/cgi-bin/gbook/gbook.cgi
この場合ですが、1.の index.cgiを開いた時点で
index.cgiが受け取るクッキーは 1の1つだけです。

2.を呼び出した場合は、1.2.の2つをCGIが受け取ります。
つまり、自分より上位で発行されたクッキーは受け取れてしまうのです。
3を呼び出した場合は1.2.3.を、4の場合は 1.2.4.を
それぞれ同じ理由で受け取ります。
つまり、Keyが同じになるような場合、自分と同じディレクトリ
或いは、上位に同じKeyを持つ物が存在してはならないのです。
URL(絶対パス)にする事で、これらが回避できているわけです。

なぜ、上位のクッキーを受け取れてしまうのか?
今書いている時点では悪い様に受け取られてしまうかもしれませんが
例えば表紙で、名前を入れてもらう。
下層のBBSでは、その名前を利用する事ができますね。
きちんと把握さえしていれば、逆に便利なんだと思います。
Keyを統一する事で同じ値を、どのディレクトリからでも引き出せる利点もあるからです。

上位では、下層のクッキーを取り出せない?
Domain とPathを省略せずに、上位で読み取れるように
上位のDomain、Pathにしておけば、読み取れるのだと思います。
Domainは同じ事が条件でしょうからPathを変えれば良いと思います。
このDomain、pathとは クッキーの仕様で
Key=Value; Expires=有効期限 GMT; Domain=ドメイン; Path=/パス/;
この様な形式でクッキー発行しますので、この値の事です。


とりあえずクッキーについてはここまでです。
ここに書いてある事は、自分で実験しながらまとめた物で 仕様書等を読んだ物ではないので、大間違いをしているかもしれません(゜ー゜;)
その場合はご勘弁を・・。

■ スクリプト改造 TOP
■ 主にHTML打ち出し部分
表示されるHTMLを指示するにはprint "HTMLソース";と書きます。
この場合 HTMLソース内で ダブルクォーテーションを使う場合は
\"、@マークは \@ の様に規則がありますので注意してください。
これらを避ける為には print '内容';のようにシングルクォーテーションで囲めばOKですが この場合変数は展開されませんので変数を含む場合は必ず ダブルクォーテーションの方を使います。
シングルクォーテーションの時は内部に使うシングルクォーテーションは\'と書く必要があります。

この他に
print <<"EOF";
---- HTMLソース ----
EOF
と言う方法でHTML等を打ち出している個所もあります。
この場合は上記 ---- HTMLソース ---- の部分に普通にHTMLを書いて大丈夫です。
特に気にすることはないと思います。
ただし、 print <<"EOF";EOFの後ろはスペースもない状態で 改行されている事。
EOFは左端にくっつけて書き、その前にスペース等があってもいけません。

■ MAXLENGTHの怪
INPUT BOX等で MAXLENGTHを付けて、入力文字数を制限する場合に
気を付ける事として、IEとNetscapeでは 文字の数え方が違います。
IEでは 半角も全角も 1文字は1文字です。
Netscapeでは 半角は1文字 全角は2文字として数えます。
これは、JavaScriptでの文字数の扱い方と同じなのですが、とにかく
length=20といった場合、Netscapeでは 日本語(全角)で10文字、半角20文字 IEでは 全角半角ともに 20文字という意味になります。
Netscapeでは1バイトを1文字と言う取り方をしていると言う事です。

■ 最大記録数について
スクリプトによって多少方法が違いますが、BBSがデータを表示する時、
記録する時、削除する時などにはデータファイルを全部読み込む時があります。
最大記録件数が多いと、この読み取る量とこれらを処理する量が増えるため
サーバーに大きな負担がかかる場合があります。
設置者、管理者はどの程度古い記事までが読まれているか? や
どの程度古い記事まで返信できたほうが良いのか? 等をよく考えてください。
古くなった記事はほとんど読まれず、返信もされない場合、それらは
サーバーに負担をかけるためだけに存在する無駄なデータであると自覚してください。
現在過去ログ機能がついていない物もいずれつけますので、
アクティブデータ(返信や削除が可能なデータ)ファイルは、なるべく小さくなるように
最大記録件数を少なめに設定してください。
一般的な使い方では古い記事は過去ログとして保存されていればそれで十分でしょう。
多くの方が共存するプロバイダーのサーバーでは、サーバーへの負荷と言う物も
考えてみてください。

■ 表示件数について
ARTEMISで作成しているBBSは、レイアウト・デザインを私の望む物にする為
MiniBBSに比べて、かなりタグの記述量が多い物となっています。
1ページあたりの表示件数を多くすればするほど、1ページのデータ量は増えます。
データ量が増えればビジターに送られる送信データ量が多いわけで、
訪問者も表示するまでにかなり時間がかかる事にもなります。
サーバーへの負荷とともに訪問者への無駄な負荷を減らすと言う事も考えてみて下さい。
1日に数件の投稿しかない場合、10件表示すれば十分だと私は思います。
自分のBBSの使われ方を良く把握して適当な件数に設定するのが
管理者の役目というか義務でもあると思います。

■ 改造時の変数の記述
打ち出し部分を改造する際の変数の取り扱いですが
アトリビュート=変数 の様な記述の場合はなるべく変数を \" で囲むようにしてください。
例:<FONT COLOR=\"$basesize\">
これは、Perl記述の決りではないのですが、この様にすると次のミスを防げます。
変数が設定や、スクリプトのなどのミスにより 空になった場合
<FONT COLOR= SIZE=5> この様なタグの打ち出しになってしまいます。
この場合ブラウザにとって COLORの値が SIZE という文字であると認識されてしまう場合があります
\"\"で囲まれていれば、<FONT COLOR="" SIZE=5> のように打ち出される為
COLORの値が無い状態で後は正常にタグ解釈されます。

■ サポートの受け方 TOP
サポートを受ける前に必ず確認していただきたい事があります。
まず、各スクリプトの設置設定解説とFAQ等には必ず目を通してください。
次に、プロバイダーのFAQなどのCGIに関する説明などを必ず読んでください。

質問の際には、どのスクリプトのどのデザインバージョンであるか。
どういうエラーなのかをこちらにわかるように詳しく書いてください。
また、サポート前にできるだけ試行錯誤してみてください。
例えば画像が表示されない場合等は、ブラウザで直接その画像にアクセスしてみて
ちゃんと表示されているのか?等 確かめられる事はいっぱいあります。

最新のバージョンに変更してみるなどの事もなるべくやってください。
細かい修正点は書いていませんが、バージョンアップで解決できる事もありますので。


■ その他 TOP
■ ローカルテスト
テストをする場合は、ローカルマシン内で稼動するPerlとサーバーソフトなどを手に入れて まず、ローカルでテストを繰り返す事をお勧めします。 テスト用サーバーが用意されているプロバもあるので、面倒くさがらずに きちんとテストを行いましょう。
UNIX用のコマンドがある場合も、なるべくスイッチなどをつけてWinPerl上でも
動くように設計していきますので。。

■ ブラウザでの確認
ホームページ製作者は、NetscapeとIEの2大ブラウザでの確認くらいは
なるべく行うようにしてください。両方とも無料で手に入りますし
このどちらかのブラウザでアクセスしてくる方が多いわけですから
簡単に確認はできるとおもますので。



Copyright ©1998-2006 ARTEMIS. All Rights Reseved.