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

【Ruby】RubyでCGI

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2001/05/04(金) 12:57ID:c4hRtzGY
Rubyについて語るスレッドです。
関連リンクは>>2-3
0677nobodyさん05/01/12 13:02:40ID:???
>>674
それは「確立したセッションが奪われたら」の話では?
0678nobodyさん05/01/12 15:16:06ID:???
> セッションって確立しないとどうなるの?
あるHTTPリクエストと、別のHTTPリクエストが、同一のユーザによる一連の操作であるかどうかがわからない。
ただそれだけ。
0679nobodyさん05/01/12 18:15:05ID:+NFabzw5
>>674
>>677
>>678
ありがとうです。
ショッピングカートとかならまだしもですが、ただの掲示板には要らなさそうですね・・・。
0680nobodyさん05/01/12 22:07:09ID:???
管理画面とかいらないならね
0681nobodyさん05/01/12 23:33:50ID:???
「この内容でupしますよ、いいですね?」確認画面すら不要ならば。
0682nobodyさん05/01/12 23:36:31ID:???
>>681
それはstatelessに実装することもできる
0683nobodyさん05/01/13 08:14:30ID:a5QOCrWy
隠しコントロールにそのページ固有の値をもたせるだけでも「セッションもどき」が実現できないかなあ。
一連の操作で使う共通の変数とかもそれ用のログファイル作ってそれに保管しとけばそれらしい挙動しそう。
0684nobodyさん05/01/13 08:17:05ID:???
セッションが不要な場合はセッションもどきで実現する必要はない。
セッションが必要ならセッションを実現すればよい。
結局、セッションもどきなど必要ない。
0685nobodyさん05/01/13 08:50:59ID:a5QOCrWy
いや、クライアント様のパソコンを汚さずにセッションみたいなことが出来ないかなーと思って。
0686nobodyさん05/01/13 09:15:31ID:???
セッション=cookie、ではない。
セッションの確立にはリクエストを横断した固有情報があればよく、それはURLに埋め込んでも、
フォームの隠しフィールドに入れても構わない。
ただその場合はHTMLの動的生成能力が必要になる。
0687nobodyさん05/01/13 09:34:29ID:???
>>686
「セッションもどき」自体が存在しない、ということ?
0688nobodyさん05/01/13 22:51:12ID:???
>>687
それはセッションであるということ。
0689nobodyさん05/01/14 17:22:14ID:2UhA1iN0
あたかも配列をいじくるかのようにログファイルの任意の行をサクサク操作できるモジュールってない?
0690nobodyさん05/01/14 17:28:09ID:???
>>689
全てメモリにかかえちゃっていいなら File::readlines しちゃえば?
0691nobodyさん05/01/14 17:48:34ID:2UhA1iN0
いや、それだとメモリ食うので、任意の行だけメモリに読み込んで、その行だけ書き換えたいのです。
0692nobodyさん05/01/14 18:22:52ID:???
20年位前のプラグラミングですかw
0693nobodyさん05/01/14 18:42:15ID:2UhA1iN0
そだね。
時代は変わったんだし、メモリはケチらず使うことにするよ。
たしかに20年前のマシンのメモリは2キロバイトとかザラだったなあ。
0694nobodyさん05/01/14 19:05:07ID:???
いや、まぁ 富豪的アプローチするのか節約するのか ケースバイケースなんだけどね

「任意の行だけ」 「その行だけ」ってあたりが
ストリームで順次読み込んで該当行のみ処理して操作みたいなフィルタ的な事が
したいようにみえて CGIで んな事いってもなぁって思っただけw
0695nobodyさん05/01/14 19:19:05ID:???
http://raa.ruby-lang.org/list.rhtml?name=mmap
これでファイルをメモリにmapするとか。
0696nobodyさん05/01/17 17:17:54ID:LAuXubNJ
Rubyレシピブック読んでたら、終わりの方に「オブジェクトを文字列化しファイルに保存する」てのがあって、配列がそのまんまファイル化できるみたいなんだけど、これってCGIにも応用できないかな。
掲示板とかでログの各行を配列に読み込むより効率的と思ったんだが。
0697nobodyさん05/01/17 17:20:46ID:???
保存はできるが掲示板では使えない

taintできないから
0698nobodyさん05/01/17 20:20:14ID:???
効率という点でもあまりよくないかもね
追記するにもファイルの中身全部読んで
要素を追加した上で全部書きださないといけないし
0699nobodyさん05/01/18 08:04:09ID:azVqGT4+
そうですか・・・
0700nobodyさん05/01/18 13:42:37ID:???
696 のって Marshal のこと?
ちと taint っていうのを知らなかったのですが、
AAA でなら Marshal は使えましたよ。
解析を行った結果をシリアライズして保存しておけば、
次読み込む時はスクリプトレベルでの解析を実行しない分高速化できますよ。
掲示板でいうならテンプレート部分とか。
0701nobodyさん05/01/18 13:52:57ID:???
>>697
taint できないというのはどういう問題?
たとえばテキストファイルに保存する場合は taint できて Marshal だとできない?
0702nobodyさん05/01/20 17:28:23ID:???
http://elitists.net/%7Ekain/sessions/index.html

railsでセッション管理をやってみたいと思っています。上の資料だと、
DRb Store かActiveReco Storeがよさげです。
どちらかの実際のコードを示した資料はあるでしょうか?
0703nobodyさん05/01/21 10:38:11ID:???
>>702
そのベンチマーク自体はElite Journalを使って行われたものみたいだから、
それのコードを読んでみるとか。
ttp://elitejournal.rubyforge.org/
あと、Rails使った事ないので適当だけど、
RailsのWikiにも参考になりそうページがあるよ。
ttp://wiki.rubyonrails.com/rails/show/HowtoSetupDistributedRuby
ttp://wiki.rubyonrails.com/rails/show/HowtoChangeSessionOptions
で、何か会得したらどこか(RWikiとか?)にまとめてもらえると嬉しいな。
0704nobodyさん05/01/21 17:06:59ID:???
>>703
Elite JournalというのはBlogシステムであり、Railsを使って作って
いるんですね。とても参考になりました。EJで調べます。
ありがとうございました。

==================
rails-0.9.4.1だと、EJのINSTALLに書かれている手順では動きませんね。
(No such file to load -- application.rb)
rails-0.8でないといけないかも。
0705nobodyさん05/01/27 14:23:39ID:D1xpGaFb
だれか迷路のソース持ってる人いませんか??
0706nobodyさん05/01/27 14:58:51ID:???
俺のソースは全部迷路みたいだがな。
0707nobodyさん05/01/27 15:23:08ID:???
ソイソースでよければ
http://www2.w-shokokai.or.jp/yuasa/kankou/sannsaku/sio/sio.html
0708nobodyさん05/01/27 16:36:45ID:???
Railsの日本語ML
http://dev.rakusui.jp/diary/?date=20050124#c03
0709nobodyさん05/01/28 00:17:00ID:???
Railsを使ってみました。CGI:Sessionを使っているので、
文字列しかセットできないの?
簡単なコードを書いたけど、うまく渡せたり渡せなかったりです。
1. ShoppingCart.rb
2. @session[:cart] = cart (in controller/application.rb)
3. うまく渡せたり渡せなかったり。。


0710nobodyさん05/01/28 00:23:23ID:???
「Railsの @session はデフォルトで PStore を使うので
ほぼ何でも入ります。」とのこと。
(CGIKitを調べはじめていた(^^; 失礼しました。
0711nobodyさん05/01/29 23:15:15ID:???
画像ファイルのアップロードってどうすんべ?
require "cgi"
cgi = CGI.new
file = cgi.params["file"][0]
で受け取ったファイルを"gazou.jpg"という名前でサーバーに置きたいんだが、
fh = open("gazou.jpg","w")
fh.print file
fh.close
ってやっても、できたgazou.jpgは空っぽ。
なぜだー!
初心者ですまそ。
0712nobodyさん05/01/30 01:00:53ID:???
>>711
そもそもアップロードフォームの属性はenctype="multipart/form-data"になってるか?
0713nobodyさん05/01/30 01:31:36ID:???
>>711
> file = cgi.params["file"][0]
multipart の場合は、この file は TempFile クラスか StringIO クラスのオブジェクトです。
071471305/01/30 01:48:09ID:???
あ、ごめん Tempfile クラスだ
071571105/01/31 00:34:13ID:???
>>712
ちゃんと本見てるので、そこは押さえてまつ。
その本には送られてきたテキストファイルの内容をそのまま表示する方法しか載ってなかったもんで。

>>713
fhにfileの内容を出力するのにprintメソッドじゃダメってこと?
0716nobodyさん05/01/31 01:27:28ID:???
>>715
Tempfile か StringIO から read で中身を読み出さないとだめってことです
0717nobodyさん05/01/31 02:09:28ID:???
>>711
CGIパラメータの取得方法は、Ruby1.8系から変わってる。
もしもrubyのバージョンが1.8以降なら、ちょっとリファレンスを読んでみ。
0718nobodyさん05/01/31 03:08:48ID:???
fh.print file.read
071971105/01/31 07:51:50ID:jhetKWRL
なるほど!
file.readってやるのね。

激しくサンクスです。
072071105/02/02 07:41:41ID:+oua1U51
やっぱりダメだった・・・orz
サーバエラーにはならないけど、.readのあたりでスクリプトが止まります。
バージョンは1.6.8です。

もうcgiライブラリを使う方法はあきらめ、直接ARGF.readで得たバイト列からJPGファイルを生成しようかと考え中。
0721nobodyさん05/02/02 10:23:32ID:???
バイナリモードで開いてる?
072271105/02/02 18:12:23ID:+oua1U51
はい。
オープン時に"wb"ってやってますが・・・。
072372105/02/02 22:11:33ID:???
分かった。cgi.paramsを使ってるからだ。

file = cgi.params["file"][0]
を
file = cgi["file"][0]
に変えて試してみそ。

# それにしても、この辺の仕組みややこしすぎ。
072471105/02/04 08:49:40ID:rvzKvXg/
ありがとうございます。
params抜いてためしてみましたがやっぱりダメでした。

とほほ・・・

ルビー挫折しそう。
0725nobodyさん05/02/04 09:05:33ID:???
そこまでやってもダメとなると、確かにもう無理かもわからんね
あと考えられるのはHTMLの間違いくらいしか無い……

ここで諦めるなら、無理に押しつけるつもりもないけれど
まだ挑戦する気力があるなら以下のことを書いてくれ。

・readのところで止まるとき、どんなエラーが出るか
・現時点でのソースコードはどうなっているか
・フォームを生成するHTMLはどうなっているか
0726nobodyさん05/02/04 19:00:38ID:???
>>724
部分的にでもコード晒せばいいのでは?

あとその昔のサンプルコードだけど今でも有効なはず。
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/25399

降ってくるのはMIMEヘッダが付いたバイナリ列であり、POSTのデータは普通のCGIなら(mod-rubyは知らん)
標準入力から来るから、こんなんで

#!/usr/local/bin/ruby
print "Content-type: text/plain\n\n";
print ARGF.readlines.join

こんなの
-----------------------------20164375627006
Content-Disposition: form-data; name="filename"; filename="nspr4.dll"
Content-Type: application/x-msdownload

MZ……

が見えないならどっかおかしい。
072772605/02/04 19:01:51ID:???
ちなみにHTMLはこんなの。
<html>
<head>
<title>upload</title>
</head>
<body>
<form action="/cgi-bin/print.rb" method="post" enctype="multipart/form-data">
<input type="file" name="filename" size="32" maxlength="256"></input>
<input type="submit" value="submit">
</form>
</body></html>
0728nobodyさん05/02/04 19:25:52ID:???
>>727
name="filename" じゃなくて name="file" じゃねーの?
072972805/02/04 19:32:50ID:???
すいません、ぼけてました。元質問者のレスかと思った。
073071105/02/05 09:18:52ID:???
>>725
今現在は、こんな感じです。
#!/usr/local/bin/ruby

print "Content-type: text/html\n\n"

require "cgi"
cgi = CGI.new
file = cgi["file"][0]
fh = open("test.jpg","wb")
fh.write file.read
fh.close

print <<EOF
<html><head><title>test</title></head><body>
<img src="test.jpg" alt="test"><br>
<form action="test.cgi" method="post" enctype="multipart/form-data">
<input type="file" name="file" size="70">
<input type="submit" value="upload">
</form></body></html>
EOF
073171105/02/05 09:24:19ID:???
>>725
で、ブラウザが真っ白な画面を出力して終わります。
なぜか.readをはずすとHTML出力まで行ってくれますが、
そのフォームを利用してファイルを送信するとまた真っ白な画面になります。

>>726
print ARGF.readではちゃんとそんなのが出てきます。
それを使えばjpgファイルへのデコードも可能ではないかと考えました。

みんな親切(涙)
0732nobodyさん05/02/05 11:17:52ID:???
>>731
おそらくは、パラメータに値(ファイル)が入っているかどうかを判定していないのが原因。

つまり、最初にCGIを呼び出したときには
file = cgi["file"][0]には空文字列しか入っていなくて
その空文字列に対してreadを送ったために、エラーで出力が止まった。

標準出力と標準エラー出力を、適当なテキストファイルに設定して確かめてみるといいかも。
$stdout = open('./output.txt', 'w')
$stderr = open('./error.txt' , 'w')
0733nobodyさん05/02/05 15:52:29ID:???
というか、とりあえずHTMLの表示とリクエストの受付は分けろ。
一緒にせずにUP用のHTMLファイルと受け付け用のスクリプトファイルにするのが普通だろ。
切り分けができないとテストにならないじゃないか。

0734nobodyさん05/02/05 16:07:42ID:???
手元ではこんな感じにしたら動いたよ。

cgi = CGI.new
file = cgi["file"]
if file.respond_to?(:read)
fh = open("test.jpg","wb")
fh.write file.read
fh.close
end

# やっぱり cgi.rb は捨てた方が・・・
0735nobodyさん05/02/05 20:50:55ID:???
>>734
それだと 1.8 系だよね。1.6.8 だと、

file = cgi["file"][0]

になるんじゃないかな
0736nobodyさん05/02/05 21:10:20ID:???
>>735
申し訳ない、1.6.8 って書いてあったのね・・・
0737nobodyさん05/02/05 21:41:39ID:???
ここは標準ライブラリがバージョンに依存するインターネットですね
0738nobodyさん05/02/05 23:31:54ID:???
>>733
それは個人々々で
0739nobodyさん05/02/05 23:34:56ID:???
今思ったんだが、cgi.rbを捨てろ捨てろ言うよりも
自分用のcgi.rbラッパーを作った方が良い。

コア部分は歴史を重ねて、それなりに堅牢に出来てるんだから
そのまま捨ててしまうのはもったいない希ガス。
0740nobodyさん05/02/06 00:36:37ID:???
CGI#params を使っておけば、バージョンに依存せずにパラメータが取れるよ
0741nobodyさん05/02/06 10:05:55ID:???
>>740
その方法だと、ファイルを送りたいときが問題になる。

……と思ってたら、ファイルを送ってもちゃんとparamsで受け取れるのか。
さっそくリファレンスマニュアルに書いてこよう。
074271105/02/06 11:03:41ID:???
参りました。
HTML部とCGI部とを切り分け、CGI部にbegin〜rescue〜endを入れてエラーの内容を出力させたところ、

RuntimeError

cannot generate tempfile `/tmp/CGI2732.9'

C:/usr/local/lib/ruby/1.6/tempfile.rb:46:in `initialize'
C:/usr/local/lib/ruby/1.6/cgi.rb:805:in `new'
C:/usr/local/lib/ruby/1.6/cgi.rb:805:in `read_multipart'
C:/usr/local/lib/ruby/1.6/cgi.rb:918:in `initialize_query'
C:/usr/local/lib/ruby/1.6/cgi.rb:1916:in `initialize'
C:/homepage/public_html/test.cgi:7:in `new'
C:/homepage/public_html/test.cgi:7

と出てきました。
test.cgiの7行目はなんと"cgi = CGI.new"文。
これってひょっとしてバグ・・・?
0743nobodyさん05/02/06 11:30:17ID:???
>>742
> cannot generate tempfile `/tmp/CGI2732.9'
Windowsで使うことを考慮してないみたいですね>cgi.rb
0744nobodyさん05/02/06 11:52:16ID:???
>>742
そこまでくると、今度こそrubyインタープリタの問題か……。
mswin版の1.6.8で試してみることをお薦めします。

ちなみに俺の環境では、mswin版1.6.8(正式版)を An HTTP Daemonで走らせている。
074571105/02/06 12:42:46ID:???
mswin版だったんだけど・・・orz
0746nobodyさん05/02/06 19:21:18ID:???
>>742
CGIじゃなくて、tempdir.rbの仕様。
def initialize(basename, tmpdir=ENV['TMPDIR']||ENV['TMP']||ENV['TEMP']||'/tmp')
ソース見りゃわかるが、上記なので環境変数TMPDIR,TMP,TEMPと見ていって、無ければ/tmpが採用される。
なので環境変数で適当な存在するディレクトリを指定すべし。
074771105/02/06 23:58:49ID:???
>>746
で、できましたーーーーーーーーーーーーー!!!!!!
/tmpがないんだったら/tmpを作っちゃえばということで、
c:\にtmpっていうフォルダ作ったら解決しちゃいました!
みなさん親切にどうもありがとうございました!
0748nobodyさん05/02/07 14:00:14ID:???
>>744 の環境ではうまく動いているということは、
環境変数をいじっているかそれとも An HTTP Daemon がうまいことやってくれてるの?
074971105/02/07 14:31:14ID:???
そういえば、いくらローカルで動いてもレンタルサーバで動かなきゃ意味ないんだった。
レンタルサーバのルートにtmpディレクトリがなかったらアウト。
さすがにレンタルサーバの環境変数とかをスクリプトでいじったら怒られるよな・・・orz
0750nobodyさん05/02/07 14:34:54ID:???
tmpがない鯖なんかあるわけないだろ
0751nobodyさん05/02/07 15:07:32ID:???
なければ俺が作る! 誰にも邪魔はさせん!

ていうか711は2chで人に聞いて場当たり的に解決しようとする前に、
本などでもっと体系的に勉強した方がいいですね。
環境変数とかの理解が間違ってるよ。
0752nobodyさん05/02/07 16:09:02ID:???
>>749
サーバが UNIX なら /tmp が無いなんてことはまずない。
0753nobodyさん05/02/07 16:32:58ID:???
Windows ユーザも OS インストールしたら、まっさきに
C:\tmp つくるよなーふつー (´ー`)y─┛~~
075474405/02/07 16:33:12ID:???
>>748
後者。適当な仮想パスが割り振られている。
0755nobodyさん05/02/07 17:17:27ID:???
本当は、プラットフォームに依存する一時ファイル用ディレクトリパスを
プラットフォーム非依存なライブラリに埋め込んでるのがおかしいんだけどな。
Windowsにも標準のディレクトリあるんだから、Rubyがそれをちゃんと使えば済む話。
0756nobodyさん05/02/07 17:26:08ID:???
1.8 なら Dir::tmpdir 使うから問題ないみたいだけどね。
075771105/02/07 18:44:17ID:???
サーバには/tmpが必ずあるんですね。安心しました。
ほんとうに何から何までありがとうございました。
まだまだご指摘のとおり勉強不足なのでこれを励みにまた修行にいそしみます。
0758nobodyさん05/02/08 18:41:54ID:???
このスレ長生きだなー
0759nobodyさん05/02/08 20:07:48ID:???
>>755
んだなぁ  ( ´ω`)
%なんたら% を山椒汁
0760nobodyさん05/02/08 20:36:40ID:???
>>759
「%なんたら%」って何?

つーか、 1.8 と同じように tmpdir.rb を使えばいいんじゃないの?
shim に入ってるよね。
0761nobodyさん05/02/08 21:16:54ID:???
Windows環境変数のリテラルだよ
0762nobodyさん05/02/09 01:34:18ID:???
ENV['TMP']でおおよそ解決するのと違うか。
076376205/02/09 01:36:57ID:???
……すまん、脳味噌膿ん�jわ
回線切って(ry
0764nobodyさん05/02/09 18:27:14ID:???
すいません統合スレから流れてきました…
都合で、画像のアップロードのスクリプトを作成していたのですが
http://www.geocities.co.jp/Playtown-Knight/9224/sinku-2.jpg
http://www.geocities.co.jp/Playtown-Knight/9224/sinku-2-2.png
という風に、画像のサイズが64kを越えると、そこから先が表示されないようになっているのですが
この仕様に突いて、原因や対処法をご存じの方はいらっしゃらないでしょうか?
マルチ臭いことしてすいません…orz
実行環境はWin2K+Apache2+Ruby1.8.1
ブラウザはFirefox、IEとも同じ症状が出るので、関係無いかと…
http://www.geocities.co.jp/Playtown-Knight/9224/imgup.zip
0765nobodyさん05/02/09 19:44:01ID:???
>>764
同じ状況で試せなくて参考にならないかもしれませんが、
OSX10.3、Safari、Ruby 1.8.2という組み合わせでは
64キロバイト以上のファイルもうまく動きました。

環境かRubyのバージョンに依存した問題かな、
と適当に言ってみる。
0766nobodyさん05/02/09 19:54:13ID:???
ファイルパス回りだけ修正したら普通に動いた。
Windows + Ruby1.8.1 + AN HTTPDaemon

「ファイルを書き込むパスに問題がある」節を提案(論拠なし)
0767nobodyさん05/02/09 19:56:27ID:???
>>764
うちでも動いてる。
WinXP+Apache2+Ruby1.8.2
動いてるというか動くように修正したら表示されてるし保存ディレクトリに問題なく保存されてる。
0768nobodyさん05/02/09 20:10:39ID:???
>>765-767
回答ありがとうございます!
となると、OS依存かRubyのバージョン依存の問題のようですね
一応、Helpに書き足して置いて、後に回そうかな…
0769nobodyさん05/02/13 16:08:07ID:7Ta9le/g
ピーエイチピーやパールがあるのにわざわざルビーでシージーアイのスクリプトを書くメリットは?
ルビーでないとできないことでもあるの?
0770nobodyさん05/02/13 19:44:01ID:???
ルビーがあるのにわざわざピーエイチピーやパールでシージーアイのスクリプトを書くメリットは?
ピーエイチピーやパールでないとできないことでもあるの?
077176905/02/14 08:18:39ID:???
すいません、自己解決いたしました。
スレ汚してごめそ。
0772nobodyさん05/02/14 08:57:01ID:???
釣りじゃなかったのか・・・
なにが解決したのかすげー気になる
077376905/02/16 15:57:36ID:???
あ、いや、すいません。
ルビー使いにはルビーでシージーアイが書けることがすでにメリットなんだろうなーって勝手に納得しちゃいました。
0774nobodyさん05/02/16 23:12:42ID:???
>>773
たぶんそのとおり
0775nobodyさん05/02/17 09:26:14ID:???
ruby使いはコンプレックスの固まりだしな
0776nobodyさん05/02/18 21:21:04ID:???
コンプレックスというか、Ruby 以外では生産性が低すぎて書く気がしなくなる病気にかかってるんですよ
■ このスレッドは過去ログ倉庫に格納されています