レシピブック
189
行数を数える方法。
いろいろあるけど、例えばこんなの。
File.open( filename, "r:utf-8" ){ |f| f.to_a.size }
File.open( filename, "r:utf-8" ){ |f| f.each_line.count }
File.read( filename, encoding:"utf-8" ).count("\n")
File.open( filename, "r:utf-8" ) do |f|
nil while f.gets
f.lineno
end
- read.count が速い。それも5倍ぐらい。
- やっぱり to_a.size が一番遅いけど、大差ない。
- 行数が少ない時は行数を読むよりもファイルの open/close に時間がかかってるんだと思う。
yokohama.rb の時にその場で joker さんがおっしゃっていたけど、オブジェクトの生成コストがあるので、オブジェクトの数が少ないコードが速くなると。read.count は長い文字列を作るだけなので速い。それ以外は行数の数だけオブジェクトができるので遅い。と。
なるほど。
もちろん。read で読みきれないサイズのファイルだった場合は read.count 方式と to_a.size 方式は破綻する。破綻するかどうかの境目は手元の環境では 1GBytes とか。
百MBytesぐらいならあまり気にする必要がない場合が多いと思う。
ちなみに測定に使ったのはこんなコード
#coding:utf-8
require "benchmark"
def report( x, name, rep )
x.report(name) do
rep.times.map{ |x|
yield
}.uniq.tap{ |x| p x }
end
end
def create_file( filename, size )
s=[*?a..?z].cycle.take(100).join
File.open( filename, "w" ) do |f|
size.times.each do
f.puts s
end
end
end
def measure( size )
filename = "text.txt"
create_file( filename, size )
n=[100, 1310720.0/size ].min.ceil
t=Benchmark.realtime{ n.times{ File.open( filename, "r:utf-8" ).to_a.size } }
rep = (3.0/(t/n.to_f)).ceil
fsize = File.size( filename )
p [ size, fsize, rep ]
Benchmark.bmbm do |x|
report( x, "to_a.size", rep ) do
File.open( filename, "r:utf-8" ){ |f| f.to_a.size }
end
report( x, "each_line.count", rep ) do
File.open( filename, "r:utf-8" ){ |f| f.each_line.count }
end
report( x, "read().count", rep ) do
File.read( filename, encoding:"utf-8" ).count("\n")
end
report( x, "189", rep ) do
File.open( filename, "r:utf-8" ) do |f|
nil while f.gets
f.lineno
end
end
end
end
1.step(23,2) do |r|
measure( 1<<r )
end
190
seek と sysseek のちがい
未調査
def 〜 rescue
知らない文法があった。
# 平方根で失敗したら 0 を返す
def sqrt_force(x)
Math.sqrt(x)
rescue Math::DomainError=>e
return 0
end
p sqrt_force(100) #=> 10
p sqrt_force(-1) #=> 0
begin〜rescue がメソッドの最外縁にあると、begin を書かなくて良いというもの。
C++ にも似たようなのがある。
int hoge( double x )
try{
//なんか
}
catch( std::exception & e ){
//エラー処理
}
こんなの。ruby とちがって try が必要。
うろ覚えだけど Java にもあったと思う。
追記:上記のように書いたものの、調べたらなさそうな感じ。すいませんでした。
iPad をセカンドディスプレイに
iPad をセカンドディスプレイにしている方が2名いた。かっこいい。
アプリケーションとハードウェアは下記リンクのものらしい。
app : https://itunes.apple.com/jp/app/duet-display/id935754064
HW : http://www.amazon.co.jp/dp/B00TOCBNLK/
ふたりとも、途中で mac の電池が切れかかっていた。
すごい電池減るらしい。
LT
gem で GoogleDrive が使えるので便利。
google docs の表計算ソフトなら Excel と違って セル内の式で SQL が使える。すごい。
詳しくは
https://speakerdeck.com/1syo/za-nitukurukpiturufalsesusume ( 雑につくるKPIツールのススメ by TAKAHASHI Kazunari )
を参照のこと。
懇親会
Rails を学びたい人は Ruby on Rails チュートリアル ( http://railstutorial.jp/chapters/beginning?version=4.0 ) を読み、実際に写経などを行えばいい。らしい。
基本的なことは全部網羅されていて、出来もよく、素晴らしい。とのこと。
読みます。