Proc/begin式/tapによるインスタンス生成方法の比較
独自のLoggerクラスを実装する時をはじめ、インスタンスの生成とインスタンスメソッドの実行をまとめて行いたいケースがあります。具体的には以下のようなコードです。 class MyLogger def self.logg…
独自のLoggerクラスを実装する時をはじめ、インスタンスの生成とインスタンスメソッドの実行をまとめて行いたいケースがあります。具体的には以下のようなコードです。 class MyLogger def self.logg…
tapは『selfを引数としてブロックを評価する』『返す値はブロックの評価値ではなくself』という特徴をもつメソッドです。1 今回はtapの利用例について紹介をします。 メソッドチェインの途中結果を確認する tap内の…
Procクラスはブロックをオブジェクト化するクラスです。 Procオブジェクトとは、Procクラスを利用してオブジェクト化されたブロックのインスタンスのことを指します。 Procオブジェクトを利用することでブロックの評価…
Rubyにおけるbegin式の一般的な利用方法はrescue節を組み合わせた例外処理です。 しかし、begin式には『式全体の評価値は本体/rescue節/else節のうち最後に評価された文の値』という特徴があります。 …
メソッドにブロックを渡し、渡されたブロックをメソッド内で実行する方法には以下の3つがあります。 今回は上記の各方法について紹介します。 Procオブジェクトをブロック引数として渡し、メソッド内でブロック引数を利用する方法…
Procについて Procクラスはブロックをオブジェクト化するクラスです。 つまりProcオブジェクトとは、Procクラスを利用してオブジェクト化されたブロックのインスタンスのことを指します。 ブロック単体だけではオブジ…
nil? nil?はRubyのメソッドです。 nilの場合true、それ以外はfalseを返します。 “”(空文字)、” “(空白)、[](空配列)、{}(空ハッシュ)などもfalseになるため、純粋にnilをチェックし…
present?について present?は真偽値を返すRailsのメソッドです。 nil, false, “”(空文字), ” “(空白), [](空配列), {}(空ハッシュ)の場合にfalse、それ以外の場合にtr…
N+1カウントクエリとは、取得したN件のデータそれぞれに対してcountクエリが発行される現象のことを指します。 以下はN+1カウントクエリの例です。取得したN件のauthorに対してcountクエリが実行されていること…
N+1カウントクエリとは、取得したN件のデータそれぞれに対してcountクエリが発行される現象のことを指します。 以下はN+1カウントクエリの例です。取得したN件のauthorに対してcountクエリが実行されていること…
前回、counter_cacheでN+1カウントクエリを解消する手順でRailsの標準機能であるcounter_cacheを利用してN+1カウントクエリを解消する方法について紹介しました。 今回はcounter_cach…
N+1カウントクエリが発生している状態とは N+1カウントクエリとは、取得したN件のデータそれぞれに対してcountクエリが発行される現象のことを指します。 以下はN+1カウントクエリの例です。取得したN件のauthor…
belongs_toで紐づいているActive Recordの関連付けキーで検索をしたい場合は、当該カラムの値の代わりActive Recordモデルを検索条件に利用できます。1 たとえば以下のような1対多で紐づいたAu…
分割してデータを読み込むことでメモリの消費を抑える eachはデータをすべてメモリにのせてからループ処理を実行するため、可能性があります。 たとえば以下の例では、booksテーブルの全レコードがActive Record…
CSVを分割して読み込むことでメモリの消費を抑える 【Rails】in_batches、find_in_batches、find_eachの違いと使いどころで紹介したように、eachはデータをすべてメモリにのせてからルー…
検証環境のrubyのバージョンは2.7.1です。 通常の引数 通常の引数は以下の通りです。 メソッドで引数名を定義し、メソッド呼び出し時に値を設定します。 def message(greet, name) “#{gree…
eachはデータをすべてメモリにのせてからループ処理を実行するため、可能性があります。 たとえば以下の例では、booksテーブルの全レコードがActive Recordオブジェクトに変換され、全オブジェクトをまとめた配列…
ssh-agentを利用すると、リモートサーバに秘密鍵をコピーしなくてもローカル環境の秘密鍵の情報を利用できます。 今回はリモートサーバからGitHubにSSH接続する環境を構築する例をもとにssh-agentの利用方法…
サーバが重いときのボトルネックの見つけ方と対応方法について紹介します。 ボトルネックの種類 ボトルネックには以下の種類があります。 外的要因とは重くなっているサーバ自身ではなくリモートホストやDNSなどに問題があるケース…
行ロックを利用してレコードを参照する方法をロッキングリードと呼びます。ロッキングリードを利用することで参照レコードの情報を保護できます。 ロッキングリードには共有ロックを利用するSELECT … LOCK IN SH…
MySQLのデータベースエンジンにはMyISAMとInnoDBがあります。 InnoDBにはレコード単位のロック『行ロック』が実装されています。 行ロックが実行されているテーブルにアクセスする場合、行ロック中のレコード以…
InnoDBはMySQLのデータベースエンジンの1つです。InnoDBの行ロックには共有ロック(Sロック)と排他ロック(占有ロック、Xロック)の2種類があります。1 今回は共有ロックと排他ロックの概要と、ロック時の挙動に…
pluckやmapを利用することで、Active Recordモデルから特定の要素を取り出せます。 今回はpluckとmapの使い分けについて紹介します。 pluckについて pluckはRailsのメソッドです。引数で…
Rubyの実装で利用されるメモリを計測する方法には主に以下の2つがあります。 今回は上記2つの具体的な利用方法について紹介します。 なおObjectSpaceモジュールには『任意のオブジェクトのメモリを使用量を計測するm…
検索条件によってはSQLでインデックスが利用されないケースがあります。 達人に学ぶDB設計 徹底指南書などでインデックスが利用されないと一般的に言われているケースは以下の通りです。 しかし手元で検証してみたところ上記のう…
新規テーブルの作成やクエリチューニング時にインデックスを作成する機会があります。 インデックスを作成することでSQLの実行時間を短くできます。 そこで今回はインデックスを作成する際のチェックポイントについて紹介します。 …
SQLのJOINで利用される代表的な結合方法にはNested loop join(NLJ、ネステッドループ結合)、Merge join(マージ結合、ソートマージ)、Hash join(ハッシュ結合、ハッシュ値マッチング)…
複合インデックス(結合インデックス)とは複数のカラムを組み合わせたインデックスのことをいいます。 検索やソート条件で一緒に利用されるカラムに対して複合インデックスを作成することでクエリの高速化が期待できます。 複合インデ…
前回、MySQLのEXPLAINの読み方とチューニング時のチェックポイントでEXPLAINの読み方について紹介しました。 スロークエリを引き起こす最も多い原因のひとつが『正しくインデックスが作成・利用されていない』です。…
EXPLAINを実行することでSQLの実行計画が取得できます。クエリのチューニングにおいてEXPLAINの理解は必須です。 今回はEXPLAINの読み方とクエリをチューニングする際のチェックポイントについて紹介します。 …
アプリケーションの性能や検証をする際に、1対多の関係を持つダミーデータを大量に用意したい時があります。 Rails 6から利用できるinsert_allメソッドを利用すると大量のデータを短時間でインサートできます。 また…
Railsアプリケーションでバルクインサート(複数のレコードを一括でインサートする方法)を実現する場合、Rails 6以前はactiverecord-importを利用する必要がありました。 Rails 6からはバルクイ…
Fakerを利用すると簡単にダミーデータが作成できます。 今回はFakerの利用してRailsアプリケーションにダミーデータを作成する方法について紹介します。 Fakerの利用方法 gemをインストールします。 Gemf…
画像をはじめとした静的コンテンツをキャッシュし、Webサーバから配信することでアプリケーションのパフォーマンス向上が期待できます。 今回はnginxで静的コンテンツをキャッシュ配信する方法について紹介します。 nginx…
前回、Ruby標準のBenchmarkモジュールを利用したベンチマークの実行・確認方法でRuby標準のBenchmarkモジュールを利用したベンチマークテストの実行方法について紹介しました。 今回は、Benchmarkモ…
Rubyの標準で用意されているBenchmarkモジュールを利用するとベンチマークテストが実行できます。 今回はBenchmarkモジュールを利用したベンチマークテストの実行および結果の確認方法について紹介します。 Be…
Stackprofは『どのメソッドにどれくらいの時間がかかっているか』を解析できるgemです。 今回はStackprofの利用方法について紹介します。 なお、Stackprofはflamegraphと組み合わせることで解…
Railsアプリの計測用gemで有名なrack-mini-profilerのインストール方法および利用方法について紹介します。 rack-mini-profilerで計測できること rack-mini-profilerは…
rblineprofは計測対象のファイルに計測用のコードを埋め込むことで行単位のプロファイリングが行えるgemです。 rblineprofの利用方法については【Ruby】rblineprofで行単位の計測を行う方法で紹介…
前回、【Ruby】rblineprofで行単位の計測を行う方法でrblineprofを利用したRubyのプロファイリング方法について紹介しました。 rblineprofを利用すると、計測対象のファイルに計測用のコードを埋…