Hatena::ブログ(Diary)

brownmush.net このページをアンテナに追加 RSSフィード

2011-08-09 PostgreSQL勉強会@札幌 2011-08-09 このエントリーを含むブックマーク

PostgreSQL勉強会札幌で話をしてきました。

DBの問題をDBレイヤーで解決する試みだと思って見てください。


個人的には、一意な部分インデックスくらいは張っといてほしいと思いますが、TRIGGERやRULEを駆使されたDBは正直めんどかなーと思います。


どの方法もキー更新もトリガーもそれにかかるコストの問題は残ってますね。

当日は、「別表に削除データを追い出せば、INDEXのサイズを抑えられる。」という意見があったり、「高コストな削除処理は、削除フラグだけ立てて深夜のバッチで回収する」という話もしました。結局どこかとのトレードオフになるんだと思います。


あと、スライドにはありませんが、当日はORM的な解決法(soft-delete系plugin)にも軽く触れてます。

SE-PostgreSQLの話はごくごく簡単な紹介だけしました。

削除データのテーブルに継承を使うという話もしました。


あとで気づいたんですが、43ページのエントリーテーブルのデータにマイナスのものがありますがプラスの間違いです。


削除フラグ宗教ですね。思想が合わないからと言って争わないでください:)

2011-06-09

ほむほむ

ほむほむ言わせるのが流行ってるみたいですね。

言語を作る気はさらさらないので、手っ取り早くperlのフィルター使ってほむほむしちゃえばいいんじゃね?ってことでAcme::Buffyをパクってこんな感じでしょうか?

package Acme::Homura;
use strict;
use warnings;
our $VERSION = '1.5';

my $horns = "ほむ " x 2;

sub _slay {
    my $willow = unpack "b*", pop;
    my $demons = $horns;
    foreach ( split //, $willow ) {
        $demons .= $_ ? 'ほむほむほむ ' : 'ほむほむ ';
    }
    return $demons;
}

sub _unslay {
    my $demons = pop;
    $demons =~ s/^$horns//g;
    my @willow;
    foreach ( split / /, $demons ) {
        push @willow, /ほむほむほむ/ ? 1 : 0;
    }
    return pack "b*", join '', @willow;
}

sub _evil {
    return $_[0] =~ /\S/;
}

sub _punch {
    return $_[0] =~ /^$horns/;
}

sub import {
    open 0 or print "Can't rehomura '$0'\n" and exit;
    ( my $demon = join "", <0> ) =~ s/.*^\s*use\s+Acme::Homura\s*;\n//sm;
    local $SIG{__WARN__} = \&evil;
    do { eval _unslay $demon; exit }
        unless _evil $demon and not _punch $demon;
    open my $fh, ">$0.homu" or print "Cannot homura '$0'\n" and exit;
    print $fh _slay $demon and exit;
    return;
}
1;

Hello World!を出力するならこんな感じで書いたファイルを保存して

ほむ ほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほ む ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむ ほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほ む ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほ むほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほ むほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむほ む ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほ む ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほ むほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむほむ ほむほむ ほむほむ ほむほむ ほむほむ

でもって、こう。

$ perl -MAcme::Homura ./test.pl.homu
Hello World!

めでたしめでたし。


ちなみに上のコマンドは、素のperlスクリプトに対して実行すると、XXXX.homu というファイル名でほむほむコードに変換したファイルを出力します。

上のほむほむ言ってるコードの元はこれです。

#!/usr/bin/perl

print "Hello World\n";

ほむほむの代わりに猫マナーだとこんなのも可能。

猫マナー 猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫 マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ー ナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫 マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ー ナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ー ナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ー ナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ー ナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫 マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ー ナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ー ナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫 マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ー ナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ー ナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ー ナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫 マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫 マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ー ナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 猫マナー猫マナー猫マナー ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫 ーナマ猫ーナマ猫ーナマ猫

2009-03-18

第02回北海道情報セキュリティ勉強会(セキュポロ)が開催されますよ

近隣の人たちはこぞって参加するといいとおもうよ!

前回も濃かったけど、今回もきっと濃いよ!

2009年04月11日(土曜日)だよ!


アナウンス&参加登録はこちらから

http://secpolo.techtalk.jp/2ndworkshop


もしかするとおやつもあるかもよ!(゚∀゚)

2009-01-20

ActionFromからtemplateを生成するプラグイン(β)

しばらくご無沙汰してました。

で、いきなり本題ですが、ActionFromを定義したら、templateファイルくらいは自動で生成してほしいと思いませんか?

そんなものぐさなあなたに送るプラグインです:)


以下ではプラグインインストールした場合の動作について説明します。

プラグインダウンロード先とインストール方法は最後に記載してます。

素のEthnaの挙動では無いので勘違いしないようにしてください。

概要

このプラグインを導入すると、ActionFormに定義した内容でtemplateファイルを出力することができるようになります。

使い方

1. actionの作成

例として、ユーザがプロフィールを入力する画面を想定します。入力項目は「姓」「名」「ニックネーム」「性別」にします。

まずはいつも通りの手順でアクションを作成します。

ethna add-action profile_add
ethna add-action profile_add_do

user_addがフォームを表示するactionで、user_add_doが入力値を受け取るactionになることを想定しています。

2. ActionFormの編集。

いつも通りの手順でuser_add_doを編集して、フォームから受け取る値を定義します。

ここでは以下のようなActionFormを定義します。

<?php
class APPID_Form_ProfileAddDo extends APPID_ActionForm
{
    var $form = array(
        'lastname' => array(
            'name'          => '',
            'required'      => true,
            'type'          => VAR_TYPE_STRING,
            'form_type'     => FORM_TYPE_TEXT,
        ),
        'firstname' => array(
            'name'          => '',
            'required'      => true,
            'type'          => VAR_TYPE_STRING,
            'form_type'     => FORM_TYPE_TEXT
        ),
        'nickname' => array(
            'name'          => 'ニックネーム',
            'required'      => true,
            'type'          => VAR_TYPE_STRING,
            'form_type'     => FORM_TYPE_TEXT,
        ),
        'sex' => array(
            'name'          => '性別',
            'required'      => true,
            'type'          => VAR_TYPE_INT,
            'form_type'     => FORM_TYPE_RADIO,
            'option'        => array(1 => '', 2 => ''),
        ),
   );
}
class APPID_Action_ProfileAddDo extends APPID_ActionClass
{
    function prepare()
    {
        if ($this->af->validate() > 0) {
            return 'profile_add';
        }
        return null;
    }
}
?>
3. プラグインの実行

これでプラグインを実行する準備は完了しました。templateファイルを自動で生成する為に以下のコマンドを実行してください。

第一引数プラグイン名、第二引数がターゲットとなるテンプレート名、第三引数が先ほど作成したActionFormのアクション名になります。

ethna build-form profile_add_do profile_add

以上で完了です。

4. 動作確認

ブラウザからprofile_addにアクセスすると、以下の画面が表示されます。これはプラグインによって自動生成されたページです。

f:id:syachi5150:20090120222725j:image

バリデーションでエラーが発生した場合は、以下の画面が表示されます。

f:id:syachi5150:20090120222726j:image

で、何が起きたの?

このプラグインを実行すると、user_add_doのActionFormに設定された内容で、user_addのtemplateを出力します。

出力されたテンプレートファイルは以下の様になります(抜粋)

    <body>
        <h1>profile_add</h1>
        <div class="buildform">

            {if count($errors)}
            <div class="errors">
                <p><em>Oops... the following errors were encountered:</em></p>
                <ul>
                {foreach from=$errors item=error}
                    <li>{$error}</li>
                {/foreach}
                </ul>
            </div>
            {/if}
            {form ethna_action="profile_add_do"}
            <fieldset>
                <legend>profile_add_do</legend>
                <div class="row">
                {if is_error('lastname')}
                    <label for="lastname" class="error key">{form_name name="lastname"}<em>*</em></label>
                    {form_input name="lastname" id="lastname" class="error"}
                {else}
                    <label for="lastname" class="key">{form_name name="lastname"}<em>*</em></label>
                    {form_input name="lastname" id="lastname"}
                {/if}
                </div>
                <div class="row">
                {if is_error('firstname')}
                    <label for="firstname" class="error key">{form_name name="firstname"}<em>*</em></label>
                    {form_input name="firstname" id="firstname" class="error"}
                {else}
                    <label for="firstname" class="key">{form_name name="firstname"}<em>*</em></label>
                    {form_input name="firstname" id="firstname"}
                {/if}
                </div>
                <div class="row">
                {if is_error('nickname')}
                    <label for="nickname" class="error key">{form_name name="nickname"}<em>*</em></label>
                    {form_input name="nickname" id="nickname" class="error"}
                {else}
                    <label for="nickname" class="key">{form_name name="nickname"}<em>*</em></label>
                    {form_input name="nickname" id="nickname"}
                {/if}
                </div>
                <div class="row">
                {if is_error('sex')}
                    <label for="sex" class="error key">{form_name name="sex"}<em>*</em></label>
                    {form_input name="sex" id="sex" class="error"}
                {else}
                    <label for="sex" class="key">{form_name name="sex"}<em>*</em></label>
                    {form_input name="sex" id="sex"}
                {/if}
                </div>
            <div class="buttonrow">
            {form_submit value="OK"}
            </div>
            </fieldset>
            {/form}
        </div>
    </body>

スケルトンファイルを編集するには

phpテンプレートなので、phpで記述してください。skelファイル名はbuild.form.tplです。

テンプレート内では以下の値が使用できます。

$formActionFormの内容(array)中身はvar_dump()してください:)
$macro内部値(array)中身は(以下略
プロジェクト固有のスケルトンファイルはプロジェクトのトップディレクトリ配下にあるskelディレクトリに配置することが出来ます。

先生!生成したコードが意味不明です

現状のプラグインに含まれるテンプレートは、エラーの項目に色を付けたりlabelを張ったりしてるので、わかりにくいかもしれません。 というわけで、まずはテンプレートをシンプルにしてみましょう。おおよそこんな感じになります。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=<?php echo $macro['client_enc']; ?>">
    </head>
    <body>
        <h1><?php echo $macro['action_name']; ?></h1>
        {if count($errors)}
        <ul>
            {foreach from=$errors item=error}
            <li>{$error}</li>
            {/foreach}
        </ul>
        {/if}
<?php foreach($form as $action_name => $defs): ?>
        {form ethan_action="<?php echo $action_name; ?>"}
        <table>
<?php foreach($defs as $key => $def): ?>
            <tr>
                <th>{form_name name="<?php echo $key; ?>"}</th>
                <td>{form_input name="<?php echo $key; ?>"}</td>
            </tr>
<?php endforeach; ?>
        </table>
        {form_submit value="OK"}
        {/form}
<?php endforeach; ?>
    </body>
</html>
プラグインを通して出力されるコードは以下の様になります。
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <h1>profile_add</h1>
        {if count($errors)}
        <ul>
            {foreach from=$errors item=error}
            <li>{$error}</li>
            {/foreach}
        </ul>
        {/if}
        {form ethan_action="profile_add_do"}
        <table>
            <tr>
                <th>{form_name name="lastname"}</th>
                <td>{form_input name="lastname"}</td>
            </tr>
            <tr>
                <th>{form_name name="firstname"}</th>
                <td>{form_input name="firstname"}</td>
            </tr>
            <tr>
                <th>{form_name name="nickname"}</th>
                <td>{form_input name="nickname"}</td>
            </tr>
            <tr>
                <th>{form_name name="sex"}</th>
                <td>{form_input name="sex"}</td>
            </tr>
        </table>
        {form_submit value="OK"}
        {/form}
    </body>
</html>

残念な話

ActionFormでrequiredの値が変更になった場合は、再生成する必要があります。理由はテンプレートファイルの生成時にrequiredの項目に「*」をつけているからです。

この問題を解決するにはrequiredの値を取得するsmarty_function_form_required()的なフォームヘルパを作成してtemplateからrequiredの値を取得すれば良いのでしょうが、そこまでは手をつけていません。 「*」が必要なければ、スケルトンファイルから該当箇所を削除してください。

イイワケをすると、method(GET/POST)の指定とか、enctypeとか、入力ヒントとか、フォーム名(例えば"請求フォーム"とかの和名) とかがActionFormで設定できて、それがtemplateにも反映されたり、templateファイルが存在しない場合は都度自動で生成できたり、いろいろムニャムニャできた方が幸せになれるかなーとは思うのですが、改造しまくってデフォEthnaから離れすぎるのもどうよ、と思って区切りのいいところでやめました:)

その他

ActionFormのテンプレートも通常通り利用可能です。

既存のアプリケーションに与える影響

テンプレートファイルを出力するだけなので、既存のアプリケーションへの影響はありません。

ダウンロード

2.5.0のpreview2で確認してます。PHP5でしかテストしていません。PHP4で動作したら教えてください:)
ダウンロードEthna_Plubin_BuildForm-0.0.tzg

インストール

ダウンロードしたファイルをEthnaインストールした先のディレクトリで展開してください。

既知のバグ

  • 引数のアクション名・テンプレート名が複数指定できてしまいます。有効なのは先頭の2つです。

ToDo

2008-11-07

Debian(etch)向けのEthna-2.5.0-preview2パッケージ

パッケージ管理はaptにお任せした方が幸せになれますよ。たぶん。

…という訳で、Debian(etch)向けEthna-2.5.0-preview2のdebパッケージを置いておきます。

インストール方法

sources.listの追加

/etc/apt/sources.listに以下の行を追加してください。

deb http://www.brownmush.net/pub/packages/debian/ ./
deb-src http://www.brownmush.net/pub/packages/debian/ ./

続いて以下のコマンドを実行します。(aptitudeを利用する方はapt-getをaptitudeに読み替えてください)

# apt-get update
インストール

以下のコマンドを実行します。

# apt-get install ethna

途中で以下のメッセージが表示されるので、yを入力して先に進んでください。

WARNING: The following packages cannot be authenticated!
  ethna
Install these packages without verification [y/N]? y

以上でインストールは完了です。

インストール時の注意

phpインストールされていない環境で上記コマンドを実行するとデフォルトでphp4をインストールしようとするので、php5を利用したい場合は以下のように明示的にphp5を指定します。

# apt-get install ethna php5 php5-cli

ソースの入手

パッケージをrebuildしたい場合は以下のコマンドでソース一式を入手してください。

# apt-get source ethna

パッケージを直接ダウンロードする

apt経由ではなくdebパッケージを直接ダウンロードしたい方はこちらからどうぞ。

URL

http://www.brownmush.net/pub/packages/debian/

依存関係

以下の依存関係を張ってあります。

PEAR依存しなくなったんじゃないの?というツッコミがありそうですが、EthnaクラスがPEARクラスに依存しなくなった…という意味なので、少なくともEthna_PearWrapper.phpPEARを呼んでいる以上、PEARを入れないとethnaコマンドが動きません。


あと、ethna add-projectを実行すると、デフォルトPEAR::DBを利用するので、php-db(いわゆるPEAR::DB)をdependsするかが悩ましいところなのですが、このパッケージではRecommends扱いにしました。もし、PEAR::DBが必要なら、下記のコマンドでインストールしてください。もちろん他のDBアクセスレイヤーを使用しても構いません。

# apt-get install php-db

その他

  • パッケージングの都合上、ソースに以下の修正を加えてあります。patchはソースパッケージに含まれます(dpatch形式)
  • Ethna_PearWrapper.phpはパッケージを分割してphp-pearに依存関係を張るようにしたり、DB周りも同じような考え方で分割したり等、改良の余地はあると思いますが、その辺りは正式リリースになってから考えます:)