Slackware 14.0 (3)

山中さん、iPS細胞でノーベル医学・生理学賞おめでとう。

ノーベル賞と言えば、フォン・フリッシェさんがミツバチのダンスを解読して受賞してる。 ちょっと聞き、イグ・ノーベル賞かと思っちゃうけど、どんな貢献があるのでしょうか?

ひょっとして、王様の飲むハチミツ酒を庶民レベルまでに開放した功績を讃えてって事なので しょうか?

この王様のハチミツ酒はミードと呼ばれ、作り方は、

7対2の割合で水とハチミツを混ぜ、よくかきまぜて火にかけて煮立たせる。これにパセリの根と フェンネルの根を少々切り刻んだものを入れて煮込む。丁寧にあくを取り、あくが出なくなったら 煮込みは完了。一晩さました後、イースト菌とクローブを麻の袋に入れて2週間蓋をしておけば、 飲み頃になる、とか。

よい食後酒になるそうです。だれかこっそり作ってみませんか。

堂々とやるならワインを造る事です。民族衣装に身を包んだおねーちゃんが、葡萄を入れた 桶の中で裸足になって踏み潰す。後はじっと待つだけ。酵母菌の作用で、醗酵して酒になる。 観光PRにはうってつけ。裸足じゃなくて裸なら、観光客がわんさかと来ますぜ。こういう すけべな親父目当てに、撮影会でもやればよろし。観光課の人、税務署とタイアップして やりませんかね。

ed

前回書いた、emacs vs viの対立を調停する試みには残念ながら平和賞は授与されないな。 今朝の新聞にかけ率が出てたけど、みじんも無かったぞ。

どちらもeditor。元は同じ所なんかな? emacsの元になったのはTECOって聞いてるし、viの元は edだし。元祖に遡ってみたいぞ。TECOは簡単に手に入りそうにはないけど、edならあるっしょ。

老舗のSlackwareもも付いていたぞ。早速展開して、gdbで追えるようにしたのは言うまでもない。 規模も小さいしね。

sakae@slck:/tmp/ed-1.6$ wc *.[ch] 
   632   2683  17159 buffer.c
   294   1363   8920 carg_parser.c
   102    553   3596 carg_parser.h
   153    916   5613 ed.h
    87    403   2700 global.c
   332   1600   9483 io.c
   205   1014   6938 main.c
   762   3847  27110 main_loop.c
   403   2030  12366 regex.c
   265   1104   6970 signal.c
  3235  15513 100855 total

AUTHORS なんてファイルが付属してて、そこには

GNU ed originated with the editor algorithm from Brian W. Kernighan &
P. J. Plauger's wonderful book "Software Tools in Pascal," Addison-Wesley,

超有名な人の名前が載ってた。昔は、こういうのを使ってたんだよな。隔世の感がしますよ。(と、 懐古趣味丸出し!)

で、感慨に耽るのもいいけど、コード読めよ。ed.hを見てから、main_loop.cあたりを見れば いいのなか。細かい事は、gdbで追うのは、お約束。

xxgdb

端末入出力を含んだプログラムをgdbから追おうとすると、gdbのコマンドとプログラムの入出力が ごちゃまぜになってしまい、ちょいと都合が悪い。確か、分離した状態でgdbを使えるのが有った はず。

ってな訳で、眺めていたら、xxgdbなんてのを思い出した。折角Xもたちあがるので使ってみんべ。 でも、起動すると、all pty in use って、つれない事を言われて起動しない。

こりゃ、xxgdbを動かすのにgdbが必要かと(怖い)再帰を思わず思い出しちゃったぞ。もっと別の 手が有ったはず。

そうだ、straceしてみよう。

access("/home/sakae/.gdbinit", R_OK)    = -1 ENOENT (No such file or directory)
open("/dev/ptyp0", O_RDWR|O_LARGEFILE)  = -1 EACCES (Permission denied)
open("/dev/ptyp1", O_RDWR|O_LARGEFILE)  = -1 EACCES (Permission denied)
  :
open("/dev/ptyse", O_RDWR|O_LARGEFILE)  = -1 ENOENT (No such file or directory)
open("/dev/ptysf", O_RDWR|O_LARGEFILE)  = -1 ENOENT (No such file or directory)
write(2, "xxgdb: all ptys in use\n", 23xxgdb: all ptys in use) = 23
exit_group(1)                           = ?

端末がアク禁になってたり、登録されていなかったりして、どれも使えないんか。そんな馬鹿な。

sakae@slck:~$ ls -l /dev/ptyp?
crw-rw---- 1 root tty 2,  0 Oct  9 13:28 /dev/ptyp0
crw-rw---- 1 root tty 2,  1 Oct  9 13:28 /dev/ptyp1
 :

そうか、ttyのグループへ加入すると、pyyp0とかが使えるようになるんか。ttyは貴重な資源だから、 会員様限定なのね。/etc/groupを編集した後、loginし直すと使えるようになる。

で、使ってはみたものの、gdbとターゲット・プログラムの端末分離は行われていなかった。残念。

DDD

もう一種類有ったな。gdbをX上で使うやつが。ddd-3.3.12を試してみるか。configure makeで いいのかな。

g++ -DHAVE_CONFIG_H -I.  -I./..    -O2 -g -Wall -W -Wwrite-strings -trigraphs  -MT strclass.o -MD -MP -MF .deps/strclass.Tpo -c -o strclass.o strclass.C
strclass.C: In function 'std::istream& operator>>(std::istream&, string&)':
strclass.C:1546:35: error: 'EOF' was not declared in this scope
strclass.C:1559:15: error: 'EOF' was not declared in this scope
strclass.C: In function 'int readline(std::istream&, string&, char, int)':
strclass.C:1589:35: error: 'EOF' was not declared in this scope
strclass.C:1602:15: error: 'EOF' was not declared in this scope
make[2]: *** [strclass.o] Error 1

EOFって、定義してないってさ。#define EOF -1 でいいんかいな? 一番新しいdddのはずなんだけど、 誰もチェックしてないのかなあ? それとも、slack特有の問題? まあいいや、ちゃんとコンパイル出来て、動き出したから。

dddを起動したら、Viewメニューから、Execution Window... (Alt+9)を選んであげると、 ターゲット用のコンソールが出てくる。これで、混じりあう事なくdebug出来る。

Attach gdb

上のDDTは強力で虫を殺してくれるようだけど、edみたいな、REPLもどきにはちと大げさかな。 昔書いた、bkってのを思い出した。これ、動いてるターゲットプログラムにgdbを摂りつかせる 微笑なスクリプト。

が、動かないんだ。意味不なエラーを返してきてね。

sakae@slck:~$ bk ed
/usr/local/bin/bk: line 6: [: 1555: unary operator expected

ArchでもウブでもFreeBSDでも動いていたんだけどなあ。Slack特有の動かん要因があるのかしらん? 原点に帰って、

sakae@slck:~$ ps awx|grep ed
 1555 ?        S<     0:00 [kpsmoused]
 2329 pts/2    S+     0:00 ./ed
 2400 pts/1    S+     0:00 grep ed

PID:1555 がヒットしちゃってるのか。で、エラーなんだな。ならば、フィルター強化。

sakae@slck:~$ cat /usr/local/bin/bk
#!/bin/sh
# gdb attach selected program
# Usage: bk program

pid=`ps awx | grep $1 | grep -v grep | grep -v $0 |grep -v ] | awk '{print $1}'`
if [ $pid ]; then
    gdb -q $1 $pid
fi

何か泥縄式。

sakae@slck:/tmp/ed-1.6$ bk ed
Reading symbols from /tmp/ed-1.6/ed...done.
Attaching to program: /tmp/ed-1.6/ed, process 2496

warning: Could not load shared library symbols for linux-gate.so.1.
Do you need "set solib-search-path" or "set sysroot"?
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib/ld-linux.so.2
0xb76c9a2e in __read_nocancel () from /lib/libc.so.6
(gdb) bt
#0  0xb76c9a2e in __read_nocancel () from /lib/libc.so.6
#1  0xb7665c9b in _IO_new_file_underflow () from /lib/libc.so.6
#2  0xb76684f9 in _IO_default_uflow_internal () from /lib/libc.so.6
#3  0xb766830a in __uflow () from /lib/libc.so.6
#4  0xb7662a2c in getchar () from /lib/libc.so.6
#5  0x0804b8ef in get_tty_line (sizep=0xbfd63f4c) at io.c:141
#6  0x0804e96f in main_loop (loose=false) at main_loop.c:710
#7  0x0804c630 in main (argc=1, argv=0xbfd640e4) at main.c:204
(gdb) c
Continuing.

注意しないと、/usr/bin/edをgdbは見てしまい、 シンボルがネーぞと文句言われる。-g付きのターゲットがある所に移動してから、gdbを起動する事。

で、結論は、X無しの、このスタイルが一番おいらにはぴったり来るなあ、とCUIの人間ってのを 再認識しましただ。

on *BSD

では、edはどうなっている?

HISTORY
     An ed command appeared in Version 1 AT&T UNIX.

manでは、ヒストリックに書いてあるんだけど、READMEを見ると

ed is an 8-bit-clean, POSIX-compliant line editor.  It should work with
any regular expression package that conforms to the POSIX interface
standard, such as GNU regex(3).
  :
The file `POSIX' describes extensions to and deviations from the POSIX
standard.

とかで、世界標準への努力はなされている訳ですよ。 そうなると、やはりヒストリカルに tecoだな。ドラエモンもポケットみたいな、/usr/portsを探ってみたら、

[sakae@secd /usr/ports/editors/teco]$ cat pkg-descr
        TECO is the grand old text editor. It is powerful and compact
precursor to EMACS and has a completely nongraphical user interface.
It is very fast (probably the fastes editor in the world) and have a
macro language. TECO was written by Dan Murphy (http://www.opost.com/dlm)
at Digital Equipment Corporation in 1962. This is based on Pete Siemsen's
TECOC implementation, and comes with a copy of the originals DECUS TECO
documentation.

WWW: http://almy.us/teco.html

りっぱなマニュアルが付いてた。(ので、その表紙だけ)

                               Standard TECO


                     TEXT EDITOR AND CORRECTOR FOR THE
                     VAX-11, PDP-11, PDP-10, and PDP-8


                USER'S GUIDE AND LANGUAGE REFERENCE MANUAL


                             May 1985 Edition


                            TECO-11 VERSION  40
                            TECO-10 VERSION   3
                            TECO-8  VERSION   7

これが元祖editorなんですかね。入れてみた、*.cだけで15000行もあるよ。emacsの肥満の 源流はDNAに埋め込まれていたって事なんですかね?