« 2006年10月 | メイン | 2006年12月 »

2006年11月 アーカイブ

2006年11月 8日

TTのtable plugin

Template Toolkitでテーブル使うときはこんな感じかな

[% IF amazon_results.0 %]
  [% USE table(amazon_results, rows=4) %]
  <table>
  [% FOREACH cols = table.cols %]
    <tr>
  [% FOREACH item = cols %]
      <td>
      [% IF item %]
      <a href="[% item.url %]">
    <img src="[% item.ImageUrlMedium %]"  alt="[% item.ProductName %]" />
      </a><br /><a href="[% item.url %]">[% item.ProductName %]</a><br />
      [% item.publisher %] [% r.Media %] ([% item.ReleaseDate %])<br />
      売り上げランキング: [% item.SalesRank %]<br />
      [% END %]
    </td>
  [% END %]
    </tr>
  [% END %]
  </table>
[% ELSE %]

2006年11月 9日

Plaggerとは?

とある方に「Plaggerとは何だね?」と間接的に尋ねられたので、自分にとってももう一度Plaggerについて整理する意味でいろんなリソースを元にまとめてみました。ツッコミあったらくださいな。

Plaggerとは?

PlaggerとはPerlで書かれたPlugin拡張可能なRSS/Atomアグリゲータのことで、miyagawaさんを中心にオープンソースで開発が進められているソフトウェアです。

RSS/Atomアグリゲータとは言葉どおりRSS/Atomフィードをaggregate(集約)する アプリケーションのことで、一般的にはBlogなどで公開されているRSS/Atomフィードを 集めてきてなんらかの形で読めるようにするためのソフトを指します。 このようなアグリゲータとしての典型的なPlaggerの使い方は、 いくつかのRSSフィードを情報としてまとめて取得して、Gmailに転送して読むというものがあります。

もう一つのPlaggerの最大の特徴であるPlugin拡張可能な(=pluggable)という点 はどういうことかを説明します。Plaggerを大雑把に表現すると「『なにか』を入力して『ふがふが』して『どれか』に出力するもの」(otsuneさんの言葉より)ということができます。 簡単に言うとこの『なにか』とか『ふがふ』とか『どれか』にあたる部分がPluginというわけです。 Plaggerでは様々なPluginが用意されていてまた独自に開発することも可能になっています。 例を挙げると(これまたotsuneさんの例)数件のRSSフィードを入力元として読み込み、ただRSSの 概要だけじゃなくてそのページの全文を取得して(Filter::EntryFullTextプラグイン)、 さらにそこからHTMLタグを除去して(Filter::HTMLScrubberプラグイン)、重複したエントリーを 取り除いて(Filter::Ruleプラグイン)、出力として携帯用のHTMLに書き出す(Publish::CHTMLプラグイン)という具合です(実装はこれまたotsuneさんのはてな回答を参考にしてください)。これらPluginを組み合わせることによりRSS/Atomフィード及びそのエントリーを基本オブジェクトとして様々なことが実現できます。

Plaggerは実装としても「Plagger風なソフトウェア」という言葉があるくらいに、 特徴があったります。Plugin拡張可能な点もそうですが、設定ファイルをYAML形式で書いていく点や そのソフトウェアでなんでもやろうとする(考える)点や最先端とかということがあたるようです(松野徳大さんがShibuya.pmテクニカルトーク#7で言及)。このなんでもやろうとする点というのが 面白くてPlaggerでできそうな事例があるとPlaggerな人たちは[それPla]というタグをつけてソーシャルブックマークをしていきます。それPlaとは「それPlaggerでできるよ」が略されたと言われています。例えば、災害情報を察知するセンサーが作動したらアラートを携帯電話にメールする といったシステムもPlaggerでできるかもしれませんね。

Plaggerを使った面白い有名な実例を2件あげておきます。ひとつはGoogleで「はらへった」と検索すると自動的に自分の家にピザが届くというものです。Googleの検索履歴を入力として、そこからはらへったという文字があったらピザを届けるという形で出力、通知、をするというものです。本当に実践されていて、寿司バージョンもあるのが面白いです。もうひとつの例はPlaggerを使ってアダルトサイトの更新情報を伝えるエロサイトを自動で作る仕組みというものです。RSS配信のされていないようなアダルトサイトもPluginを使って新しいページができたのかを入力として読み込み、複数のサイトの更新をHTMLで書き出しています。

最後にPlaggerをより理解するための資料をいくつかピックアップしておきます。 まずはmiyagawaさん自身によるPlaggerのプレゼン資料の最新版はKansai.pmの第7回ミーティングでのものかと思います。またLL RINGでのtakesakoさんの資料もわかりやすいです(プレゼンの動画がYouTubeにあがっています)。

以上、さまざまな方がPlaggerを試しているのでその他の情報はウェブで検索などするとその他の、また新しい情報が得られると思います。

2006年11月13日

EntryFullTextの不満点

extract_after_hook:

の後って日本語使えない?YAMLファイルはutf8なんだけどな。その前までのextractするところは日本語きいてるのに。

2006年11月19日

Catalyst::Plugin::PageCacheでページをキャッシュする

とあるCatalystで作ったサイトで、sqliteのDBが大きくなるにつれ、やたらページ重たくなったりした。 こういう場合はmemcachedが有効か?と思って試してみたんだけど配列のいれかたがよくわかってない、そんでうまくいかなった。でなんかいいのないかなとCPANあさってみたら「Catalyst::Plugin::PageCache」なるものを発見。ページをキャッシングして指定した期限までは静的ページみたいになる、っぽい。 一度その重たいページを訪れるとキャッシュしましたというログがでて、2度目以降のアクセスではもうサクサク。これは用途によっては結構便利。

使い方は簡単。シンプルにやりたいのならこんな感じでMyApp.pmに記述するだけでOK。

use Catalyst qw/Cache::FileCache PageCache/;

__PACKAGE__->config->{page_cache} = {
                         expires => 43200, #キャッシュの有効期限 12hour
                         set_http_headers => 1,
                         auto_cache => [   #キャッシュするページ
                                                    '/tag/',
                                              '/entry/',
                                              '/feed/',
                                                 '/',
                                                        ],
                          debug => 1,
};

追記

これ使うと日本語のパラーメタを受け付けてくれない。。。

2006年11月21日

【イベント告知】11月22日,23日開催のORF2006に「映像の万華鏡moo-pong」を出展します

ゆーすけべー日記にもポストしましたが、このBlogの方が購読者が多そうなので、クロスポストさせてください。

明日11月22日(水)、23日(木・休日)に丸の内で開催される慶應塾大学湘南藤沢キャンパス=SFCの研究発表イベント「SFC OPEN RESEARCH FORUM(=ORF) 2006」に僕と愉快な仲間たちで作った「映像の万華鏡 moo-pong」を出展します。またもちろん僕が以前所属していた奥出研からも、海外の学会で賞をもらった作品や様々なBlogで話題になっているようなコンテンツが体験できる展示をするようです。奥出研、moo-pong及びORFについてはこのエントリーで紹介するよりも、それぞれ公式サイトを見た方がわかりやすいとかと思うので興味のある方はご覧ください。

moo-pong 昨年に引き続きmoo-pongは2度目のORF出展です。機能的には何もヴァージョンアップしてないのですが、とにかく展示します。僕はもうすでに卒業した身でSFCとは現在関係ないはずですが、とにかく説明要員で展示に参加する予定です。まだmoo-pongを体験していない方、奥出研のプロダクトに興味のある方、SFCの研究がどんなものかを知りたい、というような方は是非お越しください。

2006年11月26日

キャッシュのディレクトリ

複数ユーザーがスクリプトを実行する環境でキャッシュディレクトリを/tmp/cacheと安直にするとパーミッション関係で問題がでるから、それぞれわけた方がいいな。それとも解決策があるのかな

MTで同じカテゴリーに属しているエントリーをとってくるコンテナタグ

MovableTypeのエントリーで、それと同じカテゴリーに属するエントリーをとってくる場合は「MTTagInvoke」というPluginをよく使うけども、これでもたぶんいける。MTEntrySameCategoryという独自のコンテナタグを作る。とりあえずテンプレートは、

<ul>
  <MTEntrySameCategory>
  <li><a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
  </MTEntrySameCategory>
</ul>

ってな感じでMTEntriesと同じように使える。で、Pluginでそのタグを定義する。

MT::Template::Context->add_container_tag(EntrySameCategory => ¥&samecategory);

sub samecategory{
        my($ctx, $args,$cond) = @_;
        my $entry = $ctx->stash('entry');
        my $blog_id = $entry->blog_id;
        my $category_id = $entry->category->id;
        my @entries = MT::Entry->load(undef, {
                            'join' => [ 'MT::Placement','entry_id',
                            {category_id => $category_id},
                          { blog_id => $blog_id },]
                            });

    local $ctx->{__stash}{entries} = [ @entries ];
    return MT::Template::Context::_hdlr_entries($ctx,
                 { sort_by => $args->{sort_by}, sort_order => $args->{sort_order} },
                        $cond);
}

P::Planetの雛形

いつもERO Plaのconfig.yamlを探して書き直すのがめんどいので張っておく。 Publish::Planetの雛形です。(追記: もちろんBundle::Planetでも似たようなことできます)。

global:
  assets_path: /path/to/assets
  timezone: Asia/Tokyo

plugins:

  - module: Subscription::Config
    config:
      feed:
         - url: feedurl

  - module: SmartFeed::All
    config:
      title: title
      description: description

  - module: Publish::Feed
    rule:
      expression: $args->{feed}->id eq 'smartfeed:all'
    config:
      format: RSS
      dir: ./
      filename: index.xml

  - module: Publish::Planet
    rule:
      expression: $args->{feed}->id eq 'smartfeed:all'
    config:
      dir: ./
      theme: sixapart-std
      template:
        style_url: styleurl
        url:
          base: baseurl

2006年11月30日

RightFieldsで作ったフィールドにアップロードした写真をリサイズする

MovableTypeのRightFields Pluginでファイル形式のフィールドを作って、 エントリーごとに写真をアップロードしたらリサイズさせて、サムネイルも作るというプラグイン。RightFieldsのデータタイプはSQLの方じゃなくてPlugin領域を使う、configはめんどいのでプラグイン.plファイルに直書き、アップロード先・変換したファイルの保管場所固定という方針。 MT::Imageなんてのがあるんだね。便利だ。

package MT::Plugin::FieldThumb;
use strict;
use MT;
use MT::Image;
use Path::Class qw(file);

#settings
my $source_dir = 'files';
my $output_dir = 'photo';
my $main_photo_width = '400';
my $thumbnail_photo_width = '60';

my $plugin = new MT::Plugin({
                                                         name => "FieldThumb",
                                                         version => '0.01',
                                                         author_name => "Yusuke Wada",
                                                         author_link => "http://yusukebe.com",
                                                 });
MT->add_plugin($plugin);
my $mt = new MT;
my $rf_dir =  $mt->mt_dir . "/plugins/RightFields/lib" ;
use RightFields;

MT::Entry->add_callback('pre_save',1,undef,\&pre_save_hdlr);

sub pre_save_hdlr{
    my ($eh, $entry) = @_;
        my $cfg = RightFields::blog_data('extra', $entry->blog_id);
        my $obj = RightFields::new_obj($cfg,$entry->id);
        my $column_value = $obj->column_values();
        my $source_photo = $column_value->{'photo'};
        my $pad_id = _pad_id($entry->id);
        make_thumbnail($source_photo,$pad_id,$entry,$main_photo_width);
        make_thumbnail($source_photo,$pad_id."-thumb",$entry,$thumbnail_photo_width);

#$output_name : do not include .jpg 
sub make_thumbnail{
        my ($input_name,$output_name,$entry,$width) = @_;
        my $archive_path = $entry->blog->archive_path;
        #my $output_file = $archive_path . "/" . $output_dir ."/" . $output_name . ".jpg";
        my $output_file =  file($archive_path, $output_dir, $output_name . ".jpg");
        #if(-f $output_file){ return };
        #my $filename = $archive_path . "/" . $source_dir . "/" . $input_name
        my $filename = file($archive_path,$source_dir, $input_name);
        my $img = MT::Image->new( Filename => $filename );
    my($blob, $w, $h) = $img->scale( Width => $width );

    open FH, ">$output_file" or die $!;
    binmode FH;
    print FH $blob;
    close FH;
}

sub _pad_id{
        my $old_id = shift;
        my $zero_num = 6 - length($old_id);
        my $new_id = "0" x $zero_num . $old_id;
        return $new_id;
}

テンプレートファイルで

<img src="<$MTBlogURL$>photo/<$MTEntryID pad="1"$>-thumb.jpg" alt="<$MTEntryTitle$>" />

みたいにアクセスできる。割とニッチなPlugin。

About 2006年11月

2006年11月にブログ「Yusukebe::Tech」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2006年10月です。

次のアーカイブは2006年12月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。


ブログSEO対策:track word seo