1 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 08:21:23 ] プログラミング言語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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
222 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 23:07:58 ] require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) zero = ary.uniq.inject(Hash.new){|h,w| h[w] = 0 ; h } window = 6 hout = Hash.new ary.each_with_index do |key,i| (hout[key] = zero.dup).delete(key) unless hout.key?(key) ary[i+1,window].select{|e| e != key }.each {|word| hout[key][word] += 1 } end
223 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:25:03 ] 核と思われる部分だけを抜き出すとこんなことになるんだけど、 問題をうまくまとめれてないんじゃない? もうちょっと整理してから再度質問して。 require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window =6 ary.size.times { |i| j = i + 1 p [":ary[#{j},#{window}]", ary[j, window]] } t217.3.rb [utf-8][unix] :!ruby t217.3.rb [":ary[1,6]", ["w2", "w3", "w4", "w2", "w3", "w1"]] [":ary[2,6]", ["w3", "w4", "w2", "w3", "w1", "w1"]] [":ary[3,6]", ["w4", "w2", "w3", "w1", "w1", "w5"]] [":ary[4,6]", ["w2", "w3", "w1", "w1", "w5", "w2"]] [":ary[5,6]", ["w3", "w1", "w1", "w5", "w2", "w3"]] [":ary[6,6]", ["w1", "w1", "w5", "w2", "w3", "w4"]] [":ary[7,6]", ["w1", "w5", "w2", "w3", "w4"]] [":ary[8,6]", ["w5", "w2", "w3", "w4"]] [":ary[9,6]", ["w2", "w3", "w4"]] [":ary[10,6]", ["w3", "w4"]] [":ary[11,6]", ["w4"]] [":ary[12,6]", []]
224 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:25:52 ] ary[12, 6]がおかしいと思わない?
225 名前:203 mailto:sage [2009/08/18(火) 23:44:32 ] >>221->>224 ありがとうございます。 hout=Hash.new ary.size.times{ |i| hin=Hash.new(0) でhinを初期化しているから同じkeyが来たときに上書きされてしまっているのが一つ問題と 同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする方法がわからないのがもう一つの問題です。 mergeの方法は>>205-206 ,>>208 さんのやり方になるのかなと思ってます。 >>224 ary[12,6]はそれでもOKだと思ってます。 そこは加算しなくていいよーということで。だめなんでしょうか?
226 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:45:41 ] >>215 @mecab = MeCab::Tagger.new([$0]) ってかいてあるところに @mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...") みたいな感じで直接Mecab用のオプション書けばうまくいくよ
227 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:53:51 ] >>225 ary[12, 6]をきちんと認識しているのなら何も問題はないでふ ただ、ここがバグの原因じゃないかな?と思っただけで。 Hash.new(0) してあるんだから、 「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」 は、 h["unknown_value"] += unknown_value_key と直接書けばよいでしょ。 以下のコードの実行結果の予想つく? h0 = Hash.new(0) hash = {} p h0[:unknown_keh0 = Hash.new(0) hash = {} p h0[:unknown_key] p h0[:unknown_key] += 5 p hash[:unknown_key] p hash[:unknown_key] += 5 y] p h0[:unknown_key] += 5 p hash[:unknown_key] p hash[:unknown_key] += 5
228 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:55:27 ] 上のはゴミコードが入っちゃった。ごめん。 こっちのコードの実行結果の予想つく? h0 = Hash.new(0) hash = {} p h0[:unknown_key] p h0[:unknown_key] += 5 p hash[:unknown_key] p hash[:unknown_key] += 5
229 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:57:18 ] rails仙人やーい
230 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:04:07 ] >>228 0 5 0 5 では・・・・ないんですか?すいません。 あと:unknownという表記になれていませんのでそこがわかりません。
231 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:10:07 ] windows用に作られたRubyファイルを動かしたいのですが、ディレクトリがDOSの¥が使われていてファイルを指定できません・・。 No such file or directory - .\/log.txt (Errno::ENOENT) このようになります。 ディレクトリ指定をLinux用の表現にしたいんですけど、ソースを見てもまったくわかりません。 その部分を書き換えられれば動くと思うんですが、何をどう書き換えればいいかご教授いただけないでしょうか
232 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:14:36 ] >>226 @mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...") と書いてみましたが・・。 何を見て何のオプションを書き加えていけばいいんでしょうか・・?
233 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:16:04 ] >>231 原因がわかってるように見えるので、むしろ何がわからないのかわかりません 適当な、それっぽいコード塊でも提示すれば何か答えようがあるかもだけど
234 名前:チンパンジー愛ちゃん [2009/08/19(水) 00:16:39 ] >>230 :aaaとかはシンボルっていうんだけど、 シンボルが難しいんならいいや以下のコードで考えて。 h0 = Hash.new(0) hash = {} # Hash.new と等価 p h0["unknown_key"] p h0["unknown_key"] += 5 p hash["unknown_key"] p hash["unknown_key"] += 5 実行結果の予想は間違ってるよ。 0 5 nil h.rb:6: undefined method `+' for nil:NilClass (NoMethodError) 自分で確認してね。 あとさ、Hash.newの挙動が分かってないので、Hashの初期化について学んで来てください。
235 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:16:56 ] >>231 それで躓くとなるとRubyどころかプログラム自体初心者じゃないかと思う でなければよほど面倒なことをしてるソースか どちらにせよソース提示が必要かと
236 名前:チンパンジー愛ちゃん [2009/08/19(水) 00:27:23 ] >>232 ええーっ! @mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...") ってほんとうに実行したの? argの意味が分からない系のヒトなのか チンパンジー愛ちゃんでもできたのにねー まあ、いいや。 OSとOSのバージョン・種類、rubyのバージョン、 mecabのバージョン、mecab-rubyのバージョン、mecab用辞書のバージョン @mecab = MeCab::Tagger.newとして実行ときのエラーメッセージ これらすべてを答えてね。 # 個人的な興味として何でghotiなんて使おうと思ったの?
237 名前:チンパンジー愛ちゃん [2009/08/19(水) 00:28:38 ] 追加で、ruby, mecab, mecab-ruby, mecab用辞書 これらすべてのインストール方法も書いてね。
238 名前:203 mailto:sage [2009/08/19(水) 00:30:44 ] >>234 ありがとうございます。シンボルですか。了解です。 h0 = Hash.new(0) #ハッシュh0を作り初期値は0 hash = {} # Hash.new と等価 #ハッシュhashを作成(ハッシュの箱を作っただけ) p h0["unknown_key"] #h0のkeyをunknown_keyとしてそのvalueを出力->初期値0 p h0["unknown_key"] += 5#↑のkeyのvalueに5加算 p hash["unknown_key"] #hashのkeyをunknown_keyとしてそのvalueを出力->でも中身が入ってないからnil p hash["unknown_key"] += 5 #↑中身がわかってないのに5たしてんじゃねーよ ということですね。少しわかりました。
239 名前:231 mailto:sage [2009/08/19(水) 00:30:53 ] エラーの行は from ******.rb:444:in `open' from ******.rb:444:in `store_text' def store_text(lines) ary = [] lines.each do |line| ary << line.gsub(/\s+/, ' ').strip ←ココ 444行目 end ary.each do |line| @text << line end File.open(@text_filename, 'a') do |fp| ary.each do |line| line.chomp! fp.puts line end
240 名前:231 mailto:sage [2009/08/19(水) 00:31:59 ] from ******.rb:239:in `memorize' def memorize(lines) @dic.store_text(lines) ←ココ239行目 if @dic.learn_from_text @dic.save_dictionary end end from ******.rb:779 require 'readline' ←779行目 ****** = ******.new(".\\") puts "Welcome to The ******" while (str = Readline.readline("> ", true)) break if /^(exit|quit)?$/.match(str) ******.memorize(str) res = ******.talk puts res end ******はファイル名です。
241 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:37:06 ] >>236 OS Ubuntu9.04 ruby 1.84 mecab 0.97 インスコ方法とかは ttp://d.hatena.ne.jp/shohu33/20090216/1234781661このページを参考に。というより、コピペでコンソールに張り付けて実行してインスコしていきました・・。 rubyなどは全部apt-getです。 ghotiでtwitter用のBOT作るんだ><
242 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:38:20 ] >>231 =>>239-240 @text_filename この中身をセットしている所をチェックしてみれば? もしくは単純に、 File.open(@text_filename, 'a') do |fp| の直前で、 p @text_filename してみるとか。 まあごっつい原始的なデバグ法で気が引けるが。
243 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:41:00 ] 人工無脳流行ってんの? >>240 その*****とやらのクラスのinitializeの第一引数どうなってる? >****** = ******.new(".\\") の .\ に log.txt を結合してるんだと思う
244 名前:242 mailto:sage [2009/08/19(水) 00:42:50 ] >>243 をお。 ちゃんと読めばそこまで読み取れるのか。斜め読みいくないね。人口無能レベルのレススマソ
245 名前:195 mailto:sage [2009/08/19(水) 00:49:25 ] 流れをぶったぎってすみません。ちょっと質問。 配列のデフォルト値の指定ってできますか? ハッシュ(デフォルト値==0)だったら hoge = Hash.new(0)だけど 配列は同じ構文で要素数指定になりますよね。 ary = [] ary.default(0) ary[3] #=> 0 みたいなことがやりたいのです。
246 名前:231 mailto:sage [2009/08/19(水) 00:51:06 ] def initialize(dirname) def initialize(dirname=nil) def initialize(buf) def initialize(ary=nil) 第一引数がわかりません>< ruby難しいですorz
247 名前:チンパンジー愛ちゃん [2009/08/19(水) 00:51:50 ] >>239 なんだー?それは。 ghoti.rbが実行できないわけではないのか。 ココ444行目とかかかれても何のエラーか分かんねーよ。 どーせnilがsub呼んだってエラーだろーけどなー 239行目は分からない、でも@dicをみるにmecabの辞書をインストールしてないんでしょ。 779行目はreadlineっていうライブラリがないってだけでしょ。 で、そういうライブラリなし・辞書なしとかのエラーだと予想したからこそ、 >>236-237 の OSとOSのバージョン・種類、rubyのバージョン、 mecabのバージョン、mecab-rubyのバージョン、mecab用辞書のバージョン @mecab = MeCab::Tagger.newとして実行ときのエラーメッセージ これらすべてを答えてね。 追加で、ruby, mecab, mecab-ruby, mecab用辞書 これらすべてのインストール方法も書いてね。 って質問を書いておいたんだけどな。 どうやってインストールされていたか分からないなら分からないと正直に書いて。 とりあえず答えてくれれば解決方法を伝えるようにがんばるけど答えないなら知らない。諦めてね。 >>203 (208) >>227 で愛ちゃんが書いた以下のコードを理解してもらいたくって >>228 , >>234 を書いたってことを理解してね。 ------------------------------------- Hash.new(0) してあるんだから、 「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」 は、h["unknown_value"] += unknown_value_key と直接書けばよいでしょ。
248 名前:チンパンジー愛ちゃん [2009/08/19(水) 00:53:11 ] およよ、書かれてた。ごめんね。 リロードせずに書いちゃった。 >>247 はとりあえずキャンセル
249 名前:チンパンジー愛ちゃん [2009/08/19(水) 00:59:00 ] 質問者が入り乱れてて分け分からなくなってきた。 チンパンジーの限界か! >>232 の質問の続きだと思って>>239 のレスに答えてた。 >>232 には>>247 で悪いことをした。ごめんね
250 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 01:00:32 ] 愛ちゃんかわいいよ愛ちゃん てかコテハンうぜぇw
251 名前:231 mailto:sage [2009/08/19(水) 01:09:23 ] ****** = ******.new (".\\")→(ARGV[0] || "data")でいいんですかね・・
252 名前:231 mailto:sage [2009/08/19(水) 01:10:30 ] むりですね。。
253 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 01:14:25 ] >>251-252 なんか吹いた ******.new (".\\") のコード(initialize)を出せって言われとろーがwww 大体その******は、全部同じものか?違うなら、HogeとかPageとか適当に分けやがれw
254 名前:チンパンジー愛ちゃん [2009/08/19(水) 01:15:11 ] >>247 何でUbuntu9.04にruby1.84が入っているんだ。 私も9.04使ってるけどruby1.87が入ってたけどな。 それとリンク先はpythonの説明だったぞ。 なぜruby使いにpythonの記事を読ませた!死罪也! まさかとは思うけど、pythonとrubyの区別がついてなくて リンク先の記事はrubyの解説だと思っているってことはないよね? @mecab = MeCab::Tagger.new って実行してエラーメッセージを貼ってね。 個人的にはmecab用の辞書入れていないことが問題だと思っているけどね。 あと、mecab-ruby, mecab用辞書のバージョンもちゃんと書いてね。
255 名前:231 mailto:sage [2009/08/19(水) 01:25:16 ] >>253 ******は同じ文字列です。。 コードのだしかたが・・。 module ****** def ******.new(*args) ******::Core.new(*args) end def ******.init_dictionary(dirname) dic = Dictionary.new(dirname) dic.load_text dic.learn_from_text(true) dic end class Dictionary TEXT_FILENAME = '******.txt' DIC_FILENAME = '******.dic' def Dictionary.load(dirname) dic = Dictionary.new(dirname) dic.load_text dic.load_dictionary dic end こうですか?わかりません><
256 名前:203 mailto:sage [2009/08/19(水) 01:25:22 ] >>247 >Hash.new(0) >してあるんだから、 >「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」 >は、h["unknown_value"] += unknown_value_key >と直接書けばよいでしょ。 すいません。ここが理解できてないです。 hout=Hash.new ary.size.times{ |i| hin=Hash.new(0) b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ } b.each {|count| hin[count] +=1} pp hin puts "@@@" pp hout puts "@@@" } pp hout ------- hout[ary[i]] += hin.valuesだとhoutは初期値がないから undefined method `+' for nil:NilClass (NoMethodError) ですもんね・・・・。
257 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 01:27:53 ] >>255 おk。わかった。 とりあえず、>>231 に戻って ******.new (".\\") を ******.new (".") にしてみろ。 それでダメなら、ちゃんとソース嫁。
258 名前:231 mailto:sage [2009/08/19(水) 01:29:39 ] >>257 ネ申 ありがとうございます。ありがとうございます。
259 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 01:34:02 ] >>258 怖い、怖いよw 本当にそれでいいか、一度ソースを読むことを激しくお勧めする。 てかRubyほとんど関係ねえ!
260 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 01:37:44 ] >>259 文字化けしますが、文字コードの謎の不具合のせいなので調整すれば大丈夫そうです。 あとはPerlでの作業なのでなんとかなるでしょう。。 Ruby難しいです・・。ソース読めません・・。
261 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 01:42:18 ] >>203 >>222 だけどあれじゃだめなの?それとも途中経過の出力が必要? ary.each_with_index do |key,i| (hout[key] = zero.dup).delete(key) unless hout.key?(key) ary[i+1,window].select{|e| e != key }.each {|word| hout[key][word] += 1 } pp hout[key],'@@@',hout,'@@@', end pp hout
262 名前:203 mailto:sage [2009/08/19(水) 01:47:10 ] >>222 ありがとうございます。出力結果はOKですし、ソースも読解します。 でも、まず、自分が書いた奴がなぜ結果まで持って行けないかわかってないので チンパンさんに教えてもらっている感じです。
263 名前:チンパンジー愛ちゃん [2009/08/19(水) 01:57:45 ] >>256 「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」 以下の時にA.B.と分けて考えよう。 h1 = hash.new(0) h1 = h1.merge({"a" => 2, "b" => 3})# h1.merge!({"a" => 2, "b" => 3})でも可 h2 = {"a" => 3, "c" => 8} A.同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算 B.なければmergeする A.これは、以下のままでよいから特に難しくないね。 h1["a"] += h2["a"] B.は h1["c"] += h2["c"] と等価なんだよね。 p h1["unknown_key"] += 5 を思い出してね。 すると、A.Bの時に場合分けは特に必要なく、 h["unknown_value"] += unknown_value_key のコードで事足りるよね。
264 名前:203 mailto:sage [2009/08/19(水) 02:16:49 ] >>263 A,Bの場合分けが入らないのは理解しました。 h["unknown_value"] += unknown_value_key これは ハッシュhにunknownのvalueをkeyとしたものに unknownのvalueのkeyのvalueを足しているということでいいんですか? アンダースコアをどのように使っているかわかりません。 hout[ary[i]] とやらないと w1"=>{"w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2} のw1=>が得られないと思っているのですが、それもちがいますか?
265 名前:231 mailto:sage [2009/08/19(水) 02:19:29 ] else chr = /./m.match(str)[0] result << chr if num str = Regexp.last_match.post_match end この部分で ぬるぽ って言われるんですが。 NilClass (NoMethodError) 単なる文法間違いですか・・?
266 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 02:19:39 ] >>262 「自分で書いた」ってのは>>209 の事かな あれがうまく行かないのはこの行で前のループのデータを上書きしてる為。 hout[ary[i]] = hin ここに>>208 氏のメソッドを使えば>>220 に近い結果が出せた。 add(hout,ary[i],hin) マージに拘りすぎ、普通に枚挙すれ
267 名前:チンパンジー愛ちゃん [2009/08/19(水) 02:30:13 ] >>264 アンダースコアは気にしないで。単語の区切りに使っただけ。 こっちの方が迷わなくていいかな。 ×h["unknown_value"] += unknown_value_key ○h["unknownkey"] += unknownvalue これはhのハッシュに存在していないキーのことをいいたかったんだけど、 愛ちゃんの変数名の付け方がおかしかったね。ごめんね。 > これは ハッシュhにunknownのvalueをkeyとしたものに > unknownのvalueのkeyのvalueを足しているということでいいんですか? 話がややこしくなってるね。変な変数名でごめんね。 > hout[ary[i]] とやらないと... これは正しいよ。そうしないと得られないよ。
268 名前:203 mailto:sage [2009/08/19(水) 03:10:28 ] >>266 ありがとうございます。上書きしていたのは気がついたのですがそのように書くしか思いつかなかったので手がでませんでした。 addでやったところvalueが0の所は出力されていませんが、欲しいモノで出力されました。 >>267 変数名に関して理解しました。 しかし、hout[ary[i]] = hinの所をどのようにh["unknownkey"] += unknownvalue と結びつけるかわかりません。 h["unknownkey"] += unknownvalue はhinの方ですよね。
269 名前:チンパンジー愛ちゃん [2009/08/19(水) 03:51:55 ] > しかし、hout[ary[i]] = hinの所をどのようにh["unknownkey"] += unknownvalue と > 結びつけるかわかりません。h["unknownkey"] += unknownvalue はhinの方ですよね うんにゃ、違うよ。hinじゃないよ。 h["unknownkey"] += unknownvalue と結びつけて考えないといけないのは以下の箇所 hout[ary[i]] = hin# ここを以下のように変更すれば期待通りに動くはず hin.each do |key, value| hout[ary[i]][key] += value end
270 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 04:43:35 ] 的確なレスもできないくせにコテうぜえ
271 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 05:30:04 ] ナツノオモイデ君はどこでも厄介だ >>265 本当に何も考えていないWindows用スクリプトなのなら日本語はShiftJIS決め打ちだろ 入力する日本語を全部ShiftJISにして$KCODE相当もShiftJISにしてみ
272 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 06:01:39 ] >>245 arr = Array.new p arr[3] #=> nil これを「nil ではなく 0」にしたいのだと推測 できません 「arr[3] が nil なら 0 を代入」という手順を経るのが通例です この明示的な動作で要素3までの配列が確定され、「空」だった要素にはnilが代入されます 配列の自動初期値設定というのはあったらあったで便利っぽい機能なんですが、おそらくは 「nil以外のオブジェクトが勝手に若い要素全てに代入される」 という動作が Ruby 添付クラス的にキモいということで嫌われたのでしょう もし必要なサイズがあらかじめわかっているのなら、その大きさの配列を作って Array#fill で埋めるか arr = Array.new(5) arr.fill{ 0 } p arr[3] #=> 0 p arr #=> [0, 0, 0, 0, 0] あるいは new のときにやっちゃってください arr = Array.new(5){ 0 } p arr[3] #=> 0 p arr #=> [0, 0, 0, 0, 0] [] メソッドで参照しただけで若い要素が 0 で埋まる配列クラスと言うのを自作しても構いませんが、多分動作遅いと思われます
273 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 11:00:07 ] >>245 Rubyの配列にはそういう機能がないです。残念でした。 代替案としては arr[x] で参照するかわりに (arr[x] ||= 0) とするとか。 たとえば arr = [1, 2, 3] puts (arr[5] ||= 0) + 1 みたいな。 あとは Array#[] を上書きすればいいのかなー class Array def [](x) val = super(x) val = self[x] = 0 if val.nil? return val end end とか。
274 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 11:12:08 ] >>231 めんどくせぇソース全文うpってくれ
275 名前:203 mailto:sage [2009/08/19(水) 11:43:54 ] >>263 遅くなってすいません。こうですか? require 'pp' ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window =6 hout=Hash.new ary.size.times{ |i| hin=Hash.new(0) b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ } b.each {|count| hin[count] +=1} #hout[ary[i]] = hin hin.each do |key, value| hout[ary[i]][key] += value end } pp hout 実行すると at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError) from mat.rb:11:in `each' from mat.rb:11 from mat.rb:5:in `times' from mat.rb:5 となってしまいます。
276 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 12:01:02 ] >>275 自分で考えてほしいからエラーのヒントだけ >hout=Hash.new >#hout[ary[i]] = hin >hout[ary[i]][key] += value >at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)
277 名前:203 mailto:sage [2009/08/19(水) 12:32:53 ] >>276 hout[ary[i]][key] Hashが二つ[][]を取っているのが気持ち悪いですし、それがundefined method `[]' for nil:NilClass (NoMethodError) を起こしているのだと思いますが・・・・。そうだとしても解決がわからないです。
278 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 12:44:23 ] >>277 >hout[ary[i]][key] k = ary[i] x = hout[k] y = x[key] と同じ で、このときのxはなんだとおもう?
279 名前:203 mailto:sage [2009/08/19(水) 12:50:17 ] >>278 xはhout[ary[i]]ですか? ということはhout[ary[i]]が一つのハッシュでhout[ary[i]][key]だとそれのキーということですか?
280 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 12:58:15 ] なんどめだナウシカ ハッシュの h[key] は、「ハッシュ機構」という特殊なものがあるわけじゃなくて 「オブジェクト h の [] メソッドに引数 key を渡している」 という処理を簡単に表記できるように特別扱いされたものに過ぎない h = {'one' => 1'} p h['one'] #=> 1 p h.[]('one') #=> 1 つまり、h['one']['two'] という表記があったなら、それは h.[]('one').[]('two') というメソッドチェーンを表しているに過ぎない メソッドチェーンだから、[]('two') のレシーバ、つまりドットの前の、h.[]('one') の返り値、 が nil だと普通に NoMethodError になる そんだけ
281 名前:203 mailto:sage [2009/08/19(水) 12:58:33 ] あぁ、hout[ary[i]][key]はhout[ary[i]]のkeyがkeyの時のvalueですね
282 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 13:14:39 ] これを一括ダウンロードするのってどうやるの? www.boostermp3.com/audio/index.php?search=perfume
283 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 13:27:56 ] うぜえからダウンローダー使うなってページ構造に書いてあるな まあ知識がないなら手作業でやりゃいいんじゃねえの
284 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 13:34:11 ] JavaScriptのリンククリックするだけのように見えるから JavaScriptのリンクをクリックできるライブラリ使えばできそうな気はする 内容が内容だけにこれ以上は自力でやれとしか
285 名前:203 mailto:sage [2009/08/19(水) 14:03:15 ] >>280 すいません。ハッシュ機構というものがあるような感じで書いていました。 メソッドチェーンということはと思って hin.eachの前で p hout[ary[i]]をしたところ返り値がnilでした. ということは hout=Hash.newのところが問題になってくるのでしょうか?
286 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 14:09:22 ] >>285 そりゃ唯一の代入をコメントアウトしちゃったらnilしか返ってこないわな
287 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 14:22:23 ] よし、ではハッシュの初期値を使うのは禁止だ 理由は、全く理解していないから 望ましい処理を自力で一度書け どういう時にどうなっていて欲しいかを if で条件分岐しろ
288 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 14:25:13 ] なんかみんなを混乱させているようだね。 >>275 >at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError) これを説明すると、まずat.rbの12行目でエラーが起きている。 エラーの内容は、nilに対して '[]' というメソッドを実行しようとしているため。 つまり nil[i] のようなことをしている。 at.rbの12行目がなにかわからないけど、hout[ary[i]][key] だとしたら、 ・aryがnilのせいで ary[i] がエラー ・houtがnilのせいで hout[ary[i]] がエラー ・hout[ary[i]]がnilのせいで hout[ary[i][key] がエラー のどれかが原因。 あとは自分で調べて。
289 名前:231 mailto:sage [2009/08/19(水) 14:52:04 ] >>274 遅くなりましたが>>231 .255.258.259.265のソースの全文です。。 ttp://2sen.dip.jp/cgi-bin/upgun/up1/source/up31158.zip
290 名前:チンパンジー愛ちゃん [2009/08/19(水) 15:17:23 ] 初心者が混乱しているときは大抵教え方が悪いと思っていたけどやっぱりそうだった。 ごめん、答えだけ書くね。大体>>220 と同じ出力になるよ。"w5" => {...}だけ違うけど。 require 'pp' ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window =6 hout=Hash.new ary.size.times{ |i| hin=Hash.new(0) b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ } b.each {|count| hin[count] +=1} #hout[ary[i]] = hin if hout[ary[i]].nil? hout[ary[i]] = hin else hin.each do |key, value| hout[ary[i]][key] += value end end } pp hout
291 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 15:24:45 ] 的確なレスもできないくせにコテうぜえ
292 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 15:25:05 ] >>289 やっぱsixamoかよ、なんでわざわざ名前伏せるんだw でもこれ微妙に改変されててバージョン情報に偽りが・・・まあこの際どうでもいいか とりあえずホンモノ使っときゃいいんじゃね yowaken.dip.jp/sixamo/
293 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 15:32:10 ] >>292 本物はRubyのバージョン的に動かないって書いてあったので・・。 動かしてみた感じでは本物は受け答えできず。 改変版は数行実行したのちエラー。 ログのTXTファイル空にしたらまた動くので、文字コードとか?文章作成あたりでエラーになってると予測。 本物より動きそうなんですがね。。
294 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 15:42:14 ] 厳しい言い方だが、 あなたがただのユーザーなら、Rubyで動作するプログラムは現存しないので諦めれ あなたがプログラミングを行う者なのなら、あなたが自力で全体修繕して作れ どっちか
295 名前:203 mailto:sage [2009/08/19(水) 15:58:50 ] >>286->>288 ,>>290 ご指摘ありがとうございます。 各クラスのメソッドの知識がないみたいなのでそこを勉強して出直してきます。 また、初期値なども勉強してきます。 昨日からいろいろな人に教えていただきましてまことにありがとうございます。
296 名前:チンパンジー愛ちゃん [2009/08/19(水) 16:15:54 ] mecab坊やはどうなったの?解決したの?
297 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 16:28:45 ] 的確なレスもできないくせにコテうぜえ
298 名前:デフォルトの名無しさん [2009/08/19(水) 16:48:22 ] ここまで全部読み飛ばした。 寝る。
299 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 17:02:48 ] とりあえず みんな おつかれ
300 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 18:36:53 ] >>293 Ruby1.9なら1.8を もし引数無しで起動したならリンク先ちゃんと読め
301 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 19:09:17 ] 1.8w
302 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 19:48:41 ] >>290 >初心者が混乱しているときは大抵教え方が悪い 名言だな。こんどから>>1 に追加してほしいくらいだ。
303 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 20:06:36 ] 本人が言うから名言なんであって もし質問者側からそんなこと言われたらたまったもんじゃないな
304 名前:チンパンジー愛ちゃん [2009/08/19(水) 21:29:48 ] 教える側は常に心の奥底で思っていないといけないことですよ。 独りよがりの教えほど迷惑なものはありませんから。
305 名前:191 [2009/08/19(水) 22:21:17 ] すまん、俺が変な野郎(>>192 )を呼び込んでしまったようだ orz... あとは俺に任せてくれ。
306 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 22:30:23 ] どっちもサルに見えるのだが
307 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 03:35:31 ] 逆引きRuby誰か書き足してくれ
308 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 07:19:18 ] >>307 どっちの逆引き?
309 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 08:08:59 ] とりあえず、逆引きRubyという話題を振る時は、 どちらの逆引きか、逆引きの方か、逆引きの方かはっきり囲うな?
310 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 08:12:14 ] 日本語でおk
311 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 08:58:41 ] レシピブック初版にはお世話になったけど 最近いろいろあるから次買うとき迷うな >>309 書き足すっていうぐらいだからWikiのほうだろう
312 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 13:38:05 ] Emacs の ruby-mode で =begin と =end がインデントされてたいそう困ってるんだけど これって困ってる人いないのかな
313 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 14:06:37 ] >>304 そこまで自覚があるなら、さっさと消えろよ
314 名前:デフォルトの名無しさん mailto:sage [2009/08/20(木) 17:19:03 ] >>312 あー,それ確か俺も愕然とした記憶が。 「=begin, =end は使わないことにする」で解決!
315 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 10:58:26 ] シリアルポートからデータをgetsで読んでます。 データは一行ずつ出力されるので問題は生じません。 しかし、特殊な設定情報だけは複数行出力で、行数が不定です。 このような何行か分からない出力を受け取るにはどのような手法が適しているでしょうか?
316 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:09:32 ] 行とい考え方を無くせばいい ただの改行文字だろ
317 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:10:20 ] 設定情報用の一時変数を確保しておいて、 設定情報1行目だったら通常の処理飛ばしてそこに溜めるようにすれば?
318 名前:315 mailto:sage [2009/08/21(金) 11:26:15 ] ありがとうございます。 とりあえず、一行ずつ << 演算子で設定情報用の配列の末尾に追加していくことにしました。 EOFがないので終了条件をどうするか悩んでみます。
319 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:40:13 ] >>318 EOFって全体の? 終了データが流れてこないとかpingみたいな定期送信がないなら 手動停止させるのが普通だと思う 可変長データなのにサイズ情報も終端情報もないのだとしたら 次の通常のデータが送られてきた時にバッファ吐き出して設定処理するとか
320 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 11:43:57 ] そりゃデータフォーマットがわからにゃなんとも
321 名前:315 mailto:sage [2009/08/21(金) 11:58:57 ] >>319 全てのデータを受信できるまで、timeoutモジュールを使って少し待ってからgetsの待ちを解除してみます。
322 名前:デフォルトの名無しさん mailto:sage [2009/08/21(金) 13:43:36 ] 自作のスクリプトがあります libディレクトリを作ってファイル分けしてみたら10ファイルくらいになりました んで、これを日常で使いたいと思います 「開発ディレクトリ」と「実行ディレクトリ」を分けなければなりません (動作しない状態であることが多い開発中のスクリプトをcronなどで触らせたくない) どこか適当なディレクトリに「インストール」してバージョンを維持するのがいいと思ってます 最初は rubygem パッケージにすることを考えましたが、 require 'rubygems' で1秒近くかかる環境なので正直あまりやりたくありません (たぶん、スクリプト本体の実行時間のほうが短い) これ以外になにかてきとーな方法はありませんか?