-
Rubyのinheritedフックメソッド徹底解説――クラスの継承を制御するテクニック
こんにちは、子どもたちと保護者の皆さん……あれ、Rubyistの皆さんでしたね。以前の記事ではクラスの祖先チェーン(継承チェーン)について掘り下げました。今回は「親としての振る舞い」と継承についてさらに深く踏み込みます。inheritedフックメソッドの仕組みと、継承を禁止する方法について見ていきましょう。子どもが継承するときの基礎知識:inheritedフックメソッドまずは、クラスが親として宣言される瞬間から見てみましょう。Rubyには、あるクラスが別のクラスの親として宣言されたタイミングで、親クラス側から処理を行うための便利な仕組みが用意されています。class Parent def
-
Rubyテンプレート:インタプリタを焼き上げる
コーヒーの上にストループワッフルを温めておいてください。今日は、あの粘着力のある「ストループ」(ストループワッフルの2枚の生地を貼り合わせるシロップのこと)を使って、すべてを組み上げていきます。本シリーズの前半2回では、Lexer(字句解析器)とParser(構文解析器)を焼き上げました。そして今回、ついにInterpreter(インタプリタ)を追加し、ストループを流し込んで全体をひとつにまとめます。材料をそろえるそれでは、キッチンの準備をして材料をテーブルに並べましょう。インタプリタが仕事をするために必要な材料は2つです。1つはこれまでに生成した抽象構文木(AST)、もう1つはテンプレートに
-
Sidekiqの最適化と監視の基本:速度向上のトレードオフを理解する
Sidekiqの最適化や監視に関するご質問をいただくことがよくあります。監視は私たちの得意分野ですが、Sidekiqのパフォーマンス最適化はまったく別の話です。実際のところ、最適化は複雑なテーマですが、まずは一見シンプルに見える答えから見ていきましょう。速度を上げる2つの方法まず、処理速度を上げる方法は大きく分けて2つあります。1つはジョブを大きくする方法(メモリやIOをより多く消費したり、処理が複雑になったりします)、もう1つは同時実行数(concurrency)の設定やワーカー数を調整する方法(CPUをより多く消費し、IOも増加する可能性があります)です。ここで早速現実が立ちはだかります。
-
設定可能なRubyモジュールの作り方:モジュールビルダーパターン徹底解説
本記事では、コードの利用者が自由にカスタマイズできる「設定可能なRubyモジュール」の作成方法を解説します。このパターンを使えば、gemの作者はライブラリに柔軟性を持たせることができます。Ruby開発者の多くは、モジュールを使って振る舞いを共有する手法に馴染みがあるでしょう。公式ドキュメントによれば、これこそがモジュールの主な用途の一つとされています。Rubyにおいてモジュールには2つの役割があります。名前空間の提供と、mixin(ミックスイン)機能です。RailsではActiveSupport::Concernという糖衣構文が追加されましたが、基本的な考え方は変わりません。課題:静的なモジュ
-
【2019年版】AppSignalブログ人気記事トップ10
ストロープワッフル好きの皆さん、こんにちは👋2020年もRuby、Elixir、JavaScriptの記事をさらに発信していくにあたり、私たちは2019年の振り返りを行うことにしました。そこで今回は、Twitterで多くの「いいね」を集めた記事、ブログで最も読まれた記事、そして読者の皆さまから特に高い評価をいただいた記事をランキング形式でご紹介します。1. JavaScriptエラー:その特異な歴史 ✨JavaScriptの誕生から波乱に満ちた成長期までをたどり、現在の言語へと進化した過程を一緒に見ていきましょう。エラー処理の歴史を通じて、JavaScriptという言語の変遷がよくわかる内容
-
Railsアプリケーションでstructure.sqlを使うメリット・デメリット徹底解説
本記事では、Ruby on Railsアプリケーションにおけるstructure.sqlと、デフォルトのschema.rbという2つのスキーマ形式の重要な違いと、それぞれの利点について詳しく解説します。データ駆動型の現代において、データベースが持つ豊富な機能をどれだけ活用できるかは、プロジェクトの成否を左右する大きな要素になります。まず両者の主な違いを確認したうえで、structure.sqlへの切り替え手順を紹介し、さらにデータ整合性の確保や、通常では維持できない高度なデータベース機能の活用にどう役立つのかを実例とともに見ていきます。記事内の例では、PostgreSQLデータベースと組み合わ
-
Railsアプリを高速化する:ビューパフォーマンス最適化の実践ガイド
本記事では、Railsのビューパフォーマンスを改善するための実績ある手法を詳しく解説します。特に、データベースの効率化、ビュー操作、そしてキャッシングの3つの観点に焦点を当てます。「時期尚早な最適化は諸悪の根源である」という言葉は、少し文脈から外れて使われているように思います。コードレビューでシンプルな最適化手法を指摘した際に、開発者がこの言葉を使うのをよく耳にします。「まず動くようにして、後で最適化する」——その後にテスト、デバッグ、再テストと続いていくわけです。しかし幸いなことに、コードを書き始めた瞬間から活用できる、シンプルかつ効果的なパフォーマンス最適化手法が数多く存在します。👋 こ
-
Minitestで始めるRails 6のシステムテスト入門:設定から実行まで徹底解説
本記事では、Rails 6のシステムテストについて詳しく見ていきます。システムテストは、ユーザーがアプリケーションとやり取りする流れを自動的に検証するためのもので、UIに含まれるJavaScriptの動作もテスト対象になります。MinitestはRailsの標準テストフレームワークであり、システムテストとの相性は抜群です。Railsがほとんどの設定を引き受けてくれるため、最初のテストを動かすまでに必要なステップはごくわずかです。システムテストはRails 5.1で導入されました。筆者が実際に使い始めた際、RSpecに関する情報は豊富にあるものの、Minitest向けの最新情報を集めるのが難しい
-
Railsアプリで複数のサブドメインを扱う方法:ルーティング、セッション共有、テストまで徹底解説
本記事では、複数のサブドメインに対応したRailsアプリケーションの構築方法を解説します。例として、ゲームサイト funkygames.co を運営しており、単一のRailsアプリケーションで app.funkygames.co、api.funkygames.co、dev.funkygames.co といった複数のサブドメインをサポートしたいケースを想定します。すべてのサブドメインで適切な認証が行われ、重複するルートが存在しない状態を実現しましょう。Railsが持つ強力なルーティング機能を活用すれば、複数サブドメインへの対応は驚くほどシンプルに行えます。さらに、ローカル環境でのサブドメイン設定
-
RailsのFacadeパターンで実現する、パフォーマンスと保守性の高いアプリケーション設計
今回は「Facade(ファサード)」と呼ばれるソフトウェアデザインパターンについて掘り下げます。最初に採用した頃は少し違和感がありましたが、Railsアプリで使い込むほどにその有用性を実感するようになりました。さらに重要なのは、このパターンのおかげでコードをより徹底的にテストできるようになり、コントローラーをすっきりさせ、ビュー内のロジックを減らし、アプリケーション全体のコード構造について明確に考えられるようになったという点です。Facadeはソフトウェア開発パターンの一つなのでフレームワークに依存しませんが、本記事の例はRuby on Rails向けに記述しています。とはいえ、どのフレームワ
-
AppSignalが実践するシタデル(Citadel)アーキテクチャのすべて
DHH(David Heinemeier Hansson)が「シタデル(Citadel)」という言葉を提唱しました。これは、AppSignalが技術面で採用しているアプローチを表現するのに、まさにうってつけの用語です。「おっ、これは私たちのことだ!私たちのやり方についに名前が付いた」というのが率直な感想でした。「マジェスティック・モノリスに加えて、『ザ・シタデル』というパターンについても誰か書いてくれるといい。単一のマジェスティック・モノリスがアプリケーションの大部分を担い、高度に専門化された特殊なニーズに対応するための少数の補助的なアウトポストアプリが配置される構成だ。」— DHH(@dhh
-
Railsのマイグレーションを徹底解説!仕組みからロールバック、複数DB対応まで
本記事では、Railsのマイグレーションについて深く掘り下げて解説します。マイグレーションをいくつかの要素に分解しながら、効果的なマイグレーションの書き方を学んでいきましょう。複数のデータベースに対応したマイグレーションの書き方や、失敗したマイグレーションへの対処法、ロールバックの手法についても取り上げます。記事全体を理解するには、データベースとRailsに関する基礎的な知識が必要です。マイグレーションの基礎Railsにおけるマイグレーションとは、アプリケーションのライフサイクルを通じてデータベースを進化させていくための仕組みです。洗練されたDSL(ドメイン固有言語)を提供しており、プレーンな
-
Ruby on Railsにおけるサービスオブジェクトの活用ガイド
本記事は、書籍『Playbook Thirty-nine - A Guide to Shipping Interactive Web Apps with Minimal Tooling』に掲載された内容をもとに、AppSignalのゲスト投稿向けに加筆・調整したものです。アプリケーションには多くの機能が求められますが、そのロジックが必ずしもコントローラーやモデルに属するとは限りません。たとえば、カートを使ったチェックアウト処理、サイトへのユーザー登録、サブスクリプションの開始などがその典型例です。こうしたロジックをすべてコントローラーに書くこともできますが、同じコードをあちこちで繰り返し呼び出
-
AppSignalのメトリクスを活用してキューワーカーを効率的にスケーリングする方法
多くのWebアプリケーションは、バックグラウンドキューを導入することで大きなメリットを得られます。バックグラウンドジョブは、エラーが発生しやすい処理や時間のかかるサイドタスクを捌くために広く使われており、その用途はメール送信からキャッシュの更新、さらには中核となるビジネスロジックの実行まで多岐にわたります。バックグラウンドキューイングシステムが処理すべきジョブ数を増やしていくにつれ、それらを処理するワーカーのプールも合わせてスケールさせる必要があります。ジョブのエンキュー率が変動する環境では、処理速度を維持するためにワーカー数を増やすことが重要なポイントになります。さらに、キューのスループット
-
Ruby on Railsのパターンとアンチパターン入門 ― MVCの落とし穴とリファクタリングの基本
Ruby on Railsのパターンとアンチパターンに関するシリーズの第1回へようこそ。このシリーズでは、Railsアプリケーションの開発で遭遇しがちなさまざまなパターンについて、各回でじっくりと掘り下げていきます。今回はまず、「(デザイン)パターンとは何か」そして「アンチパターンとは何か」を解説します。説明を分かりやすくするために、長い歴史を持つRuby on Railsフレームワークを例に取り上げます。もし何らかの理由でRailsが好みでない方も、ご安心ください。ここで紹介する考え方(パターン)は、あなたが最終的に使うどんな技術にも応用できるはずです。しかし、パターンとアンチパターンの説明
-
RailsのConcerns(関心事):使うべきか、使わざるべきか
Ruby on Railsを使ったことがあるなら、concernsという概念に出会ったことがあるはずです。新しいRailsプロジェクトを作成すると、必ずapp/controllers/concernsとapp/models/concernsというディレクトリが用意されています。では、concernsとは一体何なのでしょうか?そして、なぜRailsコミュニティの人々の中には、concernsについて否定的な意見を述べる人がいるのでしょうか?クイック概要RailsのConcernとは、ActiveSupport::Concernモジュールをextendしたモジュールのことです。「モジュールと何が違
-
StatsDとAppSignalスタンドアロンエージェントでシステム全体を監視する方法
アプリケーション本体だけを監視していても、システム全体の状況を把握できるとは限りません。衛星アプリ(補助アプリ)として動作するサービスが、日々の運用に深刻な影響を与えるケースは少なくありません。データベースサーバーはその代表例です。また、バックアップスクリプトやその他のバックグラウンドジョブもシステムを遅延させる原因となり得ますが、見落とされがちです。Node.js向けAppSignal APM、Ruby APM、Elixir APMは、アプリケーションそのものを自動的に計測します。しかし、デフォルトの状態ではこれらの衛星プロセスまでは監視されません。監視範囲をシステム全体に広げ、すべてのデー
-
名前空間(Namespace)でモノリシックアプリケーションの監視データを構造化する方法
名前空間とは?AppSignalで監視しているアプリケーション内で発生するすべての出来事は、何らかの名前空間(namespace)に記録されます。名前空間はフォルダのような役割を果たし、イベントやインシデント、監視データを管理しやすい単位にグループ化してくれます。デフォルトでは、すべてのアプリケーションは web、background、frontend の3つの標準名前空間から始まります。web:すべてのHTTPリクエストがここに記録されます。RailsやSinatraのようなMVC指向のフレームワークでは、コントローラのアクションが該当します。background:バックグラウンドジョブ、ラ
-
Ruby on Railsモデルのパターンとアンチパターン徹底解説
Ruby on Railsのパターン&アンチパターンシリーズ第2弾へようこそ。前回の記事では、パターンとアンチパターンの基本的な概念を解説し、Rails界隈でよく知られているものをいくつかご紹介しました。今回は、Railsのモデルにおける代表的なアンチパターンと、それに対する改善パターンを見ていきます。 モデルの設計に日々悩んでいる開発者の方にとって、この記事はきっと役立つはずです。まずはモデルを「ダイエット」させる手法を手短に紹介し、最後はマイグレーションを書く際に避けるべきポイントで締めくくります。それでは早速始めましょう。 Fat 肥大化したモデル Railsアプリケーションを開発してい
-
サブドメインで実現するマルチテナントRuby on Railsアプリの構築完全ガイド
マルチテナンシーとは、1つのソフトウェアインスタンスを複数のユーザーグループ(テナント)が共有して利用する形態のことを指します。マルチテナンシーに対応したアプリの優れた例として、Jiraプラットフォームが挙げられます。Jiraでは各企業が mycompany.atlassian.net のような独自のサブドメインを持ってソフトウェアへアクセスします。本記事では、マルチテナンシーの理論と実践の両面について解説します。アプリケーションに複数テナント対応を実装するための代表的なアプローチをいくつか紹介した後、そのうち2つを実際にRailsアプリケーションへ実装する方法をお見せします。各テナントが独自