ようこそゲストさん

Magical Diary, beta version

[Perl] ニコニコ動画Perlインターフェイス (WWW::NicoVideo) 公開

2007/11/28 1:04 HIRATA Yasuyuki

ニコニコ動画の情報を取得する 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

2007/11/25 19:18 HIRATA Yasuyuki

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に流す

2007/11/09 0:49 HIRATA Yasuyuki

ニコニコ動画の更新情報を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を同期

2007/11/09 0:11 HIRATA Yasuyuki

Del.icio.usHatena 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

2007/11/06 0:54 HIRATA Yasuyuki

最近、外に出しても差し支えないブックマーク情報ををソーシャルブックマーク (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

© 2007 HIRATA Yasuyuki <yasu@asuka.net>, all rights reserved