Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Nix入門パラダイム編

asa1984
October 27, 2024

 Nix入門パラダイム編

Nix meetup #1 に登壇した際のスライド

asa1984

October 27, 2024
Tweet

Other Decks in Technology

Transcript

  1. 歴史 asa1984 2024-10-26 Nix meetup #1 2003 Eelco Dolstra氏の研究プロジェクト として開発開始

    2006 NixOSを発表 2015 NixOS Foundation 設立 2024 Nix meetup #1 開催
  2. 背景 asa1984 2024-10-26 Nix meetup #1 目的 特徴 G 「正しいデプロイ」を行える安全・柔軟なシステムの実g

    G 「デプロイ」の定u G ソフトウェアを配置し、使用可能な状態にするこ9 G パッケージのインストールのことだと考えてよい — 完全な依存関係管™ ˜ ソフトウェアコンポーネントの干渉の回~ x 原子的なアップグレード / ダウングレー u ソースコード / バイナリデプロイの透明¢ € 安全な削除(ガベージコレクション)
  3. 異なるパラダイムを学ぶには asa1984 2024-10-26 Nix meetup #1 難しさの原因 x パラダイムが異なるかh x

    同じ言葉、違う意` x プリミティブな部分が別P x 既存のメンタルモデルが学習の妨げになる 解決策 wi 比喩しな— qi ボトムアップ式に学p –i 受け入れ’ ni 記憶を消す 急峻な学習曲線
  4. 1. パッケージのスコープ asa1984 2024-10-26 Nix meetup #1 ドメイン固有 汎用 €

    複数の言語・ツールの管理に対e € OSのアプリ、共有ライブラリなu € 例: OSのパッケージマネージャ € 特定の言語・エコシステム専l € 言語のライブラリなu € 例: 言語固有のパッケージマネージャ
  5. 2. 管理のスコープ asa1984 2024-10-26 Nix meetup #1 ローカル グローバル T

    システム or ユーザー単位で管理 T プロジェクト単位で管u T マニフェストファイルが存在すg T グローバルインストールにも対応 していることが多い
  6. 3. 権限領域 asa1984 2024-10-26 Nix meetup #1 ユーザー root U

    sudo必B U システムインストールを行F U ドライバやカーネルなどの インストールが可能 U sudo不t U ユーザーインストールを行う
  7. 4. インストール形式 asa1984 2024-10-26 Nix meetup #1 ビルド バイナリ E

    バイナリを直接取得 E ソースコードを取T E ローカルでビルド ハイブリッド
  8. Nixの場合 asa1984 2024-10-26 Nix meetup #1 パッケージのスコープ 汎用 管理のスコープ グローバル

    & ローカル 権限領域 ユーザー(※1) インストール形式 常にビルド(※2) ※1. NixOSはroot領域を操作可能 ※2. バイナリキャッシュ(後述)を利用するとバイナリインストールが可能
  9. 純粋関数 asa1984 2024-10-26 Nix meetup #1 入力に対して出力が一意に定まっている 出力が一意でない u 数学的な関“

    † 写像の定義を満たq † 「入力」に対して「出力」が一意に定まU u 利— u 振る舞いが決定d u つまり、必ず再現する
  10. ˆ ビルドを関数に見立てe c ビルド成果物 = f (ビルド入力€ ˆ ビルド成果物はビルド入力から一意に導かれ4 ˆ

    ビルド入力: ソフトウェアコンポーネントを同定する全要 ˆ ソースコー‚ ˆ ビルド時依存・実行時依T ˆ プラットフォームの情3 ˆ ビルドスクリプ ˆ その他 純粋なビルド asa1984 2024-10-26 Nix meetup #1 ビルド入力 ビルド 成果物 ビルド
  11. C ビルドの副作c d 暗黙的依T d 外部の環境変@ d インターネットアクセE C ビルド環境をサンドボックス

    d ビルド入力を明示的に指定しないと ビルドに失敗すÈ d 自動的に副作用が排除される サンドボックスによる副作用の排除 asa1984 2024-10-26 Nix meetup #1
  12. 3 ビルド成果物を一元管B 3 ハッシュをキー(ストアパス)として単一階層に格7 3 ストアオブジェクトは不Y 8 上書きが発生しな" 8 ハッシュで厳密に区別されるため、他のコンポーネントと干渉しなp

    3 複数のバージョンが共存可能 ビルド成果物の一元管理 asa1984 2024-10-26 Nix meetup #1 Nixストア ストアオブジェクト ストアオブジェクト ストアオブジェクト openssl-1.1 openssl-3.0 openssl-3.1 SHA-256 SHA-256 SHA-256 SHA-256 SHA-256 SHA-256
  13. e Nixにおける最小単U e ビルド入力とハッシュ(ストアパス)が記述された中間表 e Derivationはビルド成果物に一意に対応す Ã 実質、パッケージ = Derivation

    Derivation (導出) asa1984 2024-10-26 Nix meetup #1 Derivation ビルド 成果物 Realise Realisation Derivationから実際にビルド成果物を生成する手順
  14.  パッケージに相当するもの: Derivatiop  一般的な「パッケージ」という単位で管理していなE  Derivationとビルド成果物を区別する意味はなE  成果物はレシピから一意に導かれ1 

    つまり、宣言7  パッケージをビルドするにはDerivationを扱う必要があ1 Ä Nix言語の登場 Nixにおける「パッケージ」の意味 asa1984 2024-10-26 Nix meetup #1 Derivationの汎用性  Derivationは何でも導け1  実行可能ファイルでも、ただのテキストファイルでもよE  あらゆるソフトウェアコンポーネントをDerivationとして扱える
  15. 2種類のデプロイ asa1984 2024-10-26 Nix meetup #1 ソースコードデプロイ バイナリデプロイ t デプロイ先でビルg

    t 依存関係の整合性を確保できf t リソース消費が大きい t デプロイ前にビルg t 整合性を損なう可能性があf t リソース消費が小さい ビルド ビルド
  16. ビルドが決定的な場合 asa1984 2024-10-26 Nix meetup #1 ソースコードデプロイ バイナリデプロイ v デプロイ先でビルi

    v 依存関係の整合性を確保できh v リソース消費が大きい v デプロイ前にビルi v 整合性を損なう可能性があh v リソース消費が小さい ビルド ビルド = 等価になる
  17. バイナリキャッシュ asa1984 2024-10-26 Nix meetup #1 Derivation ビルド 成果物 Realise

    バイナリキャッシュ サーバー クラウド ローカル ハッシュを照会 ビルド成果物を直接取得
  18. リモートビルド asa1984 2024-10-26 Nix meetup #1 Derivation ビルド 成果物 Realise

    リモートマシン クラウド ローカル Realisationを委任 ビルド成果物だけ送信
  19. 4 安全なアンインストー1 4 依存関係ツリーを利用した安全な削È 4 有効化されたパッケージから辿れない パッケージを自動的に削除 ガベージコレクション asa1984 2024-10-26

    Nix meetup #1 ストアオブジェクト Derivation ストアオブジェクト ストアオブジェクト ストアオブジェクト ストアオブジェクト ストアオブジェクト ストアオブジェクト 有効なパッケージと してマーク
  20. p パラダイムシフc p 今後、Nixのパラダイムが普及するのではないA p 安全・柔軟・正しいデプロv p 複雑性の高まりによる破綻の防 p (パラダイムが同じならNixでなくてもよい

    p Nixフレンドリーなプロジェクc p 言語・ツール・プロジェクトによってパッケージングの難易度は大きく変わる 展望 asa1984 2024-10-26 Nix meetup #1