トップページ⇒php
982コメント335KB

【Ruby】RubyでCGI

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名無しさん@お腹いっぱい。2001/05/04(金) 12:57ID:c4hRtzGY
Rubyについて語るスレッドです。
関連リンクは>>2-3
0962nobodyさん2005/06/21(火) 10:57:54ID:???
上のコード、IRB上なら止まるんですが、直接実行だと動きますね。
これでどちらもデッドロックするようです。

t.wakeup # OK
sleep 1
t.wakeup # dead lock
0963nobodyさん2005/07/03(日) 10:37:19ID:???
ロリポップがサーバーのバージョンアップ及びモジュール追加ってやつで、
ruby (1.8.2)に対応したみたいで・・いいことなのですが、
なぜかそれ以降動かなくなったCGIが出ました;

ローカルでのテスト環境は 1.8.1 で、それで動いているのですが動きません。
一番上のパスが違うのかなと思ったら、他のRubyで作ったものは動いていました。

何らかの実行時のエラーで落ちてるのかと思い、全体を
begin
# 全体の処理
rescue Exception
File.open("erorrlog/#{Time.new.to_i.to_s}.err", 'w'){|f| f << "#{$!}(#{$!.class})\n#{$@}"}
end

ってな感じでログを残そうとしても、ログが残りませんでした;;
かなりお手上げです。詳しい方、教えていただけたら幸いです。
0964nobodyさん2005/07/03(日) 14:32:34ID:???
>>963
ログは見れないの? rescue できないとすると文法エラーかな?
09659632005/07/04(月) 01:28:46ID:???
うーん、なんかヒアドキュメントで文法エラーが出てるような・・
ローカルでも 1.8.2 で試したけど動きましたが・・OSによって違うのかな・;
0966nobodyさん2005/07/04(月) 09:14:56ID:???
>>965
ロリポップにログくれって言えないの?
少なくとも同じバージョンなら違うマシンでも文法は同じはずなので
同じバージョンでテストしてますよというのを伝えた上で、ロリポップにその辺聞いて見れ。
09679632005/07/04(月) 23:58:18ID:???
あ、やっぱヒアドキュメントじゃないっぽい;
#!/usr/local/bin/ruby -Ks -Ilib
↑の1行目のオプション -Ilib がまずいっぽい・・ような・?
やはりこれもローカル(windows)では動いてます;

ちなみにロリポップにはまだ聞いてません。すまん。
0968nobodyさん2005/07/05(火) 00:39:22ID:???
>967
思い切って別PCにLinux入れてみるとか、あるいはcoLinux入れてみるとかして
UN*Xな環境作って試してみるのはどうか。
0969nobodyさん2005/07/05(火) 12:56:07ID:???
>>967
-Ilib じゃなくてフルパスで指定してみたら?
0970nobodyさん2005/07/05(火) 22:29:14ID:???
CGIを別名にリネームして、元のCGIファイル名で次のようなのを作る。
#!/bin/sh
exec リネーム後のCGI > ログ.txt 2>&1

CGI実行後に ログ.txt を見る。
09719632005/07/06(水) 00:09:55ID:???
-Ilib のオプションを使わずにしたら、いままで動かなかったものがすべて動きました。
>>970 さんのものも試してみましたが、500エラーというのが出て、ログは残りませんでした。

どうして、-Ilib が使えないのかはわからないままです;
0972nobodyさん2005/07/06(水) 14:05:13ID:???
lib ディレクトリに 1.8.2 で動かない古いライブラリが入っていたと想像。
0973nobodyさん2005/07/18(月) 02:45:10ID:???
マルチパートなフォームのデータを送信した場合、スクリプト内の
CGI.new
のところで
in `read_multipart': no content body (EOFError)
というエラーが出ますが、これは何ですか。
環境は WindowsXP + Apache + Ruby 1.8.2 です。
09749732005/07/18(月) 17:27:49ID:???
【つづき】

原因究明のために cgi.rb の 976 行目付近

status = stdinput.read(boundary_size)
if nil == status
raise EOFError, "no content body"
elsif boundary + EOL != status
raise EOFError, "bad content body"
end

での、status 変数について調べました。
if 文で評価される前の status は String で、

"malformed header from script. Bad header=-----------------------------7: index.cgi"

という値でした。
しかし,条件文にさしかかったところで status 変数の中身が nil になってしまうようです。
print 文で status 変数の中身を表示させてみましたが、一回目の print 文で上記の文が出るものの、二回目以降は何も表示されませんでした。
どなたか原因と解決策をご存知の方、ご教授ください。
0975nobodyさん2005/07/18(月) 18:01:01ID:???
最小再現コードがあれば誰か調べるんじゃない
09769732005/07/18(月) 18:19:41ID:???
>>975
最小再現になるようにコードを追っかけていたところ、
エラーの発生箇所が思っていたのと違う箇所だということがわかりました。
エラーが発生したときのエラー表示のために
CGI クラスを使っていたのですが、
もう一度 CGI.new したときに、上記のエラーが発生していました。
因みに、このとき最初に rescue していたエラーは

cannot convert StringIO into String

で、まったく別物でした…

出直してきます…
0977nobodyさん2005/08/09(火) 20:04:29ID:3fd1ZKC+
質問させていただきます。

open-uriによってカウンターがついているウェブページの中に、カウンターを更新させないページがあることに気づきました。

どなたか理由と、どうすれば反応するようになるか教えていただけますでしょうか?

よろしくお願い致します。
0978nobodyさん2005/08/09(火) 21:35:54ID:???
前提を並べるから結論を推測してちょ。

* HTTP はコンテンツ単位で送受信を行うプロトコル
* 一URL一コンテンツ
* ウェブブラウザは HTML ページに含まれるCSS、Javasript、画像、Flash などのコンテンツを
自動的に受信して処理/表示/実行する
* open-uri は一度の open で一つのコンテンツを受信する
* CGI 方式のカウンタは、HTML ページとは別の CGI プログラムの
URL にアクセスがあるとカウントアップし画像を出力する
* SSI 方式のカウンタは、HTML ページへのアクセスと同時に、
プログラムを実行しカウントアップする
0979nobodyさん2005/08/10(水) 03:58:40ID:???
カウンタの実装方法なんていくらでも考えられるし、
具体的にどのカウンタか URL を示すか、
ソースコードや動作の仕様が公開されてるならそれを見た方が早いんじゃないかね。
0980nobodyさん2005/08/10(水) 04:10:13ID:???
>>977
それだけじゃよくわかんないよ。「open-uriによってカウンターがついているウェブページ」ってなに?おれの理解力じゃあんたの質問がさっぱりわからん。

>>978
親切なんだか意地悪なんだかわからんな。
0981nobodyさん2005/08/10(水) 09:02:24ID:???
>>977
カウンタがjavascriptやcgiで実装されている場合にそうなることがある。

カウンタは、そのページがアクセスされた回数をカウントしているんじゃ
ない(ものがある)。ページに埋め込まれた画像(cgi)等が表示された回数を
カウントしている(ものがある)。
0982nobodyさん2005/08/10(水) 15:13:46ID:7+cbQsD8
>>978
HTMLファイルとは別のファイルをアクセスしたときにだけカウンターが回るため、open-uriで取得しただけでは回らないんですね。ありがとうございました。

>>979
はい、いくつかのカウンターを試してみたのですが、反応するものしないものがありました。具体的にどこが違うのかまだ勉強中です。

>>980
失礼しました。open-uriライブラリでウェブページを取得したとき、カウンターによっては反応しないものがあるのは何故か、という質問でした。

>>981
画像の場合もあるんですか!なるほど、ありがとうございました。

みなさんご回答ありがとうございました。
レス数が950を超えています。1000を超えると書き込みができなくなります。