May 21, 2006

Catalystではてな認証APIを使うプラグイン

何かWebアプリでも作りたいなーという時にCatalystでがっつり認証処理を作るのは少し面倒。

そこで、Catalystで今流行り(?)のはてな認証を使うためのプラグインを書いてみました。中身はHatena::API::Authを単に使ってみただけ。

→Catalyst::Plugin::Authentication::Credential::HatenaAuth

これを使うとこんな感じに書けるようになります。

use Catalyst qw/Authentication::Credential::HatenaAuth/;

MyApp->config->{authentication}{hatenaauth} = {    
    secret   => 'xxxxxxxxx',
    api_key => 'xxxxxxxxxxxxxxxxxxxx',
};

__PACKAGE__->setup;

sub default : Private {
    my ( $self, $c ) = @_;
    $c->authenticate_hatena;
    $c->res->redirect('/') if $c->req->param('cert');

    if( $c->req->cookies->{hatenaauth} ){
    my %data = $c->req->cookies->{hatenaauth}->value;
        $c->stash->{username}       = $data{name};
        $c->stash->{image_url}       = $data{image_url};
        $c->stash->{thumbnail_url} = $data{thumbnail_url};
    }
}

sub login : Local {
        my ( $self, $c ) = @_;

        $c->res->redirect( $c->config->{hatena_api}->uri_to_login );
}

以下、一応使い方。

はてな認証に必要なのは秘密鍵とAPIキーなので、configかYAMLファイルのどちらかに指定しておきます。

# configに書く場合

MyApp->config->{authentication}{hatenaauth} = {    
    secret   => 'xxxxxxxxx',
    api_key => 'xxxxxxxxxxxxxxxxxxxx',
};

# myapp.ymlに書く場合

authentication:
    hatenaauth:
        secret:  xxxxxxxxx
        api_key: xxxxxxxxxxxxxxxxxxxx

Cookieに格納されたデータの受け取りと、はてな認証APIからの認証結果受け取り(コールバックURL)。この例ではトップページで両方やっています。
cert付きのURLで「更新」ボタンを押されるとエラーになるので、はてなの認証結果が来る時(certがあるとき)はリダイレクトしています。

sub default : Private {
    my ( $self, $c ) = @_;
    $c->authenticate_hatena; # これはcallback URLに書く。
    $c->res->redirect('/') if $c->req->param('cert'); # 

    if( $c->req->cookies->{hatenaauth} ){
    my %data = $c->req->cookies->{hatenaauth}->value;
        $c->stash->{username}       = $data{name};
        $c->stash->{image_url}       = $data{image_url};
        $c->stash->{thumbnail_url} = $data{thumbnail_url};
    }
}

http://example.com/loginをログインURLとする。

sub login : Local {
        my ( $self, $c ) = @_;

        $c->res->redirect( $c->config->{hatena_api}->uri_to_login );
}

後はTTで適当に分岐してあげれば、ログイン済みの場合はユーザ情報を表示し、そうでない場合にはログインURLを表示するということができます。

と、勢いで書いてみましたが果たしてこんなのに意味があるのかどうか・・。外向けのモジュールを書くのは初めてなので見当違いのことをしているのではないかと思えて仕方がありません。なんかすごく汚いような気も(汗)。いきなりCookieにぶち込むというのもどうなのやら。取りあえず自己満足です。ほぼTypeKeyのやつのパクりですし。

何か変なトコなどあればご指摘いただければ幸いです。というか、識者の方こういうの作ってくれないかなぁ。

5/29 CPANにありました。探したつもりですっかり忘れていたようです。更にこちらの作者の方よりご指摘を頂いていました。これではいろいろとまずいようです。取りあえず消しましたorz。

参考
http://www.tcool.org/catalyst/WritingPlugins.html
http://qootas.org/blog/archives/2005/06/catalyst_authen.html
http://blog.nomadscafe.jp/archives/000540.html
http://blog.nomadscafe.jp/archives/000501.html
http://d.hatena.ne.jp/hyuki/20060424

  

May 08, 2006

PlaggerでBloglinesとMixi日記をGmailに送る。

Plaggerを試してみました。
環境はMac OSX 10.4.6 + Perl 5.8.6。

# cpan install Plagger
# cpan install XML::RSS
# cpan install XML::RSS::LibXML
# cpan install XML::LibXML::Common
# cpan install WebService::Bloglines
# cpan install XML::Feed
# cpan install Net::SMTP::TLS
# cpan install WWW::Mixi

※Plaggerのインストールは以前にやっていて忘れたのでかなり適当。WebService::Bloglinesの依存関係モジュールが意外に多かったです。

# vi config.yaml
global:
assets_path: /Users/username/plagger/assets
timezone: Asia/Tokyo

plugins:
- module: Subscription::Bloglines
config:
username: foobar@example.com
password: password

- module: CustomFeed::Mixi
config:
email: email@example.com
password: password
fetch_body: 1
show_icon: 1

- module: Publish::Gmail
config:
mailto: example@gmail.com
mailfrom: dummy@teachat.org
mailroute:
via: smtp_tls
host: smtp.gmail.com:587
username: example@gmail.com
password: password


※最後の改行がないとエラー。「code: YAML_PARSE_ERR_NO_FINAL_NEWLINE」とか言われます。

# mkdir plagger
# mkdir plagger/assets
# mkdir plagger/assets/common
# cp /private/var/root/.cpan/build/Plagger-0.6.4/assets/plugins/Publish-Gmail/gmail_notify.tt plagger/assets/common/gmail_notify.tt

こちらこちらを参考に何やら対処。

# plagger -c ./config.yaml

実行。

取りあえず動作。便利っぽいです。Bloglinesの使いづらさに辟易していたし、Mixiはログインする気が全く起きないしで全く人の日記を読んでいなかったのですがこれで少しは読みやすくなりそうです。Mac miniは常時起動しているので、コマンドをcronに登録しておくことにしました。

Plaggerは他にもいろいろできそうですが、取りあえず触ってみたということで。


参考
http://plagger.org/trac/wiki/CookbookBloglinesGmail
http://sky.taro-web.com/2006/03/14/000552
http://kerolin.jspeed.jp/Computer/Linux/Plagger060322.html
http://en.yummy.stripper.jp/?eid=168211
http://d.hatena.ne.jp/tokuhirom/20060226/1140967554  

April 29, 2006

CPANモジュールの設定

よく忘れるので覚え書き。

# cpan
cpan> o conf prerequisites_policy follow
# モジュールの前提条件を満たしていないときに自動的に従う
cpan> o conf urllist unshift http://www.ring.gr.jp/pub/lang/perl/CPAN/
# ftpは失敗が多い気がするのでhttpを設定しておく
cpan> o conf commit
cpan>exit


参照
http://homepage3.nifty.com/hippo2000/perltips/CPAN.htm  

February 05, 2006

YAPC::Asia 2006 Tokyoのスピーカー

YAPC::Asia 2006 TokyoのスピーカーにLarry Wallが入っているんですが。Σ(゚Д゚)

うーんこれはびっくり。プログラミングPerlに日本が好きだと書いてくれる人なだけのことはありますね。一部のセッションは通訳なしの英語で行うとの話がありますが、彼のセッションは是非通訳付きでお願いしたいものです。  

November 03, 2005

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

久々に開催されたShibuya Perl Mongers テクニカルトーク #6に行ってきました。

簡単にメモ。

"Perl で ICFP(Perlは「最強の言語」か?)" - 澤勇太氏
MLでの明朗な回答がよく見られる澤勇太氏を初めて目撃。通信するプログラムなので$| = 1;にしなければならないところで詰まったとのことでした。こんな方でも何かに詰まる事があるのだなぁ。

ICFPの課題がどれほど過酷なのかがわかる内容でした。72時間で課題のプログラムを作成してその後仕様の変更に24時間で対処するという鬼のような内容の説明に場内爆笑(笑)

ICFPは中規模程度の開発であり、難解でメモリ効率の良い速いコードを如何に短時間で作るか、というコンテストのようです。多段ハッシュなどを使うとメモリ効率が悪すぎて制限時間内に実行できなかったりしたとか。私はすっかり富豪的プログラミングに慣れてしまったので、シビアにメモリ効率を考えるようなコーディングはとてもできそうにありません。というか72時間でなんて無理(^^;

Haskellが連覇しまくっていて、目下のところ地上最強の言語の名を欲しいままにしているとか。

"Six Apart and Perl" - 宮川達彦氏

リクエストに応えた北米滞在記とSix Apartのプロダクト開発について。live JournalのシステムはOSSでCVS公開されており、外部にもコミッターがいるとか。Sledgeのようだと思いました。live Journalはロードバランサ、プログラムからのみアクセス可能な独自ファイルシステム、それにキャッシュサーバが大きな役割を果たしているとのこと。興味深いです。

SixApartではQA(デバッグ), Stage(なんだっけ・・), Produce(リリース)の三段階に分けて開発を行い、StageとProcudeは共通のDBを見ているのが特徴的だとか。あとSubversionがCVSよりかなりイイらしい。テストにはTest::Harness/Test::Simple/Test::Moreなどを使っているそうですが、結局はブラウザ上から人間の手でデバッグをすることも多いとのこと。その際、自動的に画面を動かすようなWindowsソフトを用いたりもするとか。Internet Macrosとかみたいなものかも。

その他、世界中で利用されているソフトウェアなのでLocale::MaketextやDatetime::Localeが役に立っているとのこと。いつかは世界中で利用されるソフトウェア(に関わってみたい|を作ってみたい)ものですねえ。

"Learning Catalyst" - 加藤@おーさか氏

名前の勘違いでCatalystを触ったことがないのにCatalystの説明をするため、数日間で調べてきたとのこと。Catalystは全く知らない私には丁度良い、Catalystのチュートリアル的な内容でした。スクリプトは是非公開してもらいたいです。

"Catalyst Tips and Traps" - 加藤 亮氏

一部でブームとなっちゃってるCatalystの解説。

・Ruby on Rails型フレームワーク
・O/Rマッピングが特徴の一つ。もちろんClass::DBI
・scaffoldでスケルトンやコンポーネントを一発作成できる。
 でも自分の作りたいものにあわないこともあるのでその場合は自分でヘルパースクリプトを書けばOK
・CalystはRuby on Railsより制約が少なく自由度が高い=自分でいろいろ選択しないといけない
・制約が少ないのでオレオレフレームワークが作れる。フレームワークを作るフレームワークと言える。
・もちろんそのまんま使ってもOK

などなど。あとCPAN Autherになりたい人はプラグイン開発なんかが手軽でおすすめだとか。

"prototype.js と Perl で Ajax" - 伊藤直也氏

・prototype.jsはJavaScriptのフレームワーク
・Ruby on Railsで取り込まれている。それで有名になった
・便利なライブラリがいろいろある。これを使うとJavaScriptをPerlでuseするような感覚で書ける
・HTML::Prototypeを使うとJavaScriptを書かずにAjaxできる
・HTML::PrototypeはCatalystとかcgi::appのプラグインにもなってる
・Ajaxは「えーじゃっくす」らしい

なのでみんなもっとJavScriptを書こう!とのこと。確かにJavaScriptはかなり適当に書いてしまいます・・・。

"Pugs でお手軽 Perl6 入門" - 竹迫良範氏

・PugsはHaskellで書かれている
・ActivePerlに代わるツールとしてPxPerlというものがある。これでPugsが動く
・Perl6の言語仕様のお話。やはり後方互換性がない。かれこれ五年開発してる。
・PugsはJSAMを使える。今後が楽しみ、らしい



技術資料は公開されると思うので覚え書きです。このイベントには分不相応と思いながらもほとんど出席していますが、今回も期待に違わず充実した楽しい内容でした。ただ一年ぶりとなってしまったのがとても残念。ほんの数日の募集で120名が申し込んで即締め切られてしまい、しかもどうやら申込者がほぼ全員来ているという大人気のイベントのようですし、もっともっと頻繁に開催してもらいたいです。世界最大の.pm組織らしいし。有料でも構いません。次回のイベントに期待しますヽ(´ー`)ノ  

July 06, 2005

FreeBSDのPerlバージョン

FreeBSD(4まで)には標準でPerlがインストールされていますが、このPerlはバージョンがかなり古いです。しかし別のバージョンのPerlを追加でインストールするとシステム標準の/usr/bin/perlと追加インストールした/usr/local/bin/perlのバージョンが異なることになってしまい、その後portsでPerlモジュールをインストールする時などいろいろと面倒。

と思っていたら、use.perlを使えばシンボリックリンクなどを張らなくても入れ替えられる事を教えてもらいました。目から鱗。Σ(゚Д゚)

ということで覚え書き。


# use.perl port

とすれば、/usr/bin/perl、/usr/local/bin/perl共にportsでインストールしたPerlのバージョンになり、


# use.perl system

とすればシステム標準のPerl(4系では5.005_03)に変化します。
※このコマンドを実行すると/etc/make.confが書き換わるようです。

当然のことながらモジュールも、しっかりとバージョンごとに異なるものを読んでくれます。

# perl -v

This is perl, v5.8.6 built for i386-freebsd-64int
(with 2 registered patches, see perl -V for more detail)

# perl -MJcode -e 'print $Jcode::VERSION'
0.88
# use.perl system
Removing stale symlinks from /usr/bin...
(略)
Done.
Cleaning up /etc/make.conf... Done.
Cleaning up /etc/manpath.config... Done.
# perl -v

This is perl, version 5.005_03 built for i386-freebsd

# perl -MJcode -e 'print $Jcode::VERSION'
0.83
# use.perl port
Removing stale symlinks from /usr/bin...
(略)
Done.
Cleaning up /etc/make.conf... Done.
Spamming /etc/make.conf... Done.
Cleaning up /etc/manpath.config... Done.
Spamming /etc/manpath.config... Done.
# perl -v

This is perl, v5.8.6 built for i386-freebsd-64int
(with 2 registered patches, see perl -V for more detail)



use.perlでバージョンが変化するのは「/usr/bin/perl」のようです。「/usr/local/bin/perl」は変化しませんでした。
なお、Perlをportsでなくソースからコンパイルした場合にはuse.perlは使えないので注意する必要があります。


参考
http://iris.homeunix.net/yayoi/freebsd/maintenance/perlup.asp  

January 16, 2005

ロリポップのPerlモジュール

ロリポップを借りたのでPerl環境を確認してみました。レンタルサーバを借りるのは久しぶりです。 本当はroot権限が欲しいのですが高いし面倒なので今回はパス。

>perl -v

This is perl, v5.8.0 built for i386-linux-thread-multi
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2002, Larry Wall (以下略)

Perlモジュールは「perl -MCPAN -e 'autobundle'」で見ようと思ったらCPANモジュールがないみたいなので、 ここのスクリプトを使いました。結果は下のほうに。 噂どおりなかなか充実しています。Template-ToolkitとClass::DBIが入っていないのが残念。メールしてみようかな。

  • AnyDBM_File
  • AutoLoader
  • AutoSplit
  • B
  • Benchmark
  • ByteLoader
  • CGI
  • Carp
  • Config
  • Cwd
  • DB
  • DBI
  • DB_File
  • Digest
  • DirHandle
  • Dumpvalue
  • DynaLoader
  • Encode
  • English
  • Env
  • Errno
  • Exporter
  • Fatal
  • Fcntl
  • FileCache
  • FileHandle
  • FindBin
  • GD
  • GDBM_File
  • IO
  • Jcode
  • LWP
  • Memoize
  • Mysql
  • NEXT
  • NKF
  • O
  • Opcode
  • POSIX
  • PerlIO
  • SDBM_File
  • Safe
  • SelectSaver
  • SelfLoader
  • Shell
  • Socket
  • Storable
  • Switch
  • Symbol
  • Test
  • Thread
  • UNIVERSAL
  • URI
  • XSLoader
  • attributes
  • attrs
  • autouse
  • base
  • bigint
  • bignum
  • bigrat
  • blib
  • bytes
  • charnames
  • constant
  • diagnostics
  • encoding
  • fields
  • filetest
  • if
  • integer
  • less
  • lib
  • locale
  • open
  • ops
  • overload
  • re
  • sigtrap
  • sort
  • strict
  • subs
  • threads
  • utf8
  • vars
  • vmsish
  • warnings
  • 5.8.0::
    • 5.8.0::LWP
    • 5.8.0::URI
    • Bundle::
      • 5.8.0::Bundle::LWP
      • 5.8.0::Bundle::PlRPC
    • Class::
      • 5.8.0::Class::Loader
      • 5.8.0::Class::LoaderTest
    • Config::
      • 5.8.0::Config::General
      • General::
        • 5.8.0::Config::General::Extended
        • 5.8.0::Config::General::Interpolated
    • Convert::
      • 5.8.0::Convert::ASN1
      • 5.8.0::Convert::PEM
      • ASN1::
        • 5.8.0::Convert::ASN1::Debug
        • 5.8.0::Convert::ASN1::IO
        • 5.8.0::Convert::ASN1::_decode
        • 5.8.0::Convert::ASN1::_encode
        • 5.8.0::Convert::ASN1::parser
      • PEM::
        • 5.8.0::Convert::PEM::CBC
        • 5.8.0::Convert::PEM::ErrorHandler
    • Crypt::
      • 5.8.0::Crypt::CBC
      • 5.8.0::Crypt::DES_EDE3
      • 5.8.0::Crypt::DSA
      • 5.8.0::Crypt::Random
      • DSA::
        • 5.8.0::Crypt::DSA::Key
        • 5.8.0::Crypt::DSA::KeyChain
        • 5.8.0::Crypt::DSA::Signature
        • 5.8.0::Crypt::DSA::Util
        • Key::
          • 5.8.0::Crypt::DSA::Key::PEM
          • 5.8.0::Crypt::DSA::Key::SSH2
      • Random::
        • 5.8.0::Crypt::Random::Generator
        • Provider::
          • 5.8.0::Crypt::Random::Provider::File
          • 5.8.0::Crypt::Random::Provider::devrandom
          • 5.8.0::Crypt::Random::Provider::devurandom
          • 5.8.0::Crypt::Random::Provider::egd
          • 5.8.0::Crypt::Random::Provider::rand
    • Data::
      • 5.8.0::Data::Buffer
      • 5.8.0::Data::Grove
      • Grove::
        • 5.8.0::Data::Grove::Parent
        • 5.8.0::Data::Grove::Visitor
    • Date::
      • 5.8.0::Date::Manip
      • Japanese::
        • 5.8.0::Date::Japanese::Holiday
    • File::
      • 5.8.0::File::Listing
      • 5.8.0::File::MMagic
      • 5.8.0::File::Temp
    • HTML::
      • 5.8.0::HTML::Form
      • 5.8.0::HTML::Tagset
      • 5.8.0::HTML::Template
    • HTTP::
      • 5.8.0::HTTP::Cookies
      • 5.8.0::HTTP::Daemon
      • 5.8.0::HTTP::Date
      • 5.8.0::HTTP::Headers
      • 5.8.0::HTTP::Message
      • 5.8.0::HTTP::Negotiate
      • 5.8.0::HTTP::Request
      • 5.8.0::HTTP::Response
      • 5.8.0::HTTP::Status
      • Headers::
        • 5.8.0::HTTP::Headers::Auth
        • 5.8.0::HTTP::Headers::ETag
        • 5.8.0::HTTP::Headers::Util
      • Request::
        • 5.8.0::HTTP::Request::Common
    • IO::
      • 5.8.0::IO::AtomicFile
      • 5.8.0::IO::InnerFile
      • 5.8.0::IO::Lines
      • 5.8.0::IO::Scalar
      • 5.8.0::IO::ScalarArray
      • 5.8.0::IO::Stringy
      • 5.8.0::IO::Wrap
      • 5.8.0::IO::WrapTie
    • Image::
      • 5.8.0::Image::Size
    • LWP::
      • 5.8.0::LWP::ConnCache
      • 5.8.0::LWP::Debug
      • 5.8.0::LWP::MediaTypes
      • 5.8.0::LWP::MemberMixin
      • 5.8.0::LWP::Protocol
      • 5.8.0::LWP::RobotUA
      • 5.8.0::LWP::Simple
      • 5.8.0::LWP::UserAgent
      • Authen::
        • 5.8.0::LWP::Authen::Basic
        • 5.8.0::LWP::Authen::Digest
      • Protocol::
        • 5.8.0::LWP::Protocol::GHTTP
        • 5.8.0::LWP::Protocol::data
        • 5.8.0::LWP::Protocol::file
        • 5.8.0::LWP::Protocol::ftp
        • 5.8.0::LWP::Protocol::gopher
        • 5.8.0::LWP::Protocol::http
        • 5.8.0::LWP::Protocol::http10
        • 5.8.0::LWP::Protocol::https
        • 5.8.0::LWP::Protocol::https10
        • 5.8.0::LWP::Protocol::mailto
        • 5.8.0::LWP::Protocol::nntp
        • 5.8.0::LWP::Protocol::nogo
    • MIME::
      • 5.8.0::MIME::Body
      • 5.8.0::MIME::Decoder
      • 5.8.0::MIME::Entity
      • 5.8.0::MIME::Head
      • 5.8.0::MIME::Parser
      • 5.8.0::MIME::Tools
      • 5.8.0::MIME::WordDecoder
      • 5.8.0::MIME::Words
      • Decoder::
        • 5.8.0::MIME::Decoder::Base64
        • 5.8.0::MIME::Decoder::Binary
        • 5.8.0::MIME::Decoder::Gzip64
        • 5.8.0::MIME::Decoder::NBit
        • 5.8.0::MIME::Decoder::QuotedPrint
        • 5.8.0::MIME::Decoder::UU
      • Field::
        • 5.8.0::MIME::Field::ConTraEnc
        • 5.8.0::MIME::Field::ContDisp
        • 5.8.0::MIME::Field::ContType
        • 5.8.0::MIME::Field::ParamVal
      • Parser::
        • 5.8.0::MIME::Parser::AbstractFiler
        • 5.8.0::MIME::Parser::Filer
        • 5.8.0::MIME::Parser::FlatFiler
        • 5.8.0::MIME::Parser::Reader
        • 5.8.0::MIME::Parser::Redoer
        • 5.8.0::MIME::Parser::Results
        • 5.8.0::MIME::Parser::TreeFiler
        • 5.8.0::MIME::Parser::UURedoer
      • Tools::
        • 5.8.0::MIME::Tools::IndentingLogger
        • 5.8.0::MIME::Tools::Logger
        • 5.8.0::MIME::Tools::MailFieldParserForRFC2045
        • 5.8.0::MIME::Tools::MailFieldTokenizerForRFC2045
        • 5.8.0::MIME::Tools::MailFieldTokenizerForRFC822
        • 5.8.0::MIME::Tools::NullLogger
        • 5.8.0::MIME::Tools::PrefixingLogger
        • 5.8.0::MIME::Tools::ToolkitLogger
        • 5.8.0::MIME::Tools::Utils
    • Mail::
      • 5.8.0::Mail::Address
      • 5.8.0::Mail::Cap
      • 5.8.0::Mail::Field
      • 5.8.0::Mail::Filter
      • 5.8.0::Mail::Header
      • 5.8.0::Mail::Internet
      • 5.8.0::Mail::Mailer
      • 5.8.0::Mail::Send
      • 5.8.0::Mail::Util
      • Field::
        • 5.8.0::Mail::Field::AddrList
        • 5.8.0::Mail::Field::Date
      • Mailer::
        • 5.8.0::Mail::Mailer::qmail
        • 5.8.0::Mail::Mailer::rfc822
        • 5.8.0::Mail::Mailer::sendmail
        • 5.8.0::Mail::Mailer::smtp
        • 5.8.0::Mail::Mailer::testfile
    • Net::
      • 5.8.0::Net::Daemon
      • 5.8.0::Net::HTTP
      • 5.8.0::Net::HTTPS
      • Daemon::
        • 5.8.0::Net::Daemon::Log
        • 5.8.0::Net::Daemon::Test
      • HTTP::
        • 5.8.0::Net::HTTP::Methods
        • 5.8.0::Net::HTTP::NB
    • Parse::
      • 5.8.0::Parse::Yapp
      • Yapp::
        • 5.8.0::Parse::Yapp::Driver
        • 5.8.0::Parse::Yapp::Grammar
        • 5.8.0::Parse::Yapp::Lalr
        • 5.8.0::Parse::Yapp::Options
        • 5.8.0::Parse::Yapp::Output
        • 5.8.0::Parse::Yapp::Parse
    • RPC::
      • 5.8.0::RPC::PlClient
      • 5.8.0::RPC::PlServer
      • PlServer::
        • 5.8.0::RPC::PlServer::Comm
        • 5.8.0::RPC::PlServer::Test
    • Test::
      • 5.8.0::Test::Manifest
    • Time::
      • 5.8.0::Time::CTime
      • 5.8.0::Time::DaysInMonth
      • 5.8.0::Time::JulianDay
      • 5.8.0::Time::ParseDate
      • 5.8.0::Time::Timezone
    • URI::
      • 5.8.0::URI::Escape
      • 5.8.0::URI::Heuristic
      • 5.8.0::URI::URL
      • 5.8.0::URI::WithBase
      • 5.8.0::URI::_foreign
      • 5.8.0::URI::_generic
      • 5.8.0::URI::_login
      • 5.8.0::URI::_query
      • 5.8.0::URI::_segment
      • 5.8.0::URI::_server
      • 5.8.0::URI::_userpass
      • 5.8.0::URI::data
      • 5.8.0::URI::file
      • 5.8.0::URI::ftp
      • 5.8.0::URI::gopher
      • 5.8.0::URI::http
      • 5.8.0::URI::https
      • 5.8.0::URI::ldap
      • 5.8.0::URI::mailto
      • 5.8.0::URI::news
      • 5.8.0::URI::nntp
      • 5.8.0::URI::pop
      • 5.8.0::URI::rlogin
      • 5.8.0::URI::rsync
      • 5.8.0::URI::rtsp
      • 5.8.0::URI::rtspu
      • 5.8.0::URI::snews
      • 5.8.0::URI::ssh
      • 5.8.0::URI::telnet
      • 5.8.0::URI::urn
      • file::
        • 5.8.0::URI::file::Base
        • 5.8.0::URI::file::FAT
        • 5.8.0::URI::file::Mac
        • 5.8.0::URI::file::OS2
        • 5.8.0::URI::file::QNX
        • 5.8.0::URI::file::Unix
        • 5.8.0::URI::file::Win32
      • urn::
        • 5.8.0::URI::urn::isbn
        • 5.8.0::URI::urn::oid
    • WWW::
      • 5.8.0::WWW::RobotRules
      • RobotRules::
        • 5.8.0::WWW::RobotRules::AnyDBM_File
    • XML::
      • 5.8.0::XML::Checker
      • 5.8.0::XML::DOM
      • 5.8.0::XML::Dumper
      • 5.8.0::XML::ESISParser
      • 5.8.0::XML::Encoding
      • 5.8.0::XML::Grove
      • 5.8.0::XML::Perl2SAX
      • 5.8.0::XML::RSS
      • 5.8.0::XML::RegExp
      • 5.8.0::XML::SAX2Perl
      • 5.8.0::XML::Twig
      • 5.8.0::XML::UM
      • 5.8.0::XML::XQL
      • Checker::
        • 5.8.0::XML::Checker::DOM
        • 5.8.0::XML::Checker::Parser
      • DOM::
        • 5.8.0::XML::DOM::DOMException
        • 5.8.0::XML::DOM::NamedNodeMap
        • 5.8.0::XML::DOM::NodeList
        • 5.8.0::XML::DOM::PerlSAX
        • 5.8.0::XML::DOM::ValParser
      • Filter::
        • 5.8.0::XML::Filter::DetectWS
        • 5.8.0::XML::Filter::Reindent
        • 5.8.0::XML::Filter::SAXT
      • Grove::
        • 5.8.0::XML::Grove::AsCanonXML
        • 5.8.0::XML::Grove::AsString
        • 5.8.0::XML::Grove::Builder
        • 5.8.0::XML::Grove::Factory
        • 5.8.0::XML::Grove::IDs
        • 5.8.0::XML::Grove::Path
        • 5.8.0::XML::Grove::PerlSAX
        • 5.8.0::XML::Grove::Sub
        • 5.8.0::XML::Grove::Subst
        • 5.8.0::XML::Grove::XPointer
      • Handler::
        • 5.8.0::XML::Handler::BuildDOM
        • 5.8.0::XML::Handler::CanonXMLWriter
        • 5.8.0::XML::Handler::Composer
        • 5.8.0::XML::Handler::PrintEvents
        • 5.8.0::XML::Handler::Sample
        • 5.8.0::XML::Handler::Subs
        • 5.8.0::XML::Handler::XMLWriter
      • Parser::
        • 5.8.0::XML::Parser::PerlSAX
      • PatAct::
        • 5.8.0::XML::PatAct::ActionTempl
        • 5.8.0::XML::PatAct::Amsterdam
        • 5.8.0::XML::PatAct::MatchName
        • 5.8.0::XML::PatAct::PatternTempl
        • 5.8.0::XML::PatAct::ToObjects
      • XQL::
        • 5.8.0::XML::XQL::DOM
        • 5.8.0::XML::XQL::Date
        • 5.8.0::XML::XQL::Debug
        • 5.8.0::XML::XQL::DirXQL
        • 5.8.0::XML::XQL::Parser
        • 5.8.0::XML::XQL::Plus
        • 5.8.0::XML::XQL::Strict
    • i386-linux-thread-multi::
      • 5.8.0::i386-linux-thread-multi::DBI
      • 5.8.0::i386-linux-thread-multi::GD
      • 5.8.0::i386-linux-thread-multi::Jcode
      • 5.8.0::i386-linux-thread-multi::Mysql
      • 5.8.0::i386-linux-thread-multi::NKF
      • Bit::
        • 5.8.0::i386-linux-thread-multi::Bit::Vector
        • Vector::
          • 5.8.0::i386-linux-thread-multi::Bit::Vector::Overload
      • Bundle::
        • 5.8.0::i386-linux-thread-multi::Bundle::DBI
        • DBD::
          • 5.8.0::i386-linux-thread-multi::Bundle::DBD::mysql
      • Carp::
        • 5.8.0::i386-linux-thread-multi::Carp::Clan
      • Compress::
        • 5.8.0::i386-linux-thread-multi::Compress::Zlib
      • Crypt::
        • 5.8.0::i386-linux-thread-multi::Crypt::DES
      • DBD::
        • 5.8.0::i386-linux-thread-multi::DBD::ExampleP
        • 5.8.0::i386-linux-thread-multi::DBD::NullP
        • 5.8.0::i386-linux-thread-multi::DBD::Proxy
        • 5.8.0::i386-linux-thread-multi::DBD::Sponge
        • 5.8.0::i386-linux-thread-multi::DBD::mysql
        • mysql::
          • 5.8.0::i386-linux-thread-multi::DBD::mysql::GetInfo
      • DBI::
        • 5.8.0::i386-linux-thread-multi::DBI::Changes
        • 5.8.0::i386-linux-thread-multi::DBI::DBD
        • 5.8.0::i386-linux-thread-multi::DBI::FAQ
        • 5.8.0::i386-linux-thread-multi::DBI::Profile
        • 5.8.0::i386-linux-thread-multi::DBI::ProfileData
        • 5.8.0::i386-linux-thread-multi::DBI::ProfileDumper
        • 5.8.0::i386-linux-thread-multi::DBI::ProxyServer
        • 5.8.0::i386-linux-thread-multi::DBI::PurePerl
        • 5.8.0::i386-linux-thread-multi::DBI::W32ODBC
        • Const::
          • 5.8.0::i386-linux-thread-multi::DBI::Const::GetInfoReturn
          • 5.8.0::i386-linux-thread-multi::DBI::Const::GetInfoType
          • GetInfo::
            • 5.8.0::i386-linux-thread-multi::DBI::Const::GetInfo::ANSI
            • 5.8.0::i386-linux-thread-multi::DBI::Const::GetInfo::ODBC
        • DBD::
          • 5.8.0::i386-linux-thread-multi::DBI::DBD::Metadata
        • ProfileDumper::
          • 5.8.0::i386-linux-thread-multi::DBI::ProfileDumper::Apache
      • Date::
        • 5.8.0::i386-linux-thread-multi::Date::Calc
        • 5.8.0::i386-linux-thread-multi::Date::Calendar
        • 5.8.0::i386-linux-thread-multi::Date::Simple
        • Calc::
          • 5.8.0::i386-linux-thread-multi::Date::Calc::Object
        • Calendar::
          • 5.8.0::i386-linux-thread-multi::Date::Calendar::Profiles
          • 5.8.0::i386-linux-thread-multi::Date::Calendar::Year
        • Simple::
          • 5.8.0::i386-linux-thread-multi::Date::Simple::D8
          • 5.8.0::i386-linux-thread-multi::Date::Simple::Fmt
          • 5.8.0::i386-linux-thread-multi::Date::Simple::ISO
          • 5.8.0::i386-linux-thread-multi::Date::Simple::NoXS
      • Digest::
        • 5.8.0::i386-linux-thread-multi::Digest::SHA1
      • Filter::
        • 5.8.0::i386-linux-thread-multi::Filter::cpp
        • 5.8.0::i386-linux-thread-multi::Filter::decrypt
        • 5.8.0::i386-linux-thread-multi::Filter::exec
        • 5.8.0::i386-linux-thread-multi::Filter::sh
        • 5.8.0::i386-linux-thread-multi::Filter::tee
        • Util::
          • 5.8.0::i386-linux-thread-multi::Filter::Util::Call
          • 5.8.0::i386-linux-thread-multi::Filter::Util::Exec
      • GD::
        • 5.8.0::i386-linux-thread-multi::GD::Polyline
      • HTML::
        • 5.8.0::i386-linux-thread-multi::HTML::Entities
        • 5.8.0::i386-linux-thread-multi::HTML::Filter
        • 5.8.0::i386-linux-thread-multi::HTML::HeadParser
        • 5.8.0::i386-linux-thread-multi::HTML::LinkExtor
        • 5.8.0::i386-linux-thread-multi::HTML::Parser
        • 5.8.0::i386-linux-thread-multi::HTML::PullParser
        • 5.8.0::i386-linux-thread-multi::HTML::TokeParser
      • Image::
        • 5.8.0::i386-linux-thread-multi::Image::Magick
      • Jcode::
        • 5.8.0::i386-linux-thread-multi::Jcode::Constants
        • 5.8.0::i386-linux-thread-multi::Jcode::H2Z
        • 5.8.0::i386-linux-thread-multi::Jcode::Tr
        • 5.8.0::i386-linux-thread-multi::Jcode::Unicode
        • Unicode::
          • 5.8.0::i386-linux-thread-multi::Jcode::Unicode::Constants
          • 5.8.0::i386-linux-thread-multi::Jcode::Unicode::NoXS
      • Math::
        • 5.8.0::i386-linux-thread-multi::Math::Pari
        • 5.8.0::i386-linux-thread-multi::Math::PariInit
      • Mysql::
        • 5.8.0::i386-linux-thread-multi::Mysql::Statement
      • Net::
        • 5.8.0::i386-linux-thread-multi::Net::SSLeay
        • SSLeay::
          • 5.8.0::i386-linux-thread-multi::Net::SSLeay::Handle
      • Text::
        • 5.8.0::i386-linux-thread-multi::Text::Kakasi
      • Unicode::
        • 5.8.0::i386-linux-thread-multi::Unicode::CharName
        • 5.8.0::i386-linux-thread-multi::Unicode::Map
        • 5.8.0::i386-linux-thread-multi::Unicode::String
      • Win32::
        • 5.8.0::i386-linux-thread-multi::Win32::DBIODBC
      • XML::
        • 5.8.0::i386-linux-thread-multi::XML::Parser
        • Parser::
          • 5.8.0::i386-linux-thread-multi::XML::Parser::Expat
  • Attribute::
    • Attribute::Handlers
    • Handlers::
      • demo::
        • Attribute::Handlers::demo::Demo
        • Attribute::Handlers::demo::Descriptions
        • Attribute::Handlers::demo::MyClass
  • B::
    • B::Asmdata
    • B::Assembler
    • B::Bblock
    • B::Bytecode
    • B::C
    • B::CC
    • B::Concise
    • B::Debug
    • B::Deparse
    • B::Disassembler
    • B::Lint
    • B::Showlex
    • B::Stackobj
    • B::Stash
    • B::Terse
    • B::Xref
  • Bit::
    • Bit::Vector
    • Vector::
      • Bit::Vector::Overload
  • Bundle::
    • Bundle::DBI
    • Bundle::LWP
    • Bundle::PlRPC
    • DBD::
      • Bundle::DBD::mysql
  • CGI::
    • CGI::Apache
    • CGI::Carp
    • CGI::Cookie
    • CGI::Fast
    • CGI::Pretty
    • CGI::Push
    • CGI::Switch
    • CGI::Util
  • Carp::
    • Carp::Clan
    • Carp::Heavy
  • Class::
    • Class::ISA
    • Class::Loader
    • Class::LoaderTest
    • Class::Struct
  • Compress::
    • Compress::Zlib
  • Config::
    • Config::General
    • General::
      • Config::General::Extended
      • Config::General::Interpolated
  • Convert::
    • Convert::ASN1
    • Convert::PEM
    • ASN1::
      • Convert::ASN1::Debug
      • Convert::ASN1::IO
      • Convert::ASN1::_decode
      • Convert::ASN1::_encode
      • Convert::ASN1::parser
    • PEM::
      • Convert::PEM::CBC
      • Convert::PEM::ErrorHandler
  • Crypt::
    • Crypt::CBC
    • Crypt::DES
    • Crypt::DES_EDE3
    • Crypt::DSA
    • Crypt::Random
    • DSA::
      • Crypt::DSA::Key
      • Crypt::DSA::KeyChain
      • Crypt::DSA::Signature
      • Crypt::DSA::Util
      • Key::
        • Crypt::DSA::Key::PEM
        • Crypt::DSA::Key::SSH2
    • Random::
      • Crypt::Random::Generator
      • Provider::
        • Crypt::Random::Provider::File
        • Crypt::Random::Provider::devrandom
        • Crypt::Random::Provider::devurandom
        • Crypt::Random::Provider::egd
        • Crypt::Random::Provider::rand
  • DBD::

December 23, 2004

Net::Amazon & XML::RSS で Amazon ウィッシュリストをRSSにする

wishlist

読みたい本、読まなければならない本は増える一方なのですが消費量は低下するばかりで、Amazonのウィッシュリストはどんどん増えていくのでした。これをWebで確認するのは面倒なのでRSSリーダーで読めたらいいなぁと思い、ウィッシュリストをRSSにして出力するスクリプトを作ってみました。

   続きを読む

December 16, 2004

Shibuya Perl Mongers テクニカルトーク #5

Shibuya Perl Mongers テクニカルトーク #5に行ってきました。このイベントに出席するのは今回で三回目。相変わらず豪華なスピーカー陣で満足。

無線LANの不調とのことで宮川さんのiPod&iTunes Hacksのデモが余り見られなかったのが残念でした。AirMac StationのPerlモジュールを作られているそうなので、公開の暁にはAirMac Station買っちゃうかも。iPod&iTunes Hacksは春に邦訳が出版されるようなのでこちらも面白そうです。

他の方のプログラムも興味深いものばかりでとても面白かったです。
小山さんのは難しすぎて消化不良でしたが。JavaScriptがあんなに深いとは・・(´Д⊂グスン  

November 27, 2004

Net::Amazonでウィッシュリストを取得してみる

NDO::Weblogの Amazon ウィッシュリストを JavaScript にしてウェブサイトに貼り付けるスクリプトが面白そうだったので試してみました。

しかし正常に動作せず閉口。いくつかの項目が取得できません。Net::Amazonのドキュメントを見ながらいろいろ試していたのですが、単にスクリプトの文字コードがUTF-8になっていないのが原因でした。うーん間抜けだ(^^;

今回戸惑った点は主に下記。

・スクリプトの文字コードの見落とし
・自分のウィッシュリストIDがわからなかった
・デベロッパー・トークンの取得方法がわからなかった。

ウィッシュリストIDはAmazon.co.jpのウィッシュリスト画面の「このリストを友だちにメールで知らせる」ボタンからの操作で任意のメールアドレスに送信すれば、URLの一部に含まれています。(他に確認する方法ないのかなぁ)

デベロッパー・トークンはAmazon.comからでないと取得できません。アカウントを作成後、AWSを申し込めば取得できます。
場所がわかりづらいですがhttp://www.amazon.com/gp/aws/registration/registration-form.htmlから行けます。

※現在、デベロッパー・トークンはsubscription IDという名前になっているようです。
以下FAQから引用。
2) What is a developer token?

A developer token is a unique identifier Amazon assigned in the past to developers when they applied to use AWS. We are no longer issuing developer tokens to AWS developers. Instead, we are issuing subscription IDs (see previous question). You may find that older books and articles about AWS use the term developer token. Simply use your subscription ID in any place where a developer token is requested.


Net::Amazonのドキュメントも読んでみたのですが、簡単で面白そうなモジュールです。AWSがはじまった当初から、今ひとつこのサービスのうまい使い方を思いつかないのですが、こういうツールがあると取りあえず何か作ってみたくなりますね。

単に自分のウィッシュリストを取得するだけなら下記のような感じでできます。
#!/usr/local/bin/perl

use strict;
use warnings;
use Net::Amazon;
use encoding "euc-jp";

use constant DEV_TOKEN => 'YOUR_AMZN_TOKEN';
use constant WISHLIST_ID => 'YOUR_WISH_LIST';

my $ua = Net::Amazon->new(
token => DEV_TOKEN,
locale => 'jp',
);
my $response = $ua->search( wishlist => WISHLIST_ID );
for ($response->properties){
print $_->ProductName() . "\t" . $_->OurPrice() . "\n";
}


ちなみにNDO::Weblogのスクリプトを動作させるために、私の環境では下記のPerlモジュールのインストールが必要でした。依存関係が多すぎてかなり面倒。。(^^;

http://search.cpan.org/CPAN/authors/id/A/AB/ABW/Template-Toolkit-2.14.tar.gz
http://search.cpan.org/CPAN/authors/id/M/MS/MSCHILLI/Net-Amazon-0.32.tar.gz
http://www.cpan.org/authors/id/C/CL/CLEISHMAN/Cache-2.02.tar.gz
http://www.cpan.org/authors/id/A/AB/ABW/AppConfig-1.56.tar.gz
http://www.cpan.org/authors/id/B/BB/BBB/File-NFSLock-1.20.tar.gz
http://www.cpan.org/authors/id/G/GR/GRANTM/XML-Simple-2.13.tar.gz
http://www.cpan.org/authors/id/M/MS/MSCHILLI/Log-Log4perl-0.49.tar.gz
http://www.cpan.org/authors/id/G/GB/GBARR/TimeDate-1.16.tar.gz
http://www.cpan.org/authors/id/G/GA/GAAS/Digest-SHA1-2.10.tar.gz
http://www.cpan.org/authors/id/C/CO/COOPERCL/XML-Parser-2.31.tar.gz

ウィッシュリストは生成できましたが、公開しません。ヽ(´ー`)ノ