dogwood008の開発メモ!

最近のマイブームは機械学習, Ruby on Rails。中でも機械学習を使った金融商品の自動取引に興味があります。

【ActiveRecord】ActiveModel::Model#allはやめておいた方が良い

要旨

find_each を使おう。 batch_size を指定すれば、一度に取得するレコード数を制限できる。

Model.find_each(batch_size: 100) do |model|
  ~~~
end

詳細

#all は、一度に全てのレコードを取得するので、まずデータベースに負荷がかかってしまう。さらにその結果を全てメモリ上に展開するので、Railsにも負荷がかかってしまう。

find_each を使えば、一度に取得してくるバッチサイズを指定することで、大量のレコードを取得してしまうことを防げる。

参考

railsguides.jp

【Nuxt】asyncDataとfetchの用途の違い

背景

asyncDatafetchも、どちらも非同期にデータを外部サーバへ取りに行く処理を定義するための関数である。どちらも似たような処理ができるものの、2つ用意されているという事はそれぞれに異なる用途がある事を示す。

ここではCSR (Client-Side Rendering) の場合を考えるものとする。

asyncDatafetch の違い

asyncDatafetch より先に呼ばれる

asyncDatabeforeCreate フックの手前で呼ばれる。一方で、 fetchcreated の後で呼ばれる。したがって、 asyncData の中で return した値は fetch の中で利用可能だが、その逆はできないということになる。

よりわかりやすいライフサイクルの説明が公式から提供されているので、参考にされたい:

ライフサイクルの説明
ライフサイクルの説明

クリエイティブ・コモンズ・ライセンス
この図は クリエイティブ・コモンズ 表示 - 改変禁止 4.0 国際 ライセンスの下に提供されています。 (c) NuxtJS

fetchthis にアクセスできるが、 asyncData はできない

asyncData では this が提供されない。その代わりに、 context にアクセス可能である。だいたいのことは context で提供されるいずれかの引数でできると思われる。

結局、どんな時にどっちを使えば良いのか

asyncDatareturn することで、 this に値を定義することができる。一方、 fetchdata で定義した値を変更することまでしかできず、新規に定義するところまではできない

こう見ると asyncData を使っておけば良さそうに見えるが、 Component の中では asyncData を使用できない制限があるので、その場合は fetch を使う必要がある。

参考

nuxtjs.org

zenn.dev

designsupply-web.com

qiita.com

nuxtjs.org

【Shell】変数が未定義の時、エラーを出して止めるには ${VAR_NAME?}

要旨

$ export SOOME_VALUE=abcde
$ echo ${SOME_VALUE?}
sh: SOME_VALUE: parameter null or not set

SOME_VALUE を定義したつもりで、できていないときに気付くことができる。

詳細

変数名の後ろに ? を付けると、その変数が定義されていないときにエラーを出して止まってくれる。

値が入っていないといけないような変数であれば、 ? を付けておけば呼び出された場合に値が入っている事を保証できる。

【JavaScript】オブジェクト同士の比較:{} === {} は false

概要

{}  === {}  // => false

詳細

JavaScriptでの比較は、落とし穴が多い。詳しくは参考に挙げたページを見てもらえるとわかるが、 +0 === -0false になったりと良く知っていないとハマりがちである。

ではどうやって object 同士を比較すれば良いか、というのが気になるが、一番確実なのは object のうち、どれを比較すれば良いかを自分で管理して、それを比較するのが良いのではないだろうか。例えば、Userを表す object を比較する際は、 user.id 同士を比較するといった具合である。

なお、Rubyであれば Object#==? のオーバライド、Pythonであれば __eq__ のオーバライドすることで、オブジェクト同士が比較された際の挙動を変えられる。

参考

developer.mozilla.org

【Ruby】文字列をメソッド名として実行する

要旨

method('some_method').call(arg1, arg2)

詳細

methodに String, Symbol を渡すと、 Method オブジェクトが返る。これに対して Method#call を呼ぶと、そのメソッドを実際に呼ぶ事ができる。

呼びたいメソッドに引数を渡したい場合、 call(arg1, arg2, ...) のように call に引数を渡してやれば良い。

また、特定のClassのインスタンスメソッドを呼びたいときは、 some_instance.method(:method_name).call のように呼べば良い。

クラスメソッドの場合は、 Class.method(:method_name).call のように呼べば良い。

参考

docs.ruby-lang.org

docs.ruby-lang.org