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やってるので、当然その流れに乗ってみる。
こちらから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ってのを入れてみた。
勢い余って取り寄せてしまったけど、どう使うの?
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
によると、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
これ、漫画家のすがやさん作の 統計計算サイト。心理学を学んだ時、統計を扱う必要が あり、作ったそうだ。ぱんださんはいない頃の話かな。