2006/09/25
TTでFragment Cache(2)
やってみると、簡単であった。。。
書式的に直感的じゃないところがあるけれど、今回はこれでいいのではという。。。
Perl:
TT:
[% END %]
[% # 1800秒間、parts1の内容をキャッシュ。%]
[% 'parts1' | partial_cache(cache_key1, 1800) %]
これで、部分的にページの一部だけを切り分ける需要には耐えられるはず。PROCESS とか INCLUDE とかのdirectiveを拡張できれば、最後みたいなわけのわからない書き方をせずにすんだのに。もしくは、FILTER が出力時だけじゃなくて、入力時にも割り込めればもっと分かりやすい書き方ができるのに、とかいろいろ不満はありますがこのあたりで妥協しておきます。。
キャッシュしたい部分を、partial_cache() を呼び出す前までにMACROで囲っておかないといけないあたりは、先日説明したとおりの理由からです。
工夫って言えそうな点は、
を使って、テンプレートごとに自動的にキャッシュの名前空間を切り分けるようにした所くらいか。。。
書式的に直感的じゃないところがあるけれど、今回はこれでいいのではという。。。
Perl:
use Cache::Memcached;
sub partial_cache_filter {
my($context, $key, $ttl)=@_;
$key = join("::", __PACKAGE__, 'partial_cache_filter', $context->stash->get('component')->name, $key);
return sub {
my $text=shift;
my $cache = Cache::Memcached->new(...init....);
my $content;
unless( $content = $cache->get($key) ){
$content = $context->stash->get($text);
$cache->set($key, $content, int($ttl) || 30*60);
warn "$key was saved.";
}
return $content;
}
}
use Template;
my $tmpl = Template->new;
$tmpl->add_option(
FILTERS => { partial_cache => [\&partial_cache_filter, 2] },
);
TT:
[% MACRO parts1 BLOCK %]
- [% i %]
[% FOREACH i = list1 %]
[% END %]
[% END %]
[% # 1800秒間、parts1の内容をキャッシュ。%]
[% 'parts1' | partial_cache(cache_key1, 1800) %]
これで、部分的にページの一部だけを切り分ける需要には耐えられるはず。PROCESS とか INCLUDE とかのdirectiveを拡張できれば、最後みたいなわけのわからない書き方をせずにすんだのに。もしくは、FILTER が出力時だけじゃなくて、入力時にも割り込めればもっと分かりやすい書き方ができるのに、とかいろいろ不満はありますがこのあたりで妥協しておきます。。
キャッシュしたい部分を、partial_cache() を呼び出す前までにMACROで囲っておかないといけないあたりは、先日説明したとおりの理由からです。
工夫って言えそうな点は、
$context->stash->get('component')->name;
を使って、テンプレートごとに自動的にキャッシュの名前空間を切り分けるようにした所くらいか。。。
2006/09/23
TTでFragment Cache(1)
RoRには、テンプレートの一部をキャッシュに突っ込める機能がある。
みたいに書くと、cache do からendまでの間がキャッシュに入り2回目からはexpireするまでキャッシュのものを使う仕組み。
TTにも、Template::Plugin::Cacheみたいなものがあったけれど、これはキャッシュにしたい箇所を別のテンプレートファイルに分けなきゃらなくて、そのページでしか使われないその部分だけをキャッシュするにはちょっと荷が重すぎ。
なんでRailsで上のようなことが簡単にできるかというと、do~end間が遅延評価されるから。
Fragment Cacheの仕組みを実現するには、
そこで、TTで遅延評価されている箇所や構文がないか調べてみると、MACROが近いものそうということに気づけました。
は、StashというTTの変数を扱うための構造へ変換され、partialとvariableは同列の変数情報として扱われる様子。
コンパイルされると、
という構造へ展開されます。sub{} があるので、このpartial変数は呼び出されるまで実行されないことになります。つまり、MACROは遅延評価ができる構造になってる。
TTでFragment Cacheの仕組みを実現するには、MACRO化されたエリアを呼び出してキャッシュの管理を行うプラグインを書けばよさそうということに。
来週がんばって作れればいいけれど。。。
Hello <%= @name %>
<% cache do %>
All the topics in the system:
<%= render_collection_of_partials "topic", Topic.find_all %>
<% end %>
みたいに書くと、cache do からendまでの間がキャッシュに入り2回目からはexpireするまでキャッシュのものを使う仕組み。
TTにも、Template::Plugin::Cacheみたいなものがあったけれど、これはキャッシュにしたい箇所を別のテンプレートファイルに分けなきゃらなくて、そのページでしか使われないその部分だけをキャッシュするにはちょっと荷が重すぎ。
なんでRailsで上のようなことが簡単にできるかというと、do~end間が遅延評価されるから。
Fragment Cacheの仕組みを実現するには、
- まず、<% cache %>に処理が移る
- <% cache %>がキャッシュするものを使うか、新たにレンダリングが必要か判別
- レンダリングが必要な場合は、do end ブロックの処理を実行
- 結果をキャッシュした後、表示
そこで、TTで遅延評価されている箇所や構文がないか調べてみると、MACROが近いものそうということに気づけました。
[% MACRO partial BLOCK %]
Text [% variable %]
[% END %]
は、StashというTTの変数を扱うための構造へ変換され、partialとvariableは同列の変数情報として扱われる様子。
コンパイルされると、
$stash->set('partial', sub {
});
という構造へ展開されます。sub{} があるので、このpartial変数は呼び出されるまで実行されないことになります。つまり、MACROは遅延評価ができる構造になってる。
TTでFragment Cacheの仕組みを実現するには、MACRO化されたエリアを呼び出してキャッシュの管理を行うプラグインを書けばよさそうということに。
来週がんばって作れればいいけれど。。。
2006/09/20
ブログタイトル変更
今日「やめるブログ」という名言を聞いてしまったので、ブログの名前をこれにすることにした。
2006/09/19
ActionMailerと格闘
ActionMailerに苦しめられた3日間だった。。。
http://wota.jp/ac/?date=20050731#p05
を参考に、メールを受信してから添付された画像を取り出すというのを作ってみてた。
この辺りで、base64なんかを勝手にほどいて、さらに文字コードの変換を勝手に行っているおかげで、画像データまでutf-8に変換されてたぽい。
実際には、1.1.2でほげってるんだけど、1.1.6でも直ってないぽい。
おかげで、変換に失敗した1バイトの文字列だけが返ってきて謎が深まりまくってた。
TMail::Mail.body_port.string か、TMail::Mail.quoted_body で生のまま直接取って返すだけでいいのにと思って、lib/action_mailer/vendor/tmail/attachments.rb の該当行を否定する感じで
に書き換えると、すんなりうごいた。
他の人たちは、どうやってるんだ??他の解決策があるのか??
lib/action_mailer/vendor/tmail/quoting.rbが原因ぽいが、オーバースペックというか面倒見すぎな気がする。
http://wota.jp/ac/?date=20050731#p05
を参考に、メールを受信してから添付された画像を取り出すというのを作ってみてた。
この辺りで、base64なんかを勝手にほどいて、さらに文字コードの変換を勝手に行っているおかげで、画像データまでutf-8に変換されてたぽい。
実際には、1.1.2でほげってるんだけど、1.1.6でも直ってないぽい。
おかげで、変換に失敗した1バイトの文字列だけが返ってきて謎が深まりまくってた。
TMail::Mail.body_port.string か、TMail::Mail.quoted_body で生のまま直接取って返すだけでいいのにと思って、lib/action_mailer/vendor/tmail/attachments.rb の該当行を否定する感じで
content = part.body_port.string # unquoted automatically by TMail#body
に書き換えると、すんなりうごいた。
他の人たちは、どうやってるんだ??他の解決策があるのか??
lib/action_mailer/vendor/tmail/quoting.rbが原因ぽいが、オーバースペックというか面倒見すぎな気がする。
ラベル: ActionMailer, rails
2006/09/14
ProxyPass, ProxyPassReverse, RewriteRule [P]
apache2.2とちょっとばかり格闘中。
すでに2.2化されているのもあるので、その辺を参考にしてやったりしてるんだけど、balancerの設定でいくつかよく分からないところがあった。
ソース読むと、ProxyPassでbalancer:// はつかえるが、ProxyPassReverseは使えないという結論に。
あとは、
RewriteRule ^/(.*) http://balancer/padding/$1 [P,L]
と
ProxyPass / http://balancer/padding/
は、同意だったんだけれど、apache2.2からはProxyPassの方が指定できるProxy関連オプションが多いので、ProxyPassのほうがいいのかなぁとおもったり。
すでに2.2化されているのもあるので、その辺を参考にしてやったりしてるんだけど、balancerの設定でいくつかよく分からないところがあった。
ソース読むと、ProxyPassでbalancer:// はつかえるが、ProxyPassReverseは使えないという結論に。
あとは、
RewriteRule ^/(.*) http://balancer/padding/$1 [P,L]
と
ProxyPass / http://balancer/padding/
は、同意だったんだけれど、apache2.2からはProxyPassの方が指定できるProxy関連オプションが多いので、ProxyPassのほうがいいのかなぁとおもったり。
2006/09/06
MLとFeed
MLは大体ROM派なので、特にメーラで読まなくても何とかなりそうなことに今頃気づく。
Feedが流行っているので、お気に入りのreaderでタイトルとサマリだけ読みたいんだけれど、MLのリポジトリであまりRSSやAtomをサポートしているって言う話を聞かない。
と思って見ていると、googleのGroupsでMLやらを運営しているところのはFeedが出てるんですね。これは便利。
他の有名所で、自家製MLマネージャを使ってたりするところとかは、どうやってfeed化すればいいだろうか。
Feedが流行っているので、お気に入りのreaderでタイトルとサマリだけ読みたいんだけれど、MLのリポジトリであまりRSSやAtomをサポートしているって言う話を聞かない。
と思って見ていると、googleのGroupsでMLやらを運営しているところのはFeedが出てるんですね。これは便利。
他の有名所で、自家製MLマネージャを使ってたりするところとかは、どうやってfeed化すればいいだろうか。
2006/09/03
Rails Trac
ここ数週間なぜか各ページのリンクが消えていたRails Tracだけど、昨日覗いたら普通に戻ってた。いったいなんだったの??
ソース見ながら作業しているので、やむにやまれずhttp越しの装飾のないリポジトリを覗いてたけど、いまいち。
svnとTrac用のサーバを新しくしたときの影響??
ソース見ながら作業しているので、やむにやまれずhttp越しの装飾のないリポジトリを覗いてたけど、いまいち。
svnとTrac用のサーバを新しくしたときの影響??
cometサポート
Ajaxian » Opera 9 Streaming Support
によると、Operaでも9からapplication/x-dom-event-streamによるストリーミングがサポートされているらしい。
この辺の詳しいことは、WHAT-WGに書いてあるとも書いてあった。WHAT-WGなんて、canvasの事を調べてたとき以来見てねー。
今月のWEB-DB Press vol.34にもCometの事が書いてあったけど、IEまでサポートすることを考えるとまだ混沌としている様子。。
でも、これでGeckoとOperaがapplication/x-dom-event-streamをサポートできてるわけだから、streamingの本命は、application/x-dom-event-streamで決まりか。
によると、Operaでも9からapplication/x-dom-event-streamによるストリーミングがサポートされているらしい。
この辺の詳しいことは、WHAT-WGに書いてあるとも書いてあった。WHAT-WGなんて、canvasの事を調べてたとき以来見てねー。
今月のWEB-DB Press vol.34にもCometの事が書いてあったけど、IEまでサポートすることを考えるとまだ混沌としている様子。。
でも、これでGeckoとOperaがapplication/x-dom-event-streamをサポートできてるわけだから、streamingの本命は、application/x-dom-event-streamで決まりか。