トップページ⇒tech
1001コメント292KB

Ruby について Part 3

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
オブジェクト指向スクリプト言語Rubyについて扱うスレッドです。

Ruby Home Page
http://www.ruby-lang.org/ja/

<前スレ>
Rubyについて Part 2
http://pc3.2ch.net/test/read.cgi/tech/1028906179/

<過去スレ>
Rubyについて
http://pc3.2ch.net/test/read.cgi/tech/1012096319/
0334デフォルトの名無しさんNGNG
>>333
よくわからんが、ruby の -i オプションを使えば解決されるような話?
0335デフォルトの名無しさんNGNG
なんか正規表現の変更の話が出ているみたいだけど、

[-0-9]

のような表現って多用しませんか?
いまさら

[\-0-9]

と書けって言われても、って感じ。
0336デフォルトの名無しさんNGNG
>>333
デカいファイルを突っ込むとメモリ馬鹿食いするけどこんなの。

TEXTFILE = 'inuneko.txt'

if (s = IO.readlines(TEXTFILE).map!{|line| gsub(/ねこ/, 'いぬ')})
 open(TEXTFILE, 'w').print(s)
end
0337336NGNG
あ。だめだ。これだとどんな場合でも書いてしまう。

if (s = IO.readlines(TEXTFILE).map!{|line| gsub(/ねこ/, 'いぬ')}) # ×
if (s = IO.read(TEXTFILE).gsub!(/ねこ/m, 'いぬ')) # ○

0338デフォルトの名無しさんNGNG
>>336
これならデカいファイルでも安心。
どんな場合でも書いちゃうし非 unix 環境でちゃんと動くかは知らないけど。

File.open(file) { |src|
 File.unlink(file)
 File.open(file, 'w') { |dest|
  src.each_line { |line|
   dest << line.gsub(/ねこ/, 'いぬ') }}}
0339デフォルトの名無しさんNGNG
ruby -i -pe 'gsub(/ねこ/, "いぬ")' *.txt
じゃだめ?
0340デフォルトの名無しさんNGNG
>>335
正直いやん
0341デフォルトの名無しさんNGNG
rubyさわっててつまってます。

text = <<-AHYA
fooTEXTboo
AHYA

hoge = '\1000yen'
p text.sub(/TEXT/, hoge)

このスクリプトで出力が
foo\1000yenboo\n
となるのを期待してるのですが\1が消えてしまいます。
消えないようにするにはどうしたらいいのでしょうか?
0342デフォルトの名無しさんNGNG
\を¥にする
0343デフォルトの名無しさんNGNG
>>335
perlとかでも多用されているもんな。
0344341NGNG
>>342
そんな一休さんみたいな答えじゃなくて他の案をお願いします・゚・(ノД`)
0345デフォルトの名無しさんNGNG
hoge = "('1000yen'.to_i / 10 - 10 + 10 / 10).chr.succ" + "1000yen"
0346デフォルトの名無しさんNGNG
>>341

text.sub(/TEXT/) {hoge}
0347341NGNG
>>346
ありがとうm(__)m

>>345
わからないです…_| ̄|○
0348デフォルトの名無しさんNGNG
>>341
hoge = '\\\\1000yen'
0349デフォルトの名無しさんNGNG
>>347
誰かがまとめてたの見たことあるよ
本家マニュアルサイトの「落し穴」あたりをあたってみては
0350デフォルトの名無しさんNGNG
>>348
それは直感的にわかりにくい。

>>346 のほうが新婦瑠でわかりやすいから、暗号的なプログラムを書きたい
のでないかぎり、ブロックを使ったほうが良いと思う。
0351デフォルトの名無しさんNGNG
>>335
POSIX regex で許されてる表現はそのまま通って欲しいな。
0352not333な初心者NGNG
>>338
の解説キボウ。お願いします。
なぜ、これなら、でかいファイルでもメモリを浪費しないんでしょうか?
2行目のunlinkが関係してるようなんですが。。
openしたブロックの中でunlinkって??
0353338NGNG
>>352
1. each_line なので全行をいっぺんにメモリに格納しません。

2. ファイルを open した状態で unlink してもファイルの中身は消えません。
(open したプロセスが一個も無くなってから消えます)
unlink 後に同名のファイルを open しても旧ファイルの中身に触れることはできません。
0354not333な初心者NGNG
>>353
じゃあ、メモリを浪費しないのは、each_lineを使ってるからで、
処理前と処理後を、同名のファイル名にしたい今回のような場合は、
一行ごと、each_lineするためには、unlinkして、
旧ファイルの内容と、新ファイルの内容を別々に扱ってるってことですね。

ありがとうございました。
0355デフォルトの名無しさんNGNG
>>354
だから結局一時ファイルを使っているのと変わらないのよ。
0356333NGNG
どうも、ファイル書き換えについて質問させていただいた 333 です。

338 さん、プログラムリストと解説ありがとうございました。
0357デフォルトの名無しさんNGNG
>>338
少なくともDOSISH(mswin32, mingw32, bccwin32, djgpp, たぶんhuman68kも)
ではopenしているファイルを削除することはできない。
それ以外は分からん。
0358デフォルトの名無しさんNGNG
RUBYってSmalltalkのぱくりだったんですね
0359デフォルトの名無しさんNGNG
んなこと言ったら、Rubyにオリジナルなとこなんて無い
0360デフォルトの名無しさんNGNG
色んな言語の良いとこ取りですよ?
0361デフォルトの名無しさんNGNG
mswin版のruby使ってるんですけど、
倍精度の浮動小数点数使うにはどうしたらいいの?
0362デフォルトの名無しさんNGNG
Float で間に合わないときは BigFloat
0363デフォルトの名無しさんNGNG
今ならBigdecimal。
0364デフォルトの名無しさんNGNG
>オリジナル
本当にオリジナルな言語なんて数えるほどしかないだろうし、
これからさらに減っていくのでは。
0365デフォルトの名無しさんNGNG
>>359
Rubyオリジナルなのは、モジュールを使ったMix-inあたりかなあ。
0366デフォルトの名無しさんNGNG
イテレータの柔軟な扱いは他の言語にはない・・・こともないか。
Lispじゃ常套手段だしな。

変数のスコープをprefixで区別するのはRubyオリジナルかな?
0367デフォルトの名無しさんNGNG
>>361
というか倍精度しか提供されてないのだが
0368デフォルトの名無しさんNGNG
名前空間ってこんな感じでいいの?

module ORE_NAME_SPACE
 class Main
 end
end
0369デフォルトの名無しさんNGNG
>368いい
0370デフォルトの名無しさんNGNG
るびきち氏ついにHP閉鎖?
http://www.ruby-lang.org/~rubikitch/
http://rubyist.net/~rubikitch/
我、詳細求む
0371デフォルトの名無しさんNGNG
>>370
「ついに」って、いままでなんかあったの?
0372370NGNG
>>371
るびきち氏
http://enya-mp3.tripod.com
Ruby撲滅スレ part 2
http://pc.2ch.net/tech/kako/1009/10091/1009193707.html

撲滅スレ内をキーワード"るびきち"で辿っていきますと...
0373デフォルトの名無しさんNGNG
★賞金が当たる★彼女が出来る★未成年クリック禁止★
http://www.pink-angel.jp/betu/linkvp2/linkvp.html
0374デフォルトの名無しさんNGNG
>>370
http://www.rubyist.net/~rubikitch/

つーか単純にURLが変わっただけ。
0375デフォルトの名無しさんNGNG
>>370
糠喜びさせやがって。まぁあの粘着君が閉めるわきゃねーわな。
0376デフォルトの名無しさんNGNG
Rubyなんて言語仕様がころころ変わるもんは使えないと上司に言われてしまいました。
(´・ω・`)ショボーン
0377デフォルトの名無しさんNGNG
バージョン番号振ってある様な言語は信用できんな。
0378デフォルトの名無しさんNGNG
正直バージョン番号の無い言語って何だろう。
C/C++ はライブラリ無いと何も出来ないし。
0379デフォルトの名無しさんNGNG
C も C++ も Perl も言語仕様が結構変わっているわけだが。
結局メジャーかどうかだな。
0380デフォルトの名無しさんNGNG
確かにC++なんて初期のころと比べたら仕様は変わりまくってる。
rubyなんかの比じゃない。
0381デフォルトの名無しさんNGNG
Windows も API が突然使えなくなったりとかしてるけど、
だから使うの止めたとか聞かないし。
0382デフォルトの名無しさんNGNG
すみません。数字をバイナリでファイルに出力、そして読み込むことを目的で以下のメソッドを書いたのですが、
もっと簡単な方法はないのでしょうか??またはこう書いた方が速いとか。
それとネーミングセンスがないので、良い名前がありましたら教えてください (^^;

class Integer
  def fixedByte(byte)
    fixedByte_(byte, self.abs, 1, (self < 0 ? 0b10000000 : 0b00000000))
  end
private
  def fixedByte_(byte, target, count, flg)
    nexttarget = target / 256
    if count != 1
      str = (target % 256).chr
    else
      str = ((target % 256) | flg).chr
    end
    if byte > count
      str = fixedByteS_(byte, nexttarget, count + 1, flg) << str
    end
    str
  end
end
0383デフォルトの名無しさんNGNG
class String
  def b_to_i
    ssize = self.size - 1
    i = 0
    for x in 0..ssize
        y = 1
        for z in 1..(ssize - x)
          y *= 256
        end
        if x != ssize
          i += self[x] * y
        else
          flg = ((self[x] & 0b10000000) > 0 ? -1 : 1)
          i += (self[x] & 0b01111111) * y
          i *= flg
        end
    end
    i
  end
end
0384デフォルトの名無しさんNGNG
pack unpack じゃだめなの?
0385デフォルトの名無しさんNGNG
お仕事の場合はゴルァって電話をかける先があるかどうかが問題じゃないかね
0386デフォルトの名無しさんNGNG
end読みにくいなあ。LISPみたい
0387デフォルトの名無しさんNGNG
今日は釣りが多い気がする。
0388デフォルトの名無しさんNGNG
lispのほうが256倍読みやすいYO
0389デフォルトの名無しさんNGNG
(・∀・)イイヨイイヨ-
0390デフォルトの名無しさんNGNG
>>382
Marshal.dump
0391デフォルトの名無しさんNGNG
>>382
fixedByteS_ってのがないがfixedByte_のtypoか?
任意のバイト数のビッグエンディアンで書き出そうという意図に見えるが、
最下位に符号をつけるのはまずかろう。
0392デフォルトの名無しさんNGNG
PealユーザーのためのRuby入門
吉田 和弘 (著)
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-06515-4
http://www.amazon.co.jp/exec/obidos/ASIN/4274065154/
0393382NGNG
こんばんは〜。
ビッグエンディアン‥そうですねそのようです。
その用語はじめて触れました (^^;
はじめ、符号なしを書いて、上で書いていたメソッド名にして、
そのあと、符号つきを書いてその名前の後ろに'S'を付けてました。
バグありましたね。符号つきを書くとき、あまり考えず、テストをしないでいたようです (^^;
ここにカキコする際に、符号つきを'S'を取り払った状態でカキコしたつもりでそうなりました。

pack unpackは〜機能を限定すればスッキリ書けるようですね。同等の機能を持たせるには複雑になりそうな予感‥
Marshalは〜、そもそも使いたくありません。すみません。

取り敢えず、方法としては、あまり間違ってないんですね??
ところで、メソッド名とかいい名前はありませんかね‥
0394デフォルトの名無しさんNGNG
>>393
> 取り敢えず、方法としては、あまり間違ってないんですね??
方向としては間違ってないが、再帰を使う必要はないだろう。

> ところで、メソッド名とかいい名前はありませんかね‥
うーん、いい名前があればなぁ。前からこういうのは提案しようとは思ってる
んだけど。

# ワンライナー版
class Integer
def to_bin(width = self.size)
n = self
(0...width).inject([]) {|a,i| a << (n & 0xff); n >>=8; a}.reverse.pack("cC*")
end
def self.from_bin(s)
s.unpack("cC*").inject(0){|i,j| (i<<8)|j}
end
end
0395デフォルトの名無しさんNGNG
>>392
まだ、ruby2perlないですか?
0396393NGNG
394さんありがとうございます!
わー短くてカッコイイなァ〜 (笑
そもそも私が用いた方法では、マイナスの表現方法がダサイしね (苦笑
はじめinjectでひっかかりましたが、それを使える方法で置き換えたらばっちりでした!
0397395NGNG
ちがた。ほすぃのは、perl2ruby
0398デフォルトの名無しさんNGNG
どぞ
http://www.google.co.jp/
0399393NGNG
うっ、ばっちりと思っていましたら、
文字列から数字に変える変換で、ちょっと複雑になりそうな感じです‥
0400395NGNG
>>398
ぐぐってきたけど、ない。
みんなhttp://pluto.im.uec.ac.jp/~sekita-n/jdocs/perl2ruby.htmlへの
リンク。これ見てrubyべんきょしますだ。a2pなんかもだめだったしさ、
どうせさんこにならないだろとはおもてますたがね。
0401デフォルトの名無しさんNGNG
現実的には、Perl 処理系を Ruby から使うか、
Ruby で Perl をエミュレートするライブラリを使うかくらいなので、
速度が糞遅くなることを考えれば、手で移植した方がまし。
0402デフォルトの名無しさんNGNG
perl2ruby程度なら作れそうだけど、
問題はライブラリなんじゃないかと。
おれは興味ないが。
0403デフォルトの名無しさんNGNG
>>393
仕様がよく分からないのだけど、これであってる?

class Integer
  def dump(w) f = f(self,w); (1..w).map{|i|(f>>(8*(w-i)))&255}.pack("C*") end
  private; def f(x,w) n = 2**(8*w); (x+n)%n; end
end

class String
  def undump(w) g(unpack("C*").inject(0){|i,j| (i<<8)|j},w) end
  private; def g(b,w) n = 2**(8*w); (b+n/2)%n-n/2; end
end

20.times do
  w = rand(10)+1
  x = (-1)**rand(2)*rand(256**(w-1))
  d = x.dump(w)
  u = d.undump(w)
  p [x == u, d.size == w, w, x, d.unpack("H*")[0].scan(/../).join(" ")]
end
0404393NGNG
すみません。
私のinjectの分解方法が悪かったです。
injectをArrayに実装して、そのままで動かしたら、
394さんのもので、符号付きでしっかり動きました。
ありがとうございました。

符号付きでしたら、文字(?)から数字に変えるときはunpackを使ったほうが速そうですが、
そうでない場合はもunpackを使わないほうが速かったりするのでしょうか。
packは使わないほうが速そうです。
あまりまともには速度のテストしてませんけど (^^;
0405デフォルトの名無しさんNGNG
>>404
そりゃコードによるがたいていは組み込みメソッドが早い。
0406デフォルトの名無しさんNGNG
str = 'efgh'
str2 = 'abcd'
str = str + str2

より

str = 'efgh'
str2 = 'abcd'
str << str2

のほうが遅いのですが、どうしてでしょうか??

ruby 1.6.7 (2002-03-01) [i586-mswin32]
です。
0407デフォルトの名無しさんNGNG
>>406
http://www1.u-netsurf.ne.jp/~brew/mine/ja/ruby/optimize.html
0408デフォルトの名無しさんNGNG
>>406
どうやって計ったかを書くべし。これで計ったらどうよ?

N=1000000
t0=Time::times; N.times{str='efgh';str2='abcd';str=str+str2}; t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "+",  u,s,u+s)
t0=Time::times; N.times{str='efgh';str2='abcd';str<<str2};    t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "<<", u,s,u+s)
0409デフォルトの名無しさんNGNG
406ではないがやってみた。

[分かったこと]
・ オレの環境では << の方が少々早い。
・ その差は1ケタパーセント。これが大きいのか小さいのかよーわからん。
・ 1.8 の方がちょい遅い。そんなもん?
・ 1.8 では Time::times が obsolete。

% ruby -v ~/hoge.rb
ruby 1.6.8 (2002-12-24) [i686-cygwin]
+ user 3.6150, system 0.0000, total 3.6150
<< user 3.3850, system 0.0000, total 3.3850

% ruby-18 -v ~/hoge.rb
ruby 1.8.0 (2003-03-03) [i386-cygwin]
./hoge.rb:2: warning: obsolete method Time::times; use Process::times
./hoge.rb:2: warning: obsolete method Time::times; use Process::times
+ user 3.7350, system 0.0100, total 3.7450
./hoge.rb:5: warning: obsolete method Time::times; use Process::times
./hoge.rb:5: warning: obsolete method Time::times; use Process::times
<< user 3.4750, system 0.0000, total 3.4750
0410デフォルトの名無しさんNGNG
>>409
> ・ 1.8 では Time::times が obsolete。
ちょっとワロタ

同じく406ではないがやってみた。

ruby 1.6.8 (2003-03-11) [i386-netbsdelf1.6]
+ user 3.4000, system 0.0200, total 3.4200
<< user 3.2600, system 0.0100, total 3.2700

ruby 1.8.0 (2003-04-04) [i386-netbsdelf1.6]
+ user 3.6600, system 0.0000, total 3.6600
<< user 3.6200, system 0.0100, total 3.6300

全然変わらねぇ…
0411デフォルトの名無しさんNGNG
a)
for i in 0..10000000
1+1
end

と

b)
for i in 0..10000000
2
end

ではb)の方が早い。
a)10.21s user 0.03s system 100% cpu 10.208 total
b)5.85s user 0.00s system 100% cpu 5.802 total

rubyは毎回のループごとに1+1をいちいち計算してるわけか…
0412デフォルトの名無しさんNGNG
>>411
> rubyは毎回のループごとに1+1をいちいち計算してるわけか…

その手の最適化って一切しないのけ?
0413デフォルトの名無しさんNGNG
>>412
Fixnum#+が再定義されないとも限らないので、「最適化」しちゃうわけにはいかない。
この議論はdevでもtalkでも繰り返し出てるんで、検索してみるのがよろしいかと。
0414デフォルトの名無しさんNGNG
>>404
http://raa.ruby-lang.org/list.rhtml?name=shim-ruby16_18
0415デフォルトの名無しさんNGNG
>>409 >>410
str='efgh';str2='abcd' を N.times の外に出したら変わるのかも
0416デフォルトの名無しさんNGNG
PerlのInline::Ruby使ってる人いる?
これでレンタル鯖にRubyインスコされてなくてもCGI書けるね。
http://search.cpan.org/author/NEILW/Inline-Ruby-0.02/lib/Inline/Ruby.pod
0417デフォルトの名無しさんNGNG
うーんしかしこういうのはいかがなものか

#define BEGIN {
とかいうのとあんまり変わらないような気もする(そんなこともないかな)
0418デフォルトの名無しさんNGNG
つーか Ruby が入って無いと使えないんじゃないのか?
0419デフォルトの名無しさんNGNG
正規表現の互換性を無くす話だけど、ruby-talk側には常識的な人が
多いようで、少し安心した。
0420デフォルトの名無しさんNGNG
頭が逝かれてるのは作者と一部の信者だけだろ
0421デフォルトの名無しさんNGNG
>>408-410
同じく406ではないがやってみた。
$ ruby -v ./time.rb
ruby 1.6.4 (2001-06-04) [i586-linux]
+ user 9.3900, system 0.0500, total 9.4400
<< user 10.1600, system 0.0400, total 10.2000

何故だ......_| ̄|○
0422デフォルトの名無しさんNGNG
>>421
<< の測定前にGCしたら変わったりして

N=1000000
t0=Time::times; N.times{str='efgh';str2='abcd';str=str+str2}; t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "+", u,s,u+s)
GC.start
t0=Time::times; N.times{str='efgh';str2='abcd';str<<str2}; t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "<<", u,s,u+s)
0423421NGNG
406ではな(ry

>>422
変わらなかったっす。
くっだらねーイージーミスであることを恐れてソースを>>422からコピペして動かしてみましたが結果変わらず。
+ user 9.0300, system 0.0800, total 9.1100
<< user 9.7100, system 0.0800, total 9.7900

ちなみに
$ rpm -qi ruby
Name : ruby Relocations: (not relocateable)
Distribution: Kondara MNU/Linux 2.0(Mary) Vendor: (none)
Version : 1.6.4 Option: (none)
Release : 2k Build Date: 2001年06月07日 13時12分4

時代に取り残された環境です(〃▽〃)♪
0424デフォルトの名無しさんNGNG
http://www.k-514.com/
(σ・∀・)σゲッツ!!
0425デフォルトの名無しさんNGNG
>423
1.6.4ってえらく古いな
kondaraの動向は知らんがmomongaに乗り換えたら新しいrpmが使えるのかな
0426 ◆hMJAPH9PWA NGNG
一見<<演算子のほうが速いように思えるが…どういう実装なんだろう。
<<の実装と+の実装が同じなのかな。
0427デフォルトの名無しさんNGNG
jpegのデータを読み込んだStringから
GD::Image.newFromJpeg(file)でimage instanceを作りたいのですが
ファイルを作らずにStringから直接image instanceを作れないでしょうか?
0428デフォルトの名無しさんNGNG
ローカル変数のアクセスが微妙に影響してるような。

N=1000000
t0=Time::times; N.times{'efgh'+'abcd'}; t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "+", u,s,u+s)
GC.start
t0=Time::times; N.times{'efgh'<<'abcd'}; t1=Time::times
u,s=t1.utime-t0.utime,t1.stime-t0.stime
printf("%-2s user %7.4f, system %7.4f, total %7.4f\n", "<<", u,s,u+s)

$ ruby-1.6 -v /tmp/s.rb
ruby 1.6.8 (2003-03-26) [i686-linux]
+ user 4.7000, system 0.0300, total 4.7300
<< user 4.6700, system 0.0300, total 4.7000
0429デフォルトの名無しさんNGNG
>>427
gdImageCreateFrom*Ctx()はサポートしてないみたいだな。
作者にリクエスト汁。
0430デフォルトの名無しさんNGNG
1.8はいつ出るの?
0431デフォルトの名無しさんNGNG
作者の気が向いたら。
0432デフォルトの名無しさんNGNG
>>431
Preview releaseが出てるのに気が向いたらも糞もあるか
0433デフォルトの名無しさんNGNG
子供の日とかじゃないの?
■ このスレッドは過去ログ倉庫に格納されています