Appraisal Corner
鑑定人の推理 vs AI の解析 — 同じコメントを人間と機械がどう読むか
Published Appraisals
COBOL → Web(ACAS GL 会計システム)
Coming soonC → Rust(変愚蛮怒 33万行→1万行、2日で完了)
Coming soonRPG → Web(AS/400 顧客マスタ、約15分で完了)
Coming soonCOBOL+ASM → Web(CardDemo クレジットカード)
Coming soonVB6 → Web(POS 神フォーム3,150行の解体)
Coming soonPL/I → Web(Habitat 世界初MMO 1986年)
Coming soonC+Lua → Python+React(変愚蛮怒 Web版)
Coming soonMUMPS → Web(VistA Problem List)
Coming soonFortran → Web(Saturn磁場モデル 3D可視化)
Coming soon鑑定書#002 BRL-CAD — 米陸軍が40年メンテし続けたCコード
Coming soon鑑定書#003 DSPython — Nintendo DSの4MBにPythonを載せた話
Coming soon鑑定書#004 QEMU — 天才が書いた47万行のCPUエミュレータ
Coming soon鑑定書#005 Whitaker's WORDS — 米空軍大佐がAdaでラテン語辞書
Coming soon鑑定書#006 NASA NASTRAN-95 — 宇宙を飛ばすFortran
Coming soon鑑定書#007 DikuMUD II — MMORPG始祖
Coming soon鑑定書#008 NCSA Mosaic — 世界初のWebブラウザ
Coming soon鑑定書#009 Minix 1 — Linuxの祖先
Coming soon鑑定書#010 Mocha — JavaScriptは10日間で書かれた
Coming soon鑑定書#011 farbrausch — 96KBにFPSゲームを詰め込んだ
Coming soon鑑定書#012 Lisp Machine — 96万行のLispで書かれたOS
Coming soon鑑定書#013 MPC-HC — みんな使ってたMedia Player Classic
Coming soonQBasic → React 変換 + 鑑定書#014 Oregon Trail(1971年の教育ゲーム)
Coming soonAda → React 変換 Whitaker's WORDS(ラテン語辞書)
Coming soonJava/Forth → TypeScript 変換 Mako VM(仮想ゲームコンソール)
Coming soon鑑定書#054 Lotus 1-2-3 — VisiCalcを1年で葬ったキラーアプリ
Coming soon鑑定書#055 Turbo Pascal — $49.95の稲妻、観光ビザでIDEを発明
Coming soon鑑定書#056 HyperCard — Webを発明できたのに、しなかった扉
Coming soon鑑定書#057 Perl 1.0 — awkとsedを殺すつもりはなかった実用主義の奇跡
Coming soon鑑定書#058 GNU Make — タブ文字の呪い、35年の共犯者
Coming soon鑑定書#059 sendmail — インターネットメールの守門者、30年の混沌
Coming soon鑑定書#060 dBase II — 「dBase I」は存在しない、.DBFの不死
Coming soon鑑定書#061 Dartmouth BASIC — 教授が無償で配った種、商人が刈り取った実
Coming soon鑑定書#062 X Window System — 仕組みを提供する、ポリシーは提供しない
Coming soon鑑定書#063 AWK — 3人の頭文字がPerlを生んだ、48年現役の1行言語
Coming soon鑑定書#064 Bourne Shell — Cで書いたAlgol、45年後も/bin/shに宿る
Coming soon鑑定書#065 grep — 一晩で書かれた道具、動詞になった名前
Coming soon鑑定書#066 diff — jackpot、git diffの祖先、1974年の645行
Coming soon鑑定書#067 ed — すべての正規表現は1969年から、g/re/pの産室
Coming soon鑑定書#068 dc — bcより古い、1969年のRPN電卓とチューリング完全マクロ
Coming soon鑑定書#069 sed — edの子、grepの兄弟、holdspaceで記憶を持った1974年のストリームエディタ
Coming soon鑑定書#070 yacc — コンパイラを生むコンパイラ、AWK/bc/Perlを産んだメタツール
Coming soon鑑定書#071 bc.y — yacc文法1枚が生んだ2プロセスJIT、パイプ越しにdcを動かす300行のコンパイラ
Coming soon鑑定書#072 Lua 1.0 — 公開されなかった最初のLua、失われたソースと@()の時代
Coming soon鑑定書#073 lex — Eric Schmidtが1976年に書いたコード生成器、lexはyaccで書かれyaccはlexを使う
Coming soon鑑定書#074 make — タブ文字という小さな罪、Stuart Feldmanが54回直せなかった1976年の接着剤
Coming soon鑑定書#075 lint — yaccを書いた男が書いた2パスのCコード品質検査、/* VARARGS */とstruct lineの1977年
Coming soon鑑定書#076 pcc — UNARY MUL、Steve Johnsonが2ビットシフトで型を表現した1977年の移植可能なCコンパイラ
Coming soon鑑定書#077 m4 — マクロは自分自身を展開する、KernighanとRitchieが900行で書いたプッシュバックバッファの機械
Coming soon鑑定書#078 Ratfor — GOKという名のトークン、Brian KernighanがFortranに構造化プログラミングを接ぎ木した1974年
Coming soon鑑定書#079 crypt — considerably trivialized、Ken ThompsonがEnigmaを意図的に骨抜きにした1976年と同じUnixに共存したFIPS DESの完全実装
Coming soon鑑定書#080 f77 — FAMILY==SCJ、Steve JohnsonのCコンパイラ第2パスを乗っ取ったBell Labsの1978年Fortran 77コンパイラ
Coming soon鑑定書#081 eqn — int from 0 to inf、KernighanとCherryの1974年数式翻訳機、ギリシャ文字24字がtroff呪文に変わる166行の文法
Coming soon鑑定書#082 troff — #define INCH 432、CAT写植機に話しかける言語、Joe OssannaとKernighanが継いだ8,224行
Coming soon鑑定書#083 tbl — l c r n、Mike Leskの4文字が表を定義し、tblがtroff呪文を生成する2,391行
Coming soon鑑定書#084 pic — of the way between、英語を食べる図形言語、KernighanのFOR/IF付きDSL、4,624行
Coming soon鑑定書#085 spell — ssen→ily、逆順で並ぶ接尾辞テーブル、McIlroyのBloom filterと600行が英語の形態論を解く
Coming soon鑑定書#086 refer — false drops、ハッシュ衝突を後から弾く2段階検索、Mike Leskの参考文献エンジンと/usr/dict/papersに眠るBell Labs論文データベース
Coming soon鑑定書#087 sort — fold[128+']']、256要素の変換テーブル4枚、MEM=32768バイトのメモリソートとN=7本のN-wayマージが作る902行
Coming soon鑑定書#088 fgrep — c->fail、goto nstateとgoto istateが走り続ける、Alfred AhoのAho-Corasick自動機械と349行
Coming soon鑑定書#089 struct — 消せるものだけ消す、Fortran 66のGOTOをRatforのWHILE/UNTILに変換する4フェーズ構造化器
Coming soon鑑定書#090 units — `dollar *f*`、次元の一つがドル、1978年11月10日のWSJ相場と10次元ベクトルが全ての単位を表現する
Coming soon鑑定書#091 dd — etoa[] atoe[] atoibm[]、3枚の256バイト変換表、IBMメインフレームのテープをUnixで読むための1979年とJCLが転生したif= of=構文
Coming soon鑑定書#092 expr — "0"と""が偽、すべてが文字列の算術評価器、$((...))以前のシェルスクリプト計算機とcase LEQ: i = i>=0のバグ
Coming soon鑑定書#093 cpio — TRAILER!!!と070707、mkdirをforkで呼んだ1979年のアーカイバとLinux initramfsに今も生きるcpio形式
Coming soon鑑定書#094 od — base = 010、自分自身も8進数で初期化するバイナリダンパー、PDP-11の語単位と`*`繰り返し圧縮
Coming soon鑑定書#095 find — (*exlist->F)(exlist)、述語を関数ポインタのASTで評価する1979年のfind、{}の誕生とopendir()がなかった時代のディレクトリ生読み
Coming soon鑑定書#096 who — `who am i` は `argc==3`、utmpの20バイトを読んで接続者を列挙する62行と `cbuf+4` の日付フォーマット
Coming soon鑑定書#097 ar — `ARMAG = 0177545`、PDP-11のワード境界と `ar_name[14]`、静的リンクを可能にした705行のライブラリアーカイバ
Coming soon鑑定書#098 nm — `A_MAGIC1 = 0407`、a.outの4つのマジックと `toupper()` で外部性を表すシンボル型文字、239行のオブジェクトファイル読み手
Coming soon鑑定書#099 csh — `"Too dangerous to alias that"`、alias が alias を上書きできない1979年の csh、! がLexerで展開されるhistory置換とBill Joyの発明
Coming soon鑑定書#100 at — `HOUR = 100`、HHMMを「粒」で刻む時刻表現、`popen("pwd","r")` でサブプロセスから現在ディレクトリを取得する1979年のジョブスケジューラ
Coming soon鑑定書#101 cal — `mon[9] = 19`、1752年9月は19日しかない、グレゴリオ暦改革をコードが記憶するカレンダー計算の204行
Coming soon鑑定書#102 login — `nouser = {"" , "nope"}`、存在しないユーザーに必ず失敗する偽パスワードを与え `/etc/utmp` に書いて `who` に伝えるloginの149行
Coming soon鑑定書#103 passwd — `salt & 077`、time()+getpid()を6ビットに刻み`+7`/`+6`でASCII塩文字に変換し `/etc/ptmp` で守るpasswdの140行
Coming soon鑑定書#104 su — `setgid()` の後に `setuid()`、rootを手放す前にグループを変える順序と `execl(shell,"su",0)` でログインシェルにならない45行
Coming soon鑑定書#105 init — `#define EVER ;;`、shutdown→single→runcom→merge→multipleの状態機械、setjmp/longjmpでSIGHUPをリセットに変えるPID 1の302行
Coming soon鑑定書#106 write — `stbuf.st_mode & 02`、mesg n/y の実装原理、`write -` で全ユーザー一斉送信、`buf[0]=='!'` でシェルエスケープする183行
Coming soon鑑定書#107 getty — `ERASE = '#'` と `KILL = '@'`、Backspaceより前の消去文字、`partab[128]` のパリティ付加、300→1200→150→110でボーレートを巡回する238行
Coming soon鑑定書#108 date — `{"|", "", 0}` と `{"{", "", 0}`、`|` と `{` がwtmpに刻む時刻変更の前後、`gtime()` が逆転する入力文字列、163行
Coming soon鑑定書#109 ps — `nlist("/unix", nl)` でカーネルシンボルを読み `/dev/kmem` を直接走査、`"0SWRIZT"[p_stat]` でプロセス状態を変換する323行
Coming soon鑑定書#110 ls — `union { char lname[15]; char *namep; }` でSSO、`6L*30L*24L*60L*60L` の6ヶ月境界で日付フォーマットが変わる、`nomocore` が静かに守る424行
Coming soon鑑定書#111 pwd — `chdir(dotdot)` で `..` を辿りinode番号で逆歩行、マウント越えは `dev` まで比較、`cat()` が右シフトで先頭挿入する80行
Coming soon鑑定書#112 tr — `code[256]`/`squeez[256]`/`vect[256]` の三枚のテーブルが `if(c = code[c&0377]&0377)` の一行に合流する132行
Coming soon鑑定書#113 time — `quant[] = { 6, 10, 10, 6, 10, 6, 10, 10, 10 }` の9数字が60HzティックをHHH:MM:SS.Tに分解する78行
Coming soon鑑定書#114 wall — `ttyslot(2)` でfd=2から自分のutmpスロットを特定し `fork()` で各ttyに `sleep(1)` 間隔で全員送信する78行
Coming soon鑑定書#115 wc — `' '<c&&c<0177` のASCII範囲比較1行が単語を定義し `wd = "lwc"` 文字列を `while(*wd) switch(*wd++)` で走査する86行
Coming soon鑑定書#116 mesg — `chmod(tty, 0622)` でttyのパーミッション変更が「通信の許可」になり `sbuf.st_mode & 02` で状態を判定する55行
Coming soon鑑定書#117 yes — `for(;;) printf("%s\n", argc>1? argv[1]: "y")` で無限ループと三項演算子が「永遠にYと答え続ける」6行
Coming soon鑑定書#118 tee — `int openf[20] = { 1 }` でstdoutを先頭に埋め込み、lseek(ESPIPE)でパイプを検出し16バイト刻みで全出力先に書く95行
Coming soon鑑定書#119 cat — `statb.st_dev==dev && statb.st_ino==ino` でinode番号が「入力と出力が同じファイル」を検出し警告する63行
Coming soon鑑定書#120 tty — `ttyname(0)` と `exit(p? 0: 1)` でfd=0のstdin端末名を表示し「端末かどうか」を終了コードで返す18行
Coming soon鑑定書#121 rev — `default: continue` がswitch内からforを継続し `goto eof` で二重ネストを一撃脱出、`while(--i>=0)` で逆順出力する44行
Coming soon鑑定書#122 kill — `atoi(argv[1]+1)` でハイフンをスキップし `**argv` の二重間接でPIDを検証、`goto usage` でifブロック内ラベルに飛ぶ40行
Coming soon鑑定書#123 sync — `main() { sync(); }` 引数なしmain・ゼロロジック・カーネルシステムコールをそのままコマンドにする5行
Coming soon鑑定書#124 echo — `fputs(argv[i], stdout)` でprintf不使用、`argv[1][0]=='-' && argv[1][1]=='n'` の2文字比較だけで-nフラグを処理する23行
Coming soon鑑定書#125 sleep — `while(c = *s++)` でポインタを進めながら `n = n*10 + c - '0'` で10進変換する21行
Coming soon鑑定書#126 mknod — `m = 060666` と `(a<<8) | b` ——8進数の魔法定数でファイルタイプを表し、メジャー/マイナー番号を1つのintに詰める42行
Coming soon鑑定書#127 nice — `nice(nicarg); execvp(argv[1], &argv[1])` ——プロセス優先度を下げてから自分を別プログラムに置き換える、ラッパーパターンの26行
Coming soon鑑定書#128 basename — `if(*p1++ == '/') p2 = p1` ——最後の/の次の位置を1パスで覚え、`*--p3 != *--p1`で末尾から逆比較する29行
Coming soon鑑定書#129 random — `#define MAXINT 32768.` の `.` 一つで浮動小数点除算に変え、`exit()` 自体を乱数にする30行
Coming soon鑑定書#130 split — `fname[f++] = fnumber/26 + 'a'` ——base-26エンコーディングで xaa〜xzz を676ファイルまで生成する81行
Coming soon鑑定書#131 uniq — `static char b1[1000], b2[1000]` ——2バッファ交互比較で隣接行重複を判定し、`mode = argv[1][1]` の1文字で `-c`/`-d`/`-u` を切り替える142行
Coming soon鑑定書#132 comm — `ldr[0]=""; ldr[1]="\t"; ldr[2]="\t\t"` ——3列を進行的タブ文字列で表現し、`compare()`が0/1/2を返してそのまま列番号になる166行
Coming soon鑑定書#133 bcd — `chtab[64]` の8進数66個と `(chtab[c]>>(j-1))&1` ——1979年UnixがASCIIアートでIBMパンチカードを描く133行
Coming soon鑑定書#134 paste — `inptr[MAXOPNF]` で12ファイル並列、`del[k]; k = (k+1) % delcount` で区切り文字巡回、`RUB '\177'` を「区切りなし」の番人にする137行
Coming soon鑑定書#135 test — `[ expression ]` の `[` と `]` は同じプログラム、`exit(exp() ? 0 : 1)` で終了コードに真偽を渡す189行
Coming soon鑑定書#136 cmp — `lflg = 1`を`-s`で`--`、`-l`で`++`する1変数3モード制御、`otoi()`がC数値リテラル準拠で先頭0=8進数を解釈する121行
Coming soon鑑定書#137 rew — `tape[i] = args[1][j]` ——文字列リテラル書き換えでデバイスパスを構築し、`open()`→`read()`→`close()` で磁気テープを巻き戻す26行
Coming soon鑑定書#138 tsort — `DEAD/LIVE/VISITED`の3状態と`firstnode`「成長する番人」、再帰DFSで循環検出する205行のトポロジカルソート
Coming soon鑑定書#139 file — `0410/0411/0407` の a.out 魔法数と4言語のキーワード辞書、`english()`のETAOIN SHRDLU統計でファイル種別を当てる321行
Coming soon鑑定書#140 cron — `for(;; itime+=60, slp())` の毎分ティック、`EXACT/ANY/LIST/RANGE/EOS`の5状態でcrontabをバイナリ符号化、double-forkで子プロセスを切り離す252行
Coming soon鑑定書#141 rm — `rmdir` システムコールがまだなかった1979年の `rm.c` — fork() + execl("/bin/rmdir") で別コマンドを呼ぶ162行
Coming soon鑑定書#142 cp — 90行で済むBell-32V Unix `cp.c` — `while(*bp = *p1++) if (*bp++ == '/') bp = p2;` が basename を抽出する K&R 流ループ、st_dev+st_ino で「同じファイル」を検出
Coming soon鑑定書#143 mv — `rename(2)` システムコールがまだなかった1979年の `mv.c` — `link() + unlink()` で同一デバイス、cross-device は `execl("/bin/cp")`、ディレクトリ移動には `..` link 修正まで手作業の297行
Coming soon鑑定書#144 ln — シンボリックリンクがまだ存在しなかった1979年の `ln.c` 56行 — `link(argv[1], name)` 1行が本体、`-f` で superuser がディレクトリへのハードリンクを許す
Coming soon鑑定書#145 chmod — `chmod u=rwx,g+w,o-x` の symbolic mode を `abs() / who() / what() / where()` の4関数パーサで解釈する1979年の `chmod.c` 177行 — `chmod g=u` で `u` のビットをシフトで `g` に複製する
Coming soon鑑定書#146 chown — 1979 年は誰でもファイル所有者を変えられた — Bell-32V `chown.c` 55行、`isnumber()` で uid と user 名を判別、`stbuf.st_gid` を stat で読んで gid を保存
Coming soon鑑定書#147 stty — ASR-33 / Teletype 37 / TI Silent 700 / Tektronix まで端末機種名がそのまま書かれている1979年の `stty.c` 301行 — `sgtty.h` 時代の termio、`134.5` baud、`'^X' & 037` で制御文字を作る古典
Coming soon鑑定書#148 df — `/dev/rp0a` `/dev/rp1g` がデフォルト引数の1979年 `df.c` 96行 — super block を直接 `open()` して空きブロックを `while(alloc())` で巡回カウントする V7 file system の心臓部
Coming soon鑑定書#149 du — `chdir()` で潜って `chdir("..")` で戻る1979年の `du.c` 167行 — `ml[1000]` でハードリンクを二重カウントしない、`fd > 10` で `close` する fd 枯渇対策、V7 ディレクトリを生 `read()` する
Coming soon鑑定書#150 mount — `/etc/mtab` をユーザー空間で手作業更新する1979年の `mount.c` 65行 — `mount(2)` 呼び出し後に固定 32×16 テーブルを `creat()` で全書き直し、レースコンディションは織り込み済み
Coming soon鑑定書#151 umount — `sync()` してから `umount(2)` を呼ぶ1979年の `umount.c` 54行 — `/etc/mtab` の該当エントリを 0 で塗りつぶし、末尾空きを切り詰めて全書き直しする mount の対
Coming soon鑑定書#152 touch — `utime(2)` を使わず 1 バイト read/write で mtime を更新する1979年の `touch.c` 70行 — `lseek(fd, 0L, 0)` で先頭に戻して同じバイトを書き戻すだけ、空ファイルは `creat()` で新規作成、`-c` で作成抑制
Coming soon鑑定書#153 tail — `-f` フラグがまだ無かった1979年の `tail.c` 163行 — `lseek(0, -di, 2)` で末尾から逆走、piped なら頭から全部読んで覚える、`+n` で先頭から / `-n` で末尾からの対称設計
Coming soon鑑定書#154 size — `<a.out.h>` の `struct exec` を `fread()` する1979年の `size.c` 46行 — text/data/BSS のセグメント構成を 4 種類のマジック数 (`0407/0410/0411`) で識別、後の ELF へ継承される実行可能形式の祖先
Coming soon鑑定書#155 strip — `mktemp("/tmp/sXXXXX")` でテンポラリ確保、 `signal(SIGHUP/SIGINT/SIGQUIT, SIG_IGN)` で 3 シグナル無視、 `a_syms = a_trsize = a_drsize = 0` でシンボル削除——1979 年の `strip.c` 110 行が見せる「実行可能ファイルの整形術」
Coming soon鑑定書#156 ar — `mrxtdpq` 7 コマンドを 1 バイナリで切り替える 1979 年の `ar.c` 705 行——`comfun` 関数ポインタディスパッチ、 `struct ar_hdr` 14 文字ファイル名、 3 つの temp ファイルで実現する位置指定挿入、 PDP-11 ワード境界の 2 バイトアラインメント
Coming soon鑑定書#157 m4 — 23 ビルトイン + 9 ストリーム diversion + putbak プッシュバック——1979 年の `m4.c` 899 行 + `m4y.y` 94 行で完成したマクロプロセッサ、 sendmail.cf / autoconf / GNU configure の祖先
Coming soon鑑定書#158 who — `fread(struct utmp)` で `/etc/utmp` をレコード単位読み、 `argc == 3` で「`who am i`」 を検出する 1979 年の `who.c` 62 行——`last`/`w`/`finger` 系統の祖先、 `#ifdef vax` で見える VAX 移植期の痕跡
Coming soon鑑定書#159 dd — `if=`/`of=`/`bs=`/`conv=ebcdic` の IBM JCL 由来引数、 `etoa`/`atoe`/`atoibm` 3 つの 256 バイト EBCDIC 変換表、 `100k` / `4w` の単位サフィックス——1979 年の `dd.c` 541 行が見せる「Unix で最も異質な道具」
Coming soon鑑定書#160 cal — `mon[9] = 19` で 1752 年 9 月の 11 日を消し去り、 `if(y > 1800)` で 400 年閏年規則を切替、 `jan1()` で Jan 1 の曜日を 6 行で計算する 1979 年の `cal.c` 204 行——イギリスのグレゴリオ暦切替を 1979 年の Unix に刻んだ歴史的カレンダー
Coming soon鑑定書#161 crypt — 「A one-rotor machine designed along the lines of Enigma」——1979 年の `crypt.c` 91 行が見せる Enigma の Unix 化、 3 つの 256 要素順列テーブル、 `fork`+`execl(/usr/lib/makekey)` でパスワード拡張、 `t2[(t3[(t1[(i+n1)&MASK]+n2)&MASK]-n2)&MASK]-n1` の中心暗号式
Coming soon鑑定書#162 dc — `[command]` でマクロを定義、 `S`/`L` で 256 レジスタにアクセス、 `struct blk` の `rd`/`wt`/`beg`/`last` 4 ポインタで任意精度数を表現——1979 年の `dc.c` 1940 行 + `dc.h` 117 行が見せる **bc の祖、 RPN プログラム言語の完成形**
Coming soon鑑定書#163 init — `for(EVER) { shutdown; single; runcom; merge; multiple; }` 永久ループ、 `multiple()` の `wait + dfork` で **respawn** 文化を発明、 `setjmp/longjmp + SIGHUP reset` で設定リロード——1979 年の `init.c` 302 行が打ち立てた **PID 1 / Unix 全プロセスの祖**
Coming soon鑑定書#164 getty — `tabp->nname` でテーブルチェイン、 110/150/300/1200/2400/4800/9600 baud を **巡回試行**、 `partab[]` で偶数パリティを計算、 ERASE='#' / KILL='@' で手動行編集——1979 年の `getty.c` 238 行が見せる **ダイヤルアップ時代のターミナル自動適応**
Coming soon鑑定書#165 login — `getpass("Password:") + crypt()` でパスワード照合、 `nouser = {"", "nope"}` で存在しないユーザーにも常にパスワードを聞く、 `setgid + setuid + chown(tty)` で root から user へ権限降下、 `execlp(shell, minusnam, 0)` で **`-bash`** ログインシェル起動——1979 年の `login.c` 149 行が定めた Unix 認証の全工程
Coming soon鑑定書#166 grep — `g/re/p` の `ed` から独立して 1973 年に誕生、 `compile()` で regex → opcode バイトコード化、 `advance()` 再帰 VM で `*` をバックトラック、 32 バイトビットマップで `[a-z]` 表現、 fast path で `if (*p2 == CCHR)` 先頭文字スキャン——1979 年の `grep.c` 477 行が見せる **Unix 正規表現エンジンの典型実装**
Coming soon鑑定書#167 ed — `commands()` の 25 個 1 文字コマンド + `address()` の行アドレス解析、 `compile/execute` で regex VM (grep と同じ opcode)、 `g/re/p` を内蔵 (grep の語源)、 `s/old/new/` を実装 (sed の祖)、 `getblock()` で 256 ブロック × 512 バイト = 128KB の tempfile バッファ——1762 行の `ed.c` が **vi/sed/grep すべての祖**として 1971 年に書き上げた **Unix 行エディタ言語**
Coming soon鑑定書#168 sed — `fcomp()` で 1 度だけスクリプトコンパイル → `execute()` で毎行繰り返し、 `union reptr` でコマンドをコンパイル済み命令配列に、 `linebuf` (pattern space) + `holdsp` (hold space) を h/H/g/G/x で操作、 ラベル `b`/`t` の goto で Turing 完備、 ed/grep と同じ opcode + CNL/CLNUM/CEND を拡張——1975 年 Lee McMahon 作 `sed` の 1771 行が確立した「Stream Editor」 の祖型
Coming soon鑑定書#169 awk — `awk.g.y` の **yacc 文法**で完全な式言語を定義、 `XBEGIN/PASTAT/XEND` で **pattern { action }** モデルを実現、 `tran.c` で **動的型 (string ↔ number)** を自動変換、 **連想配列 `a["key"]`** を 1977 年に発明、 **MATCHOP `~`** を演算子として組み込み——14275 行の `run.c` が走らせる **Aho/Weinberger/Kernighan 1977 年作** awk が完成させた **「ed の発展形** = フル言語」
Coming soon鑑定書#170 echo — `for(i=1; i<argc; i++) fputs(argv[i], stdout)` だけで実装、 `-n` フラグで改行抑制、 バックスラッシュ解釈一切なし、 `exit(0)` で必ず成功——23 行の `echo.c` が 1979 年に確立した **Unix 最小コマンド**、 後に **「echo wars」** を生む BSD vs System V の分岐点
Coming soon鑑定書#171 find — `e1()`/`e2()`/`e3()` の operator-precedence parser で **述語式 AST** を構築、 `descend()` で **chdir + 再帰**してディレクトリ走査、 `-exec command {} \;` で **fork + execvp + `{}` 置換**、 `struct anode` の **関数ポインタ `int (*F)()`** で述語を **第一級オブジェクト**として保存——708 行の `find.c` が確立した **「**Unix ファイルシステム検索の DSL**」**
Coming soon鑑定書#172 cc — `cpp` → `ccom` → `c2` → `as` → `ld` の 5 パスを `callsys()` で順次起動、 `/tmp/ctm0a`〜`5a` のテンポラリ管理、 `getsuf`/`setsuf` で `.c → .o` 変換、 `/lib/crt0.o` を先頭リンクして main 呼び出しの startup を提供——464 行の `cc.c` が打ち立てた **Unix コンパイラドライバの祖型**
Coming soon鑑定書#173 ld — `load1()` でシンボル収集、 `load2()` で本体コピー + リロケーション の 2 パス設計、 OMAGIC (0407) と NMAGIC (0410) の a.out 形式生成、 UNDEF/TEXT/DATA/BSS/COMM のシンボル分類、 `-l libc.a` で **必要なオブジェクトだけ archive から引き抜く smart library**——1376 行の `ld.c` が確立した **Unix リンカの祖型**
Coming soon鑑定書#174 make — `doname()` の再帰下降で **依存グラフを DFS 評価**、 `if(ptime < td)` で **mtime ベース staleness 判定**、 `.c.o:` の **サフィックス規則**で暗黙ルール、 `$@`/`$<`/`$?`/`$*` の **自動変数**を `setvar` でコンテキスト切替、 `.IGNORE`/`.SILENT`/`.SUFFIXES`/`.DEFAULT` の **特殊ターゲット**——1979 年 Stuart Feldman 作 `make` 1500+ 行が確立した **ビルドシステムの祖型**
Coming soon鑑定書#175 sh — `IF/THEN/FI/WHILE/DO/OD/LOOP/POOL/SWITCH/IN/ENDSW` の **ALGOL 68 風マクロ**で C を別言語化、 `execute()` で **TCOM/TFORK/TFIL/TLST/TAND/TORF/TFOR/TWH/TIF/TSW** の AST dispatcher、 `TFIL` で **`chkpipe` + 左右 execute** によるパイプ、 `SYSCD/SYSEXIT/SYSTRAP` の **built-in** vs `execa()` の **external** ——Stephen R. Bourne 作の **`/bin/sh` (Bourne shell)** が打ち立てた **Unix shell の言語化**
Coming soon鑑定書#176 bc — `e '+' e = bundle(3, $1, $3, "+")` で **代数式を RPN に翻訳**、 `if/while/for/define` を `[...] sx ... lFx` 形式の **dc マクロ**にコンパイル、 yacc + lex で前置構文を後置に変換、 `popen("dc", "w")` で実行を **dc に委譲**——597 行の `bc.y` が確立した **「代数計算機 = dc のフロントエンド」**
Coming soon鑑定書#177 expr — `OR/AND/EQ/GT/ADD/MULT/MATCH/SUBSTR/LENGTH/INDEX` を yacc 文法 50 行で網羅、 `yylex` が **argv から 1 引数 = 1 トークン**として読む (`find` 流)、 `ematch("[0-9]*$")` で **string/number 自動切替**、 `MCH (`:`)` で正規表現マッチ + 部分文字列抽出——669 行の `expr.y` が確立した **「シェルスクリプトの式評価ツール**」
Coming soon鑑定書#178 mail — `/usr/spool/mail/$USER` 個人メールボックス、 `From ` 行で **mbox フォーマット**メッセージ区切り、 `lock`/`unlock` で **同時アクセス保護**、 `!host!user` の **UUCP bang path** + `uux` で **store-and-forward** リモート転送、 13 個の 1 文字コマンド (`?qxpsw-+dnm!`) の対話 UI——554 行の `mail.c` が確立した **Unix メールシステムの祖型**
Coming soon鑑定書#179 cpp — `#define`/`#include`/`#if`/`#ifdef`/`#undef`/`#line` のディレクティブを `control()` で dispatch、 `dodef()` で **マクロ + 仮引数**を symtab に登録、 **`scw1` superimposed code bit array** で 「**マクロ名にあり得ない識別子**」 を高速フィルタ、 yacc 文法 (`cpy.y`) で `#if` 式評価——1132 行の `cpp.c` が確立した **C プリプロセッサの祖型**、 John F. Reiser 1978 年 7-8 月作
Coming soon鑑定書#180 od — `-o/-d/-x/-c/-b` の 5 フォーマット同時表示、 `+offset` で **基数自動判定**シーク (0x=hex、 0=oct、 末尾.=dec、 末尾 b=block)、 `*` で **連続同一行**を省略、 `putn(n, b, c)` の **再帰呼び出し**で任意基数表示、 8 word = 16 バイト / 行レイアウト——250 行の `od.c` が確立した **「**バイナリダンプの祖型**」**
Coming soon鑑定書#181 tar — 512 バイトの `union hblock` ヘッダで **name[100]/mode/uid/gid/size/mtime/chksum/linkflag/linkname** を埋める、 `putfile()` 再帰でディレクトリ走査 (`chdir` + `read dir` + 再帰)、 `linkbuf` で **ハードリンク追跡** (`inum + devnum`)、 `chksum` フィールドで **ヘッダ整合性検証**、 デフォルトターゲットは **`/dev/mt1`** (磁気テープユニット 1)——918 行の `tar.c` が確立した **「Tape ARchive 形式」**、 半世紀のソフトウェア配布の基盤
Coming soon鑑定書#182 cpio — MAGIC = `070707` の **バイナリヘッダ** (tar の ASCII 8 進と対照的)、 `-o`/`-i`/`-p` の **3 モード** (out/in/pass-through)、 ファイル名は **stdin から読む** (`find . | cpio -o`)、 `mklong`/`MKSHORT` で **endian-aware** な short ペア処理、 `-p` で **コピー専用モード** (アーカイブなし)——789 行の `cpio.c` が確立した **System V 流アーカイブ**、 tar の対
Coming soon鑑定書#183 diff — Harold Stone の **LCS アルゴリズム** (Longest Common Subsequence) で 2 ファイル間の最長共通部分列を探す、 ハッシュで **等価類**を作って高速化、 `struct cand` (`x`, `y`, `pred`) の **k-candidate チェイン**で部分列を再構築、 メモリ overlay (`file[0] → class → klist → J`) で省メモリ、 `-e` で **ed/sed 互換の patch 出力**——645 行の `diff.c` が確立した **「差分**」 という概念の祖、 git diff/Mercurial/patch すべての DNA
Coming soon鑑定書#184 diff3 — `diff3.sh` で **diff を 2 回呼んで** (f1 vs f3、 f2 vs f3)、 `/usr/lib/diff3` バイナリが **2 つの diff 出力を merge**、 `struct range` で変更範囲、 `merge()` の **5 ケース dispatch** で「片方だけ変更/両方同じ/両方違う conflict/範囲オーバーラップ」 を処理、 `====` セパレータで未解決 conflict を表示——438 行の `diff3` が確立した **3-way merge アルゴリズム**、 git merge/Mercurial/svn merge の祖
Coming soon鑑定書#185 cmp — `c1 = getc(file1); c2 = getc(file2)` の **バイト単位**比較ループ、 exit code **0/1/2** で「同じ/違う/エラー」 を区別 (Unix 標準慣習)、 `-s` (silent) と `-l` (long) で **3 つの詳細レベル**、 `%6ld %3o %3o` の printf width 指定で違いを 8 進ダンプ、 `otoi(s)` で 8 進/10 進**自動判定**——わずか 121 行の `cmp` が確立した **「**バイナリ比較**」** の祖
Coming soon鑑定書#186 comm — `ldr[0] = ""`/`ldr[1] = "\t"`/`ldr[2] = "\t\t"` の **タブインデント 3 列出力** で「f1 only / f2 only / 両方」、 線形 merge アルゴリズム (LCS 不要、 ソート済み前提)、 `-1`/`-2`/`-3` で **列省略**して集合演算 (差集合・積集合)、 166 行で完全実装——`comm` が確立した **「ソート済み行集合の比較**」 の祖、 SQL JOIN/Python set/Pandas merge の概念的祖
Coming soon鑑定書#187 join — `-j1 N`/`-j2 M` で各ファイルの **join カラム指定**、 `-o 1.1 2.3 1.2` で **SELECT カラムリスト**、 `-a1`/`-a2` で **OUTER JOIN**、 `-e "NULL"` で **欠損値代入**、 線形 merge join + `fseek` の **多対多バックトラッキング**——214 行の `join` が 1979 年に確立した **「リレーショナル結合**」、 SQL JOIN (1986) より 7 年早い祖型
Coming soon鑑定書#188 sort — `sbrk()` で **32KB メモリブロック確保**、 入力を qsort で内部ソート → temp ファイル `/usr/tmp/stmXXXXXaa` に書き出し、 **`N=7` way マージ**で連結、 `+pos -pos` でソートキー指定 (後の `-k`)、 `fold[]`/`nofold[]`/`dict[]`/`nonprint[]` の **256 バイト変換表**で照合順制御——902 行の `sort` が確立した **外部マージソート + フィールド指定**、 巨大データの処理基盤
Coming soon鑑定書#189 uniq — `b1`/`b2` の **2 バッファ交互比較**で隣接行の重複検出、 `-u`/`-d`/`-c` で **3 モード dispatch** (unique 出力/duplicate 出力/カウント付き)、 `-N`/`+M` で **field/char skip** して比較、 `sort | uniq -c | sort -rn` の **frequency analysis** イディオム——142 行の `uniq` が確立した **「**重複除去**」 の祖**、 sort の最も自然なペア
Coming soon鑑定書#190 tr — `code[256]` の **変換テーブル**で O(1) 文字置換、 `next()` の **range expansion (a-z)** を `struct string { last, max }` で遅延展開、 `-c`/`-d`/`-s` の 3 フラグ組み合わせで補集合・削除・squeeze、 `\NNN` 8 進エスケープで任意バイト指定——132 行の `tr` が確立した **「**文字単位ストリーム変換**」 の原型**、 McIlroy one-liner の入口
Coming soon鑑定書#191 wc — `token` 状態機械の **0→1 立ち上がりで単語境界**検出、 `' '<c&&c<0177` で **isprint() 不使用の ASCII 範囲判定**、 `wd = "lwc"` の **フラグ文字列駆動 dispatch** で出力順序も指定、 1 パスで line/word/char を同時集計する **streaming 設計**——86 行の `wc` が確立した **「テキスト統計の三種の神器**」 、 パイプライン終点の集計ツール
Coming soon鑑定書#192 look — `top`/`bot`/`mid` の **二分探索**で /usr/dict/words を O(log N) 走査、 `fseek(dfile, mid, 0)` 後の **getc ループで改行まで再同期** (random offset → line boundary)、 `compare()` の **5 値返却** (-2/-1/0/1/2) で **prefix match** を表現、 `canon()` で **-d (英数字のみ) + -f (大文字小文字無視) の正規化**——162 行の `look` が確立した **「**辞書二分探索**」 の祖**、 spell checker と fgrep の DNA
Coming soon鑑定書#193 pr — `2+head+2+page[56]+5` の **66 行ページレイアウト**、 `buffer[6720]` の **循環バッファ + 0375/0376 センチネル**で多段組みカラム出力、 `colp[72]` で **N カラム同時走査**、 `-m` で **複数ファイル並行表示**、 `fixtty()` で **印刷中の他ユーザー write を chmod 0600 で抑止**——421 行の `pr` が確立した **「line printer 時代の組版**」 、 ページネーション・ヘッダ・多段組みの祖
Coming soon鑑定書#194 tee — `openf[20] = { 1 }` の **fd 1 (stdout) を 0 番目にハードコード**、 `creat(argv[1], 0666)` で出力ファイル作成 (`-a` なら append)、 `S_IFCHR` と `lseek ESPIPE` で **tty/pipe 検出**、 `d = t ? 16 : p` で **tty/pipe は 16 バイトずつ・file は 512 バイトまとめて書く**——95 行の `tee` が確立した **「**T 字パイプ分岐**」 、 ロギング + 続行を 1 行で書く Unix シェル哲学の極**
Coming soon鑑定書#195 nm — `struct exec exp` の **a.out ヘッダ読み取り**で magic number (A_MAGIC1〜4) 検証、 `a_text + a_data + a_trsize + a_drsize` で **シンボルテーブル offset 算出**、 N_UNDF/N_ABS/N_TEXT/N_DATA/N_BSS/N_FN を **`u`/`a`/`t`/`d`/`b`/`f` に map**、 N_EXT (global) で **`toupper()`** で大文字化、 ARMAG で **`ar(1)` archive を iterate**——239 行の `nm` が確立した **「**シンボル一覧出力フォーマット**」 の祖**、 GNU nm/llvm-nm が 50 年継承する出力規約
Coming soon鑑定書#196 time — `fork + execvp + wait` の **古典 Unix 子プロセス実行モデル**、 `times()` システムコールで **user/sys/cumulative-child の 4 値取得**、 `time()` の wall clock 差分で **real time** 算出、 `SIGINT`/`SIGQUIT` を **親 (time コマンド) で無視**して子に届ける、 `printt()` の **混合進数フォーマッタ** (6/10/10/6/10/6/10/10/10) で 9 桁を時:分:秒.小数に変換——78 行の `time` が確立した **「**real/user/sys 三分類**」 、 ベンチマーク文化の祖**
Coming soon鑑定書#197 pwd — `stat("/", ...)` で **root の device/inode を anchor** に、 `chdir("..")` で **親ディレクトリへ上昇**、 親内の direct entries を読んで **自分の inode 番号と一致するエントリ (= 自分の名前)** を発見、 `cat()` で **末端から前置構築**して path を作る、 マウントポイント越えは `stat()` で再照合——80 行の `pwd` が体現する **「**getcwd() 前の時代の自力 path 構築**」 、 Unix ファイルシステムの inode + ディレクトリエントリの教科書実装**
Coming soon鑑定書#198 date — `for(i=1970; i<year; i++) timbuf += dysize(i)` の **Unix epoch (1970-01-01) からの秒数積算**、 `gtime()` の **文字列逆転して 2 桁ずつ取り出す**巧妙な YYMMDDHHMM パース、 `localtime()`/`gmtime()` の構造体逆変換 + `asctime()` の人間可読化、 `-u` で GMT 表示 + timezone() で TZ 名 + DST 補正、 wtmp ログに時刻変更を記録——163 行の `date` が確立した **「Unix 時刻の二重表現**」 (epoch seconds ↔ 構造体ぶら下げ)、 Y2K の根本構造
Coming soon鑑定書#199 kill — `kill(pid, signo)` syscall の薄いラッパー、 デフォルト `SIGTERM` (graceful termination) で `-9` (SIGKILL) は強制終了、 `atoi(argv[1]+1)` で `-NN` 形式の **数値シグナル指定** (シグナル名展開はシェル/POSIX 拡張)、 複数 pid を **並列処理**して partial failure を errlev に集約、 `sys_errlist[errno]` で人間可読エラー——わずか **40 行**の `kill` が体現する **「signal というプロセス間通信プリミティブ**」 、 Ctrl-C/Ctrl-Z/SIGSEGV/SIGTERM すべての送信器
Coming soon鑑定書#201 mkfs — `block 0 = boot loader, block 1 = superblock, block 2-N = inodes, N+ = data blocks` の **V7 FS 7 領域 layout**、 proto ファイル `d--777 0 0 $` 構文で **初期 directory ツリーを宣言的記述**、 `s_free[NICFREE]` の **free block list chain** で bitmap 不使用の空き block 管理、 **回転式 (f_m/f_n) interleaving** で disk arm seek 距離を統計的に均等化、 dinode の `i_addr[NADDR=13]` で **10 direct + 1 indirect + 1 double-indirect + 1 triple-indirect**——615 行の `mkfs` が確立した **「**Unix V7 FS の鋳型**」 、 ext2/ext3/UFS が継承する基本構造**
Coming soon鑑定書#202 rmdir — `unlink` を3回(`..`→`.`→本体)唱えてディレクトリを消すSUID-root、`rm` が fork+execl で呼んでいた相手の104行
Coming soon鑑定書#203 mkdir — `mknod` でディレクトリinodeを生み `link`×2 で `.`/`..` を張る、signal 5つ無視で不可分を守るSUID-rootの71行
Coming soon鑑定書#204 egrep — `cstat = gotofn[cstat][c]` で正規表現をDFAにコンパイルし1文字1テーブル引きで線形マッチ、Ahoのfollow位置構成(ドラゴンブック)、grep/fgrepに続く正規表現トリオ完成の590行
Coming soon鑑定書#205 makekey — 「10バイト送ると13バイト返る」read/read/write だけの19行、crypt を呼ぶ鍵生成フィルタと「わざと遅い」鍵ストレッチング(bcrypt/scrypt/Argon2)の祖先
Coming soon鑑定書#206 newgrp — `setgid` してから `execl("/bin/sh")` で新グループのシェルになる55行、`su` の gid 版、`/etc/group` のグループパスワードを `crypt` で検証する認証一族
Coming soon鑑定書#207 chgrp — `chgrp(2)` がないので `stat` で uid を取り `chown(file, 同じuid, 新gid)` でグループだけ変える53行、`chown` の薄いラッパー、`newgrp` のファイル版
Coming soon鑑定書#208 dump — `pass(mark/add/dump)` の4パスとダンプレベル0-9、`/etc/ddate` で前回より新しいinodeだけを拾う増分バックアップを発明した639行、全バックアップツールの祖
Coming soon鑑定書#209 restor — 「Last chance before scribbling on」、dumpのテープを checksum==CHECKSUM で検証しつつ balloc/bmap で生ディスクに自前FSを書き戻す1145行、穴も復元しパス名をinode解決するdumpの対
Coming soon鑑定書#210 cb — パーサもASTも持たず switch(c) で `{`→tabs++ `}`→tabs-- する文字単位状態機械357行、stabs[clevel][iflev] に if 文脈を退避してぶら下がり else を整列するコード整形ツールの祖
Coming soon鑑定書#211 number — 数字を英語の綴りに変える199行、card[]は vigintillion(10^63) まで、"00"詰めで3桁グループ化してconv()が再帰、tens()はp[2]=0の破壊的書き換えで「thirteen three」の二重印字を消す
Coming soon鑑定書#212 sum — 1バイトごとに16ビット和を右ローテートしてから足す48行、単純加算では見逃す「バイト転置」を捕まえる、cksum/md5/sha の祖先
Coming soon鑑定書#213 ptx — putc(TILDE)で行を「回転」させ /usr/bin/sort に丸投げする551行、各キーワードを文脈ごと並べるKWIC索引、/usr/lib/eign のストップワードを自作ハッシュ表で弾く、McIlroyの索引機械でありParnas論文の題材
Coming soon鑑定書#214 deroff — #define C で全入力を1マクロに集約し troff/eqn/tbl 命令を「剥がして」素のテキストを残す494行、組版一族の唯一の「逆」、spell と wc への橋渡し
Coming soon鑑定書#215 col — ESC-7/8/9 の「上向きの紙送り」を page[256] のスライディングウィンドウで平坦化する309行、前にしか進めない装置のために troff の逆行出力を組み直すデバイス適応器
Coming soon鑑定書#216 tabs — 8スペース打って ESC '1' で停止位置を「物理的に」刻み、DEL を連打して機械の動作完了を待つ197行、タブストップが機械の歯車だった時代の端末調律師
Coming soon鑑定書#217 quiz — a{eroplane}|airplane のような「ありうる答え方」を一つの文法で許す472行、解答照合・列名照合・正答表示を同じパターン言語で兼ね、正解すると出題範囲が広がる適応学習を1979年に実装したCAIゲーム
Coming soon鑑定書#218 arithmetic — 間違えた問題の数字を出題プールに増殖させ苦手な数ほど頻繁に出す215行、答えが必ず整数になる出題構成、三角分布と乗算シフト(剰余バイアス無し)の乱数の職人技
Coming soon鑑定書#219 spline — 140行の数学的導出をコメントに刻みHammingの教科書を出典に三重対角系を解く333行、「後ろ向きの再計算は野放図に不安定」と記録された三次スプライン補間、コードは数式の忠実な転写
Coming soon鑑定書#220 cu — 行頭の ~. で切断・~< でファイル送信、fork で全二重を作り端末ストリームの上にシェルコマンドでファイル転送を載せる539行(call Unix)、ssh の ~. がいまも受け継ぐモデムダイヤラの祖
Coming soon鑑定書#221 icheck — bmap[n] |= m でデータブロック1個を1ビットに刻み二重割り当て(dup)と迷子(missing)を暴く475行(inode check)、small/large/huge/garg の4段indirect走査・回転遅延ぶんずらす -s 自由リスト再構築・OSが起動せずとも動く STANDALONE 構成、fsck の祖
Coming soon鑑定書#222 ncheck — inode は自分の名前を知らない。全ディレクトリを生ディスクから読み素数2503サイズのハッシュ表でディレクトリだけを集め、3パスで親ポインタの木を組み直し pname() の再帰でパス名を逆算する322行(name check)、find と fsck の lost+found の祖
Coming soon鑑定書#223 c2 — コンパイラが吐いたアセンブリを命令の連結リストに変え、覗き窓で滑りながら jump-to-jump・到達不能削除・分岐反転・クロスジャンプ(末尾併合)・冗長move除去など17種の局所変換を不動点まで反復する2,071行(object code improver)、cc の -O=ピープホール最適化の祖
Coming soon鑑定書#224 adb — 子が ptrace(SETTRC) で「私を追跡してくれ」と名乗り出てから自分を exec し、命令を BPT で上書きしてブレークポイントを置き、addr,count?format の簡潔な言語でメモリ・実行ファイル・コアダンプを同じ文法で覗く約3,400行(19ファイル)、sdb→dbx→gdb と続くデバッガの祖
Coming soon鑑定書#225 as — yacc 文法で書かれた1,888行の VAX アセンブラ。jeql は近ければ短い分岐・遠ければ条件反転して jmp を跨ぐ合成命令(jxxx)で、距離と長さの鶏と卵を jxxxfix の「lazy topological sort」不動点反復で解く。2パス+複数位置カウンタ、magic 0410 の a.out を吐くツールチェーンの底
Coming soon鑑定書#226 uucp — ノイズだらけの電話線の上にシーケンス番号・スライディングウィンドウ・チェックサム・再送の信頼転送(g プロトコル)を載せ、cico が深夜にダイヤルしてファイルを運ぶ store-and-forward。Usenet と電子メールを育てた Unix-to-Unix copy、インターネット前夜の世界網
Coming soon鑑定書#229 sdb — アドレスでなく関数名・引数・ファイル:行でスタックを語り、コンパイラが埋めた stab 記号から変数の型と番地を知りソース行で止まる。adb の ptrace/BPT 機構の上にソースの層を載せた約2,340行のソースレベルデバッガ、adb→sdb→dbx→gdb の架け橋
Coming soon鑑定書#230 learn — 本物のシェルで実際に操作させ、tee で生徒の操作を盗み見て採点コマンドの終了ステータスで正誤を判定し、できの良し悪しで次の課題の難度を選ぶ。Unix を Unix で教える657行の CAI(Kernighan/Lesk、インタラクティブ学習の原型)
Coming soon鑑定書#231 prof — プログラムを定期的に叩き起こして「今どの番地か」を数えた PC ヒストグラムを a.out のシンボル表で関数名に按分し、サンプリングで時間・計数で回数を測って ms/call を出す321行の実行プロファイラ。gprof→perf と続くプロファイリングの祖、「推測するな計測せよ」
Coming soon鑑定書#232 plot — 同じ図形コマンド解釈器(driver.o)をデバイスごとのライブラリにリンクし分けるだけで Tektronix にも DASI にも描く。plot(5) の抽象命令(m/l/c/a)と Bresenham 整数ラスタ化・メモリより大きいビットマップのブロックページングを分けたデバイス非依存グラフィックス(Mike Lesk、ditroff/PostScript/SVG の祖)
Coming soon鑑定書#233 sa — カーネルが全プロセスの終了ごとに刻む会計レコードを読み、13bit仮数+3bit指数の comp_t で圧縮された時間を展開し、コマンド名でハッシュ集計してユーザ別使用量を出す487行のプロセス会計。タイムシェアリングの課金(printmoney)、クラウド従量課金と監査ログの祖
Coming soon鑑定書#234 pcat — Graphic Systems C/A/T 写植機の制御コード(escape/lead/railmag)を解釈し、回転フォント盤の4位置・機械が持つ16の型サイズ・432分の1インチに縛られた troff 出力を plot(5) 上に再現する924行のシミュレータ。troff 一族の末端、組版が機械から自由になる前夜(ditroff/PostScript の対極)
Coming soon鑑定書#235 calendar — 日付を「今日に当たる正規表現」に変え、ただの ~/calendar テキストを egrep して mail で配る約70行のリマインダ。switch のフォールスルー(break無し)で金曜は土日月を先読み、/etc/passwd を巡って全ユーザに配達。リマインダサービスの祖型、Unix 哲学の小さな結晶
Coming soon鑑定書#236 dmesg — カーネルは画面にもファイルにも書けないので自分のメモリの固定リングバッファ _msgbuf に診断を書き溜める。その番地を /unix のシンボル表(nlist)で引き /dev/mem を直読みして円環を一周展開し、前回との差分だけを永続ログに累積する113行。カーネルリングバッファと syslog の祖
Coming soon鑑定書#237 ac — 端末ごとにログインの開始時刻を覚え、ログアウトのたびに接続時間をユーザに足し込む。/usr/adm/wtmp のログイン台帳を集計し、時計の巻き戻しを |/} レコードで補正する249行の接続時間会計。sa と対をなす課金のもう半分、クラウドのインスタンス起動時間課金・last の祖
Coming soon鑑定書#238 iostat — カーネルが毎クロックtickに「CPU状態×どのディスクが稼働か」を32ビンのhistogramに刻む。それを nlist(/unix)+/dev/kmem で読み、二度のスナップショットの差で I/O・CPU の率を出し、ディスクの物理定数でシーク/転送時間に分離する286行。iostat/vmstat/sar/top の祖
Coming soon鑑定書#239 pstat — カーネルと同じ構造体ヘッダ(#include <sys/proc.h> 等)を共有し、/dev/kmem からプロセス表・inode 表・テキスト表を丸ごと読んで OS の内部データ構造をそのまま映し出す543行。走るカーネルの X 線写真、ps/top/lsof/sar・/proc/sysctl の祖
Coming soon鑑定書#240 quot — ディレクトリを一切辿らず、生ディスクの inode 表を端から端まで舐めて、ファイルの持ち主(di_uid)ごとにブロック数を足し上げる235行のディスク使用量集計。名前でなく所有で見る du の対極、-c でファイルサイズ分布。sa/ac と並ぶ三面会計の第三軸、quota・ストレージ課金の祖
Coming soon鑑定書#241 lpr/lpd — 印刷の完了を待たず、ジョブを spool ディレクトリにファイルとして置き(tf→df の原子的改名)、ロックファイル(モード0+setuid非root)で唯一性を守った lpd が一つずつ刷り完了をメールで知らせる441行の印刷キュー。spool+daemon、submit/async worker/notify の非同期ジョブキューの祖
Coming soon鑑定書#242 tc — troff の C/A/T 写植機出力を Tektronix 4014 のベクタ命令に翻訳し、座標をタグ付き5バイトに符号化、変わったバイトだけ送る差分転送で遅い回線を労り、一画面ずつ描いてはユーザの改行を待つ636行。pcat の Tektronix 版、ditroff 以前の「デバイスごとの翻訳器」
Coming soon鑑定書#243 pg — 一画面ずつ見せて止まり、各ページの開始位置を環状配列に覚えて前後にスクロールする159行の画面ページャ。循環バッファで限りある窓を流れの上に滑らせ、cat の垂れ流しをナビゲート可能な文書に変えた。more/less の祖、画面端末の申し子
Coming soon鑑定書#244 dumpdir — dump テープを舐めて根(inode 2)から再帰的に全ファイルのフルパスを復元し、dumpmap ビットマップで増分ダンプの「実際に入っている inode」だけを選別して目録を出す473行。復元せず中身を一覧する、dump/restor の三人目、ncheck の dump 版、tar -t の祖
Coming soon鑑定書#245 rc — EFL/Ratfor/Fortran コンパイラ駆動。拡張子で前処理器を振り分け、EFL も Ratfor も共通の下地 Fortran へ翻訳し、生成 Fortran を分割・コンパイルし、各段を fork+リダイレクトのプロセスで繋いで ld でランタイムとリンクする523行。cc の Fortran系言語版、Fortran を中間言語にしたトランスパイラ駆動
Coming soon鑑定書#246 arcv — 第6版→第7版 ar アーカイブ形式を in-place 変換する90行弱の使い捨て移行ツール。マジックは 0177555→0177545 の一桁差だが裏で台帳様式が全面再設計(name 8→14、gid 新設、mode char→int、size を long に拡張=第6版フォーマットの64KB上限撤廃)。omode は読まれるが捨てられ mode=0666/gid=1 に塗り替え、SIGHUP/INT/QUIT を握りつぶして原本fdへの書き戻しを中断不能にする。ファイル形式アップグレーダ/DBマイグレーションの祖型
Coming soon鑑定書#247 checkeq — eqn 入力の括弧バランスを検査する85行の lint。数式を一切パースせず、表示数式 .EQ/.EN とインライン区切り $...$ の二種類の括弧の対応だけを数える。totdel%2 のパリティでインライン数式の内/外を判定し複数行$$を行範囲で報告、eq フラグで表示数式の入れ子を検出、両括弧の交差(EQ in $$ / EN in $$ / $$ in EQ)、delim xx/off に追従、EOF で Unfinished を締める。checknr(troff)/lint(C) と同じ小さな言語の校正係、Kernighan 的な上流で叩く preflight 哲学
Coming soon鑑定書#248 vis — 非印字バイトを \NNN(3桁8進)で可視化する約50行。cat -v / od -c / BSD vis(3) の祖。改行・タブ・空白040〜チルダ0176は素通し、DEL(0177)と高位ビットは escape。可逆かつ幅一定(col+=4)のエスケープ、MAXCOL=72 で \<改行> 折り返し(データ改行と区別できる継ぎ目)でテレタイプ/端末を守る。冒頭が #defie(define のタイプミス)のまま snapshot に凍結=発掘される化石としての古コードの象徴
Coming soon鑑定書#249 number — 数字を英語の読みに翻訳する199行。man が明かす真の役目は speak(1)(音声合成)のテキスト正規化=1979年のTTSフロントエンド。card[]=hundred〜vigintillion(10^63, 22語)+unit/teen/decade の4表で英語数詞の不規則性を吸収、3桁グループ化と conv() の再帰(max超過は再帰でchunk)、flag ステートマシンの cprint でゼロのグループのスケール語を黙らせる、"."/"..." は speak 用のポーズ記号。現代TTSの number normalization の祖、Bell Labs 音声合成(Daisy Bell 1961)の裾野
Coming soon鑑定書#250 cvtbl — tbl(表組み前処理) の旧表書式を新書式へ変換する105行の使い捨て移行ツール。arcv(#246) の tbl 版。.TS の直後のフォーマット指定行だけを書き換え、本質は行列の転置=横に積まれた列ごとのキー文字を縦の行ごとの指定に組み替える(行優先の文字列を列優先で読む、短い列は col[j]-- で最後のキー文字を繰り返し padding、最終行を "." で締める)。一時ファイル+system("mv tmp orig")で in-place 置換。無境界 gets()、printf(-1,...) の sprintf 相当、独自 cin/cout I/O=標準ライブラリ以前の作法
Coming soon鑑定書#251 dpr — dataphone 経由で印刷ジョブを Honeywell GCOS メインフレームに投げる267行。初期 Unix が GCOS の賢い端末だった時代の証人。card() で GCOS の JCL カード($ ident/$ select/$ data/$ endjob)を組み、ident() は /etc/passwd の5番目=GECOS フィールドを読んで GCOS ジョブ識別を作る=今も全 Unix に残る GECOS フィールドの起源。/usr/dpd/ にスプール(PIDで固有名化)し execl("/etc/dpd")で daemon に委譲、out() で中断時に痕跡を逆順掃除。lpr(#240)/lpd の同型で行き先がローカルか GCOS かの違い
Coming soon鑑定書#252 opr — 印刷の宛先を振り分け自分は execv で消える31行のディスパッチャ。code[] の並列配列(-sp→npr spider network / -lp→lpr #240 / -mh→dpr #251 GCOS via 201 dataphone)で宛先別にスプーラを選ぶ。for(i=0;code[i+2];i+=2) のループ停止位置で「表の最後の要素=デフォルト(GCOS)」を表現、文字単位の照合、execv(path+4) で /lib を先に試し失敗で /usr/lib を試す二段フォールバック(/usr=4文字スキップ)。dpr/lpr の上位=印刷サブシステムの司令塔、サブコマンド/プラグインレジストリの祖型
Coming soon鑑定書#253 clri — 壊れた inode を生ディスク上で直接ゼロ消去する79行の修復ツール。raw device を open(.., 2) し lseek/read/write でブロックを直接操作=ファイルシステムの下層で執刀。inode の住所を off=((n-1)/NI+2)*512, j=(n-1)%NI で手計算(dinode=64B, NI=8=INOPB)。二段階の安全装置(第1パスで全引数を検証、一つでも不正なら何も消さず exit、第2パスで初めてゼロ書込)。struct ino { char junk[ISIZE]; } で inode を解釈せず ISIZE バイトをゼロに=目的をそのまま名前にした潔い命名。icheck(#221)/ncheck(#222)/dumpdir(#244) の「書いて切除する」役
Coming soon鑑定書#254 sp — 行を横に詰めて紙を節約する75行のフィルタ。冒頭コメント "Print horizontally as possible, thus saving paper"。連続紙ラインプリンタ時代の紙節約ツール。tab[8]={8,7,6,5,4,3,2,1} で次タブストップまでの距離を表引き(=8-(p%8))、alen(文字数)/slen(行頭基準の幅)/elen(出力位置基準の幅)を一走査で測り分け、elen+next<len の間タブ区切りで同じ行に継ぎ超えたら改行。tab[next%8]<1 の分岐は到達しない dead branch。pr が整える道具なら sp は詰めて紙を浮かせる道具
Coming soon鑑定書#255 atrun — at が蓄えたジョブを時刻が来たら実行する105行の実行係。cron(#140) から定期起動され /usr/spool/at を走査、予定時刻はファイル名(年.通算日.時刻.連番)に刻まれ sscanf で分解+now と比較=ファイルシステムが予定表。fopen(".")+fread で生 struct direct を読む(readdir以前)。ジョブファイルの所有者を stat→setgid/setuid で依頼者本人に成り代わって実行=所有者が身元。実行前に past/ へ mv して二度実行防止、fd を閉じ /dev/null に繋ぎ nice(3) で /bin/sh にジョブを渡す。FS を台帳として使い切る(名前=予定/所有者=身元/場所=状態)、at(#100)/cron(#140) と並ぶ遅延実行の小部品
Coming soon鑑定書#256 mtm — 磁気テープの物理を直に触る146行(Magnetic Tape Manipulation)。生テープのファイルを skip/list する低レベルツール。read==0=ファイルマーク/二重EOF=記録終端をフラグで検出(テープは順次媒体)、no-rewind 版(unit|04)で位置を保ち finis() で rewind 版(unit-4)を open+close するだけで巻き戻す(close時の自動巻き戻しを副作用に)。"/dev/rmt0 " の index8 を sprintf で上書きしデバイス名生成、buf は sbrk で確保。SIGINT/SIGQUIT でも finis で巻き戻し、一覧はサイズ変化点(cnt!=prevcnt)だけ報告。テープの物理(レコード/ファイルマーク/巻き戻し)がそのまま API。dump/restor/dumpdir(#244)/tar の下層
Coming soon鑑定書#257 mvall — 複数の通常ファイルをディレクトリへ移す64行。移動の本体は持たず、ファイルごとに fork して /bin/mv(#143) を execl(逐次 wait)=既存ツールを呼んで新ツールを組む組み合わせ哲学。filetype() が stat の st_mode & S_IFMT で種類判定(宛先=S_IFDIR/ソース=S_IFREG)、不適格は飛ばして続行(部分成功)。"宛先/." を while(*c1++=*c2++)+c1[-1]='/' で組み立て、ディレクトリ検査と mv の移動先を兼ねる。prs は write(2,...) を一文字ずつ(stdio不使用)。opr(#252) と同じ組み合わせ哲学の小例
Coming soon鑑定書#258 dcheck — ディレクトリ整合性を検査する214行=ファイルシステムの参照カウント監査。icheck(#221, ブロック検査)の対。pass1 で全ディレクトリを歩き各 inode への参照を ecount[kno]++ で数え、pass2 で inode が名乗る di_nlink と突き合わせ不一致を報告(nlink>実数=容量リーク/nlink<実数=データ消失)。ecount は inode 1個1バイトで255飽和(嘘をつかない)。生デバイス直読(sync→superblock→l3tol→bmap の直接/単間接)。kno>nfiles||kno<=1 で壊れエントリ検出、-i で番号から名前へ逆引き(icheck→dcheck -i→clri #253 の修復段取り)。ncheck(#222)/clri(#253) と並ぶ fsck 一族、後の fsck の二本柱
Coming soon鑑定書#259 diffh — 巨大ファイル用の倹約 diff 262行=diff -h(half-hearted) の実体。本家 diff(#66, Hunt-McIlroy で最小差分だが全ファイルをメモリに載せる)に対し、各ファイル最大 RANGE=30 行の窓だけをスライドさせメモリ一定で無制限長を処理。getl で読み足し clrl で確定済みを捨て前詰め(読む・比べる・捨てる)。easysynch が C=3 行連続一致を両方向で探して再同期(1行一致は偶然、3行連続なら構造的同期の賭け)、窓を超えるズレは hardsynch で "can't resynchronize" と正直に降参。出力は本家と同じ ed スクリプト(< / > / --- / 範囲ヘッダ)、"-"=stdin/ディレクトリ引数も互換。最適性 vs メモリのトレードオフでメモリを選んだ倹約家の兄弟
Coming soon鑑定書#260 ar11 — VAX↔PDP-11 のアーカイブを橋渡しする ar 664行。1979年 Bell Labs に同居した PDP-11(16bit)と VAX(32bit)の間でアーカイブを相互運用するため、VAX 上で PDP-11 形式を読み書きする。ヘッダは日時/サイズを short×2・ar_mode も short(16bitワード世界)、ARMAG=-155(=0xFF65=0177545 を short のビットパターンで)。核心は union ints で 32bit を 16bit×2 に重ね swap() で上下ワードを入れ替え、PDP-11 の middle-endian(ワードスワップされたロング)と VAX のワード順を変換すること。mrxtdp 全コマンドの完全な ar で I/O 境界だけ別機種用。arcv(#246) が版の断絶を、ar11 が機種の断絶を埋める。エンディアン変換の最古級の実務解
Coming soon鑑定書#261 vpr — Versatec ラスタプリンタ用フィルタ 332行。静電気式で紙は前にしか進まない制約から出発。タイプライターがキャリッジ後退で実現した重ね打ち(太字/下線)を、getline がキャリッジ運動(\b \r \t)を col 操作で再現し _ を軸にした衝突を ovbuf に記録してメモリ内合成。putline は本文を印字モード(内蔵文字ジェネレータ)で、重ね打ち層は ioctl(SETSTATE,pltmode) でプロットモードに落としドットを描き prtmode に戻す=印字/プロットの二つの顔を行単位で往復。chrtab[][16] の内蔵ビットマップフォントで banner(X/空白拡大+ctime)、EJLINE=63改ページ、/usr/adm/vpacct でページ課金。lpr(#240)/dpr(#251)/opr(#252) の印刷一族のラスタ担当、活字→ドットの転換点
Coming soon鑑定書#262 tk — Tektronix 4014 蓄積管(DVST)用のテキストページャ 248行。蓄積管は描いた像を保持し続け部分消去できず全画面消去(ESC FF=緑の閃光)でしか消えない。だから pg(#243)/more と違い一ページを座標で描く→Enter待ち(kwait)→全消去→次ページ。文字は行でなく (x,y) 座標で配置(yy=MAXY 3071 から LINE=47 ずつ、xx 31/文字)、キャリッジ運動を座標操作で再現。sendpt が座標を5部分に分け前回と変わったバイトだけ GS の後に送る差分座標伝送("optimize output for Tek 4014"、tc #242 と同じ)。Model 37 の半行/逆行(ESC 7/8/9)を縦座標±で解釈し端数を ry に繰り越し、-N 多段組(coff=4096/N)、!command でシェル脱出。vpr(#261) が紙の制約と向き合ったように tk は画面消去の制約と向き合う
Coming soon鑑定書#263 update — 30秒ごとに sync(2) を打つ Unix の心臓 36行。Unix は書き込みをバッファキャッシュに溜める(遅延書き込み)ので、クラッシュ時の損失を~30秒に抑えるため update が定期的に sync を呼ぶ常駐デーモン。init の rc から起動。fork→親exit+close(0/1/2) でデーモン化、dosync が sync→signal(SIGALRM,dosync)→alarm(30) で自己再武装(当時の signal はハンドラがリセットされるので再登録必須)、main は for(;;)pause()。/bin・/usr・/usr/bin を open して fd 保持しキャッシュに常連を温める。man の BUGS=sync 中の CPU 停止+DEC の NPR(DMA)失敗ゼロ書き込みで FS 破損、回避案は時刻30秒前倒し。sync(#123) の定期版、bdflush/pdflush/カーネル writeback の祖
Coming soon鑑定書#264 accton — コマンドがそのままシステムコールである 14行。プロセスアカウンティングの ON/OFF を行う acct(2) の薄いラッパー。本体は acct() 一回で機能はカーネルにある=sync(#123)/nice/kill と同じ「syscall をコマンドに開く」型。acct(file)=ON+宛先指定 / acct(0)=OFF と一引数で状態と宛先を表す多義的 API。errno を見て perror("accton")+exit(1)(戻り値でなく errno 直接の素朴さ)。accton で会計の蛇口を開け→カーネルが /usr/adm/acct に終了プロセスごとのレコードを追記→sa(#233) が集計・ac(#237) が接続時間。会計三部作の入口、init の rc から起動。最も薄いコマンドが Unix の思想(カーネルが原語/コマンドが入口)を体現
Coming soonHuman vs AI — コメント鑑定対決
hack to bypass a bug in the Linux 2.4 kernel pthreads implementation. cpu statistics are only traceable on a process level and the timers will report effectively no elapsed cpu time. this allows the stats of all threads to be gathered up by an encompassing process that may be timed. XXX this should somehow only apply to a build on a 2.4 linux kernel.
AI Analysis
urgent tone (intensity 2.0). tags: HACK, XXX, BUG.
Appraiser's Note
Cで書かれた3Dモデリングエンジン。レイトレーシングの先駆的実装が眠っている。