sbcl

丁度今頃発売の雑誌は、豪華付録が付いていて、見ていて楽しい。付録が大きすぎて、付録と 雑誌がセパレートになって陳列されてたり。。そそっかしい人は付録だけ持ってレジに 並んだりして。シャトンじゃなくてビトンだかシャネルの付録が付いていた雑誌は何でしたかね? 女房が買ってこないか、ちょっとハラハラドキドキしてる。だって、貧乏丸出しじゃないですか。

後は、このご時世を繁栄してか、ECOバックってのが多かったな。面白いのは、スノボの雑誌に 付いていた、DVDになったレッスンビデオ。進化したものだ。おいらの頃(どんだけ、昔だ)は パラパラ漫画宜しく、連続写真が載ってて、ページをパラパラして、オーーオ、こうやって ターンするんだなんて、感心して見入ったものです。今なら、YouTubeあたりで、適当に見繕って、 アップルのえーと、何て言うんですかね、、あたりに入れて、スキー場に連れてってあげるのが 、ナウイ人のやる事ですかね。(ああ、すっかり、ITオンチだな)

女房は、家計簿は買ってこないけど、この時期、猫手(帖)付録の、ニャン子カレンダーを 目当てで、雑誌を買ってくる。CMで有名になった、あの猫はエントリーしてるのだろうか? ちょっと、興味があるな。

portsのupdate

今までは、portsのupdateを pkgから取ってきた、cvsupで賄っていたけど、SDを見てたら デフォで、FreeBSDに用意されてる事を知った。何でも、下記を/etc/src.confに書いて おいて、cd /usr/ports; make update すればいいらしい。

SUP_UPDATE= yes
SUP=        /usr/bin/csup
SUPFLAGS=   -g -L 2
SUPHOST=    cvsup2.jp.FreeBSD.org
SUPFILE=    /usr/share/examples/cvsup/standard-supfile
PORTSSUPFILE= /usr/share/examples/cvsup/ports-supfile

で、実際にやってみたら、portsnapが起動しちゃう。manと勘を頼りに、上記を/etc/make.confに 追加してあげたら、無事に動き出した。私のBSDがおかしいのかしらん? 動いているから、いいか。

今回からは、/usr/srcを元に、buildworld や buildkernel を実行するのを止める事にした。 その変わり、binaryでのupdateだけを行う事にしよう。

[root@fb8 ~]# freebsd-update fetch
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching metadata signature for 8.0-RELEASE from update5.FreeBSD.org... done.
Fetching metadata index... done.
Inspecting system... done.
Preparing to download files... done.

The following files will be updated as part of updating to 8.0-RELEASE-p1:
/usr/src/etc/mtree/BSD.var.dist
/usr/src/libexec/rtld-elf/rtld.c
/usr/src/sys/conf/newvers.sh
/usr/src/usr.sbin/freebsd-update/freebsd-update.sh
[root@fb8 ~]# freebsd-update install
Installing updates... done.
[root@fb8 ~]# shutdown -r now

失敗した時は、rollback で、一つ前だけど戻せるそうだ。

clisp-hyperspec

前回、どんな風の吹き回しか sbcl を入れちゃったけど、まともに使おうと思ったらhelperが 必要な事に気が付いた。で、hyperspecなんてのがあるかと思って探したら、portsの中に 紛らわしい名前で登録されてた。clisp-hyperspecですって。

これって、clisp用のそれかと思ったら、CommonLisp用のhyperspecなのね。早速入れて あげましたよ。そして、hyperspecをemacs上から引けるように、.emacsにちと追加。

;;;;;;;; Common lisp hyper-spec --> C-c C-d h
(require 'hyperspec)
(setq common-lisp-hyperspec-root (concat "file://" (expand-file-name "/usr/local/share/doc/clisp-hyperspec/HyperSpec/"))
  common-lisp-hyperspec-symbol-table (expand-file-name "/usr/local/share/doc/clisp-hyperspec/HyperSpec/Data/Map_Sym.txt"))
(require 'w3m)
(setq browse-url-browser-function 'w3m-browse-url)

ここまではいいんだけど、www/emacs-w3mを入れようとしたら、開発版を入れろですって。そんなの 何処にあるんかいな? Makefileを見れば手がかりが得られるかな?

MASTER_SITES=   http://emacs-w3m.namazu.org/

と言う事で、行ってみたら開発版がCVSで提供されてた。取ってきて入れた。portsって宝の山だ なあ。

sbclのupdate

portsを更新して、pkg_version したら、sbclが新しくなっている事が判明。早速 portmaster sbcl-1.0.30.0 して、新しくしようとしたら、冒頭で、メモリーたくさんいるぜ と 言われつつも、更新が始まった。いやな予感がするなあと思っていたら、途中で ldbに に落ちちゃったよ。quitで ldbを抜けると、メモリー不足でしたって! 嘘警告じゃ無かった 訳ね。

そもそも、メインメモリーが128M、スワップを256Mにして使ってるんだけど、これだとemacsを 起動して、goshなりghciを起動してもSWAPせずに快適に使えていたんだ。お祭りの時は、特別仕立て の環境にしないとだめかい脳。

VMWareの設定を変更して、メモリーを384Mにした。後、SWAPも増設してあげる事にした。

[root@fb8 ~]# dd if=/dev/zero of=/usr/home/myswap bs=1024k count=512
512+0 records in
512+0 records out
536870912 bytes transferred in 34.833419 secs (15412524 bytes/sec)
[root@fb8 ~]# chmod  0600 /usr/home/myswap
[root@fb8 ~]# mdconfig -a -t vnode -f /usr/home/myswap -n 0
0
[root@fb8 ~]# swapon /dev/md0
[root@fb8 ~]# swapinfo
Device          512-blocks     Used    Avail Capacity
/dev/da0s1b         524288        0   524288     0%
/dev/md0           1048576        0  1048576     0%
Total              1572864        0  1572864     0%

この状態でUpdateしたら、無事に sbcl-1.0.31になった。そのうちに、ghcなんかのupdateでも この技が必要になるのだろうな。/etc/rc.conf に swapfile="/usr/home/myswap" と書いて おくと、次回起動時に自動的にSWAPを増やしてくれる。

ldb とは、何物ぞ?

sbclのupdate時に、ldb に落ちたと書いたけど、気が動転しててそのままスルーしちゃった。 折角の機会なので、よく観察してみる。まずは、どんな風に落ちるか再現実験。

; compiling (DEFUN CLASS-OF ...)
; compiling (DEFUN EVAL-FORM ...)mmap: Cannot allocate memory
fatal error encountered in SBCL pid 1365:
remap_free_pages: page moved, 0x00001c28 ==> 0x00000000

Welcome to LDB, a low-level debugger for the Lisp runtime environment.
ldb>

ようこそいっらっしゃいませー って、言われてもねえ。場末のキャバレーの、おばちゃんホステス に声を掛けられたみたいで、ちっとも嬉しくないんですが。。。

ldb> ?
help    Display this help information.
?       (an alias for help)
backtrace       Backtrace up to N frames.
catchers        Print a list of all the active catchers.
context Print interrupt context number I.
dump    Dump memory starting at ADDRESS for COUNT words.
d       (an alias for dump)
exit    Exit this instance of the monitor.
flush   Flush all temp variables.
grab-signals    Set the signal handlers to call LDB.
kill    Kill ourself with signal number N (useful if running under gdb)
purify  Purify. (Caveat purifier!)
print   Print object at ADDRESS.
p       (an alias for print)
quit    Quit.
regs    Display current Lisp registers.
search  Search for TYPE starting at ADDRESS for a max of COUNT words.
s       (an alias for search)

まあ、初めてのご対面なので、どんなサービスが提供されてるかだな。で、さすが底辺だけ あるわい。

ldb> backtrace
Backtrace:
   0: Foreign function ldb_monitor, fp = 0x286fed68, ra = 0x8055c07
   1: Foreign function lose, fp = 0x286fed98, ra = 0x8053865
   2: Foreign function zero_pages_with_mmap, fp = 0x286fedb8, ra = 0x805bbb0
   3: Foreign function collect_garbage, fp = 0x286fee98, ra = 0x805e1d6
   4: SB-KERNEL::COLLECT-GARBAGE
   5: (COMMON-LISP::FLET SB-THREAD::WITH-MUTEX-THUNK)
   6: (COMMON-LISP::FLET WITHOUT-INTERRUPTS-BODY-[SUB-GC]13)
   7: (SB-C::TL-XEP SB-KERNEL::SUB-GC)
   8: Foreign function call_into_lisp, fp = 0x286ff018, ra = 0x805fd3b
   9: Foreign function funcall0, fp = 0x286ff038, ra = 0x8050bcd
  10: Foreign function maybe_gc, fp = 0x286ff058, ra = 0x8051771
  11: Foreign function interrupt_handle_pending, fp = 0x286ff088, ra = 0x80546e7
  12: Foreign function unblock_signals_in_context_and_maybe_warn, fp = 0x286ff0a8, ra = 0x80550f6
  13: Foreign fp = 0x286ff3e8, ra = 0xbfbfffb4
  14: SB-C::READ-FOR-COMPILE-FILE
  15: SB-C::SUB-SUB-COMPILE-FILE
  16: (COMMON-LISP::LAMBDA ())
  17: (COMMON-LISP::FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK)
  18: (SB-C::TL-XEP SB-C::%WITH-COMPILATION-UNIT)
  19: SB-C::SUB-COMPILE-FILE
  20: (SB-C::TL-XEP COMMON-LISP::COMPILE-FILE)
  21: (COMMON-LISP::LAMBDA ())
  22: SB-INT::SIMPLE-EVAL-IN-LEXENV
  23: SB-FASL::LOAD-AS-SOURCE
  24: (COMMON-LISP::FLET SB-FASL::LOAD-STREAM)
  25: (SB-C::TL-XEP COMMON-LISP::LOAD)
  26: SB-INT::SIMPLE-EVAL-IN-LEXENV
  27: (SB-C::TL-XEP SB-EXT::INTERACTIVE-EVAL)
  28: SB-IMPL::REPL-FUN
  29: (COMMON-LISP::LAMBDA ())
  30: SB-IMPL::%WITH-REBOUND-IO-SYNTAX
  31: SB-IMPL::TOPLEVEL-REPL
  32: SB-IMPL::TOPLEVEL-INIT
  33: SB-KERNEL::!COLD-INIT

また、随分深い所だ事。後使えそうなものは?

ldb> catchers
0x286FFD54:
        uwp: 0x286FFF5C
        fp: 0x286FFD7C
        code: 0x580E63C7
        entry: 0x580E6C65
        tag: $1=          0x5801c917: other pointer
0x286FFF48:
        uwp: 0x00000000
        fp: 0x286FFF7C
        code: 0x59695F57
        entry: 0x59696A6C
        tag: $2=          0x580db7c7: other pointer
ldb> regs
CSP     =       0x286ff3d0   CFP        =       0x00000000
ALLOC   =       0x5b320000

catchersって、客引きの事かいと言い。それにしても、regが3つだけとは、インテルの石より も貧弱? 長居は無用じゃ、さっさと退散しましょ。

ldb> quit
Really quit? [y] y
     1059.50 real        21.83 user        11.48 sys
*** Error code 1

Stop in /usr/ports/lang/sbcl.
*** Error code 1

Stop in /usr/ports/lang/sbcl.
[root@fb8 /usr/ports/lang/sbcl]#

ああ、やっと娑婆に復帰したわい。これから、忘年会シーズン、夢々、へんな所に引っ張り こまれないように注意めされ。