Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 0 additions & 26 deletions src/content/docs/utilities/nix/0-references.md

This file was deleted.

43 changes: 11 additions & 32 deletions src/content/docs/utilities/nix/1-get-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,56 +4,35 @@ title: 1. Nix の目的と環境構築

## そもそも Nix とは?

Nix は、一言でいうと、**ソフトウェアのパッケージ方法を定義する可搬な記述式**です
Nix は、ソフトウェアのビルドと実行環境を宣言的に記述し、再現可能に提供するためのツールチェーンです

## Nix で何ができる?

Nix (+ flakes) を使うと、以下のようなことの組み合わせが簡単に達成できます。

(定義部分)

- [nixpkgs](https://search.nixos.org) で定義されている大量のパッケージを利用する
- ソフトウェアのビルド式を定義し、**誰でもビルドできる**ようにする
- 依存関係の明示化も Nix に強制されるので、必要な依存が見つからない!が起こり得ない
- 任意の GitHub リポジトリの任意の ref を、 Flake が定義されている限り **手動でクローンせずに** 実行する。
- 上のすべてを、**コミットハッシュ単位で**バージョンを固定して行う
- かつ、 1 コマンドでアップデート可能

(利用部分)

↑で定義したすべてのソフトウェアを使って、

- 開発用シェルの定義を記述し、開発者の間で共有する (`shell.nix`, `devShell`)
- ユーザースペースの定義、その方法の共有 (Home Manager, modules)
- ファイル (`.bashrc`など) や、ソフトウェアのインストールなど
- OS の設定の一元的管理 (NixOS)
- ソフトウェアのインストールなど
- Nixpkgs の大量のパッケージを再現可能に利用できる。
- 自作ソフトのビルド式を記述し、誰でも同じ方法でビルドできる。
- Flakes で依存をコミットハッシュにロックし、複数人・複数端末で同じ環境を共有できる。
- 開発用シェル (`devShell`)・ユーザー設定 (Home Manager)・OS 設定 (NixOS) を一貫した記述で管理できる。

## 環境構築

### 1. Nix のインストール

公式のインストーラー <https://nixos.org/download/>

または、 Determinate Systems のインストーラー <https://github.com/DeterminateSystems/nix-installer>
を利用してください。
- 公式: https://nixos.org/download/
- Determinate Systems: https://github.com/DeterminateSystems/nix-installer

Determinate Systems のインストーラーは、デフォルトで後述 (2.) の設定が ON になっていたり、アンインストーラーが付属したりしています
どちらも現在の Nix をインストールできます。Determinate 版はアンインストーラ付きで、`flakes`/`nix-command` をデフォルトで有効化します

チャンネル (後述) を聞かれた場合は、 `nixpkgs-unstable` を選択してください。
### 2. Nix CLI の設定 (必要な場合)

### 2. Nix CLI の設定 (公式のインストーラー利用時)

次のコマンドを実行 (するか、同等のことを) してください。
新 CLI と Flakes を使うために、未設定なら有効化します。
```sh
mkdir -p ~/.config/nix
echo 'experimental-features = nix-command flake' > ~/.config/nix/nix.conf
```

### 3. 確認

次のコマンドを実行して、 `Hello, Nix!` と表示されたら成功です
次のコマンドを実行し、 `Hello, Nix!` と表示されれば成功です
```sh
nix run nixpkgs#hello -- --greeting 'Hello, Nix!'
```

33 changes: 19 additions & 14 deletions src/content/docs/utilities/nix/2-ecosystem-nix-shell.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,25 @@
---
title: 2. エコシステムの全体像と Nix Shell
title: 2. エコシステム概要と Nix Shell 基本
---

## Nix エコシステムの全体像

多分分かるので、そのうち書く。
- Nix: 純粋関数型のビルドシステム兼パッケージマネージャ
- Nixpkgs: 全パッケージ定義集 (公式リポジトリ)
- NixOS: OS 設定を Nix で宣言的に管理する Linux ディストロ。 Nixpkgs に含まれる
- Home Manager: ユーザー環境の宣言的管理

### 用語説明
- Nix Store: `/nix/store` 下の内容アドレス可能なビルド成果物置き場。
- Channels: 旧来のパッケージ参照方式。
- Flakes: 入力をロックして再現性を高める新方式。

## Nix Shell

Nix CLI を使い、Nix Shell を作成してみましょう
一時シェルを作ります

```sh
nix-shell -p lolcat cowsay
nix-shell -p cowsay lolcat
```

`lolcat` と `cowsay` が利用できるシェルが作成され、そのシェルに入ります。
Expand All @@ -23,12 +31,10 @@ which lolcat
# -> /nix/store/9qirzkmk1vlj7klw0mjwjkaxpqgh8jdy-lolcat-100.0.1/bin/lolcat
```

ここで大事なのは、
ポイント:

- 実行可能ファイルのダウンロードはされている
- グローバルの環境にインストールされているわけではない
- `/nix/store` の中にパッケージのそのバージョン専用のディレクトリが作成されている
- `/nix/store` のことを `Nix Store` と呼ぶことがあります
- プログラムはダウンロードされるが、グローバルには汚さない。
- `/nix/store` にハッシュ付きパスとして配置される (Nix Store)。

`lolcat` と `cowsay` を使ってみましょう。

Expand All @@ -48,14 +54,13 @@ which cowsay
# -> which: no cowsay in (path)
```

## パッケージキャッシュ
## キャッシュとクリーンアップ

Nix Store にパッケージのキャッシュが残っているので、次同じパッケージを使って `nix-shell` をすると、ダウンロードが発生しないのが確認できます
Nix Store にキャッシュが残るため、同じパッケージは再ダウンロードされません

このキャッシュを消去するには、
キャッシュのクリーンアップは次のいずれかでできます。

```sh
nix store gc
nix-collect-garbage
```

を実行します。
63 changes: 30 additions & 33 deletions src/content/docs/utilities/nix/3-nix-expr.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,18 @@ Nix 式は、多くの関数型言語と同じように、遅延評価されま
```
```nix
2 * 3
# -> 3
# -> 6
```

文字列

```nix
# JavaScript と違い、 `'` 単体で文字列を囲むことはできない
"hello, " + "nix"
# -> "hello, nix"
```
```nix
# 複数行使う場合は '' を使う
# 複数行使う場合は `''` でかこむ
''
multi-line
string
Expand All @@ -56,6 +57,7 @@ string
```

```nix
# 結合
[ 1 2 ] ++ [ 3 4 ]
# -> [ 1 2 3 4]
```
Expand All @@ -74,7 +76,7 @@ true

## `let ... in` 構文

いわゆる「変数」を定義できます。なお、Nix は関数型言語なので、変数の変更はできません
式に名前をつけることができます。なお、Nix は関数型言語なので、名前のついた式の変更はできません

```nix
let
Expand All @@ -87,10 +89,10 @@ in a + 2;

```nix
let
b = a + 2;
b = a + 2; # 先の式も参照できる
a = 3;
in a + b
# -> 8
# -> 8 (3 + 2 + 3)
```

## Attrset
Expand All @@ -105,7 +107,7 @@ in a + b
# -> { a = 1; b = 2; }
```

もちろん、アトリビュート (プロパティ) にアクセスすることもできます
attribute (プロパティ) には、 `.` でアクセスすることができます

```nix
let
Expand All @@ -118,6 +120,19 @@ in
# -> 2
```

アクセスする変数を評価時に決めたい場合は、 Interpolation `${}` を使います。

```nix
let
attrs = {
a = 1;
b = 2;
}
key = "b";
in
attrs.${key} # -> 2
```

`rec` キーワードを使うと、自身のメンバーにアクセスできます。

```nix
Expand All @@ -130,6 +145,8 @@ rec {

## 関数

Nix で関数は、`引数: 返り値` という形で作ります。

```nix
# 引数をひとつとる関数
let
Expand All @@ -147,7 +164,7 @@ toString 2
# -> "2"
```

よくある関数言語のように、Nix の関数は引数を一つしかとれないので、複数の引数をとる関数を定義する場合は、Attrset を使うか「カリー化」をします
Nix の関数は引数を一つしかとれないので、複数の引数をとる関数を定義する場合は、Attrset を使うか、複数回呼び出すようにします

```nix
# attrset をとる例
Expand All @@ -160,41 +177,22 @@ in
```

```nix
# カリー化する例
# 複数回呼び出す関数 (カリー化と言ったり言わなかったりする)
let
# カリー化された関数: 返り値をもう一度呼び出して解を得る
# 返り値をもう一度呼び出して解を得る
add = a: b: a + b;
in
add 2 3
# -> 5
```

`map` のような高階関数もたくさんあります。

:::tip[カリー化とは?]

文字で読むより上の例を見たほうが分かりやすいと思います。
上の例を読んで理解したら、この Tip は読まなくてもいいです。

カリー化とは、わかりやすく言うと、呼び出したときに、その引数を保存した新しい関数を返すことです。

TypeScript で例えるとこのようになります。

```ts
function add(a: number) {
return (b: number) => a + b;
}

console.log(add(2)(3)); // -> 5

// 部分的に適用することもできる
const curried = add(4);
console.log(curried(5)); // -> 9
```nix
builtins.map (x: x * 2) [1 2 3]
# -> [ 2 4 6 ]
```

正確な定義は [Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96) を参照してください。

:::

## パス

Nix では、パスも基本型の一つです。
Expand All @@ -205,4 +203,3 @@ Nix では、パスも基本型の一つです。
builtins.readFile ./path.txt
# -> "hello path\n"
```

Loading