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を読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
230 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 00:37:45 ] てかエクセルオブジェクトを使うにはOLEの知識がいるじゃないか。
231 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 06:28:28 ] メソッドの勉強してるんですが puts とか getsがメソッドですよといわれたのは良いんですが self.puts とか、 100.to__s とかはわかるのですが gets.chompはなぜgetsの後ろにchompが付くんですか? メソッドの前に付くのが普通だと思ってたので・・・
232 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 07:14:23 ] >231 self.gets.chomp getsの結果に対してchompするということ つーかgetsはレシーバ書かないほうが普通だと思うが…
233 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 07:36:31 ] >>232 ありがとうございます selfは書かないんですけど rubyの練習に読んでる www1.tf.chiba-u.jp/~shin/tutorial/index.rb?Chapter=05 でselfが出てきたので聞いてみました。
234 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 07:50:48 ] そこ「説明の切り捨て方」がイマイチだな メソッドチェーンという概念がある(あくまで概念で、文法のようなものではない) あるメソッドの返り値のオブジェクトのクラスのメソッドを 返り値を返すメソッド.返り値のクラスのメソッド で動作させるものだ 関数的メソッドgetsの返り値は文字列であるStringクラスのオブジェクト(=インスタンス)だから、 Stringクラスのメソッドであるchompをメソッドチェーンで記述できる あくまでメソッドの返り値(またはオブジェクトそのもの)のクラスが重要 返り値のクラスは常に意識しておくといい
235 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 08:31:30 ] >>231 >gets.chompはなぜgetsの後ろにchompが付くんですか? s = gets s.chomp を一行でかいたら gets.chomp になった、というだけのこと。
236 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 08:38:01 ] >>234 難しい・・・(>_<) >>235 なるほど
237 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 08:53:23 ] Rubyはかなり豪快なメソッドチェーンが出来るのが魅力だよな 何だかんだでチェーンが切れるOOPLは多い気がする
238 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 09:01:12 ] end の後ろにメソッドが平気で繋がるのはやりすぎだとも思える が、ブロックとして {} を使うことにすると、クラスとメソッド用途によっては異常に便利 self や目的のオブジェクトが意図的に返るように作られてるブロックつきメソッドが多いのが効いてるな def … ナントカ カントカ yield s if s s end という定義が多い
239 名前:205 [2008/12/07(日) 17:03:10 ] すいません、あれから色々と調べて最初配列の作りすぎてメモリ使用しすぎて落ちているのかと思ったのですが、それともちがったようです。 それで現在も分からないですが、エラーメッセージの一番大事な所を表示し忘れました。 これで何が原因かおおよそわかりますか? C:/Ruby/lib/ruby/1.8/rexml/text.rb:312: [BUG] Segmentation fault ruby 1.8.6 (2008-08-11) [i386-mswin32] This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. Complete(3) 最初自分の命令の312行かと思い込んで読んでいたのですが、よくみるとREXMLの中の312行で死亡したぽいですが。
240 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 17:28:44 ] >>239 >>213-219 だれも「詳細なエラー文を」とは言ってないんだ。
241 名前:205 [2008/12/07(日) 18:03:35 ] それでは質問を変えます。 C:/Ruby/lib/ruby/1.8/rexml/text.rb:312 このエラーメッセージが意味するのは私のかいたプログラムの312行でエラー発生したのではなくて、 ルビー側が用意している C:/Ruby/lib/ruby/1.8/rexml/text.rb の312行目でエラーが発生したと解釈して間違いないですよね?
242 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 18:38:00 ] >241 それも完全な間違いでは無いが、限りなく間違いに近い。 本来Ruby側はどんな間違ったコードでも 「Rubyの」エラーを出して、コードとしては異常な終了でありながら Rubyとしては正常に終了しなければならない。 ところが今回RubyはSegmentationFault…つまりRuby自体が異常な終了をしている。 だからRuby制作側としてはRubyを修正すべきなんだが そのためにはSegmentationFaultが起こる状態を再現しないと 根本的な修正が難しい。 だから、その同じ状態を再現するコードがあったほうが良いのだよ。 …で、ライブラリ由来だとしてもライブラリをどう使うと起こるのか判らない。 SegmentationFaultである限り、貴方に責任はほぼ無いが 修正するには再現コードがないとキツいだろうなあという話。
243 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 18:42:43 ] ああ、C製の外部ライブラリなんかもセグフォで落ちるか? どちらにしろセグフォ起こす時点で 貴方自身では勘ぐらいしか対抗手段は無いよ。 で、実際のコードも再現コードも出せないなら 作者も多分修正不能で「原因不明のバグ」としか言えない。
244 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 18:44:40 ] 「[BUG]」を吐いて落ちてるような場合は、インタプリタが具体的に 「ここの行が悪いんでエラーにしますよ」と言ってるわけじゃないから、 その「C:/Ruby/lib/ruby/1.8/rexml/text.rb:312:」はたいした情報にならない。 問題を起こすプログラムから、そこを削っても問題が同じように起こる場所は 全部削っていって、問題を起こす最小のセットを作るしか、Rubyを作ってる 側としても対処のしようがない(普通は)。 (たまに、実は把握済みの問題で「このパッチだよ」というのが出てくることも あるがそれは宝くじのようなものなので)
245 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 18:45:26 ] >>241 情報が少なすぎて判断出来ないし、ここでやる内容とも思えない 問題のソースとエラーメッセージの全てを出して作者に聞け
246 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 18:45:35 ] 最新版が使えるなら最新版にしたら直ってるかも知れない。 最新版が使えないなら原因がネット上に落ちてるかも知れない。 …で、ネット上探すのは再現コードを見れないと厳しい。
247 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 20:10:06 ] >>239 とりあえずコードが公開可能なものならどこかのアップローダーに公開すれば いいわけで…。公開不可能ならMatzにそのソースを送りつければいいや。 ちなみに現在の最新安定版は1.8.7-p72だからそれを導入してみて もう一度やってみれば?もしそれでもSegmentation Faultが出るなら もう一度ここに来て。 Rubyの公式サイト www.ruby-lang.org/ja/
248 名前:デフォルトの名無しさん [2008/12/07(日) 20:53:45 ] >>242 おまえはキモイな。rubyなんかやるよりも死んだ方がいいんじゃないか?どうせ友達なんかいないんだろw
249 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 20:58:18 ] ルビー使い自称ルビリスト(笑)なんて所詮は囚人程度の脳味噌しかないからあまり関わんないほうがいい
250 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 21:14:00 ] >>248 ロジックで敗れたのでヒステリーで対抗ですね、わかります。
251 名前:デフォルトの名無しさん [2008/12/07(日) 21:20:15 ] >>249 そのようだなw
252 名前:デフォルトの名無しさん mailto:sage [2008/12/07(日) 21:49:47 ] >>248 そんなカキコミしてる暇あったら、再現コードを用意しようぜ。 SegmentationFaultのバグは、再現コードがないとエスパーしようがない。
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はカッコワルイ