当サイトで生成している RSS(野良feed):


M.C.P.C.:カテゴリー Perl バックナンバー

2010.08.20
HTML::Templateでテンプレートを読み込むときUTF8フラグ付ける はてなブックマーク - HTML::Templateでテンプレートを読み込むときUTF8フラグ付ける
2010.08.02
TwitterのAPIの消費され具合をプロフィール画像に入れるのはどうだろう はてなブックマーク - TwitterのAPIの消費され具合をプロフィール画像に入れるのはどうだろう
2010.07.20
DoubleClick Ad Plannerでのサイト解析をPerlで取得する はてなブックマーク - DoubleClick Ad Plannerでのサイト解析をPerlで取得する
2010.07.19
今日が海の日だってことを判定するPerlスクリプト はてなブックマーク - 今日が海の日だってことを判定するPerlスクリプト
2010.07.13
実用! PerlでコマンドラインからTwitter投稿(OAuth対応)+In-Reply-To対応さらに改良版 はてなブックマーク - 実用! PerlでコマンドラインからTwitter投稿(OAuth対応)+In-Reply-To対応さらに改良版
2010.06.17
DateTime::Format::HTTPがPDTのタイムゾーンを食えなかったでござる はてなブックマーク - DateTime::Format::HTTPがPDTのタイムゾーンを食えなかったでござる
2010.06.11
実用! PerlでコマンドラインからTwitter投稿(OAuth対応)+In-Reply-To対応 はてなブックマーク - 実用! PerlでコマンドラインからTwitter投稿(OAuth対応)+In-Reply-To対応
2010.06.10
perl-mongers.orgにTwitter投稿の記事をUPしました はてなブックマーク - perl-mongers.orgにTwitter投稿の記事をUPしました
2010.05.28
WebService::KuronekoYamato 0.0.3をCPANで公開 はてなブックマーク - WebService::KuronekoYamato 0.0.3をCPANで公開
2010.05.27
PerlのCGI.pmで複数のCookieを消す はてなブックマーク - PerlのCGI.pmで複数のCookieを消す

< 最後 « これより前10ä»¶ | 全件

2010.08.20

HTML::Templateでテンプレートを読み込むときUTF8フラグ付ける

昔作ったPerlスクリプトをメンテナンスしてたらこんなコードがあったよ。

use utf8;
use HTML::Template;
 
open $fh, "<:utf8", 'hoge.tmpl' or die $!;
my $t = HTML::Template->new (
  filehandle => $fh,
);
close $fh;

これは、HTML::Templateを使いたいのだけれども、テンプレートに差し込む文字列がUTF8フラグ付きなんで(XML周り扱うとUTF8フラグ付いていた方がいいときあるよね)、テンプレートもUTF8フラグ付で読み込んでおきたいっていう話なんだけれども。

こんなのにいちいちファイルハンドル渡して読み込むのってスマートじゃないってことでこんな風に。

use utf8;
use HTML::Template;
 
my $t = HTML::Template->new (
  filename => 'hoge.tmpl',
  filter   => sub { utf8::decode( ${ shift() } ); },
);

いかにもPerlが嫌いになりそうなコードなので、filterのところを書きなおすと、

filter   => sub { my $r = shift; utf8::decode( $$r ); },

とか、

filter   => sub { my $r = shift; $$r = Encode::decode_utf8( $$r ); },

とか書けるよ。

以下を参考にしたよ。

2010.08.20 午後 12:30 [Perl] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2010.08.02

TwitterのAPIの消費され具合をプロフィール画像に入れるのはどうだろう

M.C.P.C.: TwitterのAPIの消費され具合を表示するPerlスクリプト

にて、自分のAPI消費具合を知ることができたのですが、まずはOAuth対応、そして、画像に文字を入れてアップロードすれば、わかりやすいんじゃあねえか、というのでやってみる。

今回は、画像を作るところだけ。アップロードしたい人は

M.C.P.C.: Net::Twitterで自画像Uploadは3.12あたりでできるように直っているようだ

をつなげてみてね。

Filename: limitcheck.pl

#!/usr/bin/perl
 
use strict;
use warnings;
use Config::Pit;
use DateTime;
use Image::Magick;
use Net::Twitter;
use YAML;
 
my $input_file  = '34563_1360706655.png';
my $output_file = 'html/s.png';
my $r = rate_limit_status('twitter.com@username');
my $t = DateTime->from_epoch(
  epoch     => $r->{reset_time_in_seconds},
  time_zone => 'Asia/Tokyo',
);
my $s = "$r->{remaining_hits}/$r->{hourly_limit}\n"
      . 'rest: ' . $t->hms;
my $im = Image::Magick->new;
$im->Read($input_file);
my %d = (
  font      => "ipaexm.ttf",
  pointsize => 20,
  fill      => "Red",
  text      => $s,
  x         => 0,
  y         => 20,
);
$im->Annotate( %d, stroke => 'white', strokewidth => 4 );
$im->Annotate( %d );
$im->Write($output_file);
 
exit;
 
sub rate_limit_status {
  my $account  = shift;
  my $config   = pit_get($account);
  my $consumer = YAML::LoadFile('consumer_keys.yaml');
  my $nt = Net::Twitter->new(
      traits          => [qw/API::REST OAuth/],
      consumer_key    => $consumer->{consumer_key},
      consumer_secret => $consumer->{consumer_key_secret},
      ssl => 1,
     # username => $config->{username},
     # password => $config->{password},
  );
  $nt->access_token       ($config->{access_token});
  $nt->access_token_secret($config->{access_token_secret});
  my $res = $nt->rate_limit_status();
  #my $res = $nt->rate_limit_status({authenticate => 0});
  return $res;
}
 
__END__

Filename: consumer_keys.yaml (自分で用意しよう)

---
"consumer_key": 'aqwsedrftgyhujikolp'
"consumer_key_secret": 'aqswedrftgyhujikolppaqwsderftgyhujikolpygl'
Filename: ~/.pit/default.yaml (自分で用意しよう)
---
"twitter.com@username":
  "access_token" : '12345678-qawsedrftgyhujikolp;awsedrftgyhujikorftgy'
  "access_token_secret" : 'qawsedrftgyhujikolpaqwsedrftgyhujikolfrtgf'
これ実行しますと、

入力画像
34563_1360706655

に対し、

出力画像
34563_13607066551

となります。

あとはアップロードすればよい。

~~~

んで、これTwitterのAPI消費数を取ってきているわけですけれども、ステータスアイコンで文字を表現できるっていうのは色々おもしろいことができるんじゃーねーかって話。

1分ごと更新&アップロードしてデジタル時計、とかできると思うし(アクセス過多で止められてしまわないかが不安ではある)、んーとうちの業界でいえば、印刷通販さんのアカウントで、その日の入稿件数をカウントアップして画像に含めるとか、ただ今電話がつながりにくくなっておりますを動的に入れるとか、フォントベンダーでいえば、そのフォントベンダーのフォントを使った文字をプロフィール画像に入れ込むとか(自社サービスに対してだったら動的生成用サーバライセンスとかいくらでも融通きくだろう的な)、色々ユニークなサービスが考え付くと思うわけなんです。

2010.08.02 午後 09:28 [Perl] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2010.07.20

DoubleClick Ad Plannerでのサイト解析をPerlで取得する

DoubleClick Ad PlannerのAPIが見当たらなかったので、バックで動いているAPIを使って値を取得しようという試み。

APIがあれば、たとえばはてなブックマークだったらこんな感じで取得できるわけですが、

Filename: hateb.pl

#!/usr/bin/perl
 
use XMLRPC::Lite;
 
my $res = get_hateb_value('http://blog.dtpwiki.jp/');
print "hatena bookmark: $res\n";
exit;
 
sub get_hateb_value {
  my $EndPoint = 'http://b.hatena.ne.jp/xmlrpc';
  my $url = shift;
  my $count = XMLRPC::Lite
      ->proxy($EndPoint)
      ->call('bookmark.getTotalCount', $url)
      ->result;
  return $count;
}
 
__END__
$ perl hateb.pl
hatena bookmark: 1897
$

これをDoubleClick Ad Plannerでやります。

Filename: adplanner.pl

#!/usr/bin/perl
 
use Encode;
use JSON;
use LWP::Simple;
use URI::Escape;
 
my $res = get_adplanner('http://blog.dtpwiki.jp/');
print "ad planner total_visit: $res->{site_info}->{total_visits}\n";
exit;
 
sub get_adplanner {
  my $url = shift;
  my $api = 'https://www.google.com/adplanner/planning/site_details_data';
  (my $id = $url ) =~ s|^https?://||;
  $id = uri_escape( $id );
  my $json = get( "$api?identifier=$id&trait_type=1&geo=001&_rnr_se=null");
  return decode_json( encode_utf8($json) );
}
 
__END__
$ perl adplanner.pl
ad planner total_visit: 15000
$

こんな感じです……

バックヤードのAPIを使っているのが微妙なので、ちゃんとしたAPIがあったらそっちで作り直しますから教えてください……

2010.07.20 午後 12:34 [Perl] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2010.07.19

今日が海の日だってことを判定するPerlスクリプト

Twitterで今日は何の日?botを作るときに、日本の休日の法律でありがちな、第3月曜日、とかを判定しないと出来ませんので、こう書いてみたよ。

#!/usr/bin/perl
 
use strict;
use warnigas;
use DateTime;
my $dt = DateTime->now( time_zone => 'local');
my $syu  = int( ( $dt->day - 1 ) / 7 ) + 1;
if (
     ( $dt->month == 7 )  # 7月
  && ( $syu       == 3 )  # 第3
  && ( $dt->wday  == 1 )  # 月曜日
  )
{
  print "凛子:今日は、海の日じゃん。ま、祝日ということに、意味があるわけで。\n";
}
 
exit;
 
__END__

法律が変わったら速やかに直そう。

2010.07.19 午前 12:39 [Perl] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2010.07.13

実用! PerlでコマンドラインからTwitter投稿(OAuth対応)+In-Reply-To対応さらに改良版

M.C.P.C.: 実用! PerlでコマンドラインからTwitter投稿(OAuth対応)+In-Reply-To対応 のさらに改良版。

改良点1.
consumer_keyは、pitに入れず、同じディレクトリのconsumer_key.yamlに入れる
改良点2.
In-Reply-Toをやりやすく。第2引数にReplyしたいツイートのURLをhttp付きでそのままコピペすると、自動的にscreen_nameとstatus_idを分離して、適切な書式(先頭に@付きでscreen_name入れてくれたり、返信すべきstatus_idを自動的にIn_Reply_to_status_idとして設定してくれる)でpostしてくれる。

Filename: twit

#!/usr/bin/perl
 
use strict;
use warnings;
use Config::Pit;
use Encode;
use File::Spec;
use FindBin::Real;
use Net::Twitter;
use utf8;
use YAML;
 
# 初期設定
 
my $keys = YAML::LoadFile(
  File::Spec->catdir( FindBin::Real::Bin(), 'consumer_key.yaml' )
);
my $nt  = Net::Twitter->new(
    traits => [qw/API::REST OAuth WrapError/],
    consumer_key    => $keys->{consumer_key},
    consumer_secret => $keys->{consumer_key_secret},
    ssl => 1,
);
my $pit = pit_get( 'twitter.com@CLCLCL' );
$nt->access_token       ( $pit->{access_token}        );
$nt->access_token_secret( $pit->{access_token_secret} );
 
# 処理
 
my $arg;
$arg->{status} = decode_utf8( $ARGV[0] );
if ($ARGV[1]) {
  if ( $ARGV[1] =~ m/^.*?(\d+)$/ ) {
    # 第2引数の数字部分
    $arg->{in_reply_to_status_id} = $1;
  }
  if ( $arg->{in_reply_to_status_id} ne $ARGV[1] ) {
    # 第2引数が数字のみでなかった場合
    (my $reply = $ARGV[1]) =~ s/^.*?(\w+)\/status.+$/$1/;
    $arg->{status} = '@'.$reply." $arg->{status}";
  }
}
 
# 表示
 
print encode_utf8("$arg->{status}\n");
print 'length: ' . length($arg->{status}) . "\n";
if ( $arg->{in_reply_to_status_id} ) {
  print "in_reply_to: $arg->{in_reply_to_status_id}\n";
}
 
# post
 
my $res = $nt->update( $arg );
print $nt->http_message . "\n";
 
exit;
 
__END__

pitとかろくに説明していないんだけど、問い合わせもないので、まあいいや。

2010.07.13 午後 11:30 [Perl] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2010.06.17

DateTime::Format::HTTPがPDTのタイムゾーンを食えなかったでござる

FeedBurnerに通したInDesignの勉強部屋のRSSが、自作のRSSからJavaScriptFeedに変換するスクリプトでこけていた。

調べてみたら、pubDate要素の日付のタイムゾーンがPDTとなっていた。しかしなんでいきなりなるかなー。仕様でも変わったのかなー以前の形式は覚えてないけれども。

というわけで、変換スクリプトで使っているDateTime::Format::HTTPと、以前教えてもらったDate::Parseで、比較してみた。

use strict;
use warnings;
use DateTime;
 
my @date = (
  'Wed, 16 Jun 2010 07:00:00 GMT',
  'Wed, 16 Jun 2010 00:00:00 PDT',
);
 
foreach my $item ( @date ) {
  parse_date( $item );
  print "---\n";
}
 
exit;
 
sub parse_date {
  my $date = shift;
  my $dt;
  print "input: $date\n";
  
  use Date::Parse;
  print "Date::Parse             ";
  $dt = DateTime->from_epoch( epoch => str2time($date) );
  print "$dt\n";
  
  use DateTime::Format::HTTP;
  print "DateTime::Format::HTTP  ";
  $dt = DateTime::Format::HTTP->parse_datetime($date);
  print "$dt\n";
}
__END__
$ perl test.pl 
input: Wed, 16 Jun 2010 07:00:00 GMT
Date::Parse             2010-06-16T07:00:00
DateTime::Format::HTTP  2010-06-16T07:00:00
---
input: Wed, 16 Jun 2010 00:00:00 PDT
Date::Parse             2010-06-16T07:00:00
Invalid offset: PDT
DateTime::Format::HTTP  $

というわけで、Date::Parseを使えばいいってことがわかりました。

なんて言ったところで、僕は日付の形式を見ただけでこれはRFCなんちゃら、とか言いあてられる日付マエストロではないので、毎回試行錯誤することになるのでした。

2010.06.17 午後 09:34 [Perl] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2010.06.11

実用! PerlでコマンドラインからTwitter投稿(OAuth対応)+In-Reply-To対応

昨日perl-mongers.orgに書き込んだTwitter APIをOAuth認証通してTwitterに投稿するスクリプト [perl-mongers.org] ですが、それを踏まえて、僕が使っているスクリプトがこれです。

Filename: twit

#!/usr/bin/perl
 
use strict;
use warnings;
use Config::Pit;
use Encode;
use Net::Twitter;
use utf8;
 
my $p = pit_get( 'twitter.com@CLCLCL' );
my $nt = Net::Twitter->new(
    traits => [qw/API::REST OAuth WrapError/],
    consumer_key    => $p->{consumer_key},
    consumer_secret => $p->{consumer_key_secret},
    ssl => 1,
);
$nt->access_token       ($p->{access_token});
$nt->access_token_secret($p->{access_token_secret});
my $arg;
$arg->{status}                = decode_utf8($ARGV[0]);
$arg->{in_reply_to_status_id} = $ARGV[1] if $ARGV[1];
my $len = length($arg->{status});
print "$len\n";
 
my $res = $nt->update( $arg );
print $nt->http_message."\n";
exit;
__END__

keyとかtokenとかは、Pitで管理する方式に。PerlでのPitに関しては、パスワード設定をコードに書かない(Config::Pit) - モダンなPerl入門 - モダンなPerl入門 [perl-users.jp] を参照のこと。これも僕が書いた記事だったりします。アバウトミーハックなんて、僕ぐらいしかせんわー

んで、今回のスクリプトを使いますと、In-Reply-Toを付けた返信ができます。第1引数に@付きで返信したい人のid(username)を入れておき、第2引数で返信したい人のpostのstatus_idを入れて実行すると、TwitterのWebで返信したのと同じような返信になりますよ。

使ってみてくださいね。

2010.06.11 午後 11:29 [Perl] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2010.06.10

perl-mongers.orgにTwitter投稿の記事をUPしました

perl-mongers.orgというPerlの専門サイトに、以下のタイトルの文章をアップしました。

実用! PerlでコマンドラインからTwitter投稿(OAuth対応) - perl-mongers.org [perl-mongers.org] このエントリーのはてなブックマーク件数

僕が印刷屋さんなのにこういうIT屋さんの領分のネタを出しているというのは、ひとえに印刷屋さんという職業をIT屋さんに認識していただくため、忘れられないようにするためです。極論、IT屋さんにRICOHのオンデマンド(前IBMが持っていたやつね)入れられちゃうと、「印刷といえばIT屋さん」ていう認識ができてしまうのが怖いわけです。

こちとら、IT屋さんでもおいそれと買えない設備持っているんだから、ちゃんと適正な仕事がいただけるよう少しでもアピールしていかないとね……

2010.06.10 午後 10:37 [Perl] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2010.05.28

WebService::KuronekoYamato 0.0.3をCPANで公開

WebService::KuronekoYamato 0.0.3をCPANで公開しました。

http://search.cpan.org/~clcl/WebService-KuronekoYamato/lib/WebService/KuronekoYamato.pm

0.0.3  Wed Nov 25 12:30:00 2009
       libwww-perlの仕様変更に対応(Encode)
       2009.11.18頃に行われたヤマト運輸荷物調査サイト構造変更に対応

とかなり古い更新日なのになぜ今上がっているかっていうと、CPANに上げても、Rejectされていたからなんです。昨晩しっかり考えて原因を排除し更新した次第。

この間にも依存モジュールとしてYAML::SyckよりもYAML使うべきじゃねーとかいろいろ考えましたがあんまり気にしないでおこうっと。

それにしても、自分が作ったモジュールがどこのサーバからでもインストールできるのっていいよね。

おりしも今日はiPadの発売日。このモジュールを使って、iPodを運んでくれているヤマト運輸の荷物追跡をしてみたらいかがでしょう。

2010.05.28 午後 01:40 [Perl] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

2010.05.27

PerlのCGI.pmで複数のCookieを消す

CGI.pmのみ使っているようなタイトな環境で、Cookieを消すというやり方、正直いって知らんかった。最近Cookieってセッション番号ぐらいしか焼いていないし、しかもシステムが勝手に焼くしな……

こんな風にしてみた。

Finename: delete_cookie.cgi

#!/usr/bin/perl
 
use strict;
use warnings;
use CGI;
my $q = new CGI;
my @del_cookies = ('val1', 'val2');
my $cookies;
foreach my $key ( @del_cookies ){
push @$cookies,
     $q->cookie( -name    => $key,
                 -value   => '',
                 -expires => '-1y',
     );
};
print $q->header(-cookie=>$cookies);
exit;
__END__

ちなみに、これブラウザで実行しても見た目なにも表示されない。Cookieを消せっていう指示が入っているHTTPヘッダが見えないところで受信されているっていうことです。

CGI.pm推奨のCookieの使い方は、一つのCookieで、複数の値を入れるタイプなんだけれども、焼かれるCookieは、必ずしもCGI.pm推奨のCookieの使い方に倣っていない場合がある。

今回のCookie削除は、複数のCookieを削除するタイプです。ループしてやらなきゃいけないのね……

2010.05.27 午後 12:15 [Perl] | 固定リンク | コメント (0) | トラックバック (0) | このエントリーをはてなブックマークへ追加 livedoor Clipでこのサイトを登録している人数livedoor Clipでこの記事をクリップ!

< 最後 « これより前10ä»¶ | 全件