Slide 1

Slide 1 text

Nixでつくるdotfiles 言語処理開発ゼミ 浅田睦葉 (@momeemt) 1

Slide 2

Slide 2 text

2 自己紹介 ・学部3年 ・Wasmで拡張できるマークアップ言語を作っています w/ @uekann_ ・ごはんを作ることが好きです ▲ 料理はほぼプログラミング

Slide 3

Slide 3 text

3 Nixとは? ・再現可能なビルドを提供するソフトウェア  ・言語、ビルドシステム、パッケージマネージャ、OS ・再現可能なビルドとは?  ・同一のソースコードからは、全く同一のバイナリが得られることが保証されたビルド  ・ソフトウェアのバージョン、ソースコード、依存するソフトウェアのソースコードが   変更されれば、生成されるバイナリは変わり得る ▲ 6個のλ

Slide 4

Slide 4 text

4 サンドボックス ・どのように再現性を保証するのか  ・ビルドする際にローカルに存在するソフトウェアには基本的に依存しない   ・OpenSSLのバージョン起因のバグを踏み抜き続けてはや数年  ・ビルド中にネットワーク回線にアクセスさせない   ・パッケージマネージャが別のソフトウェアをダウンロードすることもよくある   ・nodejsのsharp(libvipsというCライブラリに依存している)など    → npm i sharp するとインターネットからバイナリが降ってくる ・お手元のHomebrewは壊れていませんか?壊れたので使うのをやめました

Slide 5

Slide 5 text

5 ・依存するソフトウェアのビルドスクリプトなんか全部書いていたら人は死にます  → そこで NixOS/nixpkgs  ・多くのユーザによって提供されたNixファイル  ・ビルドが維持されているかをチェック(Hydra)され、   PRは再現可能かどうかが適切に検査(Ofborg)されている  ・nix-shell -p pkgs.nodejs などを実行すれば、ローカルにnodejsがなくとも   nodejsを利用できるシェル(環境)に入ることができる nixpkgs

Slide 6

Slide 6 text

6 引用: https://repology.org/repositories/graphs - Repology, the packaging hub す ご ー い

Slide 7

Slide 7 text

7 ・Nixを使ってdotfilesを作る  → 作ろう! ・dotfilesとは?  ・ホームディレクトリにあることが多い “.” から始まる設定ファイルなどの総称 ・具体的に言えば、Neovimやzsh、tmuxのようなソフトウェアのプラグインを  Nixでビルドして用意したり、直接OSやソフトウェアの設定を書くこともできる  → 便利すぎる 本題

Slide 8

Slide 8 text

8 ・Nixを使ってユーザ環境を設定するためのツール ・macOSや(NixOS以外の)Linuxディストリビューションにおける設定ができる home-manager ▲ 本日の主役

Slide 9

Slide 9 text

9 ・ML系の文法で、宣言的にソフトウェアの設定を記述できます ・ビルド結果は /usr/bin ではなく /nix/store 以下に生成されるので汚染されません ・各パッケージごとに独立して依存性を記述できます (Nixの) 良いところ①

Slide 10

Slide 10 text

10 ▲ 例: tmux-window-nameというtmuxプラグインをビルドするNix式

Slide 11

Slide 11 text

11 ・パッケージマネージャをNixに一本化できます  ・例)Neovim → vim-plug, dein, packer, jetpacker, lazy.nvimなど  ・記法も扱い方も様々だが、home-managerを使うとNixで一括して設定を書ける 良いところ②

Slide 12

Slide 12 text

12 ・パッケージマネージャをNixに一本化できます  ・例)Neovim → vim-plug, dein, packer, jetpacker, lazy.nvimなど  ・記法も扱い方も様々だが、home-managerを使うとNixで一括して依存設定を書ける 良いところ② ▲ 著名な(n)vimプラグインはすでにパッケージングされている

Slide 13

Slide 13 text

13 ・環境をロールバックできます 良いところ③ ▲ 過去の設定の反映(環境)は全て記録されていて、いつでも巻き戻せる

Slide 14

Slide 14 text

14 ・Nixがインストールできない / したくない環境で利用できないのでは?  → (私が認識している限りでは)そう 🥲  ・事前にNixに依存しないdotfilesをビルドできたら面白そう ・容量が足りなくなる  → ストレージを買いましょう ・ネットワーク回線の影響でビルドが遅い  → わかる ・エラーに情報量が少なくて踏み込んだ瞬間辛くなる  → わかる ・適切にソフトウェアのビルドスクリプトを書くのが難しいです  → ビルドはもともと難しい Q&A

Slide 15

Slide 15 text

15 宣伝 ・このような過程で作ったdotfilesはこちら 👇 ・ 🌴 盆栽やっていきましょう 🌴

Slide 16

Slide 16 text

16 まとめ ・Nixという再現可能なビルドを提供するビルドシステム(/ パッケージマネージャ / 言語 / OS)がある ・Nixを使うとローカル環境に依存せず、同一バイナリを生成する保証がつく ・Nixを使ってOSやソフトウェアの設定を書いて管理できる、home-managerがある ・nixpkgsというNixOS公式によって維持されているパッケージ群がある  ・このパッケージ群は数あるリポジトリの中でも(stable/unstableどちらも)最大 ・home-managerを使えばneovimやzsh、tmuxなどの普段使いするツールの設定を全く同 じ記法を利用して書けて、かつ全く同じ挙動を維持できる ・ (NixOS以外でもhome-managerを使えば)設定や環境をロールバックできて便利 ・Nixを利用できない環境では環境を再現できないデメリットもある  ・容量をたくさん消費しがち(定期的にgcを走らせればさほど問題ない)  ・通信環境が悪い場所ではビルドに時間がかかる(辛い)  ・Nixが出すエラーは情報量が少なくて辛いこともある  ・そもそもビルドは辛い