読者です 読者をやめる 読者になる 読者になる

はちゅにっき

こっちのブログはまったり更新

「モダン Perl 入門」の入門

とりあえずメモ程度にー。

School Guardian をモダン Perl でつくったよ。

モチベーション

  • Catalyst 5.8 CataMoose でつくる
  • 特に API 化に力をいれる

その中の悩みや葛藤について説明していきます

使いたかった技術

local::lib で運用することで、5.7 と 5.8 を共存させたかった。
Catalyst を継承して App を作ることをしない。
$c (Context) を汚染するので Plugin はなるべくつかわない。
でも、ログインとセッション関連だけ Plugin つかったよ。

API 化までの試行錯誤

Controller にロジックを書くと見通しが悪いよね。
Model::Adaptor で1つ1つマッピングするのは大変。
Model::MultiAdaptor でいっきにマッピングするとカンタン。
Model の分離はできたけれど API の中身がごちゃごちゃになった。。。
そもそも API って何?
Wikipedia にも具体的には載ってない。
どうやら自分たちで決めていいみたいだ。

なんでぐちゃぐちゃなのか?

ロジックを書いている部分が Model から API に移動しただけじゃないか。
Web アプリは DB の呼び出しが多い。
DB処理と一連の処理の流れ、ビジネスロジックを整理すれば見通しがよくなるのでは?
CRUD の処理もビジネスロジックも 1API にしよう。

結果

API::Data クラス

  • DB 接続
  • SQL 発行

子クラスで CRUD 処理を書いてある。コネクションプーリングとかやっている。
子クラスはテーブル毎につくるやり方が(結果として)よかった。
必ず API::Data を通して CRUD 処理を発行するルールをつくった。
(DBIC の search とかを直接さわらせない)


API::Logic クラス

API クラス

  • API::Data / API::Logic の親クラス

呼び出し

Catalyst では Model として Mapping しているので Controller 側で API を Model として呼び出せば終わり。

まとめ

なんだかんだでリファクタリング 5回くらいした。
Catalyst 内で Moose の機能を使わないのであれば 5.7 でも 5.8 でもあまりかわらない。
Catalyst 内であまり処理を書かなくて済んだので Moose の機能を使うこともなかった。

おまけ?

スクリーンショットをとる機能がある。
ページ全体のスクリーンショットをとる。
どうやって実装するか?

  • Xvfb で仮想画面内にブラウザ立ち上げて保存する
  • FirefoxCanvas をつかう
    • メモリ不足になる場合がある

結論としては Canvas を使って分割キャプチャをした