WASHを使う

というわけで、WASHが使えるようになったので、
何か作ってみようということで、ツリー式BBSを作ってみた。

http://fxp.infoseek.ne.jp/tmp/bbs/Main.hs

外からアクセスできるLinuxサーバーが無いので、
実際にどのように動くのかをお見せできないのが残念だが、
まぁ、普通に動いている。


ときに、これを使っていて二つほど問題点に遭遇した。
まずひとつ。これは単にHaskellの問題だが、

hoge = do
  dat <- readFile "hoge"
  let newdat = process dat
  writeFile "hoge" newdat

これが意図したとおりに動かない。
もちろん意図はhogeというファイルの中身にprocessという関数をかませたいのだが、
これはwriteFileでこける。
fileがまだクローズされていないということで、
思わぬところで遅延IOの弊害が出てきた形だ。
かといって、

hoge = do
  h <- openFile "hoge" ReadMode
  dat <- hGetContents h
  hClose dat
  let newdat = process dat
  writeFile "hoge" newdat

これもいけない。
ファイルの中身がひとつも読み込まれないうちにクローズされるからだ。
じゃあどうすればいいの?
ということで、いろいろ考えて

hoge = do
  h <- openFile "hoge" ReadMode
  dat <- hGetContents h
  length dat `seq` hClose dat
  hClose dat
  let newdat = process dat
  writeFile "hoge" newdat

こうすると何とかうまく動いた。
しかし、入力を文字列として扱いたくないとき、
つまり、

hoge = do
  h <- openFile "hoge" ReadMode
  dat <- hGetContents h
  hClose dat
  let newdat = process $ read dat
  writeFile "hoge" $ show newdat

などとしたいときはうまくいかなかった。
(何でかはよくわからないが)
そういうわけで、結局どのようにしたかというと、
hGetContentsの遅延しない版を自分で作ることにした。
あらかじめ用意しておいてほしいような気もするが、
まぁ、そんなに大変なものでもないので、
別に良いのかもしれない。


もうひとつは、WASHがページに埋め込むデータが
ページの呼び出しレベルが深くなるにつれどんどんでかくなっていくこと。
それと、一画面のSubmitボタンの数が増えても爆発的にデータがでかくなる。
トップページに表示されるタイトルの数が10個ぐらいで
付加されるデータは20KBぐらい。
それが10回ぐらい再帰したら200KBにもなる。
これは尋常ではない数だ。
どうやらWASHは継続を保存する際にinteraction logを残すらしいのだが、
それが呼び出すごとにどんどんでかくなる。
これは困った。
どうやらサイズを抑えるための方法もあるようなのだが、
よくわからなかった。
わかるまで実用には使えない。大変だ。