上級者向け

JavaScript

【Vue】リアクティビティが効かない時の原因と対処法

こんにちは、かつコーチです。前回は、Vueでよく出るエラーとその解決法を初心者向けにまとめました。今回はもう一段掘り下げて、上級者でも意外とハマる「リアクティビティが効かない」という現象を扱います。エラーメッセージが出ないだけに原因調査が厄...
Python

【Python】簡単なCLIツールを作ってみる(argparse活用)

こんにちは、かつコーチです。「毎回同じフォルダ整理のスクリプトを書き換えて実行している」そんな手間を感じたことはないでしょうか。コマンドライン引数を受け取れるようにすれば、1つのスクリプトを使い回せるCLIツールに育てられます。この記事では...
Python

【Python】循環importでハマった話と解決法

こんにちは、かつコーチです。「さっきまで動いていたのに、ファイルを1つ分割しただけでImportErrorが出るようになった」そんな経験はないでしょうか。原因を探ると、AがBをimportし、BもAをimportしている循環importだっ...
Python

【Python】モックを使ったテストの書き方(unittest.mock)

こんにちは、かつコーチです。外部APIを呼び出す処理のテストを書こうとして、こんな悩みに直面したことはありませんか。「テストのたびに本物のAPIを叩くと、料金がかかるし遅い」「ネットワークが切れているとテストが落ちる」この記事では、こうした...
SQL

【SQLite】WALモードとは?読み書きを両立させる仕組み

こんにちは、かつコーチです。前回はインデックスによる読み取り最適化を扱いました。今回は、SQLiteの同時アクセス問題を大きく緩和するWALモード(Write-Ahead Logging)を、ジャーナリングの仕組みを前提知識として扱っていき...
SQL

【SQLite】インデックスとEXPLAIN QUERY PLANの読み方

こんにちは、かつコーチです。ここからは上級者向けの内容として、インデックスとBスツリー、EXPLAIN QUERY PLANの読み方といった前提知識を踏まえて解説していきます。トランザクションとロックの挙動を理解したところで、今回はクエリを...
JavaScript

【JavaScript】無限スクロールを実装する

こんにちは、かつコーチです。前回はドラッグ&ドロップを扱いました。今回はSNSのタイムラインやECサイトの商品一覧でおなじみの無限スクロールを実装していきます。上級者向けのテーマとして、パフォーマンスや多重発火といった実務で必ずぶつかる問題...
Docker

【Docker】docker-composeでWeb+DB構成を連携させる実践ガイド

こんにちは、かつコーチです。前回、docker-composeの基本の書き方を解説しました。今回はその発展編として、Webアプリケーションとデータベースを実際に連携させる構成を組みます。servicesを並べるだけなら難しくありませんが、実...
Docker

【Docker】マルチステージビルドでイメージを軽量化する

こんにちは、かつコーチです。Dockerfileの基本を押さえてイメージを作れるようになると、次にぶつかる壁が「イメージサイズが想像以上に大きい」という問題です。コンパイラやビルドツール、開発用の依存パッケージまで本番用イメージに残ってしま...
PostgreSQL

【PostgreSQL】PostgreSQLとMongoDB、JSONBはどこまでMongoDBの代わりになるか比較検証

こんにちは、かつコーチです。これでPostgreSQL編は20本目、最終回です。「MongoDBを検討していたけど、PostgreSQLのJSONBがあれば十分では」。こういう相談を、案件のDB選定でよく受けます。JSONB型(バイナリ形式...
PostgreSQL

【PostgreSQL】Row-Level Securityでマルチテナントのデータを守る実践ガイド

こんにちは、かつコーチです。マルチテナント(1つのデータベースで複数の顧客・組織のデータを扱う構成)のSaaSを設計していると、必ず突き当たるのが「テナントAのデータがテナントBに見えてしまわないか」という不安です。アプリケーションコードで...
PostgreSQL

【PostgreSQL】VACUUMとオートバキュームの仕組みを理解して肥大化を防ぐ

こんにちは、かつコーチです。「テーブルのデータ量は変わっていないのに、ディスク使用量だけがどんどん増えていく」。PostgreSQLを本番運用していると、こういう現象に出くわすことがあります。原因の多くは、VACUUM(不要になった行を回収...
PostgreSQL

【PostgreSQL】EXPLAIN ANALYZEで実行計画を読む

こんにちは、かつコーチです。前回はインデックスの種類を解説しましたが、「インデックスを貼った」だけでは安心できません。実際にそのインデックスが使われているかは、実行計画(PostgreSQLがクエリをどう処理するか事前に立てる計画)を見て確...
PostgreSQL

【PostgreSQL】PostgreSQLのインデックスの種類(B-tree・GiST・GIN・BRIN)

こんにちは、かつコーチです。「インデックスを貼ったのにクエリが速くならない」という相談は、よく聞くと索引の種類がデータの性質に合っていないケースが少なくありません。PostgreSQLはCREATE INDEX ... USINGで複数のイ...
PostgreSQL

【PostgreSQL】再帰CTEで階層データを扱う

こんにちは、かつコーチです。組織図、カテゴリのツリー構造、コメントの返信ネストなど、階層データはWebアプリの定番テーマです。前回はCTEの基本を扱いましたが、今回はCTE自身を参照して繰り返し処理を行う再帰CTEを掘り下げます。CTEの基...
PostgreSQL

【PostgreSQL】pgvectorでベクトル検索・類似検索を試す

こんにちは、かつコーチです。前回はJSONB型とGINインデックスで半構造化データを扱う方法を解説しました。今回は「データ型・JSON/pgvector」編の最終回として、pgvector拡張機能によるベクトル検索を扱います。上級者向けの内...
MySQL

【MySQL】パーティショニングの基本:大規模テーブルを分割する

こんにちは、かつコーチです。数千万件規模のログテーブルに対して、直近1週間分のデータだけを集計するクエリを投げているのに、テーブル全体をスキャンしてしまい応答が返ってこない。インデックスを見直しても限界がある、そんな状況に心当たりはないでし...
MySQL

【MySQL】バイナリログの役割とポイントインタイムリカバリ

こんにちは、かつコーチです。前回はmysqldumpによるバックアップとリストアを解説しましたが、mysqldumpだけでは「昨晩0時時点」までしか戻せません。もし障害が発生したのが夜23時だった場合、直近23時間分のデータは失われてしまい...
MySQL

【MySQL】MySQLレプリケーションの基本:仕組みとメリット

こんにちは、かつコーチです。「インデックス・パフォーマンス編」が完結し、今回からは「レプリケーション・バックアップ編」です。1本目のテーマは、複数のMySQLサーバー間でデータを複製するレプリケーションの仕組みとメリットです。上級者向けの内...
MySQL

【MySQL】スロークエリログの見方と改善の第一歩

こんにちは、かつコーチです。前回はEXPLAINで個別クエリの実行計画を読む方法を解説しましたが、実務ではまず「どのクエリが遅いのか」を見つけるところから始まります。そこで活躍するのがスロークエリログです。今回は、スロークエリログの有効化か...