Skip to content

Instantly share code, notes, and snippets.

@n4mlz
n4mlz / simple-type-regexp.ts
Last active May 17, 2025 08:01
TypeScript の型のみで実装した簡易的な正規表現エンジン
type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y
? 1
: 2
? true
: false;
type And<A extends boolean, B extends boolean> = A extends true
? B extends true
? true
: false
@n4mlz
n4mlz / failure-work-tiny-runc.md
Last active January 27, 2025 12:18
tiny-runc の失敗と Go の悪口

tiny-runc は、非特権環境で動作する OCI Runtime Specification 準拠の低レベルコンテナランタイムを目指して開発している。tiny-runc という名前の通り、「runc」という OSS を参考に書いている。runc は、Docker や Podman の中で動いている低レベルコンテナランタイムである。実際は youkiappare45 作の socker など、多くのコンテナランタイムの実装を参考に書いている。

tiny-runc はコードをめちゃくちゃ丁寧に書いて、人々のコンテナ自作の実装のサンプルにして欲しい!みたいな気持ちがあって書いていたが、だいぶ失敗した。まず Go はシステムプログラムに向いていない。fork と exec を分離できないのは論外。例えば fork したあとの処理を親と子で 1 つずつ書けばいいところを、わざわざ子プロセス用の処理を自身のサブコマンドとして分けて、親から自分自身を呼び出す、みたいな遠回りなことをしないといけない。しかもそうすると明確にプロセスが別れてしまうので、親で利用していた構造体を子で使うみたいなことができない。せっかくオブジェクト指向的抽象化を行っているのに、プロセスを fork するたびに exec を行ってしまうと、もう一度同じ構造体を作らないといけない。

ちなみに runc ではこの問題を、「namespace の分離の部分は C 言語で記述する」という方法を取って解決している (参考)。ただこの方法は「シンプルで理解しやすいコードで簡潔に記述する」という、tiny-runc で満たしたか