あらゆるNixパッケージをブラウザでライブ実行
Any Nix package, live in the browser (fzakaria.com)
要約
この記事では、ブラウザ上でNixパッケージを直接実行できる革新的なシステム「trynix.dev」を紹介しています。ユーザーは、Nixパッケージマネージャーの全履歴から任意のバージョンを選択し、WebAssembly上で動作するLinux環境でコマンドラインプログラムを実行できます。これにより、ローカル環境へのインストールなしに、Nixの強力なパッケージ管理と実行環境を体験できます。
全文翻訳
あらゆる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がビルドした正確なストアパスを、それが存在したあらゆるバージョンで取得できます。
生成されたバイナリがあれば、それらを実行できます。そして、それらを実行できれば、ホストマシンに何もインストールせずに、ブラウザタブ内でそれらのどれでも実行できます。
trynixへようこそ。これはブラウザベースのNixパッケージランナーです。nixpkgsの完全な履歴、310,083以上のパッケージバージョンをブラウズし、それらのどれでも実行できます¹¹これはシリアルコンソールなので、グラフィカルなものはありません。マシンはシェルにブートし、ストア内の任意のコマンドラインプログラムを実行できます。タブ内で起動するLinuxマシンで実行できます。これはメモリ内のNixストア、WebAssembly内のLinuxカーネル、そしてページ内のターミナルエミュレータです。
[動画: スクリーンキャスト:pfetchをnixpkgsで検索し、バージョンを選択して、ブラウザでシェルにブートする]
これはすごい!🤯 数秒でストアパスの閉包を持つVMをブートできます。何もプリインストールされていません:検索、バージョン選択、ブート、実行。
最もクレイジーな点は何でしょうか?公開キャッシュに限定されません。自分でビルドしたストアパスを共有でき、誰でもブラウザタブでそれをブートできます。唯一の要件は、キャッシュがaccess-control-allow-origin: *で提供されることです。これはGitHub Pagesでは無料で提供され¹²GitHub Pagesがバイナリキャッシュとして機能できることを知って少し驚きました。単なる静的ファイルサーバーであり、すべてのファイルにaccess-control-allow-origin: *を提供します。これは、Nixストアパスをtrynixで利用可能にするために必要なすべてです。、Cachixや、もちろんcache.nixos.orgでも提供されます。
信じられない偶然ですが、私は5年前にcache.nixos.orgに
access-control-allow-origin: *を提供するようにissue#156でリクエストしていました。これは、私が実装したOpenAPI仕様からキャッシュをクエリできるようにするためでした。宇宙に感謝します。🙏
このリンクはcache.nixos.orgには存在しないストアパスをGitHub Pagesから提供してVMをブートします。それでもブラウザタブでブートします。
##§ピースをはめ込む
access-control-allow-origin: *を提供するキャッシュからストアパスにアクセスできるため、ブラウザは正当なNixクライアントになります。
ブラウザがこれまで欠いていたのは、バイナリを実行する場所でした。なぜなら、それらはx86-64またはaarch64のELF実行ファイルだからです。
巨人の肩の上に立ち、私たちはWebAssemblyでLinuxカーネルを実行できます。これは、ブラウザタブ内で実際のx86_64カーネルをブートできることを意味します。そのカーネルにNixストアを含むファイルシステムを与えます。残っているのは、どのストアパスを取得する必要があるかを知ることだけです。これはnixpkgs-multiverseで美しく解決しました。🤌
私は自分自身に繰り返し言い聞かせなければなりません:上記の図にはサーバーはありません。ウェブページは純粋に静的なファイルであり、それ以外のすべては公開されているキャッシュです。これはタブ内だけに存在する仮想マシンです。Erase your darlingsの究極の具現化です。
Nixなので、同じパッケージの複数のバージョンを管理するシンプルさが得られます。1台のマシンでhelloの2つのバージョンをブートできます。各バイナリは絶対パス(RUNPATH)で自身の依存関係(ローダーやlibcまで)を指定するため、競合しません。
VMが起動したら、実行中にさらにストアパスを追加できます。これは、ラップトップの/nix/storeにパスを追加するのと何も変わりません。再起動も、dnf installも、apt-get installも不要です。サイトは閉包を取得し、ストアに追加します。
##§即時性を感じさせる必要がある
エミュレーション下でカーネルをブートするのは遅いです。このアイデアは素晴らしいですが、シェルを取得するのに30秒かかるとしたら、誰も使わないでしょう。
サイトは、即時性を感じさせるためにいくつかの巧妙なトリックを使用しています。サイトはエンジンとVMスナップショットをバックグラウンドでプリフェッチするため、リンクをクリックする頃にはすでにダウンロードされています。
サイトはVMをゼロからブートすることはありません。再開します。マシンは、同じQEMUのネイティブビルド上で事前に一度ブートされ、ストアをマウントする直前の瞬間に一時停止され、その後スナップショットに保存されます。
その後のサイトへのアクセスでは、エンジンとスナップショットはすでにブラウザキャッシュにあるため、取得する必要があるのは要求したストアパスの閉包だけです。これにより、各後続のアクセスがより速く感じられます。
パフォーマンスの機会やボトルネックの多くを見つけるのに、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ヘッダーを提供し、悪用使用されるのを待っていました。古いものをブートしに行きましょう。