Hatena::ブログ(Diary)

最遅メンヘル研究会

2009-02-05

Perl メモ

id:kageroh_:20090205:1233807198 に書いた通り、私は Perl 片言なので、今回 Strawberry Perl をインストールするところからはじめたわけで。まず、つまずいたのが、「CPAN につながんねーなー」で、原因はまあ proxy でした。調べたら環境変数の HTTP_proxy を参照してくれるらしいので、設定。あと、XML::Atom がやっぱりネットワーク接続できなくて、id:ysano2005:20051021:1129851783 の hack を参考にさせていただきました。1 line 加えるだけー。

はてブを整理した

なんとなく、はてブタグを toLowerCase したいなーと前々から思っていて、昨日はてなブックマークAtomAPI を見たのだけれど、update がないわけですよ。create, delete はあっても。書いてないだけで実は使えたりして?と思いつつ、一度 Atom 形式でエクスポートして、XSLT で toLowerCase して、インポートしてみたのだけれど、変わらない。

u2l.xsl

<?xml version="1.0" encoding="shift_jis"?>
<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns="http://purl.org/atom/ns#"
	xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
	>
	<xsl:output method="xml"
		encoding="utf-8"
		omit-xml-declaration="no"
		indent="yes"
		media-type="application/xml" />
	<xsl:variable name="upper">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
	<xsl:variable name="lower">abcdefghijklmnopqrstuvwxyz</xsl:variable>
	<xsl:strip-space elements="*" />

	<xsl:template match="*">
		<xsl:copy>
			<xsl:copy-of select="@*" />
			<xsl:apply-templates />
		</xsl:copy>
	</xsl:template>

	<xsl:template match="dc:subject">
		<xsl:copy>
			<xsl:value-of select="translate(., $upper, $lower)" />
		</xsl:copy>
	</xsl:template>

</xsl:stylesheet>

じゃ一回全部消せばいんじゃね?とか思って、entry 要素なしの Atom 送りつけたけど、予想通りダメ。仕方ないから XSLT, Perl で書いた。

del.xsl

<?xml version="1.0" encoding="shift_jis"?>
<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:atom="http://purl.org/atom/ns#"
	xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
	>
	<xsl:output method="text"
		encoding="utf-8"
		omit-xml-declaration="yes"
		indent="no"
		media-type="text/plain" />
	<xsl:strip-space elements="*" />

	<xsl:template match="/">#!/usr/local/bin/perl
use strict;
use warnings;

use XML::Atom::Entry;
use XML::Atom::Client;

my $api = XML::Atom::Client->new;
$api->username('kageroh_');
$api->password('********');

my $entry = XML::Atom::Entry->new;
<xsl:apply-templates />
	</xsl:template>

	<xsl:template match="atom:entry/atom:link[@type='application/x.atom+xml']">$api->deleteEntry('<xsl:value-of select="@href" />') or die $api->errstr;
</xsl:template>

	<xsl:template match="atom:id | atom:issued | atom:name | atom:summary | atom:title | dc:*" />

</xsl:stylesheet>

del.pl

#!/usr/local/bin/perl
use strict;
use warnings;

use XML::Atom::Entry;
use XML::Atom::Client;

my $api = XML::Atom::Client->new;
$api->username('kageroh_');
$api->password('********');

my $entry = XML::Atom::Entry->new;
$api->deleteEntry('http://b.hatena.ne.jp/atom/edit/2119879') or die $api->errstr;
...

で、エクスポートしておいた Atom をインポート。そしたら 120 ブクマ減りまして。それなのに "完了しました" とか誇らしげに成功メッセージが出まして。「バギィだぜ……」と愚痴りながら diff とったら、文書出現順で或る entry 以降が全部無視されてる。理由はわからない。仕方なく新規 post ということで、また XSLT, Perl を。

add.xsl

<?xml version="1.0" encoding="shift_jis"?>
<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:atom="http://purl.org/atom/ns#"
	xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
	>
	<xsl:output method="text"
		encoding="utf-8"
		omit-xml-declaration="yes"
		indent="no"
		media-type="text/plain" />
	<xsl:strip-space elements="*" />

	<xsl:template match="/">#!/usr/local/bin/perl
use strict;
use warnings;

use XML::Atom::Entry;
use XML::Atom::Client;

my $api = XML::Atom::Client->new;
$api->username('kageroh_');
$api->password('********');

my $entry;
my $link  = XML::Atom::Link->new;
<xsl:apply-templates />
	</xsl:template>

	<xsl:template match="atom:entry/atom:link[@rel='related']">
$link->rel('related');
$link->type('<xsl:value-of select="@type" />');
$link->href('<xsl:value-of select="@href" />');
$entry = XML::Atom::Entry->new;
$entry->add_link($link);
$entry->summary('<xsl:for-each select="following-sibling::dc:subject">[<xsl:value-of select="." />]</xsl:for-each>');
$api->createEntry('http://b.hatena.ne.jp/atom/post', $entry) or die $api->errstr;
</xsl:template>

	<xsl:template match="atom:id | atom:issued | atom:name | atom:summary | atom:title | dc:*" />

</xsl:stylesheet>

add.pl

#!/usr/local/bin/perl
use strict;
use warnings;

use XML::Atom::Entry;
use XML::Atom::Client;

my $api = XML::Atom::Client->new;
$api->username('kageroh_');
$api->password('********');

my $entry;
my $link = XML::Atom::Link->new;

$link->rel('related');
$link->type('text/html');
$link->href('http://www.wireshark.org/');
$entry = XML::Atom::Entry->new;
$entry->add_link($link);
$entry->summary('[tcp][tool]');
$api->createEntry('http://b.hatena.ne.jp/atom/post', $entry) or die $api->errstr;
...

どうにか数が合いました。あと、日本語タグも英字にしたくて、それは手動でしこしこやった。

あ、ただのメモです。ツッコミは歓迎ですけども。

Perl だけで書けるのでしょうけど、私は Perl 片言なので。

せめてサブルーチン使えよって感じですね。直さない \(^o^)/