なぜ作ったのか
過去ソーシャルゲーム案件にいくつか携わったのですが、一番最初の案件で初めてシャーディングがシステム要件に入ったので、設計から開発までしました。
運用に入ると、シャードを横断して柔軟に検索できるようにしたいという欲求がでてきた、というよりたかだか4シャードぐらいでしたが、それぞれにログインして検索するのが非常に面倒で、専用ツールを用意するほどでもない検索とかもあったので、柔軟にSQLを実行できるツールを作ろうと思ったんですね。
どうせ調査依頼がプログラマーの方にくるので、一種の効率化が目的です。
大体10年ぐらい前だったと思います。
その時ぐらいにAdminerに出会ったのですが、シャードを横断して検索できるツールは、当時も、今もないんですね。
あれば需要はあると思うんですが。
で、最近Claude Desktop MCPでAIのコードを生成させるのを試しにやってみたくて、その実験としてこれを作ろうと思いました。
機能
もちろん会社で作ったものは外には出せないので、全くゼロから作りました。
結果的に仕事で作ったものよりもそれなりいいものになったのかなと思います。
以下のような機能があります。
- クラスター設定機能
- シャード群をクラスタとして設定することができます
- ソシャゲ案件とかだとユーザー用のシャードグループとギルド用のシャードグループとかに分けることがあるためです
- 更新クエリ実行制限機能
- ConfigでRead onlyモードとWritableモードを設定できるようにしました。不用意に更新クエリを実行できないようにしています。とはいえ、更新系やDDLの実行といったシチュエーションも考慮して、モード切り替えできるようにしています
- 実行結果をクエリごとにタブで表示可能
- クエリをセミコロンで区切って実行して結果をタブごとに表示します
- 結果のCSV、XLSXでダウンロード可能
- 特にXLSXダウンロードはタブをシートに書き出して一つのブック(ファイル)でダウンロードできるようにしています
- テーブル一覧、シャード一覧
- 特にシャード一覧はオフラインのDBをエラーとして表示するほか、選択的に実行するシャードを選択できるようにしています
そして、いくつかこだわったポイントがあります。
- PHP 7.0、MySQL 5.7対応
- 基本的に入力されたSQLを実行するだけなので、MySQLであればあまりバージョンを問わないかもです。PHPは最新でない環境でも使えるようにしています。最初に作ったものはPHP 5.2で動かしていました
- PHPはライブラリ不要
- Adminerのように1ファイル単体で実行できるようにしたかったので、PHPに関してはサードパーティライブラリは使っていません。フロントエンドに関しては後述します
フロントエンドは以下のライブラリを使用。最初はCDNからの取得にしようと思ったのですが、最終的にWebpackでパッキングするようにしました。
JavaScript、CSSを1ファイルにまとめるのは難しかったので、最終的には1ファイルでの配布とはなっていません。
- Normalize.css
- jQuery 3.5
-
Bootstrap 5.3
- Bootstrap Icons 1.13
-
CodeMirror 5.56
- Theme: eclipse
-
AG Grid Community 31.0
- Theme: alpine
- SheetJS xlsx.js 0.18
- sql-formatter 5.6
関連
今後も使うのか?
仕事でTiDBとか触ったことはありますが、規模にもよりますが、シャーディングは考慮するが、単一シャードで動かす方向にしていくことが多くなるのかなと思っています。
ただ、シャーディング自体はしばらく使われるだろうし、分散DB環境は結構あると思うので需要はあるのかなと思います。
シャーディングだけでなく、同じDB定義で複数の拠点に分散している環境とかには有用かなと。
Claud Desktop MCPでの開発
画面レイアウトとかは、完全にClaudeに作らせたものをベースとしています。
ただ、作られたコードがあまりにも自分らしくなかったので、一旦スクラップアンドビルドして、それを調整させました。
うまく指示を理解できてなかったり、ある程度動いているものを大幅に改造したりするので、その都度ツッコミを入れている感じです。
面倒くさいコーディングや環境構築、解決したい課題とかをしてくれるので、それなりに楽ですが、一発でうまくいくという感じではないですね。
「技術的にできるのはわかっているけど、調べてやるのが面倒くさい!」
とかは任せていいと思いました。
