2026-05-03

週次オープンソース:libwallet のラストマイル、OxideAV のドキュメントスタック

二本柱の週になった。libwallet は go-live の手前 0.1% を詰める作業、 OxideAV は長期ビジョンに向けた構成要素を増やす作業。

libwallet:ラストマイル

libwallet はもう 99.9% できている。いま入っている修正は、実際に本物のチェーンに 向けて wallet を使っていないと見つからない種類のもので、机上で 設計した新機能ではなく、現場で出てくるエッジケースだ。1 週間で v0.4.5 から v0.4.15 まで上がった。

いちばん手が入ったのは Bitcoin まわり:

  • 直前の tx がまだ伝播中でも、連続送信でダブルスペンドしないよう にするためのインメモリ UTXO トラッカ。
  • コイン選択の前に「すでに使った txo」を除外(使用済みの出力を 選んでしまうフローがあった)。
  • 未署名の Bitcoin 送金のドライラン(wlttx/simulate)。UI 側で 「これだとどれくらいかかる?」を、署名を求める前に見せるための もの。
  • Account:listUTXOs + Dart 側の utxos フィールドで手動 UTXO 選択ができるように。入力ごとの vsize 計算も正しく。
  • 受信だけでなく m/0m/1 の両方の派生ブランチから使える ように。xpub のクエリは modchain_lookupTxoBIP32 経由に統一。

EVMSignAndSend が自動で検証を回すようになり、fees / nonce / gas を呼び出し側が事前に正しい形で埋めなくても、 ちゃんと収まるようになった。

AccountAccount:addressFormats で多形式のアドレスピッカー (legacy / segwit / native segwit / taproot ほか)を公開。 FindAccount は入力がインデックス済みのレコードと一致しなかった 場合、現在のネットワークから派生したアドレスにフォールバックする ように。

これらに共通するパターンは「新しい抽象を増やしたわけではなく、 本物のユーザがぶつかる境目で正しい挙動を入れた」ということ。

OxideAV:長期ビジョン

OxideAV の目指すところは、ffmpeg と ImageMagick を 1 つの ピュア Rust プロセスに統合し、信用できない入力にも安全に走らせ られるようにすること。

両方を 1 つのプロジェクトでカバーする理屈は、人間工学の話ではなく 技術的なもの。最近の画像フォーマットは、要するに「動画コーデック を 1 フレームに使ったもの」になっている。WebP は VP8 のイントラ フレームを RIFF で包んだもの。HEIC / HEIF は HEVC のイントラを ISOBMFF に入れたもの。AVIF は AV1 のイントラを同じ要領で。 「画像」と「動画」の距離は、片方を ImageMagick、もう片方を ffmpeg に分けて扱う合理性が薄れるところまで縮んでしまった。それぞれが 何十年分の CVE と C 依存を抱えていることを思い出すと、なおさら。

既存ユースケースを呑み込むだけでなく、OxideAV はどちらの既存 プロジェクトもまだ得意としていない領域も狙っている。ベクター PDF → ベクター SVG 変換——パスやグラデーションをラスタに潰さず、 パスとグラデーションのままラウンドトリップさせるやつ——はその 一例。同じ方向にもう少しある。

それが目標。今日時点での OxideAV はまだ使える状態ではない—— 全クレートが v0.0.x / v0.1.x で、複数年かけて作るタイプの長期 プロジェクトの、回収はずっと先のフェーズ。

今週入った進捗を領域ごとに:

ドキュメントスタック

W17 の scene モデル は PDF / ライブ配信 / NLE のために scaffold だけ用意した状態で、 中身となる構成要素がなかった。今週それが入った:

  • oxideav-ttf — TrueType パーサ。COLR/CPAL のベクターカラー絵文字レイヤースタック (v0 + v1)、Apple 風 sbix の PNG/JPEG ビットマップカラーグリフ、 TTC コレクションのサブフォントまで。
  • oxideav-otf — OpenType / CFF パーサ(sfnt + CFF + Type 2 charstrings、 キュービックベジェのアウトライン)。
  • oxideav-scribe — フォントラスタライザ+シェイパ+レイアウト。週中でベクター 専用にリファクタした。ピクセルパイプラインは捨てた——ドキュ メントスタックの他の層は最後までベクターで持ちたいから。
  • oxideav-raster — ベクター→ラスタの描画カーネル。Lanczos2(4×4 windowed sinc)の 画像リサンプリング。
  • oxideav-pdf — ベクターがベクターのままの PDF リーダ/ライタ。パスはパス、 グラデーションはグラデーションのまま、途中でラスタ化しない。 bytes → Scene のラウンドトリップを top-level walker で実装。
  • oxideav-svg — SVG のリーダ/ライタ。<text> / <tspan> は scribe の ベクターファースト API 経由。<mask> / <clipPath> は マルチシェイプ clip + SoftMask 合成つき。<filter> は graceful にパススルー。

加えて画像フォーマットで oxideav-tiff(TIFF 6.0) と oxideav-pbm (Netpbm — PBM/PGM/PPM/PNM/PAM)。

ロスレス系の一括追加

アーカイブ/編集向けのロスレスデコーダを 7 本: TTA(True Audio)、 Ut VideoShortenHuffYUV / FFVHuffLagarithMagicYUVWavPack

旧来+現代ニッチ

旧来: Cinepak(CVID)、 Indeo 2(RT21/IV20)、 SVQ1(Sorenson)、 Cook(RealAudio)、 WMAMusepackaptX(classic + HD Bluetooth)、MIDI (SoundFont 2 / SFZ / DLS のソフトシンセ scaffold つき)。

現代: EVC(MPEG-5)、 JPEG XS(プロダクション /IP 映像向けの低レイテンシ)、 DTS(Core + EXSS / XCH / XXCH / X96 / XLL 拡張)。

合成メディア

oxideav-generator — 正弦波、グラデーション、フラクタル、テストパターンを生成。 generate:// URI のソースとしても、入力なしフィルタとしても 使える。label でテキスト → 画像も(scribe 経由)。

ほかに今週

ほぼ背景作業:

  • goro(Go で書く PHP) — 最適化フェーズ。コンパイル時にリテラルの *ZVal をキャッシュ、 ラッパーなしの ZVal.SetVal 高速パス、operatorMath のアロケ 削減。
  • goro-rs(Rust で書く PHP)— PCRE 正規表現エンジンを大幅に書き直し。PHP テストスイート での通過率は今のところ約 50%。
  • cterm — 入力 RPC を ストリーミング化(バッチフォールバック付き)。タイピングの 低レイテンシ化。
  • klbslog + rest — リトライ/ トークン更新リトライ時にリクエストボディをリセットする修正。

来週

goro に VM が入る。libwallet は go-live への詰めが続く。