-
Railsの組み込みキャッシュストア徹底解説:File・Memory・Memcached・Redisの違いと使い分け
新しいRailsアプリケーションを生成すると、キャッシュ機能はすでにセットアップされています。そのため、ビューの断片をcacheヘルパーで囲んだり、Rails.cache.fetchを使って外部APIの結果を保存したりするだけで、すぐにキャッシュを活用し始められます。キャッシュされたデータは、Railsのいずれかのキャッシュストアに保存され、メモリ内、Memcached、Redis、さらにはディスクへの直接書き込みなど、さまざまな保存先を選択できます。しかし、複数あるキャッシュストアの中で、どれがどのような状況に最適なのでしょうか?この記事では、それぞれの選択肢について詳しく見ていきます。👋
-
ActiveRecordのパフォーマンス改善:N+1クエリ問題というアンチパターンを理解する
AppSignalでは、アプリケーションのパフォーマンス向上を開発者の皆様にサポートしています。私たちは数十億ものリクエストを処理する膨大な数のアプリケーションを監視しており、その経験から、Rubyとパフォーマンスに関する知見をブログ記事としてお届けできればと考えています。本記事で取り上げる「N+1クエリ問題」は、Railsアプリケーションで非常によく見られるアンチパターンです。RailsのActiveRecordをはじめとする多くのORMには、遅延読み込み(Lazy Loading)が組み込まれています。これにより、関連するレコードへのクエリを実際に必要となる瞬間まで延期できます。どの関連を
-
Railsのクライアントサイドキャッシュ入門:条件付きGETリクエストとETagの活用法
ロシアン人形(Russian doll)キャッシュ以外にも、Railsアプリケーションのパフォーマンスを向上させる手法は数多くあります。本記事では、Railsに標準で組み込まれている「条件付きGETリクエスト(Conditional GET)」の仕組みを取り上げます。これを活用すれば、レンダリング済みのページをユーザーのブラウザキャッシュに保存できるようになります。 💡 キャッシュ以外のパフォーマンス改善についてさらに学びたい方は、Ruby(on Rails)のパフォーマンスに関する記事も多数公開しています。ぜひ「Rubyパフォーマンス監視チェックリスト」もあわせてご覧ください。 ETagヘ
-
Rubyの例外処理をマスターする:ensure、retry、そして例外の再発生
発生した例外はrescueで捕捉し、問題が起きた際に別のコードパスを実行できますが、例外処理の方法はそれだけではありません。今回のAppSignal Academyでは、retryとensureキーワードの使い方を解説し、さらに捕捉した例外を再発生させる(reraise)方法についても見ていきます。 ここでは、信頼性の低いWeb APIと通信する場面を想定してみましょう。そのAPIはたまにダウンするだけでなく、動作が非常に遅く、リクエストに数秒かかることもあります。私たちのライブラリはこのAPIに依存しているため、できる限り耐障害性を高める必要があります。 ensureで後処理を保証する en
-
Turbolinksでアプリのナビゲーションを高速化する方法を徹底解説
Turbolinksは、ページの切り替えやアセットの再読み込みを賢く制御することで、アプリの体感パフォーマンスを向上させる最適化技術です。条件付きGETリクエストとは異なり、Railsアプリ本体のRubyコードに一切変更を加える必要がありません。Turbolinks 5はJavaScriptライブラリとして、Railsを使っていない静的ページを含むあらゆる環境で動作し、未対応のブラウザでは自動的にフォールバックします。 Turbolinks 5とは TurbolinksはRails 4以降、新しいアプリケーションにデフォルトでバンドルされてきました。そしてRails 5には、現在「Turbol
-
Rubyの魔法を解き明かす:Enumerableモジュールの仕組みと使い方
Ruby Magicの新しいエピソードへようこそ!今回は、Rubyが最も「魔法」と呼ぶにふさわしい機能の一つ、Enumerableモジュールについて掘り下げます。このモジュールは、ArrayやHash、Rangeといった列挙可能なクラスで日常的に使うメソッドの大半を提供しています。この記事を通じて、列挙可能なオブジェクトで何ができるのか、列挙の仕組みはどうなっているのか、そしてたった一つのメソッドを実装するだけで独自クラスを列挙可能にする方法まで学べます。 Enumerable、#each、そしてEnumerator 「列挙(enumeration)」とは、オブジェクトを順番にたどっていくこと
-
Rubyのredo・retry・nextキーワード徹底解説!ループと例外処理の制御方法
例外発生後の再試行について解説した際に、retryキーワードについて触れました。今回はあまり知られていないその仲間であるredoを紹介します。redoも似たような動作をしますが、ブロック全体ではなくループのイテレーション(繰り返し)を再実行する点が異なります。redoキーワードとは前回のAcademy記事で学んだように、retryを使うとブロック内のコードを再試行できます。begin puts Iteration raise rescue retry endこの例では、例外を発生させる前にコンソールに「Iteration」という文字列が出力されます。その後rescue節が実行され、
-
RailsのActiveRecordカウンターキャッシュでN+1クエリ問題を解決する方法
ページが読み込まれるたびにデータベースで関連レコードを数える代わりに、ActiveRecordのカウンターキャッシュ機能を使えば、カウンターを保存しておき、関連オブジェクトが作成・削除されるたびに自動的に更新できます。この記事では、ActiveRecordでカウンターをキャッシュする方法について詳しく解説します。基本となる例:ブログ記事とレスポンス記事とレスポンスを持つブログを例に考えてみましょう。各記事にはレスポンスが紐づいており、ブログのインデックスページで各記事のタイトルの横にレスポンス数を表示して、人気度を示したいとします。# app/controllers/articles_cont
-
Rubyの内部構造:ファイルの「スラーピング」とストリーミング処理
今回のRuby Magicでは、Rubyにおけるファイルのストリーミング処理について学びます。IOクラスがどのようにファイルをメモリに完全に読み込まずに処理するか、またバッファリングを用いて行単位で読み込む仕組みを解説します。さっそく始めましょう! 「スラーピング」とストリーミング RubyのFile.readメソッドは、ファイルを読み込みその全内容を返します。 irb> content = File.read(log/production.log) => I, [2018-06-27T16:45:02.843719 #9098] INFO -- : [86a5d18c-19dd
-
JavaScriptスプリンクルでRailsアプリケーションを高速化する方法
Railsのフラグメントキャッシュは、ページのより多くの部分がキャッシュされるほど大きな速度向上をもたらします。しかし、動的なコンテンツやユーザー固有のコンテンツが多いページでは、その恩恵を受けにくくなります。そこで有効なのが「JavaScriptスプリンクル」という手法です。オランダのパンにふりかけるチョコ菓子「ハーゲルスラッハ」のように、ページ全体にさっとJavaScriptを振りかけるイメージで、ページの残りの部分はキャッシュから直接配信し、ユーザー固有のコンテンツだけを追加リクエストで後から読み込みます。フラグメントキャッシュとはRailsアプリケーションでは、レンダリングされたページ
-
Rubyマジック サマー特集:AppSignal Academy 厳選ベスト記事
子どもの頃、分厚い合冊版の漫画を買って読んだときの、あの魔法のような体験を覚えていますか?この記事がそれと同じくらい忘れられないものになるとまでは言いませんが、ビーチでも、公園でも、のんびりした日曜日の午後でも楽しめる、内容たっぷりの「AppSignal Academy ベストセレクション」をご用意しました。きっとあなたの一日を素敵なものにしてくれるはずです。 それでは、ハンモックで読むのにぴったりな厳選トップ5記事をご紹介します。 Rubyにおけるカスタム例外 Rubyではほぼすべてがオブジェクトであり、エラーもその例外ではありません。……ダジャレでごめんなさい。実際には、独自の例外クラスを
-
Rubyで乱数を生成する方法まとめ:rand・srand・Randomクラスから正規分布、SecureRandomまで
乱数は、ゲーム開発、暗号化、シミュレーションの構築など、さまざまな場面で活用される重要な要素です。しかし技術的に言えば、コンピュータは純粋な計算によって真の乱数を生成することはできません。決定論的なデバイスで真にランダムな値を作り出すことは根本的に不可能であり、私たちが扱えるのは、あたかもランダムに生成されたように見える数値の連なり、すなわち「疑似乱数」だけです。 本記事では、Rubyで乱数を生成するためのさまざまな方法を紹介します。 Kernel#randで乱数を生成する まずは最も基本的なrandメソッドから始めましょう。randを引数なしで呼び出すと、0.0以上1.0未満の浮動小数点数が
-
Rubyのオブジェクト生成を自由にカスタマイズする方法 ― newとallocateの仕組みを深掘り
Rubyの魅力のひとつは、ほぼすべての挙動を自分のニーズに合わせてカスタマイズできる点です。これは非常に便利であると同時に危険でもあります。うっかり足を撃ってしまう(自滅してしまう)ことも簡単に起こり得ますが、慎重に使えば強力なソリューションにつながります。この記事では、Rubyがどのようにオブジェクトを生成・初期化しているのかを解説し、そのデフォルトの動作をどう変更できるのかを見ていきます。クラスから新しいオブジェクトを生成する基本まずは、Rubyでオブジェクトを生成する基本的な方法から確認しましょう。新しいオブジェクト(またはインスタンス)を作成するには、クラスに対してnewを呼び出します
-
Railsのコレクションキャッシングでビューのレンダリングを高速化する方法
AppSignal Academyでは以前、Railsのフラグメントキャッシングについて取り上げました。フラグメントキャッシュはビューの小さな断片をキャッシュすることでパフォーマンスを大きく向上させます。さらに、パーシャルをキャッシュしておけば、同じパーシャルをビューの他の場所でもほぼコストなしで再利用できるというメリットもあります。 この手法は小さなコレクションでは十分に機能しますが、コレクションが大きくなるとすぐに問題が表面化します。本記事では、Railsのコレクションキャッシングの仕組みと、それを活用して大規模なコレクションのレンダリングを高速化する方法を解説します。 👋 この記事が気
-
Rubyで学ぶリアルタイム通信:プッシュ、Pub/Sub、WebSocketの仕組み
Railsでリアルタイム機能を実装するのは、Action Cableのようなライブラリのおかげで格段に簡単になりました。このAppSignal Academyの記事では、リアルタイム更新の実装方法を掘り下げながら、最小構成のWebSocketサーバーを実際に構築し、その内部動作(アンダー・ザ・フード)を探っていきます。 今回構築するアプリケーションは、データをプッシュで送信し、Pub/Sub(パブリッシュ/サブスクライブ)モデルをWebSocket上で利用します。コードに入る前に、まずこれら3つの概念について整理しておきましょう。 プッシュ(Push):受信側がデータをポーリング(定期的に問
-
Rubyのクロージャ入門:ブロック、Proc、Lambdaの違いを徹底解説
Ruby Magicでは、日常的に使っている機能の裏側にある仕組みを掘り下げて理解することを大切にしています。今回のテーマは、ブロック(block)、Proc、ラムダ(lambda)の違いについてです。 第一級関数(ファーストクラス関数)を持つプログラミング言語では、関数を変数に格納したり、他の関数に引数として渡したりできます。さらに、関数が別の関数を戻り値として返すことさえ可能です。 クロージャとは、「環境」を持つ第一級関数のことです。環境とは、クロージャが生成された時点で存在していた変数へのマッピングを指します。クロージャは、たとえそれらの変数が別のスコープで定義されていても、その変数への
-
RubyとRailsの#nil?、#empty?、#blank?、#present?の違いを徹底解説
RubyとRailsには、値の存在確認やオブジェクトの状態チェックに使えるメソッドがいくつかあります。Rubyには#nil?と#empty?が用意されており、RailsのActiveSupportはさらに#blank?と#present?を追加しています。これらはそれぞれ異なる挙動をするため、各メソッドがどのようにデータを評価するのかを理解しておくことが重要です。誤ったメソッドを選ぶと、予期しない結果やバグにつながる可能性があります。この記事では、これら4つのメソッドについて知識を整理します。それぞれのメソッドがどのような条件でtrue/falseを返すのか、またどの種類のオブジェクトに対して
-
#to_s か #to_str か?Rubyの型変換を徹底解説:明示的キャストと暗黙的型強制の違い
型強制(type coercion)とは、オブジェクトの型を、その値も含めて別の型へ変換することです。たとえば、#to_s を使って Integer を String に変換したり、#to_i を使って Float を Integer に変換したりするのが典型例です。一方、一部のオブジェクトが実装している #to_str や #to_int といったメソッドは、一見すると同じ働きをするように見えますが、実際には重要な違いがあります。本記事では、Rubyにおける「明示的なキャスト」と「暗黙的な型強制」の違いを詳しく掘り下げ、両者がそれぞれどのような場面で使われるのかを解説します。まずは、Ruby
-
ActiveRecord vs Ecto 徹底比較(前編):マイグレーションとデータマッピングの違い
データは、ほとんどのソフトウェアアプリケーションの中核を担う要素です。データベースからデータをマッピングし、クエリを実行することは、開発者の日常業務で繰り返し発生するタスクです。だからこそ、そのプロセスを深く理解し、作業を簡素化してくれる抽象化ツールを使いこなせることが重要になります。 本記事は2部構成シリーズの第1回目として、RubyのActiveRecordとElixirのEctoを比較します。両ツールが、開発者によるデータベーススキーマのマイグレーションやマッピングをどのように支援しているのかを見ていきましょう。 これはいわば「リンゴとオレンジの比較」です。一言も発する必要のなかった初代
-
Rubyのクラスレベル・インスタンス変数の魔法 ― 再利用可能なWrappableモジュールを作る
前回のRuby Magicでは、.newメソッドをオーバーライドすることでクラスに確実にモジュールを注入し、メソッドを追加の振る舞いで包む(ラップする)方法を解説しました。今回はその一歩先へ進みます。この振る舞いを独立したモジュールとして切り出し、再利用できる形にしていきます。Wrappableモジュールを作成してクラス拡張を自動的に処理できるようにしながら、その過程で「クラスレベルのインスタンス変数」について徹底的に学んでいきましょう。それでは早速始めます!Wrappableモジュールのご紹介オブジェクトが初期化される際にモジュールでラップするには、どのモジュールを使うのかを事前にクラスへ伝