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