1 名前: 【大吉】 mailto:sage [2009/01/01(木) 13:13:22 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 【Ruby1.9 は不安定な開発版であり初心者には全く向きません】 【最新安定版の Ruby1.8.7 の使用をお勧めします】 ※1.8.7 は1.8 と 1.9 の橋渡しをするためのリリースです。 1.9 の新機能の一部が利用可能なので初学者にお勧めです。 ※ただし十分安定しているとは言えないので プロダクション環境での利用にはお勧めしません。 関連スレやURLは>>2-8 あたりを見てください。Ruby on Railsの質問は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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
596 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 02:33:58 ] エラーになるURL晒すのが早いと思うが
597 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 04:34:23 ] ネット系の問題に自分でデバックすら出来ないレベルか。なんか目的にたどり着くのは無理っぽい。 いつも使う必須のスクリプトが環境依存で引っ越して問題が出るのは良くある事。 まあその時に必要に迫られて書き直すと見通しよく成っていいプログラムに成る事は多いが。車輪の再生産気味だが。
598 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 06:11:08 ] リファクタリングが車輪の再生産って言われるとやる気なくします><
599 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 06:25:09 ] >>593 ステータスコードが200だからといって信頼していいわけじゃないぞ
600 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 08:21:46 ] ruby 1.8.6 WindowsXP SP3です。 実例ではないのですが、100までの数をカウントするプログラムに、 標準入力から入力された数字を現在の数字に足す機能を加えたいと思っています。 色々調べたところ、スレッドというものを使えばよいのかな、という結論に達したので 以下のようなプログラムを書いてみましたが、思うような動作をしてくれません。 どなたかお知恵を貸していただけないでしょうか? j = 1 t = Thread.new do while (j < 100) sleep 1 p j.to_s j += 1 end end while (j < 100) i = gets.chomp j += i.to_i end
601 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 08:41:42 ] これは・・・
602 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 08:45:58 ] 自然数k,p,q,m,nについて k=mp+nq(m>=0,n>=0)を満たす(m,n)の組の数をv(k)とするとき p=3, q=7, kが1から100までのときの結果vの一覧を出力したいです Rubyではどのように書いたらいいですか?
603 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 08:53:52 ] >>600 うちではうごいた
604 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 08:55:22 ] >>602 m=0あるいはn=0のとき自然数じゃなくなるけどいいの?
605 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 08:58:43 ] >>604 すみません間違えました x 自然数k,p,q,m,nについて o 自然数k,p,qについて あと、m,nは「0以上の整数」です よろしくおながいします
606 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 08:59:23 ] >>603 うちでは数の表示がgets.chompに邪魔されて、リターンを押すまで 数え上げるほうのスレッドの実行がとまっているみたいなんです。 環境はLinuxとかでしょうか?
607 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 09:09:14 ] >>606 cygwinです
608 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 09:10:44 ] >>602 p = 3 q = 7 (1..100).each do |k| v = 0 (0..(k/p)).each do |m| (0..((k-m*p)/q)).each do |n| if k == m*p + n*q v += 1 end end end print "v(#{k})=#{v}\n" end
609 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 09:20:36 ] >>607 ありがとうございます。 実際にこの処理を使用するプログラムでは拡張ライブラリ使用&exerbでexe化を 考えています。Cygwinでは正常にexe化できないようなのでmswin32でなんとかならないか もうちょっと調べてみます。
610 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 09:21:13 ] >>600 mswin32ではgetsがブロックする。
611 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 09:27:05 ] リファレンスのどっかにあったと思ってたんだけど、やっと見つけた。 www.ruby-lang.org/ja/man/html/trap_timeout.html
612 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 09:30:49 ] >>608 こうかな p = 3 q = 7 t = 0 u = 0 (1..100).each do |k| v = 0 (0..(k/p)).each do |m| if (k-m*p)%q == 0 v += 1 end end print "v(#{k})=#{v}\n" u += v if v > 0 t += 1 end end print "total #{t}, #{u}\n"
613 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 09:41:30 ] >>609 exerb+cygwinでexe化うまくいってるよ なんか変なライブラリくっつけてない?
614 名前:デフォルトの名無しさん [2009/01/20(火) 09:59:05 ] >>602 参考になるのかな ttp://d.hatena.ne.jp/octech/20080118
615 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 10:09:17 ] アンカミス >>600
616 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 10:34:43 ] >>614 ドンピシャです。ありがとうございます! >>610-611 なるほど、mswin32だと修正を待つしかない・・・のかな? と思ったけど回避策ってあるもんなんですね。引き出しを増やさなきゃ。 >>613 win32/sapi5を使っているのと、HDD容量に難があったのでCygwinは入れてませんでした。 2日前にHDDを注文したので届いたらCygwinでもやってみます。 レス下さった方々、ありがとうございました。
617 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 12:17:42 ] >>616 >なるほど、mswin32だと修正を待つしかない・・・のかな? バグじゃないから修正はされないんじゃないかな。 1.9では問題ないみたいだけど。
618 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 12:52:49 ] >>608 共通一次ですね
619 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 12:54:26 ] >>616 _kbhit入れたバージョンでも 一文字だけ入れてenterしないときって止まるよね
620 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 13:05:14 ] >>617 バグじゃないんですかね?ruby-list 36068ではバグみたいに言われてる気がするけども。 1.9では問題ないとは!バージョンあげようかなぁ。 >>619 止まりますね。でも、そのほうが便利な気がしないでもないです、私の場合。
621 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 13:51:52 ] >>614 の方法だとキー入力するまでひたすらビジーループなんだが
622 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 15:42:40 ] >>620 Windowsでselectがコンソールに対して効かないのは仕様だろう。 バグだと思うならMSに言ってみるのがいいんじゃないか。
623 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 19:56:56 ] >>621 そんなことないですよ
624 名前:デフォルトの名無しさん [2009/01/20(火) 22:05:16 ] h = {"direct"=>"5", :list=> {"6"=>"南西","7"=>"西","8"=>"北西","1"=>"北","2"=>"北東","3"=>"東","4"=>"南東","5"=>"南"}} 上のハッシュをh.ya2yaml すると direct: "5" ? !ruby/symbol list : ? "1" : 北 ? "2" : 北東 ? "3" : 東 ? "4" : 南東 ? "5" : 南 ? "6" : 南西 ? "7" : 西 ? "8" : 北西 となるのですが、’?’はどういう意味ですか。 そもそも "8":北西 という感じで出力されると思っていたのですが, 期待と違った結果でした。 ruby 1.8.6 (2008-03-03 patchlevel 114)
625 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 22:48:19 ] 1.9っていつリリースされる予定なの?
626 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 01:17:39 ] RC2出てから
627 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 02:00:38 ] >>626 知らないなら答えきゃいいじゃん
628 名前:デフォルトの名無しさん [2009/01/21(水) 02:08:46 ] Japanese O.K.
629 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 02:09:29 ] RC2出たな
630 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 03:13:17 ] a=[1,1,1,2,2,3,4,5,5,5]の配列を b=a|aにしたら[1,2,3,4,5]となりますが、 1->3個,2->2個,3->1個,4->1個,5->3個のように どの要素が何個かぶっていたかというのはどのようにしたらいいでしょうか?
631 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 03:26:54 ] とりあえずは普通に数えればいい overlap = Array.new b.each do |bb| count = 0 a.each do |aa| count = count + 1 if aa == bb end overlap << [bb, count] end overlap.each do |i, n| puts "#{i} の重複は #{n} 個です" end めんどくさい人向け overlap = b.map{|e| [e, a.grep(e).size] }
632 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 03:27:07 ] h=Hash.new h.default=0 a.each do |i| h[i]+=1 end 俺も初心者に毛が生えた程度なので、より良いのがあれば指摘求む
633 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 03:28:53 ] def uniq_c(org) counts = {} org.uniq.each{|e| counts[e] = org.count(e) } counts end とか。#countがどっから入ったか怪しいけど。 こーいう要望は割と定番なのでRuby "uniq -c"とかでググるとよろし
634 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 03:32:36 ] 確認したらArray#countはRUBY_VERSION >= '1.8.7'だった。代わり org.count(e) -> org.select{|x| e == x }.size
635 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 03:40:38 ] 最初のが一番マシだな それ以降のはただのオナニー もしかしたら演算記号メソッドで何かどうにかすればなんかどうにかなると思ったかもしれないけど、 残念ながらそういうのは無い 2つの配列の関係を解析して返すメソッドというのはあっても面白そうだとは思うが、きっとおおむね無駄だ
636 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 03:53:14 ] >>631-634 ありがとございました 書き込んだ後,配列について調べてたらuniqっていうのがあるんですね. >>635 そうです.なにかメソッドがあるのかなと思ったのですが. 数え上げしていけばいいくらいなんで無駄になりますよね.
637 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 05:27:54 ] どこがオナニーなんだよ。数え上げる時は普通にHashを使うだろ つーか>>631 の最初のコードはズボラ過ぎる
638 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 05:38:19 ] a.inject(Hash.new{0}){|h,v| h[v] += 1 ; h }
639 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 05:54:27 ] >>632 が一番マシですね
640 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 06:12:44 ] 普通に考えれば>>632 だよな 少なくとも「最初のが一番マシ」はねーよw
641 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 09:10:58 ] ハッシュは順番が保存されないのがなー
642 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 09:22:00 ] この場合はたぶん順番必要ないよね
643 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 11:52:07 ] 正規表現を使って一致を見てるんだけど 正規表現のパターンの中に「図」っていう漢字をいれると warning: regexp has `}' without escape ってwarningでるんだけど何とかならないですか?
644 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 11:55:22 ] その漢字の文字エンコード(普通、そのスクリプトのファイルの文字エンコード)を正規表現に指定しろ っていうか、そのへんは解説なりなんなりでフォローがあったと思うんだが
645 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 12:04:10 ] >>643 ファイルのエンコードは何つかってる?
646 名前:643 mailto:sage [2009/01/21(水) 12:30:03 ] >>644-645 返事ありがとうございます。 /図/ ってやってるのでエンコードの指定は特に何にもやってないです Regexpクラスかなんかをつかってそのインスタンスにエンコードを指定するってことですか? ファイルはShift-Jisでやってます
647 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 13:00:30 ] require 'jcode' $KCODE = 'SJIS' でとりあえずいいんじゃないの
648 名前:643 mailto:sage [2009/01/21(水) 13:06:04 ] >>647 うまく行きました ありがとうございます
649 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 13:07:18 ] jcode厨がまだいたとは jcodeは正規表現には全く関与しない
650 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 13:39:33 ] >>643 -Kオプションについて調べるがよい
651 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 14:10:38 ] いちいち起動するたびに -K オプション付けなくちゃいけないの?
652 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 14:16:18 ] 1行目 #!ruby -Ks
653 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 14:29:03 ] >>652 i see.
654 名前:デフォルトの名無しさん [2009/01/21(水) 18:46:15 ] データが文字列の内容に数字をふったものを対象にして 数字でソートする場合どんな感じでやればいいでしょうか。 文字数字のままやると小さい数字が後にきたりして、ソートがおかしくなるのですが。
655 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 19:01:10 ] 全部同じ桁にする
656 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 19:02:29 ] sort メソッドの説明は気の利かない書き方をしてるからね あれはブロックの結果がどうなるかでソートされるんだ irb> puts ['30歳', '2歳', '10歳'].sort 10歳 2歳 30歳 irb> ['30歳', '2歳', '10歳'].each{|a| puts a.scan(/\d+/)[0].to_i} 30歳 2歳 10歳 irb> puts ['30歳', '2歳', '10歳'].sort_by{|a| a.scan(/\d+/)[0].to_i} 2歳 10歳 30歳
657 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 19:05:00 ] >>654 数字を振るというのが文字列と別枠なら hash = {3=>"c",2=>"b",1=>"a"} hash.sort.map{|v| v.last}
658 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 19:12:11 ] irb> ['30歳', '2歳', '10歳'].each{|a| puts a.scan(/\d+/)[0].to_i} 30歳 2歳 10歳
659 名前:デフォルトの名無しさん mailto:sage [2009/01/21(水) 19:25:19 ] >>658 あ、すまんね そこのへんだけ直前に書き換えたんだ 案の定間違ってるな irb> ['30歳', '2歳', '10歳'].each{|a| p a.scan(/\d+/)[0].to_i} 30 2 10 ってことで、ブロック内で数字部分を抜き出して整数にしてるんだということがわかってもらえればよかった それぞれの要素に対して「数字部分を抜き出して整数にしたもの」で比較してソートすれば、おそらくうまくいく
660 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 01:31:38 ] >>600 とりあえずC#(.NET3.5)では int j = 1; Thread t = new Thread(new ThreadStart(() => { while (j < 100) { Thread.Sleep(1000); Console.WriteLine(j); j += 1; } })); t.Start(); while (j < 100) { String i = Console.ReadLine(); j += Convert.ToInt32(i); } これが動いたから、IronRubyなら動くかもよw
661 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 04:51:23 ] >>659 そこまで書いたなら最後まで書けばいいのに。 ['30歳', '2歳', '10歳'].sort_by {|a| a.scan(/¥d+/)[0].to_i } または ['30歳', '2歳', '10歳'].sort_by {|a| a =~ /¥d+/; $&.to_i }
662 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 14:26:38 ] ['30歳', '2歳', '10歳'].sort_by {|a| a[/\d+/].to_i }
663 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 14:40:21 ] いや短くすることに意味はないから そんなこと言ったら %w.30歳 2歳 10歳..sort_by{|l|l.to_i} が標準で最短だぞ
664 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 14:45:30 ] たぶん単位とかだと思うけど、そういうのデータの中に含めるのってどうなんだろう 「1.5メートル」より「90センチ」の方が大きくなったりするんだろ? さすがに「2メートル」と「5キロ」とかは混在していないと思うが
665 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 14:51:57 ] 生のデータを生のまま極力取り込んでおきたいという需要はそこそこあると思うよ 数値だけとかに正規化しとけというのはいやもう全くその通りではあるんだが
666 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 14:58:56 ] >>665 そういうのはラッパクラス作って都合の良い方でアクセスできるようにしとく
667 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 15:11:59 ] >>664-665 の見てる世界と>>666 の見てる世界は違うな
668 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 15:20:43 ] データがアクセスされるのは一つの言語からだけとは限らないぞ 3つ言語使ってたら全部の言語でラッパークラスを実装するのか?
669 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 15:32:09 ] それはまんどくさい(´・ω・`)
670 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 15:34:58 ] >>668 1つの言語からだけのことのほうが圧倒的に多いと思うがどうかね 君は移植性の高いC言語を使うべきだと思うよ
671 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 15:46:13 ] >君は移植性の高いC言語を使うべきだと思うよ うむ
672 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 16:10:58 ] データきたないと前の担当者に殺意を抱いたりするよなw
673 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 16:24:45 ] >>667 全くだ 汎用DBソフトに格納される業務データしか扱ったことがないのだろう
674 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 16:33:35 ] ほんとにどうでもいい話なんだけど >>673 そういう人って稀にいるよね 業務でしかプログラミングに関わってない人 それはそれで仕事として効率もいいし好ましいことも多いが、話が全然合わんので困る
675 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 20:13:33 ] 仕事でやっててプログラミングを好きな人はまだ良いが 好きでもなく仕事だからってやってる奴のソースはだいたい汚い。 そういう時は殺意抱くなwww
676 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 01:33:48 ] >>664 >たぶん単位とかだと思うけど、そういうのデータの中に含めるのってどうなんだろう Measureというライブラリを使うと単位系を操ることができる ttp://d.hatena.ne.jp/mrkn/20081025/sappororubykaigi01
677 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 02:30:36 ] >>675 たしかに a1=1 a2=2 a3=3 ... と延々と書かれていたことがある 配列+ループにするとか考えろと思ったが 行数で単価計算されるなら上の方が正解なのかも知れない
678 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 03:00:00 ] 配列として保持するコストを嫌ったのかもしれない
679 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 03:09:40 ] 世の中には虚しいこともあるんだね
680 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 03:57:53 ] >>678 がたぶん正解だと思う 行数稼ぎか配列利用法が理解できなかった(または利用禁止)な可能性も充分あるが
681 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:01:09 ] つか、言語と実行環境に強く依存するな 配列にしてしまうと保持と参照コストが妙に高くなる言語というのはなんかどっかにあったはず
682 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:39:18 ] array=[a,b2c,d2e,f,g]を[a,[b,c],[d,e],f,g]に分解するにはどうすればいいですか?
683 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:46:41 ] >>682 標準的な方法はないから、まあ好きにやれ 要素ごとに正規表現で分割して自力で配列を作るしかないな
684 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 04:55:12 ] >>682 split("2")とpushでOKじゃね?
685 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 05:18:20 ] [a,b2c,d2e,f,g] は ['a','b2c','d2e','f','g'] という意味なのか?
686 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 05:23:33 ] >>685 この文脈ではそう考えるのが自然じゃね 配列の要素が参照している変数名の英字部分を ネストした配列の要素の参照の変数名に反映したいという込み入った希望かもしれんが
687 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 05:34:30 ] こうですか?わかりません >> ['a','b2c','d2e','f','g'].map{ |e| /2/ =~ e ? e.split(/2/) : e } => ["a", ["b", "c"], ["d", "e"], "f", "g"]
688 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 06:33:01 ] EOFにマッチする正規表現、または"末尾"がEOFであることを手短にチェックする方法ないですかね キー1: 値1 キー2: 値2[EOF]
689 名前:227 mailto:sage [2009/01/23(金) 07:22:40 ] 昔のことになりますが、カテゴリ取得に関して質問したものです。 ログを見ていたら同じようなことが質問されていたのでまた、質問をさせていただきます。 search('a').select{|a| /cat_/ =~ a['href']}.map{|a| a.inner_text} カテゴリが一つだけ指定されている場合は上のものでうまく言っていたのですが、 一つの記事で二つ以上指定されている場合にうまくいきません。 理想としてはcategory=["A",["A","B"],"A","B",["A","B","C"]] のようにしたいのですが
690 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 07:50:36 ] rubyってhtmlspecialcharsあるの?
691 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 07:52:37 ] >>689 もっと具体的なhtmlの例を出してくれないと答えられないような…
692 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 07:58:05 ] >>689 selectってなんだっけ、findだっけfind_allだっけ …allのほうか カテゴリってのは一番下にあるやつだな、他のブログではタグとか言われてるものだ >>246 では例が悪いので、適当な大手のアルファルアモザイク例に出すぞ ttp://alfalfa.livedoor.biz/archives/cat_50026947.html これから [ ["ネット・PC・技術", "短レス"], ["ネット・PC・技術", "短レス"], ["ネット・PC・技術", "知識・薀蓄"], … ] という配列を抽出したいという要望でいいか? 「記事単位でsearchかけてから、それの返り値のHpricot::Elemなどに対してmapを使う」が答 なにをどうやって記事単位とみなすかはそのサイトのHTML構造読め
693 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 08:11:05 ] >>690 あるよ
694 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 08:17:26 ] >>691 >>692 さんが例に上げたサイトのようなものです。 >>692 さんが書かれたような配列です。記事単位はデザインの雛形によって変わってくるので調査済みです。 今移動中なんで確認できませんが, 記事単位.search('a').select{|a| /cat_/ =~a['href']}.map{|a|a.inner_text}みたいなものですか?
695 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 08:17:35 ] require 'rubygems' require 'hpricot' require 'open-uri' require 'kconv' doc = Hpricot.parse(URI.parse('blog.livedoor.jp/dqnplus/ ').read) result = doc.search('div.hentry').map{|div| [div.at('h3.title%20entry-title').inner_text, div.search('a').find_all{|e| /archives\/cat_/ =~ e['href']}.map{|e| e.inner_text}] } result.each do |post| puts "#{post[0]}[#{post[1..-1].join(', ')}]".toutf8 # 画面表示のエンコードに合わせること end けっか: FF11、バグを利用してアイテムを複製した500人の廃人を強制退会処分に [びっくりニュース, ゲーム] 次期ロシア正教会総主教のネット人気投票、日本人大主教がダントツ1位に…「日本アニメのファンが原因」とロシアマスコミ [びっくりニュース, 国際] 「孫悟空」の起源は韓国のサルだった…韓国教授が主張 [痛いニュース, 韓国・北朝鮮] パッケージに萌えキャラが描かれた「ツンデレカレー」「萌カレー」他が馬鹿売れ [おバカなニュース, 食生活] 「若者、結婚が遅い…どんな恋愛してるのか」「日本はなぜ子供産むのが難しいのか」など、小渕大臣が少子化分析チーム [痛いニュース, 政治・経済] … タグのネスト云々はこういうことをやりたいのだと推測 タグが1個しかない場合も要素1の配列になるので注意
696 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 08:23:21 ] >>695 ありがとうございます。すぐに確認できませんが,帰宅したら確認します!