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 パケット処理。
FrameとPacketは型付きヘッダアクセサを 持つ[]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(読み書き両対応)。