Ruby 初心者スレッド ..
[2ch|▼Menu]
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
馬鹿なの?
死ぬの?


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

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