世界を動かす技術を、日本語で。

クエリ可能な実行ファイル

2026年8月26日原文(fzakaria.com)

概要

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 Tunneyredbean は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)を体現するプロジェクト

Hackerたちの意見

これと実際のポータブル実行ファイルの間で、誰かがスプレッドシートのPNGや、部屋の向こうでDOOMを表示する音声ファイルを作ってないとは思えないな。HNでは、純粋なCSSでマインクラフトを実装するという、まさに呪われたアイデアに驚かされるよ(他にもCSSでできる悪夢みたいなことがあるし)。ビットを自由に配置することでできることの信じられないほどの創造性を示してる。こういう呪われたプロジェクトに夢中で、ずっと続いてほしいな。

PoC || GTFOには、PDFでありながら有効なNES ROMでもあるという問題があって、PDF自体のmd5sumを表示するんだ。こういうクレイジーなトリックが何年も続いてる。 https://dl.packetstormsecurity.net/mag/pocgtfo/pocorgtfo14.p...

アプリケーション(非SELF)スキーマを追加するためにバイナリを後処理する代わりに、リクエストを処理する前にデータベースのマイグレーションを実行することができるよ。だから、プロセスを開始するたびに、アプリは自分のスキーマを作成したりアップグレードしたりするんだ。SELFのアップグレード(へへ、自分のアップグレード)やロールバックプロセスは、もう少し... 派手な... 手法があった方がいいかも。君の例では、新しいバイナリが古いデータをコピーしてるけど、その後新しいバイナリをデプロイ先に移動させなきゃいけない。つまり、サービスを停止して、データを移行して、ファイルを置き換えて、サービスを再開する必要があるってこと。もしアップグレードプロセスが... 古いバイナリに新しいSELFデータを書き込んで、SIGHUPを送信して、サービスが自分自身をフォークして実行するような感じだったらどうだろう?haproxyみたいにゼロダウンタイムでFDを引き継ぐことができるかも。既存のファイル内のSELFデータを置き換えるのは今は安全だけど、もし賢いBLOBアライメントのmmapの方法を見つけたら、SELFのアップグレードをデータ移行みたいにできるかも!セグメントやシンボルをINSERTして、フォークして実行、データ移行で古いコードを掃除する感じ。:-D SELFスキーマを更新して複数のセグメントやシンボルのセットを許可すれば、このアップグレードトリックができるし、他にもいろんな面白いことができる... コードセグメントだけが異なる薄いマルチアーキバイナリとかね。BLOBアライメントは、静的アセットの提供をより効率的にするはずだし、他にもいろんな良いことがある... 確実に調査する価値があるよ。ただし、すごく強いけど、これが楽しいとはいえ、インターネットに接続されたサービスのバイナリが自己書き込み可能になるのは絶対に許可しないよ。 :-)

「インターネットに接続されたサービスのバイナリが自己書き込み可能になる」って、これSQLインジェクションを全く新しいレベルに引き上げるね!!!

完全なディストリビューションだけでなく、すべてのアプリケーションの状態を1つのファイルにまとめられるから、/var/や/tmp/、/home/、他のファイルシステムが必要なくなるんだ。プログラムは、自分が実行しているファイルの中に自分の状態を保存できて、それをトランザクション的に行える。 一方で:それはあまり望んでないかな。バイナリに静的コンテンツを含めるのは確かに意味があるけど、書き込み可能なランタイムデータをそこに保存するのは雑な感じがする。読み取り専用のバイナリに書き込み可能な状態ディレクトリを渡す方が好きだな(nixや他の不変ディストリビューションにかなりの時間を費やしてきたことは言っておく価値がある)。 もう一方で:これはしばらく見た中で最もクールで楽しいことだし、ぜひ1000%進化させてほしい。ハッカーの精神が漂っているときに、完璧に運用された不変デプロイメントなんて気にしないよ。これを使ってAPEがやることの一つ、ファットバイナリを実行できると思う。プログラムのテキストがデータベースにあるなら、もう一行追加するのは何でもないよね?ただSELECT text FROM executable WHERE arch = $(uname -m)で、さあ行こう:) 編集:実際、さらに考えると、これはSmalltalkにぴったりだね。VMとイメージを一つのファイルに入れられる。

同じバイナリの複数のインスタンスを実行してたらどうなるんだろう?

SQliteがコンテナフォーマットとして使われてるのが本当に可愛いと思うけど、同じように使われる他のものに思いを馳せてしまう。アプリを開発するのに好きな方法の一つは、Luaを使うことなんだ。効率的なコアアプリケーションフレームワークを構築して、Lua VMを埋め込んで、プログラムのロジックや制御フローをLuaで行う。そして、luastaticを使ってLuaバイトコードをバイナリに入れれば、さあ出発!この技術を使ってLuaバイトコードとして状態を追加できるから、数十年待ち望んでいたことが実現できるかもしれない - マイグレーション。アプリが状態を安全に保存して、バイナリ自体を別のマシンに転送して、優雅に復元できるってわけ。もちろん、これはLuaだけでなく、どんなツールでも使えるけど、Luaの状態テーブルに全てのランタイムバイナリを含めるというアイデアは本当に魅力的で、試してみたいな。

これは狂ってるし、危うくバカに近いけど、それが今年のハッカーニュースで見た中で最高のものの一つになってる。ほんと素晴らしい。

うん。なんか、こういうクールでトリッピーな話題の頻度がHNでは減ってきて、AI関連の話題が増えてる気がする。

危うく天才的でありながらバカな感じだと思う。

だから、LispやAPL、Smalltalkのプログラムイメージみたいな感じだけど、SQLが原動力になってるってことだね。古いものが新しくなるってことだ。これは軽蔑的な意味じゃなくて、単に素晴らしいアイデアが、当時は勝てなかったけど、将来的には力強く戻ってくるかもしれないってことだ。

そうだね!読んでいるときにこれを進化させる方法を考えていたんだけど、ひとつのアイデアが何度も浮かんできた:SQLiteデータベースにコンパイルされたコードを保存するのではなく、コードを表すs式のような原始的なものを保存したらどうだろう?そうすれば、通常のINSERTとして定義をリアルタイムで更新できる。そこで、私はLispを再発明してしまったことに気づいた。

Hacker Newsで議論の続きを見る