Island Life

2005/11/27

昨日、「降りてきてしまうもの」に対して「ヴィジョン」という言葉を使ったが、 完成形が一瞬でひらめく、というようなものだけを念頭に置いていたわけではない。 むしろ、何だかわからないもやもやしたものが来て、とにかくそれを形に しないことには居られない、というようなものを考えていた。

産みの苦しみはこっち持ち、なんである。そんな苦しいことは避けられたら 避けたいんである。でも、産まないでいる方がもっと苦しいから、仕方ないんである。 ただどっちも苦しいから、降りて来たものに気づかないふりをして 誤魔化すという誘惑もある。緩慢な精神的死を迎えるとしても、 人間、楽はしたい。 金銭的な報酬とか、功名心とか、嫉妬とかは、そういう怠惰を抜け出して 苦しみに直面するために使える便利な道具である。

金銭や名誉や嫉妬が直接の動機なのか、それとも代替物なのかは、 ちょっとした想像をしてみればわかる。金銭を求めていると思っている人は、 もし一生好きなことをして暮らせるだけの金が入ったとしたら、 周囲からの賞賛を求めていると思っている人は、無人島に一人だけで流れついたとしたら、 嫉妬に駆り立てられていると思っている人は、妬ましいその人と自分の立場が入れ替わったと したら。それでも今苦しみつつやってることをやっぱりやるだろうと思えたら、 きっと何かもっと大きなものに動かされているのだ。 (もっとも、想像するだけじゃなく本当にそうなってみないとわからないこと、 ってのはあるかもしれない。)

Tags: ものつくり, 表現

2005/11/25

k16's note 2005/11/14

信じられないモチベーションといったら、ショスタコービッチもそうだ。 党から創作活動を制限されていたジダーノフ批判以降の約4年間、 ひたすら机の引き出しの肥やしにするために、24のプレリュードとフーガ、 弦楽四重奏第4〜5番、バイオリン協奏曲第1番といった超傑作をこっそり作り続けてたんだから。 [...] 発表することはもちろん、作っていることさえ禁じられている状況なわけで、 「オレを認めて欲しい」という欲求が一切介入しないところで高度な創作活動を続けていたところがすごい。

本当のところがどうだったかは知らないけれど、私はこのエピソードを聞いて、むしろ 「そんな状況であっても、創作を続けずにはいられなかった」と感じる。

ある種の才能は、祝福であると同時に呪いでもある。 Stephen Kingがどっかで「書かずにはいられないから書く」とか 「書かないとおかしくなってしまう」とか言ってたような気がするが、 まさにそうなのだと思う。ヴィジョンがつぎつぎに降りてきて、 創れ創れとけしかける。語弊はあるかもしれないが、 どんどん形にしてゆかないと精神的糞詰まりを起こして (精神的に)生きてゆけなくなるのではないか。 Kingは「ミューズが頭上で下痢している」(嘔吐だったかも)という 表現もどこかで書いてた気がする。 ブレヒトの「ガリレイの生涯」の14幕のガリレイも似たような境遇だ。 教会に蟄居を命じられ、細々と書き綴る"Discorsi"は書く端から 教会に取り上げられる。それでも書かずにはおれない。 それを発表して名をあげたいとか科学に貢献したいとかいう次元を離れているのだ。

困ったことに、この種のヴィジョンを得てしまう能力と、 それを形にする能力は必ずしも一致しない。しばしば両者はともに「才能」と 呼ばれて混同されるが、本来は直交する能力である。 ヴィジョンがあふれてもそれを形にするスキルが ついていかないとおかしくなる。一方、スキルがあって器用に 求められるものを形に出来るが、自分の本当に創りたいものが何か わからずに空虚な思いを抱いている人もいるだろう。 (前者は"gift"、後者は"talent" に該当するのではないか、と ふと思ったが、ちょっと調べた限りではそういったconnotationに 触れられている辞書は見当たらなかった)。

才能は獲得されるものか備わっているものかという論争はあるが、 少なくとも後者の(形にする)才能は獲得されるものだと思う。 才能があり、素晴らしい創作活動を続けている人は両方を最初から 備えていたかのように見えるかもしれない。しかしそれはむしろ、 内なるヴィジョンに子供の頃から気づいていた結果として、 自分が生きのびるために死に物狂いでスキルを獲得したのだと 言えはしないか。たとえ本人は死に物狂いだと思っていなくても、 それは生存のための無意識の行動だったのではないか。

このへんの、才能の残酷さを見事に描いているのが David Morrellの短篇 "Orange Is for Anguish, Blue for Insanity" だ。 (邦訳は「オレンジは苦悩、ブルーは狂気」---アンソロジー「ナイトフライヤー」収録)。 普通の超常現象を扱うホラーとして読んでも面白いが、 もしこれが創作の本質だと考えると、恐ろしい。

Tags: ものつくり, 表現

2005/11/23

ねるWiki:NelDiary:2005-11-23?経由で経県値。 結構行き残しているところがあるなあ。

泊りの多くは自転車のキャンプ旅行によるもの。 全県走破する前に日本を出てしまった。もうチャンスは無いだろうなあ。

Tag:

2005/11/15

Uuutokudaの日記2005-11-15より:

やっぱり人のコーディングスタイルとかを見るのは勉強になる。 [...] で、そこで皆さんのコードをみてみたいのである。 [...] で、あんまり複雑なのは面倒なので非常に簡単な問題。

二つのツリー(もしくはリスト)が等価であるかどうかを判定するプログラムを示せ。
(深さ優先探索したときの各葉の要素の並びが2つのツリーで等価ってこと)

たとえば、(1 (2 3) (4)) と(1 (2 (3 (4))))は等価である。

この方はさらっと書かれているが、これはsamefringe problemと呼ばれる なかなかに興味深い問題である。ナイーブな解は、ツリーの全ての要素を列挙した リスト(flattenしたもの、と言ってもよい)を作ってそれらを比べるというものだが、 もしツリーが巨大なものであり、しかもそれらが異なっていた場合、 flattenの作業の大部分が無駄になってしまう。

ところが必要最低限の空間複雑度で計算しようとすると、 「同型でないデータ構造を再帰する」というちょっと厄介な問題を解かねばならない。 コルーチンで解く方法もあるが、遅延ストリームを使うと再帰の部分が ジェネレータに隠されてわりと素直に書ける。

(use util.stream)

(define (samefringe? t1 t2)
  (define (make-gen tree)
    (stream-delay
     (cond ((null? tree) stream-null)
           ((pair? tree)
            (stream-append (make-gen (car tree)) (make-gen (cdr tree))))

           (else (stream tree)))))
  (let loop ((s1 (make-gen t1))
             (s2 (make-gen t2)))
    (or (and (stream-null? s1) (stream-null? s2))
        (and (stream-pair? s1) (stream-pair? s2)
             (equal? (stream-car s1) (stream-car s2))
             (loop (stream-cdr s1) (stream-cdr s2))))))

streamに隠された継続を陽に扱って継続渡し形式にしても良いが、 あまりわかりやすくはない。

(define (samefringe? t1 t2)
  (define (traverse g1 g2)
    (g1 (lambda (e1 end1? rest1)
          (g2 (lambda (e2 end2? rest2)
                (or (and end1? end2?)
                    (and (equal? e1 e2) (traverse rest1 rest2))))))))
  (define (end c) (c #f #t #f))
  (define (genfringe tree c rest)
    (cond ((null? tree) (rest c))
          ((pair? tree)
           (genfringe (car tree) c
                      (lambda (c) (genfringe (cdr tree) c rest))))
          (else (c tree #f rest))))
  (traverse (lambda (c) (genfringe t1 c end))
            (lambda (c) (genfringe t2 c end))))

コルーチンによるもの、継続渡しによるもの、遅延ストリームによるものは どれも本質的に同型の解になり、木の深さDに対して最悪O(D)の空間を必要とする。

(なお、良く見るsamefringe problemではコンスセルを2分木として扱う、つまり fringe (1 (2 3) 4) => (1 2 3 () 4 ()) とみなすことが多いが、 ここでは元の問題に合わせた。)

Haskellならもともとlazyだからこれでいいのかな。

data Tree a = Leaf a | Branch [Tree a]

fringe :: Tree a -> [a]
fringe (Leaf x)   = [x]
fringe (Branch x) = foldr (\x r -> fringe x ++ r) [] x

samefringe :: Eq a => Tree a -> Tree a -> Bool
samefringe x y = fringe x == fringe y

参考: Henry Baker, Iterators: Signs of Weakness in Object-Oriented Languages, ACM OOPS Messenger 4, 3 (July 1993), 18-25. http://home.pipeline.com/~hbaker1/Iterator.html

Tags: Programming, Scheme, Haskell

2005/11/11

またc.l.sネタだが。Original Posterのちょっとしたミススペリングが ジョークツリーに発展中。

http://groups.google.com/group/comp.lang.scheme/browse_frm/thread/1af2cb0cf7adc026

More entries ...