Pro Yearly is on sale from $80 to $50! »

Nixについて

C1d2f103212bb3539c800ed39b4a8a75?s=47 mt_caret
October 08, 2017

 Nixについて

C1d2f103212bb3539c800ed39b4a8a75?s=128

mt_caret

October 08, 2017
Tweet

Transcript

  1. Nixについて @mt_caret

  2. 調査

  3. 関数型言語を知っている Haskell, OCaml, F#, Scala, Lisp, Clojure, Erlang, etc.

  4. 関数型言語を書いている Haskell, OCaml, F#, Scala, Lisp, Clojure, Erlang, etc.

  5. Nix: There and Back Again

  6. Nixの世界 - Nix(言語) - Nix(パッケージマネージャ) (↓ここからおまけ) - NixOS(OS) - NixOps(オーケストレーション)

  7. Nixの世界 - Nix(言語) - Nix(パッケージマネージャ) - NixOS(OS) - NixOps(オーケストレーション)

  8. Nixの世界 - Nix(言語) - Nix(パッケージマネージャ)←本質 - NixOS(OS) - NixOps(オーケストレーション)

  9. そもそもNix(パッケージマネージャ)とは? パッケージマネージャ(トートロジー) Linux, OSX, (Windows?)で動く OSのパッケージマネージャと共存可能

  10. これまでのパッケージマネージャの問題点 mutability: 多くのパッケージマネージャはパッケージ をインストールする時、/bin等を始めとしたグローバ ルな空間を汚染していく => パッケージのアンインストール => 同じパッケージの異なるバージョンとの共存 しんどいし時間が経つにつれシステムについて論じ

    るのが難しくなっていく (“Global shared state is the root of all evil”)
  11. None
  12. Nix(パッケージマネージャ) $ which bash $ realpath `which bash` $ echo

    $PATH
  13. Nix(パッケージマネージャ) /nix/store/<ハッシュ値>-<パッケージ名>/と いうREADONLYな領域に一意に定まるよ うに導入され、依存するパッケージやライブ ラリも同様に/nix/store/にあるものを指す。 ex. $ ldd `which bash`

  14. Nix(パッケージマネージャ) 同じソフトウェアで別なバージョンがいくつか 有る場合、それぞれ異なるハッシュ値にな るため、共存可 $ ls /nix/store/*-bash-*/bin/bash PATHからのsymlink先を変えるだけで、 バージョンの切り替え可

  15. Nix(パッケージマネージャ) $ nix-env -i hello #インストール $ hello $ nix-env

    -e hello #アンインストール $ nix-env --rollback $ nix-env --list-generations
  16. Nixの世界 - Nix(言語) - Nix(パッケージマネージャ) - NixOS(OS) - NixOps(オーケストレーション)

  17. Nix(言語) - 純粋関数型 - 遅延評価を採用 - 動的型付け

  18. Nix(言語)の文法 let x = 4; # 変数束縛(宣言/初期化) f = num:

    num + 1; # 関数 in f x # 関数適用(呼び出し)
  19. Nix(言語)の文法 let set = { num = 5; str =

    "World!"; }; # 他言語でいうRecord, Hash, Dict list = [ 1 "hoge" 4 { foo = "bar"; }]; f = { num, str }: "Hello, ${str}"; in [ set.num (head list) (f set) ] 評価すると => [ 5 1 "Hello, World!" ]
  20. 純粋関数型 - 関数の戻り値は引数から一意に定まる - 副作用を持たない let sum = 0; function

    calc_sum(num) { sum += num; return sum; } console.log(calc_sum(5)); //=> 5 console.log(calc_sum(5)); //=> 10 console.log(calc_sum(5)); //=> 15
  21. 遅延評価 式の評価(計算)を行う時、式の結果を利用 するまで評価(計算)をしない ex: f (1 + 2)の場合はf (1 +

    2)を必要とする (例えば出力等で)まで1 + 2の計算も、fへ の適用も行われない ex: let x = 5 / 0; in “this works!”
  22. Nix(言語)の文法もうすこし let nixpkgs = import <nixpkgs> {}; # ライブラリのインポート in

    "${nixpkgs.bash}/bin/bash"
  23. Nix(言語)の文法もうすこし let set = { a = "a"; b =

    { c = "c"; }; }; abc = with set; [ a b (with b; c) ]; in abc 評価すると => [ "a" { c = "c"; } "c" ]
  24. 言語とパッケージマネージャの橋渡し - Nix(言語) - Nix(パッケージマネージャ)←本質 - NixOS(OS) - NixOps(オーケストレーション)

  25. Derivation(パッケージ)とRealization Derivationは特定のattributeを持ったSet nix-repl> d = derivation { name = “myname”;

    builder = “mybuilder”; system = “mysystem”; } nix-repl> d /nix/store/9r1...3yn-hoge.drv => /nix/store/9r1...3yn-hoge ex. $ ppsh < /nix/store/9r1...3yn-hoge.drv
  26. Derivationのビルド nix-store -r /nix/store/9r1...3yn-hoge.drv ビルドをする前から分かっているハッシュ値 はどこから来たか? => 参照等価性より引数全部をハッシュした ものでビルド結果は一意に定まる 依存Derivationも引数として渡される

  27. 例: GNU HelloのNix式 { stdenv, fetchurl }: stdenv.mkDerivation rec {

    name = "hello-2.10"; src = fetchurl { url = "mirror://gnu/hello/${name}.tar.gz"; sha256 = "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"; }; doCheck = true; meta = { description = "A program that produces a familiar, friendly greeting"; longDescription = '' GNU Hello is a program that prints "Hello, world!" when you run it. It is fully customizable. ''; homepage = http://www.gnu.org/software/hello/manual/; license = stdenv.lib.licenses.gpl3Plus; maintainers = [ stdenv.lib.maintainers.eelco ]; platforms = stdenv.lib.platforms.all; }; }
  28. これで理論は 完璧なので、 次は運用の 話をします

  29. Nixpkgs (https://github.com/NixOS/nixpkgs) 例のようなNix式が大量に集まったレポジトリ パッケージの数は > 8000 ex: $ nix-instantiate --eval

    --expr "with builtins; length (attrNames (import <nixpkgs> {}))" 普段使うソフトウェアは大体ある (chromium, vlc, libreoffice, etc.)
  30. https://octoverse.github.com/

  31. Nix/NixOSを使ってるとこ - Human Brain Project - Mozilla - TeamViewer etc.

  32. Nixの世界 - Nix(言語) - Nix(パッケージマネージャ) (↓ここからおまけ) - NixOS(OS) - NixOps(オーケストレーション)

  33. Nixの世界 - Nix(言語) - Nix(パッケージマネージャ) - NixOS(OS) - NixOps(オーケストレーション)

  34. の前に、

  35. Nix/Nixpkgsの欠点 - nixpkgsの限界 - パフォーマンス - ドキュメンテーション - コミュニティ(Tokyo NixOS

    Meetup)
  36. NixOS(ここからがやばい)

  37. NixOSの思想 「Nix結構便利なので同じノリでOSを作りま しょう」 => OSのコンフィグがNix(言語)、パッケー ジは全てNix(パッケージマネージャ)

  38. NixOSのコンフィグ hardware = { cpu.intel.updateMicrocode = true; opengl.extraPackages = with

    pkgs; [ vaapiIntel ]; trackpoint = { enable = true; emulateWheel = true; speed = 250; sensitivity = 140; }; pulseaudio.enable = true; };
  39. NixOSのコンフィグ networking = { hostName = "dn"; networkmanager.enable = true;

    extraHosts = '' #0.0.0.0 twitter.com 0.0.0.0 tweetdeck.twitter.com ''; };
  40. NixOSのコンフィグ virtualisation = { libvirtd = { enable = true;

    enableKVM = true; }; docker.enable = true; lxd.enable = true; };
  41. NixOSのコンフィグ services.xserver = { autorun = true; defaultDepth = 24;

    enable = true; videoDrivers = [ "intel" ]; displayManager = { lightdm = { enable = true; background = "${background}"; }; }; windowManager = { default = "xmonad"; xmonad = { enable = true; enableContribAndExtras = true; }; }; ...
  42. NixOSのコンフィグ users = { extraUsers.delta = { isNormalUser = true;

    uid = 1000; extraGroups = [ "wheel" "networkmanager" "libvirtd" "docker" "lxd" ]; hashedPassword = "..."; }; defaultUserShell = "${pkgs.zsh}/bin/zsh"; mutableUsers = false; };
  43. NixOSのコンフィグ /etc/nixos/configuration.nixを編集 # nixos-rebuild switch # nixos-rebuild --rollback # nixos-rebuild

    --dry-run
  44. Nixの世界 - Nix(言語) - Nix(パッケージマネージャ) (↓ここからおまけ) - NixOS(OS) - NixOps(オーケストレーション)

  45. おわび

  46. おわり

  47. 参考文献 - https://nixos.org/nixpkgs/manual/ - https://nixos.org/nix/manual/ - https://learnxinyminutes.com/docs/nix/ - https://nixos.org/nixos/nix-pills/index.html -

    https://github.com/NixOS/nixpkgs/issues/25371 - http://blog.timsears.com/posts/morenix.html - https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/misc/hello/default.nix - https://github.com/Tokyo-NixOS/presentations - https://github.com/NixOS/nixpkgs/blob/master/pkgs/build-support/trivial-builders.nix - https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh - https://nixos.org/nixops/manual/ - https://www.youtube.com/watch?v=w1radFbG1GU