Ruby 初心者スレッド Part 23 at TECH
[2ch|▼Menu]
[前50を表示]
250:デフォルトの名無しさん
08/12/07 21:14:00
>>248
ロジックで敗れたのでヒステリーで対抗ですね、わかります。

251:デフォルトの名無しさん
08/12/07 21:20:15
>>249
そのようだなw

252:デフォルトの名無しさん
08/12/07 21:49:47
>>248
そんなカキコミしてる暇あったら、再現コードを用意しようぜ。
SegmentationFaultのバグは、再現コードがないとエスパーしようがない。

253:デフォルトの名無しさん
08/12/07 22:03:56
おまえらけんかすんなよ

254:デフォルトの名無しさん
08/12/07 23:37:37
1.8.5ででかいのをREXMLに食わせたらSEGVったって話が
結構前にruby-devにあったような。

255:デフォルトの名無しさん
08/12/08 03:09:02
度々すいません。
open命令でXMLファイルをサイト経由で取得した場合、

result = open(a2)

resultには#<File:0x2c07f2c>という内容しか入っていないようなのですが、
帰ってきたサイトのHTMLデータといいますか、そのようなものを見るにはどうしたらいいのでしょうか。
色々とテストしてみたら、どうも帰ってくるXMLデータが相手サーバの都合か何かで変な状態で返されものを
REXML::Document.newで開くとコケるみたいです。
どんなファイルのときにこけているか分かれば対策の打てるような気もします。

256:デフォルトの名無しさん
08/12/08 03:20:24
テンプレ。
>質問には以下を書くこと。へたくそな質問は再提出を要求される。
> ・エラーメッセージ(自力で訳さずなるべくそのままで)

エスパーしてみると、エラーを突っ返されても構わずREXML::Document.newに渡しているせいで
XMLとしては当然解釈できずパースエラーとか。

257:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/08 06:22:33
>>257
そんなどのマニュアルにもどんな解説にも書いてあるようなことで>>255さんが詰まるはずないだろ馬鹿か?
[BUG] って書いてあるんだからこっちに落ち度はなくてRubyが一方的に悪いに決まってるだろ

259:デフォルトの名無しさん
08/12/08 06:35:54
そんな煽りいらないお

260:デフォルトの名無しさん
08/12/08 06:56:35
俺らは質問やその後の遣り取りから質問者の知識を当て推量して回答したりしなかったりするわけだが、
>>258と言いたくなるのは今回は仕方があるまい
openを一度でも自分で使ったことがあるならわかることだからな
書き込みの際に省略してるだけだと思うしかないわ

261:デフォルトの名無しさん
08/12/08 08:46:03
> open命令でXMLファイルをサイト経由で取得した場合、
openつーか、require 'open-uri'した上でのopenだよな?


262:デフォルトの名無しさん
08/12/08 08:58:18
>>260
君はキモイからもうこのスレに来なくていい

263:デフォルトの名無しさん
08/12/08 09:46:33
>>262
お前キモいな

264:デフォルトの名無しさん
08/12/08 10:03:51
262はもうこのスレに来られなくなりました。

265:デフォルトの名無しさん
08/12/08 10:21:05
この刃はさすがに鋭いぬ
ひとりでスレ参加仕切るのはキモいわな

266:デフォルトの名無しさん
08/12/08 10:55:44
>>255
用語がちょい怪しいからHTTPについてあんま知らんのかも知れんけど、
open-uriで返ってきたオブジェクトに返してはFileとかの他にOpenURI::Metaについても
調べてみてくれ。
向こうのサーバがOKなレスポンスを返したかとかの調べ方がわからんのだったらまさにそれ。

267:デフォルトの名無しさん
08/12/08 11:35:17
中身を見るには require 'pp' して pp で見るといいお

268:デフォルトの名無しさん
08/12/08 11:40:13
(pretty_)inspectでフォローされてるとは限らないけどな

269:デフォルトの名無しさん
08/12/08 11:50:24
pretty_inspectの書式のめんどくささは異常

270:デフォルトの名無しさん
08/12/08 14:33:22
このプログラムでなぜかこけるのですが、原因って分かりますか?

#!/usr/local/bin/ruby -Ks
# REXML宣言 XMLデータを処理するための
require 'rexml/document'
require 'open-uri'
require 'uri'
result = open("スレリンク(tech板)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:デフォルトの名無しさん
08/12/08 14:55:36
訂正します
#!/usr/local/bin/ruby -Ks
require 'rexml/document'
require 'open-uri'
require 'uri'
result = open("URLリンク(10plate.blog44.fc2.com)")
toto = result.read
doc = REXML::Document.new(result)


272:デフォルトの名無しさん
08/12/08 15:09:22
そりゃ読み終わってりゃ中身は空だからなあ。当然だろう

273:デフォルトの名無しさん
08/12/08 15:16:28
引数はXML文字列でもいいのに…
てかREXMLでパースしたなら元のファイル別にいらないじゃんね

274:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/08 16:00:03
ちょっと聞くけど、VBA使ったり他の言語からOLE経由する方法では自分でグラフ描けるんだよね?
まさかRubyの知識しかないのにWin32OLE使ってるわけじゃないよね?

278:デフォルトの名無しさん
08/12/08 16:50:49
>>277
いや、そのまさかです。
マクロの記録→編集でVBAのコードを作ってそれをRubyに書き換えたつもりだったんですが・・・



279:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/08 20:32:41
endの閉じ忘れ文法エラーが初心者の頃は面倒だったね
どこで閉じ忘れたのかを探しにくいからね

1.9.1だとendのインデントのずれを指摘するパッチが取り込まれたので
-wオプションつければずれてるendを警告してくれて
抜けてるendの位置をちょっと絞り込める

ところで、エラーメッセージの
tCONSTANT とか kENDってなに?
YACCのトークンとかいうやつ?
構文解釈中のエラー?
そんな内部の情報を直に見せられても、初心者にはわけわからんよ
ま、わからんなりに
「endじゃなくて定数が来ちゃってる文法エラー」だなということは理解できるんだけど


281:デフォルトの名無しさん
08/12/08 20:46:15
文字列リテラルの閉じ忘れはエラーがどかどかでるので割と判りやすいけど
閉じ忘れた文字列から、はるか後ろのほうでエラーが出る場合があるので
やっぱり最初の頃は修正が面倒だったな

エラーが出た個所で文字列を閉じてるのが ' か " を確認して、
それより前のクォート文字を検索する
閉じ忘れたのが %記法だったら面倒だが

たまに、Windowsのディレクトリパスを書くときに 'C:\test\' とかやって閉じ忘れたりする


282:デフォルトの名無しさん
08/12/08 20:47:57
tCONSTANT は定数トークンだろね
でも kEND の k ってなんじゃろ

283:デフォルトの名無しさん
08/12/08 20:56:28
keyword

284:282
08/12/08 21:03:46
>>283
なるほどサンクス
いい機会だから parse.y 眺めてるお

285:274
08/12/08 22:04:13
>>279
レスありがとうございます。
よく見直してみたんですが、「"」の閉じ忘れはありませんでした。
グラフの部分のコードを消して試しに他の操作をさせるとちゃんと動いたので
やはりグラフのコードのどこかが悪いようです。



286:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/08 22:50:02
すごいバカが来たな。

288:デフォルトの名無しさん
08/12/08 22:58:26
こういうバカはたいては女
それも女の出来そこないって相場が決まってるw

289:274
08/12/09 00:49:17
WIN32OLEに詳しい方、引き続き>>274救助待ちなのでお願いします。

290:デフォルトの名無しさん
08/12/09 01:05:07
>>285
やっぱり文字列リテラルの閉じ忘れじゃないのかなぁ
\223\276 って SJISの「得」なんで
そんなのをスクリプトとして解釈しようとするなんて
文字列の閉じ忘れくらいしかない気がする

単純な文字列だけじゃなくて
'〜' とか "〜"だけじゃなくて 正規表現リテラルとか /〜/ とか
%記法の %w(〜) とか %Q(〜) %r!〜! みたいなのも有るんで
%記法だと任意の記号を使えるので注意

しかも%記法の %q!! %Q!! %r!! %x!!だと、区切り文字に空白やタブや改行も使えてしまうぞ
%q a だと'a' と同じ意味
そんなの使ったスクリプトなんて、もはや嫌がらせだが


291:デフォルトの名無しさん
08/12/09 01:40:27
>>274-275にsyntax errorはないもんなぁ。
なんかダメもとでスクリプトの先頭に
#!ruby -Ks
と書き足してみるとか。

292:274
08/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
08/12/09 02:20:35
連レススミマセン。
あとモジュール定義の所
module Excel
end
から
module ExcelConst
end
に変更しています。

294:291
08/12/09 02:32:05
SJISの「ソ」みたいにSJISだと思わずに扱うと面倒が起きる文字があって、
rubyに-Ksオプションを付ける(shebangっぽく>>291でもOK)と
rubyもSJISで書かれたスクリプトだと承知して字句解析する。

リファレンスを引くなら$KCODEあたりがとっかかりだろうか。

295:デフォルトの名無しさん
08/12/09 02:48:40
>それと直接の関係はなさそう(上では表面化しなかっただけかも)ですが、
>excel = WIN32OLE.new('Excel.Application')の下に
>WIN32OLE.const_load(excel, ExcelConst)を追加しました。
>これがないと「ExcelConst::」の位置でエラーになるようです。

それは当たり前です。ただ空のモジュールを作ったってExcelの定数を扱えるわけがありません。
なんかサンプルのスクリプトをもとに頑張ってる感じがしますが、もしそうだとしたら
もうちょっとちゃんと真似したようがよいと思います。

296:デフォルトの名無しさん
08/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
08/12/09 03:03:27
>>291
なるほど。説明ありがとうございます。
「"#!ruby -Ks"」とググったらリファレンスのFAQがヒットしたので読んでました。

それと自己解決しました!
>>292のエラーコードの通りsaveプロパティの問題でした。
グラフを新しいシートに書き出したのが問題だったのかもしれません(勝手な予想)
saveAsで上書きしたらうまく行きました。

>>295
スミマセン。仰る通りネット上に落ちてるコードを参考にいじって書いてます。


レス、指摘くれた方々ありがとうございました。
おかげさまで無事動かせました。

298:デフォルトの名無しさん
08/12/09 03:12:30
>>296
カレントディレクトリにhpricot.rbというファイルがあって
それがrequireされているのではないでしょうか。

299:デフォルトの名無しさん
08/12/09 03:30:35
>>298
BINGOです!お恥ずかしい・・・・。
ファイル名で中身がわかるようにしていたらモジュール名を使っていました。
本当に初心者的なミスですいません。

300:デフォルトの名無しさん
08/12/09 03:38:05
ここは初心者スレだからOKだよ
そのためのスレだよ

>>298
ナイスエスパー
きみにはエスパー初段を与える

301:デフォルトの名無しさん
08/12/09 03:43:02
>>298->>299の流れを見ていたら和んでしまった
>>299をフォローする>>300にも和んでしまった

302:298
08/12/09 03:50:28
なんかどっかのブログで>>296みたいなミスと質問はFAQにして良くね?
っていうエントリを見たばっかりだったもんで。あと
./hpricot.rb:35: undefined method `Hpricot' for main:Object (NoMethodError)
^^^^^^^^^^^
ここ。

わかりやすいファイル名にしたいという趣旨は理解できる。
例えばtry_とかいうプレフィクスがいいかも。
test_だとまんまテストみたいだし、experiment_とかattempt_とか長いし。

303:デフォルトの名無しさん
08/12/09 04:01:37
シェルスクリプトでRuby回してパイプして出力って一般的?

304:デフォルトの名無しさん
08/12/09 07:00:38
>>302
前スレでも同じ質問あったしな

305:デフォルトの名無しさん
08/12/09 08:38:19
>>303
日本語でおk


306:デフォルトの名無しさん
08/12/09 10:25:21
>>35
日本語でおkって言ってみたかっただけだろ。

307:デフォルトの名無しさん
08/12/09 11:09:26
おーっと>>306くんロングパスだーッ

308:デフォルトの名無しさん
08/12/09 13:33:21
>>303
一般的

309:デフォルトの名無しさん
08/12/09 13:37:28
Ruby の each と File.open{|f| f.print} を使うかシェルスクリプトの for と > を使うかというのはけっこう大変な問題
STDIN から読み取って STDOUT に吐き出すべきなのはわかるがそれだと逆に面倒だったり

310:デフォルトの名無しさん
08/12/09 13:48:17
rubyでシェル作ればいいのに
zshなんてゴミもう捨てたい

311:デフォルトの名無しさん
08/12/09 14:04:56
Rubyスクリプトを作ったらそれを起動するシェルスクリプトも作らなければならないのは鬱陶しい

312:デフォルトの名無しさん
08/12/09 14:11:46


313:デフォルトの名無しさん
08/12/09 14:38:31
オプション指定とかに拘るからだろ
全部Rubyスクリプト内に入れろ
ディレクトリパスとかも直書きだ
不安ならスクリプト内1行目くらいでDir.cdしろ

314:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/09 16:29:34
どれか特定のページのXMLのパーズでトラブってるんじゃないかと思うが...

一旦、各ページをファイルにセーブして、それを1個ずつ REXML::Document.new
して、それだと再現しないわけ?

316:デフォルトの名無しさん
08/12/09 16:37:25
>>315
REXML::Document.newする前に内容を保存するようにテストプログラムもしてみたんですけど、
エラーはいた後、そのファイルの内容を改めて食わすと普通に食っちゃうですよね。
特定のページでもなくて、ファィルが保存されているので、サーバーエラーでコケているわけでもない。
初心者なので食わすプログラムにヘマてる可能性もありますけど。


317:デフォルトの名無しさん
08/12/09 16:37:52
>>314
>>315も言ってるけど一度ファイルに落としてみて
それでも再現するなら、そのxmlをどっかにうpしてほしい。

ぶっちゃけて言うと、楽天商品検索APIとやらを調べるのがめんどい。

318:デフォルトの名無しさん
08/12/09 16:47:56
>>316
> 特定のページでもなくて

というのは、Document.new の前に p pegeno を入れてみると、
毎回結果が違う、ということ?

319:デフォルトの名無しさん
08/12/09 17:16:21
すいません、それではファイルの読み出しからREXML::Document.newにそのデータを読ませるまでのプログラムを書いてもらえますか。
その工程をヘマっているような不安も大いにあるもので、すいませんが宜しくお願いします。


320:デフォルトの名無しさん
08/12/09 17:35:53
検索すればいくらでも出てくるだろ・・・
リファレンスちゃんと読め

321:デフォルトの名無しさん
08/12/09 17:38:27
open 'ファイル名' do |file|
 doc = REXML::Document.new file
end

これだけだが

322:デフォルトの名無しさん
08/12/09 17:42:06
みなさん開発環境はNetBeansですか?
それともeclipse?

323:デフォルトの名無しさん
08/12/09 17:43:55
お前はnetbeans使ってるんだからそれでいいだろ
他人のことなんか気にするな

324:デフォルトの名無しさん
08/12/09 18:20:43
今実験してみました。
まず、バグエラー吐いたファイルを
>>321 のプログラムで読み込ませて見ましたが、普通に食って
Complete(0)
って正常終了表示されました。
次にエラーを吐く前のページ(REXML::Document.newしてもエラーはかなかったページ)
もして見ましたが、やはり
Complete(0)
っと正常終了。
こうなると、xmlデータを連続してREXML::Document.newにかけた時に問題が発生している気がするのですが。

325:デフォルトの名無しさん
08/12/09 18:25:44
訂正
まず、バグエラー吐いたページを保存したファイルを

326:デフォルトの名無しさん
08/12/09 18:40:57
念のため、検索結果1-12ページを保存した後、
>>321 の方法で連続して1-12ページをREXML::Document.newに読ませるループを組んでみました。
すると1-12ページまで問題なく読んだのですが、2週目の11ページ目でバグエラーを吐きました。

何が原因なんでしょうか。


327:デフォルトの名無しさん
08/12/09 19:11:11
ああ「バグエラー」ってsegvか・・・って、まだやってたのかw

・ファイルに落とすだけならエラーが出ない
・ファイルから読んでREXMLに放り込むだけならエラーが出ない
なら、二回ruby起動して別々に処理すればいいんじゃない?

328:デフォルトの名無しさん
08/12/09 22:39:42
すみません。ちょっと質問させてください。
色々と試した結果、Rubyを使おうと思っています。

それで、特定のディレクトリのファイルを、
任意のディレクトリにサブディレクトリごとコピーし、
その中のファイルの内容を正規表現で置換し、
その上でファイル名も置換したいのです。
ディレクトリは数十、ファイルは数百くらいです。

こういう処理をショートカット一発でやりたいのですが可能でしょうか?
ちなみにWindowsXPです。
また、Ruby初心者でも簡単に可能かどうかお聞かせ頂ければ幸いです。

329:デフォルトの名無しさん
08/12/09 22:57:21
.rbがRubyインタプリタに関連付けされていれば
「こういう処理」をするRubyスクリプトを書いてそのショートカットを作ればいいです。

330:デフォルトの名無しさん
08/12/09 23:58:26
>>314
せっかく再現コードを載せてくれたから試そうとおもったけど、
やっぱりこれじゃわかんないや。
できれば URLリンク(gist.github.com) とかにコードを載っけてくれない?
あと pegeno は page_no とかにしたほうがいいよ
pegeはカッコワルイ

331:デフォルトの名無しさん
08/12/10 00:54:41
記事内の動詞や名詞の数を数えるモジュールもしくはこういうモジュール使ったら実現できるよ
というものはありますか?
数え上げるのがどういう技術なのかわからないので検索すらできませんでした

332:デフォルトの名無しさん
08/12/10 00:57:49
形態素解析 でぐぐる

333:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/10 01:14:19
ちゃんとそのエラーを見てください。
`gsub' called for #<Array:0x2bb23b0>
^^^^^^^^^^^^^^^^^^^^^^^^

a1があなたの期待しているようなStringの値ではないのです。

335:デフォルトの名無しさん
08/12/10 01:17:22
>>333
Stringオブジェクトにするべき操作をArrayオブジェクトに対して行ってる。
a1の由来がわからないとたしかなことは言えないけど、おそらく文字列配列だから
a1.join.gsub
で一つのStringオブジェクトにするか
a1.map{|v| v.gsub }
で中のStringオブジェクトにひとつづつアクセスしてごらん。

336:デフォルトの名無しさん
08/12/10 01:20:13
ここのスレ住人の親切さは異常
レス貰いっぱなしじゃなくて礼の一つも言おうぜ>連日ageてる人

337:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/10 01:30:34
>>336
すいません、みなさんありがとうございます。

339:デフォルトの名無しさん
08/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("URLリンク(ameblo.jp)").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:デフォルトの名無しさん
08/12/10 01:38:03
>>339
>chasen = content.MeCab::Tagger.new("-Ochasen")
おちつけw

341:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/12/10 01:52:40
>>341
p content
として、contentの値を確かめてみて

343:341
08/12/10 01:56:19
parseToNodeではなくてparseでした。エラーは同じでした

344:デフォルトの名無しさん
08/12/10 01:58:03
>>341
渡すべきはcontent_textのような。


345:341
08/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
08/12/10 02:04:30
>>344
うまくいきました!!!
p content から p content_textでも文字化けでした。

347:デフォルトの名無しさん
08/12/10 02:17:03
>>346
p content_text の文字化けはたぶん問題ない
puts context_text.class とすれば String になっているはず
puts context_text とすれば文字列が表示されるはず

348:341
08/12/10 02:41:48
>>347
ありがとうございます!文字列表示されました。
動詞や名詞の数も不格好かも知れませんが、まずは出力をカウントしていく感じでやってみます。
皆さんありがとうございます!

349:デフォルトの名無しさん
08/12/10 02:55:19
俺も>>341が使ってるhpricotを使ってるけど、nokogiriちゅうのを見かけたんだけど誰か使っている奴いる?
hpricotより早いちゅう感じらしいが

350:デフォルトの名無しさん
08/12/10 03:14:23
mechanizeにHpricotの代わりに使ってる。
なんせWinだとgemでHpricot入れるのが難儀なもんで。

351:デフォルトの名無しさん
08/12/10 06:35:38
Nokogiriのインストールがgem一発で簡単であるかのような表現はやめて頂きたく存じ上げ奉り候

352:デフォルトの名無しさん
08/12/10 06:39:17
つーかWinでHpricotのインストールが難しいってどういうこと?

353:デフォルトの名無しさん
08/12/10 06:45:52
>>352
難しくなかった人はたまたま最新バージョンに Win バイナリがあった人
最新バージョンに Win バイナリが無い場合、バイナリのあるバージョンを手で指定しないとインストールが終了しない
これは gem update のアップグレードが悲惨

354:350
08/12/10 07:36:46
>>351
やっぱりプロジェクトが活発でなくなるとHpricotみたいにバイナリを用意してもらえず
難しくなるかなぁ…
自分は今のところgemで一発でした。

355:デフォルトの名無しさん
08/12/10 17:15:59
バイナリを用意してもらえなくなったら、自分が用意する番だよ。

356:デフォルトの名無しさん
08/12/10 18:29:46
irb に --noinspect をつけると、式の結果を inspect するのを
やめさせることができますが、同じことを irb のプロンプトから
行うことはできますか。
irb を使ってて、inspect による評価を一時的にやめさせようと
しています。

irb> IRB.conf[:INSPECT_MODE] = false

とかしてみましたけど、かわりませんでした。



357:328
08/12/10 18:43:11
>>329
ありがとうございます。安心しました。

あと、数百のファイルをコピーする時、
ファイル名を一つ一つ変更したいのですが、
それも可能でしょうか?

名前を一つ一つ打ち込めばできますが、
ファイルの数が数百もあるので、
正規表現で置換するような形でリネームしたいのです。
「コードが一行で済まないかな」と思っています。

358:デフォルトの名無しさん
08/12/10 19:02:26
>>356
IRB.conf[:MAIN_CONTEXT].inspect_mode = false

>>357
どういうファイル名をどのように変えるのかがわからないとなんとも。
あと一行でっていうのは、やればできるんだろうけど
いわゆる玄人御用達だからオススメしない。

359:デフォルトの名無しさん
08/12/10 19:15:12
>>358
やってみましたが、かわんないです。
あいかわらず inspect の結果が表示されます。

360:デフォルトの名無しさん
08/12/10 19:21:59
ruby -i ky_*.txt -pe '$_.sub!(/麻生太郎/, "阿呆太郎")' *.txt

で動くかもしれない。

361:デフォルトの名無しさん
08/12/10 19:30:59
>>359
やりたいのは--noechoじゃない?
IRB.conf[:MAIN_CONTEXT].echo = false

362:デフォルトの名無しさん
08/12/10 21:21:39
>>357
御返事ありがとうございます。
元ファイル名は大体このような感じです。

 hoge_428_20-01.txt

hoge と数字の部分が違っているものが数百ほどあります。
それを別のディレクトリにコピーする時に、

 index_428_20-01.tex

というような形に変えたいのです。
先頭と拡張子の部分を置換する格好になります。
置換を正規表現で表現すると次のようになります。

 検索 [a-z]+([\d_\-])+\.txt
 置換 index\1.tex

このようなリネーム処理を、
ファイル(ディレクトリ)コピー時に同時に行いたいのです。

363:デフォルトの名無しさん
08/12/10 21:24:33
>>361
びんごです!
さすが特務エスパー、多謝です

364:デフォルトの名無しさん
08/12/10 21:27:48
>>362
だからできるっつの
めんどくさいので、対象ファイルの指定も実際のコピーもRubyでやれ
これらを外部から読み込むように作ろうとすると敷居が微妙に高い
より正確に言うと変なものが混じったときのエラー処理がめんどい

365:デフォルトの名無しさん
08/12/11 09:33:52
>>362
これを参考にしてみて。
require 'fileutils'
from = /[a-z]+(¥d_¥-])+¥.txt$/
to = 'index¥1.tex'
filenames.each do |filename|
 new_filename = filename.sub from, to
 FileUtils.mv filename, new_filename if filename != new_filename
end

>>364
役立たずなレス
初心者の相手ができないならくんなよ

366:デフォルトの名無しさん
08/12/11 15:31:12
def func
  a = ["hage","hoge","hage"]
  a.each{|elem|
   return true if elem="hoge"
  }
  return false
end
上記のようなコードを書くと、funcの返り値が[false,true,false]になってしまうのですが、
trueひとつにしたい場合はどのようにしたらよいでしょうか

367:デフォルトの名無しさん
08/12/11 15:36:25
>>366
ごめんなさい、これ勘違いだったので見なかったことに

368:デフォルトの名無しさん
08/12/11 15:37:11
>>365のスクリプトがキモい件について

369:デフォルトの名無しさん
08/12/11 15:50:06
Ruby式ではないな
他の言語の人間だ

370:デフォルトの名無しさん
08/12/11 16:19:31
初心者にあんま見せたくない書き方であることは間違いないね…

371:デフォルトの名無しさん
08/12/11 16:23:39
htmlデータからタグの間に挟まれた文字のみ取り出すにはどうすればいいですしようか。
タグ名もバラバラです。

<b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow>

タグごと取り出す方法は分かったのですが。



372:デフォルトの名無しさん
08/12/11 16:28:04
>>365をrubyらしくってどう書けばいいの?

rename_rule=[..., ...]

def mkdistnme file
x.sub *rename_rule
end

def movefile from, to
...
end

filenames.map{|x| [x, mkdistnme x]}.each{|ft| movefile *ft}

373:デフォルトの名無しさん
08/12/11 16:41:37
>>371
hpricotとかでパースするのをオススメしたいけど
慣れるまでが難しいかも知れない。

ネスト構造無視でいいなら
str = "<b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow>"
ary = []
str.gsub(/<.+?>(.+?)<\/.+?>/){ary << $1}

gsub使うのに違和感あるから、もっといい方法があるかも?

374:デフォルトの名無しさん
08/12/11 17:02:02
>>371
deleteの動作(主に返り値)に注意

str = "<b1>殿様カエル</b1><b2>しり上がり</b2><goow>自転車</goow>"
arr = str.split(/<.+?>/)
arr.delete('')
puts arr

殿様カエル
しり上がり
自転車


HTMLとしてパースするのが真っ当

375:デフォルトの名無しさん
08/12/11 17:09:31
>deleteの動作
そういえばなんでArrayの一部メソッドは破壊的な操作をするのに
!がついてないんだろう。perl由来の名残のような気もするけど

ary = [].push data
[].push! data
と書きそうになることがよくある。

376:デフォルトの名無しさん
08/12/11 17:34:18
a = [1,2,3]
b = [4,5,6]
a.each{|i| puts i}
b.each{|i| puts i}
とやると 123456 の順に表示されますが

a.calleach
b.calleach
puts "A"
a.calleach
puts "B"
b.calleach
a.calleach
puts "C"
b.calleach

のようにeachの各ループが実行されるタイミングを自分で制御してこの例では 14A2B53C6
という順で出力されるようなイテレータの書き方というか呼び方あったら教えてください。
自分でインデックス変数も合わせて用意すればいいんでしょうが
もう少し簡潔なのがあれば嬉しいです。

377:デフォルトの名無しさん
08/12/11 17:44:16
>>376
それはプログラム構造そのものが間違っている
絶対にあとで破綻するから、いまのうちに書き直せ

で、その時間がないという場合は、配列をキューとみなして使う

a.shift
b.shift
puts "A"
a.shift
puts "B"
b.shift
a.shift
puts "C"
b.shift


378:デフォルトの名無しさん
08/12/11 17:47:21
>>376
1.8ならGenerator、1.9ならEnumeratorがそんな感じだけど
推測するにEnumerable#zipで十分なんじゃないかな

[1,2,3].zip([4,5,6], ["A","B","C"]) {|ary| puts ary }

379:デフォルトの名無しさん
08/12/11 17:47:42
>>376
継続とかcall/ccとかコルーチンとかだっけ。

require 'generator'
g = Generator.new([1,2,3])
g.next

380:デフォルトの名無しさん
08/12/11 17:50:28
外部イテレータ ね

381:デフォルトの名無しさん
08/12/11 18:02:39
>>375
!は「破壊的」という意味ではない。
!の意味は、それが付かない同名メソッドと比較して、注意すべき挙動の違いがある、という意味。

382:デフォルトの名無しさん
08/12/11 18:17:24
>>381
二種類提供する場合のみってことか。サンクス。

URLリンク(shugo.net)
>破壊的なメソッドと非破壊的なメソッドの両方を提供する場合、
>破壊的なメソッドには`!'を付ける。

URLリンク(www.ruby-lang.org)
>同名のメソッドがあって、一方はオブジェクトのコピーを作って返し、
>もう一方は変更されたオブジェクトを返すようになっている場合、
>!のついた方が破壊的メソッドです。ただし、!がつかないメソッドの中にも
>String#concatのように破壊的なものはあります。

383:デフォルトの名無しさん
08/12/11 18:52:51
>>365
ありがとうございます。
Rubyは初心者ですが、頑張って使いこなせるようになりたいです。

384:デフォルトの名無しさん
08/12/11 19:45:42
>>365
正規表現まちがってる。
>from = /[a-z]+(¥d_¥-])+¥.txt$/
from = /[a-z]+([¥d_¥-]+)¥.txt$/
あるいは
from = /¥w+([-_¥d]+)¥.txt$/
とか。[a-z]+ はたぶん ¥w+ で済むんじゃないか。

>>372
十分 Ruby らしいと思うけどね。負け惜しみだと思うよ、>>368-370は。



385:デフォルトの名無しさん
08/12/11 19:59:40
質問です。
Rateというクラスをインスタンスにして配列にしたいのですが、
@rates = Array.new(Rate.new)
と書くと、
can't convert Rate into Integer
というエラーメッセージが帰ってきて配列に出来ません。
どのようにすれば、インスタンス化したクラスを配列に出来るのでしょうか?

386:デフォルトの名無しさん
08/12/11 20:04:42
>>385
URLリンク(www.ruby-lang.org)
newの第一引数は整数か配列。

というわけで
@rates = [ Rate.new ]

387:デフォルトの名無しさん
08/12/11 20:06:10
>>384
$は文字列末尾じゃないぞ。

388:デフォルトの名無しさん
08/12/11 20:15:42
Array#zip は、引数のほうが長い場合は残りを無視するようですが、
これを無視しないようなオプションとかありますか。

コード:
['A','B'].zip([1,2,3,4]) {|c, i| puts "#{c}, #{i}" }

結果:
A, 1
B, 2

希望:
A, 1
B, 2
nil, 3
nil, 4



389:デフォルトの名無しさん
08/12/11 20:20:23
>>388
[1,2,3,4].zip(["A","B"]).map{|i| i.reverse}


390:385
08/12/11 20:25:26
>>386
ありがとうございます!

391:デフォルトの名無しさん
08/12/11 21:18:17
Ruby の作成環境の表示文字エンコードってどれが一番多いかな?
やっぱまだ EUC-JP? サンプルの日本語の puts のデフォルトを UTF-8 にしたいんだけど…

392:デフォルトの名無しさん
08/12/11 21:36:58
Windows環境でShift-JISの俺に隙はなかった

本当、端末の文字コード何とかならないかな
文字化けが不便なためにrspecのit 〜を日本語で書けない

393:デフォルトの名無しさん
08/12/11 21:52:54
# HTMLのタイトルを表示
puts html.scan(/<title>(.+?)</title>/)

では不足なんだよね
このあとに .toeuc とか .toutf8 とか書かないと化ける
化けるならまだしも、変なエスケープシーケンスがどうたらで方向キーとかが動作しなくなる
端末リセットしても直りゃしねえ

394:デフォルトの名無しさん
08/12/11 21:53:59
>>374
>>373
ありがとうございます。

split(/<.+?>/) の前にgsub(/<[^\/].[^>]*>/,"")をかませたらいい感じになりました。
splitの指定が正規表現できるとは初めて知りました。

395:デフォルトの名無しさん
08/12/11 21:54:45
そのへんは端末エミュレータの仕事だとも思う
日本語EUCでもUTF-8でも半角2バイト文字でもてきとーに表示するのが端末の仕事だろ
一緒に化けてどうする

396:デフォルトの名無しさん
08/12/11 22:41:16
>>395
無茶言うなよ……。一度エンコーディング自動識別のコード書いてみろ、絶望的な気分に浸れるから。

397:デフォルトの名無しさん
08/12/11 22:47:01
hoge.rb|nkf -Lu -wとか

398:デフォルトの名無しさん
08/12/11 22:50:00
>>393
inspectでお茶濁していいんじゃない?
どのみちその程度の文字コード知識はないとHTMLなんて扱えないから
説明が必要になるでしょ。

399:デフォルトの名無しさん
08/12/11 22:56:38
別に普通に書けたけどな。
JIS, SJIS, EUC-JP, UTF16 自動認識。

400:デフォルトの名無しさん
08/12/11 23:01:48
端末エミュレータが自動で標準出力に nkf -端末エンコード をかませばいいじゃん
nkf 自動認識が失敗したらなにか出力バッファに対して再試行できる仕組みにしてさ
Emacs が 文字コード指定して開き直せるのと同じような感じで

こういうときは us-ascii で済んでる人間が憎いなあ

401:デフォルトの名無しさん
08/12/11 23:21:56
>>399
どんなデータでもその自動認識が正しく動作するならおまえは天才だ

402:デフォルトの名無しさん
08/12/12 01:25:25
>>389
ありがとうございます。
でもこの場合、引数のほうが長ければ>>389のようにする、ということですよね。
そういうのが面倒だったので、zipにオプションがないかなーと思って質問してみました。
ないようならあきらめて>>389のようにします。

403:デフォルトの名無しさん
08/12/12 02:19:09
>>402
先頭の要素が不足する配列って、明示的にnil入れてあることが多いしね。

zipが複数の配列を引数に取ることを思い出して作り替えてみた。
眠いから間違ってるかも。

def Array.zip2(*ary)
 size = ary.map{|i| i.length}.max
 top = ary.shift.dup
 top[size-1] = nil
 if block_givin?
  top.zip(*ary){|a| yield a}
 else
  top.zip(*ary)
 end
end


404:デフォルトの名無しさん
08/12/12 02:31:14
>def Array.zip2(*ary)
やっぱ間違ってた、self使ってないorz
def zip2(*ary)ということでひとつ・・・。

405:デフォルトの名無しさん
08/12/12 02:36:23
配列の全内容を変数(String)に入れる簡単な方法はありますか?。
gsubの結果を1つの変数にまとめてgsubにかけようとしたら、

aa = bb.scan(/.+/)
*as = aa
cc = as.gsub(/m/,"")

こんな感じにしても「配列Array」だといわれてエラーで止まってしまいました。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4283日前に更新/244 KB
担当:undef