Ruby 初心者スレッド Part 31
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/09/17(木) 17:31:07★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。
(理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。)
なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。
関連スレや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を読め」でいいので、叩かない&怖がらせない。
・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。
・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
0153デフォルトの名無しさん
2009/09/19(土) 08:32:23別に「Marshal使ってるオレかっこいい」じゃないだろw
Ruby本でも書かれるような一般的な小技なんだろ
まあ上でも言われてるが初心者にネタを見抜けってのはきついから
ネタなしかネタだと明らかに分かるよう書いてほしいのはあるが
0154デフォルトの名無しさん
2009/09/19(土) 08:37:29知らんよ
Marshal.load して dump するというのは「はいれつがこぴーできません」に対する FAQ だ
きちんとマニュアルにも書い…書…注釈に小さく書いてある
ttp://www.ruby-lang.org/ja/man/html/Object.html#footnote-1
知っていることも使用することも問題は特段存在しない
Marshal.dump を知っているレベルで for や定数を使うことが「ありえない」から叩かれてるのだろ
0155デフォルトの名無しさん
2009/09/19(土) 08:39:34なんで Object には deep copy のためのメソッドがないのかな?
サブクラス作るたびに適切にオーバーライドする必要が出て面倒だからだろうか
0156デフォルトの名無しさん
2009/09/19(土) 08:56:27実際にRubyスクリプトとして作るとわかるが循環解決でわけわかめになる
marshal.のソース流用しようとするとT_DATAであっぴゃーになる
dumpしてloadよりも早くてうまくて短い実装があるならMLで発表だ
基本、ディープトラバースして欲しくないらしいぞ
Rubyで提供されてるディープトラバース手段はMarshalだけだ
Marshalできないやつはそもそも複製できんオブジェクトだったということで
0157デフォルトの名無しさん
2009/09/19(土) 09:23:290158デフォルトの名無しさん
2009/09/19(土) 09:30:36>知っていることも使用することも問題は特段存在しない
問題はそこじゃない。初心者への回答という観点を忘れ、ろくに説明もなしにコードだけ書いて満足していることが問題。
0159デフォルトの名無しさん
2009/09/19(土) 09:39:280160デフォルトの名無しさん
2009/09/19(土) 09:40:25説明はされた
0161デフォルトの名無しさん
2009/09/19(土) 09:56:200162デフォルトの名無しさん
2009/09/19(土) 11:16:12あとからな。ここでいっているのは、最初の>>142の時点で何の説明もないことだろ。
0163デフォルトの名無しさん
2009/09/19(土) 11:26:23そこは全く問題ないだろ
forの方を言うならまだわかるが
0164デフォルトの名無しさん
2009/09/19(土) 11:33:22>>147が>>139,142のようなのは初心者に有害だからやってほしくないと真摯に考えるのなら
その場で「Rubyでforは滅多に使わねえよカスeach使え」
「大文字で始まる識別子は定数だからLとかそんな風に使うなボケ」
「巣に帰れ二度と戻ってくるな」といったツッコミをいれるべき
0165デフォルトの名無しさん
2009/09/19(土) 11:45:020166デフォルトの名無しさん
2009/09/19(土) 12:02:02160先生の次回作をお楽しみに。
0167デフォルトの名無しさん
2009/09/19(土) 12:05:260168デフォルトの名無しさん
2009/09/19(土) 12:06:17説明がないと思ったなら他の人が説明するもよし
分からなきゃそれを質問するもよし
だろう
0169デフォルトの名無しさん
2009/09/19(土) 13:40:16ごめんなさい、ごめんなさい。双方とも頭冷やしてくだしあ
0170デフォルトの名無しさん
2009/09/19(土) 13:44:38あやまるならforとか定数とか変に使ったことをあやまってくれよw
まあ(ちゃんとした)議論になればいろんな情報が出てくるからいいのかもしれんけどね
0171デフォルトの名無しさん
2009/09/19(土) 13:58:090172デフォルトの名無しさん
2009/09/19(土) 14:23:19"[hoge]".sub(/\[(.+?)\]/){$1}
なんかじゃなくて、なんかもっとスマートな方法はありませんか?
0173172
2009/09/19(土) 14:26:22"[hoge]".split(//)[1...-1].join
も無しの方向で。
0174デフォルトの名無しさん
2009/09/19(土) 14:28:010175デフォルトの名無しさん
2009/09/19(土) 14:36:42そのまんまの正規表現でマッチした部分を取り出す以上のわかりやすいスマートなものはないかと思われ
str =~ /\A[\(\{\[<](.+?)[\)\]\}>]\Z/; $1
開きカッコの対応を取るライブラリは標準では無いので自作してくれ
0176デフォルトの名無しさん
2009/09/19(土) 14:38:04とCマガで大昔に読んだけど、最近の拡張しまくりのだと可能かもなー。
0177デフォルトの名無しさん
2009/09/19(土) 14:48:30てないよな。
0178デフォルトの名無しさん
2009/09/19(土) 14:51:08その手があったか
"[hoge]".chop.reverse.chop.reverse
0179デフォルトの名無しさん
2009/09/19(土) 14:52:59ちょwwwwwプwwwww
0180デフォルトの名無しさん
2009/09/19(土) 14:54:210181デフォルトの名無しさん
2009/09/19(土) 17:26:080182デフォルトの名無しさん
2009/09/19(土) 20:20:22○ほお
0183デフォルトの名無しさん
2009/09/19(土) 20:28:43"[hoge]"[/\[(.+?)\]/, 1]
とも書ける。
>>175
Onigurumaならできるはず。
0184デフォルトの名無しさん
2009/09/19(土) 21:00:130185デフォルトの名無しさん
2009/09/19(土) 21:06:160186デフォルトの名無しさん
2009/09/20(日) 05:42:36けっこう不便なんですけど。
0187デフォルトの名無しさん
2009/09/20(日) 05:58:31リファレンスを見たらわかることではないでしょうか?
0188デフォルトの名無しさん
2009/09/20(日) 06:35:34>>186
require が真偽値を返すメソッドとして作られているから、がいちおうの答
複数受け取ったときは真偽値の配列を返すようにしてもいいんだけど、おおむねキモい
each で回してもいいはずなんだけど、そういう人はなぜか見ないね
0189デフォルトの名無しさん
2009/09/20(日) 06:46:28false が返ってきたほうが便利だということでお流れになったんでなかったかな
0190デフォルトの名無しさん
2009/09/20(日) 07:50:000191デフォルトの名無しさん
2009/09/20(日) 08:22:58FakeWeb 1.2.6 API Documentation
http://fakeweb.rubyforge.org/
FakeWeb使ったらいけるかも…
0192デフォルトの名無しさん
2009/09/20(日) 11:46:120193デフォルトの名無しさん
2009/09/20(日) 11:51:53それはRubyで作った2chブラウザのテストですか?
0194デフォルトの名無しさん
2009/09/20(日) 12:34:04>>188
なるほど!たしかにrequireは戻り値がありますね。でも戻り値を気にする場面っていうのはまれなので、
そういう理由で複数の引数を指定できないのはちょっと勿体ないですね。
Railsとかには require_all というのがあるそうなので、戻り値を気にしなくていいから
引数を複数とれるバージョンのrequireを、requireとは別に用意してほしいなと思いました。
0195デフォルトの名無しさん
2009/09/20(日) 12:34:370196デフォルトの名無しさん
2009/09/20(日) 12:59:39なければ自分で作るという選択肢ももとう
0197デフォルトの名無しさん
2009/09/20(日) 13:01:420198デフォルトの名無しさん
2009/09/20(日) 16:09:37..  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄l/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
/\(<●>)/\ /\(<●>)/\
/\(<●>)/\ /\(<●>)/\
/\(<●> )/\ \(<●>)/\
/ \\(<●>)/\
/ ,ゝ===く <●>)/\
! γ `ヾ,_ \
│ :く( r,J三;ヾ )> \
l =; {三●;= } ,=ニ l
ヽ ゝ≡三=イ / <>>1ワロタw
ヽ .,,,. /.|
ヽ 'ぐ'''''''' / / ト,
ヽ. ヾ''" / / |ヽ
,./ヽ `´ / ./ \、
-‐ '''"  ̄ / :| \,,,__,,,, / / | `'''‐- 、.._\
0199デフォルトの名無しさん
2009/09/20(日) 16:17:33<form action="syasinhenkou.rhtml" method="post" enctype="multipart/form-data">
<input type="file" name="syasin" size="30" maxlength="100">
<input type="hidden" name="id" value="<%= cgi["id"] %>">
<input type="submit" value="登録">
</form>
ってかんじで、ファイルを登録用のページにおくりたい
sql = "UPDATE rireki SET"
sql += " syasin = '" + cgi["syasin"] + "'"
sql += " WHERE id = '" + cgi["id"] + "'"
sql += ";"
my.query(sql)
受け側はこんな感じで書いてみた。
IDのところに変な文字列が入ってアップデートされないいのだけど
enctype="multipart/form-data"のオプションのせいだよね。
ファイルを送るときは、このオプションがいるみたいだけど
どうしたらいいかな?
DB側のidがキーで文字列、syasinがBLOB型でやってる
これでDBにファイルが送れるのかもよくわからんのだけど
教えてくれるとありがたいです。
0200デフォルトの名無しさん
2009/09/20(日) 17:25:56idの所が変になるんじゃなくて、cgi['syashin']以降が変になってるはず
blobとかのバイナリオブジェクトは文字列の連結でSQLを作れない
プリペアードステートメントとかを使え
0201デフォルトの名無しさん
2009/09/20(日) 17:56:530202デフォルトの名無しさん
2009/09/20(日) 18:41:08空文字列ちゃうん?
>> "a".split(/a/)
=> []
>> "aa".split(/a/)
=> []
>> "ab".split(/a/)
=> ["", "b"]
0203デフォルトの名無しさん
2009/09/20(日) 18:43:58[""]
0204デフォルトの名無しさん
2009/09/20(日) 18:57:36%w(lib0 lib1 lib2).each{|feat| require feat}
でいいじゃん
0205デフォルトの名無しさん
2009/09/20(日) 19:12:10新リファレンスマニュアルから抜粋
> instance method String#split
> split(sep = $/, limit = 0)
> 第 2 引数 limit は以下のいずれかです。
> limit == 0
> 分割個数制限はなしで、配列末尾の空文字列を取り除く
> limit < 0
> 分割個数の制限はなし
「配列末尾の空文字列を」いくつあっても全部「取り除く」ってことなんだろうな多分
それがデフォルトの動作である理由は知らん
0206デフォルトの名無しさん
2009/09/20(日) 19:23:06こんなん知らへんかったがな。おーきに
理由は実装上の都合なんやろなぁ
0207デフォルトの名無しさん
2009/09/20(日) 19:33:54Perlがそうだった理由は知らん。
0208デフォルトの名無しさん
2009/09/20(日) 22:23:37web上では関西弁禁止だよ?知らないな?他の方言ならいいけど
0209デフォルトの名無しさん
2009/09/20(日) 22:53:07syasinじゃなくてphotoとかpictureつかえ
0210デフォルトの名無しさん
2009/09/20(日) 23:01:59ぐぐってみたけど、上級者向けの説明しかなくてさっぱりでした。
例:Fiberはいわゆるコルーチンです。←コルーチンが何かわからないからさっぱり理解できない説明
高校生でもわかるような説明をどなたかお願いできますか。
0211デフォルトの名無しさん
2009/09/20(日) 23:13:30Ruby/MySQLではプリペアードステートメントつかえない?
MySQL/Rubyじゃないとだめ?
0212デフォルトの名無しさん
2009/09/20(日) 23:17:15Threadなくなったわけじゃないし、上級者(地雷踏み?)向けの機能だから忘れていいよ
否定的なこと言われてるし
ttp://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/31601
0213デフォルトの名無しさん
2009/09/20(日) 23:58:30こんなのもある
http://d.hatena.ne.jp/tmtms/20090729/1249183003
0214デフォルトの名無しさん
2009/09/21(月) 00:21:13出来るみたいだけど使ってないんで確認はしてない
ttp://planet.mysql.com/entry/?id=18088
stmt = my.prepare("select ?,?")
stmt.execute 123, "abc"
stmt.fetch # => [123, "abc"]
0215デフォルトの名無しさん
2009/09/21(月) 00:43:010216デフォルトの名無しさん
2009/09/21(月) 00:58:240217デフォルトの名無しさん
2009/09/21(月) 01:37:34プリペアードステートメントは
MySQL/Rubyをいれて解決した
あとは、ファイルのアップだけど
st = my.prepare("UPDATE rireki SET syasin = ? WHERE id = ?")
st.execute(cgi["syasin"].read,cgi["id"].read)
res = st.fetch
って書いてみたところ、MySQLのほうから
2053
Attempt to read a row while there is no result set associated with the statement
って怒られた・・・・BLOBだとだめなんか?
こんなところで詰まってるようだと、表示にもてまどりそう
っていうか、表示できるのか?
0218デフォルトの名無しさん
2009/09/21(月) 03:42:410219デフォルトの名無しさん
2009/09/21(月) 04:02:16エラーメッセージの意味はわかる?
SQL文を実行したけどresult setが返されなかった、なのに行を読み込もうとしてエラーになっている、という意味。
SQLをみるとupdate文を実行しているよね。だからresult setは返ってこない。なのに st.fetch しようとしているからエラーになっているだけ。
これがselect文だったらfetchできるけど。
0220デフォルトの名無しさん
2009/09/21(月) 11:47:02SERECTしたらはいってた〜〜!!
ありがと〜〜!!!
表示のほうも、相談にのってください
格納したデータを
<img src="data:image/jpg;base64,/9j/4AAQ....中略.....">
って感じには表示できるのですが
これだとIE6では見れない。
エンドユーザにFF入れろとか言えないし
IEでも表示させる方法ありますかね?
0221デフォルトの名無しさん
2009/09/21(月) 12:24:040222デフォルトの名無しさん
2009/09/21(月) 12:41:30動的か静的かは用途次第だけど、素直にURL割り当てろって
0223デフォルトの名無しさん
2009/09/21(月) 12:54:14スレ立てるまでもない質問はここで 100匹目
http://pc12.2ch.net/test/read.cgi/tech/1054813207/
【漏れは】猫でもわかる質問スレ【猫以下です】
0224デフォルトの名無しさん
2009/09/21(月) 13:26:50アホだなぁ。
base64デコードして出力すればいいだろが。
Content-Typeヘッダも適切に吐いてね。
あ、スレチだね。
0225デフォルトの名無しさん
2009/09/21(月) 13:51:04さすがにスレ違いすぎるけど。
src="data:..." は IE6 ではサポートされてない。これはブラウザを変えてもらう以外に方法はない。
だから data: を使わずすなおに画像を別ファイルにしておこう。
あるいは http://example.com/cgi/jpg.cgi?base64=.....(base64文字列)....
が画像ファイルを返すようなCGIを用意して、
src="data:..." をすべて src="http://example.com/cgi/jpg.cgi?base64=...." に変換するとか。
0226デフォルトの名無しさん
2009/09/21(月) 18:26:18>>224-225
URLの?以降の文字列はENV['QUERY_STRING']で受け取れるはず
そいつをデコードして元に戻すって考えて
#!/usr/local/bin/ruby
require 'base64'
file = ENV['QUERY_STRING']
out = decode64(file)
print "Content-Disposition: filename=\"syasin.jpg\"\n"
print "Content-type:image/jpge\n\n"
print out
って言う具合に組んでみた。
700バイトとかの小さいファイルだとうまく行くんだけど、
8kぐらいのファイルになると表示できなくなるな
そもそも、CGI呼べてないっぽい
これもRubyのはなじしゃないよね(涙
0227デフォルトの名無しさん
2009/09/21(月) 18:59:21どうもbase64のコードが長すぎでうまく行かなかったっぽいので
idを指定してDBから画像を引っ張って垂れ流すだけのCGIを作成しました。
idなら長くても50桁とか行かんので、これで解決!!
いろいろ、ご迷惑おかけしました。
ヒント本当に助かりました。ありがとうございます。
0228デフォルトの名無しさん
2009/09/21(月) 19:05:28>700バイトとかの小さいファイルだとうまく行くんだけど、
>8kぐらいのファイルになると表示できなくなるな
ENV['QUERY_STRING'] をそのままつかってるのが問題なんじゃないかな。
(つまりENV['QUERY_STRING']に %2F や %2B が含まれているんだろう。)
URLエンコードされているからデコードしないと。
require 'cgi' qstr = ENV['QUERY_STRING']
out = decode64(CGI.unescape(qstr || ""))
詳しくは
ttp://blog.s21g.com/articles/319
をみてくれ。
0229デフォルトの名無しさん
2009/09/21(月) 20:00:17そんな巨大なデータをクエリ文字列としてURIで渡すなよ、と。
0230デフォルトの名無しさん
2009/09/21(月) 20:02:482083バイトだったかね。
0231デフォルトの名無しさん
2009/09/21(月) 20:04:530232デフォルトの名無しさん
2009/09/21(月) 21:06:050233デフォルトの名無しさん
2009/09/22(火) 14:17:190234デフォルトの名無しさん
2009/09/22(火) 14:23:06またお前か。
もういいから自分の巣に帰れ!
0235デフォルトの名無しさん
2009/09/22(火) 15:31:240236デフォルトの名無しさん
2009/09/22(火) 19:39:02最初から備わってる変数が色々ありますけど、どうしてこんなに表記法に統一性が無いのですか?
0237デフォルトの名無しさん
2009/09/22(火) 20:31:240238デフォルトの名無しさん
2009/09/22(火) 21:03:37Larry Wallに聞いてくれ
0239デフォルトの名無しさん
2009/09/22(火) 21:08:08Perlの文法が言語学的にどう優れているのかの講義が始まるぞ
そしてハッシュの頭になぜ%が付くのかを聞いたらPerl信者になること確実だからやめておけ
0240デフォルトの名無しさん
2009/09/22(火) 21:28:45__FILE__はC
ARGFはARGVの発展系、ARGVはCのmain関数の引数argvが元になっている
どれもこれもunix+Cを知ってれば、なじみの物ばかりだ
0241236
2009/09/22(火) 22:02:34でもARGFはどうして定数なんでしょうか?Cだとargvなんかは変数ですよね。
__FILE__は擬似変数で$0はグローバル変数と全部違うけど、どれもグローバルにアクセスしたいものだから
統一してしまえばいいのに、と思ったのです。
ここら辺の、定数やグローバル変数、擬似変数といった使い分けは実装内部のことが分かるような人じゃないと理解できないのでしょうか。
0242デフォルトの名無しさん
2009/09/22(火) 22:06:29__FILE__は違う
0243デフォルトの名無しさん
2009/09/22(火) 22:08:10ARGFをグローバル変数にするのはおかしな話だが、何でといわれても説明できん
0244デフォルトの名無しさん
2009/09/22(火) 22:23:44他の言語もそれに習ってるからrubyもそれに習っているんだろう
0245デフォルトの名無しさん
2009/09/22(火) 22:27:10どこかでMatzが
「特殊変数周りの仕様はPerlから引きずった。今では後悔している」
的なことを書いてたような
いずれにせよ、一貫性がないという意見には同意
0246デフォルトの名無しさん
2009/09/22(火) 22:41:46ってのがRubyの精神じゃなかったっけ…
0247デフォルトの名無しさん
2009/09/22(火) 22:44:060248デフォルトの名無しさん
2009/09/22(火) 23:22:18リロードするたびにセッションIDが変わってしまいうまく数値を取り出せないです。
どなたか助言をよろしくおねがいします。
def GetSession()
cgi = CGI.new
session_option = {"tmpdir" => "./"}
session = CGI::Session.new(cgi, session_option)
return session
end
0249デフォルトの名無しさん
2009/09/22(火) 23:43:380250デフォルトの名無しさん
2009/09/22(火) 23:48:07リロードするたびに増えていきます。
サーバー側の問題でしょうか?
0251デフォルトの名無しさん
2009/09/22(火) 23:58:52CGIモジュールの仕様はよく知らんが、きっとセッションIDをクッキーに入れて送ってきてくれているはずだぞ!
0252デフォルトの名無しさん
2009/09/23(水) 00:15:52■ このスレッドは過去ログ倉庫に格納されています