2026-04-05

週刊オープンソース:goro のための Go ライブラリ

3月30日〜4月5日の週。Pure-Go ライブラリが固まって出てきた週。 動機はどれも同じ — goro だ。PHP は大きな言語で、それを Pure Go で動かそうとすると、cgo も外部依存も無しに Go 側で出来る ことの「穴」を埋めていくしかない。

goro のための Pure-Go ライブラリ

  • gopcre2 — PCRE2 を Pure Go で実装、cgo 無し。後方参照、先読み/後読み、アトミック グループ、再帰パターン、Unicode プロパティ。Go 標準の regexp は線形時間保証のために RE2 を使い、この種の機能をあえて外して いる — だが PHP の preg_* はそれらに依存しているので、goro にも必要になる。
  • gobzip2 — Pure Go の bzip2 実装(圧縮も)。標準の compress/bzip2 は解凍専用。 goro では PHP の bzcompress を動かす必要があるので、両方向を bzip2 1.0.8 のリファレンスから実装した。
  • gomailparse — ストリーミング MIME パーサ。io.Reader から一度だけ読み、 ヘッダとバイトオフセットだけを保持して、本文は一切バッファ しない。goro のメール処理面を支える部品で、巨大なメッセージを インデックスするときも効率を保つ設計。
  • gotz — Go で IANA タイムゾーンデータに生でアクセスするパッケージ:遷移点、 ゾーンタイプ、POSIX TZ ルール、tzdata 同梱。標準の time の抽象の下に意図的に置いている。goro の日時/タイムゾーン まわりが PHP の挙動に合わせるには、下位データに直接触る必要が あるため。

こちらも今週着手

  • pktkit — ゼロコピーの L2/L3 パケット処理。FramePacket は型付きヘッダアクセサを 持つ []byte のエイリアスで、ラッパーのアロケーションも ホットパスでのコピーも無い。4月4日に作成、週末までに35コミットで IPv4 + IPv6 のプリミティブを一通り敷いた。goro とは別系統だが、 「Pure Go、cgo 無し」のルールは同じ。
  • aipencil — 構造化 JSON のシーン記述から SVG / PNG を生成する CLI。狙いは、 AI システムに、サイズや座標ではなく内容と関係性を宣言させる ことで、決定的で安価な画像出力の道を与えること。同じ入力から 常に同じ画像、GPU 不要。4月2日作成で、今週が最初の本格稼働の 週(18コミット)。

サンドボックスとネットワーク

話題の距離感より近い関係にある2つ。

bnpm — 「Bubble NPM」。 Linux namespace の中でパッケージマネージャのコマンドを サンドボックスする。マウント名前空間と pivot_root で、 プロジェクトディレクトリ(読み書き)と読み込み専用のシステム パスだけに可視性を制限。ビルド/テストコマンドはネットワーク 名前空間が空でネット完全遮断、インストールコマンドは ユーザースペースの TAP プロキシ経由で、許可したレジストリだけに DNS と IP でフィルタをかけて通す。root 不要、非特権のユーザー 名前空間で動く。狙いは、悪意ある install スクリプトが物理的に プロジェクトツリーの外に到達できない状態を作ること。

slirp — Go 版の ユーザーモード NAT / IP スタック。今週28コミット。オリジナルの SLIRP と同じ発想で、root も CAP_NET_ADMIN も TUN デバイスも 無しで、プロセスに TCP/IP 接続性を与える。VM のネットワーキング、 コンテナ、プロトコルテスト、ユーザースペースで完結するスタックが 欲しい場面に使う。

PHP in Go、PHP in Rust

goro が128コミット、 並行して進めている Rust 版 goro-rs が50コミット。どちらも PHP 本家のテストスイートを通す方向への 地道な前進。

他にも今週

  • libwallet — 13コミット。マルチチェーン対応モバイルウォレットの着実な前進。
  • unixshells/mobile — 13コミット。iOS / Android 向けの SSH / Mosh / SFTP クライアント。
  • teamclaude — 11コミット。クォータベースで自動ローテーションするマルチ アカウント Claude プロキシ。
  • squashfs — 8コミット。Pure Go の SquashFS(読み書き両対応)。