2026-07-19

週次オープンソース:サンドボックスの中の Node.js、バイト単位で同一の FTS5、本物の AV1 エンコーダ

先週の 3,000 コミットのあと、今週は約 850 コミットだった。作業は 最近始まったプロジェクトをさらに深める方向に向かった。 システムコール層の Linux サンドボックスである nixvm では Node.js が動いた。graphitesql は全文検索インデックスに、SQLite が書くのと同じバイト列を書かせた。z3rs はバッチ型の パイプラインを本物の DPLL(T) 探索に置き換え始めた。メディア スタックでは、AV1 エンコーダが残っていた複合予測とスクリーン コンテンツ向けのツールの大半を取り込み、ProRes コーデックは完成が 宣言された。

nixvm:Node.js が動き、サンドボックスは厳しくなる

nixvm はゲストカーネル なしで素の Alpine ユーザランドを動かす。ゲストのシステムコールは Rust のカーネルへトラップする。先週は、Node.js は読み込めるが イベントループがビジースピンする、という既知の制限を記録して 終わった。今週それが直った。ファイルディスクリプタのテーブルが スレッド間で共有されるようになり、futex の requeue とタイマーによる 起床が入り、コミットには 「node runs」 とある。続いて ソフトウェアの x86-64 インタプリタ上でも動いた。そのためには、 V8 の JIT が出す SSE 命令(PALIGNR、PTEST など)、ハードウェアと 同じシステムコールの振る舞い(RCX ← RIP、R11 ← RFLAGS)、 フラグとデコードの修正が必要だった。この段階のコミットには 「TurboFan runs」 とある。V8 の最適化 JIT が x86-64 のコードを 生成し、それを nixvm が解釈実行しているということだ。

週の残りはサンドボックスを固める作業だった:

  • W^X。 インタプリタは命令フェッチ時に NX を強制するように なった。KVM バックエンドは保護マップからゲストのページテーブルを 組み立てるので、書き込み可能なページを同時に実行することは できない。
  • シグナル。 SIGSEGV、SIGILL、SIGBUS がゲストのハンドラへ同期的に 届く。KVM 側は正確なページフォルト処理と AVX の状態を得た。
  • スケジューリング。 両バックエンドで、時間に基づく本物の プリエンプション。KVM_RUN はロックなしで走って本当に並列に動き、 システムコールは呼び出しのたびに受け渡すのではなく、ビッグカーネル ロックの下でその場で処理されるようになった。
  • 浮動小数点。 依存なしのソフトフロート。本物の 80 ビット x87 と MXCSR の方向付き丸めを備え、x87 の超越関数(FSIN、FYL2X、 FPREM など)もそろった。

graphitesql:バイト単位で同一の FTS5

graphitesql (82 コミット、v0.1.1 から v0.1.3 までのリリース)は一つの目標に 絞った。FTS5 の書き込みを SQLite が出すものとバイト単位で同一に する ことだ。コミットからは調査の過程が一歩ずつ読み取れる。削除の 多い負荷での食い違いは、まずデータ依存として特徴づけられ、次に automerge の欠落が原因と突き止められ、さらに発動のしきい値 (FTS5_WORK_UNIT=64)まで特定された。automerge のスケジューリングが 実装された。続いて、トランザクション内での削除・更新、 セーブポイント、プレフィクスインデックスのスパニングセグメント、 「二重カスケード」のクライシスマージ、detail=none/detail=column のトゥームストーンが、いずれもバイト単位で同一になった。 integrity_check は壊れた転置インデックスを検出するようになった。

FTS5 の書き換えの繰り返しは b-tree の弱点もあぶり出し、それらは 修正された。大きなキーが繰り返し書き換えられてもページ分割は 壊れず、分割時には兄弟ページが再配分され、予約されたページバイトは 守られ、INSERT OR REPLACE やカスケード削除のあとには空の葉が 詰められる。ほかの修正として、SQLite の WAL チェックポイントモードと ホットジャーナルの復旧を移植し、整合性チェックにファイル全体の ページ勘定を加え、定期実行されるプロセス kill によるクラッシュ 耐性テストを追加した。

z3rs:オンライン DPLL(T) へ

z3rs は Z3 の回帰 コーパスに対する差分スイープを続けた。多くのコミットはそのコーパスの 特定の issue を一件ずつ閉じるもので、いくつかは誤った判定を直す。 そのうち二つは CHC エンジンだ。構造上の変化は週の終わりにあった。 オンライン DPLL(T) の最初の部品が入った。EUF の競合コア、算術の Farkas 競合コア、検証済みの等式伝播の仕組み、そして SAT 探索ループ 内の理論伝播フック。これは Z3 自身が使うアーキテクチャで、理論は 探索のあとで検査されるのではなく、探索と相互に作用する。

そのほか:Z3 の bv_rewriter と array_rewriter の規則の移植、 get-model での未解釈関数の完全な解釈、多項式の飽和による非線形の 反駁、そして z3 と同じ形でエラーを報告し、コマンド単位で回復し、 :print-success に対応するパーサ。

oxideav-av1:B ピラミッドとスクリーンコンテンツ

先週本物のエンコーダになった oxideav-av1 は、残って いた AV1 の符号化ツールの大半を加えた。新しいツールにはそれぞれ、 自前で符号化した適合ストリームが付く:

  • 参照構造: order hint、skip モード、参照フレームの動き ベクトル、そして後方参照、順序を入れ替えた符号化、 show_existing_frame を伴う B ピラミッド GOP。
  • 複合予測: wedge と差分重み付けのマスク付き複合、距離重み付け (jnt-comp)の複合、smooth と wedge のインターイントラ合成。
  • パーティション: 拡張 T 字形と四分割ストリップ形、さらに 8×8 未満のインターとイントラのブロック。
  • スクリーンコンテンツ: k-means クラスタリングで選ぶ輝度と 色差のパレット、キーフレームでのイントラブロックコピー探索。
  • セグメンテーション: P フレームでのセグメントごとの量子化。

適合コーパスは 50 から 64 ストリームに増え、v0.1.15 がリリース された。

oxideav-prores:完成

クリーンルームの Apple ProRes コーデックである oxideav-prores は、 両方向で残っていた穴を塞いだ。アルファチャンネルの符号化、4:2:2 と 4:4:4 のアルファ付き型付きサーフェス、16 ビットと深い (10/12/16 ビット)アルファ形式、そしてより詰めたレート制御の探索。 どれも参照エンコード・デコードに対してブラックボックスで検証した。 README からステータスの項は消え(「コーデックは完成した」)、 クレートは v0.1.0 としてリリースされた。

今週その他

  • Pure-Rust の ICU 相当である intlrs に、ウンム・ アル=クラー暦、ペルシア暦、中国暦、朝鮮の檀紀暦、和暦(元号)の 書式化、formatRange、タイ語・クメール語・ビルマ語・CJK の辞書 による単語分割、中国語のピンイン・画数・注音による照合順序が 加わった(v0.5.1)。
  • anydcode には、 Aztec、Micro QR、rMQR、MicroPDF417 のカメラ検出、任意の回転での 1D 復号、印刷された App Clip Code の検出が入った(v0.1.2)。
  • TibaneApp は多言語 (英語、フランス語、日本語、ポルトガル語)になり、ホーム画面が 作り直され、スワップの残高が USD でも表示されるようになった。 libwallet の Rust 移植はリクエストの承認とオブジェクトのルーティングまで進み、web3 プロバイダは同一オリジンのフレームに制限された。

来週

nixvm は「node runs」から、node によるパッケージのインストールを 動かす段階へ向かう。graphitesql は同じバイト単位の手法を FTS5 の外へ 広げる。z3rs は DPLL(T) のコアを本格的な理論伝播へと育てる。AV1 エンコーダは仕様を先へ進み続ける。