1 名前:デフォルトの名無しさん mailto:sage [2009/09/17(木) 17:31:07 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 ★注意★ 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つをすること。ここで回答を待つよりそのほうが早い。 ・モジュール名やエラーメッセージでググる ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/ ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。 ・詳しい内容(「動きません」「うまくできません」では回答しようがない) ・エラーメッセージ(自力で訳さずなるべくそのままで) ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる)) ・最終的にやりたいこと(もっとよい方法がある場合が多いので) 回答してくれた人には「ありがとう」のひとことをいってあげて。 ■回答する人へ 相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。 それができないならこないこと(だって初心者スレだもん)。 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
411 名前:デフォルトの名無しさん [2009/09/27(日) 22:13:48 ] ログをまずは見ようぜ。 1.cgiに実行権限がついているかとか1.htmlの読み込み権限とかもチェックしような
412 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 22:15:53 ] action=/usr/lib/cgi-bin/1.cgi っておかしいだろ… lighttpd とかにかかわらず /usr/lib とか公開するとは考えにくいから action=/cgi-bin/1.cgi とかなんじゃないのか この調子じゃ権限とかもだめそうだな
413 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 22:31:01 ] >>396 RubyでCGIの勉強をするなら、lighttpdから始めるのはオススメしない cgi.rbを使って、WEBrick上 or Apache上で動かしてみるとか Sinatra使うとかしたほうがいい
414 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 22:40:09 ] >>411 chmod 755はしてあります。 >>412 あ、cgi-binでいいんですね。フルパスにしちゃいました。 たしかに公開しないですもんね。
415 名前:デフォルトの名無しさん [2009/09/27(日) 22:52:59 ] ファイルの所有者も確認しような lighttpdを起動したユーザがownerだよな?
416 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 22:55:57 ] 式がnil, false, 0なら偽になるif文てないの?
417 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 23:06:09 ] >>415 ファイルオーナーが、「root」ですね lighttpdは、「www-data」が起動してます sudo cpでファイルを/usr/lib/cgi-binにコピーすると 所有者が、ルートになってしまいます。 ちょっと、apacheや他のを調べてみます。みなさん、スレ違いに付き合って くださって申し訳ありがとうございまsyた
418 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 23:18:45 ] >>416 !x || x== 0 '' や [] や {} も偽にしたいならActiveSupport入れてblank? と present? を使え。
419 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 23:23:03 ] >>418 それだとnil, false, 0で真になるんだけど。偽がほしいんですが無理なんですか?
420 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 23:29:26 ] x && x != 0 どんだけ応用力ないのかな…
421 名前:デフォルトの名無しさん mailto:sage [2009/09/27(日) 23:33:29 ] いかにも落とし穴がありそうだと漏れのアンテナが反応しております
422 名前:418 mailto:sage [2009/09/27(日) 23:35:35 ] すまん逆転させるのわすれてた。てへ。
423 名前:デフォルトの名無しさん [2009/09/27(日) 23:49:22 ] >>417 ファイルの権限を777にして実行してみな。 それで実行できれば権限関係の設定がおかしかったってことだ linuxの基礎を勉強私的な。
424 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 10:48:55 ] Digest::MD5.digest の値を hexdigest に変換する計算式を教えてください。 convert(Digest::MD5.digest(value)) == Digest::MD5.hexdigest(value) となるようなconvert()です。 あるいはヒントでもいいのでお願いします。
425 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 10:59:18 ] そのへんはさすがにマニュアルにも書いてあるだろ > 与えられた文字列に対するハッシュ値を、ASCIIコードを使って 16進数の列を示す文字列にエンコードして返す。 ということで irb> p Digest::MD5.digest('12345') "\202|\313\016\352\212plL4\241h\221\370N{" irb> p Digest::MD5.hexdigest('12345') "827ccb0eea8a706c4c34a16891f84e7b" irb> p Digest::MD5.digest('12345').unpack("H*")[0] "827ccb0eea8a706c4c34a16891f84e7b"
426 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 11:12:25 ] >>425 ありがとうございます。 1バイトずつ16進数に変換するということなので、こう理解しました。 irb> Digest::MD5.hexdigest('foo') => "acbd18db4cc2f85cedef654fccc4a4d8" irb> Digest::MD5.digest('foo') => "¥254¥275¥030¥333L¥302¥370¥¥¥355¥357eO¥314¥304¥244¥330" irb> Digest::MD5.digest('foo').unpack('C*') # 1バイトずつに分解 => [172, 189, 24, 219, 76, 194, 248, 92, 237, 239, 101, 79, 204, 196, 164, 216] irb> Digest::MD5.digest('foo').unpack('C*').collect{|c| '%x' % c } # 16進数に変換 => ["ac", "bd", "18", "db", "4c", "c2", "f8", "5c", "ed", "ef", "65", "4f", "cc", "c4", "a4", "d8"] irb> Digest::MD5.digest('foo').unpack('C*').collect{|c| '%x' % c }.join == Digest::MD5.hexdigest('foo') => true なるほどー。 どうもでした。
427 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 20:26:36 ] Dir.foreach('hoge'){|filename| filename.match(/(aaa)(bbb)/} print $1 } この状況で、$1や$2の情報を配列に入れるにはどうすればいいですか? 具体的にはこの後、$1の内容について一つ一つ処理をしていきたいんです。
428 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 20:39:11 ] ary = [] Dir.foreach('hoge'){|filename| filename.match(/(aaa)(bbb)/} ary << [$1, $2] # もしくは ary << $1 << $2 } p ary
429 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 20:47:13 ] filename.scan(/(aaa)(bbb)/)
430 名前:デフォルトの名無しさん mailto:sage [2009/09/28(月) 20:51:17 ] >>428 「<<」ってこういうところで使うんですね。 勉強になりました。ありがとうございました!
431 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 00:50:52 ] rubyを使ってgnuplotで簡単にグラフを書きたいんだけど、 何かお勧めありますか?
432 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 08:15:40 ] h = YAML.load_file(path) @username ||= h[:user]||h[:username]||h[:id]||h['user']||h['username']||h['id'] @password ||= h[:pass]||h[:password]||h['pass']||h['password'] イライラ
433 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 12:52:20 ] エディタから編集中のRubyのスクリプトを独立したウィンドウ、ターミナルで起動したい エラーがあったらエディタがそれを取り込んでタグジャンプしたい teeやら別のモジュールをrequireするのはなるべく避けたい もちろんユーザーはputs/getsを制約なく使いたい といううまいやり方ってないですか? ようするにエラーが出たらそれだけをログファイルに書き込んでrubyは終了コード1を返したいです 標準エラーをファイルに書き込むようなファイルをこっそり-rするのが現実的なんですかね
434 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 13:06:42 ] >>433 Emacs使え
435 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 13:10:50 ] 標準の ruby-mode で M-x run-ruby で Emacs 内に irb 開いて M-x ruby-load-file → Enter すれば irb でファイルが実行されるな エラー行ジャンプはどうしようか
436 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 14:56:39 ] >>432 >h = YAML.load_file(path) >@username ||= h[:user]||h[:username]||h[:id]||h['user']||h['username']||h['id'] >@password ||= h[:pass]||h[:password]||h['pass']||h['password'] YAML使ってるなら、キーは文字列になるだろうから、Symbolは考えなくていいんじゃないかな。 YAMLでわざわざSymbolをキーに使うとは考えにくい。 @username ||= h['user'] || h['username'] || h['id']
437 名前:デフォルトの名無しさん [2009/09/29(火) 19:21:13 ] 1万PVのPHPで作られたサイトをRuby(ROR)かScala(Lift)どちらかを使って バージョンアップしようと計画していますが、どちらがお勧めでしょうか? TwitterもRubyからScalaへ書き換えたりしていますので...
438 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 19:28:02 ] 問題ないならPHPのままにしておく
439 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 19:33:59 ] scalaって日本でも実績あるの?
440 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:17:30 ] 1万PVって何かを説明してるように見えて、実際はまったく説明してないよなあ。 開設以来10年で1万PVなのか、毎秒1万PVなのか。
441 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:21:10 ] >>434-435 特定のエディタの話はしてないんだけど…
442 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:22:53 ] 一応、単位としては1日か1ヶ月かのどっちかだな 1日1万PVならコンテンツによってはまあ普通 1ヶ月1万PVなら内容によっては閉鎖したほうがエコ どっちにしてもPHPで動いてるならPHPで増強したほうがきっと楽だ
443 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:24:12 ] >>441 だからEmacs使えって どうせ使いもしないで脳内で考えてるんだろ
444 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:28:12 ] エディタの布教は余所でやれ。
445 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:32:33 ] 求めること全部できるんだから仕方あんめえ エディタとして動作するものではEmacs以外ではgvimかPeggyくらいしか心当たりがない どう動作するのが効率いいかの研究もEmacsの動作見れば丸分かりだ
446 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:35:49 ] 特定のエディタじゃなくて何を求めてるんだ どんなエディタでも連携して動く万能スクリプトが欲しいのか
447 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:38:44 ] >>446 たぶんそうだと思う エディタ内でシェルを起動するのでなければ emacsclient みたいなシステムがないと無理だと思うんだけどね というか、できないからこそ数十年かけて Emacs が M-x compile を進化させてきたのではないんかのう
448 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:43:52 ] うん、Emacsのとか使ってれば「Rubyは特に関係ない」ということにすぐ気づけたはずなのに コンパイラ等が異常終了コードをシェルに返してエラー行を標準出力などに表示さえしてくれれば用は済む
449 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:45:04 ] $stderr.reopen($0 + ".errorlog")
450 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 20:54:21 ] >>442 単純にPVって言ったら普通に日単位だろ 何この馬鹿
451 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 23:38:21 ] >>437 >1万PVのPHPで作られたサイトをRuby(ROR)かScala(Lift)どちらかを使って >バージョンアップしようと計画していますが、どちらがお勧めでしょうか?
どういう理由でバージョンアップしようとしているのかがわからないので、答えられる人はいないでしょう。 パフォーマンスが理由ならRoRはイバラの道だし、開発効率が理由ならLiftはイバラの道。 どちらの道を選んでもイバラの道だと思うので、PHPのまま改善することをお勧めします。 あるいはPythonを使ってGoogleAppEngineにするとか。これもイバラだな。
452 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 23:47:46 ] railsは慣れてしまえば今までの開発が馬鹿に思えるぐらい楽になる
453 名前:デフォルトの名無しさん mailto:sage [2009/09/29(火) 23:49:40 ] 日に1万PV程度なら、サーバ丸1台あればRoRでも余裕だよ。 下手するとキャッシュなしでもいけるくらい。
454 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 00:35:22 ] そりゃ1日8万秒以上あるんだから言われなくても分かる
455 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 06:13:47 ] 結局ピーク性能が足りるかどうかだよな。
456 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 08:24:47 ] そして既存のPHP+サーバではおそらく足りてるわけであって、 現時点で言えることは「じゃあPHPでやっとけ」にしかならんという
457 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 10:56:30 ] でも結局ピーク性能が足りるかどうかだよ。
458 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 11:42:46 ] おいちょっと待てよ、ピーク性能が足りてるかどうかが問題だろ
459 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 11:46:40 ] WebProg板に帰れ
460 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 12:24:24 ] 1ヵ月1万PVwww
461 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 12:57:50 ] いや、ここはピーク性能が足りるかどうかが肝だろ。
462 名前:デフォルトの名無しさん [2009/09/30(水) 18:46:43 ] 全角の数字を半角にしようと下記のフィルタつくったんだけど 変換されないで、元の値が戻ってくる。 何が間違ってるか教えてください。 使う文字コードはUTF-8です。 #全角数字を半角数字に変換するフィルタ def zen_to_han_int(str) outstr = str.gsub(/0/,"0") outstr.gsub!(/1/,"1") outstr.gsub!(/2/,"2") outstr.gsub!(/3/,"3") outstr.gsub!(/4/,"4") outstr.gsub!(/5/,"5") outstr.gsub!(/6/,"6") outstr.gsub!(/7/,"7") outstr.gsub!(/8/,"8") outstr.gsub!(/9/,"9") return outstr end
463 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 18:52:32 ] >>462 str とスクリプトファイルの文字コードが合ってない ごく一般的には str とスクリプトの正規表現リテラルの文字コードは同一にする …あーつまりスクリプトのファイルが UTF-8 じゃないか str が UTF-8 じゃないか あるいは ruby -Ku のような実行指定をしてないかどれか
464 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 18:53:19 ] 今はじめて気がついたけどメイリオって数字が全角と半角全く同じに見える。きめぇw
465 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 18:54:43 ] def zen_to_han_int(str) p "yes!" if /0/ =~ str end これで 0 を含む文字列渡したときに "yes!" と表示されなければ>>463
466 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 20:10:23 ] むしろ、メイリオになってから、半角全角混同さんが気にならなくなりました ^p^
467 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 20:12:28 ] やっとWindowsに標準添付された真の意味での表示用のフォントだからな 表示されるぶんには全角半角の区別がある意味は何もないわけで つまり区別が必要な人は使ったら駄目よ
468 名前:デフォルトの名無しさん [2009/09/30(水) 20:25:22 ] >>463-465 見直したら、スクリプトがS-JISでかかれてました。 $JCODE = "UTF-8" ってやってもだめなのね もうひとつ、お願いします。 #数字に変換できるか def intrger_string?(str) begin Integer(str) return true rescue ArgumentError return false end end Rubyレシピブックのまるぱくりなのですが 3桁の先頭に0を含む文字列を渡すとfalseになる場合があります。 例えば078から099までのあいだとか これも原因が良くわかりません。 どなたか教えてください。
469 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 20:30:25 ] >>468 8進数
470 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 20:30:28 ] 該当メソッドのマニュアルくらい読め ttp://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFB4D8BFF4.html#Integer マニュアル読んだ上でここがわからんとかそういう質問してくれ どうせマニュアル読んで調べてる時間のほうが長いんだから、マニュアルの見方を勉強したほうが結局は得だ
471 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 21:18:02 ] >>468 $JCODEってなんやねん
472 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 21:21:37 ] >>468 0x1234 とかも渡してみろ。
473 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 21:47:46 ] >>468 正規表現じゃだめなん? del integer_string?(str) return str =~ /¥A¥d+¥z/ end
474 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 22:25:26 ] >>469-470 お恥ずかしいです 下記のように書き直しました def intrger_string?(str) if str.gsub(/\d/,"").size == 0 then return true else return false end end >>471 $KCODEの間違えです(´Д⊂
475 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 22:32:57 ] >>473 それだと2/8/16進表記に対応してないから>>468 とは別物になるぞ
476 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 22:56:18 ] >>474 メソッド本体だが、ifの条件式が 成立したら(=false, nil以外を返ったら)true 成立しなかったら(=falseかnilが返ったら)false を返すだけなので、その条件判定式だけでruby的には十分。 ところで str == '' のときはtrue/falseどっちになって欲しいのだろう?
477 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 08:49:38 ] >>475 十進だけにしたいんだろ /\A\d+\z/ =~ str が最善だと思う
478 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 11:28:02 ] hoge= メソッドと hoge メソッドって、どっちが先に定義されてると自然? reader があってから wiriter があるとわかりやすいよね?
479 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 14:25:42 ] attr_reader :hoge def hoge=(value) でやるのが俺の定番 でも両方書くなら書きやすさ的にライタ側から書くかなあ
480 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 16:38:52 ] ここの真ん中辺のコードなんですが ttp://www.aoky.net/articles/why_poignant_guide_to_ruby/chapter-4.html wordlist.rb code_words = { 'スターモンキー' => '新帝国の神経質な閣僚のフィルとピート', 'カタパルト' => 'chuckyゴーゴー', '火炎瓶' => '暖房つきのリビング', 'ナイジェリア' => "Ny and Jerry'sドライクリーニング(ドーナッツ付き)", 'とどめをさす' => 'コンセントをさす' } require 'wordlist' # 邪悪なアイデアを取ってコードワードと入れ替える print "新しいアイデアを入力してください: " idea = gets code_words.each do |real, code| idea.gsub!( real, code ) end メソッドdoのブロック引数で、real, codeの二つが出てきます。 これはなんですか?意味がわからないです。。。 コピペで、rbファイルを2つ作って、下のコードをruby hoge.rbとして実行しても 想定通り動きませんし・・・
481 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 16:53:16 ] >>480 こゆこと これなんぞと思ったら出力して中身を見れ code_words.each do |key, value| puts "#{key} -> #{value}" end ナイジェリア -> Ny and Jerry'sドライクリーニング(ドーナッツ付き) カタパルト -> chuckyゴーゴー スターモンキー -> 新帝国の神経質な閣僚のフィルとピート 火炎瓶 -> 暖房つきのリビング とどめをさす -> コンセントをさす
482 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 16:54:10 ] だからそういう文法というか基本クラスのメソッドの使い方っぽいのは マニュアルを一応眺めてから「ここの部分がさっぱりわからんおまえら親切に教えろ」とか言ってくれ 親切かどうかはともかくおおむね解説なりツッコミなりが入るからさ ttp://www.ruby-lang.org/ja/man/html/Hash.html#each > key と value を引数としてブロックを評価します。 self を返します。 {:a=>1, :b=>2}.each_pair {|k, v| p [k, v]} # => [:a, 1] [:b, 2]
483 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 16:54:20 ] doはメソッドではない。ではdoでなければメソッドは何でしょう?
484 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 16:59:00 ] >>482 それはマニュアルを読むだけの力があるのに 手抜きして読まない人向けのお言葉
485 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 17:00:29 ] >>483 do はブロック開始の(予約)文字列 メソッドに引数を渡すときの ( と ) それそのものがメソッドではないのとおおむね同じ理屈 文字列だからたまたま読めるだけで、別に <<<<<< >>>>>> でもよかった
486 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 17:06:57 ] >>481 eachメソッドがハッシュに対して使われたときは、その引数は |key,value|という形になるわけですね。 >>482 申し訳ないです。 >>483 481の結果からすると、each(すべての要素にたいして)do以下を行えという ことだと思いますが、メソッドでないならdoはなんだろう。
487 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 17:14:30 ] >>481 実行してみました。 undefined local variable or method `code_words' for main:Object (NameError) というエラーが出ました。code_wordsが定義されていない?
488 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 17:20:19 ] 初心者が最初にwhyの感動的rubyガイドで勉強するのは 不適切だったりしますか?
489 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 17:44:46 ] >>488 こっちのが無難 www1.tf.chiba-u.jp/~shin/tutorial/index.rb
490 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 17:56:55 ] >>486 だから、doは予約語だってば。 ifがメソッドでないのと同じ。
491 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 18:12:37 ] > >>483 > 481の結果からすると、each(すべての要素にたいして)do以下を行えという > ことだと思いますが、メソッドでないならdoはなんだろう。 そのeachはなんですか? すべての要素にたいして、というおまじないか何かですか? プログラミング言語はそういうふわふわとしたものではないです。
492 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 18:21:35 ] おまいら、ここは初心者スレだ。 初心者っつーのはとんでもない思い込みや勘違いをしていることも多いんだから あたたかい目でみてください。 >>486 >メソッドでないならdoはなんだろう。 すでに指摘があるように、doは構文を表す予約語のひとつです。 while i < 10 do print i end では、whileやdoやendが予約語です。なおこの場合ならdoは省略可能。 [1, 2, 3].each do |x| puts x end なら、each や puts はメソッド名、do と end は構文を表す予約語。
493 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 18:39:54 ] do が何だかわかりませんレベルの人には来て欲しくないな 質問するなら最低限、言語の基礎は身に付けておいて欲しい これくらいは自力で学習、調査しておくのが質問する側のマナーだろう
494 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 18:42:28 ] そもそも、動作としては arr.each(ブロック) なんだよ オブジェクト arr の インスタンスメソッド each に引数でブロックを与えている ただ、便利なブロックがこのままだとたいそう使いにくいので [1,2,3].each(do |e| p e endのブロック、ただし実行できるならこのブロックを要素ごとに実行すること) といちいちテクニカルにする代わりに [1,2,3].each do |e| p e end と平易に書くように Ruby を作ったのだ このへんの動作が気になるなら my_block = lambda do |e| p e end [1,2,3].each(&my_block) とでも書いてみるといい
495 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 18:58:26 ] >>493 思考過程の筋が見えるなら特に問題はないと思われ まあ、つまりは「勝手に省略せず詳しく書け」ということでしかないわけだが 若干のエスパー能力が要るから万人には勧められない
496 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 19:29:15 ] 理解としては>>486 でまったく問題ないのになんでこんなことになってるんだ
497 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 20:58:03 ] 申し訳ありません。whyのrubyガイドが 最初の方は、とてもわかりやすかったのです。 読み進めていると、コードが出てきて、ruby ファイル.rbと実行しても エラーが出たりするようになり、僕はアホなのだろうかと思って質問しました。 初心者向けとして適当でないようなので、もうすこし文法を押さえながら 読んでみようと思います。ありがとうございました。
498 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 23:29:17 ] >>493 >do が何だかわかりませんレベルの人には来て欲しくないな おまえは>>1 を声に出して10回よめ。 この程度が我慢できないやつはこのスレくるな。
499 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 23:41:55 ] でも>>493 程度が我慢できない人は2chに来るべきじゃないよね。
500 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 23:45:19 ] せめてネタ系のスレで頑張ってもらえるとありがたいんだけど そうもいかないんだろうね
501 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 00:48:12 ] rubyに限らず初心者スレッドは全てを受け入れる糞溜だと思ってる
502 名前:デフォルトの名無しさん [2009/10/02(金) 05:22:34 ] 日本語の文字抽出でうまい方法が分からず困っています。 抽出元のサンプルは下記の通り 11 ○ × abcDefghIjkLmnoPqrsTu 00:00:59 abs この、文字列を抽出したいんdesu. 09/10/02 00:16:55 69 上記サンプルのうち、「この、文字列を抽出したいんdesu.」の部分を抽出したいんです。 抽出対象:日本語、句読点、日本語文字列に付随する半角英数字、半角記号("テスト."等。空白類を挟んだら不要対象とする) 不要対象:半角英数字、半角記号、空白、"○"、"×"等 現在のコードは下記の通り while line=gets if /\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*(\W+)\w*\s*\w*\s*/ =~ line if $1 != " " print "日本語抽出:", $1, $2, $3,$4,$5,$6,"\n" end end end 実行結果↓ 日本語抽出:○ × ::この&カ字列を抽盾オたいん (続きます)
503 名前:デフォルトの名無しさん [2009/10/02(金) 05:25:20 ] (続き) if文の条件が大変なことになっているのは if /(\W+)/ =~ line としてしまうと最初の"○ ×"のみ抽出して終わってしまうためです。 プログラムとして力技で美しくないのは分かっています。 また、日本語が文字化けしてしまっています・・・文字コードの問題だろうとソース先頭に#!ruby -Ksを足してみましたが、 空白類の扱いが変わった?のと記号以外の文字類が表示されなくなりました。 抽出部分を綺麗にするにはイテレータで回せば良いかなと思っています。 →一文字ずつチェックしようと思いましたが、String#each_byteが全半角を問題なく捌けるのか問題が・・・ 問題をまとめると 1:文字列の中から上記抽出対象のみ抽出したいが、力技で汎用性がないので改善したい 2:文字化けしてしまうが原因、対策が分からない となります。 OSはWindows XP SP3でRubyのバージョンは1.8.6です。 長文乱文で分かりにくい質問となってしまい申し訳ありませんが、よろしくお願いします。
504 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 05:32:32 ] まあrubyはメゾットの様なものが多いのも事実だけどな。 そこらの統一性の無さは、原理追求派よりも教祖信仰派のほうが多いってだけじゃないかと。 メゾットだからこうって寄りも、教祖がこう使う様に教えたから深く考えずに同じ様に使うのほうが、良いruby信者に成れる気がする。
505 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 05:36:40 ] irb> s = "11 ○ × abcDefghIjkLmnoPqrsTu 00:00:59 abs この、文字列を抽出したいんdesu. 09/10/02 00:16:55 69" irb> puts s.split[6] この、文字列を抽出したいんdesu. 空白で区切られた7フィールド目という意味ならこれでいいのでは フィールド内に半角空白が混じっても構わないという条件だととたんに面倒になるが
506 名前:503 [2009/10/02(金) 06:02:35 ] >>505 レスありがとうございます。 すみません、確かにサンプルに限定すればそれで解決ですね。 ただ、やりたいのは日本語部分(日本語文字列に付随する記号類、英数字は抽出対象とする)の抽出なのです。 質問の書き方が悪かったのですが、おっしゃる通り、日本語列の中の空白、記号、英数字、 もしくは日本語列の先頭・末尾の半角英数字、記号類は抽出したいんです。 (日本語列と結合していない日本語以外(英数字、記号、空白類)は除外)
507 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 06:13:51 ] 結合ってなんだ?
508 名前:503 mailto:sage [2009/10/02(金) 06:21:11 ] >>507 付随と同義です。ややこしくてすみません。 文字列の結ご・・・連結ですね。すみません。
509 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 06:46:02 ] >>507 おそらく、セパレータとフィールドという概念がないんだと思う だから、元データを作った人の意図を読むことができないし、説明もできてないから俺らもどうにもできん たとえば、俺らは>>502 を見たときに 「番号、マルバツ、マルバツ、英数字、時分秒、英数字、日本語入り文字列、年月日、時分秒、数字」 という空白で区切られた固定の何らかの意味を持った10項目(または年月日+時分秒の9項目)と読むが、 >>503 にとってはおそらくそうではないのだろう ひょっとしたら例示のために出しためちゃくちゃな文字の集まりなのかもしれない 空白の数には全く意味がなく、 形態素解析のように「空白で区切られた、日本語文字を含む文字の連なり」が欲しいのなら split.find_all{|e| <eがShift_JISの日本語文字を含むということ> } とすればよい Shift_JIS (というかたぶん CP932)の日本語文字を含む条件を表す正確な正規表現はどっかから拾え irb> s = "11 ○ × abcDefghIjkLmnoPqrsTu 00:00:59 abs この、文字列を抽出したいんdesu. 09/10/02 00:16:55 69" irb> puts s.split.find_all{|e| /[\xa1-\xdf]|[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]/n =~ e}.delete_if{|e| /\A[○|×|△]\Z/s =~ e} この、文字列を抽出したいんdesu.
510 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 10:01:18 ] >>503 >>509 のようにsplitで配列にしてからfind_allでもいいし 文字列に繰り返し正規表現をしたいのならscanてのもある Array,String,Hash,Enumerableあたりのメソッドは軽くリファレンスに目を通しておくといいよ へぇこんなのあるんだっていう程度でも使う時に思い出せる
511 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 10:02:44 ] -Ksを指定するとShift_jis全角文字も\wでマッチするようになる