概要
SELFフォーマット は、プログラム自体が SQLiteデータベース として動作する新しい実行形式。 実行ファイルとアプリケーションデータ を一つのファイルに統合し、SQLで全て管理可能。 self-httpd はこのコンセプトを実証するWebサーバーで、プログラム・Webサイト・ログ全てを一元管理。 デプロイや編集 もトランザクションで安全・簡単に実施可能。 従来の ファイルシステムやデプロイ手法 を大幅に簡素化する革新的なアプローチ。
SELF: プログラム=データベースという新しい実行形式
- SELFフォーマット は、実行ファイルそのものが SQLiteデータベース で構成される新しい形式
- binfmt_misc 機能を利用し、カスタムインタプリタがsegmentsテーブルの行をマッピングし、エントリポイントへジャンプ
- バイナリツール群が SQLクエリ に集約される利点
- 実行ファイルがデータベースであるため、 プログラムの状態保存 も同じファイル内で可能
- /var/ や /tmp/、 /home/ 等のディレクトリが不要となり、全てが一つのファイルで完結
self-httpd: 実証Webサーバー
- self-httpd は、SELFフォーマットを用いた 単一ファイルWebサーバー のプロトタイプ
- プログラム本体、Webサイト、ルート、訪問ログなど全てが 一つのSQLiteファイル に格納
- サーバー起動やリクエスト処理、ログ保存も全てこのファイル内で完結
- 例:
sqlite3 server 'SELECT count(*) FROM presses'でボタン押下回数を即時確認 - すべての状態(アクセスログ、ボタン押下履歴等)が同じファイルに トランザクション的に保存
redbeanとの比較とSELFの特徴
- Justine Tunney の redbean はZIPアーカイブを使った単一ファイルWebサーバー
- SELF はアーカイブ形式不要で、 データベース自体がコンテナ となる
- redbeanはLuaフックでレスポンスを操作、SELFは handlersテーブル にSQLをINSERTするだけ
- redbeanが「Actually Portable Executable」なら、SELFは「Actually Queryable Executable」
- SELFでは
SELECTでプログラム内容を直接クエリ可能
プロセス自身へのアクセスと実行
- argv[0] を利用し、実行中のプロセスが自分自身(実行ファイル)を開いてSQLiteとして扱う
- /proc/self/exe は利用不可だが、binfmt_miscのサポートで今後改善予定
- インタプリタがSQLite接続を解放してからエントリポイントへジャンプし、プログラムが自分自身を自由にクエリ・更新
self-httpdの構造とアセット管理
- テーブル構成: routes (コンテンツ)、 visits (訪問ログ)、 presses (ボタン押下ログ)
- アプリケーションスキーマの作成やWebサイトのINSERTも、全て DDL/SQL で完結
- アセットパイプラインも「普通のWebサーバー」と同じだが、 内容取得がSQLクエリ で自己参照的
- サーバー本体、Webサイト、ログ全てが「server」ファイル一つに集約
トランザクションによるライブ編集とツール活用
- ACIDトランザクション 対応で、稼働中のWebサイトも即座に編集・ロールバック可能
- 例:
sqlite3 server "UPDATE routes SET body = readfile('new.html') WHERE path = '/index.html'" - sqldiff 等の既存ツールで、デプロイや変更差分の監査・可視化も容易
- FTS5 で全文検索も即座に追加可能、自己インデックス化Webサーバー実現
デプロイ=ファイル一つの転送
- scpやssh で単一ファイルを転送するだけでデプロイ完了
- コードとデータが一体化しているため、 INSERT ... SELECT でデータ移行も容易
- ファイル差し替え&再起動で、ログや状態もそのまま引き継ぎ可能
- segmentsテーブル等も通常のデータベーステーブルと同様に扱える柔軟性
実際に触ってみよう・今後の展望
- 実際のサーバーは https://selfdb.exe.xyz で稼働中(※動作保証なし)
- ボタン押下は即座に 実行ファイル内にINSERT
- ソースコードは fzakaria/selfdb で公開
- さらなる応用例や「Actually Queryable Executable」の発展に期待
- 「プログラム=データベース」 という発想で、従来の多くの仕組みが不要に
- 「Never, ever underestimate the importance of having fun」 (Randy Pausch)を体現するプロジェクト