理系大学生のためのPython環境のススメ

この記事は前回の続きです。
VScode, WSL, Docker Desktopの導入については[前回の記事](https://qiita.com/KMNMKT/items/499c657ff3fa1c0f68e6)を参照してください。
逆に言えばVScode, WSL, Docker Desktopが導入できていれば前回は読まずともOK

一旦コンテナから出て、プロジェクトを開きます。
前回から引き続いてやる人は __.devcontainerフォルダを削除しておいてください__
# Dockerfileを作成
プロジェクトルートに`Dockerfile`を作成します。
```dockerfile:Dockerfile
FROM python:slim

RUN apt-get update && \
    pip install --upgrade pip

COPY ./requirements.txt .

RUN pip install -r requirements.txt
```

## 解説
```dockerfile:Dockerfile
FROM python:slim
```
slimイメージを選択しています。通常イメージだとかなり重たくなってしまう。。。

```dockerfile:Dockerfile
RUN apt-get update && \
    pip install --upgrade pip
```
イメージのアップデートとpipをアップデートしています。

```dockerfile:Dockerfile
COPY ./requirements.txt .

RUN pip install -r requirements.txt
```
必要パッケージを書き出して、インストールしています。`requirements.txt`は次で説明します。

## 必要ライブラリをまとめる
プロジェクトに`requirements.txt`を作成します。中身は以下の通りです。
```text:requirements.txt
ipykernel
numpy
pandas
matplotlib
scipy
```
ここは適宜追加してください。必要なライブラリがあったら、`pip install`と`requirements.txt`に追記することを忘れないでください。

ipykernel: notebookを実行するのに必要なカーネルパッケージ

# コンテナのビルド
コマンドパレットから`Dev Containers: Reopen in Container`を選択し、`Dockerfileから`を選択しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2034739/9bd20647-b057-288e-a600-4d854c87cc84.png)

コンテナのビルドが始まり、少し待つとコンテナでフォルダが開きます。

# 拡張機能の導入

## 導入方法
拡張機能をインストールしたら、歯車マークをクリックし、`devcontainer.jsonに追加`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2034739/5f45932f-7b1b-f079-85fd-9471eb0906eb.png)

必須
- Python
- Jupyter

おすすめ
- Error lens
    - コードの静的チェック結果を可視化してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2034739/f2921ac9-64f4-2ce3-102a-a155cdd10280.png)

- Code Spell Checker
    - 英単語のスペルをチェックしてくれます。ignoreする単語をいちいち追加するのが面倒な人は消してもいい。
- autoDocstring
    - ドキュメントの文章テンプレートを生成します。関数とか凝って作らない人はいらないかも。
- indent-rainbow
    - インデントを見やすくしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2034739/84e8e1b6-087e-17a0-eb96-3c1adb0aadf6.png)
- Office Viewer(Markdown Editor)
    - エクセルファイルを普通に見れるようになります。


## Github Copilotについて
学生であればGithub Proに無料で登録でき、VScodeをGithubに紐付けることでGithub Copilot拡張機能をインストールすることで自動でコードを補完してくれます。死ぬほど便利です。

参照 [【GitHub】学生申請をして無料でGitHub Copilotを使う](https://qiita.com/SNQ-2001/items/796dc5e794ac3f57a945)
# おすすめ設定
基本的に設定はワークスペースのものを編集したほうがいいです。フォルダーに`.vscode`というフォルダができ、設定がフォルダ単位で管理できます。
`Ctrl+,`で設定を開き、ワークスペースタブを開き、次の設定を変えると良いです。
- Notebook > Format On Save
    - 編集を保存すると自動でフォーマットしてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2034739/85f35bf5-35cd-2495-f140-0e7082aad0ad.png)
- Notebook > Output: Scrolling
    - 出力が長かった場合にスクロールで全文表示できるようになります。
- Python › Formatting: Provider
    - フォーマッタを選択できます。僕はBlackフォーマッタが好きです。

# 最後に
いろいろ設定が変わったと思うので、コンテナをリビルドしましょう。
`Ctrl+Shift+P`でコマンドパレットを開き、キャッシュなしでリビルドをしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2034739/4395f687-06c3-75cc-c55f-0c602efddb47.png)

※たまに失敗しますがそのときは焦らず再試行をしてください。再起動もしたほうがいいかも

つぎからは、フォルダーをVScodeで開き、右下に出てくるコンテナで再度開くをクリックして環境に接続してください。

最終的には多分こんな感じ
```json-doc:.devcontainer/devcontainer.json
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-dockerfile
{
	"name": "Existing Dockerfile",
	"build": {
		// Sets the run context to one level up instead of the .devcontainer folder.
		"context": "..",
		// Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
		"dockerfile": "../Dockerfile"
	},
	"customizations": {
		"vscode": {
			"extensions": [
				"usernamehw.errorlens",
				"njpwerner.autodocstring",
				"oderwat.indent-rainbow",
				"ms-toolsai.jupyter",
				"ms-python.python",
                "cweijan.vscode-office"
                "ms-python.black-formatter"
			]
		}
	}
	// Features to add to the dev container. More info: https://containers.dev/features.
	// "features": {},
	// Use 'forwardPorts' to make a list of ports inside the container available locally.
	// "forwardPorts": [],
	// Uncomment the next line to run commands after the container is created.
	// "postCreateCommand": "cat /etc/os-release",
	// Configure tool-specific properties.
	// "customizations": {},
	// Uncomment to connect as an existing user other than the container default. More info: https://aka.ms/dev-containers-non-root.
	// "remoteUser": "devcontainer"
}
```
```json:.vscode/settings.json
{
    "notebook.formatOnSave.enabled": true,
    "notebook.output.scrolling": true,
    "python.formatting.provider": "black"
}
```
```dockerfile:Dockerfile
FROM python:slim

RUN apt-get update && \
    pip install --upgrade pip

COPY ./requirements.txt .

RUN pip install -r requirements.txt
```
```text:requirements.txt
black
ipykernel
numpy
pandas
matplotlib
scipy
```