メッセージ欄
2007年11月の日記
▼ [Perl] ニコニコ動画Perlインターフェイス (WWW::NicoVideo) 公開
ニコニコ動画の情報を取得する WWW::NicoVideo を作成した。RSSを作成するために最低限必要な部分しか作っておらず、非公開APIについても未対応。
- CPAN
- http://search.cpan.org/dist/WWW-NicoVideo/
- いじり中Subversionリポジトリ
- http://svn.coderepos.org/share/lang/perl/WWW-NicoVideo/
- いじり中ソースコードブラウザ
- http://coderepos.org/share/browser/lang/perl/WWW-NicoVideo/
使い方は 添付のサンプル を参照… では不親切なので、Feed に変換するプログラム:
use utf8;
use strict;
use warnings;
use Getopt::Std;
use Encode;
use Encode::Guess "euc-jp";
use XML::Feed;
use WWW::NicoVideo;
MAIN: {
my %opts;
getopts('m:p:t:k:f:o:', \%opts);
my $mail = $opts{m} || die "mail required";
my $passwd = $opts{p} || die "passwd required";
my $outfile = $opts{o};
my $format = $opts{f} || "Atom";
my $key = defined $opts{k}? decode("Guess", $opts{k}): "律子ソロ";
my $type = $opts{t} || "tag";
my $method = {tag => "getEntriesByTagNames",
"search" => "getEntriesByKeywords"}->{$type} or
die "invalid type: $type";
my $outfh;
if(defined $outfile) {
open $outfh, ">:utf8", $outfile;
} else {
$outfh = \*STDOUT;
binmode STDOUT, ":utf8";
}
my $nv = new WWW::NicoVideo();
$nv->mail($mail);
$nv->passwd($passwd);
$nv->login or die "login failed";
my $feed = new XML::Feed($format);
$feed->title("@{[ucfirst $type]}: $key - ニコニコ動画");
$feed->link("http://www.nicovideo.jp/");
foreach my $e ($nv->$method(key => $key, sort => "f", order => "d")) {
my $ent = new XML::Feed::Entry($format);
$ent->title($e->title);
$ent->link($e->url);
$ent->content($e->desc);
$feed->add_entry($ent);
}
print $outfh $feed->as_xml;
}
使用例: perl ritsuko-feed.pl -m your-mail@example.org -p your-passwd -k "最東みんくP" -o minkhouse.atom
ritsuko.org始めました
▼ [Perl] Defined-or演算子とFreeBSD port
Defined-or 演算子 ("//") は perl 5.10 以降で利用可能 (とりあえず、開発者向けの5.9は考えない) であるが、FreeBSD port の lang/perl5.8 では利用できる。 これは、FreeBSD portのPerlは /usr/ports/lang/perl5.8/Makefile で defined-or-5.8.8.bz2 というパッチが指定されているためだ:
PATCHFILES= defined-or-5.8.8.bz2
perl -V を実行することでもわかる:
Characteristics of this binary (from libperl):
Compile-time options: MYMALLOC PERL_MALLOC_WRAP USE_64_BIT_INT
USE_LARGE_FILES USE_PERLIO
Locally applied patches:
defined-or
現状で 5.9 / 5.10 が導入されて環境は少ないため、可搬性を考慮する場合は "//" の利用は見合わせたほうがよさそうだ。
▼ [WWW] ニコニコ動画の更新情報をTwitterに流す
ニコニコ動画の更新情報をTwitterに流す実験:
updatetwitter.pl:
#! /usr/bin/perl
use strict;
use warnings;
use open OUT => ":encoding(euc-jp)";
use YAML qw[LoadFile];
use Data::Dumper;
use DB_File;
use Fcntl;
use Digest::MD5 qw[md5_hex];
use XML::RSS::Parser;
use Net::Twitter;
MAIN: {
my $conf = LoadFile("etc/twitter.yml") || die $!;
tie(my %db, DB_File => $conf->{read_db}, O_RDWR|O_CREAT, 0644) or die $!;
foreach my $e (@{$conf->{targets}}) {
my $twit = Net::Twitter->new(username=> $e->{username},
password=> $e->{password}) || die $!;
foreach my $t (@{$e->{tags}}) {
my $rssfile = sprintf $conf->{rss_path}, "tag", md5_hex($t);
open my $fh, "<", $rssfile or die $!;
my $feed = XML::RSS::Parser->new->parse_file($fh);
my $count = 0;
foreach my $i ($feed->query("//item")) {
my $title = $i->query("title")->text_content;
my $link = $i->query("link")->text_content;
utf8::encode($title);
my $key = "$e->{username};$link";
if(not exists $db{$key}) {
$twit->update("$link $title");
$db{$key} = time;
sleep 3;
last if(3 <= ++$count);
}
}
}
}
}
etc/config.yml (utf-8):
rss_path: rss/%s/%s.rss
read_db: var/rss_read.db
targets:
- username: vocaloid
password: ########
tags:
- 初音ミク
- 鏡音リン
- username: idolmaster
password: ########
tags:
- アイドルマスター
- アイマス
▼ [WWW] Del.icio.usとHatena Bookmarkを同期
Del.icio.usとHatena Bookmarkの両方を使っていてその内容を同期したい場合、WebService::SyncSBS::D2Hを利用することで簡単に同期することができる。使い方は examples/sbssync.plを見ればOK。
このモジュールのsyncメソッドは同期 (すなわち相互に不足分を複製) するため、私のように Del.icio.us から Hatena Bookmark 方向へのみコピーしたい場合にはそのまま利用できない。そこで、片方向のみ複製するパッチを作ってみた。このパッチを適用すると以下のメソッドが追加され、片方向の同期が可能となる。
- sync_delicious_to_hatena
- Reflects newly arrived sites on Del.icio.us in Hatena Bookmark.
- sync_d2h
- Alias for sync_delicious_to_hatena.
- sync_hatena_to_delicious
- Reflects newly arrived sites on Hatena Bookmark in Del.icio.us.
- sync_h2d
- Alias for sync_hatena_to_delicious.
WebService-SyncSBS-D2H-0.03.patch.gz
Yapooさんにはパッチを送ったので、次バージョンではもっときれいなコードになって入るかも。
▼ [WWW] ソーシャルブックマークサービス Del.icio.us
最近、外に出しても差し支えないブックマーク情報ををソーシャルブックマーク (SBM; この表記は外国ではあまり使われていないようだ) サービスのdel.icio.us へ移行した。通常、ブックマークを利用するためにはdel.icio.usサイトを経由する必要があって使いづらいが、FirefoxにDel.icio.us Bookmarksを組み込むことでブラウザ標準のブックマークをそのまま置き換えて利用することができる。当初ははてなブックマークを検討していたが、ブックマークを置き換えるようなadd-onが見つからなかったため使わなくなってしまった。
Del.icio.usでは利用者層が日本人以外が数多く占めている一方、はてなは日本人がほとんどを占めている。このため、他の利用者の情報も活用したい場合には、はてなの方がよいかもしれない。Del.icio.us Bookmarks のようなaddonが出れば一番良いのだが。
通常のブックマークは階層構造でデータを管理するが、SBMでは "タグ" という概念で管理することが多く、Del.icio.usやはてなブックマークも例外ではない。こうなると "きちんと" タグ付けしたくなるものだが、大常さん によると "タグ付けは適当" らしいので、とりあえずあまり深く考えずに直感的に付けていこうと思う。
私のブックマークは: http://del.icio.us/hirata.yasuyuki
