Hatena::ブログ(Diary)

Imamuraの日記

2013-01-22(火)

ダイアリーを「はてダラ」と「はてダラスプリッタ」で更新できるようにしたメモ

| ダイアリーを「はてダラ」と「はてダラスプリッタ」で更新できるようにしたメモを含むブックマーク ダイアリーを「はてダラ」と「はてダラスプリッタ」で更新できるようにしたメモのブックマークコメント

今さらながら、このダイアリーをひとつのテキストファイルから更新できるようにした。その作業メモ。具体的な手順はWindows向けですが適宜読み替えればMacなどでもできるはず。

そもそもそういうことをしたくなったのは、Twitterの全ツイートダウンロードできるようになったから。

このダイアリーには自分(@)のツイートを随時転記している。いろいろあって2009年7月分のツイートが手元になかったのだが、全ツイートダウンロード機能の提供開始で補完できることになった。これをまとめてダイアリーに転記したい。

該当する日付のダイアリーをいちいちブラウザで開いて「編集」してもよいが、もうちょっとエレガントにやりたい。

はてダラ」を使うと、日付のテキストファイルを作って実行すればダイアリーを更新してくれる。さらに「はてダラスプリッタ」を使えば、日ごとのテキストファイルを用意しなくても、すべての日付をひとつにしたテキストファイルから「はてダラ」用のテキストファイルを生成してくれる。ある決まったテキストファイルを編集したあと、「はてダラスプリッタ」に続いて「はてダラ」を実行すれば変更があった日だけ更新できるというわけ。

「はてダラ」と「はてダラスプリッタ」の環境を作っておけば、後日ダイアリーの内容を一括置換したいときなどに便利だ。自分のテキスト編集環境では、日付のテキストファイル群をgrepする(「はてダラ」のみ使用)よりはひとつのテキストファイルを一括で検索/置換できるほう(「はてダラスプリッタ」も使用)がよい。

そんなわけで以下のように作業した。

  1. 今後はてダラを使うディレクトリに「hw.pl」、「csv2hw.pl」、「adddateheader.pl」、「hws.pl」を置く
  2. ダイアリーのCSVデータを今後はてダラに使うディレクトリにダウンロード(ダイアリーの「管理」−「データ管理」−「ブログエクスポート」−「CSV形式」の「ダウンロード」を右クリックし「名前を付けて保存」)
  3. ダウンロードしたCSVファイルをcsv2hw.plにかける。コマンドプロンプトで「はてダラ」を使うディレクトリへ移動し「perl csv2hw.pl CSVファイルのファイル名」
  4. 2013-01-01.txt」などが生成されたディレクトリで「dir ????-??-??.txt /b > dir.bat」を実行
  5. 生成された「dir.bat」をテキストエディタで開き「2013-01-01.txt」を「perl adddateheader.pl 2013-01-01.txt」のように一括置換。具体的には、正規表現検索/置換ができるテキストエディタを使い「^(.)」を検索、「perl adddateheader.pl $1」に置換するなど
  6. 「dir.bat」を実行。「a2013-01-01.txt」「a2013-01-02.txt」…のようなファイルが生成される
  7. 生成された「a2013-01-01.txt」「a2013-01-02.txt」…のようなファイルを日付順に結合。日付の昇順にするか降順にするかはお好みで。Windowsならpacktextなどを使う(→「概要−packtext−水無瀬の部屋)。出力するテキストファイルのファイル名は「diary.txt」とする
  8. 「2013-01-01.txt」や「a2013-01-01.txt」といった日付ファイルを全部別の場所へ移動する。削除しちゃってもよい。「csv2hw.pl」、「adddateheader.pl」ももう使わないので別の場所へ移動するか削除
  9. 「perl hws.pl」(はてダラスプリッタ)を実行
    • メモ:生成されるテキストファイルのタイムスタンプはhws.plの実行時刻(テキストファイルのファイル名にもとづく日付にはならない)
  10. 今までの作業ディレクトリとは異なるディレクトリで「perl hw.pl」を実行、生成される「touch.txt」を今までの作業ディレクトリにコピー。こうすることで、次回はてダラを実行時に既存の日記が全部再アップロードされるのを抑止できる(※更新がないとtouch.txtが生成されないので、さっき移動した「2013-01-01.txt」などのうち一つだけ持ってきて「perl hw.pl -t」するとよさそう)
  11. 「diary.txt」の内容を必要に応じて追加・修正し、コマンドラインから「hws.pl & hw.pl」を実行(hws.plとhw.plの実行はバッチファイルにしてもよい。自分の場合「h.bat」として更新の実行を省力化している)

以上で、今後は上の手順の最後、「diary.txt」を修正して「hws.pl & hw.pl」を実行することでダイアリーを更新できるようになった。お疲れさまでした。

(考えてみると、CSVファイルをいったん分割して日付の文字列を追加してまたつなげるのは無駄が多い。CSVファイルから必要な部分を取り出すだけで「diary.txt」を作れるのだな。そういう処理をするスクリプトは「csv2hw.pl」をもとに作れそう。でも自分のスキルでは無理だ)

ところではてなとしては、はてなダイアリーからはてなブログへの移行をユーザーにすすめていきたいらしい。はてなブログでもこの種の更新ツールを使えるようになったら移行する人がもっと増えるんではないですかねーなんて。(フィードバック済み)

adddateheader.pl

#! /usr/local/bin/perl
# 引数に書かれたファイル名のファイルを読み込んで1行ずつ処理して出力する
foreach $infilename ( @ARGV ){ #コマンドラインで指定された複数の引数をすべて処理する(引数は@ARGVを通して$infilenameに入る)
	$day = $infilename;
	$day =~ s/([\d\-]+)\.txt/\n$1/g; # 「2001-01-01.txt」を「<改行>2001-01-01」に(各テキストファイルの末尾に改行がないことがあるので)
	$outfilename="a".$infilename; #「a元ファイル名」というファイルに出力

	open(IN,"< $infilename");
	open(OUT,"> $outfilename");
		@list=<IN>;
		@out=($day.":",@list);
			print OUT @out;
	close IN;
	close OUT;
}

関連記事