ipython notebook

新しいOSを入れると、新しい事をやろうとする切っ掛けが生まれる。

Ununtu 16.04 LTS がそれだ。今回のは5年保障という事で、随分と長い付き合いに なるはず。お仕着せのDeskTop版を避けて、サーバー版にした。ほとんど何も入って いない所から自由にいろいろな物を入れて行くって、何だか刺激的な気がする。

入れる気が無いのに入ってたのがPython3系。やっと2の長いトンネルを抜けて、3系に 移行したって事で良いのでしょうか?

python3            python3.5-config   python3.5m-config  python3m
python3.5          python3.5m         python3-config     python3m-config

python3, python3m と2種類有るけど、この違いは何? 多重定義されてるけど、名前で 機能が変わるとか有るのかな? 2と3の違いは検索すると山程出て来るけど、mの違いは 全く無いね。細かい事はいいんだよ。

sakae@ub:~$ grep python- yes-we-can-supply.txt | wc -l
3340
sakae@ub:~$ grep python3- yes-we-can-supply.txt | wc -l
1485

で、リポジトリィが保持してる型録から、2と3の関連物を簡易的に調べてみた。 やはり3系は、まだまだ頑張りが足りないと言うか、普及の勢いが弱い気がする。 これで、次期のFedoraあたりが、3系をデフォにしてくれると、弾みが付くだろうね。

ipython3 notebook

例によって、資料探しから。何となく周回遅れの気がするけど、まあいいか。

Jupyter Notebook(IPython)のインストールと始め方

IPython notebook 使ってみた

Jupyter事始め

Jupyter から見た Treasure Data の使い方

起動は

ipython3 notebook --matplotlib inline

これで良いみたい。

上記の資料を見ると、pytoon語に応答するサーバーが立ってて、そこにfirefoxで接続に 行くって構図だ。

昔の事になるけど、webブラウザーが出た時そしてパアルでCGIを組んだ時、汎用の入出力 装置と思ったものだ。1995年頃は、ラジオボタンとか入力BOXをGUIで組もうと思ったら、 tcltkを使うか、てんでばらばらなGUIソフトを必死こいて覚える必要が有った。 これが、CGI一発で、何処でも動く入出力になるんだから、密かに喜んだものだ。

現代において、面倒な図とか音とかAV系は統一アプリのブラウザーに任せてしまえって、 誰でも考えるよね。そう言えば、以前goでグラフを書く時も結果をSVGにしてブラウザーに 渡してたね。

で、上のやつを少々試してみると、X Windowに慣れないせいか、ちと使いずらい。 何とかならないか。

server

Python notebook サーバーを立ち上げる を参考にやってみた。まずサーバーの雛形を作るとな。

sakae@ub:~$ ipython3 profile create nbserver
[ProfileCreate] Generating default config file: '/home/sakae/.ipython/profile_nbserver/ipython_config.py'
[ProfileCreate] Generating default config file: '/home/sakae/.ipython/profile_nbserver/ipython_notebook_config.py'
[ProfileCreate] Generating default config file: '/home/sakae/.ipython/profile_nbserver/ipython_nbconvert_config.py'

そして、設定を書く。

###   ipython_notebook_config.py
c.IPKernelApp.pylab = 'inline'
c.NotebookApp.ip = '*'             # ローカルホスト以外からもアクセス可能にする
c.NotebookApp.open_browser = False # ブラウザが自動で開かないようにする
c.NotebookApp.port = 9999          # サーバーのポートを指定する

起動は、こんな風。面倒だからスクリプトにしておくと良い。

ipython3 notebook --pylab inline --profile=nbserver &

ちゃんと、サーバーが起動した。

sakae@ub:~/notebook$ ps a
 1405 pts/1    Sl     0:02 python3 /usr/bin/ipython3 notebook --pylab inline --profile=nbserver

そして、http://ubuntu-IP-address:9999/ で、Windows7のブラウザーを起動。 この方が、X Windowを立ち上げないだけ楽だわい。

手始めにtestってノートを作って実験

    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "x = np.arange(-10, 10, 0.1)\n",
      "y = 1.0 / (1.0 + np.exp(-x))\n",
      "plt.plot(x, y)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 1,
       "text": [
        "[<matplotlib.lines.Line2D at 0xb1234a6c>]"
       ]
      },
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEACAYAAABI5zaHAAAABHNCSVQICAgIfAhki
          :
nGx8AAAAASUVORK5CYII=\n",
       "text": [
        "<matplotlib.figure.Figure at 0xb1a66a2c>"
       ]
      }
     ],

こんなのが、test.ipynbってファイルに入ってた。入力をサーバーに送ったら、結果が pngファイルで返ってきましたとな。正に、実行記録が残って行くんだな。なかなか、 良く出来てる。

手抜きしてpasswordを設定しなかったら、わらわらと警告が出てきた。ここは諦めて、 ちゃんとしておこう。

sakae@ub:~$ python3 -c "import IPython;print(IPython.lib.passwd())"
Enter password:
Verify password:
sha1:a70cef849bc7:e7ad97c1358f647af3f9ca231e33d9a4e4f1a09e

こんな風にやって、パスワードのハッシュを作成。そして、そいつを、上のconfigに 追加する。

c.NotebookApp.password = u'sha1:a70cef849bc7:e7ad97c1358f647af3f9ca231e33d9a4e4f1a09e'
c.NotebookApp.notebook_dir = '/home/sakae/notebook'

ついでに、htdocsと言うかcgi-binと言うか、要するにサーバーのtopを指定してみた。 まあ、このあたりはapacheを昔、いやという程弄んだので、意味する所は明白。 これで、警告が無くなった。生意気にajaxを使っているよ。このおかげで補間が スムーズに動くのね。世の中、進歩してるね。

ああ、それから、pylabオプションは、モジュールのコンフリクトの危険性が有るからお勧めしないとな。 素直に、 --matplotlib を選んでおけと言われたよ。

notebookの使い所

って事で、

実験屋の為のIPYTHON NOTEBOOK を見ている。

そして、 現代のエンジニアのための強力なメモ帳 Jupyter notebookのすゝめ なんてのもね。

notebookは、juliaでも使えるて、RもOKらしい。irbだかpryは、もう過去形になるのかな。 python3-pandasとかもウブで供給してるから、大変便利になりそう。

jupyter

IPython + IJulia → Jupyter アップデート覚書Jupyter notebookをリモートサーバで実行する を参考に、現在juliaが入っているFedora23に環境を作ってみたい。

[sakae@fedora ~]$ sudo pip install ipython[notebook]
[sakae@fedora ~]$ sudo pip install jupyter

をやるらしい。前提条件として、python-develを取りあえず入れておいた。何しろ python2系って事で、ほったらかしにしてましたから。

多分、エラーが出るだろうと思ったらやっぱり出たぞ。

    creating build/temp.linux-i686-2.7/bundled/libsodium/src/libsodium/crypto_aead/chacha20poly1305/sodium
    gcc -pthread -fno-strict-aliasing -O2 -g -pipe -Wall -Werror=format-security
 -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables -D_GNU_SOURCE -fPIC -fwrapv -DNDEBUG -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m32 -march=i686 -mtune=atom -fasynchronous-unwind-tables -D_GNU_SOURCE -fPIC -fwrapv -fPIC -DNATIVE_LITTLE_ENDIAN=1 -Ibundled/libsodium/src/libsodium/include -Ibundled/libsodium/src/libsodium/include/sodium -I/usr/include/python2.7 -c buildutils/initlibsodium.c -o build/temp.linux-i686-2.7/buildutils/initlibsodium.o
    gcc: エラー: /usr/lib/rpm/redhat/redhat-hardened-cc1: そのようなファイルやディレクトリはありません
    error: command 'gcc' failed with exit status 1

    ----------------------------------------
Command "/usr/bin/python -c "import setuptools, tokenize;__file__='/tmp/pip-build-3DGGMT/pyzmq/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-i08whT-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-3DGGMT/pyzmq

このエラーから判じ物で、rpm/redhatに注目。rpm-develとそれに順づるredhat何とか ってのを入れた。(もう忘れた)

で、何とか

[sakae@fedora ~]$ ipython
Python 2.7.11 (default, Mar 31 2016, 20:46:32)
Type "copyright", "credits" or "license" for more information.

IPython 4.2.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]:

ここまでは漕ぎつけた。

[sakae@fedora ~]$ julia
               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.4.5 (2016-03-18 00:58 UTC)
 _/ |\__'_|_|_|\__'_|  |
|__/                   |  i686-redhat-linux

julia> Pkg.update()
julia> Pkg.add("IJulia")
julia> using IJulia
julia> notebook()

で、アクセス出来るはずなんだけど、動かん。まあ、ものには手順ってものが有るので 順番にヤレヤレ。サーバーの設定をする。

Running a notebook server を見て、設定を作る。ウブでやったのと内容はほぼ同じけど、ちと名前が違った。

[sakae@fedora ~]$ cat .jupyter/jupyter_notebook_config.py
c = get_config()

c.NotebookApp.ip = '*'
c.NotebookApp.password = u'sha1:a70cef849bc7:e7ad97c1358f647af3f9ca231e33d9a4e4f1a09e'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 9999
c.NotebookApp.notebook_dir = '/home/sakae/notebook'

起動は、下記のようにする。

[sakae@fedora ~]$ jupyter notebook &

へー、jupyter-notebookってスクリプトが動くのか。多分、数行だろうから見ておけ。

[sakae@fedora ~]$ ps a
 1872 pts/1    S+     0:00 /usr/bin/python /usr/bin/jupyter-notebook

これを見て、分かった積もりになれとはな!

[sakae@fedora ~]$ cat /usr/bin/jupyter-notebook
#!/usr/bin/python

# -*- coding: utf-8 -*-
import re
import sys

from notebook.notebookapp import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

お友達コマンドが沢山あったぞ。それぞれ何用? 説明をみなくても一発で分かる人は 凄いと思うな。

[sakae@fedora ~]$ ls /usr/bin/jupyter*
/usr/bin/jupyter              /usr/bin/jupyter-notebook
/usr/bin/jupyter-console      /usr/bin/jupyter-qtconsole
/usr/bin/jupyter-kernelspec   /usr/bin/jupyter-serverextension
/usr/bin/jupyter-migrate      /usr/bin/jupyter-troubleshoot
/usr/bin/jupyter-nbconvert    /usr/bin/jupyter-trust
/usr/bin/jupyter-nbextension
[sakae@fedora ~]$ jupyter kernelspec list
Available kernels:
  python2      /usr/lib/python2.7/site-packages/ipykernel/resources
  julia-0.4    /home/sakae/.local/share/jupyter/kernels/julia-0.4

詳しくは、こういう所から始めなさいと言う声が有り。

jupyter notebook tutorials

Github markdown

これ、jupyterのfirefox画面に出てきた、ヘルプの案内でした。

ああ、サーバーの起動画面に、

/usr/lib/python2.7/site-packages/widgetsnbextension/__init__.py:30: UserWarning: To use the jupyter-js-widgets nbextension, you'll need to update
    the Jupyter notebook to version 4.2 or later.
  the Jupyter notebook to version 4.2 or later.""")
[W 05:37:13.950 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.

こんなのが出てるけど、取りあえず無視の方向です。

ああ、そうそう、インストール直後にjupyterを起動すると、socket.pyでソケットを 取得出来ないエラーが発生した(meth関数がエラーを検出)。その日は諦めて、翌日にマシンを再起動したら 何事も無かったがのごとく、正常に起動した。これって何なの?

それから、Windows7側のfirefoxからは接続出来ない。これって、fedoraに特有の SELinuxとやらの、硬い壁が邪魔してる? それとも、火壁が構築されてる? これは、 要調査だな。

「SELinuxのせいで動かない」撲滅ガイド ソケットは大事な資源だぞーって事だな。

そして、火壁の方は、

[sakae@fedora ~]$ sudo firewall-offline-cmd   --list-all-zones

とかやってみた。どのゾーンを見ても、httpってのは許していない。穴を開けるには どうしたら良いの? こういう面倒そうなインターフェースを経由するんじゃなくて、直接に設定ファイルを 編集しちゃいたい、CUIおじさんが嘆いております。

[sakae@fedora etc]$ sudo tree firewalld/
firewalld/
├── firewalld-server.conf
├── firewalld-standard.conf
├── firewalld-workstation.conf
├── firewalld.conf -> firewalld-server.conf
├── icmptypes
├── lockdown-whitelist.xml
├── services
└── zones
    └── FedoraServer.xml

現在は、サーバーバージョンで動いていて、そいつの設定がxmlで登録されてるって、 予測される。xmlが出てきた時点で、直接編集するなって言う、強いメッセージを 感じますよ。もうヤメヤメ。

["CentOS7(RHEL7) Firewalldの基礎の基礎" https://www.jdbc.tokyo/2014/10/centos7-firewalld-startup/]

最後に、ジュピターさんの残した足跡を確認しとく。pythonでの実行
>|
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-1+1.2246467991473532e-16j)"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import cmath\n",
    "cmath.exp( 1j * cmath.pi )"
   ]
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.11"

そしてjuliaでの実行。

   "outputs": [
    {
     "data": {
      "text/plain": [
       "-1.0 + 1.2246467991473532e-16im"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "e^(1im * pi)"
   ]
  "language_info": {
   "file_extension": ".jl",
   "mimetype": "application/julia",
   "name": "julia",
   "version": "0.4.5"
  }

やっぱり、こいうジェイソンは、読むものでは有りません。使うものです。 機械可読は、人間可読じゃあーりませんです。