コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

bashで処理を一定時間止める

俗に言うスリープ処理だが言い換えてメモる

環境

$ sh --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.

やり方

sleep {{秒数}} でできる。

なお、ミリ秒指定は標準のものはサポートしていない

参考リンク

ActiveRecordのレコード数を測るときはsizeでやると大体がよしなにやってくれる

ソースコードを見ると明白なのでさらっとまじえつつ

sizeとcountの処理の違い

sizeは loaded? でロード状態であればサイズそのものを使う。以下は執筆時点masterのコード

def size
  loaded? ? @records.length : count(:all)
end

いっぽうcountは特に回避コードが書かれているわけで把握実行される。同じく以下が執筆時点のmasterのコード

def count(column_name = nil)
  if block_given?
    unless column_name.nil?
      raise ArgumentError, "Column name argument is not supported when a block is passed."
    end

    super()
  else
    calculate(:count, column_name)
  end
end

大体一連の処理では同じ結果で一貫させたいはずなので、sizeのほうがよい場合がおおいので、ここを頭に入れながら使い分けをしたい。

参考リンク

楽観的ロックと悲観的ロックをざっくりまとめる

言葉としては認識しているが、どういう意図で使われるものかをざっくりまとめる。

そもそも使われる文脈

楽観的ロックと悲観的ロックはデータベースの文脈で使われる。複数人が疲れるときに同時更新に関して策を講じるかどうかの話で使われる。

このときに同時更新を防ぐために他の人の処理を防ぐ排他処理のことをロックと呼ばれ、そのロックの種類を示す。

悲観的ロック

悲観的ロックは別名「悲観的並行性制御(pessimistic concurrency control)」と呼ばれ、同時に更新することを前提した処理。

  • 処理の開始時に他の処理ができないようにする(≒ ロックする)
  • 処理が終わったら他の制御ができるようにする(≒ ロックを外す)

こうすることにより、ほかの作業をブロックするので競合することがない

楽観的ロック

対して楽観的ロックは別名「楽観的並行性制御(optimistic concurrency control)」と呼ばれ、同時に更新することは前提としない制御。

  • 処理の終了時に、他の処理がされたかを確認する
  • 他の処理がされていたら自分がやったことを破棄する

こうすることにより、更新されたもの勝ちとして、他の作業との整合性を担保する

参考リンク

律速という言葉はボトルネックと近い意味で使われる

カタカナ語と漢字のイメージがかけ離れ過ぎてて定着しないのでメモがてら

そもそものボトルネック

e-Wordの説明がキレイだったので引用すると

瓶(bottle)の首(neck)、隘路という意味の英単語。ガラス瓶の口に近い細くなっている部分のことで、液の流量(の最大値)は瓶の容量や他の部分の太さに関わらず、この部分の太さによって決まる。このことから、系全体の中で速度を律する、流れを最も妨げる要素を表す例えとして様々な分野で用いられる。- ボトルネック(ネック)とは - IT用語辞典 e-Words

砂時計のくびれの部分で流量が制限されるので、それで時間を図ることができる、のような意味。

律速ボトルネック

律速の元ネタは化学用語の「律速段階」

化学反応がいくつかの段階を経て進むとき、そのうちで変化速度が最も遅い反応段階。この反応速度で全体の反応速度が支配される。 - 律速段階(りっそくだんかい)とは - コトバンク

律速になる場所が「一番遅くなり、この場所にあわせて全体の速度が決まる」ということなので、ボトルネックとほぼ同じ意味になる。

参考リンク

ActiveRecordの find , find_by , where の使い分け

初学者にいい感じに説明できなかったので、SQLの概念抜きにしてまとめてみる

用途ベースの使い分け方

いずれもModel(ActiveRecord)からデータを取得するために使うものだが まずは大きく2つのうちどちらかになるかを考える

  1. 結果が単一になるものを取りたい
  2. 結果が複数になるものを取りたい

Aの場合、どのように絞り込みたいかによって代わり

  1. サロゲートキーであるID
  2. 複合した条件

の2つで分かれる。この結果を持って

  • A1が find
  • A2が find_by
  • Bが where

といういずれかの選択になる。

また、whereに関しては直接モデルのクラスではなく ActiveRecord::Relation になることも気をつけなければいけない

参考リンク

Gemfileのgemの取得先にGitを指定する場合、branchを指定することができる

雑なメモ

やり方

基本のやりかた

gitで書くときには以下のように書ける。

gem "rails", :git => "https://github.com/rails/rails.git"

branchを加えるやり方

gem "rails", :git => "https://github.com/rails/rails.git", :branch => "6-0-stable" 

補足

いまのbundlerだと :github という指定もできる。

参考リンク

「アクセスがスパイク」などのときに使う「スパイク」の意味

実は一般的な用語ではないということに気づいたのでメモ

意味

瞬間的に従来の量よりも増えることで、折れ線グラフにしたときに急激に数値があがる状態のことを指す

(おそらくの)語源

語源はスパイクノイズかと思われる

電子機器で、スイッチの開閉などに伴って出る、鋭い波形の騒音。 - スパイクノイズとは - コトバンク

この尖った波形と前述の折れ線グラフでの急増が重なった言葉だと思わる

同義の言葉

トラフィックスパイク(TrafficSpike)もほぼ同じ意味で、アクセストラフィックがスパイクするという意味の旨で使われる

関連リンク