Ruby 初心者スレッド Part 41
■ このスレッドは過去ログ倉庫に格納されています
0001京 ◆SsSSsSsSSs
2011/02/10(木) 13:47:51★注意★ 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.21HTTPレスポンスとしてはどういうものを返しているの?
ちゃんと200が返るようになってるの?
0597デフォルトの名無しさん
2011/03/30(水) 18:34:44.13確か自分も以前そのやり方でやろうとしていたんですが、
そのやり方でのユーザ名とパスワードの設定方法が
わかんなくて今のやり方に行き着いたような気がします。
でも、他のやり方を探してみるのはありですね。
ちょっとやってみます。ありがとうございます。
>>596
ありがとうございます。
正しいやり方なのかどうかはわからないのですが、
先ほどのスクリプトの末尾に
print "Content-Type: text/html\n\n"
print "OK"
のようにやってみたりはしました。
我流?というか常識的なところを理解してません、
正しいやり方を教えていただけるとありがたいです。
0598デフォルトの名無しさん
2011/03/30(水) 19:26:05.15>上記のフォームを実際に使用してみると 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', 'w')
0601デフォルトの名無しさん
2011/03/30(水) 20:08:26.76消えろカス
0602デフォルトの名無しさん
2011/03/30(水) 20:13:13.99今のところレスしたのお前だけだぞ
0603デフォルトの名無しさん
2011/03/31(木) 09:58:02.54ありがとうございます!
ご教授いただいたとおりにやってみましたので報告致します。
まずは 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.76C:/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.380607デフォルトの名無しさん
2011/03/31(木) 10:37:20.29「○○さんありがとう! トップに戻る」というカスタムなHTMLを返したいなら200
ブラウザ真っ白の空っぽのボディでいいなら201か202
静的な「ご利用ありがとうございました.html」に飛ばすだけなら302
0608デフォルトの名無しさん
2011/03/31(木) 11:01:13.61申しわけありません、報告し忘れていました。
サーバ上で実行=ブラウザでアクセス と思ってよろしいでしょうか??
もしそうであればファイル 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.440610デフォルトの名無しさん
2011/03/31(木) 11:24:53.15CGI は 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.72cgi = CGI.new
cgi.out({"type" => "text/html", "charset" => "shift_jis"}) {
<<END
あばば
END
}
メールと組み合わせず、まず表示だけやってみたら?
0612デフォルトの名無しさん
2011/03/31(木) 12:09:20.80ありがとうございます、表示はできています。
>>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}
これだけにしてうまくいってる?startのパラメータは正しい?
> のところをコメントアウトして、代わりに >>611 のような適当な HTML を
そもそも、コメントアウトしたらまずいんじゃない?
なんらかの表示をさせてる?
なんらかの表示をさせなきゃ、
Premature end of script headers:test.rb,
って出るのも当然かも。
0614デフォルトの名無しさん
2011/03/31(木) 12:45:45.41>>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再度ご報告。
スクリプトのいろんな箇所に warn $SAFE と書いて
実行してみましたが error.txt に出力されたのは 0 のみでした。
(いちおう申告、先頭の $SAFE=1 はコメントアウトしました)
ありがとうございます。
0617デフォルトの名無しさん
2011/03/31(木) 12:59:11.91>>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ありがとうございます。
誤解を与えてしまっていたようで申しわけありません。
たぶん私が「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ありがとうございます。
試してみたのですが変わらず…です。
うーん…。
0621デフォルトの名無しさん
2011/03/31(木) 16:21:02.69と言っても
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.52print "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あ、すみません。
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うーん、試してみたがやはりだめです…。
なんども申し訳ない。ありがとうございます(涙)
0626デフォルトの名無しさん
2011/03/31(木) 18:25:51.18print "Content-Type: text/html\n\n"
って\nだけでいいの?
\r\n\r\nじゃないのかな
WindowsでRubyで遊んでるだけの私にはWebサーバーのことはよくわからんけど
OSとかWebサーバーが何なのかとか、手元にサーバーがあるのかとか
サーバーの環境をもっと詳しく書かないとアドバイスしにくいんじゃないのかな
0627デフォルトの名無しさん
2011/03/31(木) 19:15:38.80200 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.660629デフォルトの名無しさん
2011/03/31(木) 20:31:18.82メール送信処理がふたつ書いてあってどっちも実行されてるんだろうから
1通だけ送りたいのなら2番目のNet::SMTP...を削れば済むような
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もしメールを送信した直後に異常終了してるなら、
2回目の送信が行われるわけないと思ったわけです。
0633デフォルトの名無しさん
2011/03/31(木) 21:50:46.00なるほど了解
ただ>>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ありがとうございます、たしかにそうかもしれません。
環境は
OS は Windows7 の 64bit
サーバーは Apache 2.2.16 (Win32)
Ruby のバージョンは 1.8.7
自分の PC に Apache インストールしていろいろやってるかんじです。
よろしくおねがいします。
0637デフォルトの名無しさん
2011/04/01(金) 10:17:02.05これだと 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ありがとうございます。
試してみましたが、やはりうまくいきません。
今までと同じでメールは送信されるのですが、ページが表示されません。
プログラム云々ではなく、環境の問題なのでしょうか…?
0639デフォルトの名無しさん
2011/04/01(金) 11:39:11.44今回は頼ったほうがいいような気がする
ていうか
print "HTTP/1.1 200 OK\r\n"
は書いても害はないだろ
サーバ設定上不要だったら最初から全体がテキストとして余分に表示されるだけだ
そのとき改めて外せばいい
0640デフォルトの名無しさん
2011/04/01(金) 11:46:02.15ruby.exe の場所間違ってるか apache の設定じゃないかな
0641デフォルトの名無しさん
2011/04/01(金) 12:38:18.11>>612 に書いたようにメールの部分3行をコメントアウトして実行すると、
当然メールは飛ばないのですがページ(<html>OK</html>)は表示されます。
0642デフォルトの名無しさん
2011/04/01(金) 12:45:46.89メール送信を、表示のあとにもってきたら?
0643デフォルトの名無しさん
2011/04/01(金) 13:04:28.21CGIスクリプトとしてではなく単にコマンドラインから
C:\>ruby >>637のスクリプト.rb
とかしたらどうなるか試してみた?
0644デフォルトの名無しさん
2011/04/01(金) 15:24:22.34うーん、それでもだめでした…。
ありがとうございます。
>>643
はい、それだとエラーも出ずうまくいきます。
ありがとうございます。
0645デフォルトの名無しさん
2011/04/01(金) 15:30:16.02gemでインストールしたライブラリってどこのフォルダにインストールされるのですか?
0646デフォルトの名無しさん
2011/04/01(金) 16:39:50.13ruby -rubygems -e "p Gem.dir" で表示されたディレクトリの中
cache/ と doc/ と gems/ と specifications/ の4つのディレクトリを(通常は)すべて使う
0647デフォルトの名無しさん
2011/04/01(金) 16:40:58.07ありがとうございます
確認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問題がすべて解決したわけではないのですが、大きな進展がありましたのでご報告致します。
今まで 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実際に動かしている人がいるとは驚きだ。
0651デフォルトの名無しさん
2011/04/01(金) 17:43:50.18できるのであればなにかごちそうしたいです。
ありがとうございます。
実行してみたのですが 7 でも XP でも動作しませんでした。
ただし XP の方では
print "HTTP/1.1 200 OK\n"
この行を削除すると正常に動作し、ページも表示されました。
また、どちらの OS でも smp_error.txt というファイルは作成されませんでした。
>>650
Windows での情報が少ないな、とは思っていたのですがやはりそうなんですね。
ちょうどいろいろ不便で、限界を感じていたところだったので、
土日を利用して CentOS で環境を構築してみようかと思います。
0652デフォルトの名無しさん
2011/04/01(金) 19:47:52.100653デフォルトの名無しさん
2011/04/01(金) 19:57:00.25接続そのものは行われるので、変な接続先やパスワードを設定するとエラーが出る
0654デフォルトの名無しさん
2011/04/01(金) 19:59:59.90CentOSでRuby使うのだけはやめておけ
というかわざわざCentOS使う人が多いのはなんで?
0655デフォルトの名無しさん
2011/04/01(金) 20:04:55.980656デフォルトの名無しさん
2011/04/01(金) 20:09:32.19パッケージのRubyが5年前の不安定版のままなだけ
0657デフォルトの名無しさん
2011/04/01(金) 20:11:19.04aptとかyumとかそんなの一切使わないけど
0658デフォルトの名無しさん
2011/04/01(金) 20:14:32.26おなじです。表示までいかないです。
>>654
あ、そうなんですね。ありがとうございます。
逆にこれがおすすめってのありますか?
>>657
自分もそうしようとしてました。これ参考にしたらいけるのかなーって。
http://d.hatena.ne.jp/rx7/20100611/p1
0659デフォルトの名無しさん
2011/04/01(金) 20:15:38.190660デフォルトの名無しさん
2011/04/01(金) 20:16:18.48特に初心者は
新しい言語環境試すのにとりあえず最新版をコンパイルしてホームにインストールとかするのはマニアだけです
0661デフォルトの名無しさん
2011/04/01(金) 20:21:23.27Linuxもプログラミングもはじめてでちゅこんぱいるってなに、という人には勧めないが、まあ、そんな程度だ
0662デフォルトの名無しさん
2011/04/01(金) 20:27:57.48まあ趣味の世界でしかrubyを動かす事のない人にはパッケージで管理してればいいよ
0663デフォルトの名無しさん
2011/04/01(金) 20:40:43.62個人的には普通なんて存在しないと思うよ
0664デフォルトの名無しさん
2011/04/01(金) 21:48:09.19現時点でならRVMだな!
0665デフォルトの名無しさん
2011/04/02(土) 16:09:15.090666デフォルトの名無しさん
2011/04/02(土) 16:11:05.27PHPやPERLやPYTHONでは出来るのですがRubyではあまり聞かないので
0667デフォルトの名無しさん
2011/04/02(土) 16:20:32.35「コンパイル済み」の状態のバイナリを持ち歩くことはできない
Ruby実行環境ごとひとつのexeファイルにまとめてスクリプトを実行することはできる
0668デフォルトの名無しさん
2011/04/02(土) 17:42:38.810669デフォルトの名無しさん
2011/04/02(土) 19:27:42.05Try Ruby 日本語サイトにも置いといてくれよ
0670デフォルトの名無しさん
2011/04/02(土) 21:04:47.20個人的にはそれで困ったことはないが
|: / : : : / : : : : :.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.210673デフォルトの名無しさん
2011/04/03(日) 20:41:41.53例えば, ( 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.10StringとArrayとHashの3つだけ眺めてわかった気になるだけでもかなり違う
で、文字列の中に変数(やメソッド返り値)の結果を埋め込むには
文字リテラルを "" で囲って作った上で #{ } を使う
year = 2010
path =
0675デフォルトの名無しさん
2011/04/03(日) 20:52:44.84"http://weather.jp/#{year}"
"http://weather.jp/%d" % year
あとruby getweather.rb 2011とかしてコンソールから起動する場合は
コマンドライン引数2011をARGV[0]で取れるよ
0676デフォルトの名無しさん
2011/04/03(日) 21:00:16.67>>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…どうやらとても基本的なことを学び足らなかったようですね…
課題に向かうときは簡単な土台から積み上げていくテクニック おっしゃるとおりです
もう少し下積みしてからもう一度挑戦したいと思います. ありがとうございましたm(_ _)m
0678デフォルトの名無しさん
2011/04/04(月) 05:25:55.510679デフォルトの名無しさん
2011/04/04(月) 05:30:36.59require 'open-uri' として open メソッドを書き換える必要がある
open の引数の信頼性に注意
0680デフォルトの名無しさん
2011/04/04(月) 12:48:59.07Rubyにおける「普通の環境」=rvm
0681デフォルトの名無しさん
2011/04/05(火) 01:16:21.14Rhodes + Macが無いと無理なんでしょうか?
どうも解説ページが少なくてわからない・・・。
0682デフォルトの名無しさん
2011/04/05(火) 03:12:07.440683デフォルトの名無しさん
2011/04/05(火) 04:50:03.970684デフォルトの名無しさん
2011/04/05(火) 09:15:46.40なんで?
0685デフォルトの名無しさん
2011/04/05(火) 16:36:21.75>>679でわかるようにKernel#openは書き換えられてるかもってことでは?
0686デフォルトの名無しさん
2011/04/05(火) 21:27:18.56そっか、ないんですね・・・。
世の中のipadアプリケーションエンジニアは
みんなMac持ちなのか・・・?
0687デフォルトの名無しさん
2011/04/05(火) 22:26:39.05データ関連いじるならまだしも
0688デフォルトの名無しさん
2011/04/06(水) 01:04:18.28WebアプリならiPadに最適化されたUIにする手もあるがネイティブアプリを開発したいんだよな
> 世の中のipadアプリケーションエンジニアは
> みんなMac持ちなのか・・・?
もしそこに気付けなかったのならiPadでの開発はやめておいた方がいいかもしれない
0689デフォルトの名無しさん
2011/04/06(水) 08:37:45.890690デフォルトの名無しさん
2011/04/06(水) 08:59:19.72何故関数が呼び出されるのでしょうか?
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.400692デフォルトの名無しさん
2011/04/06(水) 09:38:55.16単なる.call()の略記法としてそういうメソッドが定義されてるだけ
本当は()にしたかったんだろうけど、言語仕様的に無理があるんで
それっぽい表記で、かつメソッドとして有効な名前として[]が選ばれた
0694デフォルトの名無しさん
2011/04/06(水) 12:47:49.62今は3種あるのかな
Proc#call
Proc#[]
proc_obj.()
0695デフォルトの名無しさん
2011/04/06(水) 13:08:26.82マニュアルってそろってないのですか?
■ このスレッドは過去ログ倉庫に格納されています