M1Macにuvをインストール

## なんの話か

M1Macにuvをインストールしてhello_worldを出力する話です．

## 環境

| 環境 | バージョン等 |
|:-:|:-:|
| OS | macOS Sequoia 15.1.1 |
| チップ | Apple M1 |
| エディタ| VSCode 1.96.2 |

なお，2025年2月3日時点で`uv==0.5.26`でした．


## インストール

[公式のインストールページ](https://docs.astral.sh/uv/getting-started/installation/)に従ってインストールする．

```zsh
curl -LsSf https://astral.sh/uv/install.sh | sh
```

記録取り忘れましたがヌルッとインストール完了です．

```パスを自分で通すorターミナル立ち上げ直すと，uvが使えるようになっている```とあったので，一度ターミナルを立ち上げ直して，インストールされていることを確認する．

```terminal
akihirosuzuki@MacBookPro install % uv
An extremely fast Python package manager.

Usage: uv [OPTIONS] <COMMAND>
...以下略
```

続いて，シェルのオートコンプリート機能を使うために下記のコマンドを実行
```zsh
echo 'eval "$(uv generate-shell-completion zsh)"' >> ~/.zshrc
echo 'eval "$(uvx --generate-shell-completion zsh)"' >> ~/.zshrc
```

デフォルトのpythonが3.12.5だったのでデフォルトとは異なる`python==3.10`をインストールする

```zsh
akihirosuzuki@MacBookPro 01_uv % uv python install 3.10
Installed Python 3.10.16 in 2.73s
 + cpython-3.10.16-macos-aarch64-none
```

これで基本的な準備は完了です．（たぶん）

## hello world
hello_worldしてみます．

### 依存環境をスクリプトに書き込む

[スクリプトが依存している環境を書き込むことができる](https://docs.astral.sh/uv/guides/scripts/#declaring-script-dependencies)ようですので，それを試してみます．

要するにどうなるか，と言いますと，`uv run hoge.py`でスクリプトを実行した時に，依存関係を勝手にインストールして実行してくれるようになります．

手順はこのようになっています．
1. icecreamを使ってhello_worldを表示するスクリプトを書きます．
1. 依存環境をスクリプトに書き込みます．
1. 実行してみます．

#### 1. icecreamを使ってhello_worldを表示するスクリプトを書きます
before
```python hello_world.py
from icecream import ic
ic("hello world")
```

#### 2. 依存環境をスクリプトに書き込みます


```zsh
akihirosuzuki@MacBookPro 01_uv % uv add --script hello_world.py "icecream"
Updated `hello_world.py`
```

すると，スクリプトがこのように書きかわっています．

after
```python hello_world.py
# /// script
# requires-python = ">=3.10"
# dependencies = [
#     "icecream",
# ]
# ///
from icecream import ic
ic("hello world")
```

#### 3. 実行してみます．

```zsh
akihirosuzuki@MacBookPro 01_uv % uv run hello_world.py 
Installed 5 packages in 12ms
ic| 'hello world'

```

icecreamがインストールされて，hello worldが出力されました．

### 他の依存関係のあるライブラリを追加してみる

ここでは，定義したライブラリが他に依存関係を持っていてもそちらは考慮してくれない，というのを確かめます．

複雑な依存関係を持つライブラリは多いです．特に科学計算系のライブラリはnumpyが必須のことも多いですね．
試しにtorchをaddしてみます．

1. icecreaを使って`torch.cuda.is_available()`を表示するスクリプトを書きます．
1. 依存環境をスクリプトに書き込みます．
1. 実行してみます．

#### 1. icecreaを使って`torch.cuda.is_available()`を表示するスクリプトを書きます

before

```python check_torch.py
import torch
from icecream import ic
ic(torch.cuda.is_available())
```

#### 2. 依存環境をスクリプトに書き込みます

```zsh
akihirosuzuki@MacBookPro 01_uv % uv add --script check_torch.py "torch" "icecream"
Updated `check_torch.py`
```

スクリプトが書きかわっているのを確認します．

```python check_torch.py
# /// script
# requires-python = ">=3.10"
# dependencies = [
#     "icecream",
#     "torch",
# ]
# ///
import torch
from icecream import ic
ic(torch.cuda.is_available())
```

#### 3. 実行してみます．

 ```zsh
 akihirosuzuki@MacBookPro 01_uv % uv run check_torch.py 
Installed 14 packages in 220ms
/Users/akihirosuzuki/.cache/uv/archive-v0/_3rDiqNx6H9uHQ8MQ_6O5/lib/python3.10/site-packages/torch/_subclasses/functional_tensor.py:275: UserWarning: Failed to initialize NumPy: No module named 'numpy' (Triggered internally at /Users/runner/work/pytorch/pytorch/pytorch/torch/csrc/utils/tensor_numpy.cpp:81.)
  cpu = _conversion_method_template(device=torch.device("cpu"))
ic| torch.cuda.is_available(): False
 ```

14個のパッケージがinstallされています．
ただし「numpyがありません」と怒られています．

#### 4. おまけ：numpyを追加してみる

numpyを加えてみます．

```zsh
akihirosuzuki@MacBookPro 01_uv % uv add --script check_torch.py "torch" "icecream" "numpy"
Updated `check_torch.py`
```

再度スクリプトを実行してみます．

```zsh
akihirosuzuki@MacBookPro 01_uv % uv run check_torch.py                            
Installed 15 packages in 396ms
ic| torch.cuda.is_available(): False
```
installされているパッケージが15に増えています．
そして前述の「numpyがありません」の表示が消えました．