Arkによるサンプルアプリケーションですが、病気明けのリハビリを兼ねて、純モデル部分の実装イメージを一通り作りました。といってもトランザクションにすべきところを単純順次処理にしていたりと、まだまだ抜けはいっぱいあります。それが済めばようやくArkとModelの話が出来そうです。
- http://eorzea.asia/links/script/simplelinks.cgi
- スクリプト(以前のものとほぼ同じで、CGIでArkを稼働したもの)
examples/app/p5-ark-sample-simplelinks/tool/initialization.pl- DBに食わせるコマンド用スクリプト
examples/app/p5-ark-sample-simplelinks/SimpleLinks.data.yml- 実際に食わせる元ネタ
上記は、CLIでYAMLからDBに突っ込んだウェブサイトの、最初(ID = 1)のものを表示した結果です。主に負のベクトルを持つ人徳の成せる業(笑)か、会社の後輩に「本当にArkで動かしているのか、単にそれっぽいYAMLファイルをベタに表示しているだけではないのか」というあらぬ疑いを掛けられたので、念のため補足しておきます。
ところで、基本的にYAMLはYAML::Syckでのみ読み書きする人生を送っていたのですが、ちょっと色気を出してYAML::Anyに対応しようとして、UTF8フラグ周りで足下をすくわれました。
つまづいたのは、何も考えずに使っていたら「たまたま」何もせずにエンコードをよしなに取り計らってくれるようなYAML::Anyの採用順が働いていたという点です。食わせるデータが腐っていたので環境を変えたらDBの作成・検索に失敗していたという、何とも情けないことをしてしまいました。委細は以下の通りです。
ものぐさ党員のUTF8フラグ付与方法
Perlのエンコーディング周りの鉄則は、どこでも書かれていることですが、入れるときにデコード・出すときにエンコードです。しかし、都度そのようにデコードして回るのが大変なことがあります。具体的には、正に今回のようなYAMLで設定を読むような場合です。
対応しなければならないと思ったという記憶はありますが、前述の通り、すっかり忘れてしまった上に、忘れたままでも動いていたという恐ろしい状態が続いていました。流石にそれでは環境を変えて動かなくなるのは当然です。
ということで、まだYAML系全種の対応をテストしたわけではありませんが、取り敢えずそれっぽい処理を入れて、いくつかの環境(YAML::Anyにより採用されるいくつかのモジュール)で問題なく動くような振り分けを(examples/app/p5-ark-sample-simplelinks/tool/initialization.plへ)入れておきました。要は%INCを見て、YAML::Anyが選出したYAML処理モジュールを判別しているということです。
なお、補足ですが、YAML::Syckでlocal $YAML::Syck::ImplicitUnicode = 1;するという方法が一番楽です。ところが無印YAMLなどではそれらのスイッチはありませんので、これもまた慣用句である「一旦Dumpしてutf8::decodeしてそれをLoadする」という方法を採っています。いずれも、いちいちバイト列をUTF8文字列にせずに、YAMLファイルを読んでPerlのデータ構造体にした時点で、各要素がUTF8文字列になっていると、エンコード周りの記述を散らかさずに済むという利点があります。
コメントする