トップページ⇒tech
983コメント375KB

Ruby 初心者スレッド Part 41

■ このスレッドは過去ログ倉庫に格納されています
0001京 ◆SsSSsSsSSs 2011/02/10(木) 13:47:51
プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。

★注意★ Ruby 1.9.2 は初心者には若干時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
 文字エンコーディング等の外部基礎知識が必要な上、不完全対応の第三者ライブラリでの問題の切り分けが手間です。
 迷う点の少ない1.8.7に習熟→おもむろに1.9.2の変更点のみ重点学習、とすればスムーズに移行できるでしょう。

関連スレやURLは>>2-5あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。

■質問する人へ
質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。
 ・エラーメッセージの共通そうな部分やエラーの出るモジュール名でググる
 ・マニュアルで引っかかったクラスの記述を探す http://www.ruby-lang.org/ja/man/
 ・FAQを一応読む http://www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ
質問には以下を書くこと。へたくそな質問は再提出を要求される。
 ・最終的にやりたいこと(もっとよい方法がある場合が多いので)
 ・エラーメッセージ(自力で訳さずなるべくそのままで)
 ・詳しい内容(「動きません」「うまくできません」では回答しようがない)
 ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる))
回答してくれた人には「ありがとう」のひとことをいってあげて。

■回答する人へ
相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。
それができないならこないこと(だって初心者スレだもん)。
 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。
 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0596デフォルトの名無しさん2011/03/30(水) 18:24:59.21
>>593
HTTPレスポンスとしてはどういうものを返しているの?
ちゃんと200が返るようになってるの?
0597デフォルトの名無しさん2011/03/30(水) 18:34:44.13
>>594
確か自分も以前そのやり方でやろうとしていたんですが、
そのやり方でのユーザ名とパスワードの設定方法が
わかんなくて今のやり方に行き着いたような気がします。
でも、他のやり方を探してみるのはありですね。
ちょっとやってみます。ありがとうございます。

>>596
ありがとうございます。
正しいやり方なのかどうかはわからないのですが、
先ほどのスクリプトの末尾に

print "Content-Type: text/html\n\n"
print "OK"

のようにやってみたりはしました。
我流?というか常識的なところを理解してません、
正しいやり方を教えていただけるとありがたいです。
0598デフォルトの名無しさん2011/03/30(水) 19:26:05.15
>>593
>上記のフォームを実際に使用してみると Internal Server Error と表示されてしまいます。
うん、

……ってそれで終わりかよ!
Internal Server Error ってことは Apache のログにエラーの出力があるだろそれ読めよ!
0599デフォルトの名無しさん2011/03/30(水) 19:40:55.23
思いっきり補完すると
「ローカルで問題なく動作するスクリプトをサーバに設置するとなぜか動作しません」
なわけで、そりゃサーバ側の環境が悪いんじゃないん、というお話に

HTTP サーバのエラーログあたりに原因究明の鍵というかそのまま答が表示されてるはずなんだけど
たぶんそれを読む権限がなく、HTTP サーバがどうやって Ruby を実行してるか調べることもできないと推測
おまけにそれの原因は >>593 に書いたスクリプト以外の部分にあると

$SAFE=1 と先頭に書いた上でローカルでスクリプト実行してたらなにか warning が出るかも
CGI がファイル作成できるのなら、$stderr を捻じ曲げてファイル出力にしてサーバ実行するとなにか書いてあるかも
$stderr = File.open('error.txt') と先頭に書いて error.txt を実行後に読んでみるとか
0600デフォルトの名無しさん2011/03/30(水) 19:43:24.33
× $stderr = File.open('error.txt')
○ $stderr = File.open('error.txt', 'w')
0601デフォルトの名無しさん2011/03/30(水) 20:08:26.76
>>595
消えろカス
0602デフォルトの名無しさん2011/03/30(水) 20:13:13.99
>>601
今のところレスしたのお前だけだぞ
0603デフォルトの名無しさん2011/03/31(木) 09:58:02.54
>>598 >>599 >>600
ありがとうございます!
ご教授いただいたとおりにやってみましたので報告致します。

まずは Apache のエラーログを見てみました。
が、以下のように表示されているだけでした。
Premature end of script headers:test.rb, referer: http://foo/bar.html
とりあえずここに有益な情報はないと判断しました。

つぎに「HTTP サーバがどうやって Ruby を実行してるか調べることもできない」という部分ですが、
具体的に何をどうすればよいのかがわからなかったので保留させていただきました。

つぎに「先頭に」$SAFE=1 と $stderr = File.open('error.txt', 'w') を書き足した上で、
ローカルでスクリプトを実行してみました。
この「先頭に」の位置ですが、

#!/Ruby/bin/ruby.exe
# -*- coding: utf-8 -*-.
(ここ)
require "rubygems"
require "cgi"
require "tmail"
require "net/smtp"
と判断しました。
0604デフォルトの名無しさん2011/03/31(木) 10:03:35.76
再度ローカルにてスクリプトを実行した結果、出力されたエラーは以下のとおりでした。

C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/defaults.rb:43:in `exist?': Insecure operation - exist? (SecurityError)
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/defaults.rb:43:in `default_path'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:726:in `path'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:57:in `installed_spec_directories'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:47:in `from_installed_gems'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:1025:in `source_index'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/gem_path_searcher.rb:135:in `init_gemspecs'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/gem_path_searcher.rb:14:in `initialize'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:984:in `new'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:984:in `searcher'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems.rb:206:in `try_activate'
from C:/Ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:57:in `require'
from test.rb:9

ちなみに require 以下に $SAFE=1 と $stderr = File.open('error.txt', 'w') を書き足した場合は
特にエラーは出力されませんでした。
0605デフォルトの名無しさん2011/03/31(木) 10:26:10.68
一番肝心な「エラー出力先をファイルにした上でサーバで実行」がないぞ
ローカルで$SAFEを上げて実行してセキュリティエラーが出るのはそりゃ当たり前

というか、もしかして>>596の言うように HTTP としてのレスポンスが何もないだけなんじゃ…
CGI なんだから、リクエストに対して返すレスポンスのステータスが空文字列だとまずい
適当な「メール送信しましたありがとうございます」なHTMLを返すとかにしておけ
0606デフォルトの名無しさん2011/03/31(木) 10:31:16.38
こういうときのステータスって201?
0607デフォルトの名無しさん2011/03/31(木) 10:37:20.29
>>606
「○○さんありがとう! トップに戻る」というカスタムなHTMLを返したいなら200
ブラウザ真っ白の空っぽのボディでいいなら201か202
静的な「ご利用ありがとうございました.html」に飛ばすだけなら302
0608デフォルトの名無しさん2011/03/31(木) 11:01:13.61
>>605
申しわけありません、報告し忘れていました。
サーバ上で実行=ブラウザでアクセス と思ってよろしいでしょうか??
もしそうであればファイル error.txt に出力された内容は、上記のエラー内容と全く同じでした。

レスポンスに関してなのですが >>597 で書いたようにこのスクリプトの末尾に
print "Content-Type: text/html\n\n"
print "OK"
や
header = cgi.header({"charset"=>"Shift-JIS"})
puts header
puts <<-EOS
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=Shift-JIS'/>
<meta http-equiv='Content-Language' content='ja'/>
<title>test</title>
</head>
<body>
<p>OK</p>
</body>
</html>
などとやってはみているのですが、現状うまくいっておりません。
なにか間違っているのでしょうか??
0609デフォルトの名無しさん2011/03/31(木) 11:08:14.44
サーバ上で$SAFE=1にしても同じなのは当然だろ…
0610デフォルトの名無しさん2011/03/31(木) 11:24:53.15
わかってない人同士が混乱してるなw

CGI は HTTP レスポンスを「返さなければならない」
200 でいいから返しておけ
返し方わからないなら今日は作るの諦めろ

サーバの CGI が $SAFE=1 で実行されている場合、
PATH がワールドに対して読み書き可能になっていると、
require でセキュリティエラーが出ることがある
ttp://www.ruby-lang.org/ja/man/html/_A5BBA5ADA5E5A5EAA5C6A5A3A5E2A5C7A5EB.html
gem の変数が環境変数由来なので、たぶんここでもセキュリティエラーが出る可能性がある
warn $SAFE をどっかに書いてサーバで実行して値確かめて、0以外が表示されたら $SAFE が原因

スクリプトの本体は実行されてるそうなので、最終的な HTTP レスポンスをうまく返せてない説に一票
NPH で実行されてて、自前で HTTP ステータスを書き出さないといけないのだろう

print "HTTP/1.1 200 OK\r\n"
print "Content-Type: text/html\r\n\r\n"
print "<html>done.</html>"
0611デフォルトの名無しさん2011/03/31(木) 11:41:15.72
そもそもCGIでページを表示させるのはできてるの?

cgi = CGI.new
cgi.out({"type" => "text/html", "charset" => "shift_jis"}) {
<<END
あばば
END
}

メールと組み合わせず、まず表示だけやってみたら?
0612デフォルトの名無しさん2011/03/31(木) 12:09:20.80
>>611
ありがとうございます、表示はできています。
>>593 の
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.sendmail(mail.encoded, mail.from, mail.to)
}
のところをコメントアウトして、代わりに >>611 のような適当な HTML を
表示させるような命令を書けば普通に表示されます。

なので >>610 の NPH で〜というのも恐らく違うのではないかと思います。
実際に「自前で HTTP ステータスを書き出す」というやつも試してみましたが、
うまくいきませんでしたし…。

>>610 さん、本当にありがとうございます。
先ほどからお話にあがっている $SAFE というものについて調べてみようと思います。
0613デフォルトの名無しさん2011/03/31(木) 12:19:12.13
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
}

これだけにしてうまくいってる?startのパラメータは正しい?

> のところをコメントアウトして、代わりに >>611 のような適当な HTML を

そもそも、コメントアウトしたらまずいんじゃない?
なんらかの表示をさせてる?
なんらかの表示をさせなきゃ、
Premature end of script headers:test.rb,
って出るのも当然かも。
0614デフォルトの名無しさん2011/03/31(木) 12:45:45.41
>>613
>>611 で「メールと組み合わせず、まず表示だけやってみたら?」とのことだったので、
「表示だけなら出来てますよ」と回答したつもりだったのですが…。
もしずれたことを言っていたら申し訳無いです…。

Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
}
これだけにしてうまくいってる?startのパラメータは正しい?

というのは、
smtp.sendmail(mail.encoded, mail.from, mail.to)
を外したら表示がうまくいくかということでしょうか??
とりあえずやってみましたが表示はうまくいきません。

パラメータに関してですが、いちおうメールの送信は正常に出来てはいますので、
今のところは正しいのではないかと判断しています。
わたしの未熟さゆえ、アドバイスの意味が理解出来ていない可能性がありますが、
ありがとうございます。
0615デフォルトの名無しさん2011/03/31(木) 12:52:09.51
> パラメータに関してですが、いちおうメールの送信は正常に出来てはいますので、

なるほど。Net::SMTP.startのブロックは正しく動いてると。

> >>611 で「メールと組み合わせず、まず表示だけやってみたら?」とのことだったので、
> 「表示だけなら出来てますよ」と回答したつもりだったのですが…。

いえ、それについてはこちらが早とちりしたかも。うん、了解。テスト了解、その次の話。

一般的に、エラーメッセージを得たら、それをコピーしてそのままぐぐりって学ぶのが正解。
Premature end of script headersでぐぐったらいっぱい情報を得れると思う。

 メッセージの意味
 cgiプログラムがContent-Type ヘッダを出力する前に終了した

だから、メール送信をさせようとしたときも、なんらかの出力をして、
そのうえでスクリプトが終わるようにしないといけないんでは? という話。
0616デフォルトの名無しさん2011/03/31(木) 12:58:12.62
>>610
再度ご報告。
スクリプトのいろんな箇所に warn $SAFE と書いて
実行してみましたが error.txt に出力されたのは 0 のみでした。
(いちおう申告、先頭の $SAFE=1 はコメントアウトしました)

ありがとうございます。
0617デフォルトの名無しさん2011/03/31(木) 12:59:11.91
>>613の1段落目と2段落目は別の話だな
>>610にもあるが、CGI は HTTP のレスポンスを絶対に返さなければならない
「メール送るだけの CGI だからメールだけ送って終わり」ということはできない
Web ブラウザ経由で指示をしたなら、なんらかの返事をブラウザへ返さないと Web サーバはエラーとみなす

"Premature end of script headers" と Web サーバに記録されるエラーは典型的で、
・ Web ブラウザに返す返事の(HTTP 1.1/200 OK 等の)前に CGI がエラーや警告を出して混ざってわけわかめ
・ Web ブラウザに返す返事が、そもそも HTTP ステータスすら 1文字もない
のどちらかのときによく起こる
絶対に後者ではないという確証が得られてから、前者の CGI 本体のエラー潰しをする

HTTP 1.1/200 OK だの Content-Type: text/html だの、cgi.out だのの表示をしろというのは症状チェック用ではない
そもそもの CGI 動作に必須なものだ
0618デフォルトの名無しさん2011/03/31(木) 15:09:53.83
>>615 >>617
ありがとうございます。
誤解を与えてしまっていたようで申しわけありません。
たぶん私が「200 を返す」が何を指しているのか、
はっきり確信出来ていなかったのが原因なのではないかと思います。

テスト用などではなく、必須という認識は一応あるので、スクリプトの末尾には必ず
「HTTP 1.1/200 OK だの Content-Type: text/html だの、cgi.out だの」は表示しています。
わたしの最初の書き込みが >>593 なのですが、このソースの直後に

print "Content-Type: text/html\n\n"
print "<html>OK</html>"

のように必ず書いています。

現在の状況を私の見解でまとめてみます。
上記の「200 を返す」文を加えたソースを使用しても、
メールは飛ぶのですがブラウザには Internal Server Error と表示されます。
エラーの内容は Premature end of script headers です。
メールは飛ぶのでメールのところのプログラムは正常なのかな、と思いたいのですが
>>612 に書いたようにメールの部分3行をコメントアウトして実行すると、
当然メールは飛ばないのですがページ(<html>OK</html>)は表示されます。

メール部分は正常に動いているように思えるのに、疑わしいのもメール部分なのかな…
と、勝手に思っております。みなさま、どう思われるでしょうか?
0619デフォルトの名無しさん2011/03/31(木) 15:20:19.72
なるほど。メール部分三行を生かすと、ページは表示されないと?
メールを送ったあとにスクリプトが異常終了してるのかな?

begin
 メール部分三行
rescue => exc
 print "Content-Type: text/html\n\n"
 print "<html>#{exc}</html>"
end

みたいに一度してみたら?


0620デフォルトの名無しさん2011/03/31(木) 15:49:45.88
>>619
ありがとうございます。
試してみたのですが変わらず…です。
うーん…。
0621デフォルトの名無しさん2011/03/31(木) 16:21:02.69
>>619 で「メールを送ったあとにスクリプトが異常終了してるのかな?」と言われた件を検証してみました。
と言っても

begin
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail.encoded, mail.from, mail.to)
}
rescue => exc
print "Content-Type: text/html\n\n"
print "<html>#{exc}</html>"
end
print "Content-Type: text/html\n\n"
puts <<-EOS
<html>
<body>
<p>OK</p>
</body>
</html>
EOS


としただけなのですが。
結果、一度の実行で2通メールが送られてきました。
どういうことなのでしょうかw もう謎が深まるばかりです…。
0622デフォルトの名無しさん2011/03/31(木) 17:02:22.52
二通?? えーっw

print "Content-Type: text/html\n\n"
s = 'OK'
begin
Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail.encoded, mail.from, mail.to)
}
rescue => exc
s = exc.inspect
ensure
puts <<-EOS
<html>
<body>
<p>OK</p>
</body>
</html>
EOS
end

みたいにしてContent-Typeを必ず出してみるとか。

0623デフォルトの名無しさん2011/03/31(木) 17:03:03.39
おっと。

<p>#{s}</p>

で。
0624デフォルトの名無しさん2011/03/31(木) 17:09:47.00
>>622
あ、すみません。

begin
 Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
  smtp.send_mail(mail.encoded, mail.from, mail.to)
 }
rescue => exc
 print "Content-Type: text/html\n\n"
 print "<html>#{exc}</html>"
end

Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
 smtp.send_mail(mail.encoded, mail.from, mail.to)
}

print "Content-Type: text/html\n\n"
puts <<-EOS
<html>
<body>
<p>OK</p>
</body>
</html>
EOS

の間違いでした。
もしメールを送信した直後に異常終了してるなら、
2回目の送信が行われるわけないと思ったわけです。
0625デフォルトの名無しさん2011/03/31(木) 17:17:34.61
>>622
うーん、試してみたがやはりだめです…。
なんども申し訳ない。ありがとうございます(涙)
0626デフォルトの名無しさん2011/03/31(木) 18:25:51.18
ところで
print "Content-Type: text/html\n\n"
って\nだけでいいの?
\r\n\r\nじゃないのかな

WindowsでRubyで遊んでるだけの私にはWebサーバーのことはよくわからんけど
OSとかWebサーバーが何なのかとか、手元にサーバーがあるのかとか
サーバーの環境をもっと詳しく書かないとアドバイスしにくいんじゃないのかな
0627デフォルトの名無しさん2011/03/31(木) 19:15:38.80
>>610,617
200 OKはWebサーバ側で勝手に付け加えてくれるよ
もしCGIスクリプト側でつけるのが必須なのであれば

print "Content-Type: text/html\n\n"
print "<p>hello, ruby cgi!</p>"

すら動かない

>>626
ApacheならLFしかなくてもCR LFに直してくれるよ
他も似たようなものじゃないか
0628デフォルトの名無しさん2011/03/31(木) 20:16:53.66
content-type出力の前後でerror.txtに何かメッセージを出力してみたら?
0629デフォルトの名無しさん2011/03/31(木) 20:31:18.82
ところで>>624を見る限り2通送られるのは正常じゃないか
メール送信処理がふたつ書いてあってどっちも実行されてるんだろうから

1通だけ送りたいのなら2番目のNet::SMTP...を削れば済むような
0630 忍法帖【Lv=5,xxxP】 2011/03/31(木) 20:35:18.06
というわけでこんな感じか

begin
 Net::SMTP.start(host, port, "localhost.localdomain", user, pass, "login"){|smtp|
  smtp.send_mail(mail.encoded, mail.from, mail.to)
 }
 print "Content-Type: text/html\n\n"
 print "<p>OK</p>"
rescue => exc
 print "Content-Type: text/html\n\n"
 print "<p>exception raised</p>"
end
0631デフォルトの名無しさん2011/03/31(木) 20:47:21.59
てゆーか、実行の余分なコストはゼロなんだろうし、
エラーが出なくなるまでスクリプトの内容削っていけばいいのに
もし10行くらいになってもエラーが消えなければ、個人情報がない範囲でスレに書け
0632デフォルトの名無しさん2011/03/31(木) 21:17:45.71
>>629
もしメールを送信した直後に異常終了してるなら、
2回目の送信が行われるわけないと思ったわけです。
0633デフォルトの名無しさん2011/03/31(木) 21:50:46.00
>>632
なるほど了解
ただ>>624だと一回目のメール送信直後に例外が発生した場合にややこしい

とりあえず確認すべきはprint "Content-Type: text/html\n\n"の前に
標準出力に何か出力していないかどうか。あとは>>631の言う通り
0634デフォルトの名無しさん2011/04/01(金) 09:52:59.91
            )
             (
         ,,        )      )
         ゙ミ;;;;;,_           (
          ミ;;;;;;;;、;:..,,.,,,,,
          i;i;i;i; '',',;^′..ヽ
          ゙ゞy、、;:..、)  }
           .¨.、,_,,、_,,r_,ノ′
         /;:;":;.:;";i; '',',;;;_~;;;′.ヽ
        ゙{y、、;:...:,:.:.、;:..:,:.:. ._  、}
        ".¨ー=v ''‐ .:v、,,、_,r_,ノ′
       /;i;i; '',',;;;_~⌒¨;;;;;;;;ヾ.ミ゙´゙^′..ヽ 
       ゙{y、、;:...:,:.:.、;、;:.:,:.:. ._  .、)  、}
       ".¨ー=v ''‐ .:v、冫_._ .、,_,,、_,,r_,ノ′
      /i;i; '',',;;;_~υ⌒¨;;;;;;;;ヾ.ミ゙´゙^′.ソ.ヽ
      ゙{y、、;:..ゞ.:,:.:.、;:.ミ.:,:.:. ._υ゚o,,'.、)  、}
      ヾ,,..;::;;;::,;,::;):;:;:; .:v、冫_._ .、,_,,、_,,r_,ノ′

0635デフォルトの名無しさん2011/04/01(金) 09:59:52.63
みなさんありがとうございます。

>>631 >>633
10行にはならなかったんですが、スクリプトの頭からお尻までが↓です

#!/Ruby/bin/ruby.exe
# -*- coding: utf-8 -*-.

require "rubygems"
require "cgi"
require "tmail"
require "net/smtp"

mail = TMail::Mail.new
mail.to = "[email protected]"
mail.from = "[email protected]"
mail.subject = "test title".tojis
mail.date = Time.now
mail.mime_version = "1.0"
mail.set_content_type "text", "plain", {"charset"=>"iso-2022-jp"}
mail.body = "test body".tojis

Net::SMTP.start("foo.bar.jp", 25, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail.encoded, mail.from, mail.to)
}
print "Content-Type: text/html\n\n"
print "<html>OK</html>"
0636デフォルトの名無しさん2011/04/01(金) 10:05:53.04
>>626
ありがとうございます、たしかにそうかもしれません。
環境は

OS は Windows7 の 64bit
サーバーは Apache 2.2.16 (Win32)
Ruby のバージョンは 1.8.7

自分の PC に Apache インストールしていろいろやってるかんじです。
よろしくおねがいします。
0637デフォルトの名無しさん2011/04/01(金) 10:17:02.05
メールは tmail を使用する必要は必ずしもない
これだと rubygems と tmail が不要になる
cgi ライブラリも使用してないようなので外した
これで駄目な場合は…

#!/Ruby/bin/ruby.exe
# -*- coding: utf-8 -*-.
require "net/smtp"

from = "[email protected]"
to = "[email protected]"
mail_body = <<EOM
Date: Fri, 1 Apr 2011 10:03:27 +0900
From: #{from}
To: #{to}
Subject: test title
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp

test body
EOM
Net::SMTP.start("foo.bar.jp", 25, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail_body, from, to)
}
print "Content-Type: text/html\n\n"
print "<html>OK</html>"

というか外部にSMTP接続してるのね
Net::SMTP ってなにか警告出すことってあったっけ
0638デフォルトの名無しさん2011/04/01(金) 11:21:46.50
>>637
ありがとうございます。
試してみましたが、やはりうまくいきません。
今までと同じでメールは送信されるのですが、ページが表示されません。

プログラム云々ではなく、環境の問題なのでしょうか…?
0639デフォルトの名無しさん2011/04/01(金) 11:39:11.44
>cgi ライブラリも使用してないようなので外した
今回は頼ったほうがいいような気がする

ていうか
print "HTTP/1.1 200 OK\r\n"
は書いても害はないだろ
サーバ設定上不要だったら最初から全体がテキストとして余分に表示されるだけだ
そのとき改めて外せばいい
0640デフォルトの名無しさん2011/04/01(金) 11:46:02.15
>>635の最初と最後の二行ずつだけにしたスクリプトがエラーになるなら
ruby.exe の場所間違ってるか apache の設定じゃないかな
0641デフォルトの名無しさん2011/04/01(金) 12:38:18.11
>>640
>>612 に書いたようにメールの部分3行をコメントアウトして実行すると、
当然メールは飛ばないのですがページ(<html>OK</html>)は表示されます。
0642デフォルトの名無しさん2011/04/01(金) 12:45:46.89
>>635
メール送信を、表示のあとにもってきたら?
0643デフォルトの名無しさん2011/04/01(金) 13:04:28.21
>>641
CGIスクリプトとしてではなく単にコマンドラインから
C:\>ruby >>637のスクリプト.rb
とかしたらどうなるか試してみた?
0644デフォルトの名無しさん2011/04/01(金) 15:24:22.34
>>642
うーん、それでもだめでした…。
ありがとうございます。

>>643
はい、それだとエラーも出ずうまくいきます。
ありがとうございます。
0645デフォルトの名無しさん2011/04/01(金) 15:30:16.02
windowsです
gemでインストールしたライブラリってどこのフォルダにインストールされるのですか?
0646デフォルトの名無しさん2011/04/01(金) 16:39:50.13
>>645
ruby -rubygems -e "p Gem.dir" で表示されたディレクトリの中
cache/ と doc/ と gems/ と specifications/ の4つのディレクトリを(通常は)すべて使う
0647デフォルトの名無しさん2011/04/01(金) 16:40:58.07
>>646
ありがとうございます
確認dけいました
0648デフォルトの名無しさん2011/04/01(金) 17:08:18.64
おなかすいた

#!/Ruby/bin/ruby.exe
# -*- coding: utf-8 -*-.

from = "[email protected]"
to = "[email protected]"
mail_body = <<EOM
Date: Fri, 1 Apr 2011 10:03:27 +0900
From: #{from}
To: #{to}
Subject: test title
Mime-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp

test body
EOM
@error = []
begin
require "net/smtp"
Net::SMTP.start("foo.bar.jp", 25, "localhost.localdomain", user, pass, "login"){|smtp|
smtp.send_mail(mail_body, from, to)
}
rescue Exception => ex
File.open('smp_error.txt', 'w'){|f| f.puts ex.backtrace }
@error << ex.backtrace
end
print "HTTP/1.1 200 OK\n"
print "Content-Type: text/plain\n\n"
puts @error
0649デフォルトの名無しさん2011/04/01(金) 17:13:33.58
>>644 です
問題がすべて解決したわけではないのですが、大きな進展がありましたのでご報告致します。

今まで Windows 7 上で Apache2.2.16 / Ruby 1.8.7 を動かして開発をしてきたのですが、
今回手元にあった Windows XP に Apache2.2.17 と Ruby 1.8.7 をインストールし、
問題のスクリプトを実行してみたところ、正常に HTML のページが表示されました。

何が原因なのかは依然わかりませんが、皆さまのご協力のおかげで解決に一歩近づけました。
ありがとうございます、心より感謝致しております。
0650デフォルトの名無しさん2011/04/01(金) 17:20:58.00
というかwindows用apacheって都市伝説かと思ってた。
実際に動かしている人がいるとは驚きだ。
0651デフォルトの名無しさん2011/04/01(金) 17:43:50.18
>>648
できるのであればなにかごちそうしたいです。
ありがとうございます。

実行してみたのですが 7 でも XP でも動作しませんでした。
ただし XP の方では

print "HTTP/1.1 200 OK\n"

この行を削除すると正常に動作し、ページも表示されました。
また、どちらの OS でも smp_error.txt というファイルは作成されませんでした。

>>650
Windows での情報が少ないな、とは思っていたのですがやはりそうなんですね。
ちょうどいろいろ不便で、限界を感じていたところだったので、
土日を利用して CentOS で環境を構築してみようかと思います。
0652デフォルトの名無しさん2011/04/01(金) 19:47:52.10
SMTP.startだけやってsmtp.send_mailしないとどうなる?
0653デフォルトの名無しさん2011/04/01(金) 19:57:00.25
ブロックの有無にかかわらず、HELO だけして接続を終了する
接続そのものは行われるので、変な接続先やパスワードを設定するとエラーが出る
0654デフォルトの名無しさん2011/04/01(金) 19:59:59.90
>>651
CentOSでRuby使うのだけはやめておけ

というかわざわざCentOS使う人が多いのはなんで?
0655デフォルトの名無しさん2011/04/01(金) 20:04:55.98
RedHat厨の残党では?
0656デフォルトの名無しさん2011/04/01(金) 20:09:32.19
CentOS自体は悪いもんじゃない
パッケージのRubyが5年前の不安定版のままなだけ
0657デフォルトの名無しさん2011/04/01(金) 20:11:19.04
ソースからいれてるけどそれでもダメなの?
aptとかyumとかそんなの一切使わないけど
0658デフォルトの名無しさん2011/04/01(金) 20:14:32.26
>>652
おなじです。表示までいかないです。

>>654
あ、そうなんですね。ありがとうございます。
逆にこれがおすすめってのありますか?

>>657
自分もそうしようとしてました。これ参考にしたらいけるのかなーって。
http://d.hatena.ne.jp/rx7/20100611/p1
0659デフォルトの名無しさん2011/04/01(金) 20:15:38.19
>>652は>>651宛てだぞ>>653よ
0660デフォルトの名無しさん2011/04/01(金) 20:16:18.48
普通はソースからコンパイルしてインストールしたりしません
特に初心者は

新しい言語環境試すのにとりあえず最新版をコンパイルしてホームにインストールとかするのはマニアだけです
0661デフォルトの名無しさん2011/04/01(金) 20:21:23.27
どんだけ初心者かにもよるよな
Linuxもプログラミングもはじめてでちゅこんぱいるってなに、という人には勧めないが、まあ、そんな程度だ
0662デフォルトの名無しさん2011/04/01(金) 20:27:57.48
普通はソースから入れるものだろ
まあ趣味の世界でしかrubyを動かす事のない人にはパッケージで管理してればいいよ
0663デフォルトの名無しさん2011/04/01(金) 20:40:43.62
Rubyにおける「普通の環境」って何よ
個人的には普通なんて存在しないと思うよ
0664デフォルトの名無しさん2011/04/01(金) 21:48:09.19
>>663
現時点でならRVMだな!
0665デフォルトの名無しさん2011/04/02(土) 16:09:15.09
松本尊師はデビアン使ってたはず。尊師と同じ環境じゃないと解脱出来ないだろうね。
0666デフォルトの名無しさん2011/04/02(土) 16:11:05.27
rubyをCみたいにコンパイルして利用する事はできますか?
PHPやPERLやPYTHONでは出来るのですがRubyではあまり聞かないので
0667デフォルトの名無しさん2011/04/02(土) 16:20:32.35
>>666
「コンパイル済み」の状態のバイナリを持ち歩くことはできない

Ruby実行環境ごとひとつのexeファイルにまとめてスクリプトを実行することはできる
0668デフォルトの名無しさん2011/04/02(土) 17:42:38.81
いぐざーぶとかまだ開発してるのかな。
0669デフォルトの名無しさん2011/04/02(土) 19:27:42.05
Ruby始めようとサイトいったんだけど、英語版が充実しててワロタ
Try Ruby 日本語サイトにも置いといてくれよ
0670デフォルトの名無しさん2011/04/02(土) 21:04:47.20
exerbは開発進んでるけど、Ruby 1.9.xにはまだ未対応ぽい
個人的にはそれで困ったことはないが
0671 ◆LLLLLLLLL. 2011/04/03(日) 09:35:49.67
| ̄:/ : : /: : : : : : : :i: : : i: :\ : :\    \
|: / : : : / : : : : :.i: : : : |: : : :|: : : |: : : i     '
: :|: : : : |: : i: : : :|: : : /i|: : :|:| : : :|: : : |     |
: :|: : : : |: :.|:斗 十‐/ i|: :∧-‐ト|: : : |     |
: :|: : : : |イ|: :|:/ |:/   |:/ |ハ: : |: : : |  \_,ノ
: :|: : : : | レヤ示ト     rテv|:./|: : : :|
ヽ|: : : : |/{:::::::i }     トイ レ: :|/|/   関東地方 
( |: : : : 代c::ノソ     レリ |: : : : |       東北地方 北海道地方
.〈.|: : : : |x`¨       、¨x.|: : : i:|    にいる
\|i: : : :|        ,   /|: : : i:|      すべての 愛すべき 国民へ 告ぐ
∨リ\: :iト 、      `´ ィ  |: : /|リ      
‐┴―\|- 〈 >rァ 爪|V  |/
:::::::::::::::::::::::ヽ \ リ
::::::::::::::::::::::::__\
:::::::::::::::/ ::r――‐へ      rっr‐-、_
:::::::::/ :://      ∧. | ̄ ̄ ̄| | | | | ̄ ̄ ̄ ̄ ̄ ̄ ̄|..
:::/ ::/ /          ヽ|.    L|_|_ト'           |
/ ::::/  /         \   ただちに 逃げろ    |
. :::/ |/           |                 |
0672デフォルトの名無しさん2011/04/03(日) 20:20:05.21
MacO
0673デフォルトの名無しさん2011/04/03(日) 20:41:41.53
コンソールから年代を入力し, 入力された年代の天気のデータが記載されたhtmlページを取得, 保存したいと思っています
例えば, ( http://weather.jp/XXXX.html ) というページの, 2010年のhtmlを保存( 2010.txt )しようとした場合,


year = gets().to_i
output_file = File.open( )
open( )
・
・
・
となると思います


これらの File.open( )と open( ) には どのように記述すればよいでしょうか?

今回の場合,
File.open の中には ("2010.txt" , "w") , open の中には ("http://weather.jp/2010.html") が最終的に入力されれば良い, ということは分かりますが
数字が変数に代入されている場合どのようにして記述してやればいいのでしょう?
0674デフォルトの名無しさん2011/04/03(日) 20:50:41.10
Rubyの基本動作の解説をどっかで読んだほうがいいと思うぞ
StringとArrayとHashの3つだけ眺めてわかった気になるだけでもかなり違う

で、文字列の中に変数(やメソッド返り値)の結果を埋め込むには
文字リテラルを "" で囲って作った上で #{ } を使う

year = 2010
path =
0675デフォルトの名無しさん2011/04/03(日) 20:52:44.84
year = gets.to_i
"http://weather.jp/#{year}"
"http://weather.jp/%d" % year

あとruby getweather.rb 2011とかしてコンソールから起動する場合は
コマンドライン引数2011をARGV[0]で取れるよ
0676デフォルトの名無しさん2011/04/03(日) 21:00:16.67
がーん、TabとEnterがほぼ同時に押ささった(北海道弁)
>>674続き

year = 2010
path = "#{year}.txt"

とすると、path は "2010.txt" になる
あと、かんたんスクリプトの作り方として、外部入力確定は後回しにしたほうがいいと思うぞ

year = 2010 # あとで外部入力にする
url = "http://weather.jp/#{year}.html"
path = "#{year}.txt"
html = open(url).read
File.open(path, 'w'){|f| f.print(html)}

とかやって、2010.txt がうまく書き込まれるようになってからおもむろに year をなんとかする
0677デフォルトの名無しさん2011/04/03(日) 21:08:40.86
>>674-676
…どうやらとても基本的なことを学び足らなかったようですね…
課題に向かうときは簡単な土台から積み上げていくテクニック おっしゃるとおりです

もう少し下積みしてからもう一度挑戦したいと思います. ありがとうございましたm(_ _)m
0678デフォルトの名無しさん2011/04/04(月) 05:25:55.51
open( )でurlまで開けるの?知らなかった
0679デフォルトの名無しさん2011/04/04(月) 05:30:36.59
通常は開けない
require 'open-uri' として open メソッドを書き換える必要がある
open の引数の信頼性に注意
0680デフォルトの名無しさん2011/04/04(月) 12:48:59.07
>>663
Rubyにおける「普通の環境」=rvm
0681デフォルトの名無しさん2011/04/05(火) 01:16:21.14
rubyでipadのアプリを開発しようと思ったが、
Rhodes + Macが無いと無理なんでしょうか?

どうも解説ページが少なくてわからない・・・。
0682デフォルトの名無しさん2011/04/05(火) 03:12:07.44
ruby+cocoaみたいなののipad,iphone版みたいなフレームワークってないよね。
0683デフォルトの名無しさん2011/04/05(火) 04:50:03.97
自作ライブラリで open(path){|f| f.read} にするか File.open(path){|f| f.read} にするかは結構迷う
0684デフォルトの名無しさん2011/04/05(火) 09:15:46.40
>>683
なんで?
0685デフォルトの名無しさん2011/04/05(火) 16:36:21.75
>>684
>>679でわかるようにKernel#openは書き換えられてるかもってことでは?
0686デフォルトの名無しさん2011/04/05(火) 21:27:18.56
>>682
そっか、ないんですね・・・。

世の中のipadアプリケーションエンジニアは
みんなMac持ちなのか・・・?
0687デフォルトの名無しさん2011/04/05(火) 22:26:39.05
少なくとも、Rubyでどうにかしようと思ってる人はいないと思う
データ関連いじるならまだしも
0688デフォルトの名無しさん2011/04/06(水) 01:04:18.28
>>686
WebアプリならiPadに最適化されたUIにする手もあるがネイティブアプリを開発したいんだよな

> 世の中のipadアプリケーションエンジニアは
> みんなMac持ちなのか・・・?

もしそこに気付けなかったのならiPadでの開発はやめておいた方がいいかもしれない
0689デフォルトの名無しさん2011/04/06(水) 08:37:45.89
vm使えばええやん
0690デフォルトの名無しさん2011/04/06(水) 08:59:19.72
l.callで呼び出せる理由はなんとなくわかるのですが、l[]で呼び出せる理由がわかりません。
何故関数が呼び出されるのでしょうか?

irb(main):001:0> l = lambda{puts "lambda"}
=> #<Proc:0x00007ff619093dc0@(irb):1>
irb(main):002:0> l.call
lambda
=> nil
irb(main):003:0> l[]
lambda
=> nil
0691デフォルトの名無しさん2011/04/06(水) 09:08:25.40
[]をcallと同等にした理由は、見かけが()に似ているから。
0692デフォルトの名無しさん2011/04/06(水) 09:38:55.16
>>690
単なる.call()の略記法としてそういうメソッドが定義されてるだけ
本当は()にしたかったんだろうけど、言語仕様的に無理があるんで
それっぽい表記で、かつメソッドとして有効な名前として[]が選ばれた
06936902011/04/06(水) 09:50:05.74
>>691-692

勉強になりました。
ありがとうございました。
0694デフォルトの名無しさん2011/04/06(水) 12:47:49.62
>>693
今は3種あるのかな
Proc#call
Proc#[]
proc_obj.()
0695デフォルトの名無しさん2011/04/06(水) 13:08:26.82
今から1.9って勉強したらダメなんですか?
マニュアルってそろってないのですか?
■ このスレッドは過去ログ倉庫に格納されています