はてなブログにインポートしたダイアリーの内容をまとめて修正しよう

みなさん、はてなダイアリーからはてなブログへの引っ越しは終わりました?(たまには敬体で)

インポートはしたものの思ったような表示結果にならない。ここをこう直せばいいとわかっているけれど、全部の記事を1件ずつ修正するのは大変だ。そんなときは、テキストエディタはてなブログの記事を一気に修正する方法を試してみましょう。

はてなブログライターを使います

はてなブログライター」はテキストファイルの内容をはてなブログへ投稿するツールです。以前はてなブログへ投稿した記事もダウンロードして、テキストファイルで管理できるようになります。

また、「はてなブログライタースプリッタ」を使うと、はてなブログへの投稿を1つのテキストファイルにまとめて管理できます。複数の記事で同じ修正をするのに便利です。

はてなブログライター」の利用にはRubyの、「はてなブログライタースプリッタ」の利用にはPerlの実行環境が必要です。

Rubyをインストール

Rubyは下からダウンロードします。

今見たところでは右側の「WHICH VERSION TO DOWNLOAD?(どのバージョンをダウンロードしたらいい?)」には「we recommend you use Ruby+Devkit 2.5.X (x64) installer(64ビット版Ruby+Devkit 2.5.Xのインストーラがおすすめ)」とあり、左側の一覧の中で太字で「=>」がついている「Ruby+Devkit 2.5.3-1 (x64) 」(32ビットWindowsでは異なります)をダウンロードし実行します。

ライセンスに同意したりして次へ進むと「Select Components」が表示されます。ここは「MSYS2 Development toolchain 2018-10-21」のチェックボックスをオンにしてインストールしましょう。「781.5MB」とあるように空き容量がわりと必要です。

f:id:Imamura:20190201092805p:plain

Rubyのインストールが終わって表示されるダイアログボックスで「Run 'ridk install' MSYS2 and development toolchain. MSYS2 is required to install gems with C extensions.」のチェックボックスがオンになっていることを確認して[Finish]ボタンをクリックします。

f:id:Imamura:20190201092806p:plain

コマンドラインインストーラが起動します。「Which components shall be installed? [1,2,3]」には「3」を入力して[Enter]キーを押します。

f:id:Imamura:20190201092807p:plain

MSYS2のインストールが終わったら[Enter]キーを押すとウィンドウが閉じます。

f:id:Imamura:20190201092808p:plain

Rubyがインストールできたか確認しましょう。[Win]+[X]→[C]とタイプしてコマンドプロンプトを起動し、「ruby -v[Enter]」と入力します。([Enter]はEnterキーを押すことを示しています)

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users\yourname>ruby -v[Enter]
ruby 2.5.3p105 (2018-10-18 revision 65156) [x64-mingw32]

C:\Users\yourname>

Rubyのバージョンが表示されれば、Rubyがインストールされています。

atomutilをインストール

はてなブログライター」にはRubyの「atomutil」ライブラリが必要です。コマンドプロンプトで「gem install atomutil[Enter]」と入力してインストールします。途中「rake's executable "rake" conflicts with C:/Ruby25-x64/bin/rake / Overwrite the executable? [yN]」と表示されインストーラが止まります。ここは「y」を入力して[Enter]キーを押します。

C:\Users\yourname>gem install atomutil[Enter]
Fetching: rake-10.5.0.gem (100%)
rake's executable "rake" conflicts with C:/Ruby25-x64/bin/rake
Overwrite the executable? [yN]  y[Enter]
Successfully installed rake-10.5.0
Fetching: atomutil-0.1.5.gem (100%)
Successfully installed atomutil-0.1.5
Parsing documentation for rake-10.5.0
Installing ri documentation for rake-10.5.0
Parsing documentation for atomutil-0.1.5
Installing ri documentation for atomutil-0.1.5
Done installing documentation for rake, atomutil after 15 seconds
2 gems installed

C:\Users\yourname>

このあたりで「Windows セキュリティの重要な警告」が出ることがあります。「プライベートネットワーク」のチェックボックスがオン、「パブリックネットワーク」のチェックボックスがオフになっていることを確認して[アクセスを許可する]ボタンをクリックします。

f:id:Imamura:20190201092809p:plain

Perlをインストール

Perlは下からダウンロードします。

一番新しいのをダウンロード、インストールすればいいでしょう。

インストール時の「Choose Setup Type」は「Typical」を選びます。

f:id:Imamura:20190201092810p:plain

詳しくは下を参照してください。

インストールが終わったらコマンドプロンプトで「perl -v[Enter]」と入力します。

Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users\yourname>perl -v[Enter]

This is perl 5, version 26, subversion 3 (v5.26.3) built for MSWin32-x64-multi-thread
(with 2 registered patches, see perl -V for more detail)

Copyright 1987-2018, Larry Wall

Binary build 2603 [a95bce075] provided by ActiveState http://www.ActiveState.com
Built Dec 17 2018 09:46:45

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.


C:\Users\yourname>

表示結果の1行目に「This is perl 5, version 26, subversion 3 (v5.26.3) built for MSWin32-x64-multi-thread」とあります。Perlは無事インストールされていることがわかります。

はてなブログライターをダウンロード

はてなブログライター」を下からダウンロードします。

f:id:Imamura:20190201092811p:plain

ウィンドウ右上の「Clone or download」をクリックし、「Download ZIP」をクリックします。

ダウンロードされた「HatenaBlogWriter-master.zip」を解凍し、以下のファイルをこれからはてなブログの更新に使うフォルダにコピーします。

  • hbwdl.rb
  • HatenaBlogDownloader.rb
  • HatenaBlogWriter.rb
  • hbw.rb

はてなブログライタースプリッタをダウンロード

はてなブログライタースプリッタ」を下からダウンロードします。

先ほどと同様、ウィンドウ右上の「Clone or download」をクリックし、「Download ZIP」をクリックします。

ダウンロードされた「HatenaBlogWriterSplitter-master.zip」を解凍し、以下のファイルをこれからはてなブログの更新に使うフォルダにコピーします。

  • hbw_uniter.pl
  • hbws.pl

「config.yml」を作る

はてなブログライターのドキュメントをよく読んで、はてなブログライター向けの設定ファイルをテキストエディタで作ります。

Windowsの標準テキストエディタは「メモ帳」です。「メモ帳」で文字コードを「UTF-8」にして保存すると、現在のところBOMつきになって支障が出ることがあります。秀丸エディタ(有料、https://hide.maruo.co.jp/software/hidemaru.html)やサクラエディタ(フリー、https://sakura-editor.github.io/)、mi(Mac用/フリー、https://www.mimikaki.net/)を使うのがよいでしょう。

「config.yml」の作成にあたって、そのほかの注意点です。

  • 「blog_domain」に「http://」は不要です
  • api_key」ははてなにログインするときのパスワードではありませんはてなブログの設定の「詳細設定」ページの下の方にある「AtomPub」-「APIキー」に記載されている10文字ほどの英数字です

はてなブログから投稿データをダウンロードする

はてなブログライター」から一度でも投稿すると、「hbw.rb」などがあるフォルダに「data」フォルダが作られます。はてなブログライターから投稿する前に投稿済みのデータをダウンロードするときは、「data」フォルダを作ってから「hbwdl.rb」を実行します。

C:\Users\yourname\blog>hbwdl.rb[Enter]

これで最新の7件のデータがダウンロードされます。「2019-02-01_01.txt」といったファイル名のテキストファイルが作られます。中身を編集して「hbw.rb」を実行すると、修正されたエントリだけがアップロードされるしくみです。

C:\Users\yourname\blog>hbwdl.rb 0[Enter]

「0」をつけるとすべての投稿データがダウンロードされます。大量のデータのダウンロードははてなブログのサーバに負荷がかかるかもしれません。「hdwdl.rb 0」は何度も実行しないのがよいでしょう。

ダウンロードしたテキストファイルをつなげる

ダウンロードされたテキストファイルはエントリごとに分かれています。grepというツールやテキストエディタgrep機能を使うと、複数のファイルの内容を一括で検索・置換できますが、やや煩雑になります。

エントリのテキストファイルをまとめて1つにつなげておけば、過去記事の検索や置換が楽になります。「はてなブログライタースプリッタ」を使いましょう。

「hbw_uniter.pl」を実行します。

C:\Users\yourname\blog>hbw_uniter.pl[Enter]

「yyyy-mm-dd_nn.txt」というテキストファイルが「unite.txt」という1つのテキストファイルにまとめられます。このとき各エントリの冒頭には「yyyy-mm-dd_nn:エントリのタイトル」というヘッダがつけられます。

「2019-02-01_01.txt」が下のような内容だったとします。

title: 今日の出来事
date: 2019-02-01 21:00:00 +0900
category: 日記
今日、こんなことがあった。

「unite.txt」には下のような書式でまとめられます。

2019-02-01_01:今日の出来事
date: 2019-02-01 21:00:00 +0900
category: 日記
今日、こんなことがあった。

はてなブログライタースプリッタは、1つにまとめられたテキストファイルのファイル名が「diary.txt」であることを想定して作られています。すでに同じフォルダ内に「diary.txt」があるならば「unite.txt」の内容をまとめて「diary.txt」へコピーし、まだ「diary.txt」がないなら「unite.txt」のファイル名を「diary.txt」に変更してください。(そういう処理を加えたら…いやいや、それはそれで事故が起きそうだ)

はてなブログへ投稿してみる

コマンドプロンプトから下のように入力してください。

C:\Users\yourname\blog>hbws.pl & hbw.rb[Enter]

「hbws.pl」と「hbw.rb」は別々に実行してもよいですが、「&」でつなぐと1コマンドでまとめて実行できます。

最初の実行では全エントリのテキストファイルが分割し直され、はてなブログに投稿されます。といってもすでに投稿されているはてなブログの内容と違いがなければ、「INFO: 2019-02-01_01.txt の内容は前回投稿したものと同じでした。」といったメッセージが表示されます。

「diary.txt」の内容をどこかちょっと変更して、「hbws.pl & hbw.rb[Enter]」を実行してみてください。修正されたエントリだけが「yyyy-mm-dd_nn.txt」というファイル名のテキストファイルに切り出され、はてなブログへ投稿されます。

追記

「diary.txt」に新しいエントリを投稿するには、ヘッダ部に日付や時刻を書きます。「hbw.rb new」を実行したときのように、日時が自動的に挿入される方法を書きました。

テキストエディタで置換する

はてなダイアリーはてなブログでは、同じはてな記法モードでも解釈がいろいろ異なります。代表的な例がid記法です。たとえば「id:Imamura:20030217:p1」と書いたとき、はてなダイアリーではhttp://d.hatena.ne.jp/Imamura/20030217/p1へのリンクになりますが、はてなブログではこのような書き方をサポートしておらず「id:Imamura:20030217:p1」のようなhttp://blog.hatena.ne.jp/Imamura/へのリンクになります。

id:Imamura:20030217:p1」の先頭に「d:」をつけて、「d:id:Imamura:20030217:p1」のようにすると、はてなブログでもhttp://d.hatena.ne.jp/Imamura/20030217/p1へリンクするようになります(これをダイアリー記法といいます)。

しかし単に「id:~」を全部「d:id:~」に置換すると、「f:id:~」も「f:d:id:~」になってしまうなど、ほかの記法に影響が出ます。日付入りのid記法だけをダイアリー記法に置換してあげる必要があります。これを含めて、はてなダイアリーからインポートしたエントリをどう直せばはてなブログで元と同じ結果になるかを下にまとめました。

新規の投稿は1日100件まで

はてなダイアリーの内容をはてなブログで修正するにあたって、新しいエントリにまとめ直して投稿したくなるかもしれません。このときは、1日100件の新規投稿制限に気をつけてください。

  • 1日に書ける記事数を、これまでの10件から、100件に変更しました
1日の記事数と、1記事あたりのコメント数の制限を緩和しました - はてなブログ開発ブログ

はてなダイアリーの記事を整理して新しいエントリにする場合は、この制限を意識しておくとよいでしょう。

どうしても100件以上を同時に新規投稿したいときは、MovableType形式やWordPress形式でデータを作って「インポート」からはてなブログに投入する方法があります。インポートしたら改めて「hbwdl.rb」と「hbw_uniter.pl」を実行すれば、はてなブログライターで管理できるようになります。

MovableType形式の書式の例は、はてなダイアリーの「ブログのエクスポート」で「Movable Type形式」をダウンロードすることで得られます。

(追記:MovableType形式のインポートでは、はてなブログの編集モードの設定によらず「見たままモード」で書いたものとして扱われるようです)

はてなダイアリーからインポートするときの既知の問題

はてなダイアリーからインポートしたエントリで問題が起きることがあります(フィードバック済み)。

同じカテゴリーが2つずつ付いている記事を発見。

どうも、記事のタイトルは書かずにカテゴリーだけを付けた記事が そうなってるみたい。

はてなダイアリーからインポートした記事のカテゴリーがおかしい - 雑食堂

はてなブログへインポートした時「はてなダイアリーで書いていた時、カテゴリー記法で付けていたカテゴリーが、ことごとく2つづつ表示される」現象が起きていたからなんです。ただ、それらの記事はひとつ特徴が有りまして、「カテゴリーは付けたけどタイトルは無い」記事でした。

はてなブログへのインポート実験その後 - 転んでも転んでも立ち上がる 諦めないための記録(※引用時に改行を調整)

カテゴリーしかない見出しはインポート時に不具合が出るようです。

またこの種のエントリは、はてなダイアリーのエントリをはてなブログへインポートするときの編集モードでも問題が出ました。はてなブログには3つの編集モードがあって、はてなダイアリーからインポートされたエントリは自動的に「はてな記法モード」になります。ところが上のような、カテゴリ名だけの記事はインポート時に編集モードが「はてな記法モード」にならず、そのブログの編集モードでインポートされてしまいます。

いったん登録されたエントリの編集モードは変更できません。下のような手順でインポートし直した上で、はてなブログ上でカテゴリを編集するとよいでしょう。

  1. はてなダイアリーのインポートを取り消す
  2. はてなブログの編集モードを「はてな記法モード」に変更
  3. 改めてはてなダイアリーをインポート

「diary.txt」内のカテゴリ指定は以下のようにすると修正できます。

  • 正規表現で検索:category: (.+?), \1
  • 置換:category: \1

これで「category: 日記, 日記」などとなっている部分が「category: 日記」に修正されます。あとは「hbws.pl & hbw.rb」を実行すれば、はてなブログ上でのカテゴリ指定の重複がなくなるでしょう。

はてなブログへの投稿にかかった時間を計測する

はてなダイアリーからエントリをインポートしたはてなブログはエントリ数が多くなりがちで、処理時間も長くなります。何分かかったのかを計測するスクリプトを書きました。

下のスクリプトを「time.pl」などとして、はてなブログライターと同じフォルダに保存します。スクリプト文字コードは任意です。

スクリプトが実行されると、このスクリプトが前回実行された時刻からの経過時間を表示します。初めて実行したときは、その時刻だけを表示し記録します。

「time.pl & hbws.pl & hbw.rb & time.pl」のように、行う処理の前後で「time.pl」を実行する使い方を想定しています。

下は表示結果の例です。このはてなブログhttp://ima.hatenablog.jp/)は約15,000のエントリがあり、うち1つを修正した場合、投稿に約1分半かかりました。

the last session: Fri Feb  1 17:28:45 2019
proceeded:        Fri Feb  1 17:37:37 2019
elapsed time:     0day 00:08:52 (532 second)
Create 2019-02-01_01.txt
新規エントリファイルはありません。
修正されたエントリファイルが 1 件あります。
OK: 2019-02-01_01.txt: エントリを更新しました。
the last session: Fri Feb  1 17:37:37 2019
proceeded:        Fri Feb  1 17:38:58 2019
elapsed time:     0day 00:01:21 (81 second)

time.pl

#! /usr/local/bin/perl
use 5.010;

$timefilename = "time.txt"; #スクリプトの実行時刻を記録するファイルのファイル名

if (-f $timefilename == 0) {
	say "create: " . $timefilename;
	open (OUT, "> $timefilename");
		print OUT "0";
	close OUT;
}

open (IN, "< $timefilename");

$now = time;

while ($lasttime = <IN>){
	if ($lasttime == 0) {
		$outtext1 = "";
		$outtext3 = "";
		} else {
		$elapse = $now - $lasttime;
		($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime($elapse);
		$year -= 70;
		--$mday;
		if($year+$mon == 0){
			$daytext = $mday . "day ";
			} else {
			$daytext = $year . "year " . $mon . "month " . $mday . "day ";
		}
		 ("%02d:%02d:%02d\n", $hour, $min, $sec );
		$stime = sprintf("%02s:%02s:%02d", $hour, $min, $sec);
		1 while $elapse =~ s/(.*\d)(\d\d\d)/$1,$2/;
		$outtext1 = "the last session: " . localtime($lasttime) . "\n";
		$outtext3 = "elapsed time:     " . $daytext . $stime . " (" . $elapse . " second)\n";
	}
print $outtext1;
print "proceeded:        " . localtime($now) . "\n";
print $outtext3;
}
open (OUT, "> $timefilename");
print OUT $now;
close IN;
close OUT;