はてな上の日記ログをまとめるための覚え書き

以前の日記(d:id:manpukuya)とTwitterへの書き込みまとめ(g:twitter:id:Imamura)をこの日記にマージしたくなってきた。これは今日突然思ったことではない。

日記を書くとき、「以前こんなこと書いたなー」と参照したくなることがよくある。でもこの日記に書いたのか、以前の日記に書いたのかわからないこともよくあって、2つの日記を検索しなくてはいけなかったりする。これが面倒だ。

また以前「長年日記」を得られるRSSを作った。n年前の今日の日記をまとめて読み返すことができる。自分が面白いと思ったことが書かれているので自分で読んで面白いし、頭の中の棚卸しにもなってとてもよい。

しかし長年日記RSSは自分の場合、以前の日記と今の日記を両方チェックすることになる。さらにTwitterへの投稿も同じように別のところ(g:twitter:id:Imamura)にまとめてあり、これも長年日記として見られるようにしている。その結果、長年日記を見るのに合計3つの日記のRSSをチェックすることになっていて、これはわずらわしいなーと思うのだった。

3つの日記をここにまとめてしまえば、検索しやすいし長年日記の運用もしやすくなる。

日記の統合にあたってのあれこれ

以前の日記の内容を新しい日記に転記するにあたっては、寄せられたコメントやトラックバックも引用の形で表示したい。

またid:manpukuya内の参照はうまいこと書き換えたい。たとえば「d:id:manpukuya:20071231」を「d:id:Imamura:20071231/[http://d.hatena.ne.jp/manpukuya/20071231/:title=【元記事】]」みたいにしたいところ。

またTwitterの投稿ログを移転するにあたっては、短縮URLの参照先がわかるようにしておきたい。もし短縮サービスがなくなると、転送先がわからなくなってしまうからね。たとえば「http://htn.to/HnCB67」は「http://d.hatena.ne.jp/Imamura/20110414/dog」を短縮したURLだから、「http://d.hatena.ne.jp/Imamura/20110414/dog」みたいに書き換えておきたい。

展開の対象にする短縮URLドメインは、bit.ly、j.mp、t.co、htn.to、tinyurl.com、goo.gl、ow.ly、ht.ly、p.tlあたり。amzn.toやyoutu.be、instagr.amなども短縮URLではあるが、これらはサービス主体がそのサービス内でのみ使うために提供している。この短縮URLを使えなくなったら転送先のURLもなくなるのだからそこは気にしない。

ツイートの文字列の中にあるこれら短縮URLの文字列を判別して、上のような記法に展開すればよい。でも自分のPerlの知識だと、そういう処理をするスクリプトをどう書いたらいいかわからないというのが情けない。「短縮URLを戻すサンプルスクリプト」では短縮URLを書き戻すことはできるのだけど、文字列の中に短縮URLが含まれている場合にどうやって切り出したらいいのかが…いや展開する短縮URLを限定した上で、$`や$&や$'をうまいこと使えばいいのだろうが…うーんもうちょっとがんばります。

実はTwitterのログに関しては、テスト的にある程度移転させてみている。

これはいろいろ手作業だから自動化したい。

追記:はてなブックマーク

はてなブックマークとそのコメントもまとめられればよい。

はてなハイクはうーんまあいいかな。

追記:短縮URLを展開するPerlスクリプト

その後うんうんやって一応書けた。展開したURLが存在しないときなどはエラーが出る。

#! /usr/local/bin/perl
use LWP::UserAgent;

#↓展開するドメイン名。趣味に応じてamzn.toやyoutu.beなどを追加する(※12/09/03からはt.coのみ)
my @shortdomain=('bit.ly','j.mp','t.co','htn.to','tinyurl.com','goo.gl','ow.ly','ht.ly','is.gd','twurl.nl','lb.to','p.tl');
my $exp="";
my $out="";
foreach(@shortdomain){$exp.="https?://".$_."/[a-zA-Z0-9]+|";}
chop $exp;
# 引数に書かれたファイル名のファイルを読み込んで1行ずつ処理して出力する
foreach $infilename ( @ARGV ){ #コマンドラインで指定された複数の引数をすべて処理する(引数は@ARGVを通して$infilenameに入る)
	$outfilename="a".$infilename; #「a元ファイル名」というファイルに出力
	open(IN,"$infilename");
	open(OUT,"> $outfilename");#※>>にすると追加出力
	while (<IN>) {#<IN>に入力されたファイルを1行ずつ処理する
		$out = $_;
		$out =~ s/$exp/expand_uri( $& )/eg;
		print OUT $out;
	}
	close IN;
	close OUT;
}

sub expand_uri{
	my $uri = shift;
	my $ua  = LWP::UserAgent->new;
	my $res = $ua->head($uri);
	die $res->status_line unless $res->is_success;
	return $res->request->uri;
}