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 )
*/