Craftworks Tech Blog - Branch このページをアンテナに追加 RSSフィード Twitter

2014-03-11

FormValidator::Lite で Xslate のテンプレートの文法チェックをする方法

| 08:57 | FormValidator::Lite で Xslate のテンプレートの文法チェックをする方法を含むブックマーク FormValidator::Lite で Xslate のテンプレートの文法チェックをする方法のブックマークコメント

そこそこ大きい Web アプリを作ってると非エンジニアに管理画面でテンプレート編集させたりするケースもあると思いますが、文法チェックをしないと、テンプレートレンダリングできないがためにシステムがコケるとかいう悲しい事態が起こったりするので、チェックを通ったもののみ保存したいというニーズもたまにあると思います。

そこで、ヴァリデーターをかましてチェックすることにしてみました。

package MyApp::FormValidator::Constraint;
            
use strict;
use warnings;
use FormValidator::Lite::Constraint;
use Text::Xslate;
use Try::Tiny;
            
our %ErrStr;
my $xslate = Text::Xslate->new;
            
rule 'CAN_RENDER' => sub {
    return try {
        $xslate->render_string($_);
    } catch {
        $ErrStr{'CAN_RENDER'} = $_;
        return 0;
    };
};

1;

こんな Constraint クラスをこしらえて、

FormValidator::Lite->load_constraints(qw/Email +MyApp::FormValidator::Constraint/);

my $validator = FormValidator::Lite->new(...);
$validator->check(
    'template' => [ 'NOT_NULL', 'CAN_RENDER' ],
);

テンプレートエラーメッセージも後から参照したかったりするので、とりあえず$MyApp::FormValidator::Constraint::ErrStr{'CAN_RENDER'} に Xslate が吐くエラーメッセージ突っ込んでおきましたが、相当ダサいのでもうちょっとスマートな方法で実装したいです。

2013-10-18

Ubuntu に公式レポジトリの nginx を入れる

| 14:48 | Ubuntu に公式レポジトリの nginx を入れるを含むブックマーク Ubuntu に公式レポジトリの nginx を入れるのブックマークコメント

Ubuntu 12.04 LTS でデフォルトで入る nginx パッケージは現時点(2013/10/18)でバージョン 1.1.19 と大分古いです。最新バージョンは 1.4.3 なのでレポジトリapt に登録します。

sudo add-apt-repository ppa:nginx/stable

あとは、普通にインストールするか、既にインストールされていれば下記でアップグレード可能です。

sudo apt-get update
sudo apt-get upgrade

2013-02-15

nginx + php5-fpm で真っ白なページしか表示されない時の対処

| 02:05 | nginx + php5-fpm で真っ白なページしか表示されない時の対処を含むブックマーク nginx + php5-fpm で真っ白なページしか表示されない時の対処のブックマークコメント

大分ハマりました。

ubuntu/12.04
nginx/1.2.7
php5-fpm/5.4.6

結論から書くと、Nginx 公式のリポジトリから取得したパッケージには、fastcgi_param 用の設定がデフォルトで一通り入っていますが、いくつか記述が無いものもあります。

下記の PATH_TRANSLATED を追加したら無事動きました。

fastcgi_param PATH_TRANSLATED   $document_root$fastcgi_path_info;

「nginx php5-fpm blank page」などググったら色々出てきますが、PATH_TRANSLATED に直接触れているのは少なかったです。

2013-01-19

Ti.Filesystem.File で知らないとハマること

| 23:25 | Ti.Filesystem.File で知らないとハマることを含むブックマーク Ti.Filesystem.File で知らないとハマることのブックマークコメント

Ti.Filesystem.resourcesDirectory は read-only です。

シミュレーターだと書き込みできてしまうため、実機でハマります。

https://wiki.appcelerator.org/display/guides/Filesystem+Access+and+Storage

Ti.Filesystem.resourcesDirectory: A read-only directory where your application resources are located; this directory corresponds to the project/Resources directory in Titanium Studio. The contents of this directory persist until the user uninstalls the application.

applicationDataDirectory とか使えってことですね。

ガイド読んでたら気付きましたが、API リファレンスの方にも書いてありました。

2013-01-11

ImageView.addEventListener('load', listener) する時に無限ループする場合があるので注意

| 21:06 | ImageView.addEventListener('load', listener) する時に無限ループする場合があるので注意を含むブックマーク ImageView.addEventListener('load', listener) する時に無限ループする場合があるので注意のブックマークコメント

var listenerImage = function(e) {
  var image = e.source;
  var blob  = image.toBlob();

 // blob.imageAsResized() とか適当な画像処理

  image.image = blob;
};

var image = Ti.UI.createImageView({ image: imageUrl });
image.addEventListener('load', listenerImage);

みたいなことをしていると、ImageView の image プロパティを書き換えた時に、また load イベントが発火するので、どこかでイベントリスナーを解除しておかないと無限にループします。リサイズ処理させていたら画像がどんどん小さくなるアニメーションをしたので気付きました。

リスナー関数の中で自分自身を指定するには下記で行けます。

e.source.removeEventListener('load', arguments.callee);

これで、イベント発火したときにイベントリスナー解除できるので、最初の1回だけ実行することができます。