u16suzuの blog

日々学んだことのメモブログです。

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コマンド部分も含めて、Rubyスクリプト化しました。

`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 単位の実行速度の違いなど誤差の範囲である。

参考資料