Ruby 初心者スレッド Part 23at TECH
Ruby 初心者スレッド Part 23 - 暇つぶし2ch167:デフォルトの名無しさん
08/12/04 09:48:40
>>162
tDiary、Pinky:blog、lily

もしかして普通に名前挙げた俺、空気読めてない?

168:デフォルトの名無しさん
08/12/04 10:00:59
「ぶろぐようのCGI」というものを求めてる人には結構アレなシロモノだと思う
Rubyをやりたいんじゃなくてブログシステムが欲しいんだろうし

169:デフォルトの名無しさん
08/12/04 10:16:04
tDiaryより設置しやすく使いやすい軽快なものを作ろうとしてるのかもしれないじゃないか
日本における Perl の隆盛は Perl でカウンタと掲示板が作られたことだからな
「なんかごっつい Rails だけじゃない Ruby」を推進するなら今しかない

170:デフォルトの名無しさん
08/12/04 10:52:08
>>158
はい。

['hello', 'goodbye'].each do |greeting|
eval(EOS)
def #{greeting}(person)
eval "#{greeting.capitalize}, #{person}!"
end
EOS
end

実際はこんな感じです。展開抑制されると思わなかったので…

171:デフォルトの名無しさん
08/12/04 18:56:49
2重にしてでもevalを使いたいのは、リフレクションで
トップレベルにメソッドを定義するため?

172:デフォルトの名無しさん
08/12/04 21:28:23
>>170
ふつーはこう書く
['hello', 'goodbye'].each do |greeting|
 eval(<<-EOS)
  def #{greeting}(person)
   '#{greeting.capitalize} %s!'%person
  end
 EOS
end

173:デフォルトの名無しさん
08/12/05 12:24:58
採点用プログラムを書いてるんですが、得点ごとの振り分けでちゃんと動きません。

【ちゃんと動くプログラム】
if 90<=tokuten ; foo[9] += 1 ; end
if 80<=tokuten && tokuten<90 ; foo[8] += 1 ; end
if 70<=tokuten && tokuten<80 ; foo[7] += 1 ; end
if 60<=tokuten && tokuten<70 ; foo[6] += 1 ; end
if 50<=tokuten && tokuten<60 ; foo[5] += 1 ; end
if 40<=tokuten && tokuten<50 ; foo[4] += 1 ; end
if 30<=tokuten && tokuten<40 ; foo[3] += 1 ; end
if 20<=tokuten && tokuten<30 ; foo[2] += 1 ; end
if 10<=tokuten && tokuten<20 ; foo[1] += 1 ; end
if 0<=tokuten && tokuten<10 ; foo[0] += 1 ; end

【上記では長いのでイテレータで短くしたプログラム(正しく動かない)】
(1..8).each do |i|
if (90<=tokuten && tokuten<=100) ; foo[9] += 1 ; end
if (i*10)<=tokuten && tokuten<(i+1)*10 ; foo[i] += 1 ; end
if 0<=tokuten && tokuten<10 ; foo[0] += 1 ; end
end

配列はちゃんと0で初期化してあります。
短くしたプログラムはfoo[9]以外はちゃんと動いてるみたいです。
foo[9]だけが明らかにおかしい人数になるので不思議です・・・
なんとなくかっこで囲んでみたけどダメでした。もちろん上記と同じように「90<=tokuten」も試しましたがダメでした。
助言お願いします。

174:デフォルトの名無しさん
08/12/05 12:42:43
foo[9] += 1の行とfoo[0] += 1の行が8回も実行されてるからイテレータの外に出す
それか1..8を0..9にして、10点未満も90点以上もiの一般式に組み込むかのどっちか

175:デフォルトの名無しさん
08/12/05 12:44:23
うおー、初心者スレっぽいぞ
頭が痛くならない解決法のひとつは、case文を使うこと
case tokuten
when 90..100 then foo[9] += 1
when 80..89 then foo[8] += 1
when 70..79 then foo[7] += 1
# 中略
when 10..19 then foo[1] += 1
when 0..9 then foo[0] += 1
end

もうひとつは、得点とカウンターの関係を冷静に見て条件を抽出すること。
「得点の 1 の位に等しい配列要素を +1 する」
「ただし、100 点の場合は 9 要素目を +1 する」
「なお、9 を 10で割ると 9 /10 = 0 である」

if tokuten == 100 then
foo[9] += 1
else
n = tokuten / 10
foo[n] +=1
end

176:デフォルトの名無しさん
08/12/05 12:55:13
>>175
>うおー、初心者スレっぽいぞ
たしかにな

>「得点の 1 の位に等しい配列要素を +1 する」
10の位の間違いか?

>「ただし、100 点の場合は 9 要素目を +1 する」
これはひっかかりそうだなー

コードはもうちょっと簡潔になるな。

n = tokuten == 100 ? 9 : tokuten / 10
foo[n] += 1

または
if tokuten == 100
n = 9
else
n = tokuten / 10 # ex. 85 -> 8, 31 -> 3
end
foo[n] += 1


177:デフォルトの名無しさん
08/12/05 13:27:46
>「ただし、100 点の場合は 9 要素目を +1 する」

こういう条件にするとそう処理する理由がそれほど明らかでない。
条件は上界により与えられるとして考える方がよくないか。

いつぞやRubyスレで話題になった Range#bound があれば
idx = (0..9).bound(tokuten / 10)
foo[idx] += 1

178:デフォルトの名無しさん
08/12/05 13:38:10
まあ落ち着いてスレタイ100回読め

179:デフォルトの名無しさん
08/12/05 13:40:50
ンなこと言ったらデータとしては foo[10] を作るのが自然
100 点に関しては集計なり統計なりするときの処理に扱いを委ねるべきで、
データの時点で組み込んでしまうべきではない

180:デフォルトの名無しさん
08/12/05 13:55:20
>>173
>>174 も書いてるがその「正しくないコード」の意味するところは、
i を 1 から 8 に変更しつつ do ~ end の中のコードを実行するという事だ。
foo[9] 以外は動いているって言ってるけど foo[0] にも同じ問題がある。
「do ~ end 中の文は tokuten の値が何であろうと 8回実行されてる」
という事を頭に入れてもう一度コードをよくみて考えてみて。
多分上手く動いていると思っている部分も、あまりよくないと気付くだろう。

181:デフォルトの名無しさん
08/12/05 13:58:12
eachは「振り分け」じゃないからな
時々混乱したことはあった

182:173
08/12/05 14:17:41
>>174,180
その通りですね。脳内で考えたときは一度条件に当てはまったら勝手にeach文から抜けてました・・・

>>175
case文だと元のfor文と対して長さが変わらないですねw
もう一つの案、とても参考になりました。ありがとうございます。

>>176
条件演算子、思いもつかなかった方法です。
短くて使いやすそうです。ありがとうございます。

>>177
む・・難しい・・・
コピペしても動かなかったので何か読み込ませるものなんですね。

レスくれたみなさま、ありがとうございました。
得点を割ってそのままインデックスとして使う方法は私にとっては斬新で勉強になりました。
重ね重ね、ありがとうございました。


183:デフォルトの名無しさん
08/12/05 18:26:56
>>173
なあ、初心者にちょっと聞いてみたいんだけど、条件演算子って難しい?
n = tokuten == 100 ? 9 : tokuten / 10
とか理解できる?

世の中には条件演算子を禁止するようなプロジェクトがあって、頭おかしいと思ってるんだけど、
初心者にとっては条件演算子がほんとうに難しいのかどうか気になる。


184:デフォルトの名無しさん
08/12/05 18:30:16
条件演算子が禁止されるのは、難しいからと言うよりも
乱用されてソースコードが酷いことになるのを防ぐためじゃない?

185:rubyの初心者
08/12/05 18:34:24
n = 9 if tokuten == 100 else tokuten / 10 のほうがわかりやすい。

186:デフォルトの名無しさん
08/12/05 18:44:57
>>185
おまえ、rubyの初心者じゃなくてPython上級者だろ。

187:デフォルトの名無しさん
08/12/05 18:50:36
条件演算子の禁止は「難しいから」じゃない
難しいという理由からなら、こんなに一般的に禁止が広まるわけがない

188:デフォルトの名無しさん
08/12/05 18:55:02
rubyには?で終わる述語が覆いから

sym = n.zero? ? :hoge : :fuga
とかやられるとわけがわからない。
sym = if n.zero? then :hoge else :fuga end
ほらわかりやすい。


189:デフォルトの名無しさん
08/12/05 18:56:29
ネストすると読みづらいからじゃないかな

190:デフォルトの名無しさん
08/12/05 18:57:55
三項演算子(条件演算子、注釈逆か)は、下手に許可すると
変なとこで改行してカッコつけてネストする奴が出てくるのが嫌われてる理由の一つだと思う
そんなに複雑なら if 文で書くかリファクタリングしろ

191:デフォルトの名無しさん
08/12/05 19:02:21
記号が小さくて読み落とししやすいんだよな
もっと2~3文字のキーワードで区分けされていると読み落としがないんだが

192:デフォルトの名無しさん
08/12/05 19:05:21
Ruby は if 文が値を返すから、三項演算子の必要性は他の言語よりも薄いと思う

193:デフォルトの名無しさん
08/12/05 19:18:32
書く分には良いんだが、読みにくい印象が強いな <<三項演算子

194:デフォルトの名無しさん
08/12/05 19:28:41
>>188
>sym = n.zero? ? :hoge : :fuga
>とかやられるとわけがわからない。

そうか、初心者はこの程度でもわけがわからなくなるのか。

>sym = if n.zero? then :hoge else :fuga end
>ほらわかりやすい。

どこがだよ。


195:デフォルトの名無しさん
08/12/05 19:45:21
>>193
条件演算子で短くまとめた条件分岐はほぼ100パーセントの確率で
のちのち長い if 文に書き換える羽目になるというのがどうにも

嫌われる人はここで条件演算子使用を強行する

196:デフォルトの名無しさん
08/12/05 20:00:26
最初から then 書くのがけっこう普通になるよね

197:デフォルトの名無しさん
08/12/05 20:22:43
1行で書けて式の値を使うときだけ三項演算子
ifの返す値を使うプログラムは読みにくい

198:デフォルトの名無しさん
08/12/05 21:21:19
配列の添え字アクセスを send で行うことはできますか?

[1, 2, 3].send("[](1)") が 2 を返すような

199:デフォルトの名無しさん
08/12/05 21:23:20
[1,2,3].send('[]', 1)

200:173
08/12/05 21:26:57
>>183
条件演算子が難しいなんて書いてませんよ・・・私・・・
n = tokuten == 100 ? 9 : tokuten / 10
「tokuten」が100ならば「9」を「n」に代入、elseなら「tokuten/10」を「n」に代入ですよね


201:デフォルトの名無しさん
08/12/05 21:32:06
>>199
うおー引数2個ーめんどー
ありがとうございます

202:デフォルトの名無しさん
08/12/05 22:12:43
>>200
アー、悪い、
>条件演算子、思いもつかなかった方法です。
って書いてあるから、初心者には理解するのが難しいのかと思った。
わかってるならすまんかった。気を悪くせんでくれ。

203:デフォルトの名無しさん
08/12/06 01:23:58
RubyってJavascriptの代わりになりますか?

204:デフォルトの名無しさん
08/12/06 01:29:54
なりません。

205:デフォルトの名無しさん
08/12/06 01:40:02
すんません、
メソッド呼び出しているだけの行で
[BUG] Segmentation faultってバグ落ちしたメッセージが表示されるですけど、
これってどこでバグっているのか原因わかりますか?
後、ルビーのバグ回避のプログラミングの仕方ってあるでしょうか?
ルビーの落とし穴というページ見ても今一バグが発生する原因や回避の方法が分からないもので。

206:デフォルトの名無しさん
08/12/06 01:42:36
追記です。
ルビーのバージョンは1.8.6で無料サーバでつかうため、パッチやバージョンアップ以外の方法でバグ回避方法をおしえてください。

207:デフォルトの名無しさん
08/12/06 01:44:16
実際のスクリプトの部分を見せることができないのは村の掟とかそういうのなんですよね

208:デフォルトの名無しさん
08/12/06 01:44:39
>>205
ruby本体のbugだから、まずは最新版で試してみて。
それでも再発するなら、出来る限り余分な部分を削った再現コードを作って
ここか本スレかruby-listに晒せばおk。そのときruby -vの提示を忘れずに。
あとは偉い人がよろしくやってくれるはず。


209:デフォルトの名無しさん
08/12/06 01:47:13
>>206
・・・まあ再現コード見せて。
そのコードを作ること自体が「回避の方法」だったりするし。

210:デフォルトの名無しさん
08/12/06 01:58:16
コードは晒せないですが、
openでファイル作成やREXML::Documentとグローバル配列とメソッドだけでね。
今やったらなぜメソッド中の注釈「# DATAURL 」の行を指して
[BUG] Segmentation fault
ruby 1.8.6 (2008-08-11) [i386-mswin32]
って出ました。わけわからん。

211:デフォルトの名無しさん
08/12/06 02:00:28
無料サーバであいさんはちろくえむえすうぃんさんじゅうに?

212:デフォルトの名無しさん
08/12/06 02:05:23
>>211
RDEでデバッグしながらですがけど...
鯖だとデバッグできないですから..

213:デフォルトの名無しさん
08/12/06 02:18:57
>>210
再現コードがないと、なんともコメントできない。

214:デフォルトの名無しさん
08/12/06 02:19:25
うむ

215:デフォルトの名無しさん
08/12/06 02:19:34
村の掟ワロタ

216:デフォルトの名無しさん
08/12/06 02:52:30
コード晒せないのなら諦めろ、あるいは自力で解決しろ
Segmentation faultだけでは、アドバイスする側にもわけわからん

217:デフォルトの名無しさん
08/12/06 02:53:36
gdb coreして、whereだ。
何かが分かる気はしないけどね。

218:デフォルトの名無しさん
08/12/06 08:57:37
未知か既知かわからないRuby本体のバグを誰かがわからないけどどっかで踏んでる、ということだな
それ以上のことはなんもならん

219:デフォルトの名無しさん
08/12/06 10:53:07
セグフォはRubyのバグだから投稿すれば本来治してくれるんだけど
再現コード無いのは無理だなあ

220:デフォルトの名無しさん
08/12/06 14:02:12
リファレンスマニュアルの終了処理に、「exit(3) で終了」って書いてあるけど、なぜ 3 なんですか?ただの例?

221:デフォルトの名無しさん
08/12/06 14:11:45
>>220
0は成功、1かそれ以上は失敗
ということで、ただの例ですな

222:デフォルトの名無しさん
08/12/06 14:18:02
>>220
exit(3)の3はmanのセクション番号でライブラリコールだってこと。
詳しくはman man

他にもwrite(2)とかがある

223:デフォルトの名無しさん
08/12/06 14:19:29
>221
多分それ違う

>220
exit(3) のリンク先を見れば判ると思うけど、この exit はC言語の関数の exit() のこと。
要はRubyが内部でやってる処理を説明している。
Linuxのマニュアルのセクション3にあるexit()の通りの処理をしてるよ、という意味。

224:デフォルトの名無しさん
08/12/06 15:51:10
マニュアルにある exit(3) の (3) は引数を表してるわけじゃないんですね。
>>221-223
ありがとうございました。

225:デフォルトの名無しさん
08/12/06 16:25:24
>>204
なんでだよ
Rubyってなんでもできる万能言語って聞いたんだが

226:デフォルトの名無しさん
08/12/06 16:30:20
>>225
ではその人を責めてください
サンタクロースが実在しなかったからといってサンタ役のお父さんをバシバシ叩くのはやめてください

227:デフォルトの名無しさん
08/12/06 22:22:34
>>225-226
ワロタw

228:デフォルトの名無しさん
08/12/06 23:51:21
エクセルをRubyで動かしたいんだけど、OLEが分からないからエクセルのマクロスクリプトを
Rubyのプログラム上からエクセルに渡して動かす、みたいなことはできますか?

229:デフォルトの名無しさん
08/12/07 00:35:40
エクセルオブジェクトにそういう機能があれば、
呼び出す側の言語が何であろうと出来るんじゃない?


230:デフォルトの名無しさん
08/12/07 00:37:45
てかエクセルオブジェクトを使うにはOLEの知識がいるじゃないか。


231:デフォルトの名無しさん
08/12/07 06:28:28
メソッドの勉強してるんですが
puts とか getsがメソッドですよといわれたのは良いんですが
self.puts
とか、
100.to__s
とかはわかるのですが
gets.chompはなぜgetsの後ろにchompが付くんですか?
メソッドの前に付くのが普通だと思ってたので・・・

232:デフォルトの名無しさん
08/12/07 07:14:23
>231
self.gets.chomp
getsの結果に対してchompするということ
つーかgetsはレシーバ書かないほうが普通だと思うが…

233:デフォルトの名無しさん
08/12/07 07:36:31
>>232
ありがとうございます
selfは書かないんですけど
rubyの練習に読んでる
URLリンク(www1.tf.chiba-u.jp)
でselfが出てきたので聞いてみました。


234:デフォルトの名無しさん
08/12/07 07:50:48
そこ「説明の切り捨て方」がイマイチだな


メソッドチェーンという概念がある(あくまで概念で、文法のようなものではない)
あるメソッドの返り値のオブジェクトのクラスのメソッドを

  返り値を返すメソッド.返り値のクラスのメソッド

で動作させるものだ

関数的メソッドgetsの返り値は文字列であるStringクラスのオブジェクト(=インスタンス)だから、
Stringクラスのメソッドであるchompをメソッドチェーンで記述できる
あくまでメソッドの返り値(またはオブジェクトそのもの)のクラスが重要
返り値のクラスは常に意識しておくといい

235:デフォルトの名無しさん
08/12/07 08:31:30
>>231
>gets.chompはなぜgetsの後ろにchompが付くんですか?

s = gets
s.chomp
を一行でかいたら
gets.chomp
になった、というだけのこと。

236:デフォルトの名無しさん
08/12/07 08:38:01
>>234
難しい・・・(>_<)
>>235
なるほど

237:デフォルトの名無しさん
08/12/07 08:53:23
Rubyはかなり豪快なメソッドチェーンが出来るのが魅力だよな
何だかんだでチェーンが切れるOOPLは多い気がする

238:デフォルトの名無しさん
08/12/07 09:01:12
end の後ろにメソッドが平気で繋がるのはやりすぎだとも思える

が、ブロックとして {} を使うことにすると、クラスとメソッド用途によっては異常に便利
self や目的のオブジェクトが意図的に返るように作られてるブロックつきメソッドが多いのが効いてるな

def …
 ナントカ
 カントカ
 yield s if s
 s
end

という定義が多い

239:205
08/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:デフォルトの名無しさん
08/12/07 17:28:44
>>239
>>213-219
だれも「詳細なエラー文を」とは言ってないんだ。

241:205
08/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:デフォルトの名無しさん
08/12/07 18:38:00
>241
それも完全な間違いでは無いが、限りなく間違いに近い。
本来Ruby側はどんな間違ったコードでも
「Rubyの」エラーを出して、コードとしては異常な終了でありながら
Rubyとしては正常に終了しなければならない。
ところが今回RubyはSegmentationFault…つまりRuby自体が異常な終了をしている。
だからRuby制作側としてはRubyを修正すべきなんだが
そのためにはSegmentationFaultが起こる状態を再現しないと
根本的な修正が難しい。
だから、その同じ状態を再現するコードがあったほうが良いのだよ。
…で、ライブラリ由来だとしてもライブラリをどう使うと起こるのか判らない。
SegmentationFaultである限り、貴方に責任はほぼ無いが
修正するには再現コードがないとキツいだろうなあという話。

243:デフォルトの名無しさん
08/12/07 18:42:43
ああ、C製の外部ライブラリなんかもセグフォで落ちるか?
どちらにしろセグフォ起こす時点で
貴方自身では勘ぐらいしか対抗手段は無いよ。
で、実際のコードも再現コードも出せないなら
作者も多分修正不能で「原因不明のバグ」としか言えない。

244:デフォルトの名無しさん
08/12/07 18:44:40
「[BUG]」を吐いて落ちてるような場合は、インタプリタが具体的に
「ここの行が悪いんでエラーにしますよ」と言ってるわけじゃないから、
その「C:/Ruby/lib/ruby/1.8/rexml/text.rb:312:」はたいした情報にならない。

問題を起こすプログラムから、そこを削っても問題が同じように起こる場所は
全部削っていって、問題を起こす最小のセットを作るしか、Rubyを作ってる
側としても対処のしようがない(普通は)。

(たまに、実は把握済みの問題で「このパッチだよ」というのが出てくることも
あるがそれは宝くじのようなものなので)

245:デフォルトの名無しさん
08/12/07 18:45:26
>>241
情報が少なすぎて判断出来ないし、ここでやる内容とも思えない
問題のソースとエラーメッセージの全てを出して作者に聞け

246:デフォルトの名無しさん
08/12/07 18:45:35
最新版が使えるなら最新版にしたら直ってるかも知れない。
最新版が使えないなら原因がネット上に落ちてるかも知れない。
…で、ネット上探すのは再現コードを見れないと厳しい。

247:デフォルトの名無しさん
08/12/07 20:10:06
>>239
とりあえずコードが公開可能なものならどこかのアップローダーに公開すれば
いいわけで…。公開不可能ならMatzにそのソースを送りつければいいや。

ちなみに現在の最新安定版は1.8.7-p72だからそれを導入してみて
もう一度やってみれば?もしそれでもSegmentation Faultが出るなら
もう一度ここに来て。

Rubyの公式サイト
URLリンク(www.ruby-lang.org)

248:デフォルトの名無しさん
08/12/07 20:53:45
>>242
おまえはキモイな。rubyなんかやるよりも死んだ方がいいんじゃないか?どうせ友達なんかいないんだろw

249:デフォルトの名無しさん
08/12/07 20:58:18
ルビー使い自称ルビリスト(笑)なんて所詮は囚人程度の脳味噌しかないからあまり関わんないほうがいい

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」だといわれてエラーで止まってしまいました。

406:デフォルトの名無しさん
08/12/12 02:37:05
訂正
scanの結果を1つの変数にまとめてgsubにかけようとしたら、

407:デフォルトの名無しさん
08/12/12 03:16:27
to_s

408:デフォルトの名無しさん
08/12/12 07:11:21
>>405
joinでいいような。
['aaa', 'bbb', 'ccc'].join #=> "aaabbbccc"

409:デフォルトの名無しさん
08/12/12 07:12:17
to_sは1.9系からinspectっぽくなるからおすすめしない。

410:デフォルトの名無しさん
08/12/12 07:37:25
ブロックの存在忘れ去られている scan (´・ω・) カワイソス

aa = bb.scan(/.+/){|match| match.gsub(/m/,"")}

411:デフォルトの名無しさん
08/12/12 12:39:25
tDiaryとHikiを使ってるんですけど、これはRuby1.9に対応していますか。

412:デフォルトの名無しさん
08/12/12 12:59:52
Ruby1.9はまだ使わないでください。

413:デフォルトの名無しさん
08/12/12 13:04:54
エラーが出ても自力で対処できないしな…
Ruby側が修正されるかライブラリ側が修正されるかするまで全く動作しないとかいうのは
ただ利用したいだけの一般ユーザーの身ではやってられん

が、開発とか覗いてみたいなーと考えてる人なら、1.9上で動かしてみてエラーのレポートとかしてみるといいかも
1ヶ月くらいじーっとROMってれば雰囲気はわかるしさ

414:デフォルトの名無しさん
08/12/12 13:05:51
>>412
いやいや、rc2なんだから使ってもらうべきだろ。


415:デフォルトの名無しさん
08/12/12 13:06:24
>>405
一つの変数には一つのオブジェクトしか入れられない。
だから複数のオブジェクトを入れられるArrayオブジェクトを器にするか
結合して一つのStringオブジェクトにするしかない(>>408)。

gsubしたあとにまたバラバラの文字列である必要があるなら
結合すると分割がめんどうだから
aa = bb.scan(/.+/)
cc = aa.map{|s| s.gsub(/m/,"")}
で配列の各要素に対してgsubをする。
やってることは結果的に>>410と同じだけど、Array#map(Enumerable.map)は
覚えておいて損はない。

416:デフォルトの名無しさん
08/12/12 13:19:55
>>414
お前のような奴がいるからFirefoxは

417:デフォルトの名無しさん
08/12/12 13:22:09
Rubyはバグ報告サポートがまだヘナチョコだからなー
SEGVが出た時点でエラー情報送信ウィンドウが出るくらいじゃないと開発者以外に勧めたらあかんと思う

418:デフォルトの名無しさん
08/12/12 13:35:43
一般ユーザーは偶数安定バージョンの2.0待ちが無難だよ。

419:デフォルトの名無しさん
08/12/12 13:59:05
>>417
dumb端末で使ってるやつもいるんだぞ!

420:デフォルトの名無しさん
08/12/12 14:03:05
>>419
本当? ふつう端末エミュレータかコンソールじゃないの?
今どきシリアル端末なんて管理者だって使わないだろ。

つうか vt100 だって、ダム端じゃねーぞ。

421:デフォルトの名無しさん
08/12/12 14:10:07
cursesが動かない環境はとりあえず切り捨てていい
そんなの使ってる人は自力で何とかすると思われ

422:デフォルトの名無しさん
08/12/12 15:56:53
「44133」を「12時間15分33秒」(の表示に必要な数値)に直してくれるライブラリとかないですかね

423:デフォルトの名無しさん
08/12/12 16:09:20
>>422
標準でありそうだが、ないな
というか時間オブジェクトってないよね
Time::Period クラスとかになるのかな

424:デフォルトの名無しさん
08/12/12 16:16:30
>>422
難しく考えなくても、Time.at(44133)のTimeオブジェクトからhms拾えばおk。

425:デフォルトの名無しさん
08/12/12 16:21:13
あ、タイムゾーン影響を受けるからTime#utcを忘れずに。

426:デフォルトの名無しさん
08/12/12 16:23:19
こんな感じかな?
Time.at(44133).getgm.strftime("%H:%M:%S")

427:デフォルトの名無しさん
08/12/12 16:40:14
24時間を超えたらどうすんの。

428:デフォルトの名無しさん
08/12/12 16:51:05
>>427
どうしようもないな
日の部分が1を超すかどうかをチェックするしかあんめえ

429:デフォルトの名無しさん
08/12/12 16:54:14
そうなると秒数を割り算したほうがわかりやすそうだ

430:デフォルトの名無しさん
08/12/12 16:57:59
>>407
>>408
>>410
joinで解決しました。ありがとうございます。
aa = bb.scan(/.+/){|match| match.gsub(/m/,"")} もいいですが、今一ブロック処理って理解しきれない部分があって。



431:デフォルトの名無しさん
08/12/12 17:02:03
>>415
勉強してみます。ありがとうございます。

432:デフォルトの名無しさん
08/12/12 19:18:43
あるオブジェクトのインスタンス変数に File オブジェクトがセットされてるとして、
そのオブジェクトが GC されるタイミングでその File オブジェクトは close される?

433:デフォルトの名無しさん
08/12/12 19:22:38
あ、それで、もし close されてくれないとして、その場合に、
GC のタイミングで close する
finalizer のようなことをする方法があれば教えてください。

434:デフォルトの名無しさん
08/12/12 19:30:47
>>432
URLリンク(www.ruby-lang.org)
> 参照されなくなったFileオブジェクトは、GCで自動的にクローズされます

>>433
URLリンク(blade.nagaokaut.ac.jp)

require 'finalize'
Finalizer.add(obj)
でobjがGCされるときにobj.finalizeがコールされる

はずだけど使ったこと無いw

435:デフォルトの名無しさん
08/12/12 19:37:48
忘れてた。これも参照のこと。
URLリンク(www.ruby-lang.org)

それと「objがGCされたとき」にobj.finalizeを呼ぶことはできないのか。
Finalizer.add(file, obj)


436:デフォルトの名無しさん
08/12/12 19:48:00
>>434 >>435
ありがとうございます。
明示的に close しないのはあまり行儀が良くないとは思いますが、
それほど扱うファイルが多くない場合には GC に期待しても良さそうですかね。
Finalizer はリファレンスマニュアルに説明が無いですが、
これは使うなという無言の圧力でしょうか・・・

437:デフォルトの名無しさん
08/12/12 19:50:26
いや、明示的に閉じろよ
なんでこの機能に依存するんだよ

438:デフォルトの名無しさん
08/12/12 20:00:19
「ガベコレされる時のフック」はいろいろとヤバい代物だから、
使うのは本当に必要なとき(ってどんなときだろ)のみにすべき。

ファイルのクローズのような処理はガベコレに頼るべきではない。

439:デフォルトの名無しさん
08/12/12 20:19:45
ガベージコレクションはプログラム作成者が意識したらダメよ
いい意味でも悪い意味でもな
オブジェクトの自動回収だけをさせるべき

440:デフォルトの名無しさん
08/12/12 20:28:12
>>437 >>438
自分が一から設計するならそうしたいんですけどね。

hash_table.delete obj

みたいなコードがあって、今まで obj はメモリ内で完結するオブジェクトでしたが、
あるとき機能追加で File を持つ obj も扱うようになりました。
これを真面目に close するとすると delete する直前の箇所で、

obj.close if obj.respond_to? :close
hash_table.delete obj

としたり、 hash_table の初期化をする箇所で

class << hash_table = Hash.new
alias :__delete :delete
def delete obj
obj.close if obj.respond_to? :close
self.__delete obj
end
end
...
hash_table.delete obj

と hash_table を拡張するのは思い付いたんですが、
hash_table 側のコードを変更するよりは、
機能追加する側の obj の方でどうにか (あわよくば GC で勝手に) close できれば
そっちの方が変更としてはスマートかな、と思いました。

何か良い方法ありますかね?

441:デフォルトの名無しさん
08/12/12 20:31:31
いや、だから、openが終わったときにcloseするか、ユーザーのcloseを受け付けるように作れよ

442:デフォルトの名無しさん
08/12/12 20:42:56
Fileオブジェクトを使う人が、そのファイルオブジェクトの責任を持つ

ということで、この場合は勝手に消していいと思う
obj.open だけして放置する人がいたのなら、それはその人が悪いんじゃないかな

443:デフォルトの名無しさん
08/12/12 20:48:32
ど田舎富山DQN男の家族消えろ ど田舎富山DQN男の親消えろ ど田舎富山DQN男の子供消えろ ど田舎富山DQN男の親戚消えろ
ど田舎富山DQN男の家族消えろ ど田舎富山DQN男の親消えろ ど田舎富山DQN男の子供消えろ ど田舎富山DQN男の親戚消えろ
ど田舎富山DQN男の家族消えろ ど田舎富山DQN男の親消えろ ど田舎富山DQN男の子供消えろ ど田舎富山DQN男の親戚消えろ
ど田舎富山DQN男の家族消えろ ど田舎富山DQN男の親消えろ ど田舎富山DQN男の子供消えろ ど田舎富山DQN男の親戚消えろ
ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・) ニヤニヤ(・∀・)
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね 苦しんで死ね
死ぬとき このレスの事思い出してから地獄へ行けよ
ニヤ(・∀・)ニヤ(・∀・)


444:デフォルトの名無しさん
08/12/12 20:59:19
Rubyで特定のファイル群を、
OSで関連付けされたアプリケーションで開きたいのですが、
どうすればよいでしょうか。
一種のとして使いたいのです。

445:デフォルトの名無しさん
08/12/12 21:06:56
>>444
Windowsなら、start が使えるはず
system('start hoge.txt')

cmd.exe の内部コマンドなので注意

446:デフォルトの名無しさん
08/12/12 21:14:40
>>440
> 何か良い方法ありますかね?
腐った設計を見直すのが一番いい方法だな

>>444
start とか open とか、そのOSで用意されてるコマンドを使う

447:デフォルトの名無しさん
08/12/12 21:15:44
>>445
できました!
なんという素早く的確なレス!
本当にありがとうございます。ありがとうございます!

448:デフォルトの名無しさん
08/12/12 23:47:41
rubyでcgiの掲示板みたいな物を
作ろうとしているのですが、

テンプレートとなるHTMLを別に用意して
その中の項目などを置き換えて
最終的に表示を行いたいと考えています。

Amrita2 というライブラリが良さげなんですが
サンプルなどが少ないんですよね。
(メインのページ?が404で見れない)

他に、同様な機能を持ったライブラリで
お勧めなどはありますでしょうか。



449:デフォルトの名無しさん
08/12/12 23:56:17
めんどいからrdでやっとけ

450:デフォルトの名無しさん
08/12/13 00:08:10
>>448
Tenjin ってのが速いらしいけど、使ったことないから別にお勧めってわけでもない。
URLリンク(www.kuwata-lab.com)

451:デフォルトの名無しさん
08/12/13 07:29:20
>>448
俺のオススメはTenjinだけど
この辺のライブラリはかなり数があるので、いくつか試して目的に合った奴を使うと良いんじゃないかな
Rubyist Magazine最新号あたりの記事も参考に

ちなみに普通のCGIアプリで使うなら、Amrita2はRubyGemsとHpricotを使っているためオススメできない
(というか普通のレンタルサーバ環境ではまず動かない)
amrita-alteredの方が良いと思う。ただし動作がかなり重いことには注意

452:デフォルトの名無しさん
08/12/13 07:53:50
RDとかではめんどいからテンプレートエンジンが隆盛なんだと思う
決定版がないんだよねという話は5年くらい前からしてる気がするが

453:デフォルトの名無しさん
08/12/13 08:07:15
そもそもテンプレートエンジンに「ただ一つの決定版」って要るのか?
今の状況はけっこう理想的だと思うけど

454:デフォルトの名無しさん
08/12/13 10:35:39
元のファイルを読み込んで新規にファイルを作成し、
その内容を置換する作業を一括してやりたいと思っています。
色々と実験しているのですが通常の置換はできても正規表現による置換ができません。
試している元のファイル「 in.txt 」の内容は、

 |青空文庫《あおぞらぶんこ》
 へのへの

です。この内容を出力して置換するために書いた「 test.rb 」の内容が次です。

open("in.txt","r"){ |元ファイル|
 open("out.txt","w"){ |出力と置換後のファイル|
  while line = 元ファイル.gets
    line.gsub!("(|)(.+?)(《)(.+?)(》)","\4\3\2\1") #正規表現による置換。変化なし。
    line.gsub!("へのへの","もへじ")             #通常の置換。OK。
    出力と置換後のファイル.puts line
  end
 }
}

これによって出力された「 out.txt 」の内容が次のものです。

 |青空文庫《あおぞらぶんこ》
 もへじ

通常の置換は成功していますが、正規表現による置換に変化がありません。
どうすれば良いのでしょうか。

455:デフォルトの名無しさん
08/12/13 10:41:01
あんちゃん、praggerに関するスレってないん?

456:デフォルトの名無しさん
08/12/13 10:42:49
>>454
line.gsub(/(|)(.+?)(《)(.+?)(》)/,"\4\3\2\1") じゃまいか

457:デフォルトの名無しさん
08/12/13 10:47:15
'\4\3\2\1' こうだろ

458:デフォルトの名無しさん
08/12/13 11:03:27
>>448
ふつうにERBでええやん
URLリンク(jp.rubyist.net)
Tenjinは日本語の解説がないからこのレベルの初心者にはムリだと思う

459:デフォルトの名無しさん
08/12/13 11:08:08
>>458
erb より eruby の方が手軽じゃない?

1行目に #!/usr/bin/env eruby って書いておいて、
拡張子を cgi にしておけば普通のCGIと変わらず動くし。

460:デフォルトの名無しさん
08/12/13 11:09:49
>>456
>>457
ありがとうございます。

 line.gsub!(/(|)(.+?)(《)(.+?)(》)/,'\4\3\2\1')

で出来ました!
正規表現はスラッシュで、
後方参照はシングルクォートで囲む必要があるんですね。
すごく勉強になりました。

このスレの皆さんのおかげで本当に助かります。
あらためて感謝します。

461:デフォルトの名無しさん
08/12/13 11:47:48
�ラ 出来ました!
懿「ォ めくらっぽう滅茶苦茶やってたらたまたま動作しました

462:デフォルトの名無しさん
08/12/13 13:05:38
gsubでブロック紹介しない時点でなあ…

463:デフォルトの名無しさん
08/12/13 13:37:05
strscanらぶ

464:デフォルトの名無しさん
08/12/13 13:42:35
>>458
今ならERbよりErubisの方が良くないか?

>>459
まず、erubyのインストールが厄介なのでは

465:デフォルトの名無しさん
08/12/13 14:00:56
各行の先頭に連番を振ることはできませんか。
「行数=挿入する数字」で良いんですが。

466:デフォルトの名無しさん
08/12/13 14:01:26
あのへんはサーバ上で動かすための設定やインストールが面倒でなあ…
ローカルでスクリプトとして使うならそれほどでもないんだが

467:デフォルトの名無しさん
08/12/13 14:03:07
>>465
各行に対して、正規表現の文頭を数字で置換しれ
改行区切りで配列にしてしまうのが簡単だと思う
joinでくっつけるときの改行コードは元の改行にしておくこと

468:デフォルトの名無しさん
08/12/13 14:09:35
str = "a
bb
ccc
dddd"
lines = Array.new
str.to_a.each_with_index do |e, n|
lines.push(e.sub(/^/){"#{n+1}: "})
end
print lines.join


結果

1: a
2: bb
3: ccc
4: dddd

このまま使うと2桁3桁のとき数字表示が汚くなるが、そのへんは自分で考えれ

469:デフォルトの名無しさん
08/12/13 17:17:48
>>467>>468
親切にありがとうございます。

>各行に対して、正規表現の文頭を数字で置換しれ

これはよく分かるのですが、

>改行区切りで配列にしてしまうのが簡単だと思う

というのがよくわからないのです。

str="●●●"の●●●の部分に連番を振りたいファイルの内容を
全部コピーして貼り付けて実行すれば良い、ということなのでしょうか?
確かにそれなら実現できました。

ただ、手間がかかるので
連番を振りたいファイルを指定して、
中身を直接書き換えられれば有難いのです。
そのような方法はありませんでしょうか。

ひょっとして初心者丸出しの質問なのかもしれませんが、
御教示頂ければ幸いです。

470:デフォルトの名無しさん
08/12/13 17:46:04
プログラミングとクラスの考え方がまだ身についてないっぽい
必要なのはString オブジェクトだ
つまり文字列

ファイルパスを指定するとファイル内容を文字列で返すメソッドを持つクラスがあるからそれ使え
ファイル内容を文字列で取得できたら文字列内を置換しれ
んで書き込みたい文字列を作れたら、同じ名前でファイルに書き込め

471:デフォルトの名無しさん
08/12/13 18:02:44
・ スクリプト内の変数の文字列を置換する
・ スクリプト内で指定したファイル内容を読み込んで表示してみる
・ 読み込んだファイル内容を置換して表示してみる
・ 置換した内容を別ファイル名で保存してみる
・ あらかじめ元ファイルをバックアップしておき、置換した内容を元と同じ名前で保存してみる
・ あるフォルダ(ディレクトリ)のファイル一覧を取得して表示してみる
・ 自分の欲しいファイル名だけを抽出する方法を考えてみる
・ 一覧のひとつひとつに対してファイル名だけを表示させてみる
・ ファイル名の表示の部分を「ファイル内容を読み込んで表示」に切り替えてみる
・ 「ファイル内容を読み込んで表示」の部分を「読み込んで置換して同名で保存」に置き換える

こんな感じ?

472:デフォルトの名無しさん
08/12/13 18:03:47
> ・ スクリプト内で指定したファイル内容を読み込んで表示してみる
スクリプト内で指定したファイル名の内容を読み込んで表示してみる、だった

473:デフォルトの名無しさん
08/12/13 18:10:45
問題を「これならできそう」って思える程度に分割する能力って大切だよね
オライリーはPragmatic Thinkingなんちゃらって本の日本語版出せばいいのに

474:デフォルトの名無しさん
08/12/13 18:28:21
>>471みたいなのは、現状、意識的に経験積むしかないんだよね
うまい本とかあればいいんだけど、あんまり聞かないな

475:デフォルトの名無しさん
08/12/13 18:33:15
>>471
そんな感じです。お手数をかけてすみません。
それを参考にして一つ一つ覚えて行きたいと思います。

何度か他の言語を覚えようとして挫折したのですが、
Rubyは簡単に結果を出力できて感動したので、
この言語を勉強することにしました。
(プログラムは素人ですが、
 Rubyのコードがシンプルで美しいと思ったのも動機の一つです)

一応「たのしいRuby」と「Rubyレシピブック」は購入しましたので、
今は「15.2 基本的な入出力操作」を試しています。
プログラムとかはやったことはないのですが、頑張って覚えるつもりです。

476:デフォルトの名無しさん
08/12/13 18:37:33
すると

File.open(path, 'r'){|f| puts f.read}

ができた頃かね
f.read が文字列を返してることがわかったら、ファイルひとつを置換するのはもうすぐだな

477:デフォルトの名無しさん
08/12/13 22:18:03
ワンライナーだと
ruby -pe "printf '%4d ',$." ファイル名
でファイルに4桁の行番号をつけて標準出力に表示

ファイルを書き換えたければ -i.bak などと-i オプションにバックアップの拡張子をつけて実行
ruby -i.bak -pe "printf '%4d ',$." ファイル名

標準入力から読み込んだ場合の行番号は$.に入ってる、行番号の形式を変えたければprintfを勉強する
複数のファイルを指定しても大丈夫

Windowsだと -i の拡張子無しでの直接書き換えが出来ないのがちょっとやだな
UNIXだと ファイル開いておいて、開いたファイルを削除して、書き込み用で同名のファイルを作成するのかな?
PerlでもWindowsだと出来ないので、同じような動作してるんでしょうね
というか、Perlの動作を再現してるんでしょうけど


478:デフォルトの名無しさん
08/12/13 22:25:44
path = 'test.txt' #適当に作っといてね
outfile = 'testwrite.txt' #問答無用で上書きされるぞ
と、すると
pathファイルを開いて、全体を一気に読み込んだものを表示する
open(path, 'r'){|f| puts f.read}
pathファイルを開いて、一行読み込んで表示するのを最後まで繰り返す
open(path, 'r'){|f| f.each{|line| puts line}}
pathファイルを開いて、一行読み込んで、行番号表示して、行の内容を表示するのを最後まで繰り返す
open(path, 'r'){|f| f.each_with_index{|line,ind| printf '%3d ',ind+1;puts line}}
pathファイルを開いて、書き込み用のoutfileファイルも開いて、一行読み込んで、ファイルに行番号書き込んでから行の内容も書き込むのを最後まで繰り返す
open(path, 'r'){|f| open(outfile,'w'){|out| f.each_with_index{|line,ind| out.printf '%3d ',ind+1;out.puts line}}}


479:デフォルトの名無しさん
08/12/13 22:30:00
cat -n

480:デフォルトの名無しさん
08/12/13 22:32:30
>>479
そんなこと言ったら行番号付加ツールインストールすれば一発だぞ

481:デフォルトの名無しさん
08/12/13 23:42:38
$.


482:デフォルトの名無しさん
08/12/14 01:44:40
>>476
お恥ずかしながら io.readlines のことかと思って悪戦苦闘していました。
例文通りに打ち込んでも上手く行かないので、何かプログラムの根本的な
ところが判ってないのだと思って再び悩んでいました。

>>477
>>478
ありがとうございます。おかげさまで希望通りの動作が実現しました。
教えて君のような私にここまでして頂いて何と感謝すれば良いのか判りません。
私に何ができるわけでもありませんが、似たようなことがあったら、
私もこのスレの皆さんのような態度で困った人に接したいと思います。
このスレの皆様に心から感謝します。本当にありがとうございました。

483:デフォルトの名無しさん
08/12/14 03:03:55
馬鹿なの?
死ぬの?

484:デフォルトの名無しさん
08/12/14 05:12:40
>>482
たかが2chでそこまでバカ丁寧になる必要はない
教えてやりたい人間が教えたいように教えただけ

>>483
バカ丁寧だから、バカなんじゃない?

485:デフォルトの名無しさん
08/12/14 05:13:18
ああ忘れてた、>>477-478, 乙であります

486:デフォルトの名無しさん
08/12/14 05:40:39
>>484
たかが2chで「必要がない」ことをそんな大きく見てもしょうがない。
他の多くのレスの不必要な表現と同じように、>>482も書きたいように書いただけ。

487:デフォルトの名無しさん
08/12/14 12:37:57
>>455
ないみたいね
そもそもPlaggerのスレさえも立ってない
(理由は不明だけど、俺は人気がないんだと思っている)

話したいなら、ここや本スレでも良いと思うよ

488:デフォルトの名無しさん
08/12/14 12:47:00
ruby-ldapのインストール方法について質問です。
OSはcentos5.2を使用して
ruby本体は、 ruby-1.8.6-p287をcheckinstallにてRPM化しインストールしています。
ruby-ldap-0.9.7-1.i386.rpmを入手して、インストールを試みたところ下記のような
エラーメッセージが出力されて、二日ほど止まりっぱなしです。
どなたかアドバイスをお願いします。

# rpm -ivh ./ruby-ldap-0.9.7-1.i386.rpm
警告: ./ruby-ldap-0.9.7-1.i386.rpm: ヘッダ V3 DSA signature: NOKEY, key ID bfbaf0e8
エラー: 依存性の欠如:
libcrypto.so.5 は ruby-ldap-0.9.7-1.i386 に必要とされています
libruby.so.1.8 は ruby-ldap-0.9.7-1.i386 に必要とされています
libssl.so.5 は ruby-ldap-0.9.7-1.i386 に必要とされています
#


489:デフォルトの名無しさん
08/12/14 13:03:15
>>488
ruby-dev のようなもの、libopenssl-ruby のようなもの、openssl のようなもの、のインストールが足りない
Ruby関係ないな

490:デフォルトの名無しさん
08/12/14 13:13:04
rpm コマンドの使い方の話だね
必要なファイルを含むパッケージを表示する方法があるはずだから、それでインストールするパッケージを調べるといい

491:デフォルトの名無しさん
08/12/14 13:49:11
>>489-490
ruby-devとlibopenssl-rubyについては入っていません。。
ruby-dev`については、自ら作成したrubyのRPMファイルを入れるときに
アンインストールしちゃいました。
含んでいそうなファイルを探してみます。
ありがとうございました。

492:デフォルトの名無しさん
08/12/14 13:53:01
devは作るときのだから、バイナリを入れるだけならなくても大丈夫だと思う。


493:デフォルトの名無しさん
08/12/14 14:51:23
結局、
# rpm -qa | grep ruby
ruby-irb-1.8.6.287-1.el5.kb.1
ruby-libs-1.8.6.287-1.el5.kb.1
ruby-1.8.6.287-1.el5.kb.1
ruby-devel-1.8.6.287-1.el5.kb.1
こんな感じに拾ってきたrpmを入れてから、
#rpmbuild -ta ruby-ldap-0.9.7.tar.gz
を実行して、自分でrpmファイルを作ったら、インストールできました。

この状態だとgemが入れられなかったので、rubyのrpmファイルを自前で作成して
インストール後、上記の状態にしたのでgemがどっかで不具合を起こさないか不安ですけど。
ちなみに、gemがインストールできないのはrdocがロードできないとか怒られた。
rdocのrpmファイルってどこかに落ちてるんでしょうか?


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