Debian 9 Stretch

『なぜ南武線で失くしたスマホがジャカルタにあったのか』(集英社)なんて本を読んだ。 この本のジャンルは、推理小説?と思って、手にした次第。

答えは、南武線に限らず、日本で動いていた列車は、きちんとメンテナンスされている為、 第二の人生?を海外で過ごす事が多いそうだ。

南武線で動いていた列車も、その一つ。 「この列車は本日をもって南武線の営業運転から引退し、今後はジャカルタに渡り、走り続けることとなります。電車をお降りの際は、お忘れ物がございませんように、また、この電車の思い出もお持ちかえり、、、」で、有名になったらしい。

ジャカルタに渡った電車は、日本流のメンテナンスにより、座席を外して点検が行われた。 そこにスマホが落ちてた。現地の日本大好きな整備員は、そのスマホの写真をSNSに上げた。 それがたまたま日本でキャッチされ、元の持ち主にリレーされた。

鉄道最前線

Debian 9 stretch

久々の新版Debianが出た。LTS版だな。開発がゆっくり目なので、2年は安泰だろう。

Debian 9 Stretch

Debian「stretch」リリース情報

HTTP/FTP を使って Debian CD/DVD イメージをダウンロードする

ネットには記事が満ち溢れている。インストール手順はユーチューブにも上がっていたりして、 お祭りだな。

Debian 9をインストールする

で、騒々しい週間が過ぎたので、そろりそろりと入れてみる。8の時はvboxに入れてたので、 今度のは陣地交代で、VMWare側にした。

朝の快適な時間に、debian-9.0.0-amd64-netinst.isoを取ってきて、ネットワークインストールにしました。 GUIのインストールは止めて、CUIでやった。こちらの方が馴染みやすいな。DeskTopは、何も ないのもあれなんで、lxdeを取り合えず選んでおいた。

インストール時はメモリー設定256M。だって、swap容量はメモリーの2倍に設定されるから。 インストール後は、4Gのメモリー設定と、/etc/fstabへの下記設定を行う。 これで、最大2GのRAM-Diskになる。

tmpfs /tmp tmpfs rw,nosuid,nodev

調子こいて、Windows7の方にも入れておくか。i386バージョンは、これが最後になるかも 知れないからね。apt install時に実施される、内部dbの更新が目茶目茶遅くなった(と思うぞ)。i386版を使うのを諦めさせようと、真綿で首を絞める作戦が発動されてるのかな。

python系は、システム任せにせず、miniconda3を入れた。pythonに限らず各種の言語系は、 OS側が提供するパッケージに頼らず、自分のhome-dir下に独自ツールを使って入れるのが、 トレンドになってるな。

さげます

数独の友人から、近況報告があった。数学を復習してるとか。wolframで色々出来るんだけど、 前提知識がすっかり蒸発しちゃっているので、学生時代の本をひっぱり出したそうだ。

Wolfram Alphaのいろいろな使い方23選

を見て、へーと驚くのがよい。でも、数学に限らず何でもこいが、こいつの良い所。

試しに、オイラーの大好きな、

C2H5OH

を、入力したら、一発で説明が出てきたよ。

彼の言によれば、時間帯で応答が極端に悪くなる とか。オイラーも使っててそう思った。で、前回はラズパイに入ってるWolframを使おうと して挫折したんだった。Debinanも新しくなったんで、数学の分野だけでも代替品を入れるか。

wxmaximaを入れようとしたら、1.5Gの大容量になるのね。そのほとんどが、texと言う清書 システムだ。諦めて入れた。そして、octaveもね。

それはいいんだけど、apt-cache search maximaしたら、

maxima-sage - Computer algebra system -- base system
sagemath - Open Source Mathematical Software
sagemath-common - Open Source Mathematical Software - architecture-independent files
sagemath-doc-ja - Open Source Mathematical Software - documentation (Japanese)

とか、さげます って読める数学関係者が引っかかってきた。マキシマとかとも関係有る みたいだし。 さげます って、一体何者よ。

sage

SageMath

ふーん、数学関係者をpythonでコントロールしますって事みたいだね。 condaに有るかと思ったら、有ったぞ。容量大きめそうなんで、躊躇してます。

で、ipadで、さげます を検索してマニュアルでも眺めておこうと思ったら、ipad用の アプリを無料提供中って、アプルストアから広告が入ってきた。

半信半疑で、無料の甘言に乗せられて、入れてみた。がっつりしたアプリがやって来るかと 思ったら、クラウドへアクセスする為のWeb画面が落ちて来ましたよ。

デフォルトでは、言語がsageになってたけど、Rとかも選べるようになってた。面白そうなので 暫く使ってみるかな。そして、気にいったら、VMも提供されてるので、VBOXで動かして みるか。

sage on VM

上記本家のダウンロードを辿ると、Windows用、Linux用、Mac用の3OS向けに提供されてる。 BSDは除け者ってのは、近頃のお約束みたいだ。

Linux用だと、tar玉を取ってきて展開してPATHを通せば使えるはず。Debian9のパッケージで も提供されてるので、i386なマシンに入れてみた。ダウンロードサイズが900M越え、展開す ると3Gになる代物。OSよりも大がかりなものだ。 一応使えるけど、バージョンが7.4と、ちと古い。

よって、VBOX等に入れるVM版を落としてきた。OS込みで3G越えのやはり巨大な代物。 ダブルクリックすると、VMWAREが立ち上がってきた。一応入れてみたけど、Windows10側 からアクセスする為のNICにアドレスが振られていなかった。どこかをいじれば何とかなり そうなのだけど、面倒なので止めた。

VBOXから使うには、ファイルメニューから、仮想亜プアランスのインポートを選んで、 落としてきたファイルを指定すればよい。勝手にVBOX用に変換してくれる。 デフォルトでは、メモリーが512Mと少な目なので、1Gぐらいを指定しておくと吉。

起動すると、CentOS6.9が上がってきて、最終的にjupyter画面が出てくる。このまま 使ってもいいんだけど、Windows10側から、http://localhost:8000/ にアクセスすると 広い画面でジュピター出来るぞ。

sshも提供されてるので、ssh -p 2222 localhost すれば、良い。ユーザー名とパスワードは、sage/sage が、一般ユーザー。root/sage が、rootになる。

有り難い事に、チュートリアルとツアーが、日本語でも 提供されてるので、資料には言欠かないだろう。

sage: sudoku?
Signature:      sudoku(m)
Docstring:
   Solves Sudoku puzzles described by matrices.

   INPUT:

      * "m" - a square Sage matrix over ZZ, where zeros are blank
        entries

   OUTPUT:

   A Sage matrix over ZZ containing the first solution found,
   otherwise "None".

適当に入力してTABすれば補完してくれる。?を付けると、解説が出てくる。 下記は、例から引っ張ってきたのを実行。

sage: A = matrix(ZZ,9,[5,0,0, 0,8,0, 0,4,9, 0,0,0, 5,0,0, 0,3,0, 0,6,7, 3,0,0, 0
....: ,0,1, 1,5,0, 0,0,0, 0,0,0,  0,0,0, 2,0,8, 0,0,0, 0,0,0, 0,0,0, 0,1,8, 7,0,
....: 0, 0,0,4, 1,5,0, 0,3,0, 0,0,2, 0,0,0, 4,9,0, 0,5,0, 0,0,3])
sage:
sage: A

[5 0 0 0 8 0 0 4 9]
[0 0 0 5 0 0 0 3 0]
[0 6 7 3 0 0 0 0 1]
[1 5 0 0 0 0 0 0 0]
[0 0 0 2 0 8 0 0 0]
[0 0 0 0 0 0 0 1 8]
[7 0 0 0 0 4 1 5 0]
[0 3 0 0 0 2 0 0 0]
[4 9 0 0 5 0 0 0 3]
sage: sudoku(A)

[5 1 3 6 8 7 2 4 9]
[8 4 9 5 2 1 6 3 7]
[2 6 7 3 4 9 5 8 1]
[1 5 8 4 6 3 9 7 2]
[9 7 4 2 1 8 3 6 5]
[3 2 6 7 9 5 4 1 8]
[7 8 2 9 3 4 1 5 6]
[6 3 5 1 7 2 8 9 4]
[4 9 1 8 5 6 7 2 3]

例の最後にソースの場所が示された。sageユーザーのdir下に、何もかもが詰め合わされて いるな。

File:           ~/sage-7.6/local/lib/python2.7/site-packages/sage/games/sudoku.py

このVMで動かすsageなんだけど、VMのホストOSになってるCentOSが上がってくるのが遅い。 それに、使い道がsageしかなくて、11GもDiskを喰うのは、あんまりだ。という事で、 早々と退散願った。

sage in Debian9

64Bit版の方にも、sageを入れる事にした。それなら、3Gのdisk消費で済むし、他にDebian9と しての使い道が有るからね。

で、sageを起動すると、早速エラーに見舞われた。SageTerminalAppが無いと、言ってくるんだ。32Bitでは上手く動いたのに、64Bitでは動かん。状況からして、真っ先に、pkgのミスが 考えられるな。 ネットを彷徨うも、オイラーみたいな症状の人は誰もおらず。

そうでしょ、そうでしょ。出たばかりのDebinan9にsageなんて組み合わせをする人って、 世界で何人居るんかな? debianの人気パッケージランクって、何処かに公開されてる? きっと圏外なんだろうね。

エラーは何処で出してるの? そういう所から下調べするか? まずsageは、/usr/binの 下にあるshellスクリプトってのを発見。ヘルプも埋め込まれていたぞ。 つらつら見て行くと、/usr/share/sagemath/bin に、sageの個別のプログラムが 潜んでいる事が判明。error内容をgrepすると、

sage-ipython:from sage.repl.interpreter import SageTerminalApp

このライブラリーは何処にある? /usr/lib/python2.7/dist-packages/sageの中。 そして、無いと思っていたパッケージは、ちゃんと鎮座してた。

そうなると、使われてるpythonはどれだ。と考えた所で、原因判明。miniconda3の中の python3を優先して使うように設定してた。miniconda3の中に、sageなんて、有る訳無い。 飛んだ大失敗だね。

まあ、おかげでsageのオプションも分かったので、notebookを立ち上げてみる事にする。 いえね、sageを起動しておいて、そこからnotebook()って叩いて起動してもいいんだけど、 最初からnotebookになるなら、それにこした事はない。

sakae@debian:~$ sage -n
┌────────────────────────────────────────────────────────────────────┐
│ SageMath version 7.4, Release Date: 2016-10-18                     │
│ Type "notebook()" for the browser-based notebook interface.        │
│ Type "help()" for help.                                            │
└────────────────────────────────────────────────────────────────────┘
Please wait while the old SageNB Notebook server starts...
The notebook files are stored in: sage_notebook.sagenb
┌────────────────────────────────────────────────┐
│                                                │
│ Open your web browser to http://localhost:8080 │
│                                                │
└────────────────────────────────────────────────┘
  :
2017-06-29T15:09:08+0900 [-] Loading sage_notebook.sagenb/twistedconf.tac...
2017-06-29T15:09:11+0900 [-] Loaded.
2017-06-29T15:09:11+0900 [twisted.scripts._twistd_unix.UnixAppLogger#info] twistd 16.6.0 (/usr/bin/python 2.7.13) starting up.
  :
Unable to init server: Broadway display type not supported: localhost:10.0
Error: cannot open display: localhost:10.0
/usr/bin/xdg-open: 771: /usr/bin/xdg-open: iceweasel: not found
/usr/bin/xdg-open: 771: /usr/bin/xdg-open: seamonkey: not found
/usr/bin/xdg-open: 771: /usr/bin/xdg-open: mozilla: not found
/usr/bin/xdg-open: 771: /usr/bin/xdg-open: epiphany: not found
/usr/bin/xdg-open: 771: /usr/bin/xdg-open: konqueror: not found
/usr/bin/xdg-open: 771: /usr/bin/xdg-open: chromium-browser: not found
/usr/bin/xdg-open: 771: /usr/bin/xdg-open: google-chrome: not found

ありゃ、またエラーだな。Xが動いていないとダメみたい。エラーが出てるにも関わらず、 色々なブラウザーを試しているよ。iceweaselって、Debian8時代のfirefoxだな。 商標関係が解決していなかったんで、別の名前で出てましたとな。今のDebian9では、 堂々とfirefoxが入っているぞ。最後に試すのがググル様のブラウザーってのは面白い 優先順位だな。

sakae@debian:~$ ps -aocmd
CMD
tmux -u
python /usr/share/sagemath/bin/sage-notebook -n
python /usr/share/sagemath/bin/sage-cleaner
sh -c twistd  --pidfile="sage_notebook.sagenb/sagenb.pid" -ny "sage_notebook.sag
/usr/bin/python /usr/bin/twistd --pidfile=sage_notebook.sagenb/sagenb.pid -ny sa
ps -aocmd

Xを上げて試すと、Windows10に備え付けのfirefoxが立ち上がり、 http://localhost:8080/home/admin/ を示したぞ。ローカルホストって、Windows側の ローカルホストだよな。どゆ事? sageが起動をかけてる事は想像つくけど。

flask

上のログで、flaskってのが出てきた。これって何よ?

ウェブアプリケーションフレームワーク Flask を使ってみる

軽量WebフレームワークのFlaskに入門(準備、起動、HTML、静的ファイル、GET、POSTなど)

軽量のサーバーね。知らんかった。なんか、引数にtwistedconf.tac が渡っているようだけど。この在処を探して、野次馬根性を起こしてみる。

sakae@debian:~$ lv /home/sakae/.sage/sage_notebook.sagenb/twistedconf.tac
#########
# Flask #
#########
import os, sys, random
import sagenb.flask_version.base as flask_base
opts={}
startup_token = '{0:x}'.format(random.randint(0, 2**128))
if True:
    opts['startup_token'] = startup_token
flask_app = flask_base.create_app("/home/sakae/.sage/sage_notebook.sagenb",inter
face="localhost",port=8080,secure=False, **opts)

# See http://twistedmatrix.com/documents/current/web/howto/using-twistedweb.html

twistedってのと合わせて、Webサーバーを構成してるんだな。なんでも、プロキシーも 出来るみたいなんで、それも使ってるのかな。Web関係は、色々な機能を寄ってたかって 実装するものだから、ロートルにはよう分からん世界になりつつあるなあ。

xdg-open

webサーバーは、分かった事にしよう。で、残りは、何で勝手にWindows10のfirefoxが 起動してくるかだな。xdg-openってのが怪しそう。/usr/binの下に置いてあるって事は、 デフォルトのコマンドかな? なんとなくブラウザーを見繕って、起動してるように見える んだけどな。

DESCRIPTION
       xdg-open opens a file or URL in the user's preferred application. If a
       URL is provided the URL will be opened in the user's preferred web
       browser. If a file is provided the file will be opened in the preferred
       application for files of that type. xdg-open supports file, ftp, http
       and https URLs.

       xdg-open is for use inside a desktop session only. It is not
       recommended to use xdg-open as root.

freedesktop.orgが発祥みたいだ。いや、違うな元アイデアはM$だろう。エクスプローラーを 標準としてネットスケープのブラウザーを退治したかった。で、それは不当競争防止法に 引っかかるとEUから強く言われた。

しょうがなしに、ユーザーが自分の使いたいブラウザーを登録出来るようにした。だから、 場合によってはIEであったりNSであったりするんだ。プログラムからそんなのいちいち判定 して起動させるなんて愚の骨頂。それで、ブラウザーを一意に決めるアプリが出来た。 (M$としては、作らされたって感覚だろうね)

例が載ってた。

           xdg-open 'http://www.freedesktop.org/'

       Opens the freedesktop.org website in the user's default browser.

           xdg-open /tmp/foobar.png

       Opens the PNG image file /tmp/foobar.png in the user's default image
       viewing application.

これでアプリの正体が分かったので、次はsageがこれを使っている事を証明する。 証拠物件は、 /usr/lib/python2.7/dist-packages/sage/misc/viewer.py

    if 'SAGE_BROWSER' in os.environ:
        BROWSER = os.environ['SAGE_BROWSER']
        DVI_VIEWER = BROWSER
        PDF_VIEWER = BROWSER
        PNG_VIEWER = BROWSER
         :
    elif have_program('xdg-open'):
        # On other OS'es try xdg-open if present.
        # See http://portland.freedesktop.org/xdg-utils-1.0.
        BROWSER = 'xdg-open'
        DVI_VIEWER = BROWSER
        PDF_VIEWER = BROWSER
        PNG_VIEWER = BROWSER

こんな具合に、PDFもDVIもブラウズ出来る事を期待されている。

sageを起動したのは、CUI端末。この端末が起動した時は、DISPLAY変数が有効になってて、 それは取りも直さず、GUI関係はWindows10に任せたと宣言してる。

こんな風に起動してみると

sakae@debian:~$ xdg-open 'http://www.freedesktop.org/'

こんな風に展開されたぞ。xdg-openってshellスクリプトなのね。覗いてみたら、色々な デスクトップに対応してたよ。

sakae@debian:~$ ps aocmd
CMD
/bin/sh /usr/bin/xdg-open http://www.freedesktop.org/
/usr/lib/firefox-esr/firefox-esr http://www.freedesktop.org/
/usr/lib/firefox-esr/plugin-container -greomni /usr/lib/firefox-esr/omni.ja -app

小癪にDbusなんてのを使って、firefoxを見つけ出しているっぽい。 D-Bus の存在を感じてみる

あれれ? 今までWindows10のfirefoxが使われているとばかり早とちりしてたけど、違う じゃん。しっかり、Debian9のそれが使われているよ。(lxdeなんてDeskTopを入れておいた おかげで命拾いしたな)ああ、先入観って怖いな。恥ずかしくて前の方の嘘を書いた部分を 抹消したくなったけど、馬鹿さ加減をあえて晒しておく。

じゃ、お詫びとして、本当にWindows10側のfirefoxなりエッジを使いたい時はどうする?

起動時のメッセージによれば、しっかりlocalhostしか受け付けていない。この場合の localhostってのは、Debian様が動いてホスト内からしか接続を許さないって事だ。

もっと、ワールドな世界から受け付けて欲しい。どうするか? notebook?したら答えが 出てた。

sage: notebook(interface='')
**********************************************************************
WARNING: Running the notebook insecurely not on localhost is dangerous
because its possible for people to sniff passwords and gain access to
your account. Make sure you know what you are doing.
**********************************************************************

こんな風にするだけ。パスワード平文で流れるから危ないよと警告。セキュアーにしようと して、引数を追加したら、

RuntimeError: You must install certtool to use the secure notebook server.

こんな風に怒られた。茨の道が待ってそうなんで、諦めておこう。

後は、http://debianIP:8080/ で、アクセスして、ユーザーとパスワードを入力。 ああ、事前にアドミンのページからsettingでユーザー登録しておくんだった。 ログインが成功すれば、http://debianIP:8080/home/user/ へ、案内されるよ。

Python2 vs. Python3

Debian9には、Python2.7.13とPython3.5.3の2種類が入っている。sageは昔のよしみで2系が使われている。本当は、どちらが速いんだろう? ちょいと気になる。

sakae@debian:~$ apt-cache search '^python-' | wc
   3354   30495  233391
sakae@debian:~$ apt-cache search '^python3-' | wc
   1808   17459  130941

スピード比べの前哨戦として、軽く2と3の勢力図を調べてみた。まだまだ、2が優勢と言うか 過去のしがらみが強く残っているな。

sakae@debian:~$ dpkg --get-selections | egrep '^python-' | wc
    158     316    4442
sakae@debian:~$ dpkg --get-selections | egrep '^python3-' | wc
     51     102    1447

これ、オイラーの所の勢力図。sageがPython2を採用してるせいか、2系が優勢って結果に なりました。

で、本題。 今まで、何度も登場してる数独で比べてみるか。

sakae@debian:/tmp$ python3 sudoku.py
  File "sudoku.py", line 44
    print 'All tests pass.'
                          ^
SyntaxError: Missing parentheses in call to 'print'

有名な非互換性で引っかかった。こういう時は、2to3を使って、3用に変換する。

sakae@debian:/tmp$ 2to3 -w sudoku.py
root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt
 :
RefactoringTool: Files that were modified:
RefactoringTool: sudoku.py

これで、非互換性が無くなったはずなんで、走らせてみる。

sakae@debian:/tmp$ python3 sudoku.py
All tests pass.
Traceback (most recent call last):
  File "sudoku.py", line 192, in <module>
    solve_all(from_file("easy50.txt", '========'), "easy", None)
  File "sudoku.py", line 136, in from_file
    return file(filename).read().strip().split(sep)
NameError: name 'file' is not defined

しつこく、網の目を逃れて、3じゃ動かん部分がある。これはもう、ファイルを開いてみるしか。ああ、見なくても、いいわ。引っかかってる所が露わになってるから。

fileなんてのは無いとな。どうする? 2系で、fileを調べろ。(pydocなり、ipythonでも お好きな方法で)

In [1]: file?
Docstring:
file(name[, mode[, buffering]]) -> file object

Open a file.  The mode can be 'r', 'w' or 'a' for reading (default),

fileはopenなんだな。まあ、こんな事をしなくても、上のfile、read、strip、splitって いうメソッドチェーンから、想像を逞しくするのが、pythonを逞しく使う戦士だ。 (rubyみたいに、メソッドチェーンが気持ちよく使えるのね。知らんかったわい) これで、やっと比べられるな。

sakae@debian:/tmp$ python3 sudoku.py
All tests pass.
Solved 50 of 50 easy puzzles (avg 0.00 secs (261 Hz), max 0.01 secs).
Solved 95 of 95 hard puzzles (avg 0.01 secs (74 Hz), max 0.07 secs).
Solved 11 of 11 hardest puzzles (avg 0.01 secs (196 Hz), max 0.01 secs).
Solved 99 of 99 random puzzles (avg 0.00 secs (242 Hz), max 0.00 secs).
sakae@debian:/tmp$ python sudoku.py
All tests pass.
Solved 50 of 50 easy puzzles (avg 0.00 secs (288 Hz), max 0.01 secs).
Solved 95 of 95 hard puzzles (avg 0.01 secs (81 Hz), max 0.06 secs).
Solved 11 of 11 hardest puzzles (avg 0.00 secs (216 Hz), max 0.01 secs).
Solved 99 of 99 random puzzles (avg 0.00 secs (268 Hz), max 0.01 secs).

スピード比較なんで、xxHzの部分を見る。Hzって、電気屋さんなら馴染みが有る。 (機械屋さんなら、rpmな。ああ、機械は遅いから、分単位、電子は速いから秒単位ね)

余談になるけど、昔の無線屋はHzなんて単位を使っていなかった。ずばり、c/s と書いて、 サイクル毎秒、略して、サイクルって言ってたぞ。こちらの方が、ずばりで分かり易い。 でも、電波に貢献があった、ヘルツさんを讃えて、国際単位に採用された。

この場合は、1秒間に何回実行出来るって 意味になる。勿論、数値が大きい方が実行スピードは速い。

どの問題を取っても、2系の方が優秀って結果になった。

(67.61 seconds)
(59.36 seconds)
(276.47 seconds)

駄目だしで、最も難しいというのをやってみた。上段はPython3、中段はPytho2。下段はi386な Debian9でPython3の参考結果だ。統計的に 有意な差が有るな。

sage で、対話プログラム

Sage Interactions

var('x')
x0  = 0
f   = sin(x)*e^(-x)
p   = plot(f,-1,5, thickness=2)
dot = point((x0,f(x=x0)),pointsize=80,rgbcolor=(1,0,0))
@interact
def _(order=[1..12]):
  ft = f.taylor(x,x0,order)
  pt = plot(ft,-1, 5, color='green', thickness=2)
  pretty_print(html('$f(x)\;=\;%s$'%latex(f)))
  pretty_print(html('$\hat{f}(x;%s)\;=\;%s+\mathcal{O}(x^{%s})$'%(x0,latex(ft),order+1)))
  show(dot + p + pt, ymin = -.5, ymax = 1)

上の例はちとごちゃごちゃしてるな。下記の例が基本。レンジ式の範囲がスライダーで出て来る。スライダーを動かすとその値が即xに 入れられて、関数hogeが実行される。数値が因数分解されて、その結果が表示される。スライダーを動かすと、また違う値が因数分解。これ、素数発見器にもなるな。 面倒がらずにステップ数を(整数で)指定しておかないと、factorの入力が実数となって、 盛大に文句を言われるぞ。

@interact
def hoge(x=(1,1000,1)):
    print(factor(x))

スライダーの代わりに他のI/Fが使える。詳しくは下記参照。

Sage Interact Quickstart

etc

Twitterを巡回していてわかったHaskell初心者が躓きやすいポイント8つ

こわくないHaskell入門(初級)

Haskell 超入門