2005年10月アーカイブ

「Sledge::Sessionに便利なアクセサ追加するには」を受けて、Sledge::Sessionにアクセサを追加できるプラグインを作ってみました。下記からダウンロードできます。

Sledge-Plugin-SessionAccessor-0.01.tar.gz

使い方はpodを見てください。…というのもあれなので簡単に説明するとProject::Pages::Baseに下記のようにメソッドと無名関数を定義しておくと、それをベースクラスとしたPagesクラスであれば、$self->session->methodという感じで呼べるようになります。
#と作っておいてあれだけど、ニーズあるのかなぁ…。ありそうだったらコミットしてみよう。

package Project::Pages::Base;
use Sledge::Plugin::SessionAccessor;
__PACKAGE__->mk_session_accessor(
    method => sub {
        my $self = shift;
        #...
        return $foo
    },
);

package Project::Pages::Root;

use base qw(Project::Pages::Base);

sub dispatch_index {
    my $self = shift;
    my $foo = $self->session->method;
}

subtechグループ - tokuhiromの日記 - Sledge::SessionManager にアクセサ追加 User の ID をセッションに入れとく場合、

my $user = Project::Data::User->retrieve($self->session->param('id'));

とか毎回書くのはダルいので

my $user = $self->session->user;

と書きたいのだが

確かに。セッションから直で取れるのを設定できると楽だな~。宮川さんがコメントしているように簡単にSledge::Sessionに追加できるプラグインがあってもいいと思いますが、今のところ自分がよくやる方法としては下記の2つの方法があります。

  • 方法1:Authorizerに定義する
  • Project::Authorizer::Loginとかで認証する際に、
    sub authorize {
        #...
        my $user = Project::Data::User->retrieve($user_id);
        $self->session->param(user => $user);
        #...
    }

    という様にしてセッションにuserという名前でProject::Data::Userオブジェクトを入れてしまう。そしてProject::Pages::Baseとか作って、

    sub user {
        my $self = shift;
        $self->session->param('user');
    }

    と定義しておいて、Pagesクラスは全部これを継承して作るようにすれば、Pagesクラスでは$self->userで取れるようになる。

  • 方法2:Project::Pages::Baseに定義

  • Authorizerとかで定義するのもメンドイなぁと思うときは、上記の方法をちょと変更してProject::Pages::Baseに

    use Project::Data::User;
    sub user {
        my $self = shift;
        my $id = $self->session->param('user_id');
        $self->session->param(user => Project::Data::User->retrieve($id))
            if $id && !$self->session->param('user');
        return $self->session->param('user');
    }

    と定義して、セッションにuser_idというのがあったらそれを元にProject::Data::Userオブジェクトをretrieveしてきて、userというセッションに入れてそれをリターンするって方法。
    微妙に、なんでもかんでもuser_idってセッションがあったらretrieveしちゃうので、作ってるアプリでuser_idが絶対ユーザIDだという保証がない場合は危険なのでやめた方がいいですね…。

この2つの方法の弱点としたら、Pages以外のクラスではPagesが渡ってなければ$self->userが取れないというところ。といってもそもそもPagesクラスが取れなけりゃセッションも取れないわけで…、$self->session->userとかもできないか…。

追記:
コメントにも書きましたが、SledgeではどこでもPagesを取れるような機構が用意されてるのを失念していました。取り方は下記のようにします。

my $page = Sledge::Registrar::context();

ブログの値段を鑑定してくれるというので、鑑定してみた。結果は下記。
まぁそんな高くはないとは思っていたがこんなもんだ(笑)。110万円ぐらいかな。


My blog is worth $10,726.26.
How much is your blog worth?

Shibuya Perl Mongers : Shibuya Perl Mongers テクニカルトーク #6

Shibuya Perl Mongersテクニカルトーク#6 を2005年11月2日に開催します。

六回目のShibuya.pmが催されます。最近はいつも定員に達っするのが早いので、早速申し込んでみた。問題はその時間に会社を出れるかなのだが…。

んで今回楽しみなのは、まぁ全部楽しみなんだけどCatalyst関連("Learning Catalyst" - 加藤@おーさか、"Catalyst Tips and Traps" - 加藤 亮)とPugs("Pugs でお手軽 Perl6 入門" - 竹迫良範)についての話が特に楽しみ。

SNB(って略すのかな…)でみんな「ちょこっとコメント」みたいなのをブックマーク時に付けますよね。あれに追記でコメントしてーなーってときがよくある。それで「ちょこっとコメント」で疑問みたいの付けてる人とかいたりして、それに対する答えを知ってたりするとよけい答えたくなったりする。

Beckyでinfo@foo.comの日本語スパムがいいかげんうるさい…。BkASPilというプラグインをインストールしていたんだけど、どうも日本語のメールの判定率が悪いような気がしたので他のスパムフィルタのプラグインを探してみた。

それでみつかったのが、bkbsfilterです。もともとはrubyで書かれたbsfilterというスパムフィルタで、主にUNIX系で使うものですが、BeckyのrubyプラグインであるBeckrb上で動かすようにしたものらしいです。

今は判定を覚えさせている所ですが、日本語とかもちゃんと扱えるようですのでちょっと使い続けてみようと思います。

いやぜんぜんたいしたことではないんだけど、発見したので書きます。

FirefoxでCtrl+sして検索したときに、ウィンドウの下に検索バーが出てきます。これを今までは毎回マウスで×ボタンを押して閉じてたのですが、そのバーにフォーカスがあるときにEscを押すと閉まわれます。

発見したときにはちょと嬉しかった…。ただそれだけですけど…。

Beta Weblog: Movable Type の文字コード変換スクリプト

Movable Type 3.0 のデータベースに格納されているデータの、文字コードの変換スクリプトのテスト版を公開します。必ずデータのバックアップを作成してから変換してください。

思うところがあり、今までMovableTypeで格納データと公開ページのエンコーディングがEUC-JPだったのですが、それをUTF-8に変えてみた。

どうやってやったらいいか調べたら、本家のブログに変換スクリプトがあったのでそれを使った。

やり方は簡単で、変換スクリプトダウンロードしてきて、解凍して出きたmt-convert-code.cgiをMTのホームディレクトリに置いて、それをブラウザから叩けばよい。
※やる前には必ずDBのバックアップを取っておきましょう。

あとはmt.cfgのPublishCharsetをEUC-JPからUTF-8に変えたら、すべてのページを再構築するだけ。(mod_perlで動いている場合にはapacheを再起動したあとに再構築方がいい)
テンプレートのcharsetとかも普通はcharset=<$MTPublishCharset$>となってると思うのでそのままイケるはずです。

UnknownPlace. - Catalyst もりあがり

あと、コンソールの文字コード云々は、GNU screen 使って server.pl うごかす window だけ :encoding utf8 とかでどうすか! 最近というか今日知ったんですが。

うほ!これ知りせんでした!目から鱗が溢れました。
これがあれば_logを書換える必要なしですね。ちなみに細かく書くと、screenの画面で Ctrl-t : (Ctrl-tのコマンド文字部分は自分のに置き換えてください)とやるとvimみたいに「:」のプロンプトがでるのでそこで、encoding utf8と書いてリターンを押せばばいいみたい。

あと共通して使うのだったらばCatalystのプラグインにしたら?ってのは確かに書いた方が楽でいいですよね…。ただあまりCatalystを使いきれてないから、それがほんとに必要なのかどうかが微妙に迷ったりする今日この頃。

なんか方々でCatalystネタが上ってたり、話題がscreenに飛んだり、そういうの見てると面白い。そんでCatalyst(+α)のノウハウが貯まるのはよいことですよね。

Solution to Trackback Spams

The way it works is fairly simple - if the incoming trackback does not come from the host as stated in the URL, we reject the trackback. For example, if a trackback from url http://online-poker.psxtreme.com/ comes from 194.63.235.156 (an open proxy), then it is likely to be spam. (online-poker.psxtreme.com does not resolved to 194.63.235.156).

Trackback Spamがいいかげん多くて、手動で消すのがバカらしくなったので、ネットでその手のプラグインを探したらこのプラグインがみつかったので導入してみた。まだ導入したばかりなので効果はわかりません。

やってることは、Trackback pingのホストのIPと送ってきたサーバのIPが違うと拒否というものらしい。gethostbynameでIPを調べてますね。

追記:
これやっぱり外しました。軒並各ブログサービスからのTBを拒否するし…。まぁTBを送ってくるサーバのIPとドメインなんて個人じゃなけりゃ同じじゃないということかな。。。さて、MT3.2に上げようかなぁ、、ボソ。
ひげぽん OSとか作っちゃうかMona- - Catalyst入門 と お作法について

templateの include

rootからのパスを指定してやればよい

[% include templates/user/username.tt %]
はてなのひげぽんさんがCatalystについて書いていたのでそれを受けて書いてみます。上記のこれは、root/base/の中に読み込みたいincludeファイルを入れてやると、それがTTのINCLIDE_PATHに入っているので [% include username.tt %]で読み込めるようになります。Catalyst::View::TTの103行目付近にその記述があります。ちなみに、テンプレートの中にデフォルトで使えるようになってる変数はbase($c->req->base), c($c), name($c->config->{name})の3つのようですね。なので自分はProject.pmのsub end {}で、$c->stash->{session} = $c->sessionとやって、セッションをテンプレートで[% session.foo %]とできるようにしています。別にやらんでも[% c.session.foo %]で取れますけどね…。

その他で自分がやってるのとしたら下記ですね。

  • M(Model)などでconfigの値を取りたいとき

  • 下記のような感じで取れます。
    Project->config->{foo}


  • configはCatalyst::Plugin::Config::YAMLで

  • Project.pmの中で

    use Catalyst qw/Config::YAML/;
    Project->config(config_file => 'config.yml');

    とすれば、configをconfig.ymlというファイル名にしてYAMLで設定を書くことができます。これ自分としては結構便利です。

  • そのC(Controller)の中でグローバルに使いたい関数を定義するには

  • 作ってるアプリの中でグローバルに使いたいんだけどforwardしたくねーよというときには一番上のProject.pmに下記の要に書くとそれを$c->is_post_requestという感じで使うことができるようです。

    sub Project::is_post_request { $_[0]->req->method eq 'POST' }


  • 無理にMVCの中に入れることはない

  • Catalystを使って自分でアプリを作っていたら、Utils.pmとConstants.pmがどうしてもMVCのどれかのディレクトリに入れることができず、結局Project::Utils、Project::Constantsという形にした。useするのがちょと面倒(オイオイ)だけどしかたない。

  • 出力されるログになにか処理を施したい

  • アプリをUTF-8で作ってるけどターミナルはeucなんで、ログで出てくる文字が化けるよ!というときに下記のようにするとeucで出力できるようになる。
    これを使えば、他にもいろいろな処理を挟むことができると思う。これは主に開発時用のTipsですね。
    sub Catalyst::Log::_log {
          my $self    = shift;
          my $level   = shift;
          my $time    = localtime(time);
          my $message = join( "\n", @_ );
          printf( STDERR "[%s] [catalyst] [%s] %s\n", $time, $level, Unicode::Japanese->new($message)->euc );
    }

自分で気がついたのはこのくらいですけど、たぶん間違いとかこうやった方がよいというのが沢山ありそうなので、その際はご指摘お願いします。
ふとAtomPPで認証に用いられるWSSE Username Tokenを喋ってみたくなり試してみた。
その一部始終は下記である。

話相手となったのは、AtomPPを提供しているlivedoor Blogです。
また大丈夫だとは思ったのですが念の為Username、PasswordDigestの部分に関しては仮の物に書換えてあります。

% telnet cms.blog.livedoor.com 80
Trying 203.131.198.212...
Connected to cms.blog.livedoor.com.
Escape character is '^]'.
GET /atom HTTP/1.0
X-WSSE: UsernameToken Username="clouder", PasswordDigest="NU0ydnNkNHhsc0ZGc3VydGs1MWRSRWR1bDlF", Nonce="TXlOb25jZQ==", Created="2005-10-10T10:10:10"


上記がリクエストになります。「GET /atom HTTP/1.0」のあとに、X-WSSEヘッダでごにょごにょと値を渡しています。
Usernameは自分のユーザ名、PasswordDigestはその後に続くNonceとCreatedと実際のパスワードをつなげたものをSHA1で変換した値をBase64エンコードした値になります。それをperlで求めるには下記のようにやります。

% perl -MDigest::SHA1 -e 'warn Digest::SHA1::sha1_base64("MyNonce2005-10-10T10:10:10password")'
5M2vsd4xlsFFsurtk51dREdul9E

この結果の最後に"="を付けた「5M2vsd4xlsFFsurtk51dREdul9E=」がPasswordDigestになります。Nonceは、PasswordDigestを生成するときに使った「MyNonce」という値をBase64した値になります。perlで求めるには、下記のようにやります。

% perl -MMIME::Base64 -e 'warn MIME::Base64::encode_base64("MyNonce")'
TXlOb25jZQ==

Createdは単純に今の日時です。

上記のリクエストを送ると下記のようなレスポンスが返ってきました。

HTTP/1.1 200 OK
Date: Thu, 13 Oct 2005 18:11:44 GMT
Server: Apache/1.3.33 (Unix) mod_perl/1.29
P3P: CP="BUS OUR PHY STP ADM CUR DEV PSA PSD"
Content-Type: application/x.atom+xml
X-Cache: MISS from cms.blog.livedoor.com
Connection: close

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://purl.org/atom/ns#">
  <link xmlns="http://purl.org/atom/ns#" type="application/x.atom+xml" rel="service.post" href="http://cms.blog.livedoor.com/atom/blog_id=000000" title="Clouder::Tester"/>
  <link xmlns="http://purl.org/atom/ns#" type="application/x.atom+xml" rel="service.feed" href="http://cms.blog.livedoor.com/atom/blog_id=000000" title="Clouder::Tester"/>
  <link xmlns="http://purl.org/atom/ns#" type="application/x.atom+xml" rel="service.categories" href="http://cms.blog.livedoor.com/atom/blog_id=000000/svc=categories" title="Clouder::Tester" />
  <link xmlns="http://purl.org/atom/ns#" type="application/x.atom+xml" rel="service.upload" href="http://cms.blog.livedoor.com/atom/blog_id=000000/svc=upload" title="Clouder::Tester" />
</feed>
Connection closed by foreign host.

おぉ、livedoor BlogのAtomPPはuploadやcategoriesもサポートしているみたいですね。
なぜ突然こんなことしたくなったかと言うと、下記の本を読んでいたからです。これは今までネットでちらばっていたWebサービスAPIの情報が1つにまとまってて、いいかんじですね。

最新WebサービスAPIエクスプロ-ラ ~Amazon、はてな、Google、Yahoo! 4大Webサービス完全攻略
Software Design 編集部
技術評論社 (2005/09/23)
売り上げランキング: 6,326

ちょっと前に#!shebang.jpさんが「Sledgeで気になるとこ」というエントリを書いてましたが、これに被せる形で、Sledge2で個人的にやりたいと思ってるものを書いてみたいと思います。

  • Sledge::Helperを導入
  • qootas.orgのせきむらさんが作ってらっしゃったSledge::Helperをマージしたいなぁ。
  • Pagesをもうちょっと実際のページ生成ロジックと離したい
  • Sledgeで開発していて困るのが、Pagesに書いたコードをスクリプトから呼びたいときなどむりくりやらなければならない。なぜならSledgeはビジネスロジックがほぼPagesと等価となっているからである。そこをもう少し離してやりたい。
  • redirectのあとのコードを実行しないように
  • にぽたん研究所所長も、#!shebang.jpの方も言ってましたが、だれもが思うところですね。現状のSledgeでは、Pagesで$self->redirect('/foo');とやったあともコードが実行されてしまいます。それをどうにかしたし。バグの温床にもなりやすいですし。
  • プラグインの機構を盛り込みたい
  • 現状Sledgeのプラグインは import ベースなものが多いです。たしかにこれはperlの利点なんだけど、importとか使わなくても最初からプラグインを追加できる機構を盛り込みたいなと思います。個人的には、CatalystのNEXTみたいなやつカッコイイななんて思います。チェイン オブ レスポンシビリティ?(よくわかってない…)

今のところ思うところはこんな感じです。
#思い付いたものを貯めこまないで、排出してみるベースで書きました。

Google
これ、URLがhttp://calendar.google.com/です。でもページはgoogleさんのトップですね。googleがカレンダー業界にも!?

これかなり気になりますねぇ…。
個人的には

・iCalendar形式で配信(もちろんXMLの各形式での配信も)
・WebのGUIではAjaxバリバリ
・携帯でも閲覧か。
・あわよくば、iアプリを配布…ムリか…。

こんなのを希望しますが。

検索

広告

OpenID対応しています OpenIDについて
Powered by Movable Type 4.22-ja