depressionist

[prev|next|index]2002:32

[prev|next]20020805Mo

結局寝たのは 4 時ごろか。 つかれていたせいか、 ぐっすり眠って 10 時ごろ目がさめる。 ネットめぐったりしているうちに急に不安発作。 あわてて薬を二錠飲む。 プラシーボで安心したのか、 胸のしこりがすっととれる。 その後朝風呂入ったり、 本読んだりしているうちに薬が効いてきたか、 眠気に襲われそのままバタンキュー。 目がさめたら夜の 7 時ごろだった。 そのまま晩飯を食らったりして 11 時ごろにまた寝る。

[prev|next]20020806Tu

久々の通院。 眠気がひどいと申告。 朝の分の薬を止めることになる。

Perl の DBM で、 ハッシュを保存するモジュールをでっち上げる。 最初はサブルーチンにして、 joinsplit で保存していた。 これを TIEHASH をオーバーライドすることで、 透過的にハッシュが扱えるようになる。 すばらしい。

手順としては Tie::Hash モジュールを継承し、 TIEHASHSTOREFETCH をそれぞれオーバーライドする。 継承するメソッドを自動的にロードするために AUTOLOAD もオーバーライドしておく。 継承とはいったが実質的には委譲かもしれない。

もっとも、この手の事をするには MLDBM を使うのが定番だろう。 しかし、使っているレンタルサーバに MLDBM がインストールされているか確かめるのが面倒だった。 またもしインストールされていたとしても、 別のサーバに乗り換えたときになかったりした場合のこともある。

それはそれとして MLDBM を調べてみたら、 データをシリアライズするのには、 標準パッケージの Data::Dumper を使うより、 CPAN に登録されている Storeable パッケージの方が効率が良いようだ。 そこで Storeable をダウンロードしてみてみると、 データをシリアライズする部分は C 言語でかかれていた。 これでは MLDBM と Storeable を抱え込むのがためらわれるな。 バイナリで配布されているものを探すという手もあるが。

まあ、そんなこんなで MLDBM ほどの機能がほしいわけじゃない、 つまりハッシュだけ格納できればいい。 ヘタするとハッシュではなくて配列でも可ってな状況。 というわけで自作してみた次第。 作ったとしても高々 20 ステップもない程度だしね。 もっとも TIEHASH を使ってプログラムを組んでみたかったということもあるのだけれど。

[prev|next]20020807We

さて、昨日作ったモジュールを使おうかとちょいと思案。 考えてみたら住所録を格納するのに、 ハッシュの中に配列へのリファレンスを格納できると便利だと思った。 例えばこんな具合。

{
    name => 'John Doe',
    phone => [ 'xxx-xxxx-xxxx', 'yyy-yyyy-yyyy' ],
}

これをするためには MLDBM 、 というより Data::Dump、FreezeThaw、Storeable と同程度の機能を作らなければならない。 でも思ったより楽しそうだったので作ってみることにした。 アルゴリズムを考えるのは楽しい。 というよりこの場合はさほど難しくない。 スカラーは、文字列か参照か配列かハッシュもしくは undef 値である。 文字列はその長さを先頭につけて格納すれば良い。 参照は参照をはがして得られたスカラーを格納する。 配列は要素数を先頭につけてその要素のスカラーを格納する。 ハッシュはキーと値の数を先頭につけてキー(文字列)の並びと、 キーの値であるスカラーを格納する。 undef 値はそれを示す目印を格納する。 以上を再帰的に行えばよい。 BNF を書くまでもないね。

ただし型グロブとコードへの参照は、 格納しても復帰できないので無視することにする。 というか格納しようとしたらエラーにするしかないわな。

そしてシリアライズして格納したデータを読み込むには、 以上と同様の事をすればいいわけだ。

あっけなくできあがってしまったのでちょっと拍子抜けた感じ。

[prev|next]20020808Th

MLDBM の配布パッケージのテストスクリプトを参考にして、 昨日作ったパッケージ CSDBM (Complex Structure DBM) をテストしたところ、 無限ループになってしまった。 どうも、参照が循環しているとこうなってしまうらしい。 最も簡単に再現するのは、 自分への参照を格納している配列への参照である。 当たり前か。

そこで配列とハッシュを格納するときに、 それへの参照をスタックに保存しておくことにした。 配列またはハッシュを格納するときにこのスタックを検索して、 格納済みであれば undef 値を格納する。 これでとりあえずは無限ループというかスタックオーバーフローにはならないだろう。 スタックを検索すると書いたが、 実際には保存したスタックのインデックスを、 参照の文字列表現をキーにしたハッシュに格納して検索するようにしている。

[prev|next]20020809Fr

昨日までに作ったモジュール CSDBM であるが、 考えてみたら循環参照だけではなく、 ひとつのオブジェクトへ複数の参照があった時に同じ状態に復元できないという問題があった。 非常に単純な例で例えれば $a = \'c'; $b = [ $a, $a ]; である。 実際にはこの程度の例であれば Perl 内部で最適化されて同等の状態に復元できると思う。 が、しかしこれがネストされたデータ構造だった場合、 保証できないような気がする。

そこで昨日のコードで undef を格納するところを、 参照を保存したスタックのインデックスを格納するようにした。 また、配列とハッシュだけでなく参照もスタックに保存した上、 重複する場合はスタックのインデックスを格納する。 そして復元する際には、 復元した参照、配列、ハッシュをスタックに保存していく。 そしてスタックのインデックスを読みこんだら、 復元する際に保存したスタックのインデックスに格納された参照を取り出せば良いわけである。 とりかかる前はずいぶんと面倒かと思ったが、 できあがってしまえば何だか簡単だった。

夜は友人に呼び出され芝居の話。 11 月くらいに芝居をやりたいんだそうだ。 本を見てみないとなんともいえないが、 あまり積極的にコミットする気がなかなか起きない。 よくてスタッフどまりかな。

その他、今やっている演劇の市民講座の訓練について議論。 前期からダンスをやっているけど、 それはどうかという意見。 ほかにやることがあるのじゃないかということらしいが、 簡単なダンスのステップも満足にできないのに、 発声とかスタチューとかやっても、 ただの自己満足で終わる気がするな。 発声も大事だけど、それ以前に舞台の上での居方というか、 身体性というものを獲得するほうが先なんじゃないか。 ダンスはバランス・柔軟性・リズム感・瞬発力・表現力を養うことが出来ると思うんだけどな。

[prev|next]20020810Sa

ここ数日の行動の記録を思い出しつつまとめる。 もう一ヶ月も書いていなかった。

父方の伯父の訃報。 午前 4 時ごろ逝ったそうだ。 昨年肺ガンが見つかってから 1 年持たなかった。 祖父同様ヘビースモーカだったからな。 しかし父はまったくすわない。 その影響か自分も今まですったこともなし。

ネット散策していると、 VJE-Delta の新 OS 対応の発売前の評価版が公開されているのを知る。 待ってました。 早速ダウンロードしてインストールしてみる。 なかなかよい感触。 ただ、DOS 版の頃にあったべた書き変換モード時に自動確定されなくなっていた。 ある程度入力するとそれ以上文字を受け付けなくなる。 それとも以前からこうだったか。 ちょと自信がなくなる。

[prev|next]20020811Su

「太鼓鳴らして笛吹いて」観劇。 背景に古びた原稿用紙の垂れ幕、 また緞帳にも。 緞帳には林芙美子の直筆か、手書きの文字を照明で当てていた。 またこったことをするものだ。 休憩をはさんで 3 時間。 なかなか楽しめた。 しかし、井上ひさしは、 戦時中のミュージカル仕立ての芝居が多いね。 それに泣かせるつぼをよく知っている。 それをさらりと書き流しているところがうまいと思った。

終了後、バラシの手伝い。 トラックに荷物を運んでいる途中で、 大竹しのぶが近くを歩いていてこちらに手を振っていた。 思わず会釈してしまう。 なんか自分の中で彼女の評価が逆転してしまった。 なんていい人なんだ。