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

【Ruby】RubyでCGI

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001名無しさん@お腹いっぱい。2001/05/04(金) 12:57ID:c4hRtzGY
Rubyについて語るスレッドです。
関連リンクは>>2-3
0867nobodyさん2005/05/13(金) 02:46:10ID:???
case〜when〜end は多態で実装し直せとベックおじいちゃんが言うたはりました。
0868nobodyさん2005/05/13(金) 07:34:11ID:???
>>866
レンタルサーバの場合は?
0869nobodyさん2005/05/13(金) 10:07:26ID:???
ブラウザから見えないとこに置けばいいだろ
.htaccess 使ってもいいし、
直接呼ばれたかわかるようにしてエラーなりフォワードなり
送ってもいいし
0870nobodyさん2005/05/13(金) 10:53:35ID:???
>>868
レンタルサーバってなんか特別なんすか?
例えば~/public_html以下にしかファイルを置けないとか、
ホームディレクトリ以下がwebで公開されているとか。

そうではなくて、web公開用ディレクトリ(例えば~/public_htmlとか)と
その他のディレクトリ(例えば~/dataとか)を使えるのであれば、
CGIスクリプトは前者、そうでないスクリプトは後者に置く事で
うっかり見られてしまう自体を防げるのではないでしょうか。
0871nobodyさん2005/05/14(土) 20:48:59ID:???
>>870
>例えば~/public_html以下にしかファイルを置けないとか、

そういうところもあります。
08728482005/05/15(日) 18:09:04ID:???
>>849-851
質問を変えます。
考えているのはこういう工程です。
(1)ユーザーは、あるメールアドレスに件名、本文、添付画像をケータイから送信します。
(2)管理人は随時、そのメールサーバにアクセスして、送られてきているデータを収集します。
(3)そのデータをひとつひとつ掲示板にアップロードしていきます。
(もちろん利用規約で、ケータイメールによる書き込みはタイムリーに行われないことはユーザに知らせておきます。)
この作業は当然ローカルパソコンで手作業すれば可能なんだけれど、(2)(3)のあたりはCGIプログラムで自動処理できないものかと。
出先からでもケータイでそのCGIにアクセスすれば溜まってる書き込みメールが自動でアップロードされるようにしたいのです。
0873nobodyさん2005/05/15(日) 23:28:29ID:???
>>872
Kから直書きじゃダメなの?
tDiaryみたいな...
0874nobodyさん2005/05/16(月) 01:58:19ID:???
cookieがいやなら、一回しか使えない鍵をhiddenで渡せばよいのでは?
0875nobodyさん2005/05/16(月) 04:44:11ID:???
>>874
いや、だからそれの具体的な実装方針を >>854 がずっとぐだぐだと述べてんでしょ。
0876nobodyさん2005/05/16(月) 15:02:14ID:???
>>872
とりあえず(2)でPOP3クライアントを作りたいなら
以下のページが参考になりそう。使用例として
メールの受信のサンプルがある。

Rubyリファレンスマニュアル - net/pop.rb
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=net%2Fpop.rb;em=POP3

net/imap.rbの方はサンプル無しなので難しいかも。

Rubyリファレンスマニュアル - net/imap.rb
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=net%2Fimap.rb;em=imap

(3)のアップロードはnet/httpあたりを使うのかな。よくしらない。
0877nobodyさん2005/05/16(月) 16:32:29ID:???
メールサーバと CGI のサーバが一緒なら割と簡単にできるかもね。
0878nobodyさん2005/05/17(火) 17:17:12ID:???
>>876
さんくす。
参考にします。
0879nobodyさん2005/05/17(火) 22:42:44ID:???
cgi.rbが微妙だということを見て、
自分でGETとPOSTのデータを受け取る部分(ファイルアップロード含む)とクッキー操作の部分そしてセッション管理の部分まで書いたのが、1-2年前のことです。
しかしそれからCGIには全然手を出していませんでいた。

最近になって、ふとCGIを公開するHPでも作ろうかなと思い、自分で作ったcgi.rb相当のものを使おうかなと思っていたのですが、
よくよく考えると、CGIしか考慮していませんでした。
Rubyist Magazine に Nora というものの説明があって、CGI/mod_ruby/FastCGIに対応と書いてありました。
このライブラリでも使ってみようかなと思い、DLしようとしたのですが、作者のHPにもRAAにもないようです。
もう配布はしていないのでしょうか?

他にシンプルでCGI/mod_ruby/FastCGIに対応したものはないでしょうか?
0880nobodyさん2005/05/17(火) 22:47:02ID:???
>>879
ん?まだちゃんとあるみたいよ?
ttp://www.moonwolf.com/ruby/archive/
08818792005/05/17(火) 22:59:58ID:???
すみません、よくみていなかったようですね;
DLできました。
ありがとうございます。
0882nobodyさん2005/05/19(木) 06:52:38ID:???
自作cgi.rbとはスゴい。

私は今ログファイルのマネジメントができるクラスを開発中ですが、rubyのスキルがまだまだしょぼく、いいものができません。

インターフェイスとしては、最初に
log = Log.new(ファイル名)
としとけば、以後
log.put(行,列,値)
でファイル(テーブル構造)の任意の場所に値を書き込むことができ、書き込み時にはファイルのロック、アンロックも自動でやってくれるという至極モノグサなクラスなんですが・・・(他にもフィールド定義等多数メソッドあり)

もしこれに類似したクラスライブラリがすでにあるのであればその場所をご教示いただければ幸いです。
0883nobodyさん2005/05/19(木) 10:00:28ID:???
任意の場所に書くものをlogって言うかなあ
0884nobodyさん2005/05/19(木) 12:01:53ID:???
logじゃなくてDBだな
0885nobodyさん2005/05/19(木) 12:10:49ID:???
>>882の仕様はログファイルとは言い難いが(ひょっとしてCOBOLer or MainFramer?)

本来の意味のログファイルの管理クラスなら RAA に devel-logger があるぞ。
ttp://raa.ruby-lang.org/project/devel-logger/


0886nobodyさん2005/05/19(木) 12:52:36ID:???
掲示板の過去ログみたいなものかな。
0887nobodyさん2005/05/19(木) 13:36:13ID:???
漏れなら迷わず SQLite3 だが・・・
08888822005/05/19(木) 16:09:49ID:???
用語が間違ってたみたいすねorz
CGIで扱うデータファイルは全部ログと思っていました。
要はこういうクラスを使って掲示板、日記、プロフィール、お気に入りリンク集、アクセスカウンタ、更新履歴といったコンテンツをテーブル化して貯めておくテキストファイル(なんていえばいいんだろう)を編集できたら便利だろうなとおもったのです。
出直してきます・・・。
0889nobodyさん2005/05/19(木) 20:08:13ID:???
>>888
不定長なデータ全てをひとつのテキストファイル(なんていえばいいんだろう)に
突っ込んで管理してしまおうということなのかな。
そういうのは別々のファイルにバラして持っておいた方が良いと思うけどなあ。

漏れなら迷わず SQLite3 だが・・・ (しつこい)
0890nobodyさん2005/05/19(木) 20:54:29ID:???
おー、実は俺もそんなの作ってる・w > ファイル操作ライブラリ
ランダムアクセスでファイル操作するやつで、
レコード毎のカラム以外に、ヘッダ部分にも型を宣言して領域を確保できるようになっていて、
他に掲示板とかに便利だろうと双方向リスト型なんてのも作ったよ。
0891nobodyさん2005/05/19(木) 22:11:14ID:???
WEBrick::CGI って知られていない?
cgi.rb の ::CGI よりはかなり良いと思う。
標準添付だし。

http://www.ruby-lang.org/ja/man/?cmd=view;name=webrick%2Fcgi.rb
0892nobodyさん2005/05/19(木) 22:41:00ID:???
スレ違いっぽい気もしますが、
静的コンテンツをマネジメントするのによさげなフレームワークなんてありますかね?
0893nobodyさん2005/05/19(木) 23:43:24ID:???
んーと、マネジメントって具体的に何するん?
08948882005/05/20(金) 19:11:14ID:???
>>889
あ、それはさすがにないです。テーブルはコンテンツごとに作成し、1ファイル1テーブルです。

・・・たしかにこのクラスを継承すれば簡易DBのようなものが作れるかもしれません。
素直にDB勉強しようかな・・・
08958882005/05/20(金) 19:15:10ID:???
>>890
詳細きぼん
0896nobodyさん2005/05/21(土) 00:22:25ID:???
DB使うともうそんなこと考えるのもいやになるくらい便利
0897nobodyさん2005/05/21(土) 21:07:07ID:???
>>891
このスレでは>>502-503で触れられているけど、
ちまたで使われているという印象は無いですね。
08988822005/05/22(日) 08:23:00ID:???
「ログ」は意味が違うようなので、クラス名は無難にTableにしました。
DBを使わなくても気軽にテーブル(csvファイルなど)の任意の行や列やセルが読み書きできるクラスです。
table = Table.new(ファイル名,区切り符)
で、以後そのファイルは
table.〜
で、ロック/アンロック、レコードやフィールドの挿入/削除、といったあらゆる操作が可能となります。

・・・てか、誰でも思いつきそうなクラスなんだけど、ほんとに既存のものはないのかなー。
unixな人たちはosに標準でついてるDBMがあるから需要ないのかな?
まあ、これくらい自分で作ったとこでRubyの練習にはちょうどいいんだけど・・・。
0899nobodyさん2005/05/22(日) 08:52:37ID:???
>>898
require 'csv'
09008822005/05/22(日) 09:27:32ID:???
>>899
ありがとうございます!1.8系から標準添付なんですね。
しかし使わせてもらってるサーバーのRubyはまだ1.6系・・・orz
09018902005/05/22(日) 10:39:03ID:???
>>895
詳細キボンといわれても、どういうこと書けばいいんだか;
どこにも公開はしていないですよ。
ただ、どこかにそれを使った掲示板はあます。

ちょっといろいろ難点があって再構築しようと思っているところです。
カラム名を指定するのを、文字列ではなく、シンボルにしようかなーとか。
0902nobodyさん2005/05/22(日) 19:32:00ID:???
>>900
(1) http://raa.ruby-lang.org/project/csv/ からアーカイブをダウンロードする。
(2) アーカイブに含まれるcsv.rbを取り出して、自分のスクリプトと同じディレクトリに置く。
(3) require 'csv'する。

ライブラリ自体は1.6.xでも使えるはずなので、
この手順で使えるようになると思う。
0903nobodyさん2005/05/23(月) 08:02:36ID:???
>>901
どんなメソッドがあって、それぞれどんな動きをするのか、とか、使用例とか。
ぜひ参考にしたいので。よろしければおながいします。

>>902
ありがとうございます。
まだ挙動の研究中ですがこのクラスがあればかなりラクになりそうです。
09049032005/05/23(月) 22:25:46ID:???
>>899
>>902
うむむ・・・ひょっとしてcsv.rbってcsvをパースするだけ?
.add_rowで追加したいデータを渡してみたけどもとのファイルには変化なし・・・orz
最後にgenerateするまでファイルの更新はしないようです。
欲しかったのとはちょっと違いました。ごめんなさい・・・。
僕がほしいのは、掲示板の書き込み内容を
ary = ["2005/05/23","903",">>902<br>うむむ・・・ひょっとして(略)","sage"]
と配列にしておけば、
Table.insert_row(5,ary)
でログファイルの6行目にaryの各要素がカンマでつながった文字列が直接挿入されるといった感じです。
メソッドの実行と同時にファイルのロック、オープン、書き換え、クローズ、ロック解除を行うものです。
やっぱ自分で作るか・・・
0905nobodyさん2005/05/24(火) 10:59:07ID:???
そこでSQLiteですよ
0906nobodyさん2005/05/24(火) 12:13:19ID:???
>>904
csv.rbで出力は出来るけど、入力と出力の処理が分離しているので、
それでよかったら出来る。
RAAのgonzuiでcsv.rbに含まれるサンプルを参照できる。
http://raa.ruby-lang.org/gonzui/markup/csv/lib/csv.rb#l180
http://raa.ruby-lang.org/gonzui/markup/csv/lib/csv.rb#l513
CSV.open、CSV::Writerあたりを読むと良いだろう。

>メソッドの実行と同時にファイルのロック、オープン、書き換え、クローズ、ロック解除を行うものです。
それそのものはcsv.rbには含まれていないので、
その外回り(open close flockなど)のみを自分で作れば良いと思う。
0907nobodyさん2005/05/24(火) 12:14:37ID:???
>>906
ごめん、前半は勘違い。無視して下さい。
0908nobodyさん2005/05/25(水) 04:50:01ID:???
なんでSQLiteはことごとく無視?
バカ?
0909nobodyさん2005/05/25(水) 07:50:13ID:???
↑それって誰かが書いたRubyのクラスか何かですか?
スクリプトと一緒に置いとけば使えるようものならいいんですが、サーバーにインストールしないといけないのはちょっと・・・自鯖じゃないもんで。
0910nobodyさん2005/05/25(水) 09:25:20ID:???
>>908
諦めろ。バカには何度言っても伝わらない。
0911nobodyさん2005/05/25(水) 11:15:13ID:???
バカがSQLiteを使えるわけがないという所まで思い至らないのは間が抜けている
0912nobodyさん2005/05/25(水) 11:31:29ID:???
それは確かに・・・
0913nobodyさん2005/05/25(水) 12:43:16ID:???
以後、 SQLite ネタはスルーということでよろしく。
0914nobodyさん2005/05/25(水) 12:44:48ID:???
じゃあ、dbmで
0915nobodyさん2005/05/25(水) 15:23:37ID:???
>>914
dbm使ってたらSEGVしたんですけど。
0916nobodyさん2005/05/25(水) 15:58:52ID:???
もしかしてSolaris?
0917nobodyさん2005/05/25(水) 17:52:24ID:???
みんなDBが好きなんだね。
0918nobodyさん2005/05/25(水) 18:03:59ID:???
SQLite 標準添付まだー?
0919nobodyさん2005/05/25(水) 21:34:35ID:???
バカでごめんなさい・・・
0920nobodyさん2005/05/26(木) 14:03:42ID:???
謝る前にgoogleの使い方ぐらい覚えろ
0921nobodyさん2005/05/26(木) 14:17:40ID:???
>>916
いや、FreeBSD
0922nobodyさん2005/05/26(木) 21:16:24ID:???
SQLiteやたら出てくると思ったらやっぱりネタだったのか。
0923nobodyさん2005/05/27(金) 00:48:25ID:???
俺はここにきて数スレみてSQLiteを薦めたが、こんなに出てるのは書いてから知ったよ
0924nobodyさん2005/05/27(金) 19:34:43ID:???
なんで SQLite なんだ?
このスレッドなら断然 AAA、XREA、lolipop で使用可能な MySQL のほうがお勧めなんじゃないのか?
0925nobodyさん2005/05/28(土) 19:32:36ID:???
DBの話はとりあえずヤメレ
0926nobodyさん2005/05/29(日) 09:19:35ID:???
なんでスルーになってるのかをとりあえず説明すれ
0927nobodyさん2005/05/29(日) 23:14:44ID:???
既存の優れたアプリを受け入れ、操作に習熟するよりも先に、同じようなものを自分で作りたがる非生産的な人。
Ruby使いにはそういった類の人間が比較的多い希ガス。
きっとDBよりも独自スキーマでごちゃごちゃと訳わからんことすることの方が好きなんだと思う。
0928nobodyさん2005/05/29(日) 23:35:24ID:???
927は過去になんかあったのか?
いったい何の説明してるんだ?
MySQL じゃなくSQLite の話じゃないし、SQLite スルーの話でもないしな。

cgi.rbが1.6と1.8で挙動が違うなら、cgi.rbの代替が必要になってくるのは当然だし、
どこのレンタルサーバでも動くようにするには、標準ライブラリか、Pure Rubyなライブラリ使うのは当然だしな。
0929nobodyさん2005/05/30(月) 00:10:08ID:???
おまいらなんのはなしをしているんですか?
0930nobodyさん2005/05/30(月) 00:34:06ID:???
>>929
スレタイ読め
0931nobodyさん2005/05/30(月) 09:28:29ID:???
過去の経緯は知らんが。

SQLiteはいいものだが板違い。
db板にスレがあるから行ってこい。
DBI-sqliteについての話だったらム板へ。
0932nobodyさん2005/05/30(月) 20:26:39ID:???
1.6と1.8で挙動が違う部分って、何?
cgi.params["name"][0]
ってやればどっちでも大丈夫なんでしょ?
0933nobodyさん2005/05/30(月) 20:36:02ID:???
>932
つttp://www.nslabs.jp/rubycgi-18compat.rhtml
09349322005/05/31(火) 22:15:56ID:???
>>933
ありがd
読んだけどよくわからんかった;
挙動が違うのはcgi["name"]って書いたときの話ですよね。
しかし、「1.6と1.8両方で動くスクリプトが書けない」っていうくだりは本当ですか?
レシピブックにはcgi.params["name"][0]って書けばオッケーって書いてあったんだけど・・・
0935nobodyさん2005/06/02(木) 14:07:03ID:???
>>934
「1.6と1.8両方で動くスクリプトが書けない」というのは
リンク先にもあるようにCGI#[]を使うときの話。

>cgi.params["name"][0]って書けばオッケー
言い方を変えれば「CGI#paramsを使わなければダメ」。
あと既存のスクリプトがCGI#[]を使ってたりすると、
いちいち修正したりするのも億劫だよね。
そこのところを気に入らない人はいるんじゃないかと。
0936nobodyさん2005/06/03(金) 13:33:14ID:???
なるほど。
しかしcgi[]の[]ってメソッドなのな。
Rubyは奥が深い・・・

どんなメソッド定義してるのか今度みてみよっと。
0937nobodyさん2005/06/05(日) 11:59:22ID:???
>>935
いちいち修正して億劫というのが、あちこち修正という意味なら、
1.6の方に CGI#[] を定義すればいいだけじゃねー?
0938nobodyさん2005/06/09(木) 06:33:46ID:???
RubyCGI.orgの
http://www.rubycgi.org/cgi_explanation/3-5.htm から
一部コメントを付け加えて抜粋。

#書き込みがあったら
if senddata
 begin

#ファイルロック設定
 lockd = fillock.lock(LOCKFILENAME)

  unless lockd
   print <<EOF;
   <html><body>
   他の人が書き込み中です。しばらく待ってからもう一度書いて下さい。
   </body></html>
   EOF
  end #unless end

#ログファイルの書き込み関数を呼び出し
 write_log_file(senddata)

 ensure
#ファイルロック解除
  fillock.unlock(LOCKFILENAME) if lockd
 end #begin end
end

これ、正しくファイルロック出来てるんでしょうか?
このままだとロックの状態に関わらず書き込み関数を呼び出して
ファイルをいじってしまうように思うんですが・・・。
0939nobodyさん2005/06/10(金) 08:02:01ID:???
FILELOCKで示されるディレクトリを作ってためしてみたら?ちゃんと動くはずだけど。

このプログラムは無理にクラスとかメソッドを定義しててわかりにくいね。

手続き型で書いてもRubyはきれいに書けるんだけどな。
09409382005/06/10(金) 08:56:02ID:???
>>939
そっか、自分でディレクトリ作ればいいんですよね。
何でそんな単純なこと思いつかなかったんだか・・・。
ありがとうございます。

で、実際にやってみたところ
やっぱり正しくファイルロックできてないみたいで、
ディレクトリの有無に関わらずガンガン書き込んでます・・・。

unless lockd
 今は書き込めませんメッセージ
else
 write_log_file(senddata)
end

多分こんな風に、書き込み関数をunless elseの中に入れちゃえば
正しく動くんじゃないかと思います。(試してませんが)

クラスや関数を作りまくってるのは
「作り方を学ばせるためにあえて」
ってことだと僕は思っているんですが・・・、
人によっては「これが良い書き方なんだ」って勘違いしちゃいそうですよねえ。
0941nobodyさん2005/06/10(金) 11:42:39ID:???
>>940
そのコードはダメポ。

せっかく全体をbeginで囲っているんだから、例外的事象(ロック失敗)に対応する
コードはrescueブロックに配置すべき。

そのためには、FileLockDir::lock の中で、ロックに失敗したら例外を投げる
ような仕様にするのがいいと思う。

FileLockDir自体、initialize(ファイル名) にして、lock/unlock に引数が
いらないようにしないと、わざわざインスタンスを生成する意味がないし。
09429402005/06/10(金) 12:14:40ID:???
>>941
アドバイスありがとうございます。

>コードだめぽ
これは
「お前の書いたコードじゃ正しく動かねーわ」って意味ですか?

それとも
「そもそもサイトのサンプルコードからしてゴチャゴチャしてるから
 そっから考え直して、まとめた方がいんじゃね」
って意味でしょうか?
09439412005/06/10(金) 12:29:50ID:???
>>942
すまん、サンプル自体がまずいと言いたかっただけだよん。
09449422005/06/10(金) 12:38:31ID:???
>>943
確かにサンプルコードを基本にして手を加えていくと、
どうもきれいにまとまってくれません・・・。
構造から考え直してみます。
0945nobodyさん2005/06/10(金) 22:30:12ID:???
しかし、ネットで拾えるまとまったRuby&CGIの入門用資料ってこのサンプルくらいしかないよなー。

漏れもそのページから入ったクチなんだけど、最初はクラスとかメソッドとかわからんからとりあえず部品を全部ばらしてみたもんだ。

表面上のRubyらしさをムリヤリ加味するとこんなコードになるという生きた見本。いろんな意味で価値あるサンプル。

漏れはこのサンプルに感謝しているよ。
0946nobodyさん2005/06/11(土) 16:43:30ID:???
CGI抜きにして「Ruby入門サイト」を探しても、かなり少ないしね。
しかも大体古くて、今はもう更新されて無いようなところばかり。
さすがにこの現状は切なすぎる・・・。
誰か新しく入門サイト作ってくれないかな。
(・・・と、他人に期待するばかり)
0947nobodyさん2005/06/11(土) 19:24:16ID:???
>>945
ムリヤリとかいろいろな意味でとか、変な皮肉はヤメレ
0948nobodyさん2005/06/11(土) 23:19:24ID:???
>>946
本スレで出てた気がするが、
Rubyの入門としてはこれを押す。

tp://www1.tf.chiba-u.jp/~shin/tutorial/

これ自体は CGI スクリプトみたいだが。
0949nobodyさん2005/06/11(土) 23:55:00ID:???
>>946
入門サイトって似たり寄ったりな内容じゃない?
定番があれば十分で、数が多くても意味がないと思うけどなあ。
0950nobodyさん2005/06/12(日) 16:27:33ID:???
>>949
日本語のRubyの入門サイトの中で定番といえるほど有名なものってある?
0951nobodyさん2005/06/12(日) 17:16:57ID:???
>>949
サイトが増えると、サンプルが増える。
あと、ユーザーのレベル・好みでサイトを選べる。
(プログラム初心者ってわけでなければ
 『一時間で覚えるRuby』でもいいわけで)

俺が思い付くのはこれくらいかなー。
もちろん「質より量だ!」なんて言うつもりはないけど
数は多いに越したことないと思うよ。
0952nobodyさん2005/06/12(日) 19:35:57ID:???
>>951
http://jp.rubyist.net/?RubyDocument
0953nobodyさん2005/06/12(日) 21:58:26ID:???
>>952
分類されていないから、
どれが入門用ドキュメントで、
どれが特定の話題に特化したドキュメントなのか
分かりにくい。

個人的には下のが良さげ

http://ruby.mirror.easynet.be/ja/uguide/uguide00.html
http://ns.wisdom.co.jp/~ono/programming/ruby/intro/intro_01.htm
http://homepage1.nifty.com/~tetsu/ruby/intro/
http://www1.tf.chiba-u.jp/~shin/tutorial/

http://linux-life.net/program/ruby/
http://www.namaraii.com/rubytips/
0954nobodyさん2005/06/17(金) 01:12:56ID:???
メールフォームを作りたいんですが、いい資料ありますか?
0955nobodyさん2005/06/17(金) 18:36:09ID:???
つ rfc2822
0956nobodyさん2005/06/17(金) 20:08:02ID:???
>>955
そういうことではなかろう。
0957nobodyさん2005/06/19(日) 13:13:02ID:Le0SqOYO
WEBrick でCGI (servlet?) を書こうと思ってるんですけど、
どうもCGIの処理が完了してから纏めて全部出力しているようです。
これって少しずつ逐次出力することはできないでしょうか?
帯域を制御してストリーミングがしたいのですが。
0958nobodyさん2005/06/20(月) 02:28:39ID:???
まさかTCPのバッファリングを制御したいとか、そういう話しじゃないよね?
0959nobodyさん2005/06/20(月) 14:53:07ID:???
そこまで低レベルなレイヤーでないと制御できないことなのですか?
帯域制限はCGI 側で行うので、httpdは即座にデータを送出してくれれば
それで十分なのですが。

それと、出力全体がバッファされると言うことは、送るデータのサイズと
同じだけメモリを消費するわけですよね。
これでは実質数十MBくらいが限度です。
どうにかならないものでしょうか。
0960nobodyさん2005/06/20(月) 15:01:12ID:???
WEBrick は素人なんだけど、 res.body に IO のサブクラスを指定すると、
IO から少しずつ body を返すようになる気がする。
webrick/httpresponse.rb の WEBrick::HTTPResponse の
send_body とか send_body_io とか見てみると良いかも。
0961nobodyさん2005/06/21(火) 10:04:08ID:???
IOからサブクラスでreadとcloseを再定義することで解決できました。
どうもありがとうございました。

ちなみに最初は単に IO.pipe の入力側を渡してでマルチスレッドに
するつもりだったのですが、先に入力待ちするとデッドロックします。

pi, po = IO.pipe
t = Thread.start {
 print while (Thread.stop or pi.gets)
}
po.puts "first"
t.wakeup # OK
t.wakeup # dead lock
po.puts "second"

これはこういうものなのでしょうか?
IO.popen('-', 'r') も動かないし、windows版の制限なのかな。
WindowsXP SP2, Ruby 1.8.2 (ActiveScriptRuby 1.8.2.0)
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
ロリポップにログくれって言えないの?
少なくとも同じバージョンなら違うマシンでも文法は同じはずなので
同じバージョンでテストしてますよというのを伝えた上で、ロリポップにその辺聞いて見れ。
レス数が950を超えています。1000を超えると書き込みができなくなります。