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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
152 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:18:07 ] >>151 initialize の引数はたぶん7つだと思うよ っていうか、それだと個々のインスタンス生成する意味がねえ
153 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:20:39 ] >それだと個々のインスタンス生成する意味がねえ でも課題の内容からすると、まさにその方法を想定してるんだよな、たぶん…
154 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:20:41 ] >>152 そこまで面倒見る気はないw クラスが自分のインスタンスのサーチをするサンプルを示しただけ。
155 名前:デフォルトの名無しさん [2009/01/07(水) 19:24:07 ] >>154 サンプルありがとうございます。 でも最終的に欲しい値は>>142 でいう"s1"か"s2"なんですorz
156 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:31:20 ] >>155 ( ゚Д゚)<えっ インスタンスを入れた変数の名前を文字列として知ってどうするの? まさかevalするわけじゃないよね。 >>151 で s1 = Student.new("foo") としたあとに p s1 p Student.find("foo") このふたつが等しくなるんだけど、それでも変数名が必要? (Class.newやStruct.newは代入した変数名に依存した処理をしてるけど あれってスクリプトレベルでできたっけ?)
157 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:36:22 ] >>155 >>150 に答えて これがしっかりしてないと外部の人間はメソッドが作れないよ 課題の一部だっていうんだから、きっとfindメソッドを他のどこかで使うんじゃないかい?
158 名前:デフォルトの名無しさん [2009/01/07(水) 19:39:55 ] s1 = Student.new(引数7つ) s2 = Student.new(引数7つ) s3 = (ry Student.find("引数に対して検索文字列") # ↑ここで検索文字列を引数に持つのがs1〜s3のどれか判定 s●.他の処理 としたかったんです… 最初からこう聞いてれば良かったですねorz
159 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:43:34 ] >>158 じゃあもうひとつ その find メソッドを作ろうと決めたのはもしかしてあなた自身? 「Studentクラスのインスタンスの集団から該当するモノを抽出する」というのが本来必要な処理だったりしない? そのために必要だと「あなたが思ったもの」が、「Student クラスにあるべきだと考えた find メソッド」だったりしない?
160 名前:デフォルトの名無しさん [2009/01/07(水) 19:45:01 ] >>157 見落としてましたorz 返ってくるべき…ということは>>158 に示したのが答えでは ダメですよね?;
161 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:45:46 ] >>158 selfっていうのはnewされたオブジェクト本体で そのあとに代入される変数の中身そのものだから s = Student.find("引数に対して検索文字列") s.他の処理 これでいい。変数名は知る必要がない。 s1をひっぱりだす検索をすれば、sの中身はs1と合致する。
162 名前:デフォルトの名無しさん [2009/01/07(水) 19:47:09 ] >>159 findメソッドを作るというのは課題の条件です
163 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 19:57:42 ] >>162 こういうのは、ふつーに作ると、こういう処理になる s1 = Student.new(arg1) s2 = Student.new(arg2) s3 = Student.new(arg3) ... students = [s1, s2, s3, ...] hit = students.find{|s| s.name = 'なまえ'} と書きかけて、ちょっと思う もしかして、データの検索って>>132 みたいなDBで行う?
164 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 20:03:25 ] 質問者は名前に一貫したレス番入れてくれないか カオスすぎる
165 名前:デフォルトの名無しさん [2009/01/07(水) 20:03:32 ] >>163 >>161 で出来ました! レスくださった皆様、長々とすみませんでしたorz
166 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 20:18:19 ] まさに初心者スレだな。 エスパー衆、おつ
167 名前:初心者 mailto:sage [2009/01/07(水) 22:26:54 ] rubyで画像サイトを巡回して画像を保存したいです よろしくおねがいします
168 名前:初心者 mailto:sage [2009/01/07(水) 22:27:33 ] 失礼しました。 環境はシグウィンです
169 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 22:28:49 ] コマンドラインで動作するWebクローラをシェルスクリプト的にRubyで制御するのが近道です ゼロまたはイチから作ることもできるけれど、おそらくそのための知識は無いことでしょう
170 名前:デフォルトの名無しさん [2009/01/07(水) 22:31:35 ] >>169 それだっ(・∀・)!
171 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 22:31:58 ] >>169 そういや、完全初心者だった4年くらい前の頃に作った画像フェッチャは中でwgetが動いてるな いいかげん書き換えたいんだが、問題なく動作してるし別にいいか、みたいな HTMLとHTTP(と、情緒的Webサーバ管理)に関する知識がないと作れないからねえ
172 名前:初心者 mailto:sage [2009/01/07(水) 22:33:33 ] ユーザエージェントとかクッキーを使わなくてはいけなくて なおかつ画像URLがリンクになっていないので自前で 解析しなくてはいけないのですが、クローラ的なものは使えますか? wgetで挑戦したのですがサーバにはねられました。 ちなみにC++はプロです。
173 名前:デフォルトの名無しさん [2009/01/07(水) 22:35:11 ] >ちなみにC++はプロです。 ならドキュメント嫁、で終了。
174 名前:初心者 mailto:sage [2009/01/07(水) 22:37:22 ] >>173 Rubyは変なキツネの漫画を読んだだけなので どういうモジュールがあるのかとか、どういう作りにすれば いいのかとかわけわかめです
175 名前:初心者 mailto:sage [2009/01/07(水) 22:39:50 ] Net::HTTPなるモジュールがぐぐれたので使ってみようと思います。
176 名前:初心者 mailto:sage [2009/01/07(水) 22:43:01 ] Net::HTTP.version_1_2 # おまじない Net::HTTP.start('www.yahoo.co.jp', 80) {|http| response = http.get('/index.html') puts response.body } これでなんかアクセスできたっぽいのですが、 構文が意味不明です。 解説きぼんぬ
177 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 22:43:53 ] open-uri使えば。
178 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 22:46:20 ] Mechanizeというのがある。 Hpricotとopen-uriで満足したから使ったことないんだけれど。
179 名前:デフォルトの名無しさん [2009/01/07(水) 22:46:37 ] ほんとうにC++のプロなの?
180 名前:初心者 mailto:sage [2009/01/07(水) 22:49:30 ] なるほど、open-uriもつ変えそうですね ありがとうです
181 名前:初心者 mailto:sage [2009/01/07(水) 22:52:52 ] ブロック付きメソッド呼び出しという構文があるんですね 新しい言語は刺激的です
182 名前:デフォルトの名無しさん [2009/01/07(水) 22:54:46 ] そっからかよw
183 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 22:55:20 ] >>178 ちゃんとリンクになってるならMechanizeも楽だけどね。 Mechanizeのメソッドを上書きして、 取得してきたHTML書き換えてリンクにしてからパースさせるという手もできそう。
184 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 22:58:41 ] http://で始まって.jpgとか.pngとか.gifとかで終わる文字列探すとかでも それなりになんとかなりそうなならなそうな
185 名前:初心者 mailto:sage [2009/01/07(水) 23:07:24 ] open-uriではStringIOオブジェクトが渡されて・・・ StringIOの中味をダンプ松本したいのですが printメソッド読んでもなにも表示されないです
186 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:08:36 ] IOはとりあえずreadだ
187 名前:初心者 mailto:sage [2009/01/07(水) 23:13:56 ] >>186 ありがとうございます。 print f.read でいけました。
188 名前:初心者 mailto:sage [2009/01/07(水) 23:16:57 ] 処々でみかける p って組み込み関数なんですね。 これはちょっと受け入れがたい衝撃でした。 タイプ量減らすためでしょうかね
189 名前:初心者 mailto:sage [2009/01/07(水) 23:25:10 ] ハ・・・ッシュ??
190 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:25:44 ] p はデバッグ用の出力関数。 タイプ量を減らすためなのは確実。
191 名前:デフォルトの名無しさん [2009/01/07(水) 23:31:51 ] >>189 連想配列のこと。と言えばいいのかな。
192 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:33:18 ] まとめサイトのurl渡すと画像DLしてzipに固めるってのを以前作ったなぁ
193 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:33:58 ] 根拠がないくせに「確実」だってさwwwwww 開発者がpって打ったとき冷蔵庫にザッハトルテがあることを思い出して食べてたら うっかり忘れちゃってたのが今でもそのままになってるに決まってるんだぜ
194 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:35:29 ] だから外部プログラムのwget使え wgetを使ったこともないような人間はそもそもまともなものを作れない Webブラウザを使ったことのない人間がWebブラウザを作れるか?
195 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:37:23 ] 最初のwebブラウザを作った人はどうしたんだ
196 名前:初心者 mailto:sage [2009/01/07(水) 23:38:12 ] std::map の特殊版みたいなもんですね > ハッシュ metaにレスポンスヘッダが格納されているはず・・・ でもSet-Cookieが見つからない・・・
197 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:40:31 ] >>195 通信に必要な仕様を読んだ 他人に聞かないと作れないってことは、仕様の知識がないということ 仕様の知識がないのなら、他人が作ったお着せのプログラムを使い倒すことから始めるべき それで不満が出てきてから勉強を始めても遅くはない
198 名前:初心者 mailto:sage [2009/01/07(水) 23:42:12 ] f.meta.each_key { |key| p key } でみたら"set-cookie"で入ってました。。。 ブロックつきなんたら構文、便利ですね
199 名前:デフォルトの名無しさん [2009/01/07(水) 23:42:36 ] >>193 根拠がないくせに 「決まってるんだぜ」 ____ /_ノ ヽ、_\ ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ <だっておwww /⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒) | / / / |r┬-| | (⌒)/ / / // | :::::::::::(⌒) | | | / ゝ :::::::::::/ | ノ | | | \ / ) / ヽ / `ー'´ ヽ / / | | l||l 从人 l||l l||l 从人 l||l ヽ -一''''''"~~``'ー--、 -一'''''''ー-、 ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
200 名前:デフォルトの名無しさん [2009/01/07(水) 23:48:16 ] >最初のwebブラウザを作った人 だれだっけ 事務クラーク?
201 名前:初心者 mailto:sage [2009/01/07(水) 23:48:55 ] グローバルスコープで変数宣言したいのですが、 cookie だけだとundefined local variableとか怒られて cookie = '' だと通ったのですが、Why?
202 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:49:30 ] アラン・ケイ
203 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:53:54 ] >>201 ruby-lang.org/ja/man/
204 名前:デフォルトの名無しさん [2009/01/07(水) 23:54:16 ] >>200 ティム・バーナーズ・リー氏だと思う。
205 名前:デフォルトの名無しさん mailto:sage [2009/01/07(水) 23:55:51 ] undefined local variableすら読めないのにC++ではプロって あまりに恥ずかしい 仕事して金もらってれば一応プロではあるが、実力はアマチュア未満じゃないか
206 名前:204 [2009/01/07(水) 23:56:13 ] いや、彼はHTTP、URL、HTMLの設計だけかもしれない。。。
207 名前:204 [2009/01/07(水) 23:58:16 ] いや、あってた。 # 1990年11月 - ティム・バーナーズ=リーが最初のWebサーバとウェブブラウザを試作する。 # 1991年2月 - バーナーズ=リーが開発したウェブブラウザであるWorldWideWebをインターネットに公開する。 ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A7%E3%83%96%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6#.E6.AD.B4.E5.8F.B2 >>205 釣りじゃねーの?
208 名前:初心者 mailto:sage [2009/01/08(木) 00:11:06 ] >>205 Rubyでは未初期化での変数定義は許されないんですか? C/C++では許されるので、そのあたりに疑問を抱いただけですが・・・ ちなみに私の書いたプログラムのユーザは全世界で数千万単位です。
209 名前:初心者 mailto:sage [2009/01/08(木) 00:19:47 ] Cookie偽装でむふふ画像のありかをしめすhtmlの取得まで たどりつけました。 みなさまのご指導のおかげです。 画像取得&Zip化は明日にします。 どうもありがとうございました。
210 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 00:29:39 ] >>197 >他人に聞かないと作れないってことは、仕様の知識がないということ >仕様の知識がないのなら、他人が作ったお着せのプログラムを使い倒すことから始めるべき >それで不満が出てきてから勉強を始めても遅くはない 仕様の知識がないのはRubyについてで、 wgetとかHTTPの仕様には詳しそうじゃん。 wgetがRubyで実装されてるっていうなら別だが。 てかお前の読解力がなさすぎ
211 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 00:39:45 ] 他の言語経験があるなら、仕様については人に聞かなくても ドキュメント読めばいいだけの話じゃん。 仕様を理解するのが面倒だから人に聞いたのかも知れないけど。
212 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 01:20:21 ] wgetよりcurlを使ってください
213 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 01:26:49 ] そうそう連番jpgを落すならcurlに限る
214 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 02:33:53 ] Hpricotでsearchした要素から再度searchするにはどうすればいいでしょうか? class Blog def chk_aaa(site) content = Array.new site.search("div.AAA").each { |entry| content << entry.to_s.toutf8 } return content end end site = Hpricot(open("hogehoge.net ").read) aaa =Blog.new.chk_aaa(site) 上ので言えばdiv.AAAの中にdiv.BBBという要素があるときに aaaからsearchするにはどうすればいいでしょうか?
215 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 02:37:07 ] >>214 entry.search
216 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 02:38:23 ] 質問の意図がわからなくなってきた。こっちかも? site.search("div.AAA").search("div.BBB").each
217 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 02:48:00 ] >>215-216 すいません。 やりたいのはaaa.search("div.BBB")なのです。 しかし、aaa.searchするにはaaaはArrayなので それをまたHpricotに投げないといけないのかなとおもいまして・・・。
218 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 07:03:39 ] そんなとこでメソッド分けるなよめんどいからさ p でいろいろ表示してみるとわかるが、Hpricot の構造は ・ parse でパースした最初のHTML … Hpricot::Doc ・ 条件などで抽出されたタグ単体 … Hpricot::Elem ・ 条件で抽出された複数のタグ … Hpricot::Elememts になってる。で、search や at は Hpricot::Elem にも Hpricot::Elememts にも定義されてるから、 search や at をし続ける限りにおいて、メソッドチェーンは途切れない。 ということで、「chk_aaa の返り値を Hpricot::Elememts のままにしておく」が正解。 Hpricot のオブジェクトを文字列にするのは検索や抽出操作が完全に終わった最後の最後に行う。 それまでは「○○タグを表すオブジェクト(が複数詰まった配列互換の何か)」として扱うのが楽。 class Blog def chk_aaa(doc) return doc.search("div.AAA") end def pick_BBB(doc) return doc.search('div.BBB') end end doc = Hpricot(open("example.com ").read) aaa =Blog.new.chk_aaa(site) puts "aaaの最初は #{aaa[0].inner_html} だよー" # ← たとえば画面表示時に文字列にする bbb = aaa.pick_BBB(aaa)
219 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 07:08:37 ] で、aaaが途中でどーしても必要でないのなら、 class Blog def pick_BBB(doc) return doc.search('div.AAA').search('div.BBB') end end doc = Hpricot(open("example.com ")) bbb = Blog.new.pick_BBB(doc) とかしてくっつけてしまう、または、もしCSSセレクタの記法を勉強できるなら class Blog def pick_BBB(doc) return doc.search('div.AAA div.BBB') end end doc = Hpricot(open("example.com ")) bbb = Blog.new.pick_BBB(doc) としてしまうのがコンパクトだとは思う。aaa が途中で必要なのなら仕方ないけれど。
220 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 07:55:32 ] ああっ、ヒマだから正月中の遣り取り読んでたらなんかヒドいのがっ >>99 > URI.escapeはURIの中に出てきたらおかしいものだけをエスケープする。 > +はURIの中に入っていても全く問題ないのでエスケープされない。 という妥当な流れから、 > +をエンコードしたいなら、CGI.escapeを使えばおk。 なんでこういう結論になるんだよ。っていうか最初にこれ言い始めた奴誰よ出てこいやオラ >>95 URI.escape には2番目の引数がある。以下マニュアル > URI.escape(str[, unsafe]) > URI 文字列をエンコードした文字列を返します。 > unsafe には、URI として指定できない文字を正規表現か文字列で指定します。 ということで require 'uri' url = 'www.google.com/search?hl=ja&q=Ruby+on+Rails&lr= ' p URI.escape(url).to_s p URI.escape(url,'+').to_s とすると "www.google.com/search?hl=ja&q=Ruby+on+Rails&lr= " "www.google.com/search?hl=ja&q=Ruby%2Bon%2BRails&lr= " になる。CGIのエスケープはURIエスケープの代わりにはできないから、これにすべき。
221 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 08:04:54 ] 御説ごもっともだが、それだと URI::UNSAFE が消えるぞ irb> puts URI.escape('example.com/q= ねこだいすき', '+').to_s example.com/q= ねこだいすき irb> puts URI.escape('example.com/q=cat だいすき', Regexp.union(URI::UNSAFE, /\+/)).to_s example.com/q=cat%20%E3%81%A0%E3%81%84%E3%81%99%E3%81%8D うーん、めんどくさいっすな
222 名前:デフォルトの名無しさん [2009/01/08(木) 14:03:24 ] #!/usr/bin/ruby -Ku require 'jcode' s = '平成21年1月1日~平成21年12月31日' p s.split('〜') s = '平成21年1月1日~平成21年12月31日' p s.split('~') なんですが、全角の〜では分割できない? ruby 1.8.6 (2008-03-03 patchlevel 114)です。
223 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 14:12:30 ] ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0] ["平成21年1月1日", "平成21年12月31日"] ["平成21年1月1日", "平成21年12月31日"] できたよ。 Unicodeの全角チルダ(FULLWIDTH TILDE)と波ダッシュ(WAVE DASH)の区別が どーのこーのという問題だろうか。
224 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 14:22:44 ] ・ スクリプトが UTF-8 ではない ・ 2バイト文字…ああ、Unicode だから2とは限らないのか…の正規表現には u をつける p s.split(/〜/u) というのはどうだろ
225 名前:222 [2009/01/08(木) 14:45:13 ] >>223 >>224 サンクス p s.split(/〜/u)でうまくいった
226 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 21:28:38 ] >>218-219 ありがとうございました. やりたいことはブログタイトルや個々のエントリを構造体に入れて,構造体.エントリ.searchのようにしたかったので aaaが発生するようになりました. まず,returnのさいにHpricot::Elementsで返すようにして修正していこうと思います.
227 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 22:00:20 ] 226がhpricotのこと言ってるからついでに href内にcat_xxxxx.htmlがあるaの要素をsearchするにはa[*=cat_]だけでOK? これでやるといらないところまでついてくるんだよな
228 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:30:43 ] Rubyの調べ方について質問です 例えば blog.codezine.jp/editor/2007/10/rubyhpricot.php を読んでいると (doc/:h1).each do |h1| のような表記が出ます これについて自力で調べたいのですが、Googleは記号類を無視するようで これが何かわからないと調べることができません そのようなときに、皆様はどう調べていますか? この例だと、/:h1って何だとかです h1はHTMLのタグなのは判りますが、なぜ文字列として""で囲まないのか また each do |h1|の|h1|は何だとか これは例ですが、Rubyを最近使い始めてこういうところで困っています 何かいい方法があればご教授下さい
229 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:38:23 ] Google先生の性癖はよくわからんが、俺だったら Ruby "/:" みたいにクォーテーションで括るかな。
230 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:40:51 ] : はシンボルを表すやつで、 / は除算演算子をオーバーロードしたものじゃないのか? /: で一塊じゃないはずだ。 まあ、普通はリファレンスマニュアルの索引で調べるよ。
231 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:44:36 ] Rubyを始めたばかりでhpricot使っちゃったのが不幸の始まりとしか
232 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:44:40 ] ここでの/はHpricotのメソッドだね。 searchの別名だ。 最近始めたばかりというならもう少し基礎やる時間を作ればいいと思う。
233 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:44:59 ] (doc/:h1).each do |h1| の場合、 doc →Hpricot::Doc のインスタンス / →docのインスタンスメソッド(/演算子の多重定義) :h1 →/ の第2引数であるシンボル |h1| →eachに与えられたブロックの単なる引数の名前 と、まず構文の要素を正しく認識しなきゃいかんね。
234 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:50:34 ] >>228 はCSSセレクタやXPathをRubyマニュアルで調べるに一票
235 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:51:24 ] ソース追うのに慣れてなければ irb 上で実行して, それぞれの変数にどんなオブジェクトが入ってるのか調べるのも大事 p object.class p object みたいな感じで まあわかる人ならソース追うのが一番だけど
236 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:54:22 ] >>234 うわああああああ説明めんどくさああああ >>231 がそのまんまだな
237 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 23:55:18 ] >>228 ぐぐる以前に、そのページのコードの前にある参考ページに全部 書いてあるじゃん。 一般論としてということであれば、やっぱりぐぐる以前にリファレンスなり 入門なりを読むべきでしょう。
238 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 00:17:42 ] XP SP3、Ruby 1.8.6、エクセル2003使用者で、WIN32OLEを使ったプログラムを書いてるんですが、 エクセル操作の命令をメソッドの定義内で書いたときにエクセルのメソッド名?に空白が 含まれているものだとエラーが出てうまく動きません。 例: def hoge excel.Sheets(2).Select end は正しく動くのですが、 def fuga excel.Sheets(2).Move After = excel.Sheets(1) end は"Move After"の"Move"と"After"の間に空白が入っているために ”dynamic constant assignment”というエラーが出てしまいます。 スペースをなくしたりするとこのエラーは消えますが、当然他のエラーが出ます。。 おそらく空白があるために後ろの"After"を定数と認識しているのではないかと思うんですが、どうなのでしょうか? 色々なエクセルのメソッドを自作のメソッドに定義して呼び出して一度に実行、みたいなことをさせたいと思っているんですが 文法上メソッドの定義内でこういったエクセルのメソッドを定義するのは無理なのでしょうか? 何かうまい解決策がありましたらご教授お願いします。
239 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 00:32:02 ] >>238 > おそらく空白があるために後ろの"After"を定数と認識しているのではないかと思うんですが、どうなのでしょうか? その通り スペース含んでたりしてRubyがメソッド名としてうまくパースしてくれないときは Object#send を使うといい excel.Sheets(2).send('Move After') = excel.Sheets(1) ただWIN32OLEでExcel使ったことないから動作確認はしてない
240 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 00:37:19 ] おなじくExcelは詳しくなくて申し訳ないが MoveがメソッドでAfterは引数だって情報が引っ掛かったのよ ()でくくってみるってのはどう?
241 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 00:39:38 ] win32oleは使ったことないが多分invoke使うべきだろう ttp://doc.loveruby.net/refm/api/view/method/WIN32OLE/i/invoke
242 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 00:42:06 ] >>229 でも>>228 の該当部分の構文要素を分解すると、 「doc」「/」「:h1」なんだよな……。
243 名前:238 mailto:sage [2009/01/09(金) 01:07:01 ] >>239 助言ありがとうございます。 教えていただいた方法を試してみたのですがダメでした・・・ syntax error, unexpected '=', expecting kEND excel.Sheets(2).send('Move After') = excel.Sheets(1) >>240 助言ありがとうございます。 Move(After)ってことですよね。こちらも同様にダメでした。。 syntax error, unexpected '=', expecting kEND excel.Sheets(2).Move(After) = excel.Sheets(1) >>241 助言ありがとうございます。 これも同様にダメでした・・・orz syntax error, unexpected '=', expecting kEND
244 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 01:10:32 ] そもそもメソッドの返り値に代入なんかできないからね
245 名前:238 mailto:sage [2009/01/09(金) 01:13:01 ] すみません、>>243 に書き忘れていましたが、 >>241 excel.invoke('Sheets(2).Move After') =excel.Sheets(1) excel.Sheets(2).invoke('Move After') =excel.Sheets(1) excel.Sheets(2).Move.invoke('After') = excel.Sheets(1) と試してみましたがすべて下記のエラーでした。 syntax error, unexpected '=', expecting kEND
246 名前:227 mailto:sage [2009/01/09(金) 01:17:37 ] わかりにくかったかもしれないから再度。 たとえば blog.livedoor.jp/techblog/ ここのカテゴリの部分の要素を抜き取りたいのです。 div.entry-categoryで抜き出せばいいのですけど、複数あった場合はだめで、 複数あった時の共通するのはURLにcat_xxxxx.htmlとなります。 ので、hrefにcat_があればその要素を抜き出したいのですが・・・
247 名前:227 mailto:sage [2009/01/09(金) 01:20:36 ] わかりにくいかもしれませんね。 <a href="example.com/test/cat_1234.html> カテゴリ</a> <a href="example.com/test/cat_5678.html> カテゴリ2</a> のカテゴリ、カテゴリ2を抜き出したいです。
248 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 01:23:08 ] あーVBにキーワード引数が有ってそれをそのまま書こうとしてハマってるのか 多分こうだ excel.Sheets(2).Move("After" => excel.Sheets(1) ) ttp://homepage1.nifty.com/markey/ruby/win32ole/win32ole05.html
249 名前:初心者 mailto:sage [2009/01/09(金) 01:28:42 ] >>247 inner_htmlでおkです
250 名前:227 mailto:sage [2009/01/09(金) 01:31:10 ] >>249 inner_textだとカテゴリ,カテゴリ2と抜き出せるのですがね。 URLにcat_を含むaタグのinner_textを抜き出したいのです。
251 名前:238 mailto:sage [2009/01/09(金) 01:32:54 ] >>248 出来ました! ありがとうございます!! なるほど、そんな書き方があったんですね。 これで他のキーワード引数付きのメソッドも問題なく使えそうです。 本当にありがとうございましたm(_ _)m
252 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 01:33:11 ] a要素を全部取ってきてselectすれば?