2019年2月時点での、13インチの白MacBook 2007 Lateに、Git + Python3 + Jupyter + Sphinx でPython3勉強環境を作るまでの手順を示す。
このマシンは2007年に購入したもので、その後、アップデートやクリーンインストールを経て、数年前まではhomebrewとdockerが動いていたが、いまでは動かなくなっている。
環境を作るのに苦労したので備忘録として残す。(次は、もう無理じゃないかという予感がある...)
これはadhocに調査・試行した履歴であり、抜け漏れ考慮不足、認識誤り等々あると思うが、今後のために備忘録として残すものである
- すでにOSが古く、新しいライブラリ、ツールは使えない。よって、OSX10.7.5 Lionをサポートしていた当時(2015年より前)の、古いバージョンを探して入れる。(動かなくなったツールは消しておく)
- ただし世のサイトがTLSv1.1をサポートしなくなったので、HTTPS通信するためにTLSv1.2をサポートするOpenSSLとCurl, Gitを入れる。
- Python3は公式パッケージから入れれば、opensslも自前のtls1.2対応のものが入る。
このマシンにはChrome, Firefoxなどのブラウザは、すでにLion対応の最終バージョンが入っている。(いまから、これらの最終バージョンを入手する方法は調べていない。)
-
HomeBrewではなくTigerBrewを使う
-
OpenSSL更新
-
Curl更新
-
Git導入
-
TigerBrew更新
-
python2更新
-
ruby更新
-
brewからpython3導入試行→失敗
- Sphinx入れる
- gcc入れる
- clang入れる
-
公式からpython3のosx10.6対応版入れる
- python3の証明書入れる
-
venvで環境作る
- pipの更新
- numpy==1.10.1
- pandas==0.17.1
- scipy==0.16.1
- seaborn, matplotlib
- jupyter入れる
- 起動シェル作成する
-
Sphinx入れる
- IPAフォント入れる
- sphinxcontrib-seqdiag入れる
- Pillow==2.7.0
以上。
TigerBrew はHomeBrewからフォークした、Tigerで使えるBrewであり、このプロジェクト自身すでに止まっているので、ここから得られるツールは古いものばかりである。(なのでLionにも入るはず)
※ すでに入っているHomeBrewは /usr/local下のBrew関連を消しておく
ruby -e "$(curl -fsSkL raw.github.com/mistydemeo/tigerbrew/go/install)"
TLSv1.2以降をサポートする必要が多々あるので、まずはOpenSSLを更新する。
brew install openssl
現状openssl 0.9.8 から 1.0.2j にあがる。
先に導入したOpenSSLを使うようにcurlを入れる。
brew install --with-openssl curl
brew link curl --force
導入前は、
curl 7.21.4 (universal-apple-darwin11.0) libcurl/7.21.4 OpenSSL/0.9.8z zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IPv6 Largefile NTLM SSL libz
導入後は、以下のようになる
curl 7.50.3 (x86_64-apple-darwin11.4.2) libcurl/7.50.3 OpenSSL/1.0.2j zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets
上記のOpenSSLとCurlを使うようにしてgitを入れる。
(brew自体がgitを使っているので、gitの更新が必要になる。)
brew install --force --with-brewed-curl --with-brewed-openssl git
バージョンは以下のようになった。
git version 2.10.2
TigherBrewの公式ページの案内にしたがって、Brewのリポジトリを更新する。
(これで古いバージョンを探すようになる。)
cd `brew --repository`
git remote set-url origin https://github.com/mistydemeo/tigerbrew.git
git fetch origin
git reset --hard origin/master
brewのバージョン確認は以下のようになった。
$ brew -v
Homebrew 0.9.5 (git revision 30229; last commit 2018-10-06)
Python2もTigerBrewで更新できる。
先と同様に更新したOpenSSLを使うように指示しておく。
brew link xz pkg-config makedepend openssl
brew install python --with-brewed-openssl
Python 2.7.1 から Python 2.7.15 になった。
RubyもTigerBrewで更新できる。
先と同様に更新したOpenSSLを使うように指示しておく。
brew install ruby --with-brewed-openssl
導入前は、
ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin11.0]
導入後は、以下のようになった。
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin11.0]
TigerBrewのカタログにPython3があるので、brew install python3
で入ると思いきや、Sphinx-doc
がないといわれる。この Sphinx-doc
が、そもそもTigerBrewのカタログにないので、どうにもならない。
ためしに
pip install --upgrade pip
pip install -U Sphinx
でSphinxを入れてみたが、brewは動かない。
https://github.com/mistydemeo/tigerbrew/blob/master/Library/Formula/python3.rb
からpython3のFormulaをダウンロードして、依存関係からSphinxを消して試してみると、 今度は、clangでこける。
gcc, llvmをインストールしてみるが、状況に変わりなし。
念のため、インストール後の状態の確認
$ gcc -v
Using built-in specs.
Target: i686-apple-darwin11
Configured with: /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/src/configure --disable-checking --enable-werror --prefix=/Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin11 --enable-llvm=/private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin11- --host=x86_64-apple-darwin11 --target=i686-apple-darwin11 --with-gxx-include-dir=/usr/include/c++/4.2.1
Thread model: posix
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
$ clang -v
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn)
Target: x86_64-apple-darwin11.4.2
Thread model: posix
$ gcc-7 --version
gcc-7 (Tigerbrew gcc 7.3.0) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
LLVM executables are installed in /usr/local/opt/llvm/bin.
Extra tools are installed in /usr/local/opt/llvm/share/llvm.
python3はどうやってもtigherbrewでは入れられなかった。
あとで気づいたが、pyenv
を入れられるので、ここからpython3
を入れられたようだ。(実際の手順としては先に公式のPython3.6.4を入れてから試した)
brew install pyenv
brew install pyenv-virtualenv
.bash_profile
に追記して、pyenvにPATH等を通す。
export PYENV_ROOT="${HOME}/.pyenv"
export PATH="${PYENV_ROOT}/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
pyenvのリストで確認すると、入れられる最終バージョンは3.5.0だった。
pyenv install 3.5.0
環境を作ってみる
$ mkdir -p work/pyenv35
$ cd work/pyenv35
$ pyenv local 3.5.0
$ python --version
Python 3.5.0
tigerbrewでpython3のインストールができなかったので、考えてみればbrewにこだわる必要もないし公式サイトからpython3を入れることにした。
https://www.python.org/downloads/mac-osx/
python-3.6.4-macosx10.6.pkg がosx10.7.5対応の最終のようだ。
https://www.python.org/downloads/release/python-364/
インストール後のバージョンの確認
$ python3 --version
Python 3.6.4
パッケージで入れたPython3は、そのままではHTTPSで通信できない。
(Python3が独自にOpenSSLをもっていてシステムのOpenSSLを使わないため。)
https://qiita.com/orangain/items/0a641d980019fd7e0c52
付属コマンドで証明書をマシンに導入する。
open /Applications/Python\ 3.6/Install\ Certificates.command
動作確認してみる
(py36env) $ python -c "import ssl;print(ssl.OPENSSL_VERSION)"
OpenSSL 1.0.2m 2 Nov 2017
(上記例はpy36envという環境をactivateしているのでpythonでpython3が起動している)
環境を作成してみる
python3 -m venv py36env
cd py36env
source ./bin/activate
jupyterの学習環境をつくるにあたり、以下のパッケージを入れようと思う
- numpy
- scipy
- pandas
- seaborn
- matplotlib
まずはpipを更新しておく
pip3 install --upgrade pip
numbyはネイティブライブラリを使っている。
新しいnumpyはOSX10.9以降のAPIを使っていたりするので当然OSX10.7.5では動作しない。
Lionで動作しそうなバージョンを日付で適当に選んでみる。
- 2015/10/13版
pip install numpy==1.10.1
numpyと同様な理由で古いバージョンを明示的に入れる必要がある。
- 2015/11/21版
pip install pandas==0.17.1
numpyと同様な理由で古いバージョンを明示的に入れる必要がある。
- 2015/10/25版
pip install scipy==0.16.1
seabornとmatplotlibは、それ自身は古いバージョンは指定しなくても良いようだ。
pip install seaborn
pip install matplotlib
pip install jupyter
py36envに入ってjupyter notebook
と毎度入力するのは大変なので、
以下のようなAppleScriptを作成する。
tell application "Terminal"
do script "cd $HOME;. $HOME/py36env/bin/activate;jupyter notebook --notebook-dir=Documents/jupyter-notebook&"
end tell
このスクリプトを Py36EnvJupyterLauncher.app
など適当な名前でアプリケーションバンドルとして保存する。
これを実行すると
- ターミナルを開いて、py36env環境に入り
- jupyter notebookを所定のフォルダをルートとして起動し
- py36env環境でターミナルの待ちうけ状態にはいる (pipで追加のライブラリを入れやすいように)
といった一連の動作を行う。
import seaborn
titanic = seaborn.load_dataset('titanic')
titanic.describe()
%matplotlib inline
import pandas
plot_df = pandas.DataFrame({
'col1': [1, 3, 2, 4],
'col2': [3, 4, 5, 2],
'col3': [4, 2, 3, 5],
})
plot_df.plot()
https://matplotlib.org/gallery/lines_bars_and_markers/simple_plot.html
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
# Data for plotting
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
fig, ax = plt.subplots()
ax.plot(t, s)
ax.set(xlabel='time (s)', ylabel='voltage (mV)',
title='About as simple as it gets, folks')
ax.grid()
fig.savefig("test.png")
plt.show()
一応、動作するようだ。
ひとまず、これで JupyterによるPython3学習環境はできたようだ。
ついでにSphinxの環境も作っておく。
py36環境に入って、Sphinx公式ページにしたがって、pip でインストールする。
http://www.sphinx-doc.org/ja/stable/index.html
. py36env/bin/activate
pip install -U Sphinx
ブロックダイアグラムのプラグインを利用して、シーケンス図を生成したい。
参考 → https://qiita.com/kinpira/items/505bccacb2fba89c0ff0
画像として出力されるフォントに日本語のIPAexフォントを使いたいので、まず、IPAexフォントを入れる。
unzip IPAexfont00301.zip
展開して、これを
/Library/Fonts/ipaexg.ttf
にコピーする。
ブロックダイアグラムの画像を生成するプラグインを導入する。
http://blockdiag.com/ja/seqdiag/sphinxcontrib.html
pip install Pillow==2.7.0
pip install sphinxcontrib-seqdiag
画像生成で Pillow
を使っているが、これもネイティブライブラリを使うので
古いバージョン(==2.7.0)でないと動作しない。
適当なディレクトリを作成して
sphinx-quickstart
でひな形を作成する。
seqdiagの設定をconf.py
に加える
extensions = [
'sphinx.ext.autodoc',
'sphinxcontrib.seqdiag',
]
seqdiag_fontpath = '/Library/Fonts/ipaexg.ttf'
拡張モジュールの指定とフォントパスの指定を行う。
これで
###########################
sphinx seqdiag
###########################
.. seqdiag::
:desctable:
seqdiag {
ブラウザ -> ウェブサーバ[label = "リクエスト"];
ウェブサーバ -> データベース[label = "クエリー"];
ブラウザ [description = "Internet Explorer 11 (32bit)"];
ウェブサーバ [description = "Apache Tomcat 8.5"];
データベース [description = "Oracle 12c"];
}
といったrstファイルが make html
でビルドできれば成功である。
(ラベルに日本語を使っているので、フォントのパスが通っていないと変換時にエラーになる。)
シーケンス図以外にも
も、同様な手順で導入できる。
結局のところ、Python3に関して言えば、brewをいれずとも、公式のPython3.6.4インストーラだけで行けたようだ。
Python3が動作すれば、各種ライブラリは pip
で明示的に古いバージョンを指定すれば、たいてい、なんとかなるっぽい。
ただし、pipで新しいライブラリをインストールするときに依存するライブラリのバージョンが更新されることが多々あるので、うっかり上がっていないか都度注意する必要がある。
gitを使うのであれば、tigerbrewを使って、openssl, curl, gitを導入できる。