週次オープンソース:サンドボックスの中の 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 エンコーダは仕様を先へ進み続ける。