7th edition
rubyのあの人じゃないけど、今origamiに嵌まっている。『高齢者のための折り紙』ぢゃ、爺婆っぽいので、 同時に『ママと遊ぼうこどものおりがみ』なんてのを借りてきた。他にも書棚一杯になる ぐらい有って、英語版のORIGAMI なんてのも有ったけど、そちらは華麗にスルー。
前者は、昔懐かしい、折り鶴とかお手玉とか船とかが主体。後者は、子供が喜びそうな動物ものが 主体でした。最初、広告の紙や新聞紙を正方形に切って使っていたんだけど、用紙を作るのが 、めっぽう面倒。100金へ行ったら、16色82枚セットなんてのが売られていたのでGet。 他にも、和紙模様とか千代紙とか、シースルーの紙とかが用意されてて、ブームなんだなあと、 知った次第。頭の体操には良いかも。それと、暇潰しにもね。
買ってきた折り紙にも、例が何種類か載っていた。日本語と英語の表記が有ったよ。中国あたり (最近は、ベトナムとかバングラデッィシュかも?)で作っているんだろうけど、マーケットは 日本だけじゃないのね。欧米にもファンが居るんなあ。
How to fold a Goldfish (きんぎょのおりかた)
金魚ってGoldfishって言うのね。まんまじゃないか。fold colored side inside が、やまおりで、 fold colored side outside ってのが、たにおり か。 っん、fold left とか fold right の方が、おいらには馴染みがあるなあ。
nobsunが熱く語る fold系関数の本質 が、面白いぞ。折る(畳む)って、昔からある重要な手続き。はて、rubyには、foldlとか foldrっての、有りましたっけ? ruby中毒な方、教えてくださいな。
7th edition
前回は、ジグソーパズルのピースを埋める旅に出た所だった。全ピースを埋められれば、そこには 青い鳥が居る事は分かっている。でも、そればかりをやっていると、あいつは進歩の無い野郎 だと言われそうなんで、少しは進歩してみる事にする。
その前に、 unixの相姦図 を眺めて、立ち位置を確認しておこう。いくらタイムマシーンに乗って、過去へ旅立ったとは いえ、現在地を確認しておくのは大事な事だ。
こういう図って普通は、相関図って描くちゃう? いいえ、ちゃんと過去から続いて(分裂して) いるから、相姦なんです。この図の左側の方にある2系統なやつは、独立独歩な新種なんですねぇ。 改めて眺めてみると面白いな。
で、何処に着地するかだけど、取り合えずv6の直系っつう事で、7th editionにします。 多分、ちょっとだけの進歩でしょうけど、 入れるのが簡単 そうって言う、裏事情が有ったりもします。 そして、 先人に習う、習うより慣れろ って言う、バイアスがかかっていたりもします。
動けよ、7
ウロトラマン8じゃなくて、7よ。過去から立ち上がれ。
上記の通りにやれば、動くはずですが、ちと文句を言われたので、
[sakae@cdr ~/UV7]$ cat uv7 set cpu u18 set rl0 RL02 att rl0 unix_v7_rl.dsk set rl1 RL02 att rl1 rl1.dsk att tm0 tm0.tap att lpt paper.txt set cpu history=256 boot rl0
上記で出てくる u18ってのは、11/45 の事ね。ちょっとsimhの仕様が変わったみたいで はまってしまったよ。
[sakae@cdr ~/UV7]$ pdp11 uv7 PDP-11 simulator V3.8-1 Disabling XQ @boot New Boot, known devices are hp ht rk rl rp tm vt : rl(0,0)rl2unix mem = 177856 # Restricted rights: Use, duplication, or disclosure # <--- Ctrl-d is subject to restrictions stated in your contract with Western Electric Company, Inc. Thu Sep 22 06:11:16 EDT 1988 login: root Password: # <--- root #
起動してみた、最初シングルユーザーで上がってくるので、Ctrl-dでマルチユーザーに移行 すると、loginのプロンプトが出てきます。
# ps awxl PID TTY TIME CMD 16 co 0:00 -sh 55 co 0:00 ps awxl 15 ? 0:00 /etc/cron # ls -l /dev total 3 crw--w--w- 1 root 0, 0 Sep 22 06:28 console crw-rw-r-- 1 root 8, 1 Sep 22 05:47 kmem -rw-r--r-- 1 bin 1345 Jun 8 1979 makefile crw-rw-r-- 1 root 8, 0 Sep 22 05:47 mem brw-rw-rw- 1 root 3, 0 Sep 22 05:48 mt0 crw-rw-rw- 1 root 12,128 Sep 22 05:48 nrmt0 crw-rw-r-- 1 root 8, 2 Sep 22 05:47 null brw------- 2 root 8, 0 Sep 22 05:48 rl0 brw------- 1 root 8, 1 Sep 22 05:55 rl1 crw-rw-rw- 1 root 12, 0 Sep 22 05:48 rmt0 brw------- 1 root 1, 1 Sep 22 05:48 rp0 brw------- 1 root 1, 3 Sep 22 05:48 rp3 crw------- 1 root 18, 0 Sep 22 05:48 rrl0 crw------- 1 root 18, 1 Sep 22 05:48 rrl1 crw------- 1 root 11, 1 Sep 22 05:48 rrp0 crw------- 1 root 11, 3 Sep 22 05:48 rrp3 brw------- 2 root 8, 0 Sep 22 05:48 swap crw-rw-r-- 1 root 17, 0 Sep 22 05:47 tty crw-rw-r-- 1 root 0, 1 Sep 22 05:47 tty1 crw-rw-r-- 1 root 0, 2 Sep 22 05:47 tty2
案内に従って、swapデバイスを作っておかないと、psでエラーになります。なして、エラーに なるかは、/usr/src/cmd/ps.cを見れば書いてあるのかなあ?
この頃はまだ、VKTのターミナルが無かったようで、カーソルが画面の中を移動する概念は 生まれていない。従って more なんてのも無い。catするしか。で、sim上では表示結果が 流れてしまうんだ。だったら、simのログ機能を使えよとか、早くラインプリンターを増設 せいとなるんだけど。。。
もっとお手軽な方法が紹介されてた。
[sakae@cdr ~/UV7]$ pdp11 uv7 | tee /tmp/u7log
とか、やって起動。別な端末から
[sakae@cdr ~/UV7]$ tail -f /tmp/u7log
して、覗けとな。(スカートの中じゃないんで、思い切り覗いても大丈夫です。私が保証します。 この方法を使って、早速ps.c を覗いてみたよ。そしたら
getdev() { #include <sys/stat.h> register FILE *df; struct stat sbuf; struct direct dbuf; if ((df = fopen("/dev", "r")) == NULL) { fprintf(stderr, "Can't open /dev\n"); exit(1); } : if ((swap = open("/dev/swap", 0)) < 0) { fprintf(stderr, "Can't open /dev/swap\n"); exit(1); } }
なんてのが、見つかった。swapを一時領域として使ってるっぽい。それよりも、驚愕だった のが、手続きの定義中に、include してる事です。こういう奔放な事は、今は許されるの だろうか? 行儀が悪いと、 あの藤原さんから 一蹴されるぐらいで済むのだろうか?
新しく追加されたもの
v7になって、tarが使えるようになった。そなら、他に追加されたのは?
# ls /bin | wc 155 155 770 # cd /usr/src/cmd # ls -l | grep dr drwxrwxr-x 2 bin 368 Sep 22 05:35 adb drwxrwxr-x 2 bin 336 Sep 22 05:35 as drwxrwxr-x 2 bin 240 Sep 22 05:39 awk drwxrwxr-x 2 bin 64 Sep 22 05:40 bas drwxrwxr-x 2 bin 336 Sep 22 05:34 c drwxrwxr-x 2 bin 112 Sep 22 05:37 cpp drwxrwxr-x 2 bin 80 Sep 22 05:36 dc drwxrwxr-x 2 bin 400 Sep 22 05:35 eqn drwxrwxr-x 2 bin 608 Sep 22 05:39 f77 drwxrwxr-x 2 bin 336 Sep 22 05:39 learn drwxrwxr-x 3 bin 176 Sep 22 05:34 lex drwxrwxr-x 2 bin 144 Sep 22 05:35 lint drwxrwxr-x 2 bin 80 Sep 22 05:36 m4 drwxrwxr-x 2 bin 176 Sep 22 05:35 make drwxrwxr-x 2 bin 464 Sep 22 05:40 mip drwxrwxr-x 2 bin 400 Sep 22 05:36 neqn drwxrwxr-x 2 bin 176 Sep 22 05:40 pcc drwxrwxr-x 2 bin 96 Sep 22 05:40 plot drwxrwxr-x 2 bin 112 Sep 22 05:41 prep drwxrwxr-x 2 bin 176 Sep 22 05:36 ratfor drwxrwxr-x 2 bin 752 Sep 22 05:39 refer drwxrwxr-x 2 bin 160 Sep 22 05:36 roff drwxrwxr-x 2 bin 96 Sep 22 05:39 sed drwxrwxr-x 2 bin 528 Sep 22 05:37 sh drwxrwxr-x 2 bin 192 Sep 22 05:36 spell drwxrwxr-x 2 bin 816 Sep 22 05:38 struct drwxrwxr-x 2 bin 64 Sep 22 05:40 tar drwxrwxr-x 2 bin 400 Sep 22 05:36 tbl drwxrwxr-x 2 bin 128 Sep 22 05:37 tp drwxrwxr-x 4 bin 512 Sep 22 05:38 troff drwxrwxr-x 2 bin 688 Sep 22 05:40 uucp drwxrwxr-x 2 bin 128 Sep 22 05:38 xsend drwxrwxr-x 2 bin 144 Sep 22 05:34 yacc
大物とおぼしき者をリストアップしてみた。awkが入ってadbが入ってmakeもあるsedもあるな。 tailが有るのにheadが無いのは、単に入れ忘れなのでしょうか?
kernelのコンパイル
# cd /usr # cat /dev/rmt0 | tar xvf - : # df /dev/rl0 473 /dev/rl1 19658
# cat myconf rl tm lp root rl 0 swap rl 0 swplo 18000 nswap 2480 # chmod 755 mkconf # ./mkconf < myconf console at 60 clock at 100 clock at 104 parity at 114 rl at 160 lp at 200 tm at 224 # ls -ltr total 365 -rw-r--r-- 1 root 52 Sep 22 07:29 myconf -rw-r--r-- 1 1001 2839 Sep 22 07:30 c.c -rw-r--r-- 1 1001 1137 Sep 22 07:30 l.s -rw-r--r-- 1 1001 22 Sep 22 07:30 mch0.s -rw-r--r-- 1 1001 12722 Feb 3 10:00 mch.s # date Thu Sep 22 07:35:18 EDT 1988
# make all cd ../sys; cc -c -O *.c; mklib; rm *.o acct.c: alloc.c: clock.c: fakemx.c: ; cd ../dev; cc -c -O *.c; mklib; rm *.o bio.c: cat.c: dc.c: : # make unix as -o mch.o mch0.s mch.s ld -o unix -X -i l.o mch.o c.o ../sys/LIB1 ../dev/LIB2 Undefined: _lpint _end _edata _etext _lpopen _lpclose _lpwrite *** Error code 1 Stop.
orz! なんてこったい、エラーだよ。でも良くエラー行を眺めると、lpxxx つう事で、プリンター 関係のエントリーポイントがすっぽりと抜けている。(それにつられて)データセグメントの 境も分からんと言っている。devの下を見たら、lp.cがそっくり欠落してた。
unix/v6から、lp.cを持ってきて、応急手当すればいいんかいな。ああ、応急手当じゃなくて、 移植になるかな。
: #include "../user.h" s!us!h/us! p #include "../h/user.h" w
ヘッダーが 7thの環境に馴染むように調整した。けど、再コンパイルするとエラーだよ。
lp.c: ./../h/user.h:49: Undefined structure mem.c:
上記でエラー行を眺めたら足りないやつが分かったので、dir.hも追加。#include の シャープさんが 無視されてて(edでの入力時)、更に不明なエラーが。。 シャープをエスケープして入力 せよとはな。そんなの知らんかったよ。
# make unix as - -o l.o l.s as -o mch.o mch0.s mch.s cc -c c.c ld -o unix -X -i l.o mch.o c.o ../sys/LIB1 ../dev/LIB2 # cp unix /myunix
修正して無事にコンパイル出来たんだけど、やっぱりリンクエラー。なんで? mklibって バイナリーのコマンドだとばかり思ってたら、スクリプトだったわい。で、lp.oを追加して LIB2の仲間へ入れた。後は、つまらない名前変更をして、やっとリンクが完了。 さあ、走らせてみよう。
[sakae@cdr ~/UV7]$ pdp11 uv7 PDP-11 simulator V3.8-1 Disabling XQ @boot New Boot, known devices are hp ht rk rl rp tm vt : rl(0,0)myunix mem = 170112 panic: iinit Simulation stopped, PC: 002316 (MOV (SP)+,177776)
なんでだ? panicなんて穏やかじゃないね。でも思い当たる節がないので、もう一度やり 直してみたらちゃんと動いた。LPも使えている。
[sakae@cdr ~/UV7]$ pdp11 uv7 PDP-11 simulator V3.8-1 Disabling XQ @boot New Boot, known devices are hp ht rk rl rp tm vt : rl(0,0)myunix mem = 177472 # Restricted rights: Use, duplication, or disclosure is subject to restrictions stated in your contract with Western Electric Company, Inc. Thu Sep 22 09:57:35 EDT 1988 login: root Password: # ls -l rl2unix myunix -rwxrwxr-x 1 root 52850 Sep 22 09:57 myunix -rwxr-xr-x 1 root 51982 Jun 8 1979 rl2unix
LPのハンドリングが追加されたので、ちょっぴりカーネルも肥大化してる。
changed
# fsck /dev/rl1 File System: Volume: ** Phase 1 - Check Blocks and Sizes ** Phase 2 - Check Pathnames ** Phase 3 - Check Connectivity ** Phase 4 - Check Reference Counts FREE INODE COUNT WRONG IN SUPERBLK FIX? y ** Phase 5 - Check Free List FREE BLK COUNT WRONG IN SUPERBLK FIX? y 1901 files 13810 blocks 5849 free ***** FILE SYSTEM WAS MODIFIED *****
icheckが進化してfsckが出来ました。まだ、/etc/fstabが誕生していないので、/etc/checklist というファイルに、チェックしたいデバイスを書いておくようになっていました。
# dmesg Sep 22 10:14 Namelist mismatch # date Thu Sep 22 10:15:05 EDT 1988 # man dmesg dmesg not found
dmesgが有ったので喜びいさんで走らせてみましたが、意味不なメッセージが、manも書かれて いないと言う無法な事になってました。ソースが語るで、読めば分かるっしょ、ですか。。。
/usr/src/cmd をtarで固めてFreeBSDに持ってきた。ゆっくりemacsでソースを眺めてる。 dmesgを動かす設定が分かったので、設定してみた。
# dmesg Sep 22 10:20 mem = 177856
報告する事は余りなくて、ちょいとつまんなかったよ。罪滅ぼしに、どんなコマンドが 有るか、貼っておく。
[sakae@cdr ~/UV7/cmd]$ ls ac.c date.c ld.c prep.h sync.c accton.c dc/ learn/ primes.s tabs.c adb/ dcheck.c lex/ prof.c tail.c ar.c dd.c lint/ ps.c tar/ arcv.c deroff.c ln.c pstat.c tbl/ as/ df.c login.c ptx.c tc.c at.c diff.c look.c pwd.c tee.c atrun.c diff3.c ls.c quot.c test.c awk/ diffh.c m4/ random.c time.c bas/ dmesg.c mail.c ranlib.c tk.c basename.c du.c make/ ratfor/ touch.c bc.y dump.c makeall* refer/ tp/ c/ dumpdir.c makekey.c restor.c tr.c cal.c echo.c mesg.c rev.c troff/ calendar.c ed.c mip/ rm.c tsort.c cat.c egrep.y mkdir.c rmdir.c tty.c cb.c eqn/ mkfs.c roff/ umount.c cc.c expr.y mknod.c sa.c uniq.c checkeq.c f77/ mount.c sed/ units.c chgrp.c factor.s mv.c sh/ update.c chmod.c fgrep.c ncheck.c size.c uucp/ chown.c file.c neqn/ sleep.c vpr.c clri.c find.c newgrp.c sort.c wall.c cmake* getty.c nice.c sp.c wc.c cmp.c graph.c nm.c spell/ who.c col.c grep.c od.c spline.c write.c comm.c icheck.c osh.c split.c xsend/ cp.c in passwd.c strip.c yacc/ cpp/ init.c pcc/ struct/ yes.c cron.c iostat.c plot/ stty.c crypt.c join.c pr.c su.c cu.c kill.c prep/ sum.c
今のlsって便利だなあ。画面一杯にリストを表示してくれる。それに対して昔のlsは、1行 1ファイルで、紙の無駄使いも甚だしい。
tailが有ってheadが無いと思っていたら。。。 面白いな、いにしえのコマンドは。
/* tail command * * tail where [file] * where is +^H_n[type] * - means n lines before end * + means nth line from beginning * type 'b' means tail n blocks, not lines * type 'c' means tail n characters * Type 'r' means in lines in reverse order from end * (for -r, default is entire buffer ) */