Nixを触り始めて参考になったサイトまとめ

## 概要
pacmanやaptのように何も考えることなく使えると思いnixを触り始めましたが、かなり茨の道でした。
nix Launguageのことなのか、nixパッケージマネージャーのことなのか、nixを用いたプロジェクト管理のtipsなのかなどnixを取り巻く情報は多岐に渡ります。（多分）
自分が読んで参考になったページについて簡単な説明とともに載せておこうと思います。
また、ArchLinuxユーザーはArchWiKiにいけば書いてあることが多いため真っ先にArchWiKiを見るかもしれません。（私がそうだった）
しかし、NixOSではコマンドは`man`、仕様と実例が公式のマニュアルにまとまっているのでそっちを先に見ることをおすすめします。
更に、nix Languageは純粋関数型言語なので関数型言語の読み方がわからないと結構しんどいです。
（configはJSONを書く感じなので割となんとかなるがパッケージや環境が作れない問題に直面する）

## 資料関係
- `nix 2.4`から新しいコマンドが実装されている
- 現在は*experimental-features*ですがいずれ置き換わる予定
- 各種サイトの情報は新しいコマンドに対応していないことが多く、量は多いが公式のマニュアルが一番わかり易い（2022/10/22現在）

### 最低限nix/nixpkgsを使えるようにする

| サイト | 説明 |
| :- | :- |
| [nix-1p](https://github.com/tazjin/nix-1p#with-statements) | Nix Languageについて初歩の初歩だけのリファレンス。これを読めば最低限、*.nixは読める。(と思う...。)|
| [nix-tutorial](https://nix-tutorial.gitlabpages.inria.fr/nix-tutorial/getting-started.html) | nixpkgsについて最低限使えるようになる。パッケージも作れるようになる。|
| [Nix Pills](https://nixos.org/guides/nix-pills/pr01.html) | nixとnixpkgsについて簡単な例とともに網羅的に説明されている。2014-2015年のブログが元になっているため、Flakesについては載っていない。|

- ちなみにnix言語で他の言語ではあまり見ないOperatorに`//`があります。これは`e1 // e2`とあるときe1の属性をe2で置き換えまたは追加する。
    - `with`の範囲に含めたくないときや`let ... in ...`のスコープ範囲を小さくするなどの目的に使う。
```nix
set1 = { a=1; b=2; }
set2 = { a=10; c=30; }
set1//set2
>>{ a=10; b=2; c=30; } # { e1の属性をe2の属性で置き換え; e1の属性そのまま; e1に無いe2の属性を追加; }
```

### 必須

| サイト | 説明 |
| :- | :-|
| [nix, nixpkgs, NixOSのマニュアル](https://nixos.org/learn.html) | 安定と信頼の公式マニュアル。ビルドの書き方やコマンド、APIリファレンスがわからなくなったら、ここを見たらある。NixOS WiKiよりこっち見たほうがいい。|
| [Home Manager Manual](https://rycee.gitlab.io/home-manager/) | home-managerの公式マニュアル。正直、（xsession周りとか）読んでもよくわからないところは多い。 |
| [Nix (builtins) & Nixpkgs (lib) Functions](https://teu5us.github.io/nix-lib.html) | 公式のリファレンスはbuiltinsとlibで別れているかつ他の情報もあって読みにくい。こっちのほうが一覧性と検索性に凄れている。（と思う）|
| [ryantm.gihhub.io/nixpkgss](https://ryantm.github.io/nixpkgs/) | 公式のnixpkgsマニュアルの別レイアウト。サイドに目次があり軽量なため見やすい（公式のnixpkgsマニュアルは一つのページに全部載っていて一覧性に乏しく重い。） |

### 理解の手助けになるサイト
- はじめにnix Flakesとはなんぞやをすると~~私の頭が爆発した~~わけわからんになると思ったのでこっちに記載した。

| サイト | 説明 |
| :- | :-|
| [A tour of Nix](https://nixcloud.io/tour)| Nix Languageについて解説と実際にコードを書くことで学習できる。実際に手を動かしたい人にとってもいい。あくまで言語のみの解説。 |
| [NIX FLAKES, PART1-3](https://www.tweag.io/blog/2020-05-25-flakes/) | nix Flakesについての解説ブログ（全３章） |
| [Nix Flakes: an Introduction](https://xeiaso.net/blog/nix-flakes-1-2022-02-21) | nix Flakesについての解説ブログ。何個か記事があるので目を通しておくのがいい。 |
| [Nix Flake MVP](https://gist.github.com/edolstra/40da6e3a4d4ee8fd019395365e0772e7) | Flakeの解説Gist。他にもnixに関連するGistがあった。|
| [nix Blog](https://nixos.org/blog/) | nixを使った鯖の構築などの実例が載っている。 |


### 逆引き・調査でよく使う

| サイト | 説明 |
| :- | :- |
| [Arch Wiki](https://wiki.archlinux.org/) | みんな大好きArch Wiki。わからないことがあればここを見れば大抵載っている。NixOS（Home Manager）は何らかのパッケージのconfigをnixを用いて表現し直しているに過ぎないので、ここに書いてあることをnixで読み替えれば対処できる（ことが多い）。|
| [NixOS Wiki](https://nixos.wiki/) | Arch Wikiに比べるとかなり貧弱だが、NixOS固有の書き方をしないといけないときがたまにある。|
| [Home Manager Appendix \[A.,B.,C.,D.\]](https://rycee.gitlab.io/home-manager/options.html) | A.: home.nix作製時のConfiguration Options, B.:NixOSのモジュールにした時のOptions、C.: nix-darwinのモジュールにした時のOptions、D.: home-managerコマンドの解説。特に、A.は見ないとhome.nixを作れない。 |
|[NixOS Search](https://search.nixos.org/packages) | nixpkgsの検索、NixOSのConfiguration Options、FlakesのConfiguration Optionsが検索できる。これなしではconiguration.nixは作成できないし、パッケージの名前もわからない。（nixpkgsはコマンドで検索できるが...）|
|[NixOS/nixpkgs](https://github.com/NixOS/nixpkgs) | nixpkgsのリポジトリ。パッケージのoverrideやパッケージがうまく動作しない場合に依存関係を確認、issueの確認等でめちゃくちゃ使う。また、自前でパッケージを作る時の参考にも。 |
|[reddit](https://www.reddit.com/r/NixOS/)や[NixOS discourse](https://discourse.nixos.org/)などのコミュニティ | 自分がつまずいているところはみんなつまずいているやろの精神 |

### 日本語で書いているやつ

| サイト | 説明 |
| :- | :- |
| [blog.ryota-ka.me](https://blog.ryota-ka.me/) | HERPという会社ではnixを開発ツールとして採用しているそう。その中の人のブログ。 |
| [NixOS に関する小ネタ集](https://zenn.dev/nyarla/scraps/d0eeca162a780a) | Flakesの説明が一番わかりやすかった。 |

- 後はQiitaとかZennとかはてブとか個人ブログとかGitHubのconfigとかを見ればいい

### サンプルとかテンプレとか

| サイト | 説明 |
| :- | :- |
| [berberman/flakes](https://github.com/berberman/flakes) | 自前のパッケージリポジトリを作る時の参考に。Flakeを用いてパッケージを作る時の参考に。私のパッケージリポジトリはこれを参考にした。 |
| [hyprwm/Hyprland](https://github.com/hyprwm/Hyprland) | waylandのWM。Flakeを用いてNixOSのモジュールを作る時の参考に。|
| [standard_project_structure](https://www.reddit.com/r/NixOS/comments/8tkllx/standard_project_structure/) | nixを用いてプロジェクトを作る時のテンプレ的な。 |
| [MatthiasBenaets/nixos-config](https://github.com/MatthiasBenaets/nixos-config) | Matthias’ NixOS & Nix-Darwin System Configuration Flake。 私のnixosリポジトリはこれを参考にした。|

### 著者のリポジトリとQiita記事

| サイト | 説明 |
| :- | :- |
| [Sumi-Sumi/nixos-desktop-config](https://github.com/misumisumi/nixos-desktop-config) | どのマシンでも環境に差異がない事を目指した。ユーザー環境はapps/{cui, desktop, server, virtualization}を編集・追加すれば、各マシンはmachine/generalを参考に作成すれば良いようになっているはず。 |
| [Sumi-Sumi/flakes](https://github.com/misumisumi/flakes) | ArchLinux時代に使っていたnixpkgsに無いパッケージを作った |
| [Sumi-Sumi/making-nix-package-tutorial](https://github.com/Sumi-Sumi/making-nix-package-tutorial) | [nixで自前パッケージをビルドしてNixOSで使う]()の解説で作ったリポジトリ |
| [nixで自前パッケージをビルドしてNixOSで使う](https://qiita.com/Sumi-Sumi/items/18038127ef54fe0bb8d1) | overlays対応のパッケージを作って管理できるようにする。|
| [ArchLinuxからNixOSに移行してみる](https://qiita.com/Sumi-Sumi/items/ac3d16a6bb94ff2d3fde) | ArchLinuxからの移行してつまずいたところなど |
| [nixのコマンドを解説してみる](https://qiita.com/Sumi-Sumi/items/6de9ee7aab10bc0dbead) | 友人に`pacman`と比較してと言われて作ったが気づいたら主要コマンドも解説（翻訳？）してた。新コマンドに対応。|
| [nix Flakesについて](https://qiita.com/Sumi-Sumi/items/bee2bba84fee668286e3) | Flakesについて初歩だけ解説した。|