pip install pyrebase しただけなのに... (UnicodeDecodeError)

#はじめに
flaskでfirebaseを使おうと思い、便利~~(?)~~なpyrebaseというライブラリを見つけたのが全ての始まりであった。
#chapter: 1 ~予兆~
anaconda プロンプトで pip install

```
(flask_env) C:\Users\ryosu\flask_project\auto_call_app>pip install pyrebase4
Collecting pyrebase4
  Using cached https://files.pythonhosted.org/packages/25/17/653e33c0f3d4fb6556570c955b9a298990dd515bbd09b1a2abc99ec7a9fa/Pyrebase4-4.3.0-py3-none-any.whl
Collecting pycryptodome>=3.6.4
  Using cached https://files.pythonhosted.org/packages/c8/a9/d65f44cdb4b44e05b494fa0bfed087105a706033644e5826c48d3c6ccfb8/pycryptodome-3.9.4-cp38-cp38-win_amd64.whl
Collecting python-jwt==2.0.1
  Using cached https://files.pythonhosted.org/packages/dd/2a/9c4230b09f63737e7beb34e3a19895cd50c5ff88af16d3cd54cd71e2325a/python_jwt-2.0.1-py2.py3-none-any.whl
Collecting requests>=2.19.1
  Using cached https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl
Collecting requests-toolbelt>=0.7.1
  Using cached https://files.pythonhosted.org/packages/60/ef/7681134338fc097acef8d9b2f8abe0458e4d87559c689a8c306d0957ece5/requests_toolbelt-0.9.1-py2.py3-none-any.whl
Collecting oauth2client==4.1.2
  Using cached https://files.pythonhosted.org/packages/82/d8/3eab58811282ac7271a081ba5c0d4b875ce786ca68ce43e2a62ade32e9a8/oauth2client-4.1.2-py2.py3-none-any.whl
Collecting gcloud==0.18.3
  Using cached https://files.pythonhosted.org/packages/11/ab/d0cee58db2d8445c26e6f5db25d9b1f1aa14a3ab30eea8ce77ae808d10ef/gcloud-0.18.3.tar.gz
Collecting jws>=0.1.3
  Using cached https://files.pythonhosted.org/packages/01/9e/1536d578ed50f5fe8196310ddcc921a3cd8e973312d60ac74488b805d395/jws-0.1.3.tar.gz
    ERROR: Command errored out with exit status 1:
     command: 'C:\Users\ryosu\Anaconda3\envs\flask_env\python.exe' -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\ryosu\\AppData\\Local\\Temp\\pip-install-mp_hyf90\\jws\\setup.py'"'"'; __file__='"'"'C:\\Users\\ryosu\\AppData\\Local\\Temp\\pip-install-mp_hyf90\\jws\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base 'C:\Users\ryosu\AppData\Local\Temp\pip-install-mp_hyf90\jws\pip-egg-info'
         cwd: C:\Users\ryosu\AppData\Local\Temp\pip-install-mp_hyf90\jws\
    Complete output (7 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\ryosu\AppData\Local\Temp\pip-install-mp_hyf90\jws\setup.py", line 17, in <module>
        long_description=read('README.md'),
      File "C:\Users\ryosu\AppData\Local\Temp\pip-install-mp_hyf90\jws\setup.py", line 5, in read
        return open(os.path.join(os.path.dirname(__file__), fname)).read()
    UnicodeDecodeError: 'cp932' codec can't decode byte 0x93 in position 502: illegal multibyte sequence
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
```
とりあえずエラーコードを調べると、`sys.setdefaultencoding('utf-8')`を設定すると良いという記事があったのですが、python2系でのみ使えるモジュールらしく、python3系では無くなっていた...
#chapter: 2 ~地獄へ~
ここでもう一度エラー文を眺めてみると

```
  Using cached https://files.pythonhosted.org/packages/11/ab/d0cee58db2d8445c26e6f5db25d9b1f1aa14a3ab30eea8ce77ae808d10ef/gcloud-0.18.3.tar.gz
Collecting jws>=0.1.3
  Using cached https://files.pythonhosted.org/packages/01/9e/1536d578ed50f5fe8196310ddcc921a3cd8e973312d60ac74488b805d395/jws-0.1.3.tar.gz
    ERROR: Command errored out with exit status 1:
     command: 'C:\Users\ryosu\Anaconda3\envs\flask_env\python.exe' -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\ryosu\\AppData\\Local\\Temp\\pip-install-mp_hyf90\\jws\\setup.py'"'"'; __file__='"'"'C:\\Users\\ryosu\\AppData\\Local\\Temp\\pip-install-mp_hyf90\\jws\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base 'C:\Users\ryosu\AppData\Local\Temp\pip-install-mp_hyf90\jws\pip-egg-info'
         cwd: C:\Users\ryosu\AppData\Local\Temp\pip-install-mp_hyf90\jws\
    Complete output (7 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\ryosu\AppData\Local\Temp\pip-install-mp_hyf90\jws\setup.py", line 17, in <module>
        long_description=read('README.md'),
      File "C:\Users\ryosu\AppData\Local\Temp\pip-install-mp_hyf90\jws\setup.py", line 5, in read
        return open(os.path.join(os.path.dirname(__file__), fname)).read()
    UnicodeDecodeError: 'cp932' codec can't decode byte 0x93 in position 502: illegal multibyte sequence
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
```
jws をインストールしているときにエラーが出ているみたいでなので、pip install jws をすると同じエラーが出たので、やっぱり...となりました。

さらにエラー文見てみると、
` File "C:\Users\ryosu\AppData\Local\Temp\pip-install-mp_hyf90\jws\setup.py"`のように、`jws\setup.py` の中の`return open(os.path.join(os.path.dirname(__file__), fname)).read()`の行で**UnicodeDecodeError**が出ていることがわかります。
ここで[jwsのgithub](https://github.com/brianloveswords/python-jws)から直接 `setup.py`を確認すると、

```python:setup.py
import os
from setuptools import setup

def read(fname):
    return open(os.path.join(os.path.dirname(__file__), fname)).read()

setup(
    name = "jws",
    version = "0.1.2",
    author = "Brian J Brennan",
    author_email = "brian@nyhacker.org",
    description = ("JSON Web Signatures implementation in Python"),
    license = "MIT",
    keywords = "jws json web security signing",
    url = "http://github.com/brianlovesdata/python-jws",
    packages=['jws'],
    long_description=read('README.md'),
    classifiers=[
        "Development Status :: 3 - Alpha",
        "Topic :: Utilities",
        "License :: OSI Approved :: MIT License",
    ],
    test_suite = 'nose.collector',
)
```
見つけることができました。
**UnicodeDecodeError**を解決するために、encodingを指定し、それをgithubから直接pip inastall すればいけるはず...
#chapter: 3 ~そして伝説へ~
[jws](https://github.com/brianloveswords/python-jws)をgithubからzipファイルでダウンロードし、`setup.py`の`return open(os.path.join(os.path.dirname(__file__), fname)).read()`を`return open(os.path.join(os.path.dirname(__file__), fname), encoding='utf-8_sig').read()`に書き換え、エラー文をもう一度見ると、`Collecting jws>=0.1.3`とあったので、`version = "0.1.3"`ともしておきました。

書き換えたjwsを新しく作ったレポジトリにぶち込むと...
しっかりとpushできました -> [書き換えたjwsのgithub](https://github.com/kitarikes/jws4me)
これをpip installします。
github から直接pip install するには`pip install git+https://github.com/kitarikes/jws4me`のようにgithubのリンクを入力します。

```
$pip install git+https://github.com/kitarikes/jws4me
Collecting git+https://github.com/kitarikes/jws4me
  Cloning https://github.com/kitarikes/jws4me to c:\users\ryosu\appdata\local\temp\pip-req-build-lqn51ndb
  Running command git clone -q https://github.com/kitarikes/jws4me 'C:\Users\ryosu\AppData\Local\Temp\pip-req-build-lqn51ndb'
  Running command git submodule update --init --recursive -q
Building wheels for collected packages: jws
  Building wheel for jws (setup.py) ... done
  Created wheel for jws: filename=jws-0.1.3-cp38-none-any.whl size=9572 sha256=31bec145f3eb22bb415d4469f7c22914e333c3199114753d6154be320498537e
  Stored in directory: C:\Users\ryosu\AppData\Local\Temp\pip-ephem-wheel-cache-wm556ysw\wheels\8c\c9\43\5580c6dd5674d87b0619c3d91f0ec51398ed1dbd4274b0cda4
Successfully built jws
Installing collected packages: jws
  Found existing installation: jws 0.1.2
    Uninstalling jws-0.1.2:
      Successfully uninstalled jws-0.1.2
Successfully installed jws-0.1.3
```
*Successfully installed jws-0.1.3 !!!!*
無事にインストールできました。
`pip install pyrebase4`すると、無事にpyrebase4がインストールされました！
(~~ドラクエシリーズは3が好きです。#5も勿論好きです。~~)
#おわりに
pyrebaseをインストールしようとしたことで結構苦しみましたが、これでまたエラー耐性が付いたので良しとします...(これでやっとflaskの作業に移れる...)

（余談ですが、このエラーに苦しめられた後に、本日開催された[Atcoder ABC 147](https://atcoder.jp/contests/abc147) が全く出来ずにさらに悲しい気持ちになっております。）
#リンク
https://github.com/nhorvath/Pyrebase4
https://github.com/brianloveswords/python-jws