1 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 04:30:21 ] プログラミング言語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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
253 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 22:03:56 ] おまえらけんかすんなよ
254 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 23:37:37 ] 1.8.5ででかいのをREXMLに食わせたらSEGVったって話が 結構前にruby-devにあったような。
255 名前:デフォルトの名無しさん [2008/12/08(月) 03:09:02 ] 度々すいません。 open命令でXMLファイルをサイト経由で取得した場合、 result = open(a2) resultには#<File:0x2c07f2c>という内容しか入っていないようなのですが、 帰ってきたサイトのHTMLデータといいますか、そのようなものを見るにはどうしたらいいのでしょうか。 色々とテストしてみたら、どうも帰ってくるXMLデータが相手サーバの都合か何かで変な状態で返されものを REXML::Document.newで開くとコケるみたいです。 どんなファイルのときにこけているか分かれば対策の打てるような気もします。
256 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 03:20:24 ] テンプレ。 >質問には以下を書くこと。へたくそな質問は再提出を要求される。 > ・エラーメッセージ(自力で訳さずなるべくそのままで) エスパーしてみると、エラーを突っ返されても構わずREXML::Document.newに渡しているせいで XMLとしては当然解釈できずパースエラーとか。
257 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 03:32:51 ] >>255 >result = open(a2) a2 が何かしらんけど、open() が返すのはFileオブジェクトじゃないかな。 だから result = open(a2) {|file| file.read } とか file = open(a2) result = file.read() file.close() とかすればいいんじゃないかな。
258 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 06:22:33 ] >>257 そんなどのマニュアルにもどんな解説にも書いてあるようなことで>>255 さんが詰まるはずないだろ馬鹿か? [BUG] って書いてあるんだからこっちに落ち度はなくてRubyが一方的に悪いに決まってるだろ
259 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 06:35:54 ] そんな煽りいらないお
260 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 06:56:35 ] 俺らは質問やその後の遣り取りから質問者の知識を当て推量して回答したりしなかったりするわけだが、 >>258 と言いたくなるのは今回は仕方があるまい openを一度でも自分で使ったことがあるならわかることだからな 書き込みの際に省略してるだけだと思うしかないわ
261 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 08:46:03 ] > open命令でXMLファイルをサイト経由で取得した場合、 openつーか、require 'open-uri'した上でのopenだよな?
262 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 08:58:18 ] >>260 君はキモイからもうこのスレに来なくていい
263 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 09:46:33 ] >>262 お前キモいな
264 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 10:03:51 ] 262はもうこのスレに来られなくなりました。
265 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 10:21:05 ] この刃はさすがに鋭いぬ ひとりでスレ参加仕切るのはキモいわな
266 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 10:55:44 ] >>255 用語がちょい怪しいからHTTPについてあんま知らんのかも知れんけど、 open-uriで返ってきたオブジェクトに返してはFileとかの他にOpenURI::Metaについても 調べてみてくれ。 向こうのサーバがOKなレスポンスを返したかとかの調べ方がわからんのだったらまさにそれ。
267 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 11:35:17 ] 中身を見るには require 'pp' して pp で見るといいお
268 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 11:40:13 ] (pretty_)inspectでフォローされてるとは限らないけどな
269 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 11:50:24 ] pretty_inspectの書式のめんどくささは異常
270 名前:デフォルトの名無しさん [2008/12/08(月) 14:33:22 ] このプログラムでなぜかこけるのですが、原因って分かりますか? #!/usr/local/bin/ruby -Ks # REXML宣言 XMLデータを処理するための require 'rexml/document' require 'open-uri' require 'uri' result = open("pc11.2ch.net/test/read.cgi/tech/1227123021/l50 ") # xmlデータ化してこの場合変数docに入れる。変数名は何でも可。 toto = result.read doc = REXML::Document.new(result) エラーメッセージ ------------------------------ C:/Ruby/lib/ruby/1.8/rexml/source.rb:149:in `initialize': undefined method `[]' for nil:NilClass (NoMethodError) from C:/Ruby/lib/ruby/1.8/rexml/source.rb:16:in `new' from C:/Ruby/lib/ruby/1.8/rexml/source.rb:16:in `create_from' from C:/Ruby/lib/ruby/1.8/rexml/parsers/baseparser.rb:133:in `stream=' from C:/Ruby/lib/ruby/1.8/rexml/parsers/baseparser.rb:110:in `initialize' from C:/Ruby/lib/ruby/1.8/rexml/parsers/treeparser.rb:9:in `new' from C:/Ruby/lib/ruby/1.8/rexml/parsers/treeparser.rb:9:in `initialize' from C:/Ruby/lib/ruby/1.8/rexml/document.rb:205:in `new' from C:/Ruby/lib/ruby/1.8/rexml/document.rb:205:in `build' from C:/Ruby/lib/ruby/1.8/rexml/document.rb:42:in `initialize' from C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/rbC.tmp:15:in `new' from C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/rbC.tmp:15 Complete(1) ------------------------------ どうもresult.readした後REXML::Document.newするとエラーするぽいですけど。
271 名前:デフォルトの名無しさん [2008/12/08(月) 14:55:36 ] 訂正します #!/usr/local/bin/ruby -Ks require 'rexml/document' require 'open-uri' require 'uri' result = open("10plate.blog44.fc2.com/?xml ") toto = result.read doc = REXML::Document.new(result)
272 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 15:09:22 ] そりゃ読み終わってりゃ中身は空だからなあ。当然だろう
273 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 15:16:28 ] 引数はXML文字列でもいいのに… てかREXMLでパースしたなら元のファイル別にいらないじゃんね
274 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 15:56:10 ] Rubyでエクセルのグラフを描きたいんですが、エラーでうまくいきません。 OLE詳しい人Help! require 'win32ole' module Excel end excel = WIN32OLE.new('Excel.Application') excel.visible = false excel.displayAlerts = false file = "適当なフォルダパス" book1 = excel.Workbooks.open(file) sheet1 = book1.sheets(1) sheet1.Range('A8').Select chart1 = excel.Charts.Add() chart1.Type=ExcelConst::XlLine chart1.ChartType=ExcelConst::XlLineMarkers chart1.SetSourceData Source=sh7.Range("B96:C106") #続く
275 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 15:57:08 ] #続き #chart specifications chart1.PlotBy=ExcelConst::XlColumns chart1.Location Where=ExcelConst::XlLocationAsNewsheet chart1.HasTitle ="True" chart1.ChartTitle.Characters.Text = "hoge" chart1.Axes(ExcelConst::XlCategory, ExcelConst::XlPrimary).HasTitle = "True" chart1.Axes(ExcelConst::XlCategory, ExcelConst::XlPrimary).AxisTitle.Characters.Text = "fuga" chart1.Axes(ExcelConst::XlValue, ExcelConst::XlPrimary).HasTitle = "True" chart1.Axes(ExcelConst::XlValue, ExcelConst::XlPrimary).AxisTitle.Characters.Text = "hogehoge" book1.save excel.quit #コード終了 エラーメッセージが続きます
276 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 15:57:40 ] C:/ruby/mysrc/rb3C.tmp:112: syntax error, unexpected tCONSTANT, expecting kEND chart1.Axes(ExcelConst::XlCategory, ExcelConst::XlPrimary).HasTitle = "True" ^ C:/ruby/mysrc/rb3C.tmp:113: Invalid char `\223' in expression C:/ruby/mysrc/rb3C.tmp:113: Invalid char `\276' in expression C:/ruby/mysrc/rb3C.tmp:113: Invalid char `\223' in expression C:/ruby/mysrc/rb3C.tmp:113: syntax error, unexpected tIDENTIFIER, expecting kEND chart1.Axes(ExcelConst::XlCategory, ExcelConst::XlPrimary).AxisTitle.Characters.Text = "fuga" ^ C:/ruby/mysrc/rb3C.tmp:114: syntax error, unexpected tCONSTANT, expecting kEND chart1.Axes(ExcelConst::XlValue, ExcelConst::XlPrimary).HasTitle = "True" ^ C:/ruby/mysrc/rb3C.tmp:115: Invalid char `\220' in expression C:/ruby/mysrc/rb3C.tmp:115: syntax error, unexpected tIDENTIFIER, expecting kEND chart1.Axes(ExcelConst::XlValue, ExcelConst::XlPrimary).AxisTitle.Characters.Text = "hogehoge" ^ C:/ruby/mysrc/rb3C.tmp:115: Invalid char `\220' in expression C:/ruby/mysrc/rb3C.tmp:115: Invalid char `\224' in expression C:/ruby/mysrc/rb3C.tmp:115: unterminated string meets end of file C:/ruby/mysrc/rb3C.tmp:115: syntax error, unexpected $end, expecting kEND Complete(1) 以上です。よろしくお願いします。
277 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 16:00:03 ] ちょっと聞くけど、VBA使ったり他の言語からOLE経由する方法では自分でグラフ描けるんだよね? まさかRubyの知識しかないのにWin32OLE使ってるわけじゃないよね?
278 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 16:50:49 ] >>277 いや、そのまさかです。 マクロの記録→編集でVBAのコードを作ってそれをRubyに書き換えたつもりだったんですが・・・
279 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 18:44:44 ] >>276 > C:/ruby/mysrc/rb3C.tmp:112: syntax error, unexpected tCONSTANT, expecting kEND これがエラーの理由、「syntax error」は文法エラー > chart1.Axes(ExcelConst::XlCategory, ExcelConst::XlPrimary).HasTitle = "True" これがエラーの出た行の内容 > ^ (ブラウザだとずれてるだろうけど)これが上の行のエラーの発生してる位置を示してる rb3C.tmpの112行目より前のどこかに閉じ忘れた " がある エラーメッセージぐらい読めるようにならないと、いつまでたっても素人のままだぜ
280 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 20:32:41 ] endの閉じ忘れ文法エラーが初心者の頃は面倒だったね どこで閉じ忘れたのかを探しにくいからね 1.9.1だとendのインデントのずれを指摘するパッチが取り込まれたので -wオプションつければずれてるendを警告してくれて 抜けてるendの位置をちょっと絞り込める ところで、エラーメッセージの tCONSTANT とか kENDってなに? YACCのトークンとかいうやつ? 構文解釈中のエラー? そんな内部の情報を直に見せられても、初心者にはわけわからんよ ま、わからんなりに 「endじゃなくて定数が来ちゃってる文法エラー」だなということは理解できるんだけど
281 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 20:46:15 ] 文字列リテラルの閉じ忘れはエラーがどかどかでるので割と判りやすいけど 閉じ忘れた文字列から、はるか後ろのほうでエラーが出る場合があるので やっぱり最初の頃は修正が面倒だったな エラーが出た個所で文字列を閉じてるのが ' か " を確認して、 それより前のクォート文字を検索する 閉じ忘れたのが %記法だったら面倒だが たまに、Windowsのディレクトリパスを書くときに 'C:\test\' とかやって閉じ忘れたりする
282 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 20:47:57 ] tCONSTANT は定数トークンだろね でも kEND の k ってなんじゃろ
283 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 20:56:28 ] keyword
284 名前:282 mailto:sage [2008/12/08(月) 21:03:46 ] >>283 なるほどサンクス いい機会だから parse.y 眺めてるお
285 名前:274 mailto:sage [2008/12/08(月) 22:04:13 ] >>279 レスありがとうございます。 よく見直してみたんですが、「"」の閉じ忘れはありませんでした。 グラフの部分のコードを消して試しに他の操作をさせるとちゃんと動いたので やはりグラフのコードのどこかが悪いようです。
286 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 22:47:39 ] すごいバカきたな。 >>258 >そんなどのマニュアルにもどんな解説にも書いてあるようなことで>>255 さんが詰まるはずないだろ馬鹿か? 実際に詰まってるじゃん。 どのマニュアルにもどんな解説にも書いてあるようなことで詰まっているから初心者なんじゃねーの? もう一度>>255 をみてみろ。 >result = open(a2) >resultには#<File:0x2c07f2c>という内容しか入っていないようなのですが、 そりゃ open() の戻り値を代入しているだけなんだから、result.inspect したら #<File:> が入ってるわな。 HTMLの文字列が欲しいのに、Fileオブジェクトがきたので困ってる255さん。あーら困った。 >[BUG] って書いてあるんだからこっちに落ち度はなくてRubyが一方的に悪いに決まってるだろ え、どこ? >>255 のどこに[BUG]って書いているの? もしかして>>255 は>>205 と関係しているの? なんで>>258 は>>255 の書き込みだけでなんでそんなことがわかるの? もしかして205=255=258なの? もしかしてどんな解説にも書いてあるようなことで詰まってしまったの?
287 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 22:50:02 ] すごいバカが来たな。
288 名前:デフォルトの名無しさん mailto:sage [2008/12/08(月) 22:58:26 ] こういうバカはたいては女 それも女の出来そこないって相場が決まってるw
289 名前:274 mailto:sage [2008/12/09(火) 00:49:17 ] WIN32OLEに詳しい方、引き続き>>274 救助待ちなのでお願いします。
290 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 01:05:07 ] >>285 やっぱり文字列リテラルの閉じ忘れじゃないのかなぁ \223\276 って SJISの「得」なんで そんなのをスクリプトとして解釈しようとするなんて 文字列の閉じ忘れくらいしかない気がする 単純な文字列だけじゃなくて '〜' とか "〜"だけじゃなくて 正規表現リテラルとか /〜/ とか %記法の %w(〜) とか %Q(〜) %r!〜! みたいなのも有るんで %記法だと任意の記号を使えるので注意 しかも%記法の %q!! %Q!! %r!! %x!!だと、区切り文字に空白やタブや改行も使えてしまうぞ %q a だと'a' と同じ意味 そんなの使ったスクリプトなんて、もはや嫌がらせだが
291 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 01:40:27 ] >>274-275 にsyntax errorはないもんなぁ。 なんかダメもとでスクリプトの先頭に #!ruby -Ks と書き足してみるとか。
292 名前:274 mailto:sage [2008/12/09(火) 02:15:06 ] >>290 「得」は「得点」ですね・・・ ここに載せる際にエラーコードはそのままにhogeにしたのが原因です。すみません。 ちなみにhogeにして実行しても同じでした。 >>291 なんですか!?そのおまじない!w 書き足しただけでエラーコードに変化がありました。 C:/ruby/mysrc/rb81.tmp:61:in `method_missing': save (WIN32OLERuntimeError) OLE error code:800A03EC in Microsoft Office Excel Workbook クラスの Save プロパティを取得できません。 HRESULT error code:0x80020009 例外が発生しました。 from C:/ruby/mysrc/rb81.tmp:61 Complete(1) Saveがおかしい訳じゃないはずなので他に何かあるんでしょうね・・・ それと直接の関係はなさそう(上では表面化しなかっただけかも)ですが、 excel = WIN32OLE.new('Excel.Application')の下に WIN32OLE.const_load(excel, ExcelConst)を追加しました。 これがないと「ExcelConst::」の位置でエラーになるようです。
293 名前:274 mailto:sage [2008/12/09(火) 02:20:35 ] 連レススミマセン。 あとモジュール定義の所 module Excel end から module ExcelConst end に変更しています。
294 名前:291 mailto:sage [2008/12/09(火) 02:32:05 ] SJISの「ソ」みたいにSJISだと思わずに扱うと面倒が起きる文字があって、 rubyに-Ksオプションを付ける(shebangっぽく>>291 でもOK)と rubyもSJISで書かれたスクリプトだと承知して字句解析する。 リファレンスを引くなら$KCODEあたりがとっかかりだろうか。
295 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 02:48:40 ] >それと直接の関係はなさそう(上では表面化しなかっただけかも)ですが、 >excel = WIN32OLE.new('Excel.Application')の下に >WIN32OLE.const_load(excel, ExcelConst)を追加しました。 >これがないと「ExcelConst::」の位置でエラーになるようです。 それは当たり前です。ただ空のモジュールを作ったってExcelの定数を扱えるわけがありません。 なんかサンプルのスクリプトをもとに頑張ってる感じがしますが、もしそうだとしたら もうちょっとちゃんと真似したようがよいと思います。
296 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 02:49:44 ] そのファイルがあるディレクトリ以外だと実行できて、そのファイルがあるディレクトリだと実行できないのですが・・・。 ./hpricot.rb:35: undefined method `Hpricot' for main:Object (NoMethodError) from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' from hpri.rb:5 gem environmentでGEM PATHSの部分が - /usr/lib/ruby/gems/1.8 - /home/XXXXX/.gem/ruby/1.8 となっていてユーザディレクトリが含まれているのが怪しいと思うのですがここの設定を変えることはできるのですか?
297 名前:274 mailto:sage [2008/12/09(火) 03:03:27 ] >>291 なるほど。説明ありがとうございます。 「"#!ruby -Ks"」とググったらリファレンスのFAQがヒットしたので読んでました。 それと自己解決しました! >>292 のエラーコードの通りsaveプロパティの問題でした。 グラフを新しいシートに書き出したのが問題だったのかもしれません(勝手な予想) saveAsで上書きしたらうまく行きました。 >>295 スミマセン。仰る通りネット上に落ちてるコードを参考にいじって書いてます。 レス、指摘くれた方々ありがとうございました。 おかげさまで無事動かせました。
298 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 03:12:30 ] >>296 カレントディレクトリにhpricot.rbというファイルがあって それがrequireされているのではないでしょうか。
299 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 03:30:35 ] >>298 BINGOです!お恥ずかしい・・・・。 ファイル名で中身がわかるようにしていたらモジュール名を使っていました。 本当に初心者的なミスですいません。
300 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 03:38:05 ] ここは初心者スレだからOKだよ そのためのスレだよ >>298 ナイスエスパー きみにはエスパー初段を与える
301 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 03:43:02 ] >>298->>299 の流れを見ていたら和んでしまった >>299 をフォローする>>300 にも和んでしまった
302 名前:298 mailto:sage [2008/12/09(火) 03:50:28 ] なんかどっかのブログで>>296 みたいなミスと質問はFAQにして良くね? っていうエントリを見たばっかりだったもんで。あと ./hpricot.rb:35: undefined method `Hpricot' for main:Object (NoMethodError) ^^^^^^^^^^^ ここ。 わかりやすいファイル名にしたいという趣旨は理解できる。 例えばtry_とかいうプレフィクスがいいかも。 test_だとまんまテストみたいだし、experiment_とかattempt_とか長いし。
303 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 04:01:37 ] シェルスクリプトでRuby回してパイプして出力って一般的?
304 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 07:00:38 ] >>302 前スレでも同じ質問あったしな
305 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 08:38:19 ] >>303 日本語でおk
306 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 10:25:21 ] >>35 日本語でおkって言ってみたかっただけだろ。
307 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 11:09:26 ] おーっと>>306 くんロングパスだーッ
308 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 13:33:21 ] >>303 一般的
309 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 13:37:28 ] Ruby の each と File.open{|f| f.print} を使うかシェルスクリプトの for と > を使うかというのはけっこう大変な問題 STDIN から読み取って STDOUT に吐き出すべきなのはわかるがそれだと逆に面倒だったり
310 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 13:48:17 ] rubyでシェル作ればいいのに zshなんてゴミもう捨てたい
311 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 14:04:56 ] Rubyスクリプトを作ったらそれを起動するシェルスクリプトも作らなければならないのは鬱陶しい
312 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 14:11:46 ] ?
313 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 14:38:31 ] オプション指定とかに拘るからだろ 全部Rubyスクリプト内に入れろ ディレクトリパスとかも直書きだ 不安ならスクリプト内1行目くらいでDir.cdしろ
314 名前:デフォルトの名無しさん [2008/12/09(火) 16:17:01 ] 行き詰ったので再現コード晒します。 どこがまずいのか宜しく apiの使用はアカウント制なのでurl精製工程部分は抜けていますが、アカウントをとって作成してみてください。 たいして掛からずバグエラー吐きます。コロン抜きなどもしてみましたが、だめでした。 #!/usr/local/bin/ruby -Ks # REXML宣言 XMLデータを処理するための require 'rexml/document' # UR.scapeの宣言 サイトにアクセスするための require 'open-uri' # 文字コードを変換するための require 'nkf' # 文字コードをURL用にエンコード require 'uri' $doc counter = 1 while counter != 0 # このキーワードでは1ページ30商品、12ページあるはずなので変数pegenoをpegeno.to_sしてurlに組み込む result = open(楽天商品検索API (version:2008-09-01)でメタルギアをキーワードにしたurl) $doc = REXML::Document.new(result) pegeno = pegeno+1 sleep 1 pegeno = 1 if pegeno == 13 end
315 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 16:29:34 ] どれか特定のページのXMLのパーズでトラブってるんじゃないかと思うが... 一旦、各ページをファイルにセーブして、それを1個ずつ REXML::Document.new して、それだと再現しないわけ?
316 名前:デフォルトの名無しさん [2008/12/09(火) 16:37:25 ] >>315 REXML::Document.newする前に内容を保存するようにテストプログラムもしてみたんですけど、 エラーはいた後、そのファイルの内容を改めて食わすと普通に食っちゃうですよね。 特定のページでもなくて、ファィルが保存されているので、サーバーエラーでコケているわけでもない。 初心者なので食わすプログラムにヘマてる可能性もありますけど。
317 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 16:37:52 ] >>314 >>315 も言ってるけど一度ファイルに落としてみて それでも再現するなら、そのxmlをどっかにうpしてほしい。 ぶっちゃけて言うと、楽天商品検索APIとやらを調べるのがめんどい。
318 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 16:47:56 ] >>316 > 特定のページでもなくて というのは、Document.new の前に p pegeno を入れてみると、 毎回結果が違う、ということ?
319 名前:デフォルトの名無しさん [2008/12/09(火) 17:16:21 ] すいません、それではファイルの読み出しからREXML::Document.newにそのデータを読ませるまでのプログラムを書いてもらえますか。 その工程をヘマっているような不安も大いにあるもので、すいませんが宜しくお願いします。
320 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:35:53 ] 検索すればいくらでも出てくるだろ・・・ リファレンスちゃんと読め
321 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:38:27 ] open 'ファイル名' do |file| doc = REXML::Document.new file end これだけだが
322 名前:デフォルトの名無しさん [2008/12/09(火) 17:42:06 ] みなさん開発環境はNetBeansですか? それともeclipse?
323 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 17:43:55 ] お前はnetbeans使ってるんだからそれでいいだろ 他人のことなんか気にするな
324 名前:デフォルトの名無しさん [2008/12/09(火) 18:20:43 ] 今実験してみました。 まず、バグエラー吐いたファイルを >>321 のプログラムで読み込ませて見ましたが、普通に食って Complete(0) って正常終了表示されました。 次にエラーを吐く前のページ(REXML::Document.newしてもエラーはかなかったページ) もして見ましたが、やはり Complete(0) っと正常終了。 こうなると、xmlデータを連続してREXML::Document.newにかけた時に問題が発生している気がするのですが。
325 名前:デフォルトの名無しさん [2008/12/09(火) 18:25:44 ] 訂正 まず、バグエラー吐いたページを保存したファイルを
326 名前:デフォルトの名無しさん [2008/12/09(火) 18:40:57 ] 念のため、検索結果1-12ページを保存した後、 >>321 の方法で連続して1-12ページをREXML::Document.newに読ませるループを組んでみました。 すると1-12ページまで問題なく読んだのですが、2週目の11ページ目でバグエラーを吐きました。 何が原因なんでしょうか。
327 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 19:11:11 ] ああ「バグエラー」ってsegvか・・・って、まだやってたのかw ・ファイルに落とすだけならエラーが出ない ・ファイルから読んでREXMLに放り込むだけならエラーが出ない なら、二回ruby起動して別々に処理すればいいんじゃない?
328 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 22:39:42 ] すみません。ちょっと質問させてください。 色々と試した結果、Rubyを使おうと思っています。 それで、特定のディレクトリのファイルを、 任意のディレクトリにサブディレクトリごとコピーし、 その中のファイルの内容を正規表現で置換し、 その上でファイル名も置換したいのです。 ディレクトリは数十、ファイルは数百くらいです。 こういう処理をショートカット一発でやりたいのですが可能でしょうか? ちなみにWindowsXPです。 また、Ruby初心者でも簡単に可能かどうかお聞かせ頂ければ幸いです。
329 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 22:57:21 ] .rbがRubyインタプリタに関連付けされていれば 「こういう処理」をするRubyスクリプトを書いてそのショートカットを作ればいいです。
330 名前:デフォルトの名無しさん mailto:sage [2008/12/09(火) 23:58:26 ] >>314 せっかく再現コードを載せてくれたから試そうとおもったけど、 やっぱりこれじゃわかんないや。 できれば ttp://gist.github.com/ とかにコードを載っけてくれない? あと pegeno は page_no とかにしたほうがいいよ pegeはカッコワルイ
331 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 00:54:41 ] 記事内の動詞や名詞の数を数えるモジュールもしくはこういうモジュール使ったら実現できるよ というものはありますか? 数え上げるのがどういう技術なのかわからないので検索すらできませんでした
332 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 00:57:49 ] 形態素解析 でぐぐる
333 名前:デフォルトの名無しさん [2008/12/10(水) 01:07:01 ] すいません、特定の文字を改行に置き換えるにはどのようにすればいいのでしょうか。 変数a1に内容が入っているとした場合、 a1 = a1.gsub(/a1e1ee/,"\n") これだと C:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/rb15.tmp:412: private method `gsub' called for #<Array:0x2bb23b0> (NoMethodError) エラーを吐くですけど。改行を別の文字に置き換えるのは問題なくできたんですが。
334 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:14:19 ] ちゃんとそのエラーを見てください。 `gsub' called for #<Array:0x2bb23b0> ^^^^^^^^^^^^^^^^^^^^^^^^ a1があなたの期待しているようなStringの値ではないのです。
335 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:17:22 ] >>333 Stringオブジェクトにするべき操作をArrayオブジェクトに対して行ってる。 a1の由来がわからないとたしかなことは言えないけど、おそらく文字列配列だから a1.join.gsub で一つのStringオブジェクトにするか a1.map{|v| v.gsub } で中のStringオブジェクトにひとつづつアクセスしてごらん。
336 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:20:13 ] ここのスレ住人の親切さは異常 レス貰いっぱなしじゃなくて礼の一つも言おうぜ>連日ageてる人
337 名前:デフォルトの名無しさん [2008/12/10(水) 01:26:27 ] >>334 >>335 このエラーメッセージでは分かりませんでしたw みなさんの説明でぴんときました。 最初私はこのようにしていたのですが、 a1 = a1.gsub(/\n/,"a1e1ee") a1 = a1.scan(/<Body>.*<\/Body>/) a1 = a2.gsub(/a1e1ee/,"\n") この時点でa1は配列化したのですね。>a1 = a1.scan(/<Body>.*<\/Body>/) なのでこのように修正したらうまく行きました。 a1 = a1.gsub(/\n/,"a1e1ee") a1 = a1.scan(/<Body>.*<\/Body>/) a2 = a1[0] a1 = a2.gsub(/a1e1ee/,"\n")
338 名前:デフォルトの名無しさん [2008/12/10(水) 01:30:34 ] >>336 すいません、みなさんありがとうございます。
339 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:32:50 ] >>332 ありがとうございます Mecabを入れてMecab-rubyも入れました。まずはMecabとHpricotを組み合わせてみようと require 'rubygems' require 'open-uri' require 'kconv' require 'hpricot' require 'MeCab' doc = Hpricot(open("ameblo.jp/staff/ ").read) doc.search("div.subContents").each{|content| content_html = content.inner_html.to_s.toutf8 content_text = content.inner_text.to_s.toutf8 puts content_html puts content_text puts content_html.split(//).size puts content_text.split(//).size chasen = content.MeCab::Tagger.new("-Ochasen") puts chasen.parseToNode(str) } とやってみたのですが mecabun.rb:17: undefined method `MeCab' for #<Hpricot::Elem:0xb6f501d4> (NoMethodError) from test.rb:8:in `each' from test.rb:8 となってしました。 gemでMecab周辺がそろえられなかったのでどのようなことができるのかわかりませんでした。
340 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:38:03 ] >>339 >chasen = content.MeCab::Tagger.new("-Ochasen") おちつけw
341 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:49:26 ] >>340 すいません mecab = MeCab::Tagger.new("-Ochasen") puts mecab.parseToNode(content) と変えてみたのですがこんどは mecabun.rb:18:in `parseToNode': in method 'parseToNode', argument 2 of type 'char const *' (TypeError) from mecabun.rb:18 from mecabun.rb:8:in `each' from mecabun.rb:8 となってしまいます。
342 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:52:40 ] >>341 p content として、contentの値を確かめてみて
343 名前:341 mailto:sage [2008/12/10(水) 01:56:19 ] parseToNodeではなくてparseでした。エラーは同じでした
344 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 01:58:03 ] >>341 渡すべきはcontent_textのような。
345 名前:341 mailto:sage [2008/12/10(水) 02:01:41 ] {elem <div class="subContents"> "\n" {comment <!--messageTop-->} "\n" {elem <center> "\343\202\242\343\203〜〜〜3\240\343\201\270 \342\226\240" </a>} "\r\n " </center>} "\n" {comment <!--messageBottom-->} "\n" </div>} という感じでした。 文字コードの設定なんでしょうか?
346 名前:341 mailto:sage [2008/12/10(水) 02:04:30 ] >>344 うまくいきました!!! p content から p content_textでも文字化けでした。
347 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 02:17:03 ] >>346 p content_text の文字化けはたぶん問題ない puts context_text.class とすれば String になっているはず puts context_text とすれば文字列が表示されるはず
348 名前:341 mailto:sage [2008/12/10(水) 02:41:48 ] >>347 ありがとうございます!文字列表示されました。 動詞や名詞の数も不格好かも知れませんが、まずは出力をカウントしていく感じでやってみます。 皆さんありがとうございます!
349 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 02:55:19 ] 俺も>>341 が使ってるhpricotを使ってるけど、nokogiriちゅうのを見かけたんだけど誰か使っている奴いる? hpricotより早いちゅう感じらしいが
350 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 03:14:23 ] mechanizeにHpricotの代わりに使ってる。 なんせWinだとgemでHpricot入れるのが難儀なもんで。
351 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 06:35:38 ] Nokogiriのインストールがgem一発で簡単であるかのような表現はやめて頂きたく存じ上げ奉り候
352 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 06:39:17 ] つーかWinでHpricotのインストールが難しいってどういうこと?
353 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 06:45:52 ] >>352 難しくなかった人はたまたま最新バージョンに Win バイナリがあった人 最新バージョンに Win バイナリが無い場合、バイナリのあるバージョンを手で指定しないとインストールが終了しない これは gem update のアップグレードが悲惨