当サイトで生成している RSS(野良feed):
M.C.P.C.:カテゴリー Perl バックナンバー
- 2010.08.20
-
HTML::Templateでテンプレートを読み込むときUTF8フラグ付ける
- 2010.08.02
-
TwitterのAPIの消費され具合をプロフィール画像に入れるのはどうだろう
- 2010.07.20
-
DoubleClick Ad Plannerでのサイト解析をPerlで取得する
- 2010.07.19
-
今日が海の日だってことを判定するPerlスクリプト
- 2010.07.13
-
実用! PerlでコマンドラインからTwitter投稿(OAuth対応)+In-Reply-To対応さらに改良版
- 2010.06.17
-
DateTime::Format::HTTPがPDTのタイムゾーンを食えなかったでござる
- 2010.06.11
-
実用! PerlでコマンドラインからTwitter投稿(OAuth対応)+In-Reply-To対応
- 2010.06.10
-
perl-mongers.orgにTwitter投稿の記事をUPしました
- 2010.05.28
-
WebService::KuronekoYamato 0.0.3をCPANで公開
- 2010.05.27
-
PerlのCGI.pmで複数のCookieを消す
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 ); },
とか書けるよ。
以下を参考にしたよ。
- Perl 5.8.x Unicode関連 [www.rwds.net]
- TTの前処理 - Charsbar::Note [d.hatena.ne.jp]
- Perlで+を使うと幸せになれるよ (*´Д`)ノ - (゚∀゚)o彡 sasata299's blog [blog.livedoor.jp]
2010.08.20
午後 12:30
[Perl]
|
固定リンク
|
コメント
(0)
|
トラックバック
(0)
|
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'これ実行しますと、
入力画像

に対し、
出力画像

となります。
あとはアップロードすればよい。
~~~
んで、これTwitterのAPI消費数を取ってきているわけですけれども、ステータスアイコンで文字を表現できるっていうのは色々おもしろいことができるんじゃーねーかって話。
1分ごと更新&アップロードしてデジタル時計、とかできると思うし(アクセス過多で止められてしまわないかが不安ではある)、んーとうちの業界でいえば、印刷通販さんのアカウントで、その日の入稿件数をカウントアップして画像に含めるとか、ただ今電話がつながりにくくなっておりますを動的に入れるとか、フォントベンダーでいえば、そのフォントベンダーのフォントを使った文字をプロフィール画像に入れ込むとか(自社サービスに対してだったら動的生成用サーバライセンスとかいくらでも融通きくだろう的な)、色々ユニークなサービスが考え付くと思うわけなんです。
2010.08.02
午後 09:28
[Perl]
|
固定リンク
|
コメント
(0)
|
トラックバック
(0)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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)
|
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)
|








![: SANYO NEW eneloop 充電式ニッケル水素電池(単3形2個パック) [HR-3UTGA-2BP]](http://ecx.images-amazon.com/images/I/51V83UYI5kL._SL75_.jpg)


![: デジモンアドベンチャー ぼくらのウォーゲーム!/デジモンアドベンチャー【劇場版】 [DVD]](http://ecx.images-amazon.com/images/I/617JZ13THTL._SL75_.jpg)

















![: サマーウォーズ [Blu-ray]](http://ecx.images-amazon.com/images/I/51ZDAy7c8KL._SL75_.jpg)
![: サマーウォーズ [DVD]](http://ecx.images-amazon.com/images/I/419nVKBEIkL._SL75_.jpg)





























