CGIとしてRubyでメールフォームした。その後、立ちあがりが遅いのでSinatraで動くようにした。

CGIとしてRubyでメールフォームした。その後、立ちあがりが遅いのでSinatraで動くようにした。

最近バックトゥ基礎ということでC言語の学習やデータ構造、アルゴリズムの勉強をしていたのですが、そういえばCGI時代に生きてきたけどCGIで何かをつくったことがないと思い当たった。

それに、徳丸本やAPIの本、Railsガイドなどを読んでフレームワークが良い仕事をしていることを知り、それに乗っかって生きるのがベストプラクティスであることはわかったのだが、いや自分でもちゃんと書けた方がいいよねとなったのでメールフォーム作成するに至った。

未使用トークンの破棄とかの処理抜けてるけど、以下雑然としたメモ。

github.com

CGIでももちろん自動テストの威力が炸裂する

CGIがアクセスの都度全てを読み込むことを考えると、ペライチでコードを書いた方がよかったのかもしれないが、まぁええやろということでいつもの通り細かくクラスでファイルを分けていく。

細かく分けていくとテストがしやすいし、RailsでやってるノリでRSpecが書ける。

CGI作成の機微がつかめなくて何度も大きく書きかえたが、テストのおかげでわやにならずに済んだ。自動テスト最高。

リッチなライブラリはrequireだけで重い

一から作成するとはいえ、一からデータベース処理などを書くのはあきらかに前時代的で無駄な再発明だし、さすがに時間の無駄なのでactivevホゲ系のライブラリは積極的に使った。

しかし中でもActionMailerだけはrequireするだけで劇的に立ちあがりが重たくなる。0.5秒~1.0秒かかったので、requireはメール送信処理の直前に行うように変更した。

前準備CGIをわける

データベースに対するマイグレーション処理などもアクセスごとに判定していたのだが、さすがに無駄っぽいのでわけた。

設定を書いてアップして前準備.rbにアクセスして削除するという、なんだかCGIっぽい感じになった。

処理をクラスメソッドではなくインスタンスメソッドで行う

クラスメソッドでずらずらっとやってしまうのではなく、入力や設定を処理クラスに渡してnewした上で、それを走らせる。

CGIだから変数の残留とかそんなに考える必要はないんだろうけど、こっちの方が収まりがよかった。

後で行ったSinatra化もこれのおかげですんなり行えたと思う。

ちょっとコストをはらって早くするSinatra

サーバーとしてアクセスを待ちうけるから、立ちあがりの遅さがなくてよい。

Railsをバーンと立ち上げる規模の話じゃない小規模な処理でも、Sinatraでサーバーとして動かした方が速度とのバランス的によさそう。

テストを簡単にする目的でポストされたデータの処理やクッキーの処理は処理クラスの外に出していたので、Sinatraにはめるのもすんなりいって良かった。

オフラインモードを回避する処理をSinatra側に入れたら、CGIとしての動作もできるままでSinatra上でも動くようになった。めでたい。

横着したせいでHerokuではうごかなかった

SQLite使ってたんだけど、PostgreSQLに切り替える気力が残っていなかった。

とはいえ、せっかくHeroku入門を読み終えたのだからHerokuでも動く何かをつくりましょう。