【Ruby】RubyでCGI
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2001/05/04(金) 12:57ID:c4hRtzGY関連リンクは>>2-3
0247nobodyさん
03/05/08 21:06ID:???テーマ機能つかって、css で制御するんじゃない?
0248nobodyさん
03/05/09 15:05ID:???ってな感じに、部分的にフォントを変えたいのだけど、
タグを使えるような抜け道が用意されているのかなと思って。
0250山崎渉
03/05/22 02:04ID:???0251山崎渉
03/05/28 17:18ID:???ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
0252るびきち
03/06/11 04:39ID:???ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ rubikitch
0253nobodyさん
03/06/17 10:18ID:CDKrfOSa0254nobodyさん
03/06/17 11:43ID:???http://www.pragmaticprogrammer.com/ruby/index.html
0255あぼーん
NGNG0256nobodyさん
03/06/19 21:56ID:c0HjpDNQどちらも行うスクリプトを書く時、
どのライブラリをrequireしてどのメソッドを使うのが効率がいいですか?
0258nobodyさん
03/06/20 20:09ID:???足りないノウハウ等がありましたら、どうかご教授ください。
以下にコードを挙げます。
ちなみに、複数選択可能なselectは考慮してませんし、使う気がございません。
0259258
03/06/20 20:12ID:???FNAME = {}
CONTENT_TYPE = {}
def CGITool.getForm()
if ENV['CONTENT_TYPE'] =~ /^multipart/
return getFormMultipart()
end
data = ""
if(ENV['REQUEST_METHOD'] == 'POST')
data = $stdin.read(ENV['CONTENT_LENGTH'].to_i)
else
data = ENV['QUERY_STRING']
end
form = {}
if(data != nil)
data.split(/&/).each{|pair|
key, value = pair.split(/=/, 2)
key = unescape(key)
value = unescape(value)
if(form.include?(key))
form[key] += " " + value
else
form[key] = value
end
}
end
form
end
0260258
03/06/20 20:12ID:???s.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
fconv([$1.delete('%')].pack('H*'))
end
end
def CGITool.fconv(s)
s
end
def CGITool.getFormMultipart(data = getMultipartData())
data =~ /^\-+(\w+)\r?\n/
word = $1
array = data.split(/\r?\n?\-+#{word}\-*\r?\n/); array.shift
form = {}
array.each do |c|
c.sub!(/^Content-Disposition: form-data; name="(.*?)"(?:; filename="(.*)")?\r?\n/, '')
key = $1; filename = $2
if filename
FNAME[key] = filename.sub(/^.*[\\\/\:](?:.*)[\\\/\:]/, '')
end
cLength = c.length; c.sub!(/^\r?\n?/, '')
if cLength != c.length
form[key] = fconv(c)
else
c.sub!(/^Content-Type: (.*)\r?\n\r?\n/, '')
CONTENT_TYPE[key] = $1
form[key] = c
end
end
form
end
0261258
03/06/20 20:12ID:???$stdin.binmode
$stdin.read(ENV['CONTENT_LENGTH'].to_i)
end
end
0262あぼーん
NGNG0263本7 ◆uPD9aFm9hI
03/06/21 02:13ID:???0265258
03/06/21 23:32ID:???それはさておき、
危惧していることは、
1.windows9xでgetMultipartData()の内容は問題ないのであろうか?また問題あるのであれば、どうすべきか?
2.getFormMultipart()のarray.eachの内容で想定していないデータが来るケースがあるであろうか?
です。大丈夫でしょうか‥?
0266nobodyさん
03/06/25 00:21ID:xZOuwnMzperlスクリプトの区別を付けるため、rubyのスクリプトは.rbとしているのですが、アパッチのほうは
AddHandler cgi-script .rb
こうやっています。なにかまずいことはありますでしょうか?
あと、rubyのモジュールとはいったいどういうものなのでしょうか?
0267nobodyさん
03/06/25 08:55ID:???class C
def to_s
"[an instance of class C in module M]"
end
end
end
p M::C.new
include M
p C.new
0268nobodyさん
03/06/28 17:06ID:???Apacheはそれで良いと思う。
モジュールとは端的に言うとインスタンスが作れないクラス。
Rubyは単一継承だからクラスは一つのスーパークラスしか持てないが、
モジュールであれば複数取り入れることが出来る。
class C0
#...
end
module M0
#...
end
module M1
#...
end
class C1 < C0 # スーパークラスは一つのみ
include M0
include M1 # モジュールはいくつでも取り込める
#...
end
これでC1はC0、M0、M1で定義されたメソッドを継承することになる。
また、モジュールの中でクラスや他のモジュールを入れ子にすることで
名前空間を作るのにも使用する。
267はその例。
0269265
03/06/28 17:58ID:t6ndrw6Wなるほど、、まぁ、はじめたばっかりの私にとってはクラスとかあんまりあからないので、大丈夫かなぁ・・・
ありがとうございました。
0270nobodyさん
03/06/28 17:59ID:t6ndrw6W0271nobodyさん
03/07/08 12:15ID:cQ+4nOpScgi.rbを使ってあぷろだを作っているのですが、マルチパートの扱いがよく分かりません。
FORMのENCTYPEがmultipart/formdataのとき
values = cgi['field_name'] # <== field_nameの配列
values[0].read # <== values[0]の本文
values[0].local_path # <== values[0]のローカルファイルのパス
values[0].original_filename # <== values[0]の元の名前
values[0].content_type # <== values[0]のcontent_type
でアップロードしたファイルのデータが取得できるのでしょうか?
0272nobodyさん
03/07/14 19:21ID:???0273山崎 渉
03/07/15 11:06ID:???__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
0274nobodyさん
03/07/20 18:39ID:MTCslCJPservlet+JSPより好きなので、age。
0275nobodyさん
03/07/21 05:15ID:???0276nobodyさん
03/07/21 14:33ID:???今回の流れで色々と複雑な事情があるのだなあと知りました。
陰ながら応援sage。
0277nobodyさん
03/07/21 23:32ID:???<% か <%= のどっちかだけ。
0278nobodyさん
03/07/26 01:58ID:aoovL48qRubyに標準で添付されているCGI.rbというライブラリでは、
タグを生成するときの大文字は変更できないんでしょうか?
最近ではxmlの関係もあって小文字で出力したいと思うんですが・・・
例)大文字 → <HTML><H1>
小文字 → <html><h1>
0279nobodyさん
03/07/26 02:32ID:???RubyでPerlでいう↓のやつできませんか?
print << 'EOS';
<html>
<body>パパの特盛</body>
</html>
EOS
>>278
タグの内部だけ?相当むずかしいんじゃないの?
タグ内のデータとかは大文字のままじゃないといけないんでしょ?
例:<INPUT NAME=OOMOJI> ⇒ <input name=OOMOJI>
たぶん、それはないと思う。変換機能がついたHTMLエディタとかどぞ
0280nobodyさん
03/07/26 03:02ID:???cgi.rb のかわりにこれの出力を require してみたらどうなる?
print(File.read($:.map{|i|i+"/cgi.rb"}.find{|i|File.readable?(i)}).gsub(/element\.upcase/,"element.downcase"))
>>279
×print << 'EOS';
○print <<'EOS';
0282278
03/07/27 00:09ID:zQkWZE8hご教示ありがとうございました。
結局、cgi.rbの中身を解析し、何箇所か修正を加えることで、
目的を達成することができたみたいです。
0283278
03/07/27 00:15ID:zQkWZE8h>>280さんの方法では、私の環境ではエラーになってしまいました。
0284nobodyさん
03/07/27 01:41ID:???0286nobodyさん
03/07/27 04:47ID:???0287279
03/07/27 17:47ID:???print "pl rb pl rb".gsub( /(pl|rb)/, ($1=='pl') ? 'Perl': 'Ruby')
これだと ($1=='pl') がかならず false になってしまい、
Ruby Ruby Ruby Ruby になってしまいます
なにゆえでしょう?
0289279
03/07/27 18:32ID:???勇者にロトと名づける裏技、見つかりました
print "pl rb pl rb".gsub(/pl|rb/) {|m|
m = (m=='pl')? 'Perl' : 'Ruby'
}
これでやったらできました。 |m| あたりが良くわからんけど。
ruby-lang.orgのgsubのリファレンスマニュアルみたらすぐ見つかりました。すみません
rubyの後方参照($1とか\1とか)はあんま柔軟なことできないみたいですね
ありがとうございました
0292nobodyさん
03/07/28 00:51ID:???puts "pl rb pl rb".gsub(/(pl|rb)/) { ($1 == 'pl') ? 'Perl' : 'Ruby' }
0293nobodyさん
03/07/28 01:38ID:???pattern = Regexp.compile(table.keys.join('|'))
puts("pl rb pl rb".gsub(pattern){table[$&]})
0294279
03/07/28 02:04ID:???そっちの方がカコイイ!!ありがとう
>>293
最適化されてしまった...
table.keys.join('|')って汎用的でおもしろいアイデアですね。ワラタ
おもしろいなRuby
0295nobodyさん
03/07/28 22:58ID:???キーが正規表現含むとおかしくなるから
quoteしたほうがいい
pattern = Regexp.compile(table.keys.collect {|key| Regexp.quote(key) }.join('|'))
0296279
03/07/29 00:45ID:???いやぁ、やりたかったことはRubyでPHPみたいなファイルを実行するものなんですけどね。
↓こんな感じ。検索でヒットするパターンが多いからちょっと連想配列は使えないかも。
んで昨日、ERBというライブラリがあることを知ってこれは無駄になりました(´・ω・`)ショボーン
class EzRubyServerPage < Object
@@boundary = '__BOUNDARY_EZ_RHP__'
def eval( arg = "" )
Kernel::eval "$_ = <<"+@@boundary+";\n" + arg.gsub( Regexp.compile('[<%][%>]=?') ){
($&=='<%' ) ? "\n"+@@boundary+"\nchop;print;":
($&=='<%=') ? "\n"+@@boundary+"\nchop;print;print ":
($&=='%>' ) ? "\n$_ = <<"+@@boundary+";\n":
$&
} + "\n"+@@boundary+"\nchop;print;"
end
end
$tokumori = "パパの特盛"
EzRubyServerPage.new.eval("<html><body>ようこそ <%=$tokumori%>へ</body></html>\n")
0297279
03/07/29 00:53ID:???検索速度がorでつなげるより速そうだから [<%][%>]=? なんてしてるんですが
よく考えたらパターンは <%、%>、<%=、%>=、>%、%<、>%=、%<= の8通りだけだから連想配列の方が良いか
まあいいや、ERBとかいうのを使おう...。スレ汚しすんまそん。ハァ
0298nobodyさん
03/07/29 00:57ID:???0300nobodyさん
03/07/29 23:02ID:SXyppRH6利用しなくなったセッションファイルを自動で消去することは
できないんでしょうか?
ある本をよんだら、CGI::Session.sweep()を使うと書いてあった
のですが、エラーが出て使えません。
0301nobodyさん
03/07/30 03:09ID:???> ある本をよんだら、CGI::Session.sweep()を使うと書いてあった
sweepの定義はその本に書いあるのだと思われ。
利用しなくなったかどうかの判断基準は利用者によって異なる。
だから、一般的な方法は存在しない。
0302nobodyさん
03/07/30 04:42ID:???0303nobodyさん
03/08/05 00:21ID:???るびきち著『Rubyシェルプログラミング−irb&irbsh徹底活用−』8月4日発売です
http://www.gihyo.co.jp/books/syoseki.php/4-7741-1798-6
基本的にこの人は他人との意思疎通が不可能な引き篭り星人な為、
何を言っているのか、何を伝えたいのかが全く見えません。故に専門書としては全く使えません
ではこの本のウリは何か?それは「他人をムカつかせるにはどうすればいいのか?」という厨房必修のスキル養成本としての価値に
他ならないでしょう。礼儀をわきまえない砕けすぎた態度から始まり、徐々に高圧的な態度へ、最後は相手を全否定し卑下し、自分が
相手に比べ、如何に優れた人間であるかを延々と語り続けるその試合運びに、各地厨房サイトから歓声が上がっております
なんとあの、2ちゃんねるネトヲチ板の皆様からも「掲示板のレスが反感を買うための例文集のようだ」とのお墨付きを得ております
そして「絶対零度つまらなギャグ集」としての機能も持ち合わせております。
なぜ、ウケ狙いの小ネタが、そこまでつまらないのか?スベろうと努力したってそこまでつまらない発言できるものではありません
正に天が与え給った才能だNe!! 合コンで思いっきりスベッて周りからジト目で見られてみたいソコのあなた!必読です。
参考文献 Rubyを256倍使うための本 魔道編
0304nobodyさん
03/08/06 19:53ID:???0305山崎 渉
03/08/15 22:44ID:???│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
0306nobodyさん
03/08/23 03:43ID:???できません。
MLをみたら $DEBUG = true
にするとありますが、そうしても変化がありません。。。
どうすればいいんですか?
0307nobodyさん
03/08/23 19:08ID:???eruby 自体が起動されてないんじゃないの?
サーバーの設定を確認した方がいいような。
サーバーのエラーログが見れるのならそこを見るべし。
0308nobodyさん
03/08/23 21:49ID:Ba5Hz+Nk面倒くさいだけなんです。
作っている時だけブラウザにエラーを表示してくれると助かるんですが。
eruby + mod_ruby で使ってます。
手元に環境がないんでversionがわかんないんですが、どちらも最新のものだと思います。
0309nobodyさん
03/08/23 22:32ID:???コマンドラインで実行してみれ。
0310nobodyさん
03/08/24 00:59ID:???ruby の parse error は apacheのログには表示されますので、
それをブラウザに表示できる設定がないかなと思ったんです。
stderrはerubyでは拾えないということですか?
0311nobodyさん
03/08/24 02:40ID:???0312nobodyさん
03/08/24 05:41ID:???なんでブラウザで見たいのかがさっぱり分からん
0313nobodyさん
03/08/24 06:34ID:3TVF6TbnCGIの引数渡すのがめんどくさいんだろ
0314312
03/08/24 10:00ID:???めんどくさいていうか、わかんないんです。
コマンドラインでPOSTデータやcookieデータを渡す方法が。
0315あぼーん
NGNG0316nobodyさん
03/08/24 20:16ID:???0317312
03/08/25 00:38ID:???例外が発生しても Internal server errorになるわけで。
できないんなら、できないでいいんだけど。
煽られるのって楽しいね。
0318nobodyさん
03/08/25 01:25ID:???つーか、311=312なの??
0319nobodyさん
03/08/25 09:27ID:???実行時の例外は $DEBUG=true しとけばブラウザで確認できるはずだから
インタプリタがコンパイルできるかどうかだけはコマンドラインでeruby実行して
調べれっていわれてるんでしょ。
0320nobodyさん
03/08/25 14:17ID:IWdWlewI0321nobodyさん
03/08/25 15:13ID:???0322nobodyさん
03/08/25 18:59ID:???ソース丸見えになるのでデフォルトでこれは勘弁と思ったものだ。
0323nobodyさん
03/08/26 01:50ID:???mod_ruby を外したらブラウザに表示できました。
mod_ruby + eruby だと表示できないようです。
--
mod_ruby 1.0.5
ruby 1.6.8 (2003-03-26)
eRuby version 1.0.3
0324nobodyさん
03/08/26 11:26ID:???なるほど、と思ってソースのあたりをいろいろ探して見た
httpd.conf で
RubyRequire apache/eruby-run -> RubyRequire apache/eruby-debug
RubyHandler Apache::ERubyRun.instance -> RubyHandler Apache::ERubyDebug.instance
に変更したらparse error もブラウザに出た
しかし、HTTPサーバごとデバッグ環境にしなけりゃならんのだなあ・・・
0325nobodyさん
03/08/26 22:36ID:???http://raa.ruby-lang.org/list.rhtml?name=html-template2
他の環境(オブジェクト、DB)を変更する副作用が一切ないから
思う存分プレゼンテーションロジックのデバッグが出来る
ビジネスロジックはTest::Unitできちんとテスト書きましょう
0326nobodyさん
03/08/31 13:41ID:???0328nobodyさん
03/09/02 06:02ID:jo93f+PB0329nobodyさん
03/09/03 02:26ID:???0330nobodyさん
03/09/03 02:41ID:6XWfASQRhtml-template.rdだけじゃ、複雑なことしたいときどーすりゃいいか分からん
0331nobodyさん
03/09/03 22:54ID:???ENV[]から代入した文字列は変更不可だった
とりあえずひっかかったのはいまのとここれだけ
0332nobodyさん
03/09/04 02:16ID:???変数にアサインしてもStringオブジェクト自体はかわらんからね。
dup すれ。
0333nobodyさん
03/09/04 10:48ID:???Rubyの使用が最も少ないサーバ(ほとんどphpとPerl)を選んで
入れたのに、いきなり出たんでちょっと別のサーバに持ってくのは
慎重にならざるをえないな・・
0334nobodyさん
03/09/07 18:35ID:90cSPk+Wが、サーバから動かない時って、どんな可能性があるでしょうか?
INTERNAL_SERVER_ERRORになってしまいます。
以下のことは確認しました。何か理由思いつかないでしょうか?
実行可能になっています。
そのディレクトリにwwwがファイルを作れるようになってます。
Apacheの設定でCGIを使えるようにしています。
#!/usr/local/bin/rubyを文頭に書いてます。
print "Content-type: text/html"はあります。
0335nobodyさん
03/09/07 18:46ID:???apacheのエラーログには何か出てない?
suEXEC関連のエラーなら、そっちのログも(ディレクトリがグループ書き込みできると実行できない)
0336334
03/09/07 19:18ID:90cSPk+Wやっと、できました!!
あーよかった。もうちょっとで一日が無駄になるところでした(^^;)
Apacheのログみてたら、book1~ に対してPermission deniedとか書いてあったので、
book1~を削除したら、動いてくれました。
PStoreの保存するファイルの名前がbook1で、コマンドラインから実行していた時に
book1やbook1~が作られていました。
book1の方は消していたのですが、book1~は気にせず残したままでした。
ありがとうございました。これからは、CGIが動かない時、Apacheのログもよむことにします。
ちなみに、他にでてたエラーのキーワードは、こんな感じです。
同じようなエラーが出た時に検索にかかるように、載せておきます。
Premature end of script headers: wook.cgi, referer: http://localhost/cgi-bin/***.html
/usr/local/lib/ruby/1.8/ftools.rb:23:in `initialize': Permission denied - ./book1~ (Errno::EACCES), referer: http://localhost/cgi-bin/***.html
/usr/local/lib/ruby/1.8/ftools.rb:23:in `open', referer: http://localhost/cgi-bin/***.html
from /usr/local/lib/ru
by/1.8/ftools.rb:23:in `syscopy', referer: http://localhost/cgi-bin/***.html
from /usr/local/lib/ruby/1.8/ftools.rb:43:in `copy', referer: http://localhost/cgi-bin/***.html
などでした。
ホントありがとうございました!
0337nobodyさん
03/09/08 00:50ID:???URLエンコードってどうすればよいんでしょ‥?
0339337
03/09/08 01:57ID:???どうやら、IEが返してくるENV['HTTP_COOKIE']の値が想定していたのと違うみたい
writeから始まって、値のみがカンマ区切りで入っているデータが返ってくるようで
キーはどこいったの??って感じです
値を変えてみてしてみたのですが、返ってくるENV['HTTP_COOKIE']の値が変わらず‥
path指定を消して、再度値を変えてみてしてみたのですが、変わらず‥
以下のメソッドの結果をそのままプリントしているのですが、なにかまずいでしょうか?
def mkCookie(recipe, expiryDate = 30, path = nil)
t = (Time.new.to_i + (expiryDate * 86400)).to_i
t = Time.at(t).gmtime.strftime("%a, %d-%b-%Y %H:%M:%S GMT")
text = ''
recipe.each do |key, value|
text << "Set-Cookie: #{escape(key)}=#{escape(value)}; expires=#{t};" + (path ? " path=#{path};" : '') + "\n"
end
text
end
ひょっとして、クッキー使用前に使ってた
IE Powertoys Plus!のどこでもクッキーが???
0340337
03/09/08 08:54ID:???関係のあるCookieを全て削除したらどうやらスクリプト側で受け取るものは正常になっていました
Cookieのファイルを見た感じの違いはキー・値のペアの区切りが改行になっているか「*」になっているかの違いでした
どうしてそうなったのか、Cookieはなぜ上書きされなかったのかは不明‥
0341nobodyさん
03/09/08 10:36ID:???具体的になにがしたいんだ?
HTML::Templateでは、テンプレート側では複雑なことはできない。
複雑なこと(例えば複雑な条件式など)は、ぜんぶメインプログラム側で行う。
0342nobodyさん
03/09/09 01:02ID:64dJm4LW使われてないとエラーになんの?
0344nobodyさん
03/09/09 10:23ID:64dJm4LWtempl = HTML::Template.new('hogehoge.html');
templ.param({'test'=>true});
array = [{'host'=>'book.2ch.net','board'=>'bizplus'},
{'host'=>'news5.2ch.net','board'=>'newsplus'},
{'host'=>'news4.2ch.net','board'=>'news'}];
templ.param({'array'=>array});
print(templ.output);
------------------
----hogehoge.html----
<!begin:test>
<!begin:array>
HOST:<!var:host>
BOARD:<!var:board>
<!end:array>
<!end:test>
---------------------
----error message----
./template.rb:78:in `node': node array not found (ArgumentError)
from ./template.rb:62:in `param'
from ./template.rb:61:in `each'
from ./template.rb:61:in `param'
from ./template.rb:59:in `each'
from ./template.rb:59:in `param'
from ./hogehoge.rb:9
--------------------
0345nobodyさん
03/09/10 19:14ID:???これって、どのHTML::Templateを使っている?
おれが使っているのは
http://raa.ruby-lang.org/list.rhtml?name=html-template2
なんだけど、テンプレートの書き方がなんか違うね。
それはそうとエラーの原因は、
(1)テンプレートで記述している木構造と
(2)テンプレートに与えているデータの木構造
が異なることが原因だろ。
(1)では test の下に array があるが、
(2)では test と array が兄弟になってないか?
0346345
03/09/10 20:46ID:???おれの勘違いだったかも。
ループのまわりをif文で囲むと、どうもうまくいかないみたい。
表示する/しないをif文で制御するのではなく、
ループするデータがある/ないで表示を制御するとうまくいく。
------- sample.html ------
<TMPL_LOOP NAME="list">
HOST: <TMPL_VAR NAME="host">
BOARD: <TMPL_VAR NAME="board">
</TMPL_LOOP>
--------------------------
0347345
03/09/10 20:47ID:???-------- sample.rb -------
#!/usr/bin/ruby
require 'html/template'
test = true # or false
list = [
{ 'host' => 'book.2ch.net', 'board' => 'bizplus', },
{ 'host' => 'news5.2ch.net', 'board' => 'newsplus', },
{ 'host' => 'news4.2ch.net', 'board' => 'news', },
]
param = {}
if test then
param['list'] = list
else
param['list'] = []
end
template = HTML::Template.new('filename' => 'sample.html')
template.param(param)
print template.output
--------------------------
■ このスレッドは過去ログ倉庫に格納されています