LoginSignup
6

More than 5 years have passed since last update.

Yokohama.rb 2015年4月11日

Last updated at Posted at 2015-04-12

レシピブック

189

行数を数える方法。
いろいろあるけど、例えばこんなの。

to_a.size
File.open( filename, "r:utf-8" ){ |f| f.to_a.size }
each_line.count
File.open( filename, "r:utf-8" ){ |f| f.each_line.count }
read.count
File.read( filename, encoding:"utf-8" ).count("\n")
レシピブック189
File.open( filename, "r:utf-8" ) do |f|
  nil while f.gets
  f.lineno
end

で。
どれが速いか。
Kobito.vd4LAw.png

  • 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 ) を読み、実際に写経などを行えばいい。らしい。

基本的なことは全部網羅されていて、出来もよく、素晴らしい。とのこと。

読みます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6