PDA

View Full Version : 掲示板が動かない


ocean
2002/06/08, 10:49 AM
掲示板スクリプトを Ruby で作成したのですが、
うまく動いてくれません。

http://ocean.s7.xrea.com/bbs/index.cgi

bbs ディレクトリのパーミッションは 0705(推奨値)、
index.cgi は 0700、ログファイルは 0600 としています。
CGI はテスト済みでローカルでは正常に動いています。
(ローカルの Ruby のバージョンは 1.6.4、XREA では 1.6.7)
.htaccess も置いていません。
アップロードモードはアスキー、バイナリモードを両方試しましたが、
動きませんでした。
http://www.xrea.com/err500.htm
↑こちらにとばされてしまいます。

広告を入れないよう拡張子を .xcg にして同じ条件で試行
してみましたが、結果は同じでした。

スクリプト内では cgi.rb と kconv.rb と 自作ライブラリひとつ
を require しています。(自作ライブラリがいけないんでしょうか?(^^;)

どなたかアイデアや解決策をお持ちの方、どうぞ何か御教唆
お願いいたします。

raccy
2002/06/08, 09:04 PM
とりあえず、ソース等を見ないことには正確には言えないのが現状ですが、
とりあえず考えられる原因をあげます。

自作ライブラリはどこに置いていますか?
CGIと一緒にアップしてあるでしょうか?
その時、パスがおかしいとかはありませんか?

Shift_JISやEUC-JPなどで書いている時は、
#!/usr/local/bin/ruby -Ks
#!/usr/local/bin/ruby -Ke
等と、最初で指定した方がいいです。

たぶん、どこかでエラーが起きていると思われます。
エラー場所を特定する方法としては…。

begin

(ここにスクリプトの内容を書く)

rescue StandardError => e
print <<"EOF"
Content-type: text/html; charset="Shift_JIS"

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head><title>StandardError</title></head>
<body>
<p>
#{e}<br/>
#{e.backtrace.join("<br/>")}
</p>
</body></html>
EOF
rescue ScriptError => e
print <<"EOF"
Content-type: text/html; charset="Shift_JIS"

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head><title>ScriptError</title></head>
<body>
<p>
#{e}<br/>
#{e.backtrace.join("<br/>")}
</p>
</body></html>
EOF
end

上の自分のソースからのコピペですので、適当に変えてください。
(なぜか、XHTML1.1ですし…)

うーむ、久々のRubyの質問だから、張り切ってしまった…。

ocean
2002/06/09, 12:10 AM
raccy さん、レスどうもありがとうございます。

Originally posted by raccy
たぶん、どこかでエラーが起きていると思われます。
エラー場所を特定する方法としては…。

begin

(ここにスクリプトの内容を書く)

rescue StandardError => e
print <<"EOF"
Content-type: text/html; charset="Shift_JIS"

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head><title>StandardError</title></head>
<body>
<p>
#{e}<br/>
#{e.backtrace.join("<br/>")}
</p>
</body></html>
EOF
rescue ScriptError => e
print <<"EOF"
Content-type: text/html; charset="Shift_JIS"

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head><title>ScriptError</title></head>
<body>
<p>
#{e}<br/>
#{e.backtrace.join("<br/>")}
</p>
</body></html>
EOF
end

上の自分のソースからのコピペですので、適当に変えてください。
(なぜか、XHTML1.1ですし…)


rescue 節でインタープリット時のエラーを拾えるとは知りませんでした!
目からウロコです! これでこれからデバグがどんなに楽になることか…。
感謝です。

さっそく raccy さんが提示されたスクリプトを適用させていただいたところ、
単純なミスでこけていました(^^;;;
クッキーを取得して初期化されるはずのオブジェクトが初期化されず、
nil になっていたことが原因でした。
(ローカルでテストした時は既にクッキーが記録されていたので発生しなかったようです。)
どうもお騒がせいたしました。

raccy さんならおわかりかも知れないと思いますが、提示していただいた
スクリプトで、StandardError と ScriptError は Exception の
サブクラスなので

begin
rescue Exception => e
print <<"EOF"
Content-type: text/html; charset="Shift_JIS"

#{e.backtrace.join("<br />")}
EOF
end

等とすると両方の例外を一度に捕捉できると思います。

うーむ、久々のRubyの質問だから、張り切ってしまった…。
Ruby 楽しいですよね〜。Ruby で練習したおかげで C++ でも
OO チックなコーディングが楽にできるようになりました☆

raccy さん、どうもありがとうございました!

raccy
2002/06/09, 04:00 AM
Originally posted by ocean
raccy さんならおわかりかも知れないと思いますが、提示していただいた
スクリプトで、StandardError と ScriptError は Exception の
サブクラスなので

(略)

等とすると両方の例外を一度に捕捉できると思います。

いやー、StandardErrorとScriptErrorを別々に処理したかった
というよくわからない理由を考えながらつくっていたのが、
そのままになっているだけなので、気にしないで下さい。
あと、ローカルテストの時に、何でもかんでも捕らえられてしまうのも
いかがなものかと思ったりもしたもので…。
それに、上のアイデアは、オラのオリジナルではなくて、Tikiから盗んで来たものです。
他人のソースは勉強になりますよ〜〜。

Rubyってやっぱいいですな〜。

ocean
2002/06/09, 05:59 AM
Originally posted by raccy

いやー、StandardErrorとScriptErrorを別々に処理したかった
というよくわからない理由を考えながらつくっていたのが、
そのままになっているだけなので、気にしないで下さい。
あと、ローカルテストの時に、何でもかんでも捕らえられてしまうのも
いかがなものかと思ったりもしたもので…。

たしかに例えば exit も例外だそうですので、

begin
    exit
rescue Exception => e
    p e.backtrace
end

こんなコードを書くと exit が捕捉できちゃいますね(^^;
Ruby のオシャレさがでてます。

私の場合、文法エラーを検出するときと、ランタイムエラーを
検出するときで、コンソールと httpd をいちいち切り換えておりましたので、
全てのエラーを httpd を通して把握できるのはとても快適です(^^)

Originally posted by raccy

それに、上のアイデアは、オラのオリジナルではなくて、Tikiから盗んで来たものです。
他人のソースは勉強になりますよ〜〜。

Rubyってやっぱいいですな〜。

Tiki というのは、Wiki という、Webコンテンツの編集、追加を
Webブラウザ上から行なえるツールの Ruby 版だそうですね。
http://todo.org/
さっそくダウンロードしてみました。
raccy さん、貴重な情報をどうもありがとうございました。