Catalystでmixi OpenIDからニックネームを取得

ボヤボヤしてるうちにmixiOpenIDのProviderになって、そろそろOpenIDのRPに対応する準備しとかんとあかんやろ、と思い、認証してニックネームを取得してくるだけのRPのテストプログラムを作ってみた。
ここで紹介されているサンプルのCatalyst版(の更にマイミク認証を除いたやつ)です。

Catalystは当然インストールしてあるとして、事前にNet::OpenID::ConsumerとCatalyst::Authentication::Credential::OpenIDの2つのモジュールをCPANに上がっているやつじゃなくてSubversionリポジトリから取得してそれぞれインストールします。
Net::OpenID::Consumerの方は依存モジュールに注意した方が良いみたいなので、以下のページを参考に先に他のモジュールや外部ライブラリをインストールしておく。

$ svn co http://code.sixapart.com/svn/openid/trunk/perl/Net-OpenID-Consumer/
$ perl Makefile.PL
$ make
$ make install
$ svn co http://svn.coderepos.org/share/lang/perl/Catalyst-Authentication-Credential-OpenID/trunk/ Catalyst-Authentic
ation-Credential-OpenID
$ perl Makefile.PL
$ make
$ make install

自分の環境ではもう一つハマリどころがあって、Net::OpenID::Consumer(正確に言うと同梱されているNet::OpenID::Yadis)がXML::Simpleを使用しているんだけどMakefileのPREREQ_PMに書いてないのでインストール要求されなかったこと。呼び出し側のCatalyst::Authentication::Credential::OpenIDの方でコンパイルエラーが起きていたので原因を特定するのに時間がかかってしまった。なので、手元の環境にXML::Simpleを入れてない人は別途インストールする必要があります。

この2つのモジュールを入れてしまえば、あとはcatalyst.pl MyAppしてMyApp.ymlとMyApp.pmとRoot.pmを以下の例の様に書き換えればOK。

MyApp.yml

---
name: MyApp

Log::Dispatch:
  - class: File
    name:  file
    filename: __path_to(test.log)__
    mode: append
    min_level: debug
    format: '%P [%p] %m %n'
  - class: Screen
    name:  screen
    min_level: debug
    stderr: 1
    format: '[%p] %m%n'

Plugin::Authentication:
    default_realm: openid
    realms:
        openid:
            credential:
                class: OpenID
                extension_args:
                    'http://openid.net/extensions/sreg/1.1':
                        required: nickname

MyApp.pm

package MyApp;

use strict;
use warnings;

use Catalyst::Runtime '5.70';

use Catalyst qw(
    ConfigLoader
    Static::Simple
    Log::Dispatch
    Authentication
    Session
    Session::Store::FastMmap
    Session::State::Cookie
);

our $VERSION = '0.01';

__PACKAGE__->config( name => 'MyApp' );

# Start the application
__PACKAGE__->setup;

1;

Root.pm

package MyApp::Controller::Root;

use strict;
use warnings;
use base 'Catalyst::Controller';

__PACKAGE__->config->{namespace} = '';

sub default : Private {
    my ($self, $c) = @_;
    $c->log->debug('### default start');

    my $template = << "TEMPLATE"
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>mixi OpenID Login Test</title>
</head>
<body>

<h1>mixi OpenID Login Test</h1>

ボタンをクリック!<a href="/login?openid_identifier=https://mixi.jp"><img src="/static/images/b_150.gif" alt="mixiでログイン" border="0"></a>
TEMPLATE
;

    $c->res->body($template);
    $c->log->debug('### default end');
}

sub login : Local {
    my ($self, $c) = @_;
    $c->log->debug('### login start');

    if ($c->authenticate) {
        $c->log->debug('### authenticated!');
        # success
        my $id = $c->user->{url};
        my $nickname = $c->user->{display};
        my $template = << "TEMPLATE"
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>mixi OpenID Login Test SUCCESS!</title>
</head>
<body>

<h1>mixi OpenID Login Test</h1>

ログインに成功しました!<br>
こんにちは、$nickname ( $id ) さん

TEMPLATE
;
        $c->res->body($template);
    }
    elsif ($c->res->redirect) {
        $c->log->debug('### redirect');
        # redirect to OP/IdP, nothing to do
    }
    else {
        # error
        $c->log->debug('### error!');
        my $template = << "TEMPLATE"
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>mixi OpenID Login Test ERROR!</title>
</head>
<body>

<h1>mixi OpenID Login Test</h1>

ログインに失敗しました。

TEMPLATE
;
        $c->res->status(401);
        $c->res->body($template);
    }
    $c->log->debug('### login end');
}

sub end : ActionClass('RenderView') {}

1;


認証成功後は、$c->user->{url}でユーザのIdentifierが、(extention_argsにsregでnicknameを要求していれば)$c->user-{display}にニックネームが取得できます。今回はmixiからニックネームを持ってこれるか試したかったので手抜きでhttps://mixi.jpを直書きしたけど、Claimed Identifier(Root.pmのopenid_identifierの部分)を入力できるようにすれば他のOpenID Providerにも対応できるはず。試してないけど。

伝説はやはり伝説だった

今週はいつになくライブ週間。

こんなに連続して観に行くの初めてかも。しかも日曜は2本立て。

しかしフジロックマイブラといい、メタモのアシュラといい、今日のファウストといい、高校生の頃から生で観るのを夢見てきた人たちを立て続けに体験できて本当に贅沢な夏になった。ライブ観ている間も夢を見ているようだったし、観終わった後も夢を見ていた気分。

みんな笑っちゃうくらいマイブラマイブラ、アシュラはアシュラ、ファウストファウストの音を出していて、やってることは全然変わってないんだけど期待を裏切らずにそのままやってくれるのはそれはそれで大したものだよな。

伝説はやはり伝説だった、なんて思ってたら今日拾ったフライヤーの中にTONY CONRAD & 灰野敬二@9/17 SuperDeluxeなんて恐ろしいものが!!!!こんなニアミスするならファウストとトニーコンラッドのコラボの再演やってくれればいいのに。伝説がインフレを起こしてるな。。

mod_perl配下でPHPを実行する

すごいニッチな条件だけど。mod_perlで動かしてるCatalystアプリケーション配下で、レガシーなシステムのPHPファイルを持ってきて共存させることになった。Perlでロジックを書き直すのがベストなんだろうけど、時間無いのとメンドくさいのでできればそのままPHPを流用したい状況と思ってください。

とりあえずrootフォルダ配下に置いてみたけど、PHPインタプリタは実行されなかった。Apacheのハンドラがmodperlなのが原因かと思って、特定のパスだけdefault-handlerを適用するようにしてみたけど、その配下でもなぜか実行されない。。

仕方なく超アドホックにControllerに

my $body = `/usr/bin/php -f hoge.php`;
$c->res->body($body);

と書いて済まそうかと思ったけど、念の為CPANモジュールを検索してみたらちょうどいいのがありました。その名もPHP::Interpreter

こんな感じにPHPファイルを実行できて、しかもPerlのオブジェクトをPHPテンプレートに渡せるらしい。

my $p = PHP::Interpreter->new();
$p->include("hoge.php");

さらに素晴らしいことにCatalystのViewにもポートされていた(Catalyst::View::PHP)。Controllerにこんな感じで書ける。

$c->stash->{template} = 'hoge.php';
$c->forward($c->view('PHP'));

version0.01だしとりあえず作った感丸出しのモジュールだけど。。要件は満たせたから良しとしよう。

ちなみにうちの環境ではcpanコマンドからPHP::Interpreterをそのままインストールすることができませんでした。
Makefile.PLを見てみると

my $phpdir = shift @ARGV || ($^O eq 'MSWin32' ? 'C:\\php' : '/usr/local');

print "using phpdir $phpdir\n";

my $phpconfig = catfile $phpdir, 'bin', 'php-config';

とか書いてあって、/usr/local/bin配下にPHPがインストールされてることが前提になってる。。
うちの環境は/usr/bin/にあるのでこれまたアドホックにこの箇所を変更して

$ perl Makefile.PL
$ make
$ make install

でインストールできた。あとREADMEによるとPHPのバージョンは5.0.xか5.1.xで、configure時に--enable-embedオプションをつけておく必要があるようです。

MobileCatがすごい

一月くらいタイミングずれてますが。。とみたくんが公開してる、WebアプリケーションフレームワークCatalystを基盤にCPANモジュールを駆使して携帯サイトを構築するノウハウをまとめたサイトMobileCatは本当にすごいと思う。

携帯向け固有のややこしい問題に対応すべくモバイル系のCPANモジュールもたくさんあるんだけど、イマイチどう使い分けたり組み合わせればいいのかよくワカラン状態だった。
けど、サイト自体をサンプルアプリケーションとしてまるごとソースを公開してくれたことですべてが明快になってると思う。
あと携帯関係無くCatalystのアプリ構築例としてもすごい意味があると思うしね。ちょうど久々にCatalystでスクラッチから作る機会があったのでエラー処理周りやTemplate Toolkitの使い方など参考にさせてもらいました。

いやーしかしほんととみたくんの精力的な活動ぶりとまとめ能力はすごいなー。そもそもMobileCatで使ってるCPANモジュール自体とみたくんが関わっているものがいくつもあるし。
なーんもアウトプットの無い自分としてはちょっとでも見習わなくては。。HaskellでWebアプリでも作ってみるかな。。

30代最初の日

ライブ後、ご飯食べて家に帰ったらちょうど日付が変わって誕生日の11日。風邪はどんどん悪化してる。が、なんとなく気分は良かったので、微妙にタイミングを逃していた昔の彼女への結婚お祝いメールを勢いで書いて送る。早々に寝る前に30代一発目の音楽は何にしようかと考えてしばし選曲。結局今年に入ってから心酔しているムンズのLIFE IS BEAUTIFULをかけながら眠ることにする。ムンズもパラダイス・ガラージと同様にそっと心の側に忍び込んで寄り添ってくれる、素敵な歌を聴かせてくれる稀有なロックバンド。

朝起きても風邪はあまり良くなってなかった。普通に仕事したけど薬の飲み過ぎか一日中頭がボンヤリしていた。
職場ではケーキを振舞ってもらい、ケータイメールやmixiでもお祝いメッセージを何件かもらった。本当に有難い。俺はもっと身の回りの人たちに感謝しなくてはいけない。
ふらふらしながらも何とか1日の仕事を終えた帰りに、ふと誕生日プレゼントを自分で買ってやろうと思い立った。新宿タワレコに寄り、いろいろ選んだ結果に菊地成孔マイルス・デイヴィス研究本を買った。750Pぐらいあるけど、、、枕元に置いてチビチビ読んでいこう。

家に帰り、ふとテレビの横に置いてあったボ・ガンボス解散ライブDVDのジャケに目をやったら「1995年6月11日 日比谷野外音楽堂」だって!!半年ぐらい友達から借りっ放しなのに誕生日の当日にやっと気がついた。妙に嬉しい偶然なので通しで観て眠ることにした。満足ー。


M/D マイルス・デューイ・デイヴィスIII世研究

M/D マイルス・デューイ・デイヴィスIII世研究

タイムボガーン!ボ・ガンボス解散 [DVD]

タイムボガーン!ボ・ガンボス解散 [DVD]

THE JACK AND JIM SHOW(ユージン・チャドボーン, ジミー・カール・ブラック)@東高円寺U.F.O.CLUB

昨日は20代最後の日。ということで何だか久しぶりにギターもののライブを観たくなったので、ほとんど予備知識無かったけどこのページの告知が気になってユージン・チャドボーンを観に行った。つちのこ旅行の疲れからか風邪をひいてノドが熱くなってきていたが気づかない振りして東高円寺へ移動。
対バンは中原昌也ジム・オルークの即席?ユニットSUICIDAL 10CCと、関西のオシリペンペンズSUICIDAL 10CCはそのダジャレのユニット名(Suicidal TendenciesってハードコアのバンドとI'm Not In Loveの10ccを掛けていると思われる念の為)だけで十分役目を果たしてるね。中原氏は相変わらず意味不明に鋭い眼光を放ちつつ電子音を鳴らしていたのが面白かった。オシリペンペンズは初めて観たけど、ベースがいない分ゆらゆら帝国よりも音がスカッスカでタイトなのが格好よかった。ギターが地味にネジれてて気になるのでもう一回ちゃんと見てみたい。そういえば帰りの丸の内線のホームでゆらゆらのベースの人がうろうろしてた。何してたんだろう。

で、チャドボーン。下の動画のようにバンジョーとボ・ディドリーのような四角いエレクトリックギターを持ち替えて演奏。告知のプロフィール通りギターの腕前も変態的にうまかったけど、それよりもダニエル・ジョンストンを彷彿させる高い声のスウィートな歌声に魅かれた。多分いろいろカバー曲を歌ってたと思うんだけど、スモーク・オン・ザ・ウォーター以外は曲名分からなかった;;ドラムのジミーはパッと見ザッパのファーストに参加してた頃の面影は無いくらいのおじいちゃんなんだけど、押し引きを踏まえた味わい深いプレイ。ドラム叩くだけに飽き足らずに猥雑なカントリー・ブルースを塩辛い歌声で熱唱してくれた。




年をとっていくのはやっぱり恐怖を感じるし新しいことを始める勇気も無くなってくる。一方でこうやって禿げたりヨボヨボになっても現役で最高にブルースしてる人たちを見ると勇気づけられる。若さに全ての価値を置く必要は無いんだよな。人生の節目に彼らのステージに出会うことができて良かったと思う。