上級者向け

JavaScript

【Nuxt.js】Nuxtプロジェクトのディレクトリ構成のベストプラクティス(Next.jsとの対比)

こんにちは、かつコーチです。Nuxtシリーズもいよいよ最終回です。これまでpages・layouts・composables・server/apiなど、各ディレクトリの役割を個別に解説してきました。今回はそれらを俯瞰し、大規模プロジェクトで...
JavaScript

【Nuxt.js】useFetchがSSR/CSRで二重に実行されてハマった話

こんにちは、かつコーチです。先日、案件で作っていた管理画面で、useFetchが同じAPIを2回叩いていることに気づきました。ネットワークタブを見ても1回しか通信していないのに、サーバーログには同じリクエストが2件記録されていました。原因を...
JavaScript

【Nuxt.js】nuxt-auth-utilsで認証機能を実装する

こんにちは、かつコーチです。Nuxtでアプリを作っていると、必ずぶつかるのが認証機能の実装です。自前でCookieやセッションを設計してもいいのですが、OAuth連携やパスワードハッシュ化まで含めると、意外と実装コストが高くなります。今回は...
JavaScript

【Vue】Piniaの実践:ストアの分割と設計

こんにちは、かつコーチです。前回はPiniaの基本的な使い方を解説しました。今回は一歩進んで、実際のアプリ規模を想定した「ストアの分割と設計」を扱います。小さいアプリでは1つのストアで十分ですが、機能が増えてくると必ず「ストアをどう分けるべ...
Python

【Python】コンテキストマネージャ(with文)の仕組みと自作方法

こんにちは、かつコーチです。with open("file.txt") as f:というコードは頻繁に書くものの、裏側の仕組みまでは説明できない、という方は少なくないと思います。「なぜwithを使うとファイルを閉じ忘れないのか」「自分でwi...
JavaScript

【Vue】Vueアプリに認証機能を実装するパターン

こんにちは、かつコーチです。前回までのデータ連携編で、axios・VueUse・VeeValidateを使ったAPI連携とフォーム実装を扱いました。ここからは認証・セキュリティ編に入ります。第一弾は、Vueアプリに認証機能を組み込む際の代表...
Ruby

【Ruby on Rails】シンプルなTodoアプリを作ってみる

こんにちは、かつコーチです。これまでルーティング・ActiveRecord・バリデーション・アソシエーション・Service Objectと、Railsの要素を1つずつ解説してきました。今回はその総まとめとして、シンプルなTodoアプリを実...
Ruby

【Ruby on Rails】プロジェクトのディレクトリ構成のベストプラクティス

こんにちは、かつコーチです。前回まで、Service ObjectやConcernといった設計パターンを解説してきました。これらのクラスを実際に配置する際、標準のappディレクトリだけでは受け皿が足りなくなります。今回は、大規模なRails...
Ruby

【Ruby on Rails】Concern(関心の分離)の使い方

こんにちは、かつコーチです。複数のモデルやコントローラに同じようなコードが増えてきたとき、RailsにはConcernという共通化の仕組みが用意されています。ActiveSupport::Concernを使うと、モジュールの形で関心事を切り...
Ruby

【Ruby on Rails】Fat Controller/Fat Modelを避けるためのService Objectパターン

こんにちは、かつコーチです。Railsで開発を続けていると、コントローラやモデルがどんどん肥大化していく問題に必ず突き当たります。いわゆるFat Controller(処理を詰め込みすぎたコントローラ)やFat Model(責務が多すぎるモ...
Ruby

【Ruby on Rails】System SpecでE2Eテストを書く

こんにちは、かつコーチです。モデル単体のテストは書けても、ブラウザ操作を再現するE2Eテストとなると、設定の複雑さで挫折した経験がある方も多いのではないでしょうか。この記事では、CapybaraベースのSystem Specの設定と、実践的...
Ruby

【Ruby on Rails】Deviseで本格的な認証機能を実装する

こんにちは、かつコーチです。自前で認証機能を作っていると、パスワードリセットやメール確認、アカウントロックなど、実装すべき機能がどんどん増えていきます。この記事では、認証gemの定番であるDeviseの導入手順と、実務でよく使う設定を整理し...
Ruby

【Ruby on Rails】N+1問題とincludesでの解決方法

こんにちは、かつコーチです。開発中は問題なく動いていたのに、本番データが増えた途端に画面表示が極端に遅くなる。Railsを使っていると一度は経験する現象ですが、その原因の多くがN+1問題(関連データを取得する際に、1件ごとに追加のクエリが発...
Ruby

【Ruby】オブジェクト指向設計の基本原則(Ruby流のSOLID入門)

こんにちは、かつコーチです。クラスやメソッドの書き方には慣れてきたけれど、規模が大きくなるとコードが読みづらくなる。そんな悩みを抱えているRubyエンジニアは多いのではないでしょうか。この記事ではSOLID原則の中でも特に効果が大きい単一責...
PHP

【PHP】素のPHPで簡易フレームワークを自作してみる

こんにちは、かつコーチです。前回は、MVCとは何かという基本の考え方と、素のPHPでMVCを組んだときに感じる限界について解説しました。特に「ルーティングを自前で管理する大変さ」は、実際に手を動かしてみないと実感しにくい部分だと思います。そ...
MySQL

【MySQL】EXPLAINでMySQLの実行計画を読む

こんにちは、かつコーチです。前回はインデックスの種類を整理しましたが、「インデックスを張ったのに速くならない」という相談は実務でも頻繁に起こります。原因を切り分けるには、MySQLが実際にどうクエリを実行しているかを可視化するEXPLAIN...
MySQL

【MySQL】MySQLのアーキテクチャ全体像(サーバーレイヤーとストレージエンジンレイヤー)

こんにちは、かつコーチです。前回はInnoDBとMyISAMというストレージエンジンの違いを扱いました。この記事は上級者向けとして、ストレージエンジンがMySQL全体のどこに位置づけられているのか、アーキテクチャ全体像から解説します。トラン...
Git

【GitHub】GitHub Actionsでデプロイを自動化する基本(上級者向け)

こんにちは、かつコーチです。テストの自動化までできるようになると、次に欲しくなるのが「mainにマージしたら自動で本番に反映される」仕組みです。手動デプロイには、手順の抜け漏れや、担当者しか作業できないという属人化のリスクが常につきまといま...
Git

【GitHub】Protected Branchとレビュー必須設定でmainブランチの事故を防ぐ

こんにちは、かつコーチです。「うっかりmainに直接pushしてしまい、本番が壊れた」というインシデントは、チーム開発をしていれば一度は聞いたことがあるはずです。Pull RequestやGit Flowの運用ルールを整えても、それを守らせ...
Git

【Git】rebaseとmergeの違い:履歴をどう残すか

こんにちは、かつコーチです。ここまでのGit編で、branch・merge・reset・revert・stashと、実務でよく使う操作を一通り解説してきました。今回は少し上級のテーマとして、git rebaseとgit mergeの違いを掘...