年末年始の作業

2015年12月25日から2016年1月3日まで、さくらのレンタルサーバで15年ぐらいメンテナンスしている掲示板の刷新を行った。

元の掲示板は Perl で実装してあって、古い掲示板にありがちなヒアドキュメントで HTML を出力する形式になっていて、メンテナンスが非常につらい。もともと Perl は得意だったんだけど、仕事で使わないのでどんどんスキルが落ちていき、今では調べながらじゃないと書きたいことが書けない。

ということで、年末年始は時間があったので Perl をやめて Haskell で再実装した。

まずは、以下。

ずっとさくらのレンタルサーバ上で Haskell を動かす環境を作ろうと思っていたんだけど、これがようやくきちんと完成した。

Haskell が動くようになったら cgi: A library for writing CGI programsCGI として実装。アプリケーションサーバが動かせればもっとモダンに作れたのだと思うけど、レンタルサーバなので致し方ない。CGI でも Haskell が動くだけよしとする。

Perl で実装した時は、データはすべてファイルに溜め込んでいたけど、Haskell で再実装する際にはレンタルサーバで提供されている MySQL を使用することにした。使用したのは mysql-simple: A mid-level MySQL client library.。どんなにデータがあってもデータベースに突っ込んでクエリで取り出せるというのは素晴らしい。Perl で実装していた時はある程度の件数でファイルを分割していたので、何をするにしても非常にややこしかった。

CGI が HTML を生成して返すか REST API を用意して Ajax で通信するか迷ったけど、掲示板ユーザの環境を見ると古いブラウザや古いスマートフォンを使用している人はあまりいないので、後者にした。

API のエンドポイントは、独立した実行ファイルを用意するようにしたけど、ひとつにまとめたほうが良かったかもしれない。エンドポイントは 10 数個になってしまい、ひとつひとつの CGI は小さくて良いんだけど見通しがあまり良くない。

フロントエンドは、タブレットスマートフォンでも使いやすくしたいという狙いがあったので、レスポンシブデザインを取り入れた。React を使えばフロントエンドでも react-haskell: Haskell React bindings を使用して JavaScript ではなく Haskell でコードを書けるんだけど、休み中に完成しなそうなので、慣れている Bootstrap を用いて JavaScriptjQuery を使うことにした。

年末年始で 50 時間ぐらい実装に費やしたけど、完成度は 80% ぐらい。内訳は:

  • レンタルサーバ上に環境を構築する調査および構築: 10 時間
  • MySQL バックエンド: 5 時間
  • CGI エンドポイント: 15 時間
  • HTML5 フロントエンド: 20 時間

という感じだろうか。とにかくフロントエンドに時間がかかる。逆にバックエンドは非常に簡単。ちょっとだけ悩んだのが、データベースの型と Haskell の型。Persistent entity syntax · yesodweb/persistent Wiki · GitHub を見れば解決した。CGI フロントエンドは、つまらないハマりをしてしまって時間をロスした。バックエンドは cabal repl で動作確認が簡単に行えるんだけど、エンドポイントはブラウザなり curl なりで叩かないとならないので面倒というのと、エラーが発生した場合エラーログを見れば原因がわかるんだけど、さくらのレンタルサーバの場合、前日のエラーログが翌日 0:06 ぐらいに $HOME/log に配置されるようになっていて、すぐにはエラーログを確認できないことなどがある。ちなみに、つまらないハマりというのは、バックエンドをデバッグ中に putStrLn でデバッグ出力を行ったコードを消し忘れて、その関数をエンドポイントから呼び出してしまうことで、そのデバッグ出力がレスポンスとして扱われてしまい、500 Internal Server Error が発生するというもの。

完成したら GitHub に置く予定。