from SD
らしいです。オイラーもたまに買ってたけど、毎号余り代わり映えのしない記事じゃ、ユーザーに飽きられてしまって、特集目当てでしか買わなくなるからなあ。
両雑誌共、載せる材料に言欠いて、ラズパイを救世主のように記事にしてる。でも、それだって 変化に乏しいものにならざるを得ない。隔月になっても代わり映えがしないと、やがて休刊という事になるだろう。お手並み拝見だな。
昔はネットも発達してなかったので、雑誌だけが情報入手の手段だった。ユニマガことUNIX magazineに始まり、UNIX Userなんてのに大いに助けられた。
メールサーバーを立てましょうなんて記事が載ってて、POP3ってのは、POST OFFICE PROTOCOL Ver3 の事ですなんて話が書いてあった。郵便なんで郵便局なんだな、なんて妙に感心した覚えがあるぞ。
それから、思い出すのはWebサーバーの事だな。昔はapacheなんてサーバーは無かった。有ったのは、CERN Httpd これだけ。雑誌の通りに入力して、サーバーが起動した時は嬉しかったなあ。
後はBSDマガジンですかね。LinuxよりBSDの方が堅牢だし、身元もしっかりしてるんで、使うなら絶対BSDだよな。今は亡きサンマイクロシステムズも、宝石箱(IPX)には、BSD系が入ってた。それがいつの間にかピザボックス(SS5)になって、Solarisなんて入ってきたものだから、 大いに戸惑ったものだ。それでも、UNIX Userを頼りに色々やって、少しづつ技量を上げて きたな。
なんとなく、懐かしくなって思い出をちょっぴり書いてみた。
Wolfram Lab
これ、数独の問題と、それを表示するものらしい。
ini=Module[{b},{ {b,7,b,b,b,b,5,b,b}, {5,3,1,b,b,b,4,b,b}, {8,b,b,6,4,b,b,b,b}, {b,2,b,b,b,4,b,3,5}, {b,1,b,b,b,b,b,6,b}, {9,4,b,1,b,b,b,7,b}, {b,b,b,b,2,3,b,b,1}, {b,b,3,b,b,b,8,9,2}, {b,b,7,b,b,b,b,4,b} }/.b->Null]; plotGame[ini_?MatrixQ]:=Grid[ini, ItemStyle->{Directive[Blue,25,Bold],None}, ItemSize->{2.5,2.5},Dividers -> {{{Thickness[2],True,True}},{{Thickness[2],True,True}}}, Background -> {Automatic,Automatic, Flatten[Table[{i, j} -> If[EvenQ[Plus @@ Floor[{i - 1, j - 1}/3]], LightGreen, White], {i, 9}, {j, 9}]]},Spacings->{0,0.45}]
わけわかめ。方言丸出しみたいだ。右矢印って何よ? なんとなく、RやHaskellで使われる 左矢印に対抗してるみたいだけどな。 Wolfram言語のシンタックスを見ると、変換規則、オプション等って説明されてるなあ。
Show[Graphics[Disk[{0,0}],ImageSize->100],Background->RGBColor[0.97,0.93,0.68]]
こちょこちょいじっていたら、分かり易い例に出会った。Diskって丸を書く命令みたいだ。 丸を書くなら、中心と半径が必要。鍵カッコは普通のカッコの積りで使うという変態ぶり、 それで、イメージサイズを100にしろとか、背景をRGBで表せって言ってるんで、オプションへの指示記号と 分かるな。evenQってevenPが進化したもの、Lispを凌駕しましたって誇らしげに使ってんだな。
下記は、1行目1列目の候補を探す部分の一部だ。
col = DeleteCases[ini[[All, 1]], Null] ⇒ {5, 8, 9} box = DeleteCases[Flatten[ini[[1;;3,1;;3]]], Null] ⇒ {7, 5, 3, 1, 8} Complement[Range[9], Union[row, col, box]] ⇒ {2, 4, 6} pos=Position[mapini,{_}] ⇒ {{3, 2}, {6, 7}, {6, 9}, {7, 8}}
配列のスライス記号も;;と、妙な記号を割り当てている。ああ、配列とかのオリジンは1スタートだな。これは、octabeとかと一緒で、fortranの影を引きずっているんか。 まあ、余り深入りしない方が身のためだな。
ipad用のアプリも提供されてるけど、価格が360円という微妙な値段だったよ。
数学関係はsageでやろう。
素晴らしい、日本語の資料を公開してくださっているからね。
Wolframは面白いデータがてんこ盛りだぞ。例えば、
AnatomyDataに、 医学データの例が出てる。
AnatomyData[ Entity["AnatomicalStructure", "Liver"], {"Mass", "Density", "Image"}]
こういう問い合わせで、肝臓の重量、密度(比重?)、イメージが得られる。アメリカの田舎単位で答えが返ってくるってどうよ。56.4383oz, 0.606939oz/in3 ですってさ。
SI系に変換するには、UnitConvert[56.4383oz]とかすればいいんだな。 ああ、 これぐらいはググル様に聞いた方が早い。1.6Kgだそうですよ。ググルは瞬答で気持ちが いいぞ。比重は、やや水より重いってことだな。肝臓だけじゃなくて脳味噌とか心臓とか 骨とか、色々な無駄知識が得られそうで面白い。無料で使える理科年表です。
python3 venv
今頃になって先月号のSDを見てる。第一特集がEditorで、第二特集がPython。まあ、定番な 記事は新人向けって、編集長がOSSのあの方と秋葉原のバーでクダを巻いてるのも記事に なってたから、面白い。
いささか、後追いになるけど、python3で仮想環境が簡単に出来るよってあれだ。 この間入れた、Debinan9で試そうとしたら、余計な物も入れないとダメって分かったので、 Centでやってみる。
[cent ~]$ python3 -m venv /tmp/hoge [cent ~]$ du -sh /tmp/hoge 9.6M /tmp/hoge [cent ~]$ tree -d /tmp/hoge /tmp/hoge ├── bin ├── include ├── lib │ └── python3.6 │ └── site-packages │ ├── pip : │ ├── setuptools │ │ ├── command │ │ │ └── __pycache__ │ │ ├── extern │ │ │ └── __pycache__ │ │ └── __pycache__ │ └── setuptools-28.8.0.dist-info └── lib64 -> lib [cent ~]$ ls /tmp/hoge/bin/ activate activate.fish easy_install-3.6 pip3 python activate.csh easy_install pip pip3.6 python3
環境を/tmp/hogeに作ってみた。pipが有ると言う事は、勝手にあれこれインストール してもいいよって事だ。しかもユーザー権限で。
有効化するには、activateを読み込む。そして試しにipythonを入れてみた。
[cent ~]$ . /tmp/hoge/bin/activate (hoge) [cent ~]$ pip install ipython : (hoge) [cent ~]$ ipython /tmp/hoge/lib/python3.6/site-packages/IPython/core/history.py:226: UserWarning: IPython History requires SQLite, your history will not be saved warn("IPython History requires SQLite, your history will not be saved") Python 3.6.0 (default, Mar 11 2017, 04:57:21) Type 'copyright', 'credits' or 'license' for more information IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.
どんな仕組みか調べると、新たに作った所がPATHに追加されてた。
(hoge) [cent ~]$ env | grep hoge VIRTUAL_ENV=/tmp/hoge PATH=/tmp/hoge/bin:/my/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/sakae/.local/bin:/home/sakae/bin:/home/sakae/.local/bin:/home/sakae/bin PS1=(hoge) [\h \W]$
この環境から抜けるには、deactivateって叩くんだけど、こんなコマンド、PATHにも載って いないし、aliasにも登録されていない。(csh/tcshのご愛用者用のスクリプトも用意されてて、こちらは、aliasを使ってる)一体何処から、そんなコマンドが沸いて出て来た?
丁度見てたSDに コマンド探検隊 って記事が有り、bashの内部コマンドも有るぞって説明が 出てた。
(hoge) [cent ~]$ declare -f deactivate () { if [ -n "$_OLD_VIRTUAL_PATH" ]; then PATH="$_OLD_VIRTUAL_PATH"; :
内部コマンドになってたのね。また、コマンドは何処に在るってのはwhichを使って調べる ものだと思っていたら、
(hoge) [cent ~]$ type echo echo is a shell builtin (hoge) [cent ~]$ type ls ls is aliased to `ls --color=auto' (hoge) [cent ~]$ type gcc gcc is /usr/bin/gcc
このようにtypeでも調べられるそうだ。細かいbashの説明は、
(hoge) [cent ~]$ bash --help GNU bash, version 4.2.46(1)-release-(x86_64-redhat-linux-gnu) : Type `bash -c "help set"' for more information about shell options. Type `bash -c help' for more information about shell builtin commands.
とかやって調べろとな。debian9のやつは、新しい版で、大分使い勝手が向上してるぞ。
閉話休題。 python3が用意した、activateファイル3種を見てる。どれも、冒頭付近に
# This file must be used with "source bin/activate" *from bash* # you cannot run it directly
ってな事が書かれている。ソースコマンドで実行してくれ。直接は実行出来ませんって 2点が注意書きしてあった。ダメと言われたら、やってみたくなるのが性ですよ。
[cent bin]$ /bin/bash activate [cent bin]$ /bin/bash -x activate + deactivate nondestructive : + PS1='(hoge) ' + export PS1 + '[' -n /bin/bash -o -n '' ']' + hash -r
何も起こらず。少なくとも、見た目でプロンプトぐらいは変わって欲しかったのだけど。 しょうがないので、実行トレースしてみた。ちゃんとexportもされてるよ。それなのに、ああ それなのに。
悩んだ挙句の結論は、サブシェルが起動されて、PATHとかPS1が設定されたけど、終了と共に、それらは 消えてなくなった。これじゃだめだなって事だろうね。
で、ソースコマンドを使って、今動いているbash環境に影響を与えましょってのが本来の このスクリプトの意図。ちゃんとくみ取りましょう。
以下、それを確かめる、簡単な実験
[cent tmp]$ cat aa export ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ='hellow bash' [cent tmp]$ /bin/bash aa [cent tmp]$ env | grep ZZZ [cent tmp]$ . aa [cent tmp]$ env | grep ZZZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ=hellow bash
#include <stdio.h> int main(int argc, char* argv[], char *env[]) { int i; for (i=0 ; env[i] != NULL ; ++i) { printf("%s\n", env[i]); } printf("\n"); }
こんなのが某所で紹介されてたので使ってみる。mainには第三引数があり(省略可能なので、 普段は使う事が無い)これを介して、環境引数を取得出来る。すなわち、このコード片は、 簡易なenvコマンドだ。正規のenvは、今manしたら、面白いスイッチが有ったぞ。 ああ、manなんて今風じゃないか。最近は、ヘルプが大体常備されてるな。
[cent tmp]$ env --help Usage: env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...] Set each NAME to VALUE in the environment and run COMMAND. Mandatory arguments to long options are mandatory for short options too. -i, --ignore-environment start with an empty environment -0, --null end each output line with 0 byte rather than newline -u, --unset=NAME remove variable from the environment --help display this help and exit --version output version information and exit
折角なのでOpenBSDでソースと対面しとくか。その前に仕様を確認。
$ env -h env: unknown option -- h usage: env [-i] [name=value ...] [utility [argument ...]]
嘘のオプションを渡すと、使い方が指導される方式でした。ソース自身は、mainがぽつんと 有るだけの非常に質素なものでしたよ。環境をご破算にする方法が面白い。
case 'i': if ((environ = calloc(1, sizeof(char *))) == NULL) err(126, "calloc"); break;
こういう強い引数が有ると、POWER='ATOMIC BOMB' な、習金トラブルじゃなくてトランプ野郎の所や、 第二次世界大戦の勝ち組がのさばってる国連に適用したいぞ。これで、昔の栄光を 綺麗さっぱり消し去ってくれ。実行するコマンドは、原爆をgcするやつね。
普通の人は、env -i hoge とかして、親のしがらみを消し去った綺麗な環境で何か したい時に使うものだけどね。
ああ、親の七光りを当てにする、二世政治家とか二世タレントにも適用したいな。 そうすれば、少しは世の中、面白くなるか。
とんだ脱線をしちゃった。元の道にバックトレースしましょ。 コピペ野郎が作った、簡易envとテストスクリプトを組み合わせてみる。
[cent tmp]$ cat bb export zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz="hogefuga" ./a.out
環境変数は大文字ってのは、世間一般の慣習。あえてそれを破ってみる。まあ、環境変数を 設定した後、環境調査って訳。
[cent tmp]$ /bin/bash bb XDG_SESSION_ID=1 HOSTNAME=cent zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=hogefuga : [cent tmp]$ env | grep zzzzz
bbがスクリプトとして実行され、その中で自作のenvが働いた。確かに習慣を破った環境変数も 登録されてる。が、実行を終了してしまえば、登録された環境変数は忘れ去られてしまう。
[cent tmp]$ source bb : [cent tmp]$ ./a.out | grep zzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz=hogefuga
今度は、ちゃんと覚えてくれていた。
envがらみで、man environ したら、
Bourne-style shells support the syntax NAME=value command
こんなのを発見。Tipsとして、CC=clang make とかやるけど、根拠はここに有ったのね。 環境変数CCを設定して、それをmakeに渡す。makeは、CCって環境変数を見て、コンパイラーを 切り替えるとな。
haskell
atom editorなんてのもSDで紹介されてたので、これとhaskellを組み合わせるにはどうする ってテーマで、検索してたんだ。そしたら、とある方が、stack new する時に、simple を付けてた。何これ? どうやらテンプレートらしい。
付けない時に比べて、若干すっきりしたプロジェクトになる。この方が扱い易いのには 頷けるよ。
sakae@clr:/tmp$ stack new hello simple Downloading template "simple" to create project "hello" in hello/ ... sakae@clr:/tmp$ tree hello/ hello/ ├── hello.cabal ├── LICENSE ├── README.md ├── Setup.hs ├── src │ └── Main.hs └── stack.yaml
続いて、実行の流れ。
sakae@clr:/tmp$ cd hello/ sakae@clr:/tmp/hello$ stack setup sakae@clr:/tmp/hello$ stack build hello-0.1.0.0: configure Configuring hello-0.1.0.0... hello-0.1.0.0: build Preprocessing executable 'hello' for hello-0.1.0.0... [1 of 1] Compiling Main ( src/Main.hs, .stack-work/dist/x86_64-linux-tinfo6/Cabal-1.24.2.0/build/hello/hello-tmp/Main.o ) Linking .stack-work/dist/x86_64-linux-tinfo6/Cabal-1.24.2.0/build/hello/hello ... hello-0.1.0.0: copy/register Installing executable(s) in /tmp/hello/.stack-work/install/x86_64-linux-tinfo6/lts-8.21/8.0.2/bin sakae@clr:/tmp/hello$ stack exec hello hello world
そして、その方が勧めていた資料。
Practical Haskell - Getting started with stack
Practical Haskell - Importing Code
ああ、editorと言えば、Debianのrootのeditorがnanoなんだよな。インストールして、visudo すると顔を出してきて、いつもげんなり。今回は学習機能がさすがに働いたよ。
EDITOR=nvi alias vi=nvi
という、強いこだわりを.profileに反映させておいた。viと言いつつ、実態はvim。たまに、 入力モードが日本語になってる事を忘れて、viのコマンドを叩くと、レコーディングモードに 突入しちゃって右往左往しちゃうんだ。それがいやなんで、機能が少ないnviを採用。 なんで、edと言う非常用品を使わないって突っ込みは無しね。
そうだ、たまには非常訓練をしておくか。新しいOSを入れたら、ルーチンとして非常訓練を課すってのも良い習慣だな。ルーチンにしよう。ルーチンは五郎丸の特許じゃないからね。そういえば、最近彼を見かけないけど、活躍してんのかな?
sage https化
前回は、安全な接続を諦めた。でも、思い直してぐぐってみたぞ。そしたら、ちょいとパッケージを追加するだけで、動きそうなんで試してみる。
deb9:~$ sudo apt-get install gnutls-bin deb9:~$ sage sage: notebook(interface='', secure=True) The notebook files are stored in: sage_notebook.sagenb In order to use an SECURE encrypted notebook, you must first run notebook.setup(). Now running notebook.setup() Domain name [localhost]: Using default localhost Using openssl to generate key openssl genrsa 1024 > /home/sakae/.sage/notebook/private.pem Generating RSA private key, 1024 bit long modulus ..........................................++++++ ....................................++++++ e is 65537 (0x010001) certtool --generate-self-signed --template /home/sakae/.sage/notebook/cert.cfg $ -load-privkey /home/sakae/.sage/notebook/private.pem --outfile /home/sakae/.sag$ /notebook/public.pem Generating a self signed certificate... X.509 Certificate Information: : Signing certificate... Successfully configured notebook. ┌──────────────────────────────────────────────────┐ │ │ │ Open your web browser to https://localhost:8080 │ │ │ └──────────────────────────────────────────────────┘ There is an admin account. If you do not remember the password, quit the notebook and type notebook(reset=True). :
リターンを一回叩いただけで、勝手に起動した。茨の道を覚悟してたのに拍子抜け。
Windows10のFirefoxから接続すると
安全な接続ではありません xxx.xxx.xxx.xxx の所有者によるウェブサイトの設定が不適切です。 あなたの情報が盗まれることを防ぐため、このウェブサイトへの接続は確立されません。
そして、エラー内容をクリックすると
xxx.xxx.xxx.xxx:8080 は不正なセキュリティ証明書を使用しています。 自己署名をしているためこの証明書は信頼されません。 この証明書は xxx.xxx.xxx.xxx には無効です。 エラーコード: SEC_ERROR_UNKNOWN_ISSUER
おれおれ証明書なんだな。
例外を追加するボタンが有ったので押す。証明書の内容確認すると、一般名称 localhost、組織 Sage(at localhost) OU 389 期限満了日 2042年2月 等と出てきた。SHA1とSHA-256のダブルデータが入っているみたい。(今更、SHA1ですかとは言える義理ではありませんよ)
承認したら、注意付きの鍵マークになって、接続された。なお、ググルのブラウザーやエッジは、オレオレに寛容性がなく、取り付く島もない状態だったよ。どちらの方針が正しいのやら?
思うに、firefoxの方はunix的と言うか、意味を分かった上でやるなら、それを止める権利は 無いという、大人の対応だな。
折角なので、オレオレ証明書を見ておく。
deb9:~$ cd .sage/notebook/ deb9:notebook$ ls cert.cfg private.pem public.pem deb9:notebook$ cat cert.cfg cn = "localhost" tls_www_server = country = "US" signing_key = encryption_key = state = "Washington" expiration_days = "8999" organization = "SAGE (at localhost)" serial = "216932797" email = "sage@sagemath.org" unit = "389" uid = "sage_user"
発行日から、8999日は有効とな。オレオレにもちゃんとシリアル番号が付いている。pemファイルは、面白味が無いので省略。
deb9:~$ apt show gnutls-bin Package: gnutls-bin Version: 3.5.8-5+deb9u1 Priority: optional Section: net Source: gnutls28 : GnuTLS features support for: - TLS extensions: server name indication, max record size, opaque PRF input, etc. - authentication using the SRP protocol. - authentication using both X.509 certificates and OpenPGP keys. - TLS Pre-Shared-Keys (PSK) extension. - Inner Application (TLS/IA) extension. - X.509 and OpenPGP certificate handling. - X.509 Proxy Certificates (RFC 3820). - all the strong encryption algorithms (including SHA-256/384/512 and Camellia (RFC 4132)). Useful utilities include: - TLS termination: gnutls-cli, gnutls-serv - key and certificate management: certtool, ocsptool, p11tool - credential management: srptool, psktool
ああ、そう言えば、certtoolをインストールしろって出てたな。
deb9:~$ dpkg -S certtool gnutls-bin: /usr/share/man/man1/certtool.1.gz gnutls-bin: /usr/bin/certtool open-vm-tools: /usr/bin/vmware-guestproxycerttool gnutls-bin: /usr/share/doc/gnutls-bin/examples/certtool.cfg.gz
こういうの有るけど、インストールされた物が対象なんだな。
指定のファイルがどのDebianパッケージに含まれているかを調べるも見ておくと良い。
debian:~$ sudo apt install apt-file debian:~$ apt-file search certtool E: The cache is empty. You need to run "apt update" first. debian:~$ sudo apt update debian:~$ apt-file search certtool gnutls-bin: /usr/bin/certtool gnutls-bin: /usr/share/doc/gnutls-bin/examples/certtool.cfg.gz gnutls-bin: /usr/share/man/man1/certtool.1.gz gridengine-common: /usr/share/gridengine/util/certtool.sh open-vm-tools: /usr/bin/vmware-guestproxycerttool
お腹を空かせている人が魚を分けてもらうより、魚の釣り方を教えてもらう方が、人生で何千倍もありがたい。
最後に、安全な方法でnotebookを起動する方法を実験。aa.sageをちゃんとした名前に変更して、ちゃんとした所に置き、aliasにでも登録しておこう。
deb9:tmp$ cat aa.sage notebook(interface='', secure=True) deb9:tmp$ sage aa.sage > /dev/null 2>&1 & [1] 3246 deb9:tmp$ fg sage aa.sage > /dev/null 2>&1 ^Cdeb9:tmp$
これをしかるべき場所に置いたら、下記のように添削されてしまったぞ。Pythonスクリプトと して、最初から書けばいいよって事なんだな。
deb9:~$ cat .sage/run-note.sage.py # This file was *autogenerated* from the file /home/sakae/.sage/run-note.sage from sage.all_cmdline import * # import sage library notebook(interface='', secure=True)
サフィックスにpyが付いているので、これは疑いもなくPythonスクリプト。pythonから走らせてみたら、盛大に怒られた。いきなりのPython海原は無理なのね。sageの庇護のもとで走らせたら、無事に動いた。環境変数をちゃんと設定してくれているんだろうね。