from SD

「日経ソフトウエア」「日経Linux」隔月刊化のお知らせ

らしいです。オイラーもたまに買ってたけど、毎号余り代わり映えのしない記事じゃ、ユーザーに飽きられてしまって、特集目当てでしか買わなくなるからなあ。

両雑誌共、載せる材料に言欠いて、ラズパイを救世主のように記事にしてる。でも、それだって 変化に乏しいものにならざるを得ない。隔月になっても代わり映えがしないと、やがて休刊という事になるだろう。お手並み拝見だな。

昔はネットも発達してなかったので、雑誌だけが情報入手の手段だった。ユニマガこと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

Wolfram言語コードギャラリー

数学を学ぶ学生のための入門

Wolfram言語 & システム ドキュメントセンター

これ、数独の問題と、それを表示するものらしい。

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でやろう。

sage Japan

素晴らしい、日本語の資料を公開してくださっているからね。

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

モナドはポケモン。数学が出てこないモナド入門

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

ああ、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の庇護のもとで走らせたら、無事に動いた。環境変数をちゃんと設定してくれているんだろうね。