週次オープンソース:Pure-Rust の ICU、そして rsurl が curl パリティへ
先週、Pure-Rust で C なしのスタックが公開された——暗号、圧縮、
SSH、curl。今週はそこに新しい柱が生えた:国際化だ。intl
は ICU をゼロから作り直したアナログで、no_std かつ Pure-Rust、
公式の Unicode 適合性スイートが 100% 通る。その横に no_std の
日時クレートが二つ着地した。そしてスタックは固まった:
rsurl が機能的 curl パリティに到達し、puressh は現行の
purecrypto へ移った。
intl:Pure-Rust の ICU
intl——「Pure-Rust、
#![no_std] の国際化プリミティブ、ICU の Pure-Rust アナログ」
——が見出しだ。Unicode 17.0.0 を対象とし、コアアルゴリズムは
公式適合性スイートが 100% 通る状態で出荷される:Normalization、
Collation、Grapheme/Word/Sentence と Line の分割、Bidi。設計は
良い意味で変わっている:Unicode Character Database をオフライン
ジェネレータが Rust の match ディスパッチに直接コンパイルする
ので、あらゆるプロパティ参照が何も確保せず、ランタイム初期化も
要らない const fn になる——起動時にパースするのではなく、
テーブルをコードにする。全体が no_std で、アロケータなしでも
使え、組み込み/カーネル/WASM 向けに features でコードポイント
範囲を選べる。
今週は v0.1.3 から v0.3.1 へ、広げてから締めた:
- Collation — 公式 CLDR ルールからのデータ駆動テイラリング、
アルファベット索引(
index_labels/index_bucket)、 primary 強度の文字列検索(find/contains)。 - 字訳(Transliteration) — transform エンジンの集合量化子と マッチ参照、加えてアルメニア語とグルジア語のローマ字化。
- 数の読み上げ — RBNF の序数読み上げ(
spell_ordinal)、 敵対的入力でのスタックオーバーフロー修正付き。 - IDNA — 完全な IDNA2008 妥当性(CheckBidi / ContextJ /
Hyphens / V1 / V5 / V6)、
VerifyDnsLength、正直な適合性基準。 - スプーフ検出 — UTS #39 の confusable スケルトンと、
Script_Extensionsによる single-script 解決。
そして専用のセキュリティパスが、適合性作業で浮かんだ一連の
サービス妨害(DoS)の穴を塞いだ:collation と Bidi の二次スキャン
を線形/O(1) 化、文分割の先読みをメモ化、Punycode のデコード爆弾
とドメイン長の上限、MessageFormat の再帰深さ上限、そして
POSIX TZ オフセットのパースと GMT オフセットの整形における
チェック付き演算(いくつもの潜在的 i32 オーバーフロー panic)。
timezone-data + strtotime
同じファミリーの小さな no_std クレートが二つ着地した。いずれも 既存の Go ライブラリの移植だ:
timezone-data
(gotz の移植)は、多くの
ライブラリが秘匿する IANA タイムゾーンデータを露出する——遷移、
ゾーン型、POSIX TZ ルール、うるう秒。598 ゾーンすべてが
ビルド時に静的 Rust オブジェクトへ事前パースされ埋め込まれるので、
ランタイムのパースもビルドスクリプトもホスト tzdata 依存もなく、
外部クレートはゼロ:参照は &'static データ上の二分探索で、
確保なし。
strtotime
(PHP の strtotime() を写した
strtotime の移植)は、
PHP 形式の日時表現を確保なしで Unix タイムスタンプにパースする
——トークンは入力のスライスを借り、作業集合はスタックに乗る。
実 PHP から取った 669 ケースのコーパスに対して検証し、すべてに
一致する——DST に依存する結果、DST ギャップでの fall-forward、
極端な年の int64 オーバーフローを含めて。DST 対応は
timezone-data 由来で、マイクロ秒の小数秒も入った。
rsurl:curl パリティに到達
rsurl——purecrypto +
compcol の上の Pure-Rust curl——は今週、機能パリティのロード
マップを閉じ、no-C 不変条件のもとで機能的 curl パリティ完了を
宣言した(v0.0.4 → v0.0.6)。着地は、おおよそロードマップ順に:
- プロトコル — SMTP/SMTPS 送信と最小の TELNET クライアント、 先週の 14 種の上に。
- 認証 — HTTP Digest、AWS SigV4 のリクエスト署名
(
--aws-sigv4)、--oauth2-bearer。 - TLS — mTLS クライアント証明書、公開鍵ピンニング、
--capath/--crlfile(CRL 失効)、--tlsv1.x/--tls-maxのバージョンピンニング、両方の TLS バックエンドで。 - 転送 — HTTP/1.1・HTTP/2・HTTP/3・FTP/FTPS のダウンロードを
sink へストリーム(本体が丸ごとメモリに乗らない)、ストリーム
解凍、
-Z/--parallelの並行転送、URL グロビング({a,b}と[1-100]レンジ)、--unix-socket、--connect-to、リダイレクト 制御、リトライ一式。 - CLI 表面 —
-wのフェーズタイマーと%header{}補間、--json、低速アボート(-y/-Y)、-K設定ファイル、--nextマルチオペレーション、加えて C ABI 越しの libcurl 形の オプション十種とman/rsurl.1ページ。
puressh:ext-info とさらなる zeroize
puressh(v0.0.4)は
RFC 8308 の拡張ネゴシエーションを追加した——KEXINIT の
ext-info-c / ext-info-s マーカー、SSH_MSG_EXT_INFO を
プロトコル上の正しいタイミングで送受信、公開鍵認証でサーバが
広告する server-sig-algs を優先。セキュリティの地道な作業も
続いた:ChaCha20-Poly1305 の K_1/K_2 と Poly1305 ワンタイム鍵の
ゼロ化、DH/ECDH 共有秘密のスクラッチの拭き取り、pcssh_sftp_read
のコピーを呼び出し側の上限にクランプ、raw モードガードでの
シグナル安全な termios 復元。暗号の床も現行に上げた:purecrypto
0.2 → 0.6.1。
OxideAV:レンダラが合流、そして簡潔化スイープ
oxideav-render が
新顔——フレームワーク向けの Pure-Rust な 3D シーン → ラスター
画像/動画レンダラ。週のうちにフェーズで立ち上がった:Renderer
トレイト+バックエンドスタブ、make_renderer(Scanline) の裏の
スキャンラインバックエンド、名前付きバックエンドの
RenderRegistry、そしてレンダリングしたシーンが transcode
パイプラインにソースとして挿さる RenderSource: FrameSource
ブリッジ(レイキャスタはまだ保留)。ワークスペースには
cli-convert + mesh3d の下で配線された。
週次のマルチエージェントコーデックスイープは続き(ラウンド → 253)、ワークスペースの README は「フルテーブル簡潔化スイープ」を 受けた——多くのクレートが飽和した今、ラウンドごとの変更履歴の 連なりを剥がし、100% 完了の行をまとめた。
来週
intl は Unicode コアの上で ICU の表面を埋め続ける。timezone-data と strtotime は API を固める。rsurl はパリティに到達したので、 堅牢化と互換 no-op の長い尾へ向かう。puressh はスキャフォールドの 先で状態機械を埋め続ける。oxideav-render はスキャンライン経路の 裏でレイキャスタに着手する。