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/
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デフォルトの名無しさん
NGNG0434デフォルトの名無しさん
NGNG0435デフォルトの名無しさん
NGNG0436初心者
NGNGdef mini_sort(index,array)
i = index
unsorted_array = array
judge = true
while judge
if unsorted_array[i - 1] > unsorted_array[i] || i != 1
tmp = unsorted_array[i - 1]
unsorted_array[i - 1] = unsorted_array[i]
unsorted_array[i] = tmp
i--
else
judge = false
end
end
end
def Insertionsort.sort(unsorted_array)
i = 1
while i < (unsorted_array.size)
mini_sort(i,unsorted_array)
i++
end
sorted_array = unsorted_array
return sorted_array
end
end
test_array = [2,4,45,6,3,677,32,64,453,1,3,56,7,0]
p Insertionsort::sort(test_array)
0437初心者436
NGNG上のように書いたら次のようなメッセージで動きません。
test3.rb:12: parse error
test3.rb:22: parse error
test3.rb:29: parse error
p Insertionsort::sort(test_array)
^
Ruby始めたばっかりで、どこがおかしいか検討がつきません。
endの閉じ忘れとかは注意したはずなんですが。。
なにかおかしなところ指摘してください。
動かない理由以外でも、書き方のへんなところとか教えて下さい。
0438デフォルトの名無しさん
NGNG0439初心者436
NGNGそこを直すと、違うエラーメッセージがでてきて進みそうです。
よくみたらクラス名もおかしかった。。
もうちょっと自分でやってみます
アドバイスありがとうございました
0440できた436
NGNGdef self.mini_sort(index,array)
i = index
unsorted_array = array
judge = true
while judge
if unsorted_array[i-1] > unsorted_array[i] && i != 0 then
tmp = unsorted_array[i - 1]
unsorted_array[i - 1] = unsorted_array[i]
unsorted_array[i] = tmp
i -= 1
else
judge = false
end
end
return unsorted_array
end
def self.sort(unsorted_array)
i = 1
while i < unsorted_array.size do
unsorted_array = mini_sort(i,unsorted_array)
i += 1
end
sorted_array = unsorted_array
return sorted_array
end
end
test_array = [2,4,45,6,3,677,32,64,453,1,3,56,7,0]
p Insertion_sort::sort(test_array)
0441デフォルトの名無しさん
NGNGこれだと破壊的だがそれで良い?
例えば
test_array = [2,4,45,6,3,677,32,64,453,1,3,56,7,0]
p test_array.sort, test_array # Array#sort は test_array を破壊しない
p Insertion_sort::sort(test_array), test_array # Insertion_sort::sort は破壊的
結果
[0, 1, 2, 3, 3, 4, 6, 7, 32, 45, 56, 64, 453, 677]
[2, 4, 45, 6, 3, 677, 32, 64, 453, 1, 3, 56, 7, 0]
[0, 1, 2, 3, 3, 4, 6, 7, 32, 45, 56, 64, 453, 677]
[0, 1, 2, 3, 3, 4, 6, 7, 32, 45, 56, 64, 453, 677]
0442デフォルトの名無しさん
NGNGbreakというものを教えて上げたいような上げたくないような。
0443436
NGNGもとのsortメソッドの名前をsort!に改めて
新しく次のようにsortメソッドを作りました。
普段、あまり破壊的、非破壊的ということを意識してませんでした。
単純にcloneメソッドを使ってつくりました。
def self.sort(unsorted_array)
i = 1
cloned_unsorted_array = unsorted_array.clone
while i < cloned_unsorted_array.size do
cloned_unsorted_array = mini_sort(i,cloned_unsorted_array)
i += 1
end
sorted_array = cloned_unsorted_array
return sorted_array
end
0444436
NGNGbreakを使うとしたら、mini_sortのwhile文中でしょうか?
loopとbreakを使うとすっきりしました。
def self.mini_sort(index,array)
i = index
unsorted_array = array
loop{
if unsorted_array[i-1] > unsorted_array[i] && i != 0 then
tmp = unsorted_array[i - 1]
unsorted_array[i - 1] = unsorted_array[i]
unsorted_array[i] = tmp
i -= 1
else
break
end
}
return unsorted_array
end
0445デフォルトの名無しさん
NGNGmodule InsertionSort
module_function
def insertion_sort!(array)
modified = nil
for n in 0..array.size-1
n.downto(1) do |i|
break unless array[i-1] > array[i]
array[i-1], array[i], modified = array[i], array[i-1], true
end
end
modified and array
end
def insertion_sort(array)
insertion_sort!(copy = array.dup) or copy
end
end
0447デフォルトの名無しさん
NGNG0448デフォルトの名無しさん
NGNGmodule Enumerable
def insertion_sort
array = []
each do |a|
if array.each_with_index {|b, i|
if b > a
array[i, 0] = [a]
break
end
}
array << a
end
end
array
end
end
0449デフォルトの名無しさん
NGNGかちゅで読むとインデントされてないから無茶苦茶読みにくい
0450デフォルトの名無しさん
NGNGttp://pc.2ch.net/test/read.cgi/unix/1046402063/360
0451デフォルトの名無しさん
NGNG殺してしまい、ワトソンくんが出現します。(スタックオーバーフロー)
rubyは1.6.7のmswinです。
あと意味はないですが、CGIの先頭行に#!を記述しています。
もし何か知っている方いられましたら教えてください。
0452デフォルトの名無しさん
NGNGRubyでCGIがうんぬんというより、そもそもスクリプトがスタック食いまくりとか
だったりしませんか?
0453デフォルトの名無しさん
NGNGApacheに汁!
0454デフォルトの名無しさん
NGNGそりゃ悪かった。かちゅーしゃって行頭の空白消しちゃうのか。
module Enumerable
def insertion_sort
array = []
each do |a|
if array.each_with_index {|b, i|
if b > a
array[i, 0] = [a]
break
end
}
array << a
end
end
array
end
end
0455デフォルトの名無しさん
NGNGもしそうならWindowsはスタックサイズの上限を指定できないの?
0456デフォルトの名無しさん
NGNGできまっせ。
標準で1メガはあるはずだけど。
でもスタックオーバーフローを起こす様なプログラムは
アルゴリズム修正した方がいいんじゃねえの?
0457デフォルトの名無しさん
NGNG0458デフォルトの名無しさん
NGNGIISでmod_rubyって使えるんだっけ?
0459デフォルトの名無しさん
NGNGただのRubyプロセスでIISがシニマス。
プロセス空間を別にしてもシニマス。
CGIスクリプトは最後まで完了していて、その後もRubyがガリガリしていて
まもなくIISがシニマス。
自分のちびマシンのAN HTTPDでは問題なく動作します。
Apache+Linuxでも問題なく動作します。
仕事の都合上IISしか使えません。
ということでマイっています。
0460デフォルトの名無しさん
NGNGスタックオーバーフローって出るのはrubyに対して、それともIIS?
サーバを殺してしまうということだと、吐いてるデータに問題があるような気
がするが、nphモードにしてみるとどうなる?
0461デフォルトの名無しさん
NGNG451です。
IISに対してオーバーフローが発生します。
そのときRubyは終了しています。
一時的に標準出力に出さないようにしてテストしてみます。
勉強不足ですみませんが、nphモードって何でしょうか?
0462デフォルトの名無しさん
NGNGttp://CGI-Spec.Golux.Com/draft-coar-cgi-v11-03-clean.html#7.0
IISではCGIスクリプトを nph- で始まるファイル名にすることでNPHモードになる。
NPHスクリプトは最初に "HTTP/1.0 201 Created\r\n" を出力しなければならない。
またヘッダの改行コードは \r\n にする。
0463デフォルトの名無しさん
NGNG451です。
詳細にありがとうございます。月曜日に試してみます。
HTTPヘッダでの方法でやってみます。
0464デフォルトの名無しさん
NGNG0465デフォルトの名無しさん
NGNGやってみましたが、結果は同じでした。
RubyプロセスがIISを殺せるなんてやっぱりおかしいので、IISのバグあたりが
妥当ではないかと思っています。
0466デフォルトの名無しさん
NGNGAN HTTPDでは動くってことは、その可能性が高いと思われ。
rubyを使わずに、固定のデータを送るようなCGIにしても同じかな?
0467デフォルトの名無しさん
NGNG使うのやめたら、10秒以上掛かってた処理が1秒を切ったよ。
これに限らず、Rubyの添付ライブラリは玉石混淆過ぎ
つか、地雷原(w
0468デフォルトの名無しさん
NGNG0469デフォルトの名無しさん
NGNG0470デフォルトの名無しさん
NGNG煽りではなく、参考にさせてもらいたいので。
0471デフォルトの名無しさん
NGNGプロファイラに掛けたら、URI.parseも遅かったが、
URI#+は失禁するぐらい遅かった。
URIライブラリは、UriValidatorとUriUtilに分けたらどうだ?
CGIライブラリもなぁ、なんか使いにくいよ。
Ruby唯一の処理系に付属するオフィシャルな
おまけライブラリにしては、実装者のアクが強すぎ。
なんつーか、ツブシの効かない感じ。
0472デフォルトの名無しさん
NGNGプロファイラの結果見たい。遅いのはどのへん?
# URI::Generic#mergeあたりかな。
0473デフォルトの名無しさん
NGNGxml-parserでできますっけ。
0474デフォルトの名無しさん
NGNGhttp://raa.ruby-lang.org/cat.rhtml?category_major=Library;category_minor=XML
libxmlとかかねぇ。
0475デフォルトの名無しさん
NGNG0476デフォルトの名無しさん
NGNGX ターミナルの表示可能なカラム数を Ruby から得るにはどうしたらいいですか?
やりたいことは、Debian や RedHat の apt-get を実行したときに、画面右端に出る
[38%] などのパーセント表示を右端ぴったりに出したい、ということなのですが。
0477デフォルトの名無しさん
NGNG0478デフォルトの名無しさん
NGNG安直でよければ
columns = (columns.to_i if columns = ENV["COLUMNS"])
ウィンドウリサイズに追従したければcursesでも使うべきだろう。
$ ruby -rcurses -e 'Curses.init_screen;l,c = Curses.lines,Curses.cols; Curses.close_screen;puts "#{c}x#{l}"'
100x50
0480山崎渉
NGNG0481デフォルトの名無しさん
NGNGprint文でいいんじゃねえの?
0482デフォルトの名無しさん
NGNGCGIでRubyがIISを落とす件です。
なんとなくわかりました。
httpdはIIS4です。フォームからCGIにデータを送信して、CGIの中で
Locationヘッダを使って自分のCGIに戻すことをしています。
掲示板なんかでの再読み込み防止策としてやったのですが、
これがなぜか無限ループに陥ってしまうのです。
リクエスト内容を見るとLocationにはクエリを渡していないのに
その前のフォームのデータが流れてきています。
そしてまたLocation。
ちなみにただLocationでループさせても適度な回数でたたききられます。
0483デフォルトの名無しさん
NGNGRFC2616 の
10.3 Redirection 3xx
14.30 Location
をよく読んだら何か分かるかも。
0484デフォルトの名無しさん
NGNGのマッチのあと、$1 が 'a' ではなく '' になるのはなぜでしょうか?
0485デフォルトの名無しさん
NGNG0486デフォルトの名無しさん
NGNGつまりスレ違いだったわけでつね
空文字列にマッチするから。
0488山崎渉
NGNG( ^^ )< ぬるぽ(^^)
0489デフォルトの名無しさん
NGNGそれじゃあ説明になってないんじゃ?
普通に考えると、a* が貪欲に 'a' にマッチすると思うんだけど。
/((a*)*)/.match('a').to_a # => ["a", "a", ""]
↑これは、ちょっと理解し難いです。
(a*) が空文字にマッチしてるのに、
どうしてその外側の ((a*)*) が 'a' にマッチし得るの?
0490デフォルトの名無しさん
NGNGだから内側のカッコは2回マッチしてるんだってば。
最終的な $~ は最後のマッチが有効になる。
これなら分かる?
$ ruby -e 'p /((ba*)*)/.match("bab").to_a'
["bab", "bab", "b"]
0491デフォルトの名無しさん
NGNGでも、なぜ(a*)が2回マッチするのかが分かりません。
1回目のマッチで文字列全部を取ってしまってるので、それで終了にはならないのですか?
0492デフォルトの名無しさん
NGNG.{0,0} は空文字列に最低一回マッチする。
0493489 (not (484 or 491))
NGNGあぁ、なるほど。理解できました。
(a*) は、1回目のマッチで 'a' を食べて、
2回目のマッチで '' を食べたところで繰り返しが終了し、
その時点のマッチの状態ってことで $1 = '' がセットされたってわけですね。
0494デフォルトの名無しさん
NGNGまあこういうのはマニュアルなんかにはあまり詳しく書かれてないから
Friedl の Mastering regular expressions でも買って読むのが吉
0495491
NGNG2回目のマッチが行われれば $1 に '' が入るのは分かるのですが、
1回目のマッチですべての文字列を食べ終わっているのに
2回目のマッチを行おうとするというのがどうも理解できません。
文字列の最後に仮想的な空文字を想定して、
1回目のマッチ後ではそれがまだ残っているというふうに考えるのでしょうか。
0496デフォルトの名無しさん
NGNGまあそうなんだが「仮想的な空文字を想定して」というのはよく分からん。
まず空文字ではなくて空文字列というべきだろう。
そして仮想的に想定しているのでなく実際にある。
0497デフォルトの名無しさん
NGNGirb(main):008:0> t = File.stat('foo').mtime.to_s
=> "Fri Jul 26 23:01:14 GMT+9:00 2002"
irb(main):009:0> Time.parse t
=> Sat Jul 26 23:01:14 UTC 2003
0498デフォルトの名無しさん
NGNG0499デフォルトの名無しさん
NGNG0500デフォルトの名無しさん
NGNGそういうTZってありだっけ?
begin-base64 644 tz.diff.gz
H4sIAAAAAAACA71Ry2rbQBRde77iLAKRMh7r4dgmA0IJKZQssknclWWKLI3C
gCyZGdmkxvTbM3rFSeqmi0LuQvcx95xzxbkrUvHMkcuVk8aVcLJSreNqpFYk
+P8gD7ePyGQuOJxkpx21Xf1ytEra4k/N4Y4oUSkpdrJ4gjJJy7KAN5qSVGYZ
2BbMB9uAKTPD8VbG2IlfGPhXuI8VfNcdw53y8RWfuGCuiUHNSSk9iRrjZtOh
fJ/7U+52KHJ9bQ64nAxnoG0ygySPtcY3w0EwGACI9EVXWYQ1GVjEbL+kVsgj
TVNd2WG0IrR7M9OndXXYVokdLhhdRmm9yEOT7Y7ocCT6uEA/UWjBLYkdkruj
15Vciy8zuRP7q7ued8Jez0N/ZO9u139uqyHrfX3d/2DojHuXbwyducMJaPN9
tXNuoARtlOa0AIXM+8G+LISZ1Gm03SSxFoS1LzKDE91YC8qWthWlUWrzsM3R
3kHwu8EQ+m455N/v54cf81s7/BcQeHeSdeYhCHDOzhGCeeDwbFyYsT+qyp/S
lFMXFGfjprWbvucQuW71a8la6K3OCx+CUAoVBAAA
====
0501デフォルトの名無しさん
NGNG0502デフォルトの名無しさん
NGNG実行結果、「123aaa456789」を期待していたのですが、
「123aaa789」となってしまいました。ファイルの途
中に追加書き込みするには、どうしたらよいのですか。
f = open("text","w")
f.print("123456789")
f.close
f = open("text", "r+")
f.seek(3, IO::SEEK_SET)
f.print("aaa")
f.close
0503デフォルトの名無しさん
NGNG直接的な手段はない。
ファイルの途中に直接挿入はできないので、
挿入したい位置から先を後ろへずらす必要がある。
0504デフォルトの名無しさん
NGNGファイルがそれほど大きくなければ
f = open("text", "r+")
img = f.read # 全部読んで
img[3,0] = "aaa" # ファイルイメージを文字列として編集して
f.truncate(0) # ファイルを切り詰めて
f << img # 書き出すのが頭を使わなくて楽
f.close
0506デフォルトの名無しさん
NGNGそのTZフォーマットの典拠を明示できるなら、
bugs-jaにでも投げといてくれるとありがたい。
0507502
NGNGどうもありがとうございます。
ファイルが大きく、編集箇所も多いので、
結局、以下のようにしました。
f_read = open("text1","w+")
f_read.print("123456789")
f_read.rewind
f_write = open("text2", "w")
f_write.print f_read.read(3)
f_write.print ("aaa")
f_write.puts f_read.gets
f_read.close
0508デフォルトの名無しさん
NGNGdef random_permutation(n,k) (0..n-1).sort_by{rand}[0,k] end
sort_by は便利だ
0509デフォルトの名無しさん
NGNG(0..n-1).sort_by{rand}
(0..n-1).sort{rand<=>0.5}
確率的な違いをどう表現したらいい?
0510デフォルトの名無しさん
NGNG(0..n-1).sort_by{rand} が以下と等価かどうかすら分からん
def perm(a, k=0, v = [])
n = (a = a.to_a).size-1
n == k ? v<<a : (k..n).each{|i| perm((b=a.dup;b[k],b[i]=b[i],b[k];b),k+1,v)}
v
end
perm(0..n-1)[rand((1..n).inject(1){|v,x|v*x})]
0511デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています