Ubuntu 20.04 の Arduino IDE で ESP32 Dev Moduleを使ってコンパイルする際にpythonが無いと怒られる

# エラー内容
タイトルにある通り，Ubuntu 20.04 で Arduino IDE で ESP32 Dev Moduleを使ってコンパイルする際に，以下のようなエラーが出ました．

> exec: "python": executable file not found in $PATH
Error compiling for board ESP32 Dev Module.

# 対処法
これは[このissue](https://github.com/espressif/arduino-esp32/issues/3696)の通り，ESP32 Dev Moduleをコンパイルするときにpythonを使うのですが，パスが通っていないために見つけられないというエラーです．
試しに，ターミナル上で

```bash
$ which python
```
と打ち込んでみても何も出力されません．

これはUbuntu 20.04での仕様変更で，Ubuntu 18.04以前は`$ python`というコマンドがpython2を指すようになっていたのですが，そのような仕様はなくなりました．

しかし，python2がなくなっているわけではなく，以下のように存在はしています．(なければ`$ sudo apt install python2`などでインストールすればいいでしょう)

```bash
$ which python2
/usr/bin/python2
$ which python3
/usr/bin/python3
```

よって，下のようなコマンドを打ってシンボリックリンクを追加しましょう[^1] [^2]．これで`python`コマンドでpython2が起動するようになり，つまりArduino IDEもpythonを見つけられることになり，問題のエラーは解消されます．

```bash
$ sudo ln -s /usr/bin/python2.7 /usr/bin/python
```

```bash
$ python
Python 2.7.18 (default, Mar  8 2021, 13:02:45) 
[GCC 9.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
```

ちなみに，このときのリンク先はpython2ではなくてpython3でも問題ないです．


## [Troubleshooting 1] "ImportError: No module named serial"
ESP32 Dev Moduleのコンパイルにはpyserialを使うので，これがないと以下のようなエラーが出ます．

>import serial
ImportError: No module named serial
exit status 1
Error compiling for board ESP32 Dev Module.

これは，普通にpyserialモジュールをpipでインストールすればいいです．

```bash
$ python -m pip install pyserial
```

これで，上記のエラーは解決されます．


## [Troubleshooting 2] "/usr/bin/python: No module named pip"
pyserialをpipでインストールしようとしたときに，以下のエラーが出るかもしれません．

```bash
$ python -m pip install pyserial
/usr/bin/python: No module named pip
```

これはその通りpython2にpipがありませんというエラーなのですが，Ubuntu 20.04ではpython3のpipは`$ sudo apt install python3-pip`で入るのですが，python2に対応する`python2-pip`なるものはありません．

[このサイト](https://linuxize.com/post/how-to-install-pip-on-ubuntu-20.04/)を参考にしてスクリプトから実行しないといけないらしいです．以下のようにスクリプトを取ってきて実行すると，python2でもpipが使えるようになります．

```bash
$ curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
$ sudo python2 get-pip.py
$ python -m pip install pyserial
```




# (補足) VS Codeの拡張機能から使う場合
VS CodeにはMicrosoft製の["Visual Studio Code extension for Arduino"](https://marketplace.visualstudio.com/items?itemName=vsciot-vscode.vscode-arduino)という素晴らしい拡張機能があります．Arduino IDEのUIは非常に使いづらいのですが，これを使えばコーディングからコンパイル，書き込みまでVS Code上で完結するので非常に良いです．
具体的な使い方はこの記事の本筋から逸れるので，以下のサイトらに譲ります．

- [さらばArduino IDE！ Visual Studio Codeの拡張機能でArduino開発環境を整える](https://k99-tech.com/blog/archives/893)
- [Arduino IDEつらい・・・、Visual Studio Codeでスケッチを書く方法](https://qiita.com/narikei/items/847613a8f01a9e1527d7)

さて，VS Codeはターミナル上で`$ code`と打ち込めば起動するわけですが，起動するシェルによって問題のエラーが出たり出なかったりしたので，そのことをメモしておきます．

まず，**この記事で書いたような[対処法](#対処法)を施していないという前提で，**つまり`python`にパスが通っていない状態でVS Codeを起動させると，その中でESP32 Dev Moduleをコンパイルしようとすると，問題のエラーが出ます．これは普通にArduino IDEを起動させたときと同じ症状です．

```bash:この場合エラーが出る
$ which python # 何も出力されない
$ code
```

しかし，当該シェルで例えばvenvをactivateしていた場合は，問題のエラーは起こらずにコンパイルが通ります．これは，`python`でvenv内のpythonが指定されるように，VS Codeも`python`を見つけられるようになっており，venv内のpythonを使ってコンパイルできているからだと考えられます．

```bash:この場合エラーが出ない
$ source .venv/bin/activate
$ which python # venvのpythonが指定される
/home/username/path-to-current-directory/.venv/bin/python
(.venv) $ code
```

つまり，VS Codeは起動するシェルのパス(`$ echo $PATH`で見える)をそのまま引き継ぐようになっているのですね．

とはいえ，この記事で書いたような[対処法](#対処法)を施しておけば，どのシェルでも`python`コマンドは見つけられるようになるので問題ないです．しかし，起動するシェルのパスを引き継いでいるということと，よってコンパイル時にどのpythonが使われているかを意識しておくと，予想外のエラーに直面した際に役立つかもしれません．

[^1]: また，Linuxには**Alternatives**というシンボリックリンクを管理する標準プログラムがあるので，これを使ってpython2とpython3を行き来するようにしておいても便利です．(`$ sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1`など) ([参考サイト](https://codechacha.com/ja/change-python-version/))
[^2]: また，`python-is-python3`といった，シンボリックリンクを作成するパッケージもaptでインストールしてもいいです．とはいえ，Ubuntu 20.04では`python-is-python2`はもう存在しなく，`python-is-python3`しかないらしいですが([参考](https://stackoverflow.com/questions/61486624/python-is-python-2-package-something-new))