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

【Ruby】RubyでCGI

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。2001/05/04(金) 12:57ID:c4hRtzGY
Rubyについて語るスレッドです。
関連リンクは>>2-3
0202nobodyさん03/01/30 05:41ID:???
>>201
eucである必要はないけどeucかsjisかutf8に揃えないと書きにくいと思う。
0203nobodyさん?03/02/07 16:01ID:???
rubyでもsjisだと特殊文字含んでたらだめなんじゃなかったっけ?
0204nobodyさん03/02/07 17:59ID:???
ruby -Ks のように漢字コードをきちんと指定すれば問題ないよ。
0205nobodyさん03/02/07 19:11ID:???
>>203
特殊文字って何よ、特殊文字って?
@みたいにマックでは読めない機種依存文字のこと?
それだとShift_JIS自体の問題になると思うんだけど…。
(ただのhtmlでも問題起きるわけだし…)
0206nobodyさん03/02/07 20:28ID:???
メタ文字のことだろ
0207nobodyさん03/02/14 11:45ID:S51j/Le3
CGIKitに興味があります。
amritaについてきたサンプルを実行してみたのですが、
どういう時に使うと嬉しいのかが、いまいちぴんと来ません。
こう使うと便利だっ、という例ありますか。
0208nobodyさん03/02/17 03:23ID:???
ある程度アプリが複雑になるときかな。もしくはeRubyだと辛いとき、など。
フォームから送られたデータを勝手に処理してくれるのは楽。
まだぽこぽこバグがあるみたいだけど。

ただ、フレームワークだから慣れるのに時間がかかると思う。
コンポーネント指向のWebアプリ開発も同じく。
cgi.rbやeRubyに特に不満がなければ無理に使うこともないかと。
020920703/02/17 05:27ID:???
>208
レスどうも。
どうやら、今の私には必要ないようです。
0210nobodyさん03/02/22 02:08ID:???
Ruby、試してみたいけど使える(入手できる)CGIスクリプトが少なすぎ。
Perl,PHP→Ruby移植をやってほすぃ。
0211nobodyさん03/02/23 01:26ID:???
>>210
ショボイのしか作れなくて悪かったね!
つか、言語自体のスタイルが違うから移植するより、
新しく構築した方が早いし、メンテが楽。
0212nobodyさん03/02/23 08:02ID:???
>>210
何を移植して欲しいのよ?
と、聞くだけ聞いてみるテスト。
0213nobodyさん03/02/28 14:15ID:Zmsc8h96
Amrita 1.0.2だと動くスクリプトが、1.8.1だと変になる。
なんかidがそのままHTMLに出力されてしまう。
どんな原因が考えられる?
0214nobodyさん03/03/06 22:18ID:???
PHPでつくったスクリプトをrubyで書き直しているんですが、
FLASHの画像サイズを取得できなくて困っています。

rubyで扱える方法ってあります?
0215nobodyさん03/03/07 03:08ID:???
freemovie は?
http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/freemovie/freemovie/
0216nobodyさん03/03/08 01:07ID:???
freemovieも新しく作るだけみたいな、読み違えていなければですが。

perlかPHPを読むしかないか...
0217nobodyさん03/03/11 11:05ID:1APakuZe
mod_rubyを使ってます。
下記のように書いても、シグナルを捕らえられないようです。
mod_rubyではSIGPIPEは発生しないのでしょうか?
それともなにか勘違いしてますか?

#! /usr/bin/ruby
require "cgi"

trap("PIPE") {STDERR.puts 'PIPE'}

print_http_header #httpのヘッダーを吐くルーチン

#10秒かけてデータを出力
for i in 0...100
 print i,"<br>\n"
 sleep(0.1)
end
021821703/03/11 14:11ID:???
いろいろ試してみましたが、mod_rubyではブラウザが読み込みを
中断してもシグナルは飛んでこないようです。
0219nobodyさん03/03/13 14:09ID:ZqR/jIti
RubyでYY-BOARDライクな掲示板を作ってみました。
だれか使いませんか?
ttp://xx.homelinux.net/~ruby/flexbbs/
0220山崎渉03/03/13 16:55ID:???
(^^)
0221nobodyさん03/03/13 22:00ID:???
>>217

mod_ruby環境下だと$stdoutがIOじゃなくApache::Requestに
なるのでprintしてもSIGPIPEは発生しません。

$stdout.connection.aborted?でクライアントが接続しているか調べられる。

if $stdout.connection.aborted?
 STDERR.puts "aborted"
end
0222nobodyさん03/03/15 09:09ID:77D9QknZ
保守
0223nobodyさん03/03/15 09:10ID:???
http://travel.2ch.net/test/read.cgi/kyoto/1047317632/
ここの1の動画にゾクゾクきた。
022421703/03/15 14:43ID:???
>>211
> なるのでprintしてもSIGPIPEは発生しません。

そうですか。
クライアントが読み込みを中断して、処理が中断すると
まずいので、mod_rubyの仕様はむしろ都合がよいです。

> $stdout.connection.aborted?でクライアントが接続しているか調べられる。

勉強になります。
0225nobodyさん03/03/18 11:02ID:s+XgHl7g
rubyって鯖負担が大きいから普及しないんかな?phpは鯖負担軽いから最近急速に普及しとるが。
0226nobodyさん03/03/18 14:10ID:???
mod_ruby
0227nobodyさん03/03/19 13:18ID:???
>>225
同じことをするなら CPU usage は Perl よりちょい多いかなくらいだよ。
むしろ PHP はかなり CPU を食う。
http://www.bagley.org/~doug/shootout/craps.shtml

ただ、OOP ゆえにライブラリ使いまくりで重くなっている可能性はあるね。
0228nobodyさん03/03/19 15:00ID:???
PHPはコレデモカッ!てくらいライブラリのラッパがあるのがウリだと思う
全く工夫せずにそのままラップしてあるのも潔よい
0229nobodyさん03/03/20 05:03ID:???
mod_rubyな鯖ってグローバル変数を共有していたり、
一度requireしたらリセットできないなど、
レンタル鯖では使い辛いような気がしますが、
気のせい?
0230nobodyさん03/03/20 05:22ID:???
>229
ならmod_rubyを使わなければ良いのでは
寿命が長いから顧客向けじゃないと思う
0231nobodyさん03/03/21 10:57ID:???
>>229
loadは?
0232nobodyさん03/03/21 17:51ID:???
2回以上ロードされることを念頭においたライブラリは多くないだろう
0233nobodyさん03/04/11 04:13ID:EmBndhA4
Rubyで書かれた2ch型掲示板↓
http://www.daifukuya.com/photoxp/
0234nobodyさん03/04/11 09:37ID:???
>>225 オブジェクト歯垢は、厨プログラマには使えないから普及しない気がする。
普通のプログラマには嬉しい言語なのにな。悲しい現実だよ。
0235nobodyさん03/04/11 16:40ID:???
ちと違う。
普通のプログラマが嬉しければ流行る。
なぜなら厨プログラマは上層の反応に素直に反応するから。
という事はRubyに何か痛い点がある。それはね・・・。         つづく。
0236nobodyさん03/04/13 21:21ID:???
>235
痛い点って???すげぇ気になる&age
0237山崎渉03/04/17 12:03ID:???
(^^)
0238山崎渉03/04/20 06:26ID:???
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0239nobodyさん03/04/26 16:38ID:???
>>235
ネタだけ振って逃げたな。
0240nobodyさん03/05/03 10:48ID:???
>>219
http://21c.ath.cx/program/ruby/cgi/bbs/flexbbs/
0241nobodyさん03/05/04 07:47ID:c2Xx7eHE
Amrita1.8.2、Cygwin でなく、mswin版Rubyで使えるようになりませんか?
テンプレートコンパイラ機能を使いたいです。
0242nobodyさん03/05/04 13:08ID:???
multipartなFORMを使ってファイルをアップするCGI作っています
ファイル名を空にして送信したときに
Tempファイルが残ったままになることが、たまにあるんだがどうして?
0243nobodyさん03/05/06 15:00ID:???
自分用語で言われても、、、ね?
0244nobodyさん03/05/06 20:26ID:???
>>241
amrita/ext 配下が VC++ でコンパイル通らないってこと?
エラーメッセージは?
0245nobodyさん03/05/07 09:22ID:???
>244
Warning がいくつか出たけど、とりあえずコンパイルできました。
0246nobodyさん03/05/07 10:26ID:QZ929xpM
Hikiでフォント変えられるの?
0247nobodyさん03/05/08 21:06ID:???
フォント?
テーマ機能つかって、css で制御するんじゃない?
0248nobodyさん03/05/09 15:05ID:???
test<font face="Arial">test</font>
ってな感じに、部分的にフォントを変えたいのだけど、
タグを使えるような抜け道が用意されているのかなと思って。
0249nobodyさん03/05/09 19:15ID:???
>>248
フォントを指定するプラグインを作ってください。
0250山崎渉03/05/22 02:04ID:???
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
0251山崎渉03/05/28 17:18ID:???
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
0252るびきち03/06/11 04:39ID:???
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      rubikitch
0253nobodyさん03/06/17 10:18ID:CDKrfOSa
Rubyでオブジェクト指向の勉強に最適なサイトはないですか?
0254nobodyさん03/06/17 11:43ID:???
これだな。
http://www.pragmaticprogrammer.com/ruby/index.html
0255あぼーんNGNG
あぼーん
0256nobodyさん03/06/19 21:56ID:c0HjpDNQ
IPからホスト名の取得と、ホスト名からIPの取得
どちらも行うスクリプトを書く時、
どのライブラリをrequireしてどのメソッドを使うのが効率がいいですか?
0257nobodyさん03/06/20 02:08ID:???
>>256
resolv.rb
0258nobodyさん03/06/20 20:09ID:???
cgi.rbを使いたくないので、フォームから取得するモジュールを書いてみたのですが、
足りないノウハウ等がありましたら、どうかご教授ください。
以下にコードを挙げます。
ちなみに、複数選択可能なselectは考慮してませんし、使う気がございません。
025925803/06/20 20:12ID:???
module CGITool
  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
026025803/06/20 20:12ID:???
  def CGITool.unescape(s)
    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
026125803/06/20 20:12ID:???
  def CGITool.getMultipartData
    $stdin.binmode
    $stdin.read(ENV['CONTENT_LENGTH'].to_i)
  end
end
0262あぼーんNGNG
あぼーん
0263本7 ◆uPD9aFm9hI 03/06/21 02:13ID:???
究極はBASICだよ
0264nobodyさん03/06/21 14:45ID:???
>>258
議論のノウハウが足りないようだが。
026525803/06/21 23:32ID:???
うっ‥それでは議論のノウハウをご教授していただきたいものです‥
それはさておき、
危惧していることは、
1.windows9xでgetMultipartData()の内容は問題ないのであろうか?また問題あるのであれば、どうすべきか?
2.getFormMultipart()のarray.eachの内容で想定していないデータが来るケースがあるであろうか?
です。大丈夫でしょうか‥?
0266nobodyさん03/06/25 00:21ID:xZOuwnMz
すいません。perlから、Rubyに挑戦しているものです。
perlスクリプトの区別を付けるため、rubyのスクリプトは.rbとしているのですが、アパッチのほうは
AddHandler cgi-script .rb
こうやっています。なにかまずいことはありますでしょうか?
あと、rubyのモジュールとはいったいどういうものなのでしょうか?
0267nobodyさん03/06/25 08:55ID:???
module M
  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:???
>>266
Apacheはそれで良いと思う。

モジュールとは端的に言うとインスタンスが作れないクラス。

Rubyは単一継承だからクラスは一つのスーパークラスしか持てないが、
モジュールであれば複数取り入れることが出来る。

class C0
  #...
end

module M0
  #...
end

module M1
  #...
end

class C1 < C0 # スーパークラスは一つのみ
  include M0
  include M1 # モジュールはいくつでも取り込める
  #...
end

これでC1はC0、M0、M1で定義されたメソッドを継承することになる。

また、モジュールの中でクラスや他のモジュールを入れ子にすることで
名前空間を作るのにも使用する。
267はその例。
026926503/06/28 17:58ID:t6ndrw6W
>>268
なるほど、、まぁ、はじめたばっかりの私にとってはクラスとかあんまりあからないので、大丈夫かなぁ・・・
ありがとうございました。
0270nobodyさん03/06/28 17:59ID:t6ndrw6W
名前欄の数字みすった。スマソ
0271nobodyさん03/07/08 12:15ID:cQ+4nOpS
多分既出だと思いますが
cgi.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:???
秋風が吹く頃に勉強する予定なのでageといてやる。
0273山崎 渉03/07/15 11:06ID:???

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
0274nobodyさん03/07/20 18:39ID:MTCslCJP
mod_ruby+eruby。
servlet+JSPより好きなので、age。
0275nobodyさん03/07/21 05:15ID:???
ruby-listでerbの改造について盛り上がってるね。これで速さがphp並になれば……。
0276nobodyさん03/07/21 14:33ID:???
私は % のエスケープも<% # %>も使わないので、
今回の流れで色々と複雑な事情があるのだなあと知りました。
陰ながら応援sage。
0277nobodyさん03/07/21 23:32ID:???
俺も使わないなあ。規模が違うってのもあるんだろうけど。
<% か <%= のどっちかだけ。
0278nobodyさん03/07/26 01:58ID:aoovL48q
初歩的な質問で申し訳ないんですが、
Rubyに標準で添付されている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:???
>>278
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';
028127903/07/26 03:16ID:???
>>280
うわあぁああぁぁ!
いぃち文字消したらでぇきたぁー!
サンクス!
028227803/07/27 00:09ID:zQkWZE8h
>>279-280
ご教示ありがとうございました。

結局、cgi.rbの中身を解析し、何箇所か修正を加えることで、
目的を達成することができたみたいです。
028327803/07/27 00:15ID:zQkWZE8h
補足

>>280さんの方法では、私の環境ではエラーになってしまいました。
0284nobodyさん03/07/27 01:41ID:???
cgi.rb suxx
0285nobodyさん03/07/27 02:19ID:???
>>284
CGI.pm がこの世に存在しなければあんなダメダメなライブラリにはならかったんじゃないかと想像。
0286nobodyさん03/07/27 04:47ID:???
narf のベータが取れるのを待つしか。
028727903/07/27 17:47ID:???
gsubで、引っかかった文字によって置き換える文字を変えたいのですが

print "pl rb pl rb".gsub( /(pl|rb)/, ($1=='pl') ? 'Perl': 'Ruby')
これだと ($1=='pl') がかならず false になってしまい、
Ruby Ruby Ruby Ruby になってしまいます
なにゆえでしょう?
0288nobodyさん03/07/27 18:05ID:???
>>287
簡単に言うとドラクエの勇者に「ロト」って名前付けられないのと一緒だ。
028927903/07/27 18:32ID:???
>>288
勇者にロトと名づける裏技、見つかりました

print "pl rb pl rb".gsub(/pl|rb/) {|m|
  m = (m=='pl')? 'Perl' : 'Ruby'
}
これでやったらできました。 |m| あたりが良くわからんけど。
ruby-lang.orgのgsubのリファレンスマニュアルみたらすぐ見つかりました。すみません

rubyの後方参照($1とか\1とか)はあんま柔軟なことできないみたいですね
ありがとうございました
0290nobodyさん03/07/27 21:35ID:???
>>289
> rubyの後方参照($1とか\1とか)はあんま柔軟なことできないみたいですね

下手な煽り文句ですね。
029127903/07/28 00:29ID:???
>>290
え?べつに煽ってはいませんよ
煽りに見えたならそれはすみません
0292nobodyさん03/07/28 00:51ID:???
>>289
puts "pl rb pl rb".gsub(/(pl|rb)/) { ($1 == 'pl') ? 'Perl' : 'Ruby' }
0293nobodyさん03/07/28 01:38ID:???
table = {'pl'=>'Perl', 'rb'=>'Ruby'}
pattern = Regexp.compile(table.keys.join('|'))
puts("pl rb pl rb".gsub(pattern){table[$&]})
029427903/07/28 02:04ID:???
>>292
そっちの方がカコイイ!!ありがとう

>>293
最適化されてしまった...
table.keys.join('|')って汎用的でおもしろいアイデアですね。ワラタ

おもしろいなRuby
0295nobodyさん03/07/28 22:58ID:???
> 294
キーが正規表現含むとおかしくなるから
quoteしたほうがいい

pattern = Regexp.compile(table.keys.collect {|key| Regexp.quote(key) }.join('|'))
029627903/07/29 00:45ID:???
>>295
いやぁ、やりたかったことは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")
029727903/07/29 00:53ID:???
>検索でヒットするパターンが多いからちょっと連想配列は使えないかも。

検索速度がorでつなげるより速そうだから [<%][%>]=? なんてしてるんですが
よく考えたらパターンは <%、%>、<%=、%>=、>%、%<、>%=、%<= の8通りだけだから連想配列の方が良いか
まあいいや、ERBとかいうのを使おう...。スレ汚しすんまそん。ハァ
0298nobodyさん03/07/29 00:57ID:???
ちなみに erb は Ruby 1.8 からは標準添付だ。
0299nobodyさん03/07/29 04:29ID:???
>>295
それじゃ自分で正規表現を指定できないではないか
0300nobodyさん03/07/29 23:02ID:SXyppRH6
CGI::Sessionを用いてセッション管理をしようと思うのですが、

利用しなくなったセッションファイルを自動で消去することは
できないんでしょうか?

ある本をよんだら、CGI::Session.sweep()を使うと書いてあった
のですが、エラーが出て使えません。
0301nobodyさん03/07/30 03:09ID:???
>>300
> ある本をよんだら、CGI::Session.sweep()を使うと書いてあった

sweepの定義はその本に書いあるのだと思われ。

利用しなくなったかどうかの判断基準は利用者によって異なる。
だから、一般的な方法は存在しない。
■ このスレッドは過去ログ倉庫に格納されています