インフラ・DevOps
あらゆるNixパッケージをブラウザでライブ実行
Any Nix package, live in the browser (fzakaria.com)
要約
この記事では、ブラウザ上でNixパッケージを直接実行できる革新的なシステム「trynix.dev」を紹介しています。ユーザーは、Nixパッケージマネージャーの全履歴から任意のバージョンを選択し、WebAssembly上で動作するLinux環境でコマンドラインプログラムを実行できます。これにより、ローカル環境へのインストールなしに、Nixの強力なパッケージ管理と実行環境を体験できます。
全文翻訳
tl;dr https://trynix.dev で試してみてください。hello、または2017年のpython 3.6.2、あるいはhelloの2つの時代の同時実行、または公開キャッシュに存在しないパッケージをクリックしてください。
Linuxマシンがタブで起動し、それらのNixパッケージがPATHにあるシェルが得られます。
これは私のNix作業の集大成です。
私が作成してきたすべてのアイデアは、より大きなもののためのブログを構築していました:nixpkgs-multiverseはnixpkgsが出荷したすべてのパッケージのすべてのバージョンをインデックス化し、grailはそれにバージョン範囲を教え、omniflakeは単一の入力から16,000以上のflakeを追加することを可能にしました。
最近私が抱いたクレイジーな洞察は、nixmultiverse.comの「高速モード」のクレイジーさです。これにより、評価をスキップしてストアパスに直接進むことができます。
これにより、評価とビルドの複雑さに対処することなく、Nixの驚異的な能力を活用できます。
パッケージを要求するだけで、Hydraがそれをビルドした正確なストアパスを、過去の任意のバージョンで取得できます。
生成されたバイナリがあれば、それらを実行できます。
そして、それらを実行できれば、ホストマシンに何もインストールせずに、ブラウザタブでそれらのいずれでも実行できます。
ブラウザベースのNixパッケージランナー、trynixへようこそ。
あなたはnixpkgsの完全な履歴、310,083以上のパッケージバージョンを閲覧し、それらのいずれかを実行できます。
11これはシリアルコンソールなので、グラフィカルなものはありません。マシンはシェルにブートし、ストア内の任意のコマンドラインプログラムを実行できます。
これはクレイジーです!🤯
ストアパスの閉包を持つVMを数秒で起動できます。
何もプリインストールされていません:検索、バージョン選択、ブート、実行。
最もクレイジーな部分は?
公開キャッシュに限定されません。
自分でビルドしたストアパスを共有でき、誰でもブラウザタブでそれを起動できます。
唯一の要件は、キャッシュがaccess-control-allow-origin: *で提供されることです。これはGitHub Pagesが無料で提供します。
2GitHub Pagesがバイナリキャッシュとして機能することを知って少し驚きました。それは単なる静的ファイルサーバーであり、すべてのファイルにaccess-control-allow-origin: *を提供します。これは、Nixストアパスをtrynixで利用可能にするために必要なすべてです。
幸運なことに、私は5年前にcache.nixos.orgにaccess-control-allow-origin: *を提供するようにリクエストしました。これは、私が実装したOpenAPI仕様からキャッシュをクエリできるようにするためです。
ありがとう、宇宙。
🙏
このリンクは、変更されたGNU helloのGitHub Pagesから提供されるストアパスを持つVMを起動します。
これはcache.nixos.orgに存在しないストアパスですが、ブラウザタブで起動します。
§ピースをはめ込む
access-control-allow-origin: *を提供するキャッシュからストアパスにアクセスできるため、ブラウザは正当なNixクライアントになります。
ブラウザが欠いていたのは、バイナリを実行する場所でした。なぜなら、それらはx86-64またはaarch64のELF実行可能ファイルだからです。
巨人の肩の上に立ち、WebAssemblyでLinuxカーネルを実行できます。
これは、実際のx86_64カーネルをブラウザタブ内で実行できることを意味します。
そのカーネルにNixストアを含むファイルシステムを与えます。
残りは、どのストアパスを取得する必要があるかを知ることだけです。これはnixpkgs-multiverseで美しく解決しました。
🤌
trynix
cluster_browser
あなたのブラウザタブ
ページ
ページ
mv nixpkgs-multiverse
属性 + バージョン → ストアパス
ページ->mv
どのパス?
キャッシュ
cache.nixos.org
narinfo + NARs
ページ->キャッシュ
閉包
ストア
Nixストア(メモリ内)
vm
qemu-wasm
x86_64 Linux
ストア->vm
9p
ターミナル
あなたのシェル
vm->ターミナル
キャッシュ->ストア
解凍済み
上記の図にはサーバーがないことを常に思い出させる必要があります。ウェブページは完全に静的なファイルであり、それ以外はすべて公開されているキャッシュです。
それはあなたのタブの中にだけ存在する仮想マシンです。
「あなたのダーリンを消去する」の究極の具現化です。
これはNixなので、同じパッケージの複数のバージョンを管理するシンプルさが得られます。
1台のマシンでhelloの2つのバージョンを起動でき、それらは衝突しません。なぜなら、各バイナリはローダーとlibcに至るまで、絶対パス(RUNPATH)で独自の依存関係を名前付けするからです。
VMが起動したら、実行中にさらにストアパスを追加できます。
これは、ラップトップの/nix/storeにパスを追加するのと変わりません。
再起動、dnf install、apt-get installは不要です。サイトは閉包を取得し、それをストアに追加します。
§インスタントでなければならない
エミュレーション下でカーネルを起動するのは遅く、アイデアは素晴らしいにもかかわらず、30秒かかってもシェルが得られない場合、誰もそれを使用しないでしょう。
サイトは、インスタントに感じさせるためにいくつかの巧妙なトリックを使用しています。
サイトはエンジンとVMスナップショットをバックグラウンドでプリフェッチするため、リンクをクリックする頃にはすでにダウンロードされています。
サイトはVMをゼロから起動することもありません。
再開します。
マシンは、ストアをマウントする直前の瞬間にネイティブビルドの同じQEMUで一度起動され、一時停止され、その後スナップショットに保存されます。
サイトへの後続の訪問では、エンジンとスナップショットはすでにブラウザキャッシュにあるため、取得する必要があるのは要求したストアパスの閉包だけです。
これにより、後続の各訪問はより速く感じられます。
1980-01-01T00:00:00+00:00
image/svg+xml
Matplotlib v3.10.5, https://matplotlib.org/
0
2
4
6
8
python3
ripgrep
hello
7.5
4.3
4.2
3.5
1.7
1.5
シェルまでの秒数
初回訪問
再訪問
LLMがパフォーマンスの機会とボトルネックの多くを見つけるのに役立ったことに、ここで多くのクレジットを与える必要があります。
「面白いアイデア」として始まったものは、彼らの助けを借りて信じられないほど使いやすいプロジェクトになりました。
すべてのパフォーマンス作業にもかかわらず、まだインスタントではありません。
使用するには十分速いですが、インスタントではありません。
バイナリの実行は、エミュレーション下で実行されるため、依然として遅いです。
バイナリを初めて実行すると、x86_64からWebAssemblyに変換され、時間がかかります。
変換はメモリにキャッシュされるため、後続の実行はより速くなります。
最後に、取得できる閉包のサイズに上限があります。
閉包全体はタブメモリに収まる必要があり、現在約1.5GiBのハードリミットがあり、WebAssemblyは32ビットアドレス空間であるため4GiBのハードリミットがあります。
§単なる見世物以上のもの
デモは明らかに楽しく印象的ですが、単なる見世物以上のものですか?
私は、これがNixを使用および活用する新しい方法になりうる無限のアイデアを考えてきました。
ソフトウェアを使用してプルリクエストをレビューする。
CIがCachixのようなキャッシュにプッシュしている場合、そしてNixを使用している場合、人間が見る頃にはPRは実際の成果物を生成しています。
ボットはリンクを残すことができ、その成果物を正確に起動します。
レビューアはクローンせず、ビルドせず、スクリーンショットを信頼しません。
クリックするだけで、すぐにソフトウェアをテストできます。
「これはバグを修正しますか?」は思考実験ではなくなります。
エージェント成果物。
エージェントはNixストアパスを成果物として生成でき、それらの成果物は人間や他のエージェントと共有できます。
ボットはストアパスを生成でき、別のボットはそれをブラウザタブで起動してテストを実行できます。
それ自身の環境を持つバグレポート。
「私のマシンでは動作します」は、再現のためのURLになりました。
実行可能なドキュメント。
ツールのバージョンを指定するチュートリアルは、その正確なバージョンがPATHにあるシェルにリンクできます。これは永遠にピン留めされ、読者と最初のコマンドの間にインストールステップはありません。
考古学。
ソフトウェアの過去のバージョンを実行して、その動作を探索できます。
2017年のPythonバージョンを実行してそれが何をするかを見たり、2005年のhelloバージョンを実行して今日のバージョンとどう違うかを見たりできます。
これはNixで既に可能でしたが、今ではブラウザで実行できます。
ソースはgithub.com/fzakaria/trynixにあります。
Nixキャッシュは、長年、静かにオープンCORSヘッダーを提供しており、悪用されるのを待っていました。
古いものを起動してください。