Ruby について Part 3
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGRuby 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よくわからんが、ruby の -i オプションを使えば解決されるような話?
0335デフォルトの名無しさん
NGNG[-0-9]
のような表現って多用しませんか?
いまさら
[\-0-9]
と書けって言われても、って感じ。
0336デフォルトの名無しさん
NGNGデカいファイルを突っ込むとメモリ馬鹿食いするけどこんなの。
TEXTFILE = 'inuneko.txt'
if (s = IO.readlines(TEXTFILE).map!{|line| gsub(/ねこ/, 'いぬ')})
open(TEXTFILE, 'w').print(s)
end
0337336
NGNGif (s = IO.readlines(TEXTFILE).map!{|line| gsub(/ねこ/, 'いぬ')}) # ×
if (s = IO.read(TEXTFILE).gsub!(/ねこ/m, 'いぬ')) # ○
0338デフォルトの名無しさん
NGNGこれならデカいファイルでも安心。
どんな場合でも書いちゃうし非 unix 環境でちゃんと動くかは知らないけど。
File.open(file) { |src|
File.unlink(file)
File.open(file, 'w') { |dest|
src.each_line { |line|
dest << line.gsub(/ねこ/, 'いぬ') }}}
0339デフォルトの名無しさん
NGNGじゃだめ?
0340デフォルトの名無しさん
NGNG正直いやん
0341デフォルトの名無しさん
NGNGtext = <<-AHYA
fooTEXTboo
AHYA
hoge = '\1000yen'
p text.sub(/TEXT/, hoge)
このスクリプトで出力が
foo\1000yenboo\n
となるのを期待してるのですが\1が消えてしまいます。
消えないようにするにはどうしたらいいのでしょうか?
0342デフォルトの名無しさん
NGNG0343デフォルトの名無しさん
NGNGperlとかでも多用されているもんな。
0344341
NGNGそんな一休さんみたいな答えじゃなくて他の案をお願いします・゚・(ノД`)
0345デフォルトの名無しさん
NGNG0346デフォルトの名無しさん
NGNGtext.sub(/TEXT/) {hoge}
0348デフォルトの名無しさん
NGNGhoge = '\\\\1000yen'
0349デフォルトの名無しさん
NGNG誰かがまとめてたの見たことあるよ
本家マニュアルサイトの「落し穴」あたりをあたってみては
0350デフォルトの名無しさん
NGNGそれは直感的にわかりにくい。
>>346 のほうが新婦瑠でわかりやすいから、暗号的なプログラムを書きたい
のでないかぎり、ブロックを使ったほうが良いと思う。
0351デフォルトの名無しさん
NGNGPOSIX regex で許されてる表現はそのまま通って欲しいな。
0352not333な初心者
NGNGの解説キボウ。お願いします。
なぜ、これなら、でかいファイルでもメモリを浪費しないんでしょうか?
2行目のunlinkが関係してるようなんですが。。
openしたブロックの中でunlinkって??
0353338
NGNG1. each_line なので全行をいっぺんにメモリに格納しません。
2. ファイルを open した状態で unlink してもファイルの中身は消えません。
(open したプロセスが一個も無くなってから消えます)
unlink 後に同名のファイルを open しても旧ファイルの中身に触れることはできません。
0354not333な初心者
NGNGじゃあ、メモリを浪費しないのは、each_lineを使ってるからで、
処理前と処理後を、同名のファイル名にしたい今回のような場合は、
一行ごと、each_lineするためには、unlinkして、
旧ファイルの内容と、新ファイルの内容を別々に扱ってるってことですね。
ありがとうございました。
0355デフォルトの名無しさん
NGNGだから結局一時ファイルを使っているのと変わらないのよ。
0356333
NGNG338 さん、プログラムリストと解説ありがとうございました。
0357デフォルトの名無しさん
NGNG少なくともDOSISH(mswin32, mingw32, bccwin32, djgpp, たぶんhuman68kも)
ではopenしているファイルを削除することはできない。
それ以外は分からん。
0358デフォルトの名無しさん
NGNG0359デフォルトの名無しさん
NGNG0360デフォルトの名無しさん
NGNG0361デフォルトの名無しさん
NGNG倍精度の浮動小数点数使うにはどうしたらいいの?
0362デフォルトの名無しさん
NGNG0363デフォルトの名無しさん
NGNG0364デフォルトの名無しさん
NGNG本当にオリジナルな言語なんて数えるほどしかないだろうし、
これからさらに減っていくのでは。
0365デフォルトの名無しさん
NGNGRubyオリジナルなのは、モジュールを使ったMix-inあたりかなあ。
0366デフォルトの名無しさん
NGNGLispじゃ常套手段だしな。
変数のスコープをprefixで区別するのはRubyオリジナルかな?
0367デフォルトの名無しさん
NGNGというか倍精度しか提供されてないのだが
0368デフォルトの名無しさん
NGNGmodule ORE_NAME_SPACE
class Main
end
end
0369デフォルトの名無しさん
NGNG0370デフォルトの名無しさん
NGNGhttp://www.ruby-lang.org/~rubikitch/
http://rubyist.net/~rubikitch/
我、詳細求む
0371デフォルトの名無しさん
NGNG「ついに」って、いままでなんかあったの?
0372370
NGNGるびきち氏
http://enya-mp3.tripod.com
Ruby撲滅スレ part 2
http://pc.2ch.net/tech/kako/1009/10091/1009193707.html
撲滅スレ内をキーワード"るびきち"で辿っていきますと...
0373デフォルトの名無しさん
NGNGhttp://www.pink-angel.jp/betu/linkvp2/linkvp.html
0374デフォルトの名無しさん
NGNGhttp://www.rubyist.net/~rubikitch/
つーか単純にURLが変わっただけ。
0375デフォルトの名無しさん
NGNG糠喜びさせやがって。まぁあの粘着君が閉めるわきゃねーわな。
0376デフォルトの名無しさん
NGNG(´・ω・`)ショボーン
0377デフォルトの名無しさん
NGNG0378デフォルトの名無しさん
NGNGC/C++ はライブラリ無いと何も出来ないし。
0379デフォルトの名無しさん
NGNG結局メジャーかどうかだな。
0380デフォルトの名無しさん
NGNGrubyなんかの比じゃない。
0381デフォルトの名無しさん
NGNGだから使うの止めたとか聞かないし。
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デフォルトの名無しさん
NGNGdef 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デフォルトの名無しさん
NGNG0385デフォルトの名無しさん
NGNG0386デフォルトの名無しさん
NGNG0387デフォルトの名無しさん
NGNG0388デフォルトの名無しさん
NGNG0389デフォルトの名無しさん
NGNG0390デフォルトの名無しさん
NGNGMarshal.dump
0391デフォルトの名無しさん
NGNGfixedByteS_ってのがないがfixedByte_のtypoか?
任意のバイト数のビッグエンディアンで書き出そうという意図に見えるが、
最下位に符号をつけるのはまずかろう。
0392デフォルトの名無しさん
NGNG吉田 和弘 (著)
http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-06515-4
http://www.amazon.co.jp/exec/obidos/ASIN/4274065154/
0393382
NGNGビッグエンディアン‥そうですねそのようです。
その用語はじめて触れました (^^;
はじめ、符号なしを書いて、上で書いていたメソッド名にして、
そのあと、符号つきを書いてその名前の後ろに'S'を付けてました。
バグありましたね。符号つきを書くとき、あまり考えず、テストをしないでいたようです (^^;
ここにカキコする際に、符号つきを'S'を取り払った状態でカキコしたつもりでそうなりました。
pack unpackは〜機能を限定すればスッキリ書けるようですね。同等の機能を持たせるには複雑になりそうな予感‥
Marshalは〜、そもそも使いたくありません。すみません。
取り敢えず、方法としては、あまり間違ってないんですね??
ところで、メソッド名とかいい名前はありませんかね‥
0394デフォルトの名無しさん
NGNG> 取り敢えず、方法としては、あまり間違ってないんですね??
方向としては間違ってないが、再帰を使う必要はないだろう。
> ところで、メソッド名とかいい名前はありませんかね‥
うーん、いい名前があればなぁ。前からこういうのは提案しようとは思ってる
んだけど。
# ワンライナー版
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まだ、ruby2perlないですか?
0396393
NGNGわー短くてカッコイイなァ〜 (笑
そもそも私が用いた方法では、マイナスの表現方法がダサイしね (苦笑
はじめinjectでひっかかりましたが、それを使える方法で置き換えたらばっちりでした!
0397395
NGNG0398デフォルトの名無しさん
NGNGhttp://www.google.co.jp/
0399393
NGNG文字列から数字に変える変換で、ちょっと複雑になりそうな感じです‥
0400395
NGNGぐぐってきたけど、ない。
みんなhttp://pluto.im.uec.ac.jp/~sekita-n/jdocs/perl2ruby.htmlへの
リンク。これ見てrubyべんきょしますだ。a2pなんかもだめだったしさ、
どうせさんこにならないだろとはおもてますたがね。
0401デフォルトの名無しさん
NGNGRuby で Perl をエミュレートするライブラリを使うかくらいなので、
速度が糞遅くなることを考えれば、手で移植した方がまし。
0402デフォルトの名無しさん
NGNG問題はライブラリなんじゃないかと。
おれは興味ないが。
0403デフォルトの名無しさん
NGNG仕様がよく分からないのだけど、これであってる?
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
0404393
NGNG私のinjectの分解方法が悪かったです。
injectをArrayに実装して、そのままで動かしたら、
394さんのもので、符号付きでしっかり動きました。
ありがとうございました。
符号付きでしたら、文字(?)から数字に変えるときはunpackを使ったほうが速そうですが、
そうでない場合はもunpackを使わないほうが速かったりするのでしょうか。
packは使わないほうが速そうです。
あまりまともには速度のテストしてませんけど (^^;
0405デフォルトの名無しさん
NGNGそりゃコードによるがたいていは組み込みメソッドが早い。
0406デフォルトの名無しさん
NGNGstr2 = 'abcd'
str = str + str2
より
str = 'efgh'
str2 = 'abcd'
str << str2
のほうが遅いのですが、どうしてでしょうか??
ruby 1.6.7 (2002-03-01) [i586-mswin32]
です。
0407デフォルトの名無しさん
NGNGhttp://www1.u-netsurf.ne.jp/~brew/mine/ja/ruby/optimize.html
0408デフォルトの名無しさん
NGNGどうやって計ったかを書くべし。これで計ったらどうよ?
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[分かったこと]
・ オレの環境では << の方が少々早い。
・ その差は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> ・ 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デフォルトの名無しさん
NGNGfor 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> rubyは毎回のループごとに1+1をいちいち計算してるわけか…
その手の最適化って一切しないのけ?
0413デフォルトの名無しさん
NGNGFixnum#+が再定義されないとも限らないので、「最適化」しちゃうわけにはいかない。
この議論はdevでもtalkでも繰り返し出てるんで、検索してみるのがよろしいかと。
0415デフォルトの名無しさん
NGNGstr='efgh';str2='abcd' を N.times の外に出したら変わるのかも
0416デフォルトの名無しさん
NGNGこれでレンタル鯖にRubyインスコされてなくてもCGI書けるね。
http://search.cpan.org/author/NEILW/Inline-Ruby-0.02/lib/Inline/Ruby.pod
0417デフォルトの名無しさん
NGNG#define BEGIN {
とかいうのとあんまり変わらないような気もする(そんなこともないかな)
0418デフォルトの名無しさん
NGNG0419デフォルトの名無しさん
NGNG多いようで、少し安心した。
0420デフォルトの名無しさん
NGNG0421デフォルトの名無しさん
NGNG同じく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<< の測定前に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)
0423421
NGNG>>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(σ・∀・)σゲッツ!!
0425デフォルトの名無しさん
NGNG1.6.4ってえらく古いな
kondaraの動向は知らんがmomongaに乗り換えたら新しいrpmが使えるのかな
0427デフォルトの名無しさん
NGNGGD::Image.newFromJpeg(file)でimage instanceを作りたいのですが
ファイルを作らずにStringから直接image instanceを作れないでしょうか?
0428デフォルトの名無しさん
NGNGN=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デフォルトの名無しさん
NGNGgdImageCreateFrom*Ctx()はサポートしてないみたいだな。
作者にリクエスト汁。
0430デフォルトの名無しさん
NGNG0431デフォルトの名無しさん
NGNG0432デフォルトの名無しさん
NGNGPreview releaseが出てるのに気が向いたらも糞もあるか
0433デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています