目次


洗練された Perl

ビジネスにとっての最良の友、Flickr

CPAN モジュールを使ってチャートを作成し、Flickr にアップロードする

Comments

コンテンツシリーズ

このコンテンツは全#シリーズのパート#です: 洗練された Perl

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:洗練された Perl

このシリーズの続きに乞うご期待。

そう、Flickr です。Flickr は、かわいい子犬や、少しピンボケの夕日、ウェディング・ケーキなどの写真を掲載するための場所としては、文句なしに最高の場所です。Flickr はビジネスのツールとしては決して有名ではありませんが、この記事では Perl を使って Flickr を活用するためのビジネス指向の方法をいくつか紹介します。

ビジネスでの Flickr の一般的な使い方は、製品を表示するためでした。これは、物理的な製品、特に視覚に訴えることが効果的な製品を販売する企業にとっては非常に有効です。その点に関して、ここで詳しく説明する必要はありません。製品の写真を Flickr にアップロードするツールは多数あり、それらのツールで十分に用が足ります。

そうしたツールを使う代わりに、CPAN の Chart モジュール (元々は Dave Bonner によって作成され、現在は Chart グループによって管理されています) を使ってビジネス用途のカスタム・チャートを作成する方法を説明します。ここでは 1 年間にわたる株価の実績を (偽のデータを使って) 作成し、そのチャートを Flickr のアルバムに投稿します (このアルバムには過去の実績チャートも示されています)。ここでは Flickr の機能のうち、このアプリケーションにとって意味のある機能のみを使用します。そのため、Flickr API のすべてを解説するわけではありません。Flickr API の全体を知るためには Flickr API のサイトに行き、そのドキュメントをよく読んでください。ドキュメントは読みやすく、非常に詳しい解説がされています。この Flickr API は Perl から簡単に利用することができます。

チャート用に Google API を使うこともできますが、この記事の執筆時点では Perl で Chart モジュールを使った方が、JavaScript で Google Charts API を使うよりも多くのことができます。しかしこれは変わるかもしれません。そのため、Google のツールにも注目している必要があります。

目標は何か

まず、チャート用のデータをランダムに生成し、そのデータをリストの中に直接配置しましょう。通常はファイルやデータベースのデータを使用しますが、それではあまりにも面白くないため、そのステップは省略することにします。

ここでは、このリストを使ってチャートを画像として作成します。そしてこのチャートを Flickr にアップロードし、適切なタグと説明を付けます。簡単だと思いませんか。

Chart モジュールをインストールする際には、単純に Chart をインストールすることはできないことを忘れないでください。インストールは、例えば Chart::Lines のようにする必要があります。

ランダム・データを生成する

ランダム・データの生成は難しくはありません。そこで、まず数字の 100 から始め、それに続くすべてのデータ・ポイントが前のデータ・ポイントとランダムなオフセットを持つようにして 200 個のデータ・ポイントを作成し、ランダムな上昇または下落が最大で 0.5 であるようにします。架空の例ではこの程度にとどめておきますが、カーブの最高値と最安値をマーキングする複合チャートを使用したり、MACD (訳注: MACD とは為替の売買のタイミングを判断する手法のひとつ) を計算したりしても面白いかもしれません。冒険心に富んだ人は試してみてください。

リスト 1. chart_uploadr.pl: ランダムなデータを生成する
my $max = 200;         # the maximum data points

# generate random data and labels for it
my @data = ([100], [100]);
my @labels = (0);

foreach (1..$max)
{
 # I know there are 20 options for skipping ticks, but this works better for me
 push @labels, every(25) ? $_ : undef ;

 # the delta is from [ -.5 up to .5 )
 foreach my $array (@data)
 {
  push @$array, $array->[-1];
  $array->[-1] += (0.5 - rand 1);
 }
}

この手法は以下のとおりです。それぞれ 1 つの要素を持つ 2 つの配列を含む @data から開始します。これが 2 つのデータ・セットの開始値です。ラベルもゼロから開始します。ここで、以下の処理を 200 回行います。現在のループの繰り返し数に等しいラベルを @labels リストに追加し (25 回ごとに、合計で 200/25 = 8 個のラベルを追加します)、各データ・セットの最後の値を同じデータ・セットの新しい最後の値となるようにコピーし、その値にランダムな上下調整を適用します。一時変数は必要ありません。

リスト 1 では CPAN の Every モジュールを使用して、@labels リストに対し、何も挿入しない (undef 値) か、あるいは現在のループの繰り返し数を挿入しています。私は多くの Chart オプションでラベルを省略できることを知っていますが、この方法の方が単純でした。また、ここで every() 関数も紹介したいと思います。every() 関数は、数字を指定すると、その数字の回数呼び出されるごとに真を返します (つまり、every(2) が真を返すのは、2 回目、4 回目、6 回目等々に呼び出された場合です)。ここでは Every モジュールを作成しましたが、このモジュールはこうした使い方やデバッグに非常に便利なことがわかりました。

調整値は -0.5 と 0.5 の間です (最大で -0.5 と 0.5 ですが、0.5 は含みません)。開始値が 100 であることを考えると、これは妥当と思います。

チャートを生成する

CPAN の Chart モジュールは便利であり、作業を楽にしてくれます。Chart モジュールは GD ライブラリーを使用しています。問題がある場合にはインストールの説明を調べ、また Web を検索してください。Chart モジュールには Documentation.pdf ファイルが付属しており、このファイルにはすべてのモジュールに関するすべてのドキュメントと、各チャート・タイプのサンプルが含まれています。

すべてのセットアップが終わると、そのあと PNG チャートを生成するのは容易です。

リスト 2. チャートを作成する
my $save_name = "performance.png";   # file name to use

my $title = "Performance of MoneyCo funds over 200 days";
my $desc = "Total value at EOD starting " . 
           strftime("%Y-%m-%d", localtime);

my $chart = Chart::Lines->new(800,600);
$chart->set(title => $title,
            sub_title => $desc,
            x_label => "days",
            y_label => "millions USD",
            legend => "bottom",
            legend_labels => [ "Aggressive Fund", "Passive Fund" ],
            y_grid_lines => "true",
           );

$chart->png($save_name, [ \@labels, @data ]);

die "Couldn't create $save_name: $!" unless -f $save_name && -r $save_name;

このチャートに対して、タイトルと、わかりやすいサブタイトル、X 軸ラベルと Y 軸ラベルを付け、凡例を下に配置し、2 つのデータ・セットにラベルを付けました。最後に、(左から右への) Y 軸方向のグリッド線を要求しています。こうすることで、株価が見やすくなります。

タイトルには現在の日付を含める必要があります。そうすることで、Flickr のフォトストリームに複数のチャートがアップロードされた場合にも区別しやすくなります。どのような日付フォーマットが必要な場合にも、必ず POSIX モジュールの strftime 関数を使ってそのフォーマットを生成するようにします。私が過去 15 年にわたって Perl コードと格闘してきた中で、最も面倒なトラブルが起きるのは、私が POSIX::strftime() 関数を理解していないことが原因だったことは間違いありません。

png() メソッドを呼び出すと、チャートは PNG ファイルとして $save_name 変数に保存されます。

Flickr の認証と承認

このアプリケーションの実行には 2 つのパラメーターが必要です。また、オプションとして 3 番目のパラメーターがあります。

リスト 3. コマンドラインのパラメーター
my $api_key    = shift @ARGV;
my $secret     = shift @ARGV;
my $auth_token = shift @ARGV;

die "Syntax: $0 API_KEY SECRET [AUTH_TOKEN]" unless defined $secret;

これはコマンドライン・オプションを実行するための非常に単純な方法です。この代わりに Getopt::Long を使うこともできます。Getopt::Long には 2 つのパラメーターが必要であり、これらのパラメーターを指定しないと使用方法の概要が表示されただけで終了してしまいます。

API key と secret は Flickr から取得します。商用 (Commercial) キーが必要なことがわかっている場合以外は非商用 (Non-Commercial) キーを要求します。キーは即座に入手することができます。この 2 つのパラメーターを使って、アプリケーション (chart_uploadr.pl) の認証を行います。

ここで、$auth_token (3 番目のコマンドライン・パラメーター) を提供しなかった場合には、スクリプトは、このパラメーターをユーザーからの支援によって取得します (私はこの手法を、Flickr::Upload に付属している flickr_upload スクリプトや FIXME などからコピーしました)。

トークンなしでアップロードすることはできません。トークンは、認証済みのアプリケーションが Flickr へアップロードする際に承認を行います。つまり、このアプリケーションを実行するユーザーは、このアプリケーションがアップロードを行うためにアクセスする必要がある URL を見ることができます。このユーザーは API キーを要求したユーザーと同じ場合もありますが、必ずしもそうである必要はありません。

ここでは $ua 変数 (LWP::UserAgent 型のオブジェクト) を作成して Flickr サーバーとやり取りします。LWP::UserAgent のドキュメントを参照してください。このモジュールは、Perl で作成されたすべての Web クライアントに必須のモジュールです。他にも多くの信じられないようなモジュールが (例えば WWW::Mechanize などが) LWP::UserAgent に依存しています。

リスト 4. 認証と承認
my $ua = Flickr::Upload->new({
                              'key' => $api_key,
                              'secret' => $secret,
                             });

# from the flickr_upload script that comes with Flickr::Upload
unless (defined $auth_token)
{
 # 1. get a frob
 my $frob = getFrob( $ua );

 # 2. get a url for the frob
 my $url = $ua->request_auth_url('write', $frob);

 # 3. tell the user what to do with it
 print "1. Enter the following URL into your browser\n\n",
  "$url\n\n",
   "2. Follow the instructions on the web page\n",
    "3. Hit <Enter> when finished or Control-C to exit.\n\n";
        
 # 4. wait for enter.
 <STDIN>;

 # 5. Get the token from the frob
 my $auth_token = getToken( $ua, $frob );
 die "Failed to get authentication token!" unless defined $auth_token;
        
 # 6. Tell the user what they won.
 print "Your authentication token for this application is\n\t\t",
  $auth_token, "\n";

 exit 0;
}

# from the flickr_upload script that comes with Flickr::Upload
sub getFrob
{ 
 my $ua = shift;

 my $res = $ua->execute_method("flickr.auth.getFrob");
 return undef unless defined $res and $res->{success};

 # FIXME: error checking, please. At least look for the node named 'frob'.
 return $res->{tree}->{children}->[1]->{children}->[0]->{content};
}

sub getToken
{
 my $ua = shift;
 my $frob = shift;

 my $res = $ua->execute_method("flickr.auth.getToken",
                   { 'frob' => $frob } );
 return undef unless defined $res and $res->{success};

 # FIXME: error checking, please.
 return $res->{tree}->{children}->[1]->{children}->[1]->{children}->[0]->{content};
}

この URL にアクセスしなくても承認トークンが得られる方法が Flickr にあればよいのですが、現状ではそうした方法はないため、この方法で対処しなければなりません。承認トークンの取得は 1 度しか必要ありません。いったん承認トークンが得られると、人類が滅亡するまで、あるいは Flickr サーバーによるサービスが終了するまで、はたまたアップロードが必要なくなるまで、といったいずれかに当てはまるときが来るまで、そのトークンを使い続けることができます。

ちょっと脇道にそれますが、Flickr が API ドキュメントの中で認証 (authentication) と承認 (authorization) の違いを明確にしてくれたらよいのにと思います。両者は大きく異なり、両者を混同するとユーザーは混乱します。(これは世界警察からのお知らせでした。ありがとうございます。)

トークンを入手した後にアプリケーションを実行するためには、単純に下記を入力します。

./chart_uploadr.pl key secret token

そしてすべてが順調に行けば、暗黙的に終了します。

そして、アップロードします

いよいよ、実際に画像をアップロードします。

リスト 5. アップロードする
$ua->upload(
            photo       => $save_name,
            title       => $title,
            description => $desc,
            auth_token  => $auth_token,
            tags        => 'MoneyCo fund performance',
            is_public   => 1,
            is_friend   => 1,
            is_family   => 1
           ) or die "Failed to upload $save_name: $!";

この部分は非常に簡単です。使用するパラメーターは数多くあり、それらはどれも Flickr の Upload API に説明されています (「参考文献」を参照)。photo パラメーターは実際のファイルを指します。titledescription は、このチャートを生成したときのタイトルとサブタイトルと同じです。tags はこの時点では静的ですが、生成されるチャートに合わせたものにすることができます。最後に、すべての is_xxxx パラメーターによって、この画像が実際に、本当に、絶対に、公開されます。

アップロードしたサンプルの場所は http://www.flickr.com/photos/58365921@N00/3497574717/ です。

これで、chart_uploadr.pl を承認したユーザーが、そのユーザーのフォトストリームにアップロードされたこの画像を見られるようになると、世界中の人々も、この画像を見られるようになります。

まとめ

この記事では、株価の実績表示用のランダム・データを作成し、そのデータから単純な株価チャートを PNG ファイルで作成し、その PNG ファイルを Flickr にアップロードしました。すべてのプロセスは完全に自動化されています。

実際にはもちろん、データはランダムではありません。ファイルやデータベースからデータを取得するために、コードを作成する必要があります。この場合には、データをプロットすると、毎回一貫した結果が生成されます。

言うまでもないことですが、このチャートをもっと優れたものにすることができます。金融関係のいずれかのチャートを見て、インスピレーションを得てください。このチャートを改善する一般的な方法としては、ラベルをより適切なものにすることや、最高値と最安値をマーキングする、などがあります。これは時間をかける価値のある作業です。見た目が優れているチャートは必ず顧客を引きつけますが、優れた Getopt モジュールを使用してアップロード・プロセスを改善してもユーザーを引きつけることはありません。言い換えれば、視覚的な製品を作成するのであれば、その製品はプロフェッショナルが作成したような外観にする必要があります。

では、皆さんがアップロードに成功することを祈っています。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source, Web development
ArticleID=458789
ArticleTitle=洗練された Perl: ビジネスにとっての最良の友、Flickr
publish-date=11242009