2006/01/30

SICP を Gauche (R5RS な実装全般?) で勉強していると、真偽の扱いで戸惑うことがある。というのも、SICP では '() を偽としてサンプルが記述されている場合があるけど、ディヴィグ本によればこれは R4RS 流らしい。いや、それともこれは、僕の putプロシージャと getプロシージャの定義の仕方がまずかったから?

そしてもうこんな時間……
「ところで」禁止

2006/01/29

このところのエウレカセブンは、クライマックスにむけてキャラクターの描き方に迷っているように思える。50週もあると脚本が行き届かないのかもしれない。

ところで、自宅で仕事のあいまに、マンションギャラリーというものに行ってみた。マンションを購入するつもりはほとんどないんだけど、近所のあれだけの好立地に建設予定となると本気で考えたくもなる。行ってみると意外に面白いもので、現代的なマンションも悪くないような気持ちになってきた。なんてったってラクだよ。こっちがすることといったらオプションを選ぶくらいなもので、それで展望やセキュリティや空調の完備された心地よい住処が手にはいるんだもん。
で、応募した。最終的には19倍の抽選になったらしく、案の定落選した。こんなものでも、やっぱり落選ってしょんぼりするものだった。

2006/01/27

ううん、昨日の regexp-replace-delimiter-all* では後方参照が使えないな。gaucheのregexp.scmを見ると、regexp-replace-all が最後まで \1 などをサブマッチした文字列に置き換えないらしく、それが原因っぽい。例えば #/foo(.*?)bar/ という正規表現オブジェクトは、内部では ("for" 1 "bar") というリストになっていて、それが regexp-replace-rec という regexp-replace-系プロシージャの請負プロシージャで rxmatch-substring により展開される。昨日の状態で置き換える文字列 に \1 などが指定されていても、最初にデリミタで分解されてしまうので、最終的に取り出される文字列は "1" とかになっちゃう。
置換文字列としてはマッチオブジェクトを引数にしたプロシージャが渡せるので、デリミタを施す処理を外でやるようにすれば対処はできるんだけど……

(define delimiter "%%%")
(define (set-delimiter str)
(string-append
delimiter
(string-join (map x->string (string->list str)) delimiter)
delimiter))
(define (erace-delimiter str)
(regexp-replace-all (string->regexp delimiter) str ""))

(define (regexp-replace-delimiter-all* str . args)
(if (eq? (remainder (length args) 2) 1)
(error
"Need even args -- REGEXP-MATCH-REPLACE*"
args)
(if (null? args)
(erace-delimiter str)
(apply regexp-replace-delimiter-all*
(append
(list (regexp-replace-all
(car args)
str
(cadr args)))
(cddr args))))))

(regexp-replace-delimiter-all* "foobarbaz..."
#/foo(.*?)baz/
(lambda (m) (set-delimiter
(string-append
"|"
(rxmatch-substring m 1)
"|"
)))
#/bar/
(lambda (m) (set-delimiter "..."))
)
 
=> "|bar|..."

なんかだんだん意図がわからなくなってきたけど、ようは regexp-replace-all* だとこうなっちゃうのをなんとかしたいということです。

(regexp-replace-all* "foobarbaz..."
#/foo(.*?)baz/
(lambda (m) (string-append
"|"
(rxmatch-substring m 1)
"|"
))
#/bar/
(lambda (m) "...")
)

=> "|...|..."

2006/01/26

なんらかの構文をルールにしたがってマークアップしたいときに、どんなテキストフィルタを使えばいいかという話。ことに、直前のフィルタリングの結果を次のフィルタリングで上書きされないようにする方法の正解はなんだろう。最初にきちんと構文を解析するのが、もっとも間違いがなく、robustであるのは認める。けれども、よほど汎用性のあるフォーマットでないかぎり自分で構文解析までするのは非現実的だと思う。誰かが、ちょうど自分の目的にあったものを書いてくれていれば、積極的に流用したい。けど、その目的のものを探すコストがばかにならないことも多い。
それなら、「アドホックさ」と「再利用性」のあいだのどこかでバランスをとった解決方法を、その場で作り出すしかないんじゃないかと思う。

「直前のフィルタリングの結果を次のフィルタリングで上書きされないようにする方法」に関しては、とりあえずこんな方法しか思いつかないんですが、この程度の再利用性があればいいんじゃない? だめ?
(define (regexp-replace-delimiter-all* str . args)
(define delimiter "%%%")
(define (set-delimiter str)
(string-append
delimiter
(string-join (map x->string (string->list str)) delimiter)
delimiter))
(define (erace-delimiter str)
(regexp-replace-all (string->regexp delimiter) str ""))

(if (eq? (remainder (length args) 2) 1)
(error
"Need even args -- REGEXP-MATCH-REPLACE*"
args)
(if (null? args)
(erace-delimiter str)
(apply regexp-replace-delimiter-all*
(append
(list (regexp-replace-all
(car args)
str
(set-delimiter (cadr args))))
(cddr args))))))


gosh> (regexp-replace-delimiter-all* "abcde" #/a.*?c/ "xx" #/xd/ "zz")
=>"xxde"

2006/01/23

Joel on Software、amazon で8000円とかのユーズド商品が出ちゃってますが、今週中には緊急に重版してる分ができるはずなのでもう少しだけお待ちください。早まって高値で購入してしまう人がいなければいいけれど。

ところで amazon の在庫情報は、US 本社のデータベースと取り次ぎのデータベースと出版者のデータベースとを連携させているらしい。例えば、市川の amazon.co.jp の倉庫に在庫がなくても、出版社や取り次ぎの倉庫に在庫があれば、「通常は3〜4日以内にお届けします」と表示される。で、どうもこの連携がうまくないときがあって、出版社に在庫があっても「在庫切れです」と表示され続けたりすることがある。Joel on Software に関しては、出版社にも現時点では在庫がないんだけど……(今週できますって)

amazon の在庫表示がゼロになることがどんなに全体での売れ行きに影響するかを考えると、もっと特別に対応すべきなのかもしれないけど、個々の書店への販売担当部署の対応にはリソースの限界があるし(そういうことが重視されていない場合は、とくに)、もっと上のほうの人達との認識の差もあるんだろう。企画編集者としても、いったん商品として本が出荷された状態になっちゃうと、「〜らしい」というレベルの情報しか得にくい。なにせ、重版の出来本が自動的に手もとにやってくることさえないんだから。重版が出来たころに出庫伝票を書いて(しかも手書き)自分で倉庫に赴くしかなく、それってなかなか不便なんだよね。

2006/01/21

うちの目の前はずっと廃屋で、夏になると野バラが咲き、秋になると紅葉し、春になると猫がひなたぼっこをしていた。5年前にこの部屋を借りたときの動機のひとつだったと思う。

DSC_0052 DSC_0072

それがいよいよ取り壊されてしまった。

DSC_0138

さて何かできるのか。何ができても、もうあの神社の裏に忘れられていた空間は戻ってこないんだけど。

2006/01/18

ささやかながら株式投資をしている身としては、もう少し身構える必要があるだろうか? でも、なんか投機スジが騒いでいるだけな気がしてしょうがないので、いままでどおりのスタンスをしばらくは維持しよう。実際、自分が所有している銘柄の評価額はさほど落ちてないし。

にしても、これってUSで数年前に起こったエンロンショックの再演でしょ。いったいこの国は、いつになったらUSの失敗から学習するんだろう。どうでもいいけど、当時エンロンと WorldCom がつぶれたことは、自分が転職をしたことの遠因(といっても直接の利害関係もないわけじゃない)になっていると思っている。

2006/01/16

いっけん仕事で使うスクリプトのように見えてただの道楽シリーズ。けっして就業時間中は遊んでません。つーか、ほんとに日中は(時間的精神的な)余裕なさすぎで、あちらこちらに迷惑をかけている。この場を借りてお詫びします。

で、今日の成果は、なんとなく階層化された文章の見出しに連番をふる gauche スクリプト。
numbering.scm

おなじことをするプログラムは、むかしはPerlで書いて、それからRubyでも書いたけど、いずれも上位レベルの見出しの現在値を保持するのに大域変数を使っていた。大域変数を使わないようにするには継続を使うんだろうなあと知ってはいたけれど、"Seasoned Schemer" を読んで、ようやく何をどうやって継続すればいいのかイメージがわいた。ここでは、現在までのレベルの見出し情報を次の行の処理に継続させている。

(define (numbering file)
(with-input-from-file file
(lambda ()
(letrec
((Ns (lambda (ctrs)
(let ((line (read-line)))
(cond
((eof-object? line)
'())
((leveled? line)
(let ((ctr-lv (length ctrs))
(lin-lv (level-of line)))
(cond
((< ctr-lv lin-lv)
(let ((ctrs (deeper ctrs)))
(cons (put-head line ctrs)
(Ns ctrs))))
((> ctr-lv lin-lv)
(let ((ctrs (add1 (chop ctrs lin-lv))))
(cons (put-head line ctrs)
(Ns ctrs))))
((equal? ctr-lv lin-lv)
(let ((ctrs (add1 ctrs)))
(cons (put-head line ctrs)
(Ns ctrs)))))))
(else (cons line
(Ns ctrs))))))))
(Ns '())))))

2006/01/15

むっかー☆
自宅で仕事してたら Windows2000 Server がブルースクリーンだ。集中力きれちゃったよ。

先日感想を書いた『グラン・ヴァカンス』の作中での時間は、丸2日じゃなくて丸1日だった。ところで、読み終えてから数日たって今ごろ気づいたのは、この作品の世界が晩年のシューベルトのように明るい悲劇性を伴っているってことだ。SFちっくな道具だてでテンポよく語られてしまうので、読んだ直後は単に恍惚としてしまう。シューベルトの後期ピアノソナタ、とくに18番とかも同じで、一聴するときれいでやさしげな旋律なんだけど、ひょんな瞬間に絶望がまとわりついているのに気づく。いつもなら明るい陽光に照らされた光景なのに、いったん地面にうつった影に気になってしまうと、もう影のほうばっかり気になってしかたない、みたいな。

2006/01/04

LaTeX には、テキストをワク囲みするためのまともな環境がない。screenみたいな、minipageを使う環境は全部だめな。footnoteが使えないから。そもそも改ページできないし。で、Knooth本を読んだり Web を見たりしていると、やっぱり本当におかしいのは TeX でも LaTeX でもなく、LaTeX 信者なんだと確信してくる。LaTeX ベースのシステムそのものは、しばらく便利に使わせてもらいます。
LaTeX 信者の特徴は、Web で \ を \ を使って表したがることだ。ありゃどういう風習なんだ? コピペでいきないじゃん。しかしそんなこと言おうものなら、TeXの習得には練習あるのみです、とかいわれかねない(これもまた信者の特徴)。練習して熟練するようなもんじゃないとおもうんだが。ツールだぜ。同じツールでもセンスのいいものなら喜んで勉強したいが。
しかたがないので、ページをまたぐことができ、かつfootnoteを安直に付けられる書籍コラム用のlatex環境を、かつて仕事で作った。今度また必要になりそうなので、仕事中に作った部分は改めてスクラッチから作りなおし、public domain で晒しておくことにしようと思う。

column.sty

出力例(まだ)

実体はlongtable環境。どこでも改ページできるわけではなく、段落の切れ目でのみ改ページできる(もちろん手動で改行を入れればそこで改ページできる)。longtableがけっこう強力なので、このコラムの内部にもほとんどの要素をぶちこめると思う。
なお、column.sty とか名前はついているけれど、スタイルファイルとして汎用に使えるわけじゃないです。コンピュータ書に多い、B5変形で使った場合の一例を公開しているものにすぎないと考えてください。とくに、ワクの上下の角丸の罫線の定義は相当きたない。あくまでも、これをパラメータをあちこちいじればほぼ使える環境がカスタマイズできるはず、というレベルのものであって、「コラム」と呼ばれるスタイルに汎用の要素を切り出して整理したりするつもりはないのであしからず。

2006/01/02

いまさらだが、正月1日と2日で飛浩隆『グラン・ヴァカンス』を読めた。作中の時間も、いちおう正味2日の出来事になっているようなので、これはつまり、ほぼリアルタイムに、夏の区界をめぐる攻防を追体験したことになる。
実は、amazonからこの本が届いてずいぶん経つ。届いたときにページをぱらぱらめくって、けっこう文字が多かったものだから、しばらく放置してしまっていた。昨日、昼からぽちぽち仕事をしてたんだけど、すぐにむくむくと現実逃避したくなってしまい、それで夕方になって本書を手にとったら一気に引き込まれてしまった。だから、作中とのほぼリアルタイムな読書体験に貢献したのは、正月休みのヒマっぷりではない(実際余裕なさすぎ)。この作品には異様なスピード感がある。左翼ちっくな口上とか、無駄に冗長な人物描写とか、ない。それでも主要な登場人物は魅力でいっぱいだし、彼らに死亡フラグが立って舞台から消えるまでの一文一文は読んでいて本当に寂しい(とくにアンヌ)。
で、これは『廃園の天使I』って銘だけど、IIはいつよ。