plan9port

携帯屋から、オイラーと女房と別々に封書が届いた。パッカン携帯を持ってる人へのスマホ勧誘 ご優待メールだった。

乗り換えすると、3000円をチャージしますってさ。電子マネーもさりげなく拡販作戦だな。 これだけ大盤振る舞いするからには、裏が有るだろう。

年寄りには読めないような微細な文字で、優待券の裏に表記が有ったぞ。こちとらは、虫眼鏡で 対抗したよ。裏々作戦ですな。

乗り換え手数料が3000円かかりますってさ。ほらね、悪だくみがばれたでしょ。対抗で、優待券が、2枚有るんだから、2枚使って、女房の12年もの携帯を更新したら、徳するじゃん、、、と 思ったら、優待券は、お一人様一回のみ1枚有効ですってさ。対抗策を塞いでいるね。

で、スマホはいいから、パッカン携帯は無いのかと思ったら、わすかに2品種のみ。これは、 多品種を上げると、迷った末に何も買わない、消費者心理を塞ぐ技か? いや、そんな事はない。

スマホにチェンジして貰って、通信料で稼ごうという作戦。だから、パッカン携帯はフェードアウトしたいのよ。みえみえだな。

散歩がてら、ひやしかに行ってみますかね。ひょっとして、コーヒーぐらいは飲ませてもらえる かも。ああ、お菓子も用意しといてね。

Solarisのあれ

ほら、あれだよ、あれ。って、もう言語失語症の症状が発現してるな。いいや、女房にあれくれって言って通じる、いいふーふの関係なんですかね?

dtraceの発祥の地であるSolarisなら、これはもうやってみる鹿。

コンパイラーは残念ながら入っていない。コンパニオン(CD)さんはいないかね? ああ、コンパニオンって芸者の事か。言い得て妙だな。こういう名前を付ける、SUNは、日本に憧れを持っていたに違いない。日出国、日本。SUNと日兄弟。

なにはともあれ、gcc族を入れた。それでPythonを作ろうと思ったんだけど、configureが通らない。config.logを眺めたら、何と、stdio.h が無いとの事。そんな所まで、リナの真似を する事は無いのにね。しょうがないのでheaderを見繕って入れた。

sakae@sol:~$ sudo pkg install pkg:/developer/gcc-7@7.2.0-2017.0.0.3
sakae@sol:~$ sudo pkg install pkg:/system/header@0.5.11-2017.0.0.16797

一番新しいPythonを作成。

sakae@sol:/tmp/Python-3.6.3$ ./configure --with-dtrace
  :
sakae@sol:/tmp/Python-3.6.3$ gmake
  :
gcc    -o python Programs/python.o libpython3.6m.a -lsocket -lnsl -lintl -ldl -lsendfile    -lm
Undefined                       first referenced
 symbol                             in file
__dtrace_python___function__entry   libpython3.6m.a(ceval.o)
__dtraceenabled_python___gc__start  libpython3.6m.a(gcmodule.o)
__dtraceenabled_python___function__return libpython3.6m.a(ceval.o)
__dtrace_python___function__return  libpython3.6m.a(ceval.o)
__dtraceenabled_python___gc__done   libpython3.6m.a(gcmodule.o)
__dtrace_python___line              libpython3.6m.a(ceval.o)
__dtraceenabled_python___function__entry libpython3.6m.a(ceval.o)
__dtrace_python___gc__start         libpython3.6m.a(gcmodule.o)
__dtraceenabled_python___line       libpython3.6m.a(ceval.o)
__dtrace_python___gc__done          libpython3.6m.a(gcmodule.o)
ld: fatal: symbol referencing errors. No output written to python
collect2: error: ld returned 1 exit status
gmake: *** [Makefile:550: python] Error 1

これと同じようなエラーを以前も見たような気がする。ぐぐるで自site検索したら、今年の4月にやってた。年寄りは、時間的隔たりを認識出来なくなってるな。 ほらこれがdtraceの証拠だ。

ぶつくさいいながら、FreeBSDの時と同じ処置を施したよ。でも、python関係のプロバイダーは 、何一つとして検出されなかったぞ。

OpenIndianaって、名前が悪いよな。Indianaって州は何処にあるか探してみたら、カナダと 国境を接する五大湖の近く。錆びたベルトの一員かな。そんな田舎OSの事を考慮するPython屋は もういないのだろう。なんたって、Pythonは世界征服しちゃった偉いやつですからね。 右を見ても左を見ても、Pythonってのは、ちょいと息が詰まるな。

plan9

そんな訳なんで、Splarisはちょっと置いておいて、 不遇のUNIX後継OS「Plan 9」をラズパイで体験 に、注目してみる。Linuxだけじゃ身が持たないので、ラズパイ。でも、PiでBSD群をやるのも あれなので、Plan9に手を出したとな。

unixのスター選手達が開発したけど、リナに押されて潰された。オイラーも変なOSやってるので、当然その流れに乗ってみる。

Plan 9 from Bell Labs

こちらからCDのイメージを頂いてきた。vboxで試してみると、起動中に固まった。残念。それでは、VMWareではどうか? グラフィックがダメで、(1024x680x8と言う標準なやつを認識しない)諦めてCUIでインストール。小さい文字での対話は苦痛だ。あの人が宣伝してる拡大眼鏡が欲しいなあ。

ぶつくさ言いながらも無事にインストール完了。いざbootしたら、固まったぞ。つられてオイラーも固まった。

こうしてplan9したい病に憑りつかれました。(まあ、インフルエンザに憑りつかれるよりはいいけど。今年はワクチンが不足してるらしいんで、高騰するんですかね?あれも、恐怖を煽り立てて、売ろうという製薬会社の高等戦術。JRAと何ら変わりはありません!)

で、ネットをウロウロしてたら、plan9portってのが有る事を知った。

plan9port

有名ならFreeBSDのportsになってるはず。探したら登録されてた。

This is a port of the bulk of the Plan 9 software build environment to Unix.
It tries to reproduce the Plan 9 build environment as faithfully as possible,
providing u.h and libc.h, and blithely redefining tokens such as open, dup,
and accept in order to provide implementations that better mimic the Plan 9
semantics.  The result is a somewhat more complicated and less Unix-friendly
environment, but Plan 9 programs can typically be compiled with little or no
changes.

The port includes the following:

  - Sources for Linux, FreeBSD, and SunOS                                       
  - lib9 (nee libc), libString, libbin, libbio, libcomplete, libdraw,
    liblibflate, frame, libfs, libhtml, libhttpd, libip, libmux, libplumb,
    liblibregexp, libsec, thread, and libventi

  - 9term, acme, hoc, plumber, rio (nee 9wm), sam, and samterm, along with
    many small utilities and manual pages

  - Plan 9 bitmap fonts

WWW: http://swtch.com/plan9port/

これで喜んではいけません。厳選したportsを収録してる事では定評があるOpenBSDに置いて あれば、この業界の標準でしょう。

$ ls /usr/ports/plan9/
9libs/          CVS/            drawterm/       rc/             u9fs/
9menu/          Makefile        larswm/         sam/            w9wm/
9wm/            devdrawserver/  plan9port/      tcs/            wily/
$ du -sh /usr/local/plan9/
212M    /usr/local/plan9/

わざわざportsのカテゴリーを新設して登録するという厚遇ぶり。不遇の未来unixに敬意を 払っている事が伺えます。取り合えず、plan9portってのを入れてみた。

勢い余って取り寄せてしまったけど、どう使うの?

plan 9 on openbsd

Plan 9 from User Space

OpenBSD側に登録されてるコマンドは、/usr/local/bin/9 というのが一つだけ。 後は、/usr/local/plan9が、plan9のユーザースペースのようだ。エミュレータの類と 思われるので、エミュレータ配下にこのportsが有ってもよさそうなんだけど、別格扱い なんだな。ちょいと試運転で、manしてみた。

$ 9 man ls
     LS(1)                                                       LS(1)

     NAME
          ls, lc - list contents of directory

     SYNOPSIS
          ls [ -dlmnpqrstuFQ ] name ...

          lc [ -dlmnpqrstuFQ ] name ...
      :
     SOURCE
          /usr/local/plan9/src/cmd/ls.c
          /usr/local/plan9/bin/lc

     SEE ALSO
          stat(3), mc(1)

     Page 2                       Plan 9            (printed 11/20/17)

unixのmanのようにPAGERが挟まれるわけではなく、整形出力がcatされた。これが未来のやつね。goのおじさんみたいに短い名前をいとわない主義。

plan9と言えども、shell(bashとかzshとか)が必要。その名前は rc。

$ 9 rc
% man ls
     :
     SEE ALSO
          stat(3), mc(1)

     Page 2                       Plan 9            (printed 11/20/17)

% exit
$

rcが起動してpln9の世界に突入。その印がプロンプトの%で、わずかに知る事となる。 現実世界に戻るには、exitってお約束のコマンドを与えるとな。

Windows 10に搭載されたLinuxサブシステムにおける、Windowsプログラムとの連携や日本語処理機能を検証する

Windows-linuxの説明を見ると、相互で実行が出来るようになってる。これって、plan9portの 真似をしてるんだな。

% ls
.ICE-unix
.X11-unix
dbus-FQ27IHQZnn
ns.sakae.localhost:10
tmux-1000
vi.recover
% u ls
dbus-FQ27IHQZnn            tmux-1000
ns.sakae.localhost:10      vi.recover

最初のlsは、プロンプトが%になってるんで、plan9のls。それに対して、後のlsは、冒頭にuを付けて、unix(OpenBSD)側のlsでやってくれって依頼。

勿論、unix側にいる時にplan側のコマンドを実行したいなら、9 ls のようにする。

$ cd /usr/local/plan9/bin/
$ ./man ls | less

なんてやると、plan9側のmanコマンドでlsを表示させ、それをunix側のlessで受けるなんて 事も可能だ。

$ ./man -h 9l
$ ./man -t 9a | page

これで、plan9のCコンパイラー説明書を、(OpenBSDの)firefoxに表示させられる。後者は、 plan9の何でも表示器(view FAX, image, graphic, PostScript, PDF, and typesetter output files)に送って、表示させられる。(GUI画面だけどね)

% man 3 intro | p

こちらは、manの出力を普通のPAGERにパイプしたもの。RETURNで次のページを 表示する。

$ ./sig print
        int print(char *format, ...)
$ ./lookman web
man 1 0intro # 0intro(1)
man 1 cvs # cvs(1)
man 1 man # man(1)
man 1 web # web(1)
man 3 9p # 9p(3)
man 3 html # html(3)
man 7 plumb # plumb(7)
man 7 thumbprint # thumbprint(7)

もうちょっとman繋がりで、sigは関数の検索。lookmanは、man -k 相当か。

9

$ cat /usr/local/bin/9
#!/bin/sh

PLAN9=${PLAN9:-/usr/local/plan9}
export PLAN9

case "$PATH" in
$PLAN9/bin:*)
        ;;
*)
        PATH=$PLAN9/bin:$PATH
        export PATH
        ;;
esac

case $# in
[1-9]*)
       exec "$@"
       ;;
esac

uは、この逆。ソースを見て納得してください。PATHマジックです。

prog

Plan 9

によると、plan9のハロワは下記のようです。

% cat hello.c
#include <u.h>
#include <libc.h>

void
main(void){
        print("Hello World\n");
}

そして、コンパイルと実行は

% 9c hello.c
% 9l hello.o
% ls
a.out
hello.c
hello.o
% ./a.out
Hello World

コンパイラーとかリンカーは、あのgoおじさんのコマンドそっくり。plan9の夢を密かにgoで 実現したって事でしょう。ああ、夢じゃなくてベル研という天国を追い出された、怨念がこもっているんだな。

% cat mkfile
runme:  hello.c
        9c -g hello.c
        9l -o runme hello.o

% mk
9c -g hello.c
9l -o runme hello.o
% runme
Hello World
% file runme
runme: AMD64 ELF executable
% ldd runme
runme:
        Start            End              Type Open Ref GrpRef Name
        000003fab2200000 000003fab240b000 exe  1    0   0      runme
        000003fccdbfb000 000003fccde21000 rlib 0    1   0      /usr/lib/libm.so.10.0
        000003fcb58ee000 000003fcb5afb000 rlib 0    1   0      /usr/lib/libutil.so.12.2
        000003fd5e342000 000003fd5e622000 rlib 0    1   0      /usr/lib/libc.so.90.0
        000003fd05000000 000003fd05000000 rtld 0    1   0      /usr/libexec/ld.so

unixのmakeはplan9では、mk。デフォのMakefileは、mkfileだとか。短縮形に磨きがかかっているな。

で、 acidって言うdebuggerが有るようだけど、まともに動かないって書いてあった。

     EXAMPLES
          Start to debug /bin/ls; set some breakpoints; run up to the
          first one (this example doesn't work on Unix yet):

               % acid /bin/ls
               /bin/ls: mips plan 9 executable
               /sys/lib/acid/port
               /sys/lib/acid/mips
               acid: new()
               70094: system call  _main     ADD  $-0x14,R29
               70094: breakpoint   main+0x4  MOVW R31,0x0(R29)
               acid: pid
               70094
	       :

本当だ。動かないなあ。

% acid ls
ls: linux amd64 shared object
/usr/local/plan9/acid/port
/usr/local/plan9/acid/amd64
acid; new()
<stdin>:2: (error) msg: pid=87087 attached: ctlproc not implemented
acid; acid: <stdin>:2 (fatal problem) new: hang 87087: ctlproc not implemented

acid;

acidと言うplan9のdebuggerをOpenBSD側のegdb(portsから入れるとこういう名前で登録される)で、追ってみるという無謀な事をやってみる。

% egdb acid
GNU gdb (GDB) 7.12.1
 :
Reading symbols from acid...done.
(gdb) b main
Breakpoint 1 at 0x25844: file main.c, line 10.
(gdb) r ls
Starting program: /usr/local/plan9/bin/acid ls

Breakpoint 1, main (argc=2, argv=0x7f7ffffe8a68) at main.c:10
10      main.c: No such file or directory.
(gdb) directory /usr/local/plan9/src/cmd/acid
Source directories searched: /usr/local/plan9/src/cmd/acid:$cdir:$cwd
(gdb) list
5       #define Extern
6       #include "acid.h"
7       #include "y.tab.h"
8
9       extern int __ifmt(Fmt*);
10
11      static Biobuf   bioout;
12      static char*    lm[16];
13      static int      nlm;
14      static char*    mtype;

ここまでは普通の使い方だな。で、次はforkするんだろうね。

(gdb) b fork
Breakpoint 1 at 0x1ce1a6dbf804: file /usr/src/lib/libc/sys/w_fork.c, line 48.
(gdb) c
Continuing.

acid; new()

Thread 1 hit Breakpoint 1, _libc_fork_wrap ()
    at /usr/src/lib/libc/sys/w_fork.c:48
48              if (TAILQ_FIRST(&_atfork_list) == NULL) {

ビンゴ。このあたりに核が居るのね。で、次は実装されていないと言うシステムコール。

(gdb) b ctlproc
Breakpoint 2 at 0x1cdf91410914: file ./nosys.c, line 51.
(gdb) c
Continuing.
/usr/local/plan9/bin/acid: <stdin>:5 (fatal problem) new: hang 66993: ctlproc not implemented

Thread 1 hit Breakpoint 2, ctlproc (pid=66993, msg=0x1cdf9153fcbe "attached")
    at ./nosys.c:51
51      ./nosys.c: No such file or directory.
(gdb) directory /usr/local/plan9/src/libmach
Source directories searched: /usr/local/plan9/src/libmach:/usr/local/plan9/src/cmd/acid:/usr/local/plan9/bin/Copyright:/usr/local/plan9/bin/(C):/usr/local/plan9/bin/2017:/usr/local/plan9/bin/Free:/usr/local/plan9/bin/Software:/usr/local/plan9/bin/Foundation,:/usr/local/plan9/bin/Inc.:$cdir:$cwd
(gdb) list
46      int
47      ctlproc(int pid, char *msg)
48      {
49              USED(pid);
50              USED(msg);
51              werrstr("ctlproc not implemented");
52              return -1;
53      }
54
55      char*

辿り付いた。折角なので、ここに至る歴史。

(gdb) bt
#0  ctlproc (pid=66993, msg=0x1cdf9153fcbe "attached") at ./nosys.c:51
#1  0x00001cdf9140cba8 in msg (pid=66993, msg=0x1cdf9153fcbe "attached")
    at proc.c:231
#2  0x00001cdf9140cab3 in nproc (argv=<optimized out>) at proc.c:91
#3  0x00001cdf9140a18d in newproc (r=0x7f7ffffb9638, args=<optimized out>)
    at builtin.c:222
#4  0x00001cdf91404d81 in execute (n=0x1ce27fac4a80) at exec.c:94
#5  0x00001cdf91404ef8 in execute (n=<optimized out>) at exec.c:123
#6  0x00001cdf91404eef in execute (n=<optimized out>) at exec.c:122
#7  0x00001cdf91404eef in execute (n=<optimized out>) at exec.c:122
#8  0x00001cdf91404eef in execute (n=<optimized out>) at exec.c:122
#9  0x00001cdf91404eef in execute (n=<optimized out>) at exec.c:122
#10 0x00001cdf91404eef in execute (n=<optimized out>) at exec.c:122
#11 0x00001cdf91404eef in execute (n=<optimized out>) at exec.c:122
#12 0x00001cdf91405cc7 in call (fn=0x1ce26472c360 "new",
    parameters=<optimized out>, local=<optimized out>, body=<optimized out>,
    retexp=0x7f7ffffbbf28) at exec.c:583
#13 0x00001cdf91407f92 in ocall (n=0x1ce23ee13300, res=0x7f7ffffbbf28)
    at expr.c:982
#14 0x00001cdf91404d81 in execute (n=0x1ce28845a480) at exec.c:94
#15 0x00001cdf9140e3d2 in yyparse ()
    at /usr/obj/ports/plan9port-20170505/plan9port-c976381d67e1c1ff16f155cbcc6c905245d0520f/src/cmd/acid/dbg.y:55
#16 0x00001cdf91400fd2 in p9main (argc=<optimized out>, argv=<optimized out>)
    at main.c:166
#17 0x00001cdf91425849 in main (argc=66993, argv=0x1cdf9153fcbe) at main.c:10

これだけ揃えば、つつく目途が立ったな。

etc

これ、漫画家のすがやさん作の 統計計算サイト。心理学を学んだ時、統計を扱う必要が あり、作ったそうだ。ぱんださんはいない頃の話かな。

Pythonによる統計計算