Calíopeのアプリアイコン

機能

すべての機能を、ソースコードと照らし合わせて確認しています。

Calíopeはひとつのアプリとして出荷され、以下の機能をMac、iPad、iPhone、Apple Vision Proで使えます。どの項目も、いま実在するコードに対応しています。これは希望のリストではなく、カタログです。ショートカットでカテゴリに移動するか、一覧をスクロールしてご覧ください。

このページはCalíope 1.7を紹介しています。私がいま作っているバージョンです。1.6は、Mac、iPad、iPhone、Apple Watch、Apple TV、Apple Vision Pro向けにApp Storeで公開中です。それぞれの機能がどのバージョンで入ったかは変更履歴に書いてあります。

接続とセキュリティ

ネイティブのSSHトンネル

「ターミナルも.ssh/configもいらない、あなたのSSHトンネル。」

macOSのサンドボックスの中から、踏み台サーバの向こうにあるサーバに届きます。ローカルのsshも~/.ssh/configも要らず、権限と格闘することもありません。

SwiftNIO + NIOSSH。パスワードまたは秘密鍵による認証(ed25519、ECDSA P-256/P-384/P-521)。OpenSSHのパーサと、メモリー上でのパスフレーズの復号。127.0.0.1のローカルプロキシを、SSHのdirect-tcpipでつなぎます。

TOFUによるホスト鍵の検証

「誰かがトンネルを横取りしたら、何かを入力する前に警告します。」

ディスクにknown_hostsファイルを置かずに、SSHの踏み台サーバへの中間者攻撃を検出します。

フィンガープリントはキーチェーンに保存されます。最初の接続では明示的な確認を求め、フィンガープリントが変わっていれば接続は失敗します。StrictHostKeyChecking=yesと同じです。

標準で厳格なTLS

「スイッチだけでなく、本当に守ってくれるSSL。」

「SSLをオン」は、検証されたSSLを意味します。自己署名証明書には、CAを指定するか、見える警告付きで明示的に検証をやめる必要があります。

方針はひとつ:検証の省略は選んだ場合だけ。CAを指定するとホスト名を除いて検証し、それ以外は完全に検証します。

iCloud同期を選べるキーチェーン

「あなたが招かないかぎり、パスワードがiCloudに行くことはありません。」

どの認証情報をデバイス間で運ぶかは、あなたが決めます。標準では、どれも運びません。

ローカルのみのモードでは、認証情報をWhenUnlockedThisDeviceOnlyに固定します。同期を有効にすると、iCloudキーチェーンのためにAfterFirstUnlockに移します。スイッチは冪等です。

プロファイルごとに選べる生体認証

「指紋でロックを解除するのは、スリープ中のMacだけでなく本番サーバも。」

本番サーバに接続する前に、Touch ID/Face IDの確認を加えられます。プロファイルごとに設定できます。

LocalAuthenticationフレームワークで作られています。接続プロファイルごとに有効にします。

決定的な接続プール

「何かが失敗しても、必ず閉じる接続プール。」

セッションを切り替えても、資源を漏らさず、UIを止めない接続。

SwiftNIOのEventLoopGroupConnectionPool。シングルスレッドのイベントループグループで、イベントループごとに最大5つの接続。安全のためのタイムアウト付きの非同期の終了処理と、ローカルのバインドに失敗したときのきれいなSSHのクローズ。

ネイティブのプリペアドステートメント

「文字列の埋め込みではなく、準備されたバインド。スタックの根元から。」

Calíopeのツールがあなたの代わりに送る値(フィルタ、編集したセル、挿入した行)は、SQLに連結されることがありません。文とは別に、ワイヤプロトコルを通って送られます。SQLエディタに書いたものは、どのクライアントでもそうであるように、書いたとおりに送られます。

私が書いたクライアントで、それぞれのエンジン自身のプリペアドステートメントを使います。バインドがなければ単純なクエリー(MySQLとMariaDBではCOM_QUERY、PostgreSQLではシンプルクエリー)。バインドがあれば、MySQLとMariaDBではCOM_STMT_PREPAREとCOM_STMT_EXECUTEで、接続が生き残るすべての経路で文を閉じるので、プールが漏れることはありません。PostgreSQLではParse、Bind、Executeと、$nのプレースホルダ。SQL Server:RPC越しのsp_executesqlと型付きのパラメータ。Oracle Database:実行の呼び出しの中の型付きの:1のバインド。ClickHouse:型付きの{name:Type}のパラメータを、HTTPリクエストのparam_フィールドとして送ります。DCL/DDLの残りのケースでは、識別子は今も一か所に集約したエスケープの仕組みを通ります。

プロファイルごとの代替ホスト

「サーバはひとつ、アドレスは2つ。そして両方を試します。」

同じサーバに、Macからはあるアドレスで、iPadからは別のアドレスで届くことはよくあります。プロファイルに2つ目のアドレスを入れておけば、1つ目が応答しないとき、Calíopeは同じポートと認証情報でそちらを試します。

接続先はconnectionEndpointsが解決し、ホストのフィールドを読むことはありません。プールを開く3つの場所は、エンドポイントを受け取ります。順序は固定で、メイン、次に代替。どちらがうまくいったかは覚えません。その状態こそ、デバイス間で運べないものだからです。別のポートを公開する経路のためにhost:portも受け付けます。SSHトンネルを使うときは無視され、インタフェースもそう表示します。その場合、ホストを解決するのはあなたのデバイスではなく踏み台サーバです。

環境タグ

「何かを実行する前に、どのサーバにいるかがわかります。」

それぞれの接続に、好きな名前と色のタグ(ローカル、ステージング、本番)を付けられます。その色の帯がすべてのツールの上に表示され、保護レベルによって、書き込む前に確認を求めたり、書き込みをきっぱり拒否したりできます。

一度だけ書かれたひとつのガードが、送る前にすべての文を判定します。読み取り専用では、サーバがその方法を知っていれば、サーバ自体も読み取り専用モードにします。MySQLとMariaDBではSET SESSION TRANSACTION READ ONLY、PostgreSQLでは起動時のdefault_transaction_read_only、ClickHouseではすべてのリクエストにreadonly=2。SQL Server、Oracle、Redis、MongoDBでは、ガードはクライアントだけです。守るのは事故からで、攻撃者からではありません。それはサーバの読み取り専用ユーザの役目です。

SQLエディタと生産性

文脈を理解する自動補完

「FROMにいるのか、WHEREにいるのか、列の一覧にいるのかを、エディタは知っています。」

入力は少なく、間違いも少なく。候補が、文の中のどこにいるかを理解しているからです。

アクティブなテーブルの列、データベース名、スキーマのトークン(テーブル、ビュー、関数)、DML/DDL/制御のキーワード、データ型、エンジンで絞り込んだSQLの補助フレーズを提案します。

入力中の字句リンター

「対応の取れていない括弧が、サーバに届くことはありません。」

サーバに拒否される前に、明らかな間違いを捕まえます。

閉じていないコメント、閉じていない文字列、対応の取れていない括弧、閉じていないバッククォートの識別子を検出します。O(n)の走査で、完全なパーサは使いません。

フォーマッタと、セーフモード

「DROPがうっかり出ていくことはありません。」

クエリーを読みやすく整形し、意図する前にUPDATEやDROPがサーバに届かないようにする鍵。

フォーマッタは、エンジン自身の語彙からキーワードを大文字にします。セーフモードは標準でオンで、プロファイルごと、エディタのタブごとに保存され、ALTER、CREATE、DELETE、DROP、GRANT、TRUNCATE、UPDATE、REPLACE、RENAMEを含む文の実行を拒否します。エディタからでも、ターミナルからでも、SQLプレーヤーからでも同じです。探すのは単語で、WHEREではありません。WHERE付きのUPDATEも止まり、オフにするまで何も送られません。

ログと同期での認証情報の伏せ字化

「同期するのは履歴で、認証情報ではありません。」

クエリーログが、iCloud上のパスワードファイルになることはありません。

IDENTIFIED BY、IDENTIFIED WITH … AS、IDENTIFIED BY PASSWORD、SET PASSWORD FOR、PASSWORD(…)を無害化します。伏せ字化は冪等で、クエリーログをCloudKitに書き出す前に適用されます。

ビジュアルなクエリービルダー

「クリックでクエリーを組み立て、そのまま本番で使える形で出てきます。」

構文を覚えなくても、正しいSELECT … WHERE … JOIN …が書けます。

最もよく使う4つの形のための専用のビジュアルビルダー:SELECT、WHERE、UPDATE、そしてテーブルのCREATE。

単語の境界を守るシンボル名の変更

「client_idを壊さずにidの名前を変えます。」

似た名前を壊さずに、識別子を安全にリファクタリングできます。

\bの単語境界と正しいエスケープを使った正規表現。より長い識別子の中に一致することはありません。

クイックオープンのパレット(⌘⇧O)

「⌘⇧Oで、探していたテーブルにいます。」

ツリーをたどらずに、スキーマのどのオブジェクトにも届きます。

テーブル、ビュー、ルーチン、オブジェクトをまたぐインクリメンタルなあいまい検索。矢印キーで移動し、Enterで開きます。

エンジンごとの初期データを持つスニペットマネージャ

「スニペットがエンジンに合わせます。その逆ではありません。」

SQLのレシピがいつも手元にあり、使っているエンジンで絞り込まれます。

snippets.jsonに保存され、全体の同期スイッチでiCloudを通って運ばれ、オフならデバイスに残ります。スニペットごとに、どのエンジン(MySQL、MariaDB、PostgreSQL…)に当てはまるかを宣言します。新しいエンジンに接続すると、重複なしで初期値が入ります。カテゴリ分けもできます。

DDLと関数のドキュメントのポップオーバー

「GROUP_CONCATのドキュメントが、入力しているその場所で開きます。」

エディタを離れず、ブラウザも開かずに読めるドキュメント。

カーソルの下にあるスキーマのオブジェクトのDDL、または関数の項目(シグネチャ、説明、パラメータ、例、登場したバージョン)を表示します。エンジンごとに専用の項目があり、SQLiteとDuckDBも含みます。クエリーのツールでは、MongoDBの演算子にもあります。マウスを使わないなら⌥⌘?。

高度なセルエディタと、行のその場での編集

「セルを編集し、SQLを見て、決める。」

データをすばやく変更し、実行される正確なSQLをプレビューできます。

結果セットを表計算のように編集し、実行する前に、生成されたUPDATEやDELETEをプレビューします。

SQLプレーヤー — スクリプトを1文ずつ

「スクリプトを動画のように、再生し、一時停止し、1文ずつ進める。」

移行を1文ずつ実行し、次の文を送る前にそれぞれの結果を確かめられます。

エディタのスクリプトを文に分け、手動またはタイマーで1つずつ実行します。最初、前、次、最後のコントロール付きで、自動再生は最初のエラーで止まります。それぞれの文には、状態、時間、返した行数や変更した行数が表示され、クエリーの履歴にも残ります。セーフモードが適用されます。

エディタにドッキングしたSQLターミナル

「アプリを離れずに、mysql>のプロンプト。」

文を入力し、Returnを押し、答えをテキストで読む。コマンドラインのクライアントと同じやり方を、スクリプトのすぐ隣で。

エディタの下のパネルに、エンジン自身のプロンプト(mysql>、postgres=#…)、ASCIIの表での結果、サーバが変更したと伝える行数付きの「Query OK」、その下にサーバの警告。Macでは矢印キー、iPad、iPhone、Apple Vision Proではボタンで使える専用の履歴があり、すべての文はセッションの履歴にも入ります。セーフモードが適用されます。

結果のグラフ

「何も書き出さずに、結果セットからグラフへ。」

いま得た行から、棒グラフ、折れ線グラフ、円グラフを、エディタのパネルに。

軸は自動で選ばれます(カテゴリには最初のテキストの列、値には最初の数値の列)。変更もできます。グラフはPNGやPDFに書き出せます。

ひとつのクエリー、2つのデータベース

「ステージングは本番と同じ?両方に一度に聞いてみましょう。」

同じクエリーを2つの接続で実行し、何が違うかを行ごとに見られます。

「2つのデータベースで実行…」は、文を両方に送り、グリッドを比較に置き換えます。変わったセルには印が付き、片方にしかない行が示され、違いだけを表示するフィルタもあります。行は位置で対応づけられ、両方が同じ列を返したときだけ比較します。

キーボードの上のiPadのヒントバー

「SQLの力を持つiPadのキーボード。」

画面上のキーボードのすぐ上に、タッチですばやく選べる候補。

カーソルの下のオブジェクトや関数に応じたバーで、「DDLを表示」や関数のパラメータにすぐアクセスできます。

カスタマイズできるツールバー

「あなたの順番の、あなたのツールバー。」

使いやすさは人それぞれです。DBAは一度並べ替えたら、あとは忘れます。

専用のカスタマイズ用シートで、ボタンのグループを並べ替えたり隠したりできます。配置は保存されます。

データベース全体の一括検索と置換

「持っているすべてのテキスト列を、一度に検索。」

すべてのテーブルのすべてのテキスト列で文字列を一度に検索し、テーブルと列ごとの一致を見て、サーバが計算した結果をプレビューし、テーブルごとのトランザクションの中で一括置換します。

表示する件数は1つではなく2つです。照合順序はふつう大文字と小文字を区別せず、REPLACE()は常に区別するので、その警告がなければ、一括編集は300行と告げて100行しか変えず、しかも何も失敗しません。この食い違いは、名前付きの照合順序ではなくCAST(col AS BINARY)で測ります。生成列、主キーの列、一意の列は標準で除外されます。MariaDBは生成列へのUPDATEを受け付け、影響を受けた行を1と報告して、何も変えないからです。エスケープには|を使います。バックスラッシュはNO_BACKSLASH_ESCAPESのもとで壊れるからです。

本物の地図の上の空間データ

「GEOMETRY列が、25バイトのかたまりではなくなります。」

点、線、多角形を、エディタにドッキングした地図の上に描きます。航空写真と平面のスタイル、クラスタリング、データに合わせるコントロール付きです。ピンや頂点をドラッグするとCalíopeが文を組み立て、何かを書き込む前にそれを見せます。

ワイヤ上のWKBは常に(経度、緯度)です。変わるのはテキストで、地理座標系のSRIDのもとではMySQL 8は緯度を先に書き、MariaDBは決してそうしないからです。入れ替えはテキストの境界にだけあり、そこではパラメータに既定値がありません。間違えてもエラーにはならず、行が別の大陸に移り、サーバはそれを受け入れます。SRIDはジオメトリと一緒に運ばれ、信頼できる主キーがなければ編集は止められてその理由が表示され、CoreLocationはどこにもありません。

レポート

出力を宣言した、保存済みのクエリー

「2回聞けば同じ答えを返す、保存済みのクエリー。」

パラメータを宣言し、出力(どの列を、どの順で、どんな見出しと書式で)を定義してクエリーを保存し、好きなときに手動またはスケジュールで実行します。CSV、TSV、JSON、Markdown、HTML、XML、テキスト、Excel、ページ分けされたPDFに書き出せます。レポートの定義はiCloud同期で運ばれ、結果と実行履歴は、それを実行したデバイスに残ります。

パラメータはバインドされ、クエリーのテキストに貼り込まれることはありません。どちらのSQLモードでも、そこに入力したものがクエリーの動作を変えることはできません。出力の取り決めは実行時に守られます。届かなくなった列や、別の型で届いた列は、黙って描かれるのではなく、そのことが知らされます。どの実行も、バックアップと共有する履歴に、パラメータ、行数、実行したマシンとともに1行を残します。スケジュールされた実行はプロファイルから専用の接続を開き、アプリを閉じていても実行されるとは決して約束しません。

3種類のデータベースに、ひとつの継ぎ目

「同じレポートを、3種類の異なるデータベースに。」

同じ成果物と同じ画面が、本番のMySQL、あるアプリの.sqliteファイル、.duckdbファイル、そしてMongoDBのコレクションに使えます。

レポートのエンジンはデータベースのプロバイダにぶら下がっていません。専用の、より狭い継ぎ目を持ち、メンバーは3つだけです。リレーショナルデータベース用、自分で開いたSQLiteとDuckDBのファイル用、そしてfindとaggregateを通したMongoDB用の実装があります。ソースを加えるには、エンジンに触れずにそのプロトコルを実装するだけです。そして、どのソースも前回の実行の状態を持ちません。かつてそうしていたソースでは、2つ目のレポートが1つ目の列で投影されていました。エラーも警告もない、空のセルの表です。

読む前に準備するレポート

「準備し、インデックスを張り、読む。ひとつの接続で、あなたのテーブルには触れずに。」

DBAなら5段階のスクリプトとして書くようなレポートが、データに決して触れないという保証を手放さずに、ひとつのレポートに収まります。

すべてのレポートがひとつのクエリーで済むわけではありません。セッション変数を設定し、一時テーブルを何回かに分けて作り、インデックスを張って、最後に読む。この一連の処理はすべて借りたひとつの接続で実行されます。文ごとに接続が変われば、最初の文が作った一時テーブルは最後の文の時点で存在しないからです。準備の文はホワイトリストを通り、自分の一連の処理に属する一時テーブルにしか書き込めません。行数の上限は最後の文に適用されます。

9つの書き出し形式と、ページを測るPDF

「9つの形式。そしてPDFは、ページの終わりを知っています。」

上司に送るPDFには「金額」と書かれ、同じレポートのCSVにも「金額」と書かれます。total_eurではありません。

CSV、TSV、JSON、Markdown、HTML、XML、プレーンテキスト、XLSX(Calíope自身が依存関係なしにZIPとXMLで書きます)、そしてページ分けされたPDF。書き出されるのは、サーバから返ってきたものではなく、出力が宣言しているものです。そしてPDFのページ分けは、定数で見積もるのではなく、フォントのアセント、ディセント、行送りから測られます。定数では、すべてのページの最後の行が半分に切れ、それは印刷して初めてわかります。

管理とカタログ

カタログ:たどれるスキーマツリー

「あなたの考え方どおりのツリーで見る、あなたのスキーマ。」

サーバのカタログ全体を、ひとつのビューで。

データベース → テーブル/ビュー/ルーチン/トリガー/イベント。遅延読み込みと、状況に応じたアクション(DDL、列、インデックス、データの読み込み、WHEREビルダー)付き。

ALTERを生成するスキーマ比較

「スキーマを比べ、ALTERを生成し、適用する前に確かめる。」

差分を手で集めずに、ステージングから本番へスキーマを移せます。

2つのスキーマを比べ、一方をもう一方に合わせるのに必要なALTER TABLEを生成します。列の比較は構造化された並行処理で同時に実行されます。拠りどころはINFORMATION_SCHEMAです。

ローカルのDDL監査ログ

「どのDDLを、いつ、どのサーバに対して実行したかがわかります。」

サーバに触れずに、スキーマの変更を追跡できます。

すべてのCREATE/ALTER/DROP/RENAMEが、タイムスタンプと対象のサーバとともに、アプリのローカルのSQLiteストアに記録されます。

サーバ間のデータ移行

「ステージングから本番へ、3回のクリックで。プレビュー付き。」

mysqldumpや手作りの.sqlファイルなしで、環境をまたいでオブジェクトを複製できます。

2つの接続(ソースと宛先)。テーブル、ビュー、ルーチン、トリガー、イベントを細かく選べ、REPLACE、データを含める、外部キーをスキップする、のオプション付き。実行前にSQLをプレビューします。

高度なオブジェクトエディタ

「何にでも使う汎用の.sqlではなく、オブジェクトの種類ごとのエディタ。」

ルーチンやイベントを、そのオブジェクトのために作られたエディタできちんと編集できます。

ストアドルーチン、トリガー、イベント、ビュー、インデックスの専用シート。どれも正しい形のDDLを出力します。

テーブルビルダー

「打ち込むのではなく、列ごとに設計するテーブル。」

テーブルを作成したり既存のテーブルを変更したりし(列、型、キー、インデックス、外部キー)、実行する前にCREATEやALTER TABLEを読めます。

エンジンごとに型とオプションのカタログを宣言するので、ビルダーはそのサーバにあるものを提示します。ClickHouseのソートキーやスキップインデックスも含みます。テーブルを変更するときは元のスナップショットと比べ、変わった部分のALTER TABLEだけを書きます。カタログから開きます。

テーブルメンテナンス

「CHECK、REPAIR、OPTIMIZE、ANALYZE、CHECKSUMを、ひとつのボタンで。」

MySQL、MariaDB、TiDB、PostgreSQL、SQL Server、Oracle Database、ClickHouseのテーブルの手入れを、コマンドを覚えずに。

MySQLとMariaDBではCHECK TABLE、REPAIR TABLE、OPTIMIZE TABLE、ANALYZE TABLE、CHECKSUM TABLEを、PostgreSQLではANALYZEに加えてVACUUMとREINDEX TABLE CONCURRENTLYを、SQL ServerではUPDATE STATISTICS、DBCC CHECKTABLE、インデックスの再構築を、ClickHouseではCHECK TABLEとOPTIMIZE(テーブル全体またはパーティションひとつ)を、Oracle DatabaseではDBMS_STATSによる統計情報を実行し、進行状況を表示します。

ユーザ管理:ユーザと権限

「GRANTとREVOKEを、チェックボックスで。」

すべてのGRANTを手で書かずに、サーバのユーザを管理できます。

専用のUIからCREATE/ALTER/DROP USER、そしてGRANTとREVOKE。

インデックスアドバイザとインデックスエディタ

「多すぎるインデックスと、足りないインデックス。証拠付きで。」

サーバがすでに公開しているデータを使って、冗長なインデックスや足りないインデックスを見つけます。

インデックスの使用状況を分析するアドバイザのビューと、インデックスのカタログのための専用エディタ。

列のプロファイラ

「データを推測するのではなく、列をプロファイルする。」

分析のクエリーを書く前に、データの質を把握できます。

読み込んだ結果の1つの列の統計:NULLとその割合、異なる値の数、最小、最大、平均、そして最も頻繁な10個の値と、上位8つの棒グラフ。

インタラクティブなER図

「もう描かなくてよいER図。」

Miroで箱を描かずに、リレーションを文書化できます。

アクティブなスキーマから自動で生成し、外部キーを図示します。

MongoDB

MongoDB

「ドキュメントデータベースを、その語彙のままで。」

コレクションとドキュメントを閲覧し、JSONとして編集し、フィルタと集計パイプラインを書き、インデックスを管理し、サーバ、実行中の操作、ユーザを確認できます。MySQLにすでに使っているアプリを離れずに。

自己完結したツールで、MongoDBのものはリレーショナルのプロバイダの層に一切触れません。コレクションにはスキーマがなく、隣り合う2つのドキュメントが同じフィールドをひとつも持たないこともあるので、ドキュメントは折りたためるツリーで、すべての値の型(ObjectId、decimal128、日付、バイナリ)とともに表示されます。拡張JSONは専用のパーサで双方向に扱うので、往復してもフィールドの順序と数値の幅が保たれます。接続プロファイル、キーチェーン、ネイティブのSSHトンネルを再利用します。ページ分けされたカーソルは、放棄されると閉じられます。ナビゲータには6つのツール:MongoDBコレクション、MongoDBクエリー、MongoDBインデックス、MongoDBサーバ、MongoDBコマンド、MongoDBプロファイラ。

RedisとValkey

Redis

「キー、メモリー、コマンド — テーブルのふりはしません。」

Redisのセッションでは専用のツールが7つ開きます:キーブラウザ、サーバパネル、メモリーアナライザ、スローコマンド、接続中のクライアント、コマンドコンソール、ノードトポロジ。どのプレフィックスがメモリーを食っているか、どのコマンドがしきい値を超えたか、どのクライアントを切断すべきかが、SQLに使っているのと同じアプリでわかります。

リレーショナルのプロバイダの層の外にある、専用のRESPクライアント。キーはKEYSではなく常にSCANでたどり、どのコレクションも丸ごとは読みません — 大きなHGETALLも同じようにサーバを止めるからです。クラスタでは、MOVEDはスロットの対応表を読み直し、ASKは読み直しません。クラスタはSSHトンネル越しには開きません。トンネルが届かないアドレスを告げるからで、セッションは開く前にそう伝えます。コンソールは、接続に状態を残すもの(MULTI、WATCH、SUBSCRIBE…)と、タイムアウトのないブロッキングのコマンドを拒否します。スローログのしきい値はマイクロ秒で、そのとおりに表示されます。

Valkey

「同じ7つのツールを、オープンなフォークで。」

Linux FoundationによるRedisのフォークであるValkeyも、同じ7つのツール(キー、サーバ、メモリー、スローコマンド、クライアント、コンソール、トポロジ)で開きます。クラスタにも対応します。サーバパネルにはValkey自身のバージョンとモードが表示され、コンソールのプロンプトはvalkey>になり、「接続をテスト」はValkeyを見分けて「Valkeyを使う」を提案します。

Redisのために書いたのと同じRESPクライアントです。Valkeyは同じプロトコルを話すからです。製品は名前の一覧からではなく、サーバのあいさつから読み取り、2つの間で変わるところはコードのコピーではなく、宣言された違いです。Valkey 8.0と9.1で、単体でも、スロットが移動中のクラスタでも測っています。スニペット、レポート、AIアシスタントもValkeyで動き、DBAハンドブックのRedisの12の章が、どこが違うかを説明しています。Valkey 8.0以降。

CassandraとScyllaDB

Apache Cassandra

「キースペース、リング、CQL — テーブルのふりはしません。」

Cassandraのセッションでは専用のツールが7つ開きます:CQLクエリー、キースペースエクスプローラ、クラスタ、ノード、接続中のクライアント、トレースとスロークエリー、ロールと権限。クエリーごとに整合性レベルを選んで結果をページごとに読み、リングがトークンをどう分け合っているか、すべてのノードがスキーマで一致しているかを確かめ、主キー全体で行を編集し、クエリーをトレースして時間がどこに使われたかを読めます。SQLに使っているのと同じアプリで。

CQLネイティブプロトコルのバージョン4のための専用クライアントで、リレーショナルのプロバイダの層の外にあり、公開された仕様から書いています:パスワードでのサインイン、任意のクライアント証明書を使えるTLS、SSHトンネル、そして最初のホストが応答しないときの代替ホスト。バインドする値はプリペアドステートメントで送り、行は主キー全体でだけ、軽量トランザクションとして、変わるものを名指しする確認のあとで編集します。nodetoolがすること — 修復、コンパクション、スナップショット — は対象外で、バックアップもありません。Cassandraのバックアップは各ノードのファイルのスナップショットだからです。Cassandra 5.0.9で、1ノードでも3ノードのリングでも測っています。Cassandra 4.1以降。

ScyllaDB

「同じ7つのツールを、C++による書き直しで。」

ScyllaDBも同じ7つのツールで開きます。ノードのタブはScyllaDBが自分自身について公開しているものを読み、トレースとスロークエリーにはScyllaDBが記録するスロークエリーのログが加わり、「接続をテスト」はScyllaDBを見分けて「ScyllaDBを使用」を提案します。

Cassandraのために書いたのと同じCQLクライアントです。ScyllaDBは同じプロトコルを話すからです。製品は名前の一覧からではなく、サーバがサインインの前に送るSCYLLA_*のキーから読み取り、2つの間で変わるところはコードのコピーではなく、宣言された違いです。ScyllaDB 2026.3.3で測っています。スニペット、レポート、クエリーログ、AIアシスタントもCassandraとScyllaDBで動き、DBAハンドブックにはCassandraについての11の章と、ScyllaDBの違いについての12番目の章があります。ScyllaDB 2025.1以降。

サーバなしで動くもの

SQLiteエディタ

「2つのエンジン、ひとつのアプリ:リモートのMySQLと、ローカルのSQLite。」

iOSアプリやPythonのスクリプトの.sqliteを、MySQLを管理しているのと同じツールで開いて編集できます。何かを書き込む前には、明示的なトランザクションがあります。

自己完結した層(システムのC APIの上のSQLiteConnectionアクタで、どのサーバのドライバも通りません)で、構造 · データ · SQLの実行 · プラグマを備えています。テーブル、インデックス、ビューのデザイナ、名前の変更、検索とフィルタ、SQLエディタと同じページサイズのページ分け、並べ替え、高度なセルエディタ、構文のハイライトとファイルのスキーマからの自動補完と結果の行数上限を持つSQLの実行、保存/元に戻すのトランザクション、メンテナンス(integrity_check、VACUUM、ANALYZE、REINDEX)、編集できるプラグマ、CSV · JSON · SQLの読み込みと書き出し。セキュリティスコープ付きブックマークでサンドボックスでも安全です。暗号化されていないデータベースのみ。

DuckDBエディタ

「ノートパソコンで分析:インストールするサーバのない列指向エンジン。」

.duckdbファイルを開くか、Parquet、CSV、JSONを置いてある場所のままクエリーできます。何も読み込まず、サーバもなく、MySQLを管理しているのと同じアプリで。

アプリに組み込まれたDuckDB 1.5.5(ローカルのSPMパッケージで、C APIの上のDuckDBKit)で、SQLiteエディタと同じくデータベースのプロバイダの外にあります。構造 · データ · SQLの実行 · 設定を備え、スキーマツリーにはシーケンス、型、マクロ、SUMMARIZE、長いクエリーの行数上限と停止、データベース全体の書き出しと読み込み、メモリー上のデータベースのための「別名で保存…」、そして別のDuckDBファイルを読み取り専用でアタッチする機能があります。拡張機能はダウンロードされません。中に入っている4つがすべてです。1.7からDuckDBはアプリとQuick Lookの拡張機能が共有するフレームワークとして出荷されるので、Finderでスペースバーを押しても、「ファイル」でプレビューしても、この同じエンジンで.duckdbやParquetのファイルを読みます。そしてFinderや「ファイル」から開いた.parquetは、ここに、メモリー上のデータベースに、クエリーが書かれた状態で届きます。

ファイルプレビュー

「ファイルを読むのに、接続は要らないはず。」

ドキュメントの.md、同僚の.sql、設定の.json、書き出された.csv、誰かが送ってきた.rtf、サーバの.logを、アプリを離れず、接続もせず、うっかり何かを実行する危険もなく読めます。

読み取り専用で、一度に1ファイル、拡張子で判定します。専用のMarkdownレンダラ(ATXとsetext、入れ子のリスト、チェックリスト、フェンスと4スペースのインデントのコード、引用、罫線、GFMの表)、SQLのハイライタ、JSONのフォーマッタ、区切り文字を検出するRFC 4180のCSVリーダー、そして構造と強調(見出し、入れ子のリスト、太字、斜体、下線、取り消し線、リンク、配置)を保ちつつ、書体、サイズ、色はCalíopeのものを使うRTFリーダー。だからテキストはDynamic Typeで拡大でき、どちらのテーマでも読めます。すべてメインスレッドの外で解析され、動かないデータとしてビューに届きます。DispatchSourceでファイルのパスを監視するので、アトミックな保存にも耐えます。上限は宣言され、フッターに表示されます:読み込みは5 MB、SQLのハイライトは500 KB、JSONの整形は2 MB、CSVは10,000行と64列。ネットワークは一切開きません。リモートのMarkdownの画像はaltのテキストを表示します。

AIアシスタント、キーがあってもなくても

キーは自分で用意します。購入にはAIのクレジットは含まれず、ご自身のAPIキーを使います。これは購入画面にはっきり書いてあります:「アシスタントは、Apple IntelligenceまたはOllamaを使えばキーなしで動作します。クラウドのプロバイダ(OpenAI、Google Gemini、Anthropic Claude)にはご自身のキーが必要で、キーは購入に含まれません。」

Apple Intelligenceなら、デバイスの外には何も出ません。Ollamaなら、指定したマシンの外には何も出ません。OpenAI、Gemini、Claudeでは、アクティブなデータベースのスキーマ(テーブル名、列、外部キー)が、あなた自身のキーでそのプロバイダに送られます。行と認証情報は決して送られません。あなたが別の判断をしないかぎりは:アシスタント自身のパネルにある「スキーマをモデルに送信」のスイッチが、どの質問の前にも、どのプロバイダでも、それを決めます。オフなら、スキーマは何も送られず(テーブル名さえも)、テーブルは質問の中で自分で名指しします。macOSでは、Calíopeは同じMac上のAIクライアントのためのMCPサーバとしても動けます。読み取り専用で、127.0.0.1で、標準ではオフです。

Apple IntelligenceとOllama、キーなしで

「お金もかからず、何も求めない2つのプロバイダ。」

Apple Intelligenceは、システムのモデルをあなた自身のデバイスで動かします。キーもアカウントも費用もなく、質問がデバイスの外に出ることはありません。Ollamaはオープンなモデルを、あなたが指定した場所(あなたのマシン、またはネットワーク上のマシン)で動かし、Calíopeは入力したアドレスでそれと話します。

Apple IntelligenceはFoundationModels経由で、システムが利用できると言う場所でだけ提示されます。OllamaはOpenAIのプロトコルで、あなた自身のベースURLに対して、Authorizationヘッダなしで使い、モデルの一覧は絞り込みません。名前はあなたが取得したものそのままです。スキーマがローカルのウィンドウに収まらないときは、アシスタントが会話の中でそう伝え、どうするかを提案します。

OpenAI、Gemini、Claudeのプロバイダ

「あなたの請求書ではなく、あなたのトークンで動くAI。」

すでにお金を払っているモデルを使い、Calíopeがトークンあたりの価格を上げることに左右されません。

OpenAI(gpt-、o1、o3、o4のモデル)はBearerトークンで。Google GeminiはAPIキーで、generateContentを公開しているモデルに絞り込みます。Anthropic Claude(claude-*)はx-api-keyで、システムプロンプトは専用のフィールドに置きます(messagesの中ではありません)。システムプロンプトにはアクティブなスキーマのコンテキストを入れ、直近の3回のやりとりを保持します。

エラーとログでのAPIキーの伏せ字化

「キーがスタックトレースに現れることはありません。」

エラーメッセージがスクリーンショットやSlackのチャンネルに流れても、APIキーが一緒に出ていくことはありません。

どのプロバイダのエラーメッセージでも、sk-*(OpenAI)、AIza*(Gemini)、sk-ant-*(Anthropic Claude。sk-ant-api03-…を含む)、Bearer …を正規表現で伏せ字にします。

Retry-Afterに従う指数バックオフ

「OpenAIが待てと言えば、Calíopeはちょうどその時間だけ待ちます。」

レート制限の急増で、セッションが壊れることはありません。

429/503では、Retry-Afterヘッダに従いながら、最大3回(1秒/2秒/4秒)再試行します。タイムアウトは、生成で30秒、モデルの一覧で15秒です。

音声からSQLへ

「質問を話して、SQLを実行する。」

依頼を口述すれば、アシスタントがSQLにしてくれます。iPadや、手がふさがっている二人一組のDBA作業で便利です。声がデバイスの外に出ることはありません。

AppleのSpeechAnalyzerとDictationTranscriber(macOS 26/iPadOS 26/iOS 26/visionOS 26)で作られています。認識はデバイス上で行われ、音声がどのサーバに送られることもなく、音声入力はオフラインでも動きます。言語モデルは、Calíopeに設定した言語で、進行状況を表示しながら一度だけ取得されます。システムの音声入力が対応しているほかの言語も、マイクの横のカプセルから選べ、カプセルはいまどの言語で聞いているかを示します。求めるのはマイクの許可だけです。デバイス上の認識には、音声認識の許可は要りません。途中の結果もリアルタイムで表示されます。

会話を続けるアシスタント

「孤立したプロンプトではなく、データベースとの会話。」

「今度はLEFT JOINで」と頼めば、どのクエリーのことかわかっています。

会話ごとに、アクティブなスキーマと直近の数回のやりとりのコンテキストを保ちます。

Mac上のAIクライアントのためのMCPサーバ

「CursorやClaude Desktopが、データベースに聞けます — 読み取り専用で。」

同じMac上のAIクライアントが、公開すると選んだ接続について、データベースの一覧を出し、テーブルを説明し、読み取り専用のクエリーを実行できます。

HTTP上のJSON-RPC 2.0で、127.0.0.1でだけ待ち受けます。ポートは変更しないかぎり41500です。macOSのみ、標準ではオフで、Calíopeが開いているあいだだけ応答します。5つのツールがあり、クライアントが受け取る説明とともに専用のページで紹介しています。

バックアップ、読み込み、同期

認証情報を選んで含められるバックアップエンジン

「ネイティブのgzipでバックアップ。うっかりパスワードを書き出すこともなく。」

小さく、標準で安全なダンプ。パスワードのハッシュをうっかり書き出す人はいません。

先にDROP、データを含める、ユーザを含める、ユーザの認証情報を含める(選んだ場合のみ、標準ではオフ)のオプションとネイティブのgzip圧縮で、.sqlを生成します。認証情報を除くときは、CREATE USER/ALTER USER/GRANTを無害化します。残り時間付きの進行状況イベント。

保持期間付きのスケジュールバックアップ

「あなたが覚えていることに頼らないバックアップ。」

Macはスリープしていても時間どおりにバックアップを取り、ディスクをいっぱいにすることもありません。

毎日、毎週、平日、毎月、またはN時間ごとのスケジュール。サンドボックスの中で動くように、セキュリティスコープ付きの保存先ブックマークを使います。アプリの再起動をまたいで逃したスケジュールを扱い、衝突を避けるためにナノ秒の接尾辞をファイル名に付け、保持期間にもとづいて削除し、成功/エラー/スキップの通知を出します。

CSV/JSON/XLSXの読み込み

「表計算からテーブルへ、3回のクリックで。」

きれいなCSVだけでなく、現実の表形式のファイルを読み込めます。

RFC 4180形式のCSV(エスケープされた引用符、カンマを含むフィールド)、JSON(オブジェクトの配列)、ストリーミングのXLSX。3つのモード(挿入、重複をスキップ、重複を置換)を、エンジンが持っている場合に提示します。MySQLとMariaDBでは3つすべて、PostgreSQLでは最初の2つ、SQL Server、Oracle Database、ClickHouseでは挿入のみです。

ローカルに残るクエリーログ

「火曜日に実行したコマンドが、2秒で見つかります。」

過去の何千ものクエリーを、SQLのテキストや日付で検索できます。

Application SupportにあるローカルのSQLiteストアで、実行したクエリーとDDL監査ログのテーブルを持ち、クエリーのテキスト(昇順)と日付(降順)でインデックスを張っています。

クエリーログのiCloud同期(選んだ場合のみ、伏せ字化済み)

「SQLの履歴を、あなたのiCloudに。認証情報は抜きで。」

Macの履歴をiPadから検索できます。認証情報は取り除かれています。

CloudKitのコンテナiCloud.org.caliope.caliope、400レコードずつのバッチ、設定できる保持期間(標準は90日)。アップロードする前に認証情報を伏せ字にします。同期する前にiCloudアカウントの状態を確認します。

セクションごとの同期スイッチ

「iCloudに何を送るかは、あなたが決めます。」

全部か無かではなく、大事なものだけを同期できます。

iCloud全体のスイッチの横に、あなたのiCloudにコピーされるものごとの独立したスイッチがあります。「設定」には、iCloudキーチェーン、アプリケーションのエラーログ、システムメッセージ。クエリーログはそのツールから、AIアシスタントの会話はその履歴のパネルから。

何ギガバイトものダンプ

「722 MBのダンプを、68 MBのメモリーで。」

バックアップと復元は、もうマシンのRAMの量に左右されません。400万行の722 MBのダンプでもピークは68 MBで、それを復元するのに19秒、使うのは14 MBです。キャンセルすると、最後まで走らせるのではなく、本当にダンプが止まります。

エンジンが指揮し、プロバイダがSQLを書きます。バックアップにエンジンを加えるには、BackupDataSourceを実装するだけで、ほかには何も要りません。テスト用のハーネスは、エンジンに触れずに、SQLiteとPostgresの方言でそれをメモリー上に実装しています。復元は押し込まれるのではなく、1文ずつ引き出します。バッファ付きのストリームは黙って文を落とし、成功を告げて終わるからです。読み込みにはマップしたファイルではなくread(2)を使います。同じ分割で、FileHandleでは常駐メモリーが+201 MB、この方法では1.1 MBと測られました。

あなた自身の設定のバックアップ

「iCloudに触れる前に、コピーがあります。」

Calíopeがデバイスの外に置いているもの(プロファイル、グループ、環境設定)をすべて書き出し、読み込めます。iCloudのコンテナへのスケジュールされたコピーと、危険なこと(同期の有効化や無効化、消去、読み込み)の前に自動で作られるローカルの復元ポイント付きです。

これは測られた出来事から生まれました。iPadで同期をオンにしたら、28のプロファイルを持つ16 470バイトのconnections.jsonが、サンプルのプロファイルひとつだけの514バイトのものに置き換わったのです。秘密情報は選んだ場合だけ含まれ、常に暗号化されます(AES-GCM、210 000回の反復のPBKDF2-SHA256。ソルトとコストはファイルに書かれます)。含めなかったものは、その理由とともにコピーに書かれます。省いたものを隠すコピーこそ、すべてを復元できると思い込ませるものだからです。復元はマージで、バックアップが何かを削除することはありません。

すべてのAppleの画面

iPhoneのCalíope

「Macが目の前になくても、クライアントのすべてを。」

同じCalíopeを、電話向けのレイアウトで。ビューアではなく、クライアントのすべてです。サーバに接続してクエリーを実行でき、SQLエディタ、スキーマブラウザ、ダッシュボード、ER図、レポートがすべてそろっています。接続プロファイル、保存したスニペット、クエリーの履歴、アシスタントとの会話は、あなた自身のiCloudで運ばれてすでに待っています。ロック解除はFace ID、5つの言語、そして何も接続する前に見て回れるデモモード。MacやiPadと同じApp Storeのページからインストールでき、ホーム画面には同じ2つのウィジェットが加わります:ピン留めしたサーバのメトリクス(ロック画面にも)と、フリート全体のヘルスです。

これはiOSのバイナリで、iPadと同じコードです。外したツールはひとつもなく、ツリーのどこにもデバイスの判定はありません。変わるのはレイアウトで、機能の一覧ではありません。接続プロファイルは共有のiCloudファイルを置き換えるのではなくマージされるので、狭い画面では表示されないフィールド(SSHトンネル、証明書、文字セット)も手つかずで保たれます。iCloudがなければ、空の画面を見せてすべて順調だと思わせるのではなく、閉じているスイッチの名前を示します。

Apple WatchのCalíope

「iPhoneを取り出さずに、サーバに何があったかを。」

手首のCalíopeは、iPhoneのCalíopeと一緒に届き、同じ購入に含まれていて、別に買うものはありません。Calíopeが公開するシステムメッセージを表示します。7つのグループの17種類で、完了または失敗したバックアップとレポート、長く走ったクエリー、切れて戻ったSSHトンネル、失敗したiCloud同期、しきい値に近づいたサーバを扱います。日ごとにまとめられ、専用のスイッチで選べる通知と、空の画面も見せてくれるデモモードがあります。

メッセージは識別子と生の数値として運ばれ、完成した文として運ばれることはありません。時計の言語がMacと違うことは珍しくないので、文は手首で書かれます。選んだ間隔は最小値であって約束ではありません。アプリが閉じているとき、いつ起こすかを決めるのはwatchOSです。そしてアプリは、そのことを設定画面のいちばん下に灰色で書くのではなく、いちばん上に書いています。基準点は壁の時計ではなく最後に届いたメッセージです。起動はとばされることがあり、「直近の15分に何かあった?」と聞けば、残りは失敗もせずに捨てられてしまうからです。読むだけで、あなたのどのサーバにも接続を開きません。

Apple TVのCalíope

「部屋の向こうから読む、フリートのヘルス。」

MySQL、MariaDB、TiDB、PostgreSQL、SQL Server、Oracle Database、ClickHouseで動かしているサーバのための、壁のダッシュボード。サーバごとにタイルがひとつあり、その状態(正常、警告、重大、到達不能、データなし)と、何かがおかしいときは、何がおかしいかを表示します。稼働時間、接続数、実行中のスレッド、1秒あたりのクエリー数、キャッシュヒット率、最も長く実行中のクエリー、レプリカの遅延。テレビはナビゲートするデバイスではないのでタブは2つで、まず見て回れる8台のサーバのデモのフリートもあります。ホーム画面のいちばん上の列にCalíopeを置くと、その上の帯に、公開されたサーバが緊急度の高い順に表示され、続いてこのサイトのデモビデオが並びます。カードを選ぶと、そのサーバが開きます。

古さは、Calíopeが宣言する間隔から、読む側が割り出します。公開した側は、自分が公開をやめたことを知らないからです。そうしなければ、金曜日に電源を切ったMacが、週末のあいだずっとダッシュボードを緑のままにしてしまいます。状態は色だけで示されることはなく、しきい値はCalíopeのものです。テレビは塗るだけで、判断はしません。Apple TVにはiCloud DriveもiCloudキーチェーンもないので、「読むだけ」は約束ではなくプラットフォームによって支えられています。

Apple Vision ProのCalíope

「クライアントのすべてを、部屋の中に。」

1.6から、CalíopeはApple Vision Pro上のネイティブなvisionOSアプリです。SQLエディタ、スキーマブラウザ、ER図、バックアップ、レポート、クエリービルダー。ツールはひとつも欠けずにすべてそろっています。サーバに接続し、書き込みもします。ツールナビゲータと開いているタブはガラスの外のオーナメントにあり、どのコントロールも視線に合わせたサイズで、見るとハイライトされます。複数のウィンドウを開き、それぞれ部屋の好きな場所に置いておけます。ウィジェットは壁に掛けたり、テーブルに置いたりできます。MacやiPadと同じApp Storeのページから、同じ購入で入手できます。

iPadと同じアプリですが、互換モードで動かすのではなく、visionOSのために作られています。不透明な背景ではなくシステムのガラス、オーナメントとしてのツールバー、視線のハイライト付きの60ポイントのターゲット、ウィンドウに合わせたサイズのシート、そしてiPadでFace IDとなっているところはOptic ID。以前にもネイティブのパネルを作りましたが、iPadアプリよりできることが少なかったので出荷しませんでした。このアプリは、iPadができることをすべてできます。1.6までは、CalíopeはApple Vision ProでiPadアプリとして、互換モードで動いていました。

モニタリング、診断、レプリケーション

自分のストレージを使うモニタリングエンジン

「サーバのメトリクスを、あなたのサーバに保存。」

Prometheusをインストールせずに、履歴のモニタリング。

専用のコレクタが、自分で選んだストレージのサーバにスナップショットを書き込みます。サンプル(CPU、メモリー、接続数、QPS)とイベント(しきい値の超過、レプリケーションの遅延)のテーブルを用意し、保持期間で自動的に整理します。

インタラクティブな実行計画ビューア

「呼吸する図として見る、クエリーの実行計画。」

JSONやXMLを手で読まずに、クエリーを殺しているフルスキャンを見つけられます。

クエリーを実行せずに、それぞれのエンジンに独自の実行計画を求め — MySQLとMariaDBではEXPLAIN FORMAT=JSON、TiDBではEXPLAIN FORMAT='tidb_json'、PostgreSQLではEXPLAIN (FORMAT JSON)、SQL ServerではSHOWPLAN_XML、Oracle DatabaseではEXPLAIN PLAN、ClickHouseではEXPLAIN PLAN json = 1 — ツリーとして描きます。アクセスの種類で色分けされます:フルスキャン、範囲/インデックスマージ、最適化済み、ソート、結合。access_type、見積もり行数、時間を示すツールチップ。ホイール、トラックパッドのピンチ、ツールバーのボタンで拡大縮小でき — 倍率は常に画面に表示され、トラックパッドがなくても⌘+/⌘−/⌘0で同じことができます。ドラッグで移動します。

クエリープロファイラ

「どこでミリ秒を失っているかが見えます。」

クエリーのどのフェーズに時間がかかっているかを突き止めます。

MySQLとMariaDBではSHOW PROFILEで、それを持たないClickHouseではsystem.query_logのそのクエリーの行を読みます。フェーズ(starting、Sending dataなど)ごとの表と棒グラフで、時間はミリ秒単位です。PostgreSQL、SQL Server、Oracle Databaseでは、このボタンはありません。

スロークエリーログ、どのエンジンでも

「時間がかかりすぎたクエリーについて、サーバがすでに書き留めていること。」

サーバが記録したもの(Calíopeからだけでなく、接続するすべてのクライアントからのもの)を読み、同じ画面でログをオンにし、しきい値を動かし、ログを空にできます。ひとつのボタンでクエリーをエディタに送れ、プロファイラもすぐそこにあります。

エンジンごとに、それぞれの語彙で。MySQLとMariaDB:サーバがテーブルに書き込んでいるときはmysql.slow_logから項目を、performance_schemaから文ごとの要約を読み、しきい値はlong_query_timeです。PostgreSQL:pg_stat_statementsで、実行ごとの1行ではなく文の形ごとに集計し、しきい値はALTER SYSTEMとpg_reload_conf()で設定します。サーバの起動時のコマンドラインで指定されたしきい値は、黙って失敗するのではなく、ここからは変更できないと表示します。Oracle Database:V$SQLのカーソルキャッシュで、Oracleはスローログを持たないので、しきい値は読むときに適用します。AWRは有料のパックが必要なので使いません。SQL Server:sys.dm_exec_query_statsのプランキャッシュで、文ごとに集計します。こちらもスローログを持たず、読むために何かをオンにする必要はありません。ClickHouse:system.query_logで、しきい値はミリ秒、読む前にログをフラッシュします。TiDB:CLUSTER_SLOW_QUERYとSTATEMENTS_SUMMARYの文ごとの要約で、しきい値はミリ秒です。RedisとValkey:専用のツール、スローコマンドで、しきい値はマイクロ秒です。MongoDB:プロファイラはデータベースごとなので、専用のツールです。空の一覧が答えになることは決してありません。ログがサーバのマシン上のファイルに書かれている、performance_schemaがオフになっている、拡張機能がそのデータベースに作られていない、といった場合は、その理由がそのまま画面に表示されます。Auroraでは設定は読み取り専用で、クラスタのパラメータグループにあります。グラフはなく、Calíopeに何かがコピーされることもありません。見るのは、サーバが保持している範囲を、サーバ自身の時計で見たものです。

ガイド付きのKILLを備えたプロセスリスト

「本番を止めたクエリーに、KILLを。」

ターミナルを開かずに、暴走したクエリーを終了できます。

id、ユーザ、ホスト、データベース、コマンド、時間、状態、情報の列を持つSHOW FULL PROCESSLIST。KILL QUERYとKILL CONNECTIONのアクション。PostgreSQLでは一覧はpg_stat_activityから来て、pg_cancel_backendまたはpg_terminate_backendで止めます。SQL Serverではsys.dm_exec_sessionsとsys.dm_exec_requestsから来て、KILLで止めます。Oracle DatabaseではV$SESSIONから来て、各セッションはSID,SERIAL#で示され、ALTER SYSTEM CANCEL SQLまたはALTER SYSTEM KILL SESSIONで止めます。ClickHouseではsystem.processesから来て、実行されているのは接続ではなくクエリーなので、アクションはKILL QUERYのひとつです。

レプリケーションモニタ(古い語彙と新しい語彙)

「古いレプリカも新しいレプリカも、同じパネルで。」

古い語彙と新しい語彙と格闘せずに、レプリカの遅延を見られます。

MySQL 8.0.22以降とMariaDB 10.5.1以降ではSHOW REPLICA STATUS、それより前のバージョンでは自動的にSHOW SLAVE STATUSにフォールバックします。レプリケーションがテーブルごとのClickHouseでは、複製されたテーブル、Keeper、最悪の遅延(秒)、キュー(エントリー数)を表示します。メトリクス:IO/SQLの実行状態、ソースからの遅れの秒数、タイムスタンプ付きの直近のエラー、GTIDセット、ログの位置。自動更新の間隔は設定できます。

レプリケーショントポロジ

「レプリカは、何時間も遅れていてもゼロ秒と言うことがあります。ここでは、それが見えます。」

グループ全体を一度に見られ、実は「いま再接続したところです」という意味の「0秒」を信じなくなります。

どのマシンがプライマリで、どれがレプリカかは、あなたが宣言します。自動検出は何もしません。SHOW REPLICA HOSTSはその瞬間に接続しているものしか見ないので、検出したグループはひとりでに変わり、「このレプリカはいなくなった」と「このレプリカは落ちている」の区別がつかなくなるからです。このクエリーは、矛盾した構成に異を唱えるために使い、構成を変えるためには決して使いません。レプリカが別のマシンから読んでいるかどうかは、ホスト名ではなくserver_idで決めます。Docker、NAT、VPN、トンネルの向こうでは、文字列を比べると、ずっと出続ける誤った警告になるからです。停止したIOスレッドは、遅延がゼロと表示されていても重大で、その横にはGTIDのずれが、引き算ではなく発生元ごとに数えて表示されます。応答しないメンバーがほかのメンバーを道連れにすることはありません。「9台中7台」はふつうの表示で、足りないものは名前で示されます。読むだけで、グループを操作することは決してありません。図には、アクセシブルな代替として表が付いていて、どの状態も色だけで区別されることはありません。

フィルタとPURGEを備えたバイナリログビューア

「バイナリログを、アプリから絞り込み、削除できます。」

mysqlbinlogに降りていかずに、文がどんなイベントを生んだかを監査できます。

DDL/DML/システムに分類したSHOW BINLOG EVENTS、テキスト検索、設定できる行数の上限(標準は300)。暗号化されたバイナリログ(MySQL 8.0.14以降)にも対応。PURGE BINARY LOGS TOは明示的な確認付き。MySQLとMariaDBのみ:ほかのエンジンはバイナリログを持たず、そこではこのツールは提示されません。

ダッシュボード、サーバ情報、サーバヘルスモニタ

「サーバの脈拍を、ひとつのビューで。」

5つのクライアントを開かずに、サーバのヘルスをまとめて見られます。

複数のタブを持つサーバ情報(グローバル変数とセッション変数、グローバルとセッションのステータス、ディスク使用量)、ライブのグラフを持つダッシュボード、そしてサーバヘルスモニタ。

ライブのベンチマーク

「2つのクエリーを天秤に。勝つのはひとつ。」

直感ではなく証拠で、2つのクエリーのどちらかを選べます。

クエリーのバリエーションの実行時間を並べて比べます。

ローカルのアラートと通知

「レプリカが遅れたら、Macが教えてくれます。」

システムが知らせてくれるので、アプリを見つめ続ける必要はありません。

CPU、メモリー、接続数、レプリケーションの遅延のしきい値アラート。macOS/iOSのネイティブの通知。

SQLアラート

「SQLで書いたあなた自身のルールを、代わりに見張ります。」

値をひとつ返すクエリーを書き、演算子としきい値を選ぶと、Calíopeは設定した間隔でそれを実行し直し、ルールが線を越えたら印を付けます。

演算子は>、<、=、<>で、倍精度ではなく正確な10進数として比べます。=と<>はテキストにも使えます。状態は「はい」か「いいえ」ではなく6つ:まだ測っていない、OK、アラート、行なし、サーバ自身のメッセージ付きの失敗、そして保護された環境タグのもとで書き込むために拒否。ルールは全体のスイッチでiCloudを通って運ばれ、測定値はセッションに残るので、古い測定値が現在の値として表示されることはありません。

実行中のものすべてを、一か所に

「実行中のものが、タブを切り替えても消えなくなります。」

クエリー、バックアップ、移行、スケジュールされたジョブが、すべて一か所に登録され、経過時間、宛先、本当に止まる「停止」とともに表示されます。サイドバーのフッター、作業中のタブ、サーバの切り替えから見られます。

処理は自分で登録します。誰もほかの処理のフラグをポーリングしません。推測する登録簿は、結局どちらの方向にも嘘をつくことになるからです。タスク(始まって終わるもの)とモード(誰かがオフにするまでオンのままのもの)は別の型なので、モードには進行状況のバーもストップウォッチもありません。一連の処理は、そのビューが破棄されても生き残ります。コントローラはビューの状態ではなく、タブをキーにしたストアにあるからです。何かが表示されるまでのしきい値は0.8秒です。40ミリ秒のクエリーは処理ではありません。

自分で説明するエラー — そしてiPhoneでも読めます

「原因、提案、記録のある失敗。」

何かがうまくいかないと、Calíopeは何が起きたかを伝え、確認すべきことを提案し、対応するヘルプのトピックにリンクします。すべてが日付とデバイス付きでログに残り、どこにいてもiPhoneから読めます。

どのエラーコードもエンジンの名前を含みません。ネイティブのコードの表はそのプロバイダと一緒にあるので、エンジンを加えることはプロトコルを実装することです。ネイティブの番号はメッセージから拾うのではなく、型付きのパケットから読みます。以前のドライバはそれを出力しなかったので、認証情報の失敗が接続の失敗に分類され、ポートを確認するよう案内していました。iPhoneでは読み取り専用で、整理と削除はデスクトップに残ります。そして「エラーなし」は主張です。空の画面の6つの異なる理由を区別しています。チャンネルが閉じているだけなのに良い知らせを伝えるのは、それ自体がひとつの嘘だからです。

ネイティブのウィジェット

macOSのデスクトップウィジェット

「サーバの状態を、デスクトップでひと目で。」

Calíopeを開かずに、サーバの脈拍がわかります。

小、中、大、特大のファミリー。スナップショットは共有のApp Groupから、安全な同時読み込みのためのファイルコーディネーション付きで読みます。安全なしきい値より大きいペイロードは拒否します(DoS対策)。

iPhoneとiPadのホーム画面とロック画面のウィジェット

「ロック画面に、あなたのサーバ。」

iPhoneやiPadのロック画面に、サーバのメトリクス。すぐそこにあります。

iPadでは7つのファミリー(小、中、大、特大、そしてアクセサリの長方形、円形、インライン)、特大のないiPhoneでは6つ。

Apple Vision Proの、壁のウィジェット

「窓の横に掛かった、サーバの脈拍。」

同じウィジェットを部屋の壁に置けます。ピン留めしたサーバのメトリクスが、見上げればそこにあります。

小、中、大、特大の、Macと同じ4つ。visionOSにはロック画面がありません。ガラスの質感なので壁が透けて見え、壁に埋め込むか壁から浮かせるかは、置くときに選べます。

フリートのヘルスのウィジェット

「見守っているすべてのサーバと、いちばん悪いのはどれか。」

1台のサーバではなく、フリート全体を見る2つ目のウィジェット。見守っているサーバの数と、いちばん状態の悪いサーバの様子を、Macのデスクトップ、iPhoneとiPadのホーム画面、Apple Vision Proの壁に。

小、中、大のファミリーで、Mac、iOS、visionOSで同じです。そのデバイスでサーバヘルスモニタが測ったものを共有のApp Group経由で読み、拡張機能が自分で何かをクエリーすることはありません。特大とロック画面のファミリーは、意図して持たせていません。

ピン留めしたプロファイルへのディープリンク

「ウィジェットをタップ → そのサーバのダッシュボード。一度の動作で。」

ワンタップで、正しいサーバのダッシュボードにいます。

プロファイルが結び付いているときのウィジェットのURLはcaliope://server/<uuid>、そうでなければcaliope://にフォールバックします。

AppIntentによる選択

「サーバごとにウィジェットひとつ。天気のウィジェットと同じように編集できます。」

サーバごとに違うウィジェットをピン留めでき、設定は数秒で済みます。

AppIntentConfigurationを通じて、システムのウィジェット編集のUIで設定できます。ユーザがコードを書く必要はありません。

システムの割り当てに従うバックグラウンド更新

「大事なときに更新し、そうでないときは眠ります。」

ウィジェットはバッテリーを消耗させず、それでいて新しいデータを表示します。

タイムラインのポリシーで制御をWidgetKitに任せ、システムの更新の割り当てを尊重します。新しいデータがないときは、最新のスナップショットにフォールバックします。

システムとの連携

SiriとApp Intents

「Calíopeを開かずに、SiriからSELECT COUNT(*)。」

アプリを開かずに、ショートカットからクエリーを実行したり、データベースの一覧を出したりできます。

登録されたインテント:サーバに接続、クエリーを実行(見出し付きのTSVを返します)、データベースの一覧、ワークスペースのタブを開く。セッションとデータベースのマネージャをAppIntentsに公開する内部のブリッジが支えています。

macOSのメニューと.sqlファイルの扱い

「Spotlightから.sqlで開けます。どのネイティブアプリとも同じように。」

WindowsやElectronの移植ではなく、本物のMacのアプリとしてふるまいます。

完全なメニューバー:Calíopeについて、SQLファイルを開く、最近使ったファイル、クイックオープン、タブの移動、ヘルプ、新機能、プライバシーポリシー、サポート。.sqlファイルを開く処理はNotificationCenter経由で扱います。

メニューバーのステータス項目

「メニューバーのアイコン:ウィンドウを切り替えずに、接続しているかがわかります。」

アプリを前面に出さずに、接続の状況がひと目でわかります。

接続の状態とアクティブなプロファイルを反映するメニューバーのアイコン。

TipKitによるガイド

「必要なものを、必要なときに見つける。」

機能について、それが関係する瞬間に知ることができます。

ツール全体にわたる状況に応じたヒント(クイックオープン、WHEREビルダー、データの読み込み、実行計画ビューア、スキーマツリーなど)。ツールごと、訪問ごとにひとつずつ、順番に表示されるので、積み重なることはありません。

iCloudの連続性、iPadのジェスチャ、トラックパッド

「Macで書いたSQLが、iPadで待っています — Macの電源が切れていても。」

Magic Keyboardを付けたiPadで、Macと同じように仕事ができます。

選べるiCloud同期が、接続、エディタの内容、環境設定をデバイス間で運びます — 近くにある必要もBluetoothも要りません。iPadのネイティブなポインタとキーボードの扱い。ジェスチャ:エディタと結果のグリッドでのピンチによる文字サイズの変更、セルの画像のピンチによる拡大、結果の行のスワイプ、長押しのコンテキストメニュー、ER図と実行計画ビューアでの移動と拡大、ドラッグできるパネルの仕切り。Split View。

スクリーンショットモード

「素人のキャプチャではなく、ドキュメントにそのまま使えるスクリーンショット。」

統一された見た目の、ドキュメントにそのまま使えるスクリーンショットを撮れます。

macOSでCmd+Opt+Pを押すと、ドキュメントやマーケティング向けにスタイルを整えたPNGが作られます。

アプリ内の「新機能」

「新しいことは、変更履歴ではなくアプリの中で。」

App Storeのリリースノートを読まなくても、新しいことがわかります。

バージョンごとのハイライトと、ローカルに保存される「もう見た」状態。

5つの言語のUI(スペイン語、英語、フランス語、ドイツ語、イタリア語)

「Calíopeはあなたの言語を話します — スペイン語、英語、フランス語、ドイツ語、イタリア語。」

最初にスペイン語で設計されたアプリなので、機械翻訳のようには感じられません。

en、es、fr、de、itの完全なリソースバンドル。言語は、システムの設定でアプリごとにCalíopeに選んだもので、ウィジェットもそれに従います。英語にフォールバックします。

プライバシー、サンドボックス、コンプライアンス

有効なApp Storeのサンドボックス

「サンドボックスはオン — 書いてあるとおりのことをして、それ以上はしません。」

Calíopeは、宣言したエンタイトルメントの外にあるものには一切アクセスできません。システムがそれを強制します。

Appサンドボックスは狭いエンタイトルメントの組み合わせで有効になっています:ネットワークのクライアントとサーバ(SSHプロキシのため)、音声入力(音声からSQLへ)、ユーザが選んだファイル(ドキュメント)、App Group(ウィジェットのため)、印刷、そしてiCloud(CloudKit、クラウドの書類、キー値ストア)。

データ消去サービス

「ボタンひとつで、何も残しません。」

返却したり売ったりする前に、マシンをきれいにするボタン。

Calíopeが保存しているものすべてを、必要なときに削除します。対象は、下の「すべてを消去」に挙げた6つの場所です。

AIの費用を、支払う前に

「正直な価格:どのアシスタントにキーが要るかを、購入時に。」

購入で何が支払われ、何が支払われないかが、正確にわかります。

購入画面は、購入の条件(1回の請求、更新なし、すべてのデバイスで復元可能)の横に、Apple IntelligenceとOllamaにはキーが要らないこと、そしてOpenAI、Gemini、Claudeにはご自身のキーが必要で、それは購入に含まれないことを伝えています。

60日間のお試し付きの買い切り

「60日間無料、仕掛けはありません。」

Calíopeを60日間無料で試せます。使い続けるなら、支払いは一度だけです。

StoreKit 2の非消耗型の製品で、60日間の無料お試しは価格ゼロの非消耗型として提供しています(App Reviewガイドライン3.1.1)。検証はStoreKit 2のAppTransaction.sharedとTransaction.latest(for:)で。復元はAppStore.sync()で。価格は常にproduct.displayPriceから表示します。

すべてを消去し、何が起きたかを知らされる

「6つの場所、ひとつの報告、黙った失敗はなし。」

消去のボタンは、ローカルのファイル、キーチェーン、iCloud Driveのコンテナ、キー値ストア、CloudKit、ウィジェットのデータに届き、さらに墓標を公開するので、ほかのデバイスもすべてを再アップロードするのではなく、消去します。

リモートの消去は同期のスイッチを見ません。スイッチが言うのはこれから何かを上げるかどうかで、すでに何かが上にあるかどうかではありません。オンにして、アップロードして、オフにした人こそ、プライバシーのための消去が取りこぼしてはいけないケースです。伝播は非対称なのでループせず、比較は!=ではなく>なので、スリープしていたデバイスが古い墓標を再公開しても、2回目の消去は起きません。報告にはチャンネルごとに1行あり、件数と失敗が示されます。以前のバージョンは黙ったtry?で書かれていて、いつも「すべて正常に削除されました」で終わっていました。CloudKitが落ちていても嘘にならない文です。

Calíopeを試してみませんか?

このページのすべての機能が、一度の購入に含まれています。60日間無料で、その後は一度買えば、ずっと使えます。

60日間無料で試す →