復習: 以前のバージョン(Maxima on Web グラフ出力)では、CGIを呼び出すたびにMaximaを起動していてセッションを維持することができませんでした。
バックグラウンドでMaximaのプロセスを維持しようとすると、CGIスクリプトでは難しいので、ウェブアプリケーション化しました。
ウェブアプリケーションフレームワークにはRubyで書かれたSinatraを利用しました。
ソースコードは省略しますが、Maximaインターフェイスが91行、ウェブアプリケーション部分が44行でした。Sinatraすごいですね。
1つハッキングっぽいことをしたのでご紹介します。
バックグラウンドにMaximaのプロセスを複数起動しますので、サーバーを終了する際に、行儀よくプロセスを終了させたいです。
(Maximaは、行儀よく終了させないと、背後のLISPがパニックしたかのようにものすごく怒り続けます…)
END {}を書いたところ、Sinatraが起動する前に実行されてしまいました。メインプロセスはサーバーローンチ用になっているためです。
代わりにSinatra::Applicationクラスのプロセスが動いていて、これはINTなどのシグナルを受信するとスーパークラスBaseのquit!を実行します。
Applicationクラスにはquit!がなかったので、これ幸いと、quit!を追加してオーバーライドして、super実行後、後処理を追加しました。
Maximaセッションを維持するので変数や関数定義も活用できるようになって、また少しiPad上でも色々楽しめるようになりました。