« 2006年02月 | メイン | 2006年04月 »

2006年03月28日

仕事終了& YAPC

今日で現在の仕事終了。
いままでありがとうございました&おつかれさまでした。

んで、明日からはYAPC行きます。
朝6時台の新幹線です。起きれるか心配です。

これから荷造り。
MacBook Proを入れるケースがありません。
注文していたんだけど、19時すぎていたからかな、佐川急便再配達してくれなかった。
クロネコなら配達してくれそうなのにとか言ってみるテスト。

そうそうmixiで顔を出してみました。
さっそく四様似と某氏に言われたw

Tagの検索にMySQLの全文検索を使う

Tags with MySQL fulltextを参考にして試してみた。

Femoの中で、タグの絞り込み機能を実装したのに続いて、「完了」や「finish」と言ったタグがついている場合表示しないというオプションを考えている。
そうなってくると、SQLをどう書けばいいのか、また複雑なSQLを構築したときにパフォーマンスは大丈夫なのかと心配。そこで、上記のURLを参考にしながらMySQLの全文検索に注目。

create table ft_tags(
id int unsigned not null auto_increment primary key,
tags text,
unpack text,
fulltext (unpack)
)

と言うテーブルを作成。
ここに、

my @tags = (
q/task femo/,
q/femo mail task/,
q/task femo/,
q/task plagger/,
q/task 2006-03-27 "perl monger"/,
q/task 終了/,
q/feedback femo task dev/,
q/task feeder dev/,
q/femo task dev/
);

のデータを入れる。

MySQLの全文検索のテキストの切り分けは半角スペース。"perl monger"のようなタグには対応できない。またcase insensibleなので、Tag検索に使えない。
なので、「MySQLのFull Text Searchを日本語に使う実験」思い出して、Chasenで形態素解析ではなく、Text::Tagsを用いて文字列を分割して、unpack & 16進数に変換して保存してみる

保存するコードは

my $sth = $dbh->prepare("insert into ft_tags set tags=?, unpack=?");
for my $tags (@tags){
    my @unpacks;
    $tags = Encode::decode_utf8($tags);
    for my $tag (Text::Tags::Parser->new->parse_tags($tags)) {
        push @unpacks, join 'x', map { sprintf("%02x",$_) } 
            unpack("U*", $tag);
    }
    $sth->execute(
        join(' ', $tags),
        join(' ', @unpacks)
    );
}


データはこうなる。unpackした数値は「x」で繋ぐ。

mysql> select * from ft_tags ;
+----+-------------------------------+----------------------------------------------------------------------------+
| id | tags                          | unpack                                                                     |
+----+-------------------------------+----------------------------------------------------------------------------+
|  1 | task femo                     | 74x61x73x6b 66x65x6dx6f                                                    |
|  2 | femo mail task                | 66x65x6dx6f 6dx61x69x6c 74x61x73x6b                                        |
|  3 | task femo                     | 74x61x73x6b 66x65x6dx6f                                                    |
|  4 | task plagger                  | 74x61x73x6b 70x6cx61x67x67x65x72                                           |
|  5 | task 2006-03-27 "perl monger" | 74x61x73x6b 32x30x30x36x2dx30x33x2dx32x37 70x65x72x6cx20x6dx6fx6ex67x65x72 |
|  6 | task 終了                   | 74x61x73x6b 7d42x4e86                                                      |
|  7 | feedback femo task dev        | 66x65x65x64x62x61x63x6b 66x65x6dx6f 74x61x73x6b 64x65x76                   |
以下省略


「task」と「femo」を含んで「終了」を含まない、という条件で検索したいとき

select * from ft_tags where match(unpack) against('+74x61x73x6b +66x65x6dx6f -7d42x4e86' in boolean mode);

というクエリーを発行すればOK。検索文字列ももちろんunpackする。
上のクエリ−の結果は、@ID=qw/1 2 3 7 9/で希望通り。

これなら柔軟にタグの検索ができるはず。

MySQLの全文検索は検索の速度に不満はないだろうけど、indexの作成速度が少し心配。
Sennaのような感じでMySQLの全文検索より効率の良いTag検索エンジンがあればいいのになぁ。

2006年03月23日

Catalyst::Plugin::Captchaリリース

miyagawaさんから

#catalyst で Catalyst::Plugin::Captcha をリリースしてくれと伝言が。

とのことなので、リリース。

Catalyst::Plugin::Captcha

そして相変わらず英語が。。orz

CatalystのRepositoryにuploadするのに、commit権もらったんだけど。commitできないなぁ。
Tracにはログインできるのに。

mkdirの権限がなかった模様。nuthingmuchさんにdirを作ってもらってcommitした。
http://dev.catalyst.perl.org/changeset/3714

FemoにTag絞り込み機能を追加しました。

前のエントリーのTag絞り込み機能ですが、完成したので導入しました。

femo-relate2.png

関連するタグがページタイトル下にでてくるので、それをクリックでメモを絞り込めます。
結構便利です。ご意見をいただいた、Satoshiさんありがとうございます。

データベースへの問い合わせはTags: Database schemasの“Scuttle” solutionを参考にしている。スキーマもほぼ一緒だったりもする。
関連するタグの抽出とか、結構泥臭い実装になっているので、まだまだ手を付けたい。
今は使ってないけど、MySQLのSub-Queryは結構遅かった。Queryを2回実行した方が圧倒的に早い。
これはチューニングで解決できるところでもあるのかなぁ。

2006年03月20日

FemoにTag絞り込み機能実装中

FemoにTag絞り込み機能実装中。
ご意見もいただいたので、はてなブックマークライクに実装中。

femo-relate.png

メモ一覧の上に、関連するタグの一覧がでてきて、それをクリックすることで絞り込みできるのを目指してます。

複数のタグをどうやってサーバに送るかを悩み中。
prototype.jsの$H().toQueryStringでは配列が扱えない。
実装をすこし弄らなければ。

今月末で退社いたします

私事ですが、今月末で現在の会社を退社することになりました。
設立当初からやってきましたが様々思うことがあり、退社となりました。
今までお世話になった方々に深く感謝いたします。

来月からですが、いまのところ決まってません。
YAPCなど、いろいろな方々と会う機会を通して考えて行きたいと思ってます。

技術をより磨き、技術者やデザイナー、ディレクションの方などと一緒に高いレベルで刺激し合える環境でWebアプリケーションの開発ができたら思います。

これからもよろしくお願いします。

2006年03月19日

kansai.pm行ってきた

花園大学にたどり着くまでに遠回りしてしまった。
住宅地の真ん中にあるので分からなかったと言い訳。

Webアプリケーションとか作っている普段とは違うことが多いなぁと思った。
今後の参考にしていきたい。

2006年03月17日

WindowsがIntel Macでbootした件

インテルMacでXP起動に成功:narf氏が賞金獲得
インテルMacでXP:手順公開

が話題になっているけど、Dual Bootできても嬉しい事はほとんどないよなぁ。。
Webサービスを作る上で、Windows IEでのチェック、特にCSSのチェックは欠かせないのだけど、CSSってBKだらけでCut & Tryでやって行くしかないと思うのですよ。Dual Bootのためには当然Macを落とさないと行けないわけで、そうすっと修正がMacでできない。Bootも時間かかるし。

こういう話題がでて、QEMUとかQとかの開発が鈍ったりしたらいやだなぁ。。
Virtual PCでもVMwareでもいいので、Intel Mac上で快適に動くvirtualizationが実現されると良いです。

2006年03月16日

Femoのデザインを変更しました

昨日書いた、Femoのデザインの件ですが、さっそく導入しました。

↓のようなデザインになりました。
femo-new-design2.png

HTMLの構造とCSSも変わっています。スタイルシートを別途定義されている方で、Femoがうまく表示できない場合はこちらからアクセスをしてスタイルシートを編集してください

ご意見などありましたらお気軽にくださいませ。

次はこんなことを考えています。
Text::Hatenaの自動リンクへの対応
[完了]タグがついているメモは明示的に[完了]一覧を出さない限り出てこないオプション
タイトルを入力していない場合、内容の一行目をタイトルとする機能(このサイトの方のアイディア)

2006年03月14日

Femoの新デザイン製作中

Femoをモテるツールとすべく(真面目です)、新デザインの製作中。

femo-newdesign-beta-thumb.png
↑クリックすると大きくなります。

あまり大きな変更では無さげですが、背景が入って、ヘッダ周りのデザインを変えて、メモに枠をつけてます。
全体的にメリハリをついて、読みやすく使いやすくなったらいいかなと思ってます。

どうでしょうか。

Security Update 2006-02を適用後シイラが起動しない

シイラが起動しないトラブルがでてる。
PowerPC、intel両方とも。

シイラのディスカッションフォーラムでも話題でてる。

どうやら、

~/Library/Shiira/History.plist

を消すと起動する(毎回必要)。

NIghtly Buildでも問題があるみたいなので、待つしかないか。

Date::Page::Navigation ver. 0.03

http://www.bluefeet.net/bin/view/Main/DataPagerNavigationPatch
のpatchと提案がメールで来た。

Previous | ... 3 4 5 6 7 8 9 10 11 12 ... | Next

な感じのナビゲーションを作るときに、pages_in_navigationの最初と最後のページ番号が取得できると良いというpatchのようです。

前後に「...」を付けるのは、僕の見ているサイトではあまり見ない気がするけど、first_navigation_pageとlast_navigation_pageを追加して、CPANにUp。

ただ、同じインスタンスで、current_pageやらtotal_pageを変更するということも考えられなくはないので、pages_in_navigationのcacheは実装しませんでした。

FF12注文した

AUのCMで使われている「涙そうそう」が気になったのて、CDを一枚注文。

ケアラオカマイレ
ケアラオカマイレ
posted with amazlet on 06.03.14
ケアリイ・レイシェル
ビクターエンタテインメント (2004/01/21)
売り上げランキング: 687


今年はハワイアン。

その際、ついカッとなってカートに入っていたFF12を注文してしまった。今はやるかどうか心配している。
前評価は結構高いみたいなので期待。

ファイナルファンタジーXII 特典 FFXII/iTunes Custom Card付き
スクウェア・エニックス (2006/03/16)
売り上げランキング: 3,246

2006年03月10日

MySQLが起動せず。

さっき、サーバがKernel Panicで落ちて、再起動したらMySQLが起動しないトラブル発生。
Femoへのアクセスもできない状態になってました。大変ご迷惑をおかけしました。

MySQLはこんなエラー出てました。

060310 22:18:47  mysqld started
mysqld got signal 11;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help diagnose
the problem, but since we have already crashed, something is definitely wrong
and this may fail.

key_buffer_size=0
read_buffer_size=258048
max_used_connections=0
max_connections=100
threads_connected=0
It is possible that mysqld could use up to 
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_connections = 76399 K
bytes of memory
Hope that's ok; if not, decrease some variables in the equation.


よくわからなかったので、入っていたMySQL(CentOSのrpm)をMySQL ABの配布するものに変更。
rpm -e、rpm -Uvh、DBD::mysqlの再インストールで復旧。
ライブラリのバージョンとかの問題があるのかなぁ。。

2006年03月09日

HTML::FillInForm::ForceUTF8

*:: ForceUTF8インスパイア。ただ、Catalyst::Plugin::UnicodeやDBIx::Class:: UTF8Columns、Class::DBI::utf8などを使っている場合、必要ないかも。

__追記__
ソースはここにおきました。
http://nomadscafe.jp/archives/HTML-FillInForm-ForceUTF8-0.01.tar.gz
__/追記__

package HTML::FillInForm::ForceUTF8;

use strict;
use base qw(HTML::FillInForm);
use Encode;

sub fill{
    my ($self, %option) = @_;
    if (exists $option{file}) {
        if ( ref $option{file} ) {
            binmode $option{file}, ":utf8";
        } else {
            open my $fh, ":utf8", $option{file};
            $option{file} = $fh;
        }
    } elsif ( exists $option{scalarref} ) {
        Encode::_utf8_on(${$option{scalarref}}) unless Encode::is_utf8(${$option{scalarref}});
    } elsif ( exists $option{arrayref} ) {
        for ( @{$option{arrayref}} ){
            Encode::_utf8_on($_) unless Encode::is_utf8($_);
        }
    }
    $self->SUPER::fill(%option);
}

sub _get_param {
    my $self = shift;
    my $ret = $self->SUPER::_get_param(@_);
    for ( ref($ret) ? @$ret : $ret ){
        Encode::_utf8_on($_) unless Encode::is_utf8($_);
    }
    return $ret;
}

1;

↓テストはこんな感じで。

my $str = "あいう";
my $str2 = "\x{5bae}\x{5ddd}";
my $parser = HTML::FillInForm::ForceUTF8->new();
print $parser->fill(
    file => "test.tt",
    fdat => {
        a=>$str,
        b=>$str2
    }
);


↓test.tt

<form method="post" action="/foo">
<input type="text" name="a" value="" />
<input type="text" name="b" value="" />
</form>

2006年03月08日

Catalyst::Plugin::Captcha

Captchaの作成とvalidationを行うCatalystのプラグイン

__追記__
id:charsbar氏のはてなブックマークの指摘で、

validateの方はHWとかFVとか組み込んでいる場合が多いだろうからプラグインを分けた方がよいかも。

とあったので、validateメソッドに加えて、sessionに保存されている文字列を取得するcaptcha_stringを加えてみた。
http://nomadscafe.jp/archives/Catalyst-Plugin-Captcha-0.01.tar.gz
__/追記__

package Catalyst::Plugin::Captcha;

use strict;
use warnings;
use GD::SecurityImage;

our $VERSION = '0.01';

sub setup {
    my $c = shift;

    $c->config->{captcha}->{session_name} = 'captcha_string';
    $c->config->{captcha}->{new} ||= {};
    $c->config->{captcha}->{create} ||= [];
    $c->config->{captcha}->{particle} ||= [];

    return $c->NEXT::setup(@_);
}

sub create_captcha {
    my $c = shift;

    my $image = GD::SecurityImage->new(%{$c->config->{captcha}->{new}});
    $image->random();
    $image->create(@{$c->config->{captcha}->{create}});
    $image->particle(@{$c->config->{captcha}->{particle}});

    my ( $image_data, $mime_type, $random_string ) = $image->out;

    $c->session->{ $c->config->{captcha}->{session_name} } = $random_string;
    $c->res->content_type($mime_type);
    $c->res->output($image_data);
}

sub validate_captcha {
    my ($c, $verify) = @_;
    my $string = $c->captcha_string;
    return ($verify && $string && $verify eq $string);
}

sub captcha_string {
    my $c = shift;
    return  $c->session->{ $c->config->{captcha}->{session_name} };
}

1;

使い方としては、Controllerで、create/validate_captcha

MyApp->config->{captcha}->{
    session_name => 'captcha_string',
    new => {
        width => 80,
        height => 30,
        lines => 7,
        gd_font => 'giant',
    },
    create => [qw/normal rect/],
    particle => [100]
};

sub do_post : Local {
    my ( $self, $c ) = @_;
    my $ret = $c->validate_captcha($c->req->params->{validatekey}) ? 1 : 0;
    $c->res->output("output:$ret");
}

sub captcha : Local {
    my ( $self, $c ) = @_;
    $c->create_captcha();
}

#validate with CP::FormValidator::Simple
sub do_post : Local {
      my ($self, $c) = @_;
      $c->form(
          validate => [['EQUAL_TO',$c->captcha_string]]
      )
}


テンプレートは、こんな感じ

<form method="post" action="[% c.uri_for('/do_post') %]">
<input type="text" name="validatekey" id="validatekey" size="10" value="" /><br />
<img src="[% c.uri_for('/captcha') %]"><br />
<input type="submit" value="チェック" /> 
</form>


どうでしょうか。

CGI::App::Plugin::Stashの使いどころ。

ひさびさにCGI::App。この間(英語で)質問メールが来たり、id:nekokakのコードをふまえて、
CGI::Application::Plugin::Stashをば。


$cgiapp->param('foo','bar');

が、

$cgiapp->stash->{foo} = 'bar';

と書ける"alternative for param()"な訳なんですが、
これが何が嬉しいかというと。

$cgiapp->param( 'foo', MyApp::DB->resultset('table')->search() );


$cgiapp->stash->{foo} = MyApp::DB->resultset('table')->search();

と、(すこし)エレガントに(当社比)書けるところ。右辺が複雑であれば効果は(多分)大きい。


ちなみにCGI::Application::Plugin::TTを使うと、template中でCGI::Applicationオブジェクトを、"c"で呼び出せる
$cgiapp->tt_process('tmpl.tt',\%hash)でデータを渡さなくても、param/stashでデータを入れておけば、

[% c.param('foo') %]

とかできる。Plugin::Stashを入れていれば、
[% c.stash.foo %]
となる。括弧がない分きれい(かも)。

こんな感じでparam/stashメソッドは使えるので、アプリケーションの作り方としてCatalystライクにparam/stashにデータを入れつつ、$cgiapp->forwardってのありだと思う。


↓使った事ないけどこういうものありかな。

sub do_something{
    my $self = shift;
    $self->stash->{template} = 'tmpl.tt';
    $self->forward('templatize');
}

sub templatize{
    my $self = shift;
   $self->tt_process($self->stash->{template});
}


問題は、paramがper requestではないのでインスタンスが持続する起動方法をとった時には使えないことか。

2006年03月07日

Plagger::Plugin::Notify::Browser

Update Entryをブラウザで開きます。タブブラウザ万歳プラグイン
Notify::Ejectをコピペ多し。

Plagger::Plugin::Notify::Browser

package Plagger::Plugin::Notify::Browser;
use strict;
use base qw( Plagger::Plugin );

sub init {
    my $self = shift;
    $self->SUPER::init(@_);

    my $class = 'Plagger::Plugin::Notify::Browser::' . lc($^O);
    eval "require $class;";
    if ($@) {
        Plagger->context->error("Browser plugin doesn't run on your platform $^O");
    }
    bless $self, $class;
}

sub register {
    my($self, $context) = @_;

    $context->register_hook(
        $self,
        'publish.entry' => \&entry,
    );
}

sub entry {
    my($self, $context, $args) = @_;
    $self->open($args->{entry}->link);
}

1;


Mac OS X用
Plagger::Plugin::Notify::Browser::darwin

package Plagger::Plugin::Notify::Browser::darwin;
use base qw( Plagger::Plugin::Notify::Browser );

use strict;

sub open {
    my ($self, $link) = @_;
    system 'open', $link;
}

1;


Windows用
Plagger::Plugin::Notify::Browser::mswin32

package Plagger::Plugin::Notify::Browser::mswin32;
use base qw( Plagger::Plugin::Notify::Browser );

use strict;

sub open {
    my ($self, $link) = @_;
    system 'start', $link;
}

1;


Linux(Firefox)未確認です

package Plagger::Plugin::Notify::Browser::linux;
use base qw( Plagger::Plugin::Notify::Eject );

use strict;

sub open {
    my ($self, $link) = @_;
    system 'firefox', '-new-tab', $link;
}

1;


シイラだと同じタブにページが開いてしまう。

Plagger::Plugin::Widget::CacheGoogle

Google cacheへのリンクを追加するWidgetプラグイン。
WWW::Cache::Googleを利用してる。

googlecachewidget.gif

package Plagger::Plugin::Widget::CacheGoogle;
use strict;
use base qw( Plagger::Plugin );

use HTML::Entities;
use WWW::Cache::Google;

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'publish.entry.fixup' => \&add,
    );
}

sub add {
    my($self, $context, $args) = @_;
    $args->{entry}->add_widget($self);
}

sub html {
    my($self, $entry) = @_;
    my $uri = WWW::Cache::Google->new($entry->permalink)->cache;
    my $url = HTML::Entities::encode($uri->as_string);
    return qq(<a href="$url" style="color:#77c;">Cached</a>);
}

1;

2006年03月05日

SonyのVGP-BMS30を買った

SonyのBluetoothマウス、VGP-BMS30を買った。
VGP-BMS30_B.jpg

もち、MacBook Proと組み合わせて使います。
買うまでに結構悩んだんだけど、普通にいい感じです。

2006年03月04日

URI::Fetchで301→304となったときpatch

微妙な問題なのだが、URI::Fetchで。
301リダイレクト先で、304 Not Modifiedとなったときに正しくコンテンツを返さない

http://blog.nomadscafe.jp/index.xmlはfeedburnerに301リダイレクトされているのですが。

my $cache = Cache::FileCache->new();
my $fetch = URI::Fetch->fetch('http://blog.nomadscafe.jp/index.xml',Cache=>$cache);
print Dumper($fetch);

というスクリプトで、動かしたときに、2回目にコンテンツが正しく返りません。
301リダイレクトした先(feedburner)の方から304が返されてしまっているのでそうなります。

本来であれば、301が返ってきたとことでURI::Fetchを利用するアプリケーションの方でデータベースを書き換えるなどの処理が必要になると思うのですが、
PlaggerのAggregator::Simpleとかまだ、そういう仕組み(まだ)がないので、、Patchを書いてみた。

--- URI-Fetch-0.05.orig/lib/URI/Fetch.pm	2006-03-04 18:57:44.000000000 +0900
+++ URI-Fetch-0.05/lib/URI/Fetch.pm	2006-03-04 19:02:41.000000000 +0900
@@ -88,6 +88,13 @@
     if ($res->previous && $res->previous->code == HTTP::Status::RC_MOVED_PERMANENTLY()) {
         $fetch->status(URI_MOVED_PERMANENTLY);
         $fetch->uri($res->previous->header('Location'));
+        if ($res->code == HTTP::Status::RC_NOT_MODIFIED()) {
+            $fetch->status(URI_NOT_MODIFIED);
+            $fetch->content($ref->{Content});
+            $fetch->etag($ref->{ETag});
+            $fetch->last_modified($ref->{LastModified});
+            return $fetch;
+        }
     } elsif ($res->code == HTTP::Status::RC_GONE()) {
         $fetch->status(URI_GONE);
         $fetch->uri(undef);


正直微妙なところだと思います。

Kansai.pm 6th Meeting

Kansai Perl Mongersの第六回ミーティングが2006年3月19日(日)にあります。
http://perl.jonex.ne.jp/cgi-bin/blosxom.cgi/event/e2006plan1.html

日時:
2006年3月19日(日) 13時~17時
会場:
花園大学 http://www.hanazono.ac.jp/

内容:
中島
「Privateモジュール - シンボルテーブル操作によるサブルーチン隠蔽」
樋口
「PostgreSQLからPerlを使う」
はしもと
「HTML::TemplateでDB擬似連携」
なみかわ
「Perlでサプリ~There is More Than One Way To Do It(TIMTOWTDI)」
井上
「大学で行ったPerl講習会の報告」
大浦
「FreePWING で作る電子辞書」
師・守岡
「CHISEプロジェクトの概要とデモ」


いく予定で。
花園大学は自転車で行けるかな。

2006年03月03日

ノイズが、、MacBook Pro

MacBook Pro結構快適なんだけど、一つだけ気になるところが、

Appleのディスカッションフォーラムでも話題になっているぽいのですが。
http://discussions.info.apple.co.jp/WebX?128@336.31Otbzbuou5.3@.f003f45

対応アプリはまだいじっていないのですが、がっかりしたのがスピーカからのノイズ。CPUの動作かなんかと連動しているらしい、ジーーーというノイズが断続的に聞こえます。スピーカのボリュームとは無関係なので、アンプとスピーカの間からノイズが入り込んでいる様です。


キーボードの真ん中の下あたりから聞こえる感じがする。
ネジを締め直すと直ったとかあるが、、どうしようかな。

Plagger::Plugin::Filter::FloatingDateTime

はてなダイアリーのRSSとかdc:dateが"YYYY-MM-DD"の場合、TimeZoneが決まらないのでfloatingになる。
Publish::Feedとか、Entryのsortとかでちょっと困るので、指定したtimezoneにfixするFilter Plugin書いた。

 package Plagger::Plugin::Filter::FloatingDateTime;
use strict;
use base qw( Plagger::Plugin );

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
        'update.entry.fixup' => \&update,
    );
    $self->{tz} = $context->conf->{timezone} || 'local';
}

sub update {
    my($self, $context, $args) = @_;
    $args->{entry}->date and $args->{entry}->date->time_zone->is_floating and
	$args->{entry}->date->set_time_zone($self->{tz});
}

1;


Plagger::Plugin::Filter::FloatingDateTime
http://nomadscafe.jp/archives/plagger/FloatingDateTime.pm

PPF::TimeZoneはいろいろ考えすぎて意味が分からなげ。

2006年03月02日

Femo + Plagger

メモ帳アプリケーションFemoのメモをPlaggerで取得するCustomFeedプラグイン書きました。

Plagger::Plugin::CustomFeed::Femo
http://nomadscafe.jp/archives/plagger/Femo.pm

Femoにあげているメモから。登録順または特定tagのリストをPlaggerで取得できます。

  - module: CustomFeed::Femo
    config:
      id: your-typekey-id
      password: password
      tag: tag or date or __TODAY__

な、感じ。

特に

    tag: __TODAY__

と書いた場合は、その日付のTagが付いているリスト取得になるので、うまくPublish::*Mailと組み合わせればリマインダーになるかも。

Plagger::Plugin::Filter::TimeZone

globalで設定したTimeZoneに変更するFilter
BloglinesとかCustomFeedとかにはあまり関係がない。

__追記__
ちょっと意味わからなげなので、
Plagger::Plugin::Filter::FloatingDateTime
こっちに。
__/追記__


package Plagger::Plugin::Filter::TimeZone;
use strict;
use base qw( Plagger::Plugin );

sub register {
    my($self, $context) = @_;
    $context->register_hook(
        $self,
	'update.feed.fixup' => \&feed_update,
        'update.entry.fixup' => \&entry_update,
    );
    $self->{tz} = $context->conf->{timezone} || 'local';
}

sub feed_update{
    my($self, $context, $args) = @_;
    $args->{feed}->updated and
        $args->{feed}->updated->set_time_zone($self->{tz});
}

sub entry_update {
    my($self, $context, $args) = @_;
    $args->{entry}->date and
	$args->{entry}->date->set_time_zone($self->{tz});
}

1;

MacBook Proキタ

明日の7時にと福山通運に言っていたらちょうど7時に来た。
帰ってきたときにマンションの前にトラック止まっていたからあれだったのかな。

んで、MacBook Pro来ました。
ひさびさノート。Macでは初ノート。

とりあえず、
CyberDuck*
Carbon Emacs テスト版
Firefox
iTerm*
Jedit X*
Safari Stand*
シイラ*
SubVersion
TinkerTool
Xcode
expat ソースからコンパイル

あたりを入れた。*付きはUniversal Binary。
残念のはFinderPopが動かなかったところ。

この後は、CPAN経由で大量のPerlのモジュールインストール。
Catalystは動いたし、Plaggerもいけるはず。

意外と良いのは二本指スクロール。気に入った。

2006年03月01日

Plagger::Plugin::SmartFeed::ImageGather

Entryの中から画像を抜き出して、1個のFeedにするSmartFeedプラグイン
夜中の某会話にインスパイア。

StripImageとかRuleを駆使するとよろしいかと。
多くがSmartFeedからのコピペになっているところは修正したいところ

Plagger::Plugin::SmartFeed::ImageGather
http://nomadscafe.jp/archives/plagger/ImageGather.pm