<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>Vox / Drkcore</title><link>http://blog.kzfmix.com/Vox</link><description>Programming, Music, Snowboarding</description><language>ja</language><lastBuildDate>Thu, 16 Apr 2009 21:33:41 +0919</lastBuildDate><item><title>Vox用のクライアント</title><link>http://blog.kzfmix.com/entry/1239885147</link><description>&lt;p&gt;&lt;a href="http://search.cpan.org/perldoc?Config::Pit"&gt;Config::Pit&lt;/a&gt;と&lt;a href=""&gt;エディタが立ち上がるように&lt;/a&gt;変更した。&lt;/p&gt;

&lt;p&gt;サービスのURIを知るために&lt;a href="http://blog.kzfmix.com/entry/1190034590"&gt;wget&lt;/a&gt;したらつながらなくてあせったが--auth-no-challengeオプションを入れて解決&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/opt/local/bin/perl

use XML::Atom::Client;
use XML::Atom::Entry;
use constant NS_DC =&amp;gt; 'http://purl.org/dc/elements/1.1/';
use File::Temp;
use File::Slurp;
use Path::Class;
use Config::Pit;

my $vox = "kzfm.vox.com";
my $title = "";
my $content = "";
my $category = "life";

my $config = pit_get($vox, require =&amp;gt; {
        "username" =&amp;gt; "your username on vox",
        "password" =&amp;gt; "your password on vox",
        "postURI"  =&amp;gt; "your potURI"
                       });


my $f = File::Temp-&amp;gt;new();
close $f;
my $t = file($f-&amp;gt;filename)-&amp;gt;stat-&amp;gt;mtime;
system $ENV{EDITOR}, $f-&amp;gt;filename;
if ($t == file($f-&amp;gt;filename)-&amp;gt;stat-&amp;gt;mtime) {
 print STDERR "No changes.";
} else {
 my @lines = read_file($f-&amp;gt;filename);
 $title = shift @lines;
 $content = join "", @lines
}

die "content not found\n" unless $content;

my $api = XML::Atom::Client-&amp;gt;new;
$api-&amp;gt;username($config-&amp;gt;{username});
$api-&amp;gt;password($config-&amp;gt;{password});

my $entry = XML::Atom::Entry-&amp;gt;new;
$entry-&amp;gt;title($title);
$entry-&amp;gt;content($content);
my @tags = split /,/, $category;
my $dc = XML::Atom::Namespace-&amp;gt;new( dc =&amp;gt; NS_DC );
foreach my $tag (@tags) {
 $entry-&amp;gt;add( $dc, 'subject', $tag);
}

my $EditURI = $api-&amp;gt;createEntry($config-&amp;gt;{postURI}, $entry);
print $api-&amp;gt;errstr if $api-&amp;gt;errstr;
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Thu, 16 Apr 2009 21:33:41 +0919</pubDate><category>perl</category><category>Vox</category></item><item><title>vxでタグが入れられるようにしてみた</title><link>http://blog.kzfmix.com/entry/1190287320</link><description>&lt;p&gt;Voxクライアントが便利だが、タグ付けできなくてちょっと不便なので入れられるようにしてみた。それぞれのエントリみると&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;category term="test" label="test" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;みたいに組めばよさそうだったので、&lt;a href="http://blog.nomadscafe.jp/archives/000601.html"&gt;blog.nomadscafe.jp&lt;/a&gt;を参考に。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;my $entry = XML::Atom::Entry-&amp;gt;new;
$entry-&amp;gt;title($title);
my $category = XML::Atom::Category-&amp;gt;new(Version=&amp;gt;1);
$category-&amp;gt;term('life');
$category-&amp;gt;label('life');
$entry-&amp;gt;category($category);
$entry-&amp;gt;content($content);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;これだと、なぜかタグが反映されない。なんでかなーと調べてたら&lt;a href="http://www.sixapart.jp/techtalk/2007/01/mtplugin_postvox.html"&gt;Six Apartの野良プラグイン&lt;/a&gt;にヒントが
あった。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;dc:subject xmlns:dc="http://purl.org/dc/elements/1.1/"&amp;gt;life&amp;lt;/dc:subject&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;が正しいらしい。なので修正したら動いた。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;use constant NS_DC =&amp;gt; 'http://purl.org/dc/elements/1.1/';

...

my $entry = XML::Atom::Entry-&amp;gt;new;
$entry-&amp;gt;title($title);
$entry-&amp;gt;content($content);
my @tags = split /,/, $category;
my $dc = XML::Atom::Namespace-&amp;gt;new( dc =&amp;gt; NS_DC );
foreach my $tag (@tags) {
  $entry-&amp;gt;add( $dc, 'subject', $tag);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;オプションでタグを選べるようになった&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vx -t 英語ネタ -c english,life "fortranner の goto は \
ロードランナーの穴掘り。たまに掘った穴に埋まる"
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Thu, 20 Sep 2007 20:51:08 +0919</pubDate><category>perl</category><category>Vox</category></item><item><title>vx (Vox用のCLI)</title><link>http://blog.kzfmix.com/entry/1190117932</link><description>&lt;p&gt;vox用のCLIを作った。post用のURIは&lt;a href="http://blog.kzfmix.com/entry/1190034590"&gt;こんな感じ&lt;/a&gt;で探した。本当はhttp://www.vox.com/services/atomにGETして返ってきたXMLをパースすんのがいいんだろうけど、これはそのうちやる。今回は直接指定した。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/perl

use XML::Atom::Client;
use XML::Atom::Entry;
use Getopt::Long;

# --- configure --- #
my $user = vox_user;
my $password = vox_passwd;
my $title = "'(my memo)";
my $PostURI = posturl;

# --- main --- #

GetOptions ("title=s"   =&amp;gt; \$title);
my $content = shift @ARGV;

die "content not found\n" unless $content;

my $api = XML::Atom::Client-&amp;gt;new;
$api-&amp;gt;username($user);
$api-&amp;gt;password($password);

my $entry = XML::Atom::Entry-&amp;gt;new;
$entry-&amp;gt;title($title);
$entry-&amp;gt;content($content);
my $EditURI = $api-&amp;gt;createEntry($PostURI, $entry);
print $api-&amp;gt;errstr if $api-&amp;gt;errstr;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;これをvxって名前で保存しておく。以下使用例&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vx "なんか思いついたことを書くとよさげ"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;タイトルを変えたいときには&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ vx -t todo "ビリーでダイエット"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;とか。&lt;/p&gt;
</description><pubDate>Tue, 18 Sep 2007 21:32:44 +0919</pubDate><category>perl</category><category>Vox</category></item><item><title>AtompubでVox用のクライアントを作ろうとしたが</title><link>http://blog.kzfmix.com/entry/1190034590</link><description>&lt;p&gt;自分のVox用にCLIが欲しくて、&lt;a href="http://search.cpan.org/perldoc?Atompub"&gt;Atompub&lt;/a&gt;でつくろっかなと思ったので。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;use Atompub::Client;
my $service_uri = 'http://kzfm.vox.com/library/posts/atom.xml';
my $client = Atompub::Client-&amp;gt;new;
$client-&amp;gt;username('xxx@gmail.com');
$client-&amp;gt;password('mokyumokyu');

my $service = $client-&amp;gt;getService( $service_uri );
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;さてこれがエラー。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ perl atomc.pl
Bad Content-Type: text/xml at /usr/lib/perl5/site_perl/5.8.8/Atompub/Client.pm line 220.
Can't call method "collections" on an undefined value at atomc.pl line 14.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Atompub::MediaTypeあたりを触ればいいんだろうか?エンドポイント間違えてるだけだったりして、、、、&lt;/p&gt;

&lt;p&gt;ちょっと興味があるのでソースを読んでみる。あと&lt;a href="http://bitworking.org/projects/atom/draft-ietf-atompub-protocol-17.html"&gt;draft-ietf-atompub-protocol-17.txt&lt;/a&gt;も併せて読む&lt;/p&gt;

&lt;h4&gt;追記 07.09.18&lt;/h4&gt;

&lt;p&gt;色々ボケてた。&lt;/p&gt;

&lt;p&gt;rsd.xmlに記述されているAtomのAPIにGETしないといけない。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ wget --http-user=user --http-passwd=XXX \
http://www.vox.com/services/atom
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;で戻ってきたxmlの中見てservice.postにPOST&lt;/p&gt;

&lt;p&gt;ここへのPOSTは&lt;a href="http://search.cpan.org/perldoc?XML::Atom::Client"&gt;XML::Atom::Client&lt;/a&gt;でも&lt;a href="http://search.cpan.org/perldoc?Atompub::Client"&gt;Atompub::Client&lt;/a&gt;でもどちらでもOK&lt;/p&gt;
</description><pubDate>Tue, 18 Sep 2007 20:47:19 +0919</pubDate><category>perl</category><category>Atompub</category><category>Vox</category></item></channel></rss>