トップページ | 利用規定
  FAQ・1

カレッヂ
カレッヂ


次のページ


全くの初心者なのですが

当サイトは初心者ではない初級者から中級者程度の技量の方を対象にしています。 HTMLの書き方やブラウザの使い方、ファイルの作成の仕方や編集の仕方、 FTPソフトやテルネットの使い方などは既に知っていることが前提です。 特に転送モードについての知識は十分習得してください。 当サイトだけですべてのことを網羅することはできません。 ハウツー系サイトはたくさんありまし、参考書もたくさんありますので、 わからない専門用語や基本的なことは勉強してきてください。 自転車に乗るとかピアノを弾くとか車の運転をするとか、 何かをしたい場合にそれぞれの技術を得るための勉強時間は違いますが、 それと同じように、パソコンを使うには、ホームページを作るには、 CGIで掲示板等を設置するには・・・レベルに応じてそれ相応の勉強が必要です。

CGIの設置が始めての方は、以下のスクリプトをコピーして test.cgi という名前にして作成し、 アスキーモードで転送してパーミッションを755に設定してブラウザから呼び出してみてください。 これでも立派なCGIスクリプトです。画面に TEST と表示されます。 その際に注意することは、perlのパスです。ここでは /usr/local/bin/perl ですが、 これはプロバイダに聞いて、違えば書き換えてください。#! を忘れずに。 なお、#! はファイルの1行目の左端から書かなければなりません。 HTMLを設置して呼び出すことはできるでしょうから、 それ+、CGI実行可能なディレクトリに転送モードに気をつけて転送することと、 パーミッションを実行できるように設定することを確認すれば簡単でしょう。

どういう環境で設計していますか?

当サイトでは、下記のPERL環境で設計しています。ただ、別段の表示が無い限り、 PERL5の文法は使っていませんので、PERL4で動作可能だと思われます。 当サイトのすべてのシステムはUNIX用です。NTやMACサーバでご利用になる場合は、 アレンジが必要となる場合がありますが、当サイトではわからない為にサポートできません。

Red Hat Linux release 5.2(J)
Kernel 2.0.36 on an i686
% perl -v
This is perl, version 5.004_04 built for i386-linux
Copyright 1987-1997, Larry Wall
Japanization patch 4 by Yasushi Saito, 1996
Modified by Hirofumi Watanabe, 1996-1998
jperl5.004_04-980303
EUC version

日本語コードは?

私はWINDOWSパソコンでメモ帳を使ってコーディング(プログラムを書くこと)してしています。 従って日本語コードはシフトJISになります。 当サイトのシステムは別段の表示が無い限り、SJISの状態で設置するように設計されています。 もし、EUCに変換して設置する場合は、たとえば、スクリプト中にconvert()文があれば、 「sjis」を「euc」に変更するなどの措置が必要です。

[MEMO] ブラウザでは日本語を判別(自動判別に設定している場合)する際に、 最初に現れた全角文字の日本語コードで全体を表示してしまいます。 従って、複数のコードが混在していると文字化けになります。 スクリプトをEUCで設置するということは、スクリプト中に書かれている文章はEUCで画面に出力されます。 しかし、記録データもEUCに変換(convert)しておかないと、 画面に表示される際にコードが混在してしまうことになります。 画面に表示されている文字の一部が化けている場合、ブラウザの文字コード設定を自動判別ではなく、 EUCとかSJISに固定してみてみると、どの部分が何のコードになっているかを把握でき、 原因究明や対策に利用できます。

[MEMO] プロバイダのCGIに関する注意事項の中に、 スクリプトはEUCで設置しないと駄目ということが書かれていることがあります。 基本的にUNIXでSJISのプログラムは誤動作を起こしたり動作しなかったりします。 これはこの先で説明する、スクリプト内に書いた文字が化ける理由の一つにもなります。 しかし、大多数の人が利用しているWINDOWSではSJISを扱うため、 EUCに変換して設置するのは面倒ですし、特にどうしてもEUCでなくては駄目ということではなく、 マッチ文などSJISだと動作不可能な処理以外の処理はSJISでも十分プログラムが設置できます。 これらは設計者が気を使うことであり、既に設計されたものを設置するだけであれば気にしないで結構です。

CGIを設置する場所が決められているのですが

大抵のサーバの場合、ホームページディレクトリ内のどこに設置してもCGIが実行できると思います。 この方がシステム別に整理して設置できますので便利です。しかし、プロバイダによっては、 たとえば/cgi-local/内に設置したCGIスクリプトしかCGIとして実行できないところもあります。 設置する構成がどんなであっても、設定さえしっかりできれば問題ありません。 その場合、各ファイルの位置関係を相対的に設定する書き方を十分マスターしてください。

	rescue/
	   |
	   |-- public_html/
	           |
	           |-- cgi-bin/
	           |      |
	           |      |-- bbs.cgi
	           |      |-- sample.dat
	           |
	           |-- log/
	                |
	                |-- bbs.dat

例えばこのような構成でbbs.cgiがあるとします。データを記録するbbs.datをbbs.cgi内から 呼び出す場合、$file = '../log/bbs.dat'; となります。../で一つ上のディレクトリを指し、 さらにそこからlogディレクトリにあるbbs.datを指定します。bbs.cgiと同じディレクトリにあり sample.datを呼び出す場合は、$file = './bbs.dat'; となります。

Webサーバの違いは?

UNIX上のWebサーバには、NCSAやAPACHEやCERNやネットスケープコマース等があります。 私もそれぞれの違いはよく知りませんが、APACHEはNCSAをカバーしています。 CERNではSSIが使えませんので注意が必要です。 これらは特に気にすることはありませんが、Webサーバの機能を使う場合、たとえば、 アクセス制限等を使う場合にその設定方法が異なります。 アクセス制限に関して当サイトでは、NCSA(APACHE)系とネットスケープコマースサーバについてご紹介しています。

CGIとHTMLの関係は?

HTMLとCGIはクライアント側(ブラウザ側)から見ると同じです。 というのは、HTMLは設置されたファイルそのものが送信されてブラウザで見るわけですが、 CGIはサーバ上でプログラムが実行されて、 HTML形式とかその他画像等になったデータが送信されてブラウザで見るので、 ブラウザ側から見れば、どちらも送信されてくるデータを見ているだけなのです。 ですから、CGIだからブラウザが落ちやすいとかはあまり考えられません。 この反対にJavaやJavaScriptは、プログラム自体がブラウザに送信されて、 ブラウザ内で直接実行されるので、何らかの具合でブラウザが落ちやすくなることはあるでしょう。 どちらにしても、ブラウザは非常に繊細な動作をするので、多種多様な機能が加わった昨今では、 一般保護違反で落ちることもよく見かけます。

CGIやSSIを使うための設定は?

これはサーバの環境によってまちまちですので、プロバイダが提供しているCGIに関する情報を見てください。 中には、基本的な情報しか公開せず、サポートは一切しないところもあるでしょうが、 初心者であればそういうところは使わず、あなたの技量にあわせてCGI環境を選ぶことも大切です。 大抵は、何も設定しなくても、拡張子が .cgi であればCGIとして実行されるとか、 あるところでは、/cgi-bin/内に設置したファイルは拡張子に関係なくすべてCGIとして扱えるとか様々です。

[MEMO] CGIを実行しようとしたが、スクリプトの中身が表示されてしまう場合(例:リムネット)は、 サーバの環境設定が必要です。どちらにしても、まずプロバイダの指示に従うことが先ですが、 このような場合、「.htaccess」という名前で下記の内容のファイルをホームページディレクトリに置くことで解決できます。 このファイルは、設置するサーバが認識できるファイルでなければなりませんので、 WINDOWSのFTPソフトであれば「アスキーモード」で転送設置しなければなりません。

Options ExecCGI Includes
これを書くことによって、インデックスファイルがない場合でもファイルリストが表示されてしまうことを防げる。

(訂正事項) 「Options FollowSymLinks ExecCGI Includes」だとセキュリティ上問題があるとのご指摘を受けましたので、 既に設定している方は、'FollowSymLinks'を削除してください。

AddType text/x-server-parsed-html .html
AddType text/x-server-parsed-html .htm

拡張子が.htmlと.htmのファイルをSSIが扱えるファイルとする。

AddType application/x-httpd-cgi .cgi
拡張子が.cgiのファイルをCGIスクリプトであると認識する。

[MEMO] ピリオドから始まるファイルはWINDOWSのエクスプローラでは新規作成できません。 とりあえず htaccess.txt という名前で作成し、それをFTPソフトで変更してください。 なお、.htaccess の拡張子は何にしたらいいですか?と聞かれることがありますが、 拡張子とかいうことは気にせず、指定されたファイル名と同じにすればいことです。 または、メモ帳で適当なファイル名でまず編集し、 保存の際に「ファイルの種類」のリストボックスから「すべてのファイル(*.*)」を選択し、 「ファイル名」のテキストボックスには「".htaccess"」のように"で囲んで保存しても可能なようです。

[MEMO] SSIは、ぺージにアクセスした時点で実行され、画面には実行結果が貼り付けられて表示されます。 ですから、アクセスした画面のソースを見たときに、SSI記述(<--# -->)が表示されている場合は、 SSIが実行できる環境ではないということになります。上記の設定を確認するか、 SSIについてはプロバイダでいろいろな規制をしているところも多いですので注意が必要です。 使えないところも少なくありません。

[MEMO] SSIはサーバに負担をかける処理でもあります。 もし、上記のように .html すべてのファイルでSSIを扱えるようにすると、 SSIを使っていないHTMLファイルも、SSI実行チェックが入ることになるようです。 ですから、AddType text/x-server-parsed-html .shtml というように、 拡張子が .shtml のHTMLファイルだけSSIを実行するようにした方がベターです。

[MEMO] その他にこの設定ファイルでこんな設定もできます。これらがすべてできるわけではなく、 プロバイダ側で使えないように設定しているコマンドもありますので注意してください。

DirectoryIndex index.html index.htm index.cgi
インデックスファイルをこの順番にチェックして認識します。 ここに設定したファイルにアクセスする際はURLでファイル名を省略できます。 一般的にはプロバイダ側で index.html が設定されていますから、何も設定しなくても省略できるでしょう。 大手プロバイダではインフォウェブでは設定されていないし、設定ファイルも使えませんから、 URLは http://....../~user/index.html までちゃんと書かなければなりませんね。

ErrorDocument 404 http://www.foo.bar/~user/document/404.html
たとえば、URLが間違っていてファイルが無い場合は、404 Not Found 等のように表示されますが、 これを自分流に表示することもできます。たとえば、404.htmlにそのエラー表示内容を書いて設置し、 設定ファイルにはこのように設定しておけば、このファイルにアクセスされます。

シェルについて

プロバイダによってはサーバ内の直接入れるシェルサービスをしているところもあります。 一般的にはテルネット(telnet)を使ってアクセスします。 特に、FTPでパーミッションの設定ができないサーバ(例:リムネット)では、 この操作も覚えなければなりません。使い方自体を説明するのはとても難しいので、 わからない方は参考書を探して覚えてください。

当サイトでは「UNIXコマンドリファレンス」として、必要最低限のコマンド等を紹介しています。 シェルにはBシェルやCシェルやbash等いろいろなシェルがあります。 シェルと言えばBシェルを意味します(多分^^;)が、一般的にはCシェル(csh)が使われています。 当サイトでは総称して「シェル」と表記しています。シェルの種類は、% ps と入力して、 現在起動されているシェルが表示されることでわかります。 シェルの種類によってコマンドやその動作が異なるものがありますので注意してください。

ダウンロードしたファイルの改行がおかしい?

ダウンロードされるファイルはUNIXサーバ上に置いてあります。 従って、取り出したファイルはUNIXの改行コードになっています。 しかし、ダウンロードの仕組みにも因るので、もしダウンロードしたファイルの改行コードが違う場合は、 編集する前にそのまま「バイナリモード」でサーバに転送し、すぐ「アスキーモード」で取り出せばいいでしょう。

データのバックアップはどう採るの?

たとえば、簡易BBSのデータは minibbs.dat に記録されていきます。 このファイルを単にバックアップするには、バイナリモードで取り出してそのまま保存し、 万が一の場合はそのままバイナリモードで転送して、必要があればパーミッションも再設定すれば、 バックアップした時点に戻ります。ここで注意することは、 取り出したファイルはバイナリモードで取り出していることから、 改行コードも含めてUNIXのファイルであるということです。 異なるOS(パソコン上)で編集するにはそれ相応の技術が必要です。 この方法はバックアップの仕方として覚えてください。 簡易BBSのデータのようなテキスト形式のファイルだけでなく、 どんな形式のファイルでもこの方法でOKです。

[MEMO] UNIXにはファイル毎に権限(パーミッション)が設定されています。 簡易BBSの minibbs.dat のように、あらかじめファイルを用意してそこに記録するタイプのファイルは、 そのファイルはオーナー(あなた)の権限で作成したので自由に扱えるのですが、 WWWBBSやWebBOARDなどの記事や情報ファイルは、 指定のディレクトリ内に投稿毎に新規にファイルが作成されて記録されます。 わかりやすく言うと、パーミッションを777に設定するように指示されているディレクトリ内のファイルです。 当サイトの一部のアクセスカウンタのカウントファイルもそうです。 この時、ファイルを作成するのはWWWユーザ(nobody)です。 環境にも因るのですが、オーナーがFTPでデータを取り出そうとしても、 パーミッションエラーで取り出せない場合があります。 この場合は権限にあわせてCGI等を利用して処理する必要があるので、かなり難しいでしょう。 シェルが使えれば、TAR等を使ってディレクトリごとアーカイブしてしまうとかしなければなりません。 重要なデータはブラウザ上で表示される内容を記録するなどしてください。

パーミッションとセキュリティについて

CGIが実行できる環境はサーバによって異なります。次に説明する理由はあとで勉強してもらうとして、 安全のために次のようにして設定してください。 これは当サイトにおいて、パーミッションを 666 に設定するように指示しているファイルのパーミッションの設定方法です。

  1. 666 に設定した状態で正常に動作していることを確認する。
  2. 606 に設定して動作確認する。駄目なら 666 で運用する。
  3. 600 に設定して動作確認する。駄目なら 606 で運用する。

より下に行く程セキュリティが強化されるが、サーバによって異なる。 606 で実行できるサーバは、CGIスクリプトも 705 で実行できる。 600 で実行できるサーバは、httpdにsuexec機能を追加している場合 [例:bigネット,ビッグローブ(現在のところwww2sのみ)]、 オーナーの権限でCGIを実行できるので、CGIスクリプトも 700 で実行できる。 これにより、シェル経由や他グループからのCGI実行による悪戯等を防止できます。

さらに、606 と 600 で実行できるサーバは、 ホームページディレクトリ(public_html等)のパーミッションを 705 にしておくといいでしょう。

サーバエラーが出るのですが

「エラー」です、と言っているだけですから、これだけでは原因は全くわかりません。 逆にいうと、このメッセージはエラーの原因を何も表示していないということです。 当サイトのシステムを設置する場合、簡単なものから慣れていき、簡易BBSなどは簡単に設置できるようにしてください。 初期設定などの必要最低限の修正以外をいじらずにまず設置してください。 それでもエラーになる場合は、大抵は転送モードやパーミッションなど、 基本的なことをミスしていることが多いです。十分確認してください。 それでも解決しない場合は、シェルでそのCGIを実行させて、どんなエラーが出るかを見てみる必要があります。 シェルが使えない場合は原因究明はとても困難です。勘と経験が結構モノを言う世界でもあります。

当サイトでは、設置に関してはすべてご自身で対応していただくことになります。 個人運営のため、事実上個別のサポートは時間的にできませんので、当サイトの説明を読んで理解できない内容については、 参考書やCGI設置のための説明をしている他サイト等をご参照の上、できるようになった上でご利用ください。

「文章にデータが含まれていません」と出るのですが

日本語版ではない場合は「Document contains no data」というエラーです。 中身の何もないファイルを呼びだしてもこのエラーが出ます。 送信されるファイルのヘッダとして print "Content-type: text/html\n\n"; 等を出力させなくてもこのエラーになりますが、 設置するだけの方は考えることはありません。サーバが混雑していて過負荷状態の場合に、 CGI設置が成功していてもこのエラーが出ることがありますから、設置&試験は混雑時を避けるべきです。 サーバエラーでないこのようなエラーは、特にフォームのSUBMITボタンを押して起きることが多いです。 例えば、簡易BBSを最初に実行して表示されて成功したと思っても、 マスターキー(パスワード)を設定してボタンを押してこのエラーが出る場合は厄介です。 シェル上でテストしてもエラーにならないからです。 何か入力してボタンを押した状態を作ってから実行する必要があります。 データは 'QUREY_STRING' や 標準入力にデータをいれてやる必要があり、 シェルの種類によっても違いますが、シェルコマンド setenv や export 等で入力してから実行させます。 [MEMO] 最近のスクリプトは入力形式 POST/GET を選択して、どちらか一方を利用するような仕組みになっています。 これは悪戯防止のための措置ですが、このシェルテストを行う場合は、GET を使うように設定した上で実行しなければなりません。

(参考)シェルテストの方法

    <form method=get action="form.cgi">
    名前:<input name="name">
    年齢:<input name="age">
    コメント:<input name="comment">
    <input type=submit value="実行"></form>

このようなフォームがあって適当にデータ入力して実行させた場合、実行後のURL欄には
http://..../form.cgi?name=kazu&age=20&comment=hello
というようになっています。

    input name="name" -----> kazu ---> name=kazu
    input name="age"  -----> 20 -----> age=20
    input name="comment" --> hello --> comment=hello

という流れでフォーマットが作られます。(スペースは「+」、英数字以外の文字は%に続くアスキーコード に変換されます。)これらの各データは「&」で繋がっています。そして、URLの後ろに「?」に 続けて渡されます。(これはgetの場合であって、postでは形式が違う為に表示されませんが、同様の フォーマットで渡されています。)この「?」の次の「name=kazu&age=20&comment=hello」が「QUERY_STRING」 という環境変数に代入されるのです。

さて、これをシェルでCGIプログラムを実行させる前に代入させるにはどうしたらいいでしょうか? 「setenv」というシェルのコマンドを使います(csh等の場合)。

    % setenv QUREY_STRING 'name=kazu&age=20&comment=hello'
    % ./form.cgi

実行したら Command not found と表示された場合、perlのパスが間違っているか、 転送モードを間違えて設置したか、 シェルでの実行時にパスが通っていない(フルパスで実行してみる)等の原因が考えられます。

文字化けについて

記録した内容だけが化ける場合

当サイトのスクリプトは、別段の定めがない限りSJISで設置するように設計されています。 設置時にEUCで設置してしまったものと思われます。EUCで設置する場合は、スクリプト内の convert()処理の sjis を euc に変更する必要があります。 または、ブラウザの日本語コード処理の判定をEUC固定にしていませんか? 自動にするかSJISにしてください。なお、自動判別はあまり当てにならない場合があります。 漢字コードの判定というのは技術的にも結構難しいそうです。 自動にした場合、ブラウザは複数の文字コードが混在すると最初に出会ったコードですべてを表示します。

スクリプト内に書いた一部の文字が化ける場合

当サイトのCGIスクリプトは別段の表示がない限りSJISで書かれており、SJISで設置するようになっています。 SJISで書かれた文が実行されると、その文字によってはメタ(特殊)コードと合致してしまうものがあり、 その部分が実行されて文字化けとなります。 '―ソ欺圭構蚕十申貼表予兔喀杤噂饅'などが主なものです。 これを回避するには、""で囲まれた文字列はメタ処理をするので、''で囲む方法があります。

    print "表示と$fooへの申込\n"; --> print '表示と',$foo,'への申込',"\n";

変数や改行(\n)は処理されなくてはなりませんので、このようにします。 化ける場合、その前後に渡って化けてしまうので、 どの文字が化けるのかわからない場合にこの方法が便利です。 または、文字化けする文字があらかじめ分かっていれば、その文字の後ろに \ をおきます。

    print "表示と$fooへの申込\n"; --> print "表\示と$fooへの申\込\n";

文字列の最後の文字が化けることがある場合

一部のあるOSの、あるパッチのあてられたperl環境では、改行コード削除にchop;を使用した場合に、 \nの直前の文字も削除されてしまうそうです(ゆいさんから情報をいただきました)。 もともとperlを日本語SJISで利用することは前提とされておらず、 その為に親切にパッチをあてたものだとは思いますが、反ってその弊害が出てしまう場合があり、 入力文字によっては最後の文字が化けてしまうことがあります。そうかな?と思われる場合は、 サポート掲示板にて対応しますのでご相談ください。

または、自分で措置できる方は、簡単に言うと、最後の文字(改行コード)を削除する処理を chop; ではなく、 s/\n//; で削除するようにしてください。

ステータスバーの文字が化ける場合

WebCHATなどでJavaScriptを使ってステータスバーに日本語が表示されるもので、 一部のブラウザ(NetscapeCommunicator4.06等)で文字が化ける症状がでるようです。 以下、H.M.Fox.Mulder氏からレポートをいただきました。

--------
サポート掲示板の方でWebCHATの画面更新時に表示されるステータス
バーのカウントダウンがNetscapeCommunicator4.06を使用した場合だけ
文字化けするというレポートがあったかと思いますが、こちらでも現象を
確認しました。

単なる文字コードの設定ミスかと思っていたんですが、どうもそうでは
ないようです。

NetscapeCommunicator4.06では、JavaScriptのセキュリティバグの修正と
Windows98 への対応、NetscapeCommunicator4.5PR1の一部機能搭載といった感じで、
これまでのバージョンとは異なった少し大がかりな変更があったことは間違いないかと思います。

*NetscapeCommunicator4.0リリース時はJavaScript1.2対応となっていた
 ものが、今回の4.06では JavaScript1.3 対応になっています。

NetscapeCommunicator4.5PR1以降(NetscapeCommunicator4.06含む)の
リリースでは、コードに Unicode が採用されたそうです。
ということは、 Unicode で status 部分を記述すればなおるんでしょうが・・・
--------

残念ながらUnicodeなるものを知らないので、対応ができません。 いずれにしても、これはブラウザ側の仕様が変わってしまった為のような感じがしますが、 詳しくはわかりません。旧バージョンで化けないのに、新バージョンで化けるというのは、 ブラウザの設計者サイドで考えて欲しいものです。


Powered by CGI RESCUE(R)