M1 MacBook ProでPythonとVisualStudioCodeの環境設定

# 追記(2024-06-06)
- `Rye`と`Ruff`を使う形に乗り換えた。
    - [Pythonの環境構築ツールRyeの紹介](https://qiita.com/IKEH/items/b0fffd68e74c07adc028)
    - [VSCodeでRuff/Mypyを導入しGitHub Actionsでも実行する](https://qiita.com/IKEH/items/f907ff139483718ffcd4)

# 追記(2023-11-13)
- `pyenv`と`poetry`を使う形に乗り換えた。
    - [Poetryをサクッと使い始めてみる](https://qiita.com/ksato9700/items/b893cf1db83605898d8a#%E6%96%B0%E8%A6%8F%E3%81%AB%E7%AB%8B%E3%81%A1%E4%B8%8A%E3%81%92%E3%82%8B%E5%A0%B4%E5%90%88)
- またLinterなども拡張機能で利用する形にしている
    - Black Formatter: blackを用いたフォーマッター
    - Flake8: flake8にそったlinter
    - isort: import順のチェック
    - Mypy Type Cheker: 型チェック
- `.vscode/settings.json`は以下の通り

```json
{
    "[python]": {
        // VS Code のフォーマッターは無効にしておく
        "editor.defaultFormatter": "ms-python.black-formatter",
        "editor.formatOnSave": true,
        "editor.codeActionsOnSave": {
            "source.organizeImports": true
        },
    },
    "isort.args":["--profile", "black"],
    "flake8.args": [
        "--max-line-length=79",
        "--max-complexity=10",
    ],
    "mypy-type-checker.args": [
        "--ignore-missing-imports",
        "--disallow-untyped-defs",
        // "--config-file=<file>"
    ],
    // flake8と最大文字数を合わせる
    "black-formatter.args": [
        "--line-length=79",
    ]
}
```

# 概要
- `MacBook Pro（14インチ、2021）`を購入した。
- このMacにPythonとVisualStudioCodeの設定したときの忘備録

#  Homebrew
## 概要
`pyenv`と`pyenv-virtualenv`をHomebrewで管理するので先にこれをインストールする

## インストール
- 下記に記載されているコマンドを実行
    - https://brew.sh/index_ja

```shell
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

## 環境設定

- インストール時にターミナルに表示される指示通りPATHを通す
    - [M1 mac で homebrew が普通に使えるようになった](https://nomad.office-aship.info/m1-mac-homebrew/)

```console
Warning: /opt/homebrew/bin is not in your PATH.
  Instructions on how to configure your shell for Homebrew
  can be found in the 'Next steps' section below.
==> Installation successful!

==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
  https://docs.brew.sh/Analytics
No analytics data has been sent yet (nor will any be during this install run).

==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
  https://github.com/Homebrew/brew#donations

==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/ikeh/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
- Further documentation:
    https://docs.brew.sh
```

- `.zprofile`に下記のように保存される

<img width="512" alt="image" src="https://i.imgur.com/ZZ8FaHv.jpg">

- 下記でパスが通っていることの確認

```shell
brew -v
Homebrew 3.3.7
Homebrew/homebrew-core (git revision 1d0c0a20808; last commit 2021-12-12)
```

# Python
## pyenv/pyenv-virtualenvのインストール
- インストール(PATHの通し方は情報が古いのでパス)と使い方の参照
    - [pyenvとpyenv\-virtualenvの自分流使い方](https://qiita.com/ksato9700/items/5d9eba10fe6b8e064178)

```console
$ brew update
$ brew install pyenv
$ brew install pyenv-virtualenv
```

- `.zprofile`に以下を記述
    - [Python pyenv アップデートでpathの設定が変更 \- IT技術で仕事を減らしたい！](https://timesaving.hatenablog.com/entry/2021/05/15/150000)
        - とりあえず新しそうな情報なので参考に

```python
# pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"

# pyenv-vertualenv
eval "$(pyenv virtualenv-init -)"
```

- `.zshrc`

```python
# pyenv
eval "$(pyenv init -)"
```

- 運用時によく使うコマンド

```shell
pyenv install --list
pyenv install <python-version>
pyenv versions
pyenv virtualenv <python-version> <env-name>
pyenv local <python-version>
pyenv uninstall projectA
```

## キャッシュファイルを作らない設定
- [【Python】\_\_pycache\_\_を作らない](https://engineeeer.com/no-more-pycache/)
- 環境変数の確認配下を参考に（`zsh`を使用しているなら対応するファイルを見る）
    - [\.bash\_profileと\.bashrcのまとめ](https://qiita.com/takutoki/items/021b804b9957fe65e093)

``` Python
export PYTHONDONTWRITEBYTECODE=1
```

## .gitignoreの設定
- `Python/VSCode`の環境の標準的な採用したい
    - [giboでgitignoreを自動生成する](https://qiita.com/taquaki-satwo/items/358d2d473fff9a25d5eb)

```shell
brew install gibo
gibo update

// 現在のパス直下に`.gitignore`が出力される
gibo dump python VisualStudioCode > .gitignore
```

# Visual Studio Code
## ダウンロード
- 公式からダウンロード。Apple Silicon用のものがあるので選択
    - https://code.visualstudio.com/download

![](https://i.imgur.com/g0SCuo2.jpg)

## Extensions
- 下記が画像表示ができて便利

<img width="512" alt="image" src="https://i.imgur.com/n1kC6DH.jpg">

## pipでパッケージのインストール
### flake8とautopep8
- `flake8`と`autopep8`のインストールを行います
    - `flake8`: PEP8のルールに沿っていない場合に警告してくれるやつ
    - `autopep8`: `Format Selection`とかで自動整形してくれるやつ

<img width="512" alt="image" src="https://i.imgur.com/e7bUGAK.jpg">

```console
pip install flake8 
pip install autopep8
```

### PyAutoGUI
- `pyautogui`以外にもインストールしておかないと動かないので注意

```console
pip install pyautogui
pip install pillow
pip install opencv-contrib-python
```

## 設定ファイル
- `settings.json`を開く
    - [2021/4 Visual Studio Code のおすすめ設定 \(settings\.json\)](https://www.cview.co.jp/osakatech/2021.04.20.dYMmFSxAihNBwoEkCys_X)

<img width="400" alt="image" src="https://i.imgur.com/tc7MCOV.jpg">

<img width="400" alt="image" src="https://i.imgur.com/ioqmT5A.jpg">

- 尚プロジェクトでのみの設定をしたい場合は下記のディレクトリ・ファイルを作成し開きます

```
<プロジェクトディレクトリ>
├ .vscode
│    └ settings.json
│
```

- `flake8`と`autopep8`の設定を行います
    - [VS Code コーディング規約を快適に守る \- Qiita](https://qiita.com/firedfly/items/00c34018581c6cec9b84#%E5%B0%8E%E5%85%A5%E6%96%B9%E6%B3%95)
        - インストール方法・VSCodeの設定を参考
    - [pycodestyle\(pep8\) エラーコードチートシート](https://qiita.com/KuruwiC/items/8e12704e338e532eb34a)
        - 設定値確認のお供に
    - [Python命名規則（PEP8より\) \- Qiita](https://qiita.com/shiracamus/items/bc3bdfc206b39e0a75b2)
        - ローカル変数の命名ルール

```js
{
    // Ref: [VS Code コーディング規約を快適に守る](https://qiita.com/firedfly/items/00c34018581c6cec9b84)

    ////////////
    // flake8  /
    ////////////

    // 一般設定
    "python.linting.pylintEnabled": false,  // 標準のpylintをOFF
    "python.linting.flake8Enabled": true,  // PEP8をON
    
    // 1秒ごとに自動保存して、その度に構文チェック。
    "files.autoSave": "afterDelay",
    "files.autoSaveDelay": 1000,
    "python.linting.lintOnSave": true,

    // 一部ルールの無効化
    "python.linting.flake8Args": [
        // W293: 空行に空白が含まれるとWarningになるW293は、エディタの自動インデントが引っかかるのでオフ。
        // W504: +などのオペレータの後で改行するとWarningになる
        // E501: 一行の文字数が多すぎるかどうか。ワンライナーのほうが見やすい箇所があるのでオフ。
        "--ignore=W293, W504, E501",
        // "--max-line-length=150",  // 1行の最大文字数はデフォルト80文字（PEP8準拠）
        "--max-complexity=20",  // 循環的複雑度
    ],

    /////////////
    // autopep8 /
    /////////////
    "python.formatting.provider": "autopep8",
    
    // より積極的なフォーマッティングを行う。e.g. a == None を a is None に書き換える
    "python.formatting.autopep8Args": [
        "--aggressive", "--aggressive",  // aggressiveレベル2
    ],
}
```

## デバッグ実行時に引数を設定

- [VSCodeでデバッガに引数を設定する方法](https://zenn.dev/ef/articles/17c95d77756e04c885bb)
- `(プロジェクトフォルダ)/.vscode/launch.json`に下記を設定する

```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "args" : [
                "(引数1)",
                "(引数2)",
            ]
        }
    ]
}
```