このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

Catyスクリプトだけでノーロジック・アプリケーション

いつも使っているコンピュータがクラッシュしてCatyのチュートリアルも消失、ちょっとショック。中途でもbitbucketにpushしておきゃよかった、というのが教訓。

ソフトウェアだけをリリースして、説明の文書のほうは後追い、ってことになるかもしれません。でも、サンプルだけは昨日復元しました。次がメインとなるCatyスクリプト(リリース4仕様)。


/* fortune.cgi */

translate Birth |
when {
OK => {"input": pass,
"message": read-json /message.json | util:randchoice,
"today" : util:today
} |
print /fortune-resp.html,
NG => pretty | print --mode=text /fortune-error.html
}

NGに続くエラー処理は、 NG => print /fortune-retry.html とかで済むはずなんだけど、今まだうまくいかないので応急処置です。OKに続く正常処理のほうに注目してくださいな。

フォームの入力処理を一手に引き受ける translate

先頭の translate Birth により、POSTでやって来たデータがJSONに変換されます。Birthは型の名前ですが、型定義はスキーマファイル内で行われます。


type Birth = object {
// 人の名前
"person" : string (minLength = 2, maxLength = 20),
// 生年月日
"birth" :
object {
"year": integer(minimum=1900, maximum=2100),
"month": integer(minimum=1, maximum=12),
"day": integer(minimum=1, maximum=31),
}
};

日付に制約が入ってますが、2月31日とかを許ししてしまうので完全ではありません。そのうち、日付や金額などに関する制約を準備します。それと、そもそも型定義がカッタルイというのが実感なので、型定義(スキーマ)も不要にしようと思ってます。

ともかく、translateコマンドは、スキーマの型定義を見てPOSTデータを対応するJSONデータにしてくれます。エラーがあればエラー情報を生成するのですが、適切なエラー情報とは何かがまだ未確定。

占いつうか、おみくじつうか

レスポンスで返されるHTMLページfortune-resp.htmlはこれ:

<html><!-- -*- coding: utf-8 -*- -->
<?caty-meta template="smarty" ?>
 <head>
  <title>Fortune resp</title>
 </head>
 <body>
  <h1>生年月日占いの結果</h1>
  <p>
    {$input.birth.year}年{$input.birth.month}月{$input.birth.day}日生まれの
    {$input.person} さんの
    {$today.year}年{$today.month}月{$today.day}日の運勢は: {$message}
  </p>

 </body>
</html>

テンプレート展開のコンテキストとなるJSONデータは次のようにして生成しています。


{
"input": pass,
"message": read-json /message.json | util:randchoice,
"today" : util:today
}

コマンドの機能だけ列挙しておくと:

  1. pass -- 何もしないで入力そのまま
  2. read-json -- ファイルからJSONデータを読む
  3. util:randchoice -- 配列の要素をランダムに1つ選ぶ
  4. util:today -- 今日の日付データを出力する

ビジネスロジック

Webアプリケーションのビジネスロジック(アプリケーションロジック)は、Catyスクリプトでは書けません。だから、ビジネスロジックはきちんと分離して汎用言語で書いてください(厳密分離)というのがCatyのスタンスです。

しかし上の例では、これといったビジネスロジックはないので、Catyスクリプトと標準コマンドだけで書けます。強いて言えば、read-json /message.json | util:randchoiceビジネスロジック(占い/おみくじ)でしょうか。

このインチキ占いは例外で、通常は、アルゴリズムを伴なうビジネスロジックの記述には汎用言語が必要です。しかし、簡単なストレージ処理なら、やっぱりCatyスクリプトだけでもいいんじゃないの、というのが「Catyリリース4がまだなのに、リリース5, 6の話」です。

さて、不幸な事故はありましたが、気を取り直してリリース準備。