venv

長年使っている携帯の電池がヘタッテきたので、新しい物を求めて携帯屋へ行った。

流行のポケモンGoは、電池劣化加速アプリだな。 ビデオをオンしたまま、GPSも動いたまま。一番電池が消耗するモードで運用してる。 これは、電池屋とスマホ屋の陰謀に違いない。

その点、オイラーの携帯は、一度充電すれば、まあ大体一週間は持つ。それが、 最近、2日ほどで干上がるようになったんだ。

交換用電池有るかな?アコギなメーカーだと、携帯に合わせて特殊な形状の電池を 積み、もう保守用の電池はEOLになりました。新しいのに買い換えてくださいって 作戦だろうけど、ソニーさんはユーザー本意。なるべく電池の形状を統一して 保守部品の長期確保に動いているとか。

取り寄せになりますって事で、数日してから取りに行った。いざ取り付けようと したら、形状が全く違うぞ。なんだこれは!

携帯屋からは正しい型番の物が発注されたけど、送られてきたものが違ったよう だった。よく型番を見ると、長い英数字の一文字だけが違うものだった。 ピックアップするときに間違えたんだな。失敗学に習って、一文字違いの 間違えるべくして間違えるような、名前を付けるの止そうね。>ソニーさん

御店の人が恐縮して、お詫びに2000円の商品券を差し上げます。こりゃまた 大盤振る舞いだ事。プライバシー情報が漏洩しても、たった500円しか貰えない せちがらい世の中なのに。。。

で、商品権は、カードに入れてくれるそう。ワレットカードって知ってます? て聞いてきた。なんじゃいそれ?

平たく言うと、スイカらしい。今年の小玉スイカは日照りで、玉が大きく ならなかったと義母が嘆いていた。ああ、話が逸れた。

ようするにプリペイドカード。スイカなんて持った事も無いおいらは、東京で 友人と移動する時、いつも自販機の前でうろうろしててごめんなさいです。

そんなワレットカードって、ずばり財布って意味なのね。オイラーは、小銭 入れかと思ってたら、どちらかと言うと財布でも札入れってイメージらしい。

そう、ワレットには思い出が有るんだ。昔、海外出張をよくやってた頃、 機内の販売カタログに、スッチーご用達のワレットが便利ですって出てた。

ヨーロッパの国を縦断する時、国毎に通貨が異なるから、小銭はおろか 札も、いろいろな国のものが混じる。札の方は、図柄で何とか区別出来た けど、小銭はさっぱり区別が出来ない。

苦肉の策で、国境をまたぐたびに、prevな国の通貨一式ビニール袋に 収納とかやってた。それでも、なるべく小銭を消化したい。

自分で小銭を出すと絶対に間違える。専用の小銭入れ、開口部が広い 一目で中身を見れるのがよい。そんなんで、スッチー推薦のワレットを ずっと使ってたよ。いよいよ分からなくなると、小銭入れをパーと開いて 欲しいの持ってて態度。

そんな時、日本製の五円玉をわざと入れとおくと、向こうに人はしげしげと 手に取って、これは何だって聞いてくる。穴の空いたコインって向こうには ないから。

日本はね、 和同開珎 なんてコインで使用が始まったけど、これにも穴が空いていた。NHKがいやと言う程 宣伝してる時代劇にも穴の空いたコインのマークが出てくるぞ。六文銭ってね。 ちゃんと歴史を継承してるんです。とかいう話を、向こうの人にしてやったよ。

で、この際ですから作りましょ。作るのは無料ですから。無料と2000円には 勝てず。その場で申請、カードは自宅に届くので、カードを持って御店へGo。

無事にプリチャージ完了。試買いは、7-11。コンビになら何処でも使えるとか。 そりゃそうだよな。お財布携帯が廃って、スマホになったけど、お財布スマホは あのシャープも諦めましたから。

Android Oも見据えるシャープのAndroid Oneスマホ「507SH」開発秘話

で、スマホ屋は、ワレットカードでお茶を濁すというか、ユーザーの囲い込み に走ったわけだ。銀行屋とも手を組んで、カードにチャージとかを出来るように なってるみたい。チャージは、元牛乳屋コンビにで可能とか。7-11は自前の銀行 持ってるんで、敬遠したんだな。

長年の携帯使用で、ポイントが随分溜まっているとの事。(電池もポイント 消費で実質0円だった)

パソコンからログインして、ポイントをカードに移せるとか。やってみたら パスワードが分からない。しょうがないので、サポートセンターに電話。

その場で、オネーチャンが仮パスワードを発行してくれた。 小文字のナイス、大文字のミルクとか言いながら。おねーちゃん、フォネティクス コードもどきを知ってるね。さすが、通信屋所属。でも、そんな方言はいただけ ないよ。

小ノベンバー、大マイクとか、正しいフォネティクスコードを使おうね。 それにしても、長い長いパスワード。年寄りだと無理だろうね。どう説明する んだろう。聞きそびれた。

ログインすると、2段階認証を使いますとか。1回目のログインをすると、 携帯のCメールでURLが届いた。そこにアクセスして、パソコンとブラウザーを 認証しろとな。

え、Cメールって音声ラインじゃん。それで文字を送れるのか。一瞬考えたけど、 ああ、昔お世話になった音声帯域のモデムなんかと、勝手に納得。

それはいいんだけど、長いURLを制限時間内に入力するって競争が待ってた。 何度か失敗。でも、よく考えたら、そんな不便な事を強いるかな。

説明書へのリンクがひっそりと画面の隅に置いてあった。それを読んで納得。 Cメールの受信内容のURLをクリックせよとな。それで、URLに携帯から接続に 行くとな。そんな事思いもしなかったぞ。頭堅いな。

なんとか、認証を突破して、ポイントをカードにチャージ出来た。やれやれ。 散歩の時、財布も持たなくても済む。小銭じゃらじゃらにならない。簡単な 身分証明書代わりになる。(ポケモンGoしてるCarに撥ねられて、意識不明とか になっても、住所が割れる)まあ、持てば便利だな。

venv

ネットをうろうろしてると、Python3向けに、仮想環境を作れるよなんて記事に 遭遇した。この手のものは、rubyにも有ったような。最近と言うかここ5年以上は rubyと疎遠になってるからなあ。一時の喧騒が去って、静かな世界に戻ったんで しょうか?

それに対して、Pythonは今や昔に流行ったBasicですよ。どこにも溢れている。 ラズパイとかだとほぼ一択。Rを駆逐して統計界にも顔を出してきたし、 機械学習もPythonにお任せあれらしい。

そうなると、俺様Python環境欲しい。OSに備え付けの物だと、古くて使えなかったり するから、仮想Python環境欲しいねって要求有り。

公式な説明書は、 venv 窶・仮想環境に有った。 これに習って、早速オイラーも追試してみる。目標は、以前にやって失敗した Pythonでspiceもどきってやつが出来るかどうか。

実験環境は主にウブの16.04を使う事にしよう。こいつなら、3.5.2が入っている んで、不足は無いだろう。

sakae@ub:~$ sudo apt-get install python3-pip
sakae@ub:~$ python3.5 -m venv -h
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
            [--upgrade] [--without-pip]
            ENV_DIR [ENV_DIR ...]

Creates virtual Python environments in one or more target directories.

positional arguments:
  ENV_DIR               A directory to create the environment in.

optional arguments:
  -h, --help            show this help message and exit
  --system-site-packages
                        Give the virtual environment access to the system
                        site-packages dir.
  --symlinks            Try to use symlinks rather than copies, when symlinks
                        are not the default for the platform.
  --copies              Try to use copies rather than symlinks, even when
                        symlinks are the default for the platform.
  --clear               Delete the contents of the environment directory if it
                        already exists, before environment creation.
  --upgrade             Upgrade the environment directory to use this version
                        of Python, assuming Python has been upgraded in-place.
  --without-pip         Skips installing or upgrading pip in the virtual
                        environment (pip is bootstrapped by default)

Once an environment has been created, you may wish to activate it, e.g. by
sourcing an activate script in its bin directory.

色々なモジュールを自前で入れていく必要があるので、事前にpython3-pipを インストールしておく。

sakae@ub:~$ python3 -m venv hoge
sakae@ub:~$ du -sh hoge
4.1M    hoge
sakae@ub:~$ tree hoge
hoge
├── bin
│ツツ ├── activate
│ツツ ├── activate.csh
│ツツ ├── activate.fish
│ツツ ├── easy_install
│ツツ ├── easy_install-3.5
│ツツ ├── pip
│ツツ ├── pip3
│ツツ ├── pip3.5
│ツツ ├── python -> python3
│ツツ └── python3 -> /usr/bin/python3
├── include
├── lib
│ツツ └── python3.5
│ツツ     └── site-packages
│ツツ         ├── easy_install.py
│ツツ         ├── pip
│ツツ         │ツツ ├── basecommand.py
│ツツ         │ツツ ├── baseparser.py
  :
├── pyvenv.cfg
└── share
    └── python-wheels
        ├── CacheControl-0.11.5-py2.py3-none-any.whl
        :
        ├── pip-8.1.1-py2.py3-none-any.whl
        ├── pkg_resources-0.0.0-py2.py3-none-any.whl
        └── wheel-0.29.0-py2.py3-none-any.whl

43 directories, 275 files

どうも、pythonを動かすための最低環境が作成されるようだ。注目は、python3が pythonって名前で呼べるようにリンクを作っている事かな。いちいち3をつけるの 鬱陶しいですから。

続いて、この環境を使えるようにソースコマンドを発するようだ。予感では、 PATHの頭に、hoge/binを設定するんだろうな。前もって、printenvでログを 取っておいて、後で比べてみよう。

sakae@ub:~$ source hoge/bin/activate
(hoge) sakae@ub:~$ printenv >NEW.log

目立つ変化は、shellのプロンプトが変わった事。それ以外は?

-PATH=/usr/local/sbin:...
+VIRTUAL_ENV=/home/sakae/hoge
+PATH=/home/sakae/hoge/bin:/usr/local/sbin:...
+PS1=(hoge) ${debian_chroot:+($debian_chroot)}\u@\h:\w\$

なる程ね。思った通りだ。なお、activateはshellスクリプト。OpenBSDでkshとかを 使っていると、sourceなんて知らないと言われる。そういう時は、おろおろしないで ソースの代わりでドットを使ってやればよい。やってる事は、これだけなんだろうね。 細かい仕様は、仕様書を嫁。斜め読みしたら、

(hoge) sakae@ub:~$ cat hoge/pyvenv.cfg
home = /usr/bin
include-system-site-packages = false
version = 3.5.2

このファイルが重要な役目を担っている事が判明した。

で、いよいよ、独自Pythonにpipコマンドで色を付けて行くんだけど、apt-getで 入れたpipが古いと、新しいのがあり末世と言われるので、先にアップデートして おくと良い。

(hoge) sakae@ub:~$ pip install --upgrade pip

リベンジ ahkab

a SPICE-like electronic circuit simulator written in Python

(hoge) sakae@ub:~$ pip install ahkab
Collecting ahkab
Collecting tabulate>=0.7.3 (from ahkab)
Collecting scipy>=0.14.0 (from ahkab)
  Downloading scipy-0.18.0-cp35-cp35m-manylinux1_i686.whl (35.6MB)
    100% |笆遺毎笆遺毎笆遺毎笆遺毎笆遺毎笆遺毎笆遺毎笆遺毎笆遺毎笆遺毎笆遺毎笆遺毎笆遺毎笆遺毎笆遺毎笆遺毎| 35.6MB 11kB/s
Collecting numpy>1.7.0 (from ahkab)
  Using cached numpy-1.11.1-cp35-cp35m-manylinux1_i686.whl
Collecting sympy>=0.7.6 (from ahkab)
Collecting mpmath>=0.19 (from sympy>=0.7.6->ahkab)
Installing collected packages: tabulate, scipy, numpy, mpmath, sympy, ahkab

自前でコンパイルしてるんで、結構時間がかかる。pipがDLしたソースファイルは、 HOME-dirの中にあるキャッシュ-dir(勿論、眼に触れないように隠し金庫)の中の pip以下に格納されてる。

(hoge) sakae@ub:~/.cache/pip/http/6/b/6/9/d$ file 6b69d0e71a89d02d896fefcd41eb3f81eb24b035950e99a830952944
6b69d0e71a89d02d896fefcd41eb3f81eb24b035950e99a830952944: data

gitを周到したのか、わけわかめなデータだ。これじゃ中身が確認出来ないじゃない。 これだから、近頃の若い者は困る。バイナリー世代、のさばるんじゃねえぞ。

早速、お試しを実行してみると、

(hoge) sakae@ub:~$ python test.py
W: Matplotlib not found.
Traceback (most recent call last):
  File "test.py", line 30, in <module>
    outfilename='bpf_transfer_fn.png')
  File "/home/sakae/hoge/lib/python3.5/site-packages/ahkab/plotting.py", line 201, in plot_results
    fig = pylab.figure(figsize=options.plotting_display_figsize)
NameError: name 'pylab' is not defined

これはpylabが入ってないという事か。じゃ、pipで入れろ。

  Using cached matplotlib-1.5.1.tar.gz
    Complete output from command python setup.py egg_info:
    ============================================================================
    Edit setup.cfg to change the build options

    BUILDING MATPLOTLIB
                matplotlib: yes [1.5.1]
                    python: yes [3.5.2 (default, Jul  5 2016, 12:43:10)  [GCC
                            5.4.0 20160609]]
                  platform: yes [linux]

    REQUIRED DEPENDENCIES AND EXTENSIONS
                     numpy: yes [version 1.11.1]
                  dateutil: yes [dateutil was not found. It is required for date
                            axis support. pip/easy_install may attempt to
                            install it after matplotlib.]
                            install it after matplotlib.]
                              :
                    libagg: yes [pkg-config information for 'libagg' could not
                            be found. Using local copy.]
                  freetype: no  [The C/C++ header for freetype2 (ft2build.h)
                            could not be found.  You may need to install the
                            development package.]
                       png: no  [pkg-config information for 'libpng' could not
                            be found.]
                     qhull: yes [pkg-config information for 'qhull' could not be
                            found. Using local copy.]

で、見事にエラー。よく見ると、Linuxの嫌がらせが炸裂してますなあ。開発者用の パッケージを入れろってさ。どうせそんなのヘッダーファイル類なんだから、けちけち しないで最初から入れておいてくれれば良いのに。まったくもう、これだからLinuxは 好きになれないのよ。

で、方針転換と言うか、以前ジュピターだかをやった時に、pylabを入れた記憶があるぞ。 ちょいと確かめてみる。

(hoge) sakae@ub:~$ locate pylab
/usr/lib/python3/dist-packages/pylab.py
/usr/lib/python3/dist-packages/IPython/core/pylabtools.py
  :
/usr/lib/python3/dist-packages/matplotlib/_pylab_helpers.py
/usr/lib/python3/dist-packages/matplotlib/pylab.py

やっぱり入っていた。だったらこれを使えばいいんでないかい。どうやって?

(hoge) sakae@ub:~$ cat hoge/pyvenv.cfg
home = /usr/bin
include-system-site-packages = true
version = 3.5.2

site-packagesがfalseだったのをtrueにしたら、本家の方も使ってくれるのでは なかろうか。

ビンゴでしたよ。無事に、bpf_transfer_fn.png が作成されました。パチパチ。

(hoge) sakae@ub:~$ du -sh hoge/
218M    hoge/
(hoge) sakae@ub:~$ cd hoge/lib/python3.5/site-packages/
(hoge) sakae@ub:~/hoge/lib/python3.5/site-packages$ ls
ahkab                   pkg_resources-0.0.0.dist-info
ahkab-0.18.dist-info    __pycache__
easy_install.py         scipy
mpmath                  scipy-0.18.0.dist-info
mpmath-0.19.dist-info   setuptools
numpy                   setuptools-20.7.0.dist-info
numpy-1.11.1.dist-info  sympy
pip                     sympy-1.0.dist-info
pip-8.1.2.dist-info     tabulate-0.7.5.dist-info
pkg_resources           tabulate.py

仮想の移動

ちょいといたずら心を起こした。homeの下に作ったのを他の場所に移動したら 動くか? 仮想でふらふらしてるんだから、アンカーさえ打ち込めば、どこでも 動く予感。やってみろ。

hogeのdir毎、/tmpの下へ移動。ああ、このエリアははかない かげろう の エリアです。OSをrebootすると、自動的にゴミ掃除が行われます。だったら、 大量のごみを置いておけるかと言うと、おいらの環境では380Mぐらいに設定 されてました。有る程度は、使用をわきまえろって事ですな。

で、移動して、sourceすると、PATHは元有った場所を指してました。 そなら、

(hoge) sakae@ub:~$ grep hoge /tmp/hoge/bin/activate
VIRTUAL_ENV="/home/sakae/hoge"
    if [ "x(hoge) " != x ] ; then
        PS1="(hoge) $PS1"

なる程、作った時の状況がハードコートされてるのね。ここを書き換えれば、 新しい所に移動しても動くって事だね。 やってみたら、ちゃんと動いた。素直な作りはPython流って事だな。 そんな事より、activateのソースを読んでおけ。

ああ、一つ不満が。仮想環境を作った時、python3をpythonでアクセス出来る ようにしてくれたのはいいけど、どうせならipythonもそうして欲しいぞ。 主流で使うのは、こちらですから。。。

それから、改めて環境変数を調べてみたんだ。 コマンドラインと環境 腐るほど沢山有って、げんなりしたよ。

FreeBSDではどうよ

どうも世の中はLinux中心で動いているみたいなんで、社会の裏側でひっそりと 頑張っている、FreeBSDにも光を当ててみる。

幸か不幸か、Python3系は全く入れてないんで、3系を入れる所からスタートする。

$ pkg search python3
  :
python3-3_3                    The "meta-port" for version 3 of the Python interpreter
python33-3.3.6_5               Interpreted object-oriented programming language
python34-3.4.5                 Interpreted object-oriented programming language
python35-3.5.2                 Interpreted object-oriented programming language

気合を入れて3系が整備されてるのは、3.3バージョンか。逆らって、一番新しいのを 入れる。別にウブと張り合う積もりはありませんです。調べてみると、pipも同梱されて るから、竹村健一じゃないけど、これだけで入れれば、新生活がスタート出来る んだな。(あ、健一さんなんてみんな知らないか。 竹村健一の手帖/ぼくなんかこれだけですよ。(1981年発表))

仮想環境を作り始める前に、ウブのキャッシュからpipの類をごっそりと盗んできて おく。ネットワークに負荷をかけない優しい心使いです。どこかのISPから、感謝状 こないかな。

$ python3.5 -m venv mypy
$ source mypy/bin/activate
(mypy) $ pip install  --upgrade pip
Collecting pip
  Using cached pip-8.1.2-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 8.1.1
    Uninstalling pip-8.1.1:
      Successfully uninstalled pip-8.1.1
Successfully installed pip-8.1.2

これで、初期の環境が出来た。

(mypy) $ pip list
pip (8.1.2)
setuptools (20.10.1)
(mypy) $ du -sh mypy/
9.5M    mypy/

状況は、こんな感じになった。後は、pipを使って入れていけばいいんだな。

    ----------------------------------------
Command "/usr/home/sakae/mypy/bin/python3.5 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-y38haq7m/scipy/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-yfu3gouk-record/install-record.txt --single-version-externally-managed --compile --install-headers /usr/home/sakae/mypy/include/site/python3.5/scipy" failed with error code 1 in /tmp/pip-build-y38haq7m/scipy/

やっぱりエラー、これ最後に出た報告。なんのこっちゃって案内だけど、screenを 遡っていくと、scipyを入れるには、blasとかのライブラリィーが必要って言ってる。 こういうのを地道に潰していかないと駄目。

(mypy) $ pip list
mpmath (0.19)
numpy (1.11.1)
pip (8.1.2)
setuptools (20.10.1)
sympy (1.0)
tabulate (0.7.5)

これ、今までの結果、やはりPythonを代表するようなモジュールは、色々な下支えが 必要って事です。そんなライブラリーは、pkgから入れればいいのでしょうかね。

(mypy) $ sudo pkg install openblas-0.2.18_1,1

入れてみたけど、外れた。BSDの場合は、変な所にインストールされてしまって、 それをpipが見つけ出せないって事もあるんで、要注意。こういう事になると、 単純なMakefileでmakeするってのが追いやすい。pipみたいに動きが隠されちゃうと 足止め喰らうんだよな。(単純に経験値が低いって噂が有るけどね)

今日の所は、これぐらいにしておこう。

(mypy) $ ipython
/usr/home/sakae/mypy/lib/python3.5/site-packages/IPython/core/history.py:228: UserWarning: IPython History requires SQLite, your history will not be saved
  warn("IPython History requires SQLite, your history will not be saved")
Python 3.5.2 (default, Jul  2 2016, 07:02:01)
Type "copyright", "credits" or "license" for more information.

IPython 5.0.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]:

負け惜しみで ipythonを入れてみた。履歴を取るのにSQLを使うって、なかなか 現代的って言うか、ここでもバイナリー野郎が出てきて、古き佳きテキスト文化が 失われております。

是非、テキスト文化を世界文化遺産に登録してください。

etc

pyenv および virtualenv の使い方(python 2.X

Python パッケージ管理技術まとめ (pip, setuptools, easy_install, etc)

Pythonでデフォルトパスを追加する方法