Kernel#systemと`` の挙動の違い
戻り値
p system "ls" # => true p `ls` # => "Capfile\nGemfile\nGemfile.lock\n...."
エラー時の挙動
p system "ls2" # => nil p `ls2` # => No such file or directory - ls2 (Errno::ENOENT) の例外が発生し、 空文字列がかえる
p ls2
の例については begin, rescue で囲って動作確認した。
RubyMineでファイルのシンタックスハイライトが効かないときの対応方法
bash
のコードは拡張子がなくてRubyMine側がファイルの種類を判断できなかったりするので、自分で指定する必要がある。
Help > Find Action... > Action > Associate with File Type...
で指定できる。
Find Action
は shift 2回でも起動できる。
ローカルにある不要になった remote-tracking branch を削除する
remote-tracking branch を削除する方法
remote-tracking branch とはローカルにあるリモートレポジトリの追跡ブランチのことです。
私たちが手元で使うローカルブランチは、 git fetch して、このremote-tracking branch をローカルに作成した後に、
ここからさらに git checkout -b して生成されます。
開発が終わり、無事マージした後にこの remote-tracking branch は不要になります。
remote (ex. GitHub上) で削除済みのブランチであれば git remote prune origin
で消せるのですが、
そうでないブランチは消せません。しかし、以下の方法で消すことができます。
%w( origin/test origin/fix origin/fix_typo ).each do |bra| system("git branch -d -r #{ bra }") end
削除前は、 git status, git diff などのコマンドが重かったのですが、実行後は幾分か軽くなりました。
参考にさせていただきました
追記
`git branch --all`.split("\n").map(&:strip).select{|s| s.match(/^remotes\//)}.each do |bra| system("git branch -d -r #{ bra.gsub(/^remotes\//, "") }") end
Rubyの細かい記法のメモ
begin, end で複数行をインスタンス変数にキャッシュできる
def calc_camage(base) # 最終値={基本値×(1-1/8)×武器補正×攻撃回数} base * (1-1/8) * 8 * 1 end def damage @damage ||= begin atk = 12 dfn = 9 base = atk/2 - dfn/4 calc_camage(base) end end p damage # => 32
文字列の展開をまとめて行う
ar = (1..10).to_a puts ("%03d " * 10) % ar # => 001 002 003 004 005 006 007 008 009 010
Array#assoc, rassoc
2次元配列をHashっぽく操作できる。多分名前の由来は英語の association 。
a2 = [ [:a, 1], [:b, 2], [:c, 3], ] p a2.assoc(:a) # => 1 p a2.rassoc(3) # => :c
Hashにもある。
h = {a: 1, b: 2, c: 3} p h.assoc(:a) # => [:a, 1] p h.select{|k,v| k==:a} # => {:a=>1}
ヒアドキュメント
インデントを気にしなくて良い<<~
は2.3 から入った。
なので、それ以前のバージョンでは <<-
を使う必要がある。
#{}
による変数展開も使える。
age = 33 sql = <<~SQL select * from users where age == #{ age } ; SQL puts sql
引数部分にヒアドキュメントを直接指定もできる。
def foo(arg) puts arg end foo(<<-SQL select * from users where id = 1 ; SQL ) # => select * from users # where id = 1 # ;
at_exit でプログラムの最後に実行できる処理を指定できる
END でも可。後から順に実行される。
at_exit { p 1 } at_exit { p 2 } at_exit { p 3 } END { p 4 } END { p 5 } END { p 6 } # => # 6 # 5 # 4 # 3 # 2 # 1
変数名などにUTF8の文字を使える
ただ、クラス名は頭文字が大文字の半角英字である必要がある。
日本語のメソッド名が書けたりする。
class Nucoぬこ def self.新規作成 new end def 鳴く( 回数 = 1 ) puts "にゃーん" * 回数 end end Nucoぬこ.新規作成.鳴く( 3 ) # => にゃーんにゃーんにゃーん
こちらを参考にしました
Rubyで別ファイルにログを出力する
Railsで開発をしていると、たくさんSQLを実行しているサーバだと development.log
の出力が多すぎて追うのが大変になります。
こういう時、別ファイルに出力させたいのですが、以下のように行えばOKです。
また、log/
以下は gitignore されていることがほとんどだと思うので、log以下にファイルを置くと良いです。
Logger.new('log/out.log').info( "ログ出力したい文言" )
出力例は以下のようになります。
I, [2019-01-15T18:59:25.132692 #6825] INFO -- : ログ出力したい文言
Rails外の場合だと、require が必要です。
require "logger" Logger.new('out.log').info( "ログ出力したい文言" )
size,count,empty? のパフォーマンスを確認する
size,count,empty? のパフォーマンスを確認をしてみる。
require "benchmark" count = 1000_000 ar = [1, 2, 3, 4, 5] Benchmark.bm(10) do |x| # 10はラベルの為に確保する長さ x.report("size") do count.times do ar.empty? end end x.report("count") do count.times do ar.count == 0 end end x.report("length") do count.times do ar.length == 0 end end end
- 実行結果
user system total real size 0.040000 0.000000 0.040000 ( 0.048787) count 0.060000 0.000000 0.060000 ( 0.058087) length 0.040000 0.000000 0.040000 ( 0.045684)
- 1回あたりの実行時間を nano sec に直してみる。
size 48.787[nano sec] count 58.087[nano sec] length 45.684[nano sec]
参考資料のNumbers Everyone Should Know - High Scalability -によると、Send 2K bytes over 1 Gbps network 20,000 ns
すなわち、2K bytes のデータを 1Gbpsのネットワークで送信した場合 20[micro sec] かかるということなので、
普通の web application を作っているのならば、これらのメソッドの速度の違いはあまり気にする必要はなさそうだ。
また、Railsのアプリケーションログを見てみると、ざっくりこんな感じで1リクエスト毎にms単位の時間がかかっている。
I, [2019-01-10T12:30:21.152318 #21603] INFO -- : [2236aa74-e13c-475e-a42c-5a87dc7fba51] Completed 200 OK in 143ms (Views: 0.4ms | ActiveRecord: 12.7ms)
これと比較したらメソッド毎の nano sec 単位の実行速度の違いなど誤差の範囲である。