ただいま村

2018年末までの記事ははてなダイアリーをご覧ください http://d.hatena.ne.jp/Imamura/

はてなダイアリーからはてなブログへ引っ越す前にはてな記法をはてなブログ向けに修正する

はてなダイアリーは1月24日以降は編集できなくなる。はてなダイアリーの書き方(はてな記法)とはてなブログの「はてな記法モード」は微妙に異なり、そのままインポートするとダイアリーのときとは一部異なる表示結果になる。はてなダイアリーはてなブログへインポートする前に、ダイアリーの内容をはてなブログ向けに書き直しておこう。

はてなダイアリーに登録したエントリを全文一括で検索・置換できるようにすれば、ダイアリーの内容をチクチク修正する必要はなくなる。

はてなブログにすでに登録した内容をあとから一括で修正する方法は今のところありません。「はてなブログライター」でエントリを登録するとテキストファイルの修正でエントリを修正でき、「はてなブログライタースプリッタ」を使うと「はてなブログライター」で登録したエントリを一括で修正できます。詳しくは以下のエントリ参照)

この記事では、まとめる際に気付いた不具合についても書いている。これは本稿執筆時点のものであり、今後修正される可能性がある。

記事が思った以上に長くなったので、珍しく目次をどうぞ。

はてなダイアリーの内容を全文検索/置換できるようにする

まず、はてなダイアリーの内容を全文検索/置換できるよう、1つのテキストファイルにまとめる。方法は以下で解説している。

これで、ダイアリーの全エントリを1つのテキストファイルにまとめることができる。あとはテキストエディタを使い、はてなブログ向けの書き方に修正すればよい。検索して一括で置換できる修正ならすべての日をまとめて修正できて簡単だ。正規表現での検索・置換を使えば、すべての数字を検索したり、検索結果の一部を取り出して置換する文字列として使うことができたりする。

正規表現が使えるテキストエディタ秀丸エディタ(有料、https://hide.maruo.co.jp/software/hidemaru.html)やサクラエディタ(フリー、https://sakura-editor.github.io/)、mi(フリー、https://www.mimikaki.net/)などがある。(カッコでくるんだタグを置換時に呼び出す文字は、テキストエディタによっては「\1」「\2」…ではなく「$1」「$2」…のこともあります)

なお、改行を検索するのに「\n」が出てくるが、サクラエディタWindowsの改行(CR+LF)を検索するには「\r\n」と書く。サクラエディタでLFやCRのみの改行も含めて検索するには「\[\r\n]+」と書く(→利用可能な正規表現 - サクラエディタ)。miで改行を表すのは「\r」である(→正規表現 - mi Help)。

また、テキストエディタによっては、正規表現での「<」や「>」は「\<」「\>」と書く必要がある(WZ Editorなど)。使っているテキストエディタのヘルプを参照のこと。

はてなブログ向けにテキストファイルを編集してダイアリーを更新するときは、「ちょっとした更新」になる「-t」オプションをつけるのを忘れずに。ダイアリーの設定によっては自動でトラックバックidコール)を飛ばしまくることになってしまう。管理画面の「設定」-「コメント・トラックバック設定」(「ダイアリーのURL/configcomment」)の下の方にある「自動トラックバック」を「自動トラックバックを送信しない」にしておく。はてなダイアリーに新しいエントリを登録するときは、もちろん「ちょっとした更新」にする必要はない。

拡張id記法をダイアリー記法に置換

はてなダイアリーで「id:Imamura:20030217:p1」のように、日付を含むid記法を書いている方限定です。id記法については→はてなユーザーにリンクする(id記法) - はてなダイアリーのヘルプ

はてなダイアリーだけで使えるid記法(「id:Imamura:20030217:p1」のような書き方、本稿では「拡張id記法」と呼称)は、はてなブログへ行くと「id:Imamura:20030217:p1」のようなリンクになる。はてなブログでははてなダイアリーと異なり、id記法では「id:~」という書き方しかサポートしていないため。

「[d:id:Imamura:20030217:p1]」という書き方は「ダイアリー記法」といい、これならはてなブログでも使える。じゃあ「id:~」をまとめて「d:id:~」に置換してしまえばいいのかというとそんなことはない。フォトライフ記法(「f:id:~」)が「f:d:id:~」になったり、はてなグループ記法(「g:~:id:~」)が「g:~:d:id:~」になってしまったりする。それに日付などを含まない通常のid記法(「id:~」)ははてなブログでも有効なのでそのままにしておきたい。

加えて、定義リストの記法(「:」で始めて「:~:~」と書く)で2つめの「:」の直後にid記法がある可能性と、行頭がid記法である可能性も考慮して、下のように段階を追って正規表現で検索・置換していく。

  1. 定義リストの2つめの「:」に続けて拡張id記法がある場合にダイアリー記法へ置換
    • ①英字(厳密にはabcdfghiklmnqrsだけと思うが抜けがありそうなのでa~z全部で検索)を除く文字列+②「:」(定義リストの2つめの「:」)+③「id:」+④英数字、「_」、「-」、「+」を含む文字列+⑤「:」+⑥「yyyymmdd(数字8桁)」という文字列を検索して、「[①②d:③④⑤⑥]」に置換する
      • 検索:([^a-zA-Z]:)(id:[a-zA-Z0-9_\-\+]+:\d{8})
      • 置換:[\1d:\2]
  2. idを含む各種のはてな記法を除いて、拡張id記法をダイアリー記法へ置換
    • ①「:」以外の文字列+②「id:」+③英数字、「_」、「-」、「+」を含む文字列+④「:」+⑤「yyyymmdd(数字8桁)」という文字列を検索して、「[①d:②③④⑤]」に置換する
      • 検索:([^:])(id:[a-zA-Z0-9_\-\+]+:\d{8})
      • 置換:[\1d:\2]
  3. 行頭の拡張id記法をダイアリー記法へ置換
    • ①行頭の「id:」+②英数字、「_」、「-」、「+」を含む文字列+③「:」+④「yyyymmdd(数字8桁)」という文字列を検索して、「[①d:②③④]」に置換する
      • 検索:^(id:[a-zA-Z0-9_\-\+]+:\d{8})
      • 置換:[d:\1]

拡張id記法に「d:」をつけてダイアリー記法にしたくないときは、拡張id記法をリンクタグにする。たとえば「id:Imamura:20030217:p1」を「<a href="http://d.hatena.ne.jp/Imamura/20030217/p1">id:Imamura:20030217:p1</a>」のように一括置換すればよい。id:Imamura:20030217#p1(最後の「:」が「#」)という書き方の場合は「<a href="http://d.hatena.ne.jp/Imamura/20030217#p1">id:Imamura:20030217#p1</a>」にする。(方法は省略)

また拡張id記法やダイアリー記法には「d:id:zaikabou:201812」という月単位の書き方もあって、その月のエントリをまとめて表示する「http://d.hatena.ne.jp/zaikabou/201812」へのリンクとなる(id:zaikabouさん、例に出してスイマセン。ダイアリーをはてなブログにインポート済み、かつリダイレクト設定済みの人ということで使わせていただきます)。

はてなダイアリーの内容をはてなブログにインポートすると、はてなダイアリーのURLははてなブログへリダイレクトされる。上のURL(http://d.hatena.ne.jp/zaikabou/201812)はhttp://zaikabou.hatenablog.com/entries/2018/12/00へリダイレクトされ、当該月の1日のエントリが本文も含めてまとめて表示されるのだが、そのエントリの実際のURL(上の場合http://zaikabou.hatenablog.com/entry/20181201/1543590000)と異なるため混乱する。(フィードバック済み)

このような問題を避けるため、月単位のダイアリー記法ははてなブログ向けに書き換えておく。これには移行先のはてなブログのURLが必要になるので、はてなダイアリーをインポートする先のはてなブログをあらかじめ作成しておく。また月単位の表記をしているほかの人のダイアリーがはてなブログに移行していなかったら、あとで移行を確認してから書き換えることになる。

はてなブログでは、1か月分の記事の一覧は「http://zaikabou.hatenablog.com/archive/2018/12」といったURLで閲覧できる。「d:id:zaikabou:201812http://d.hatena.ne.jp/zaikabou/201812)」は「http://zaikabou.hatenablog.com/archive/2018/12」へリンクするよう書き換える。

  1. 拡張id記法での月単位の指定をはてなブログでの月単位の指定に置換
    • ①「:」以外の文字列+②「id:」+③英数字、「_」、「-」、「+」を含む文字列+④「:」+⑤「yyyy(数字4桁)」+⑥「mm(数字2桁)」+⑦数字以外の文字、という文字列を検索して、「①[はてなブログのURL/archive/⑤/⑥:title=②③④⑤⑥]⑦」に置換する
      • 検索:([^:])(id:[a-zA-Z0-9_\-\+]+:)(\d{4})(\d\d)([^\d])
      • 置換:\1[はてなブログのURL/archive/\3/\4:title=\2\3\4]\5
  2. 拡張id記法での月単位の指定をはてなブログでの月単位の指定に置換(行頭にある場合)
    • ①行頭の「id:」+②英数字、「_」、「-」、「+」を含む文字列+③「:」+④「yyyy(数字4桁)」+⑤「mm(数字2桁)」+⑥数字以外の文字、という文字列を検索して、「[はてなブログのURL/archive/④/⑤:title=①②③④⑤]⑥」に置換する
      • 検索:^(id:[a-zA-Z0-9_\-\+]+:)(\d{4})(\d\d)([^\d])
      • 置換:[はてなブログのURL/archive/\2/\3:title=\1\2\3]\4
  3. ダイアリー記法での月単位の指定をはてなブログでの月単位の指定に置換
    • ①「d:id:」+②英数字、「_」、「-」、「+」を含む文字列+③「:」+④「yyyy(数字4桁)」+⑤「mm(数字2桁)」+⑥数字以外の文字、という文字列を検索して、「[はてなブログのURL/archive/④/⑤:title=①②③④⑤]⑥」に置換する
      • 検索:(d:id:[a-zA-Z0-9_\-\+]+:)(\d{4})(\d\d)([^\d])
      • 置換:[はてなブログのURL/archive/\2/\3:title=\1\2\3]\4

タイトル内にあるリンクを外に出す

※ダイアリーのエントリのタイトルにリンク(「<a href="~">」)やid記法(「id:~」)、ASIN/ISBN記法(「ASIN:~」や「ISBN:~」)、URLを書いている方限定です

はてなダイアリーはサービスイン当初、タイトルの前の「■」がそのエントリへのリンクになっていて、タイトルそのものは素のテキストだった。今も「設定」-「記事の設定」-「表示モードの選択」-「見出し」(ダイアリーのURL/configview)で「見出しを1段で表示」にするとその表示を選択できる。なのでタイトル内に別のURLへのリンクを書くことができた。

一方、はてなブログではタイトル全体がそのエントリへのリンクになる。そのため、ダイアリーで「*p1*<a href="http://www.hatena.ne.jp/">はてな</a>について」のような書き方をしていたのをはてなブログへインポートすると、リンク先にジャンプできない記事になる。そこで、タイトル内のリンクをタイトルの次の行へ移動する。リンクはリスト記法(行頭が「-」)で書くことにする。

  1. タイトル内のa要素を次の行へ移動する
    • ①行頭が「*」+②「*」以外で始まる任意の文字列(行頭に「**」と書く小見出し記法を検索しないようにする)+③「<a」+④「>」以外の任意の文字列+⑤「href=」+⑥「"」「'」(あれば)+⑦「"」か「'」以外の任意の文字列+⑧「"」か「'」(あれば)+⑨「>」以外の任意の文字列(あれば)+⑩「>」+⑪「<」以外の任意の文字列+⑫「</a>」+⑬行末までの任意の文字列、という文字列を検索して、「①②⑪⑬\n-③④⑤⑥⑦⑧⑨⑩⑪⑫」に置換する
      • 検索:^(\*[^\*].*)(<a href=["']?[^"']+["']?>)([^<]+)(</a>)(.*)$
      • 置換:\1\3\5\n-\2\3\4
  2. タイトル内のid記法を次の行へコピーする
    • ①行頭が「*」+②「*」以外で始まる任意の文字列(行頭に「**」と書く小見出し記法を検索しないようにする)+③英字と「:」以外の文字列+④英字と「:」の文字列(あれば)+⑤「id:」+⑥英数字と「_」「:」「#」「-」「+」を含む文字列+⑦行末までの任意の文字列(あれば)、という文字列を検索して「①②③④⑤⑥⑦\n-④⑤⑥」に置換する
      • 検索:^(\*[^\*].*[^a-zA-Z:]+)([a-zA-Z:]*:?id:[a-zA-Z0-9_:#\-\+]+)(.*)$
      • 置換:\1\2\3\n-\2
  3. タイトル内のASIN/ISBN記法を次の行へコピーする
    • ①行頭が「*」+②「*」以外で始まる任意の文字列(行頭に「**」と書く小見出し記法を検索しないようにする)+③「ASIN:」か「ISBN:」+④英数字の文字列(10文字か13文字だが煩雑になるため単なるくり返しで判断)+⑤行末までの任意の文字列(あれば)、という文字列を検索して「①②③④⑤\n-③④」に置換する
      • 検索:^(\*[^\*].*)([AaIi][Ss][IiBb][Nn]:[a-zA-Z0-9]+)(.*)$
      • 置換:\1\2\3\n-\2
  4. URLを含むタイトルを次の行へコピーする
    • ①行頭が「*」+②「*」以外で始まる任意の文字列(行頭に「**」と書く小見出し記法を検索しないようにする)+③「http://」や「https://」で始まり、英数字と「.」「,」「;」「/」「~」「-」「(」「)」「_」「#」「?」「%」「&」「=」「!」「+」を含む文字列(←ここはもうちょっと工夫が必要かも)、という文字列を検索して「①②③\n-③」に置換する
      • 検索:^(\*[^\*].*)(https?://[a-zA-Z0-9\.,;/~\-\(\)_#\?%&=\!\+]+)(.*)$
      • 置換:\1\2\3\n-\2

一行内に複数のa要素やid記法などがあるかもしれない場合、検索結果がなくなるまで何回か検索・置換をくり返す。

最後に、タイトル内に「https?://」や「id:」、「ASIN:」、「ISBN:」があって次の行が「-」以外で始まる行がないか、検索しておくとよさそう。検索文字列は「^\*[^\*].*(https?://|id:|[AaIi][Ss][IiBb][Nn]:).*\n[^\-]」。

定義リストの記法内の「:」を「&#58」に置換

※ダイアリーで定義リスト記法(「:~:~」)を使っている方限定です。定義リスト記法については→定義リストをつくる(定義リスト記法) - はてなダイアリーのヘルプ

はてなダイアリーでは、定義リストの記法(行頭に「:」、次に「:」が出るまでがdt要素、そこから行末までがdd要素になる)のdt要素部分に「:」を含めるのに「[]:[]」とエスケープする手法があった。お手軽でよかったのだが、はてなブログではここの解釈が変わり、エスケープしてあっても行頭の「:」の次に「:」が出るとそこでdt要素が終わる。はてなブログでdt要素に「:」を書きたいときは「&#58;」と書くようにする。

  1. 「[]:[]」を「&#58;」に変換する(これは正規表現を使わず通常の検索・置換で)
    • 検索::
    • 置換:&#58;
      • 自分の場合「まんぷく[]::[]日記」という書き方が多かったので上に加えて「::」を「&#58;&#58;」に検索・置換した
  2. 行頭の「:」と次の「:」の間に「[]」がある行を検索する。「[]~[]」の間に「:」があるかは判定しないので一括置換はせず、区切り文字ではない「:」を「&#58;」にし、「[]」を削除するなどを手作業で行う
    • ①行頭に「:」+②「:」を除く任意の文字列(あれば)+③「[]」を検索
      • 検索:^:[^:]*\[\]

行頭の「:」と次の「:」の間にURLがあればhttp記法に置換する

※ダイアリーで定義リスト記法(「:~:~」)を使っている方限定です。定義リスト記法については→定義リストをつくる(定義リスト記法) - はてなダイアリーのヘルプ

定義リストの記法でdt要素内にURLがある場合、「:<a href="http://~">~</a>:~」と書いていると「http:」の「:」を区切り文字と誤解してdt要素が終わってしまう(URLやHTMLタグ内の「:」は定義リスト記法の区切り文字にしないでほしい→フィードバック済み)。「[http://~:title=~]」というhttp記法に置換する。

  1. 定義リスト記法で2つめの区切り文字までにリンクのタグがあったらhttp記法に書き換える
    • ①行頭に「:」+②「:」や「<」を除く任意の文字列(あれば)+③「<a href=」+④「"」か「'」(あれば)+⑤「"」「'」以外の任意の文字列(ここがURL)+⑥「"」か「'」(あれば)+⑦「 」(半角スペース)(あれば)+⑧「>」以外の任意の文字列(あれば)+⑨「>」+⑩「<」以外の任意の文字列(ここがリンク文字列)+⑪「</a>」、という文字列を検索して、「①②[⑤:title=⑩]」に置換する
      • 検索:^(:[^:<]*)<a.*href=["']?([^"'>]+)["']? ?[^>]*>([^<]+)<a>
      • 置換:\1[\2:title=\3]\4

この検索/置換にはいくつか注意がある。

  • dt要素内にリンクタグが複数ある可能性を考えて、検索されなくなるまで検索/置換する
  • 「<a rel="nofollow" href~」のように「<a 」に「href~」が続かない書き方をしていると検索されない(正規表現で「*」に続く「?」による最短一致検索ができるなら、「a href=」の部分を「a.*?href=」と書くこともできるが、これを「[http://~:title=~]」に書き換えると「rel="nofollow"」という属性がなくなってしまうので一長一短)
  • 「<a href="~">」と「</a>」の間が文字ではなく画像(「<img src="~">」)のときは「[http://~:title=<img src="~">]」となってしまうので、そういうのは改めて「[http://~:image=画像のURL]」と置換する(方法は省略)
    • 画像に特定のクラス(「class="~"」)を割り当てる必要があるとお手上げなので、定義リストのはてな記法は使わず「><dl><dt>~</dt><dd>~<dd></dl><」とHTMLのタグにするほかなさそう(方法は省略)
  • 最後に、検索しきれなかったものを探して個別に対処する
    • ①行頭に「:」+②「:」を除く任意の文字列(あれば)+③「[」以外の文字+④「http://」や「https://」で始まり、英数字と「.」「,」「;」「/」「~」「-」「(」「)」「_」「#」「?」「%」「&」「=」「!」「+」を含む文字列(←さっきと同じ)を検索する(書き方はさまざまなので一括置換せず、一つずつ書き換える)
      • 検索:^:[^:]*[^\[]https?://[a-zA-Z0-9\.,;/~\-\(\)_#\?%&=\!\+]+

blockquoteタグ内の「cite」要素は展開されない

※ダイアリー内で引用記法を使わず「<blockquote cite="URL" title="引用元のタイトル">」のように書いている方限定です。引用記法については→引用ブロックを作る(引用記法) - はてなダイアリーのヘルプ

><blockquote cite="URL" title="引用元のタイトル"><
引用の内容
></blockquote><

はてなダイアリーで上のように書くと、下のように展開される。上の「cite="~"」や「title="~"」の内容が、「引用の内容」のあとに<cite>~</cite>タグに展開されているのが特徴である。

<blockquote title="引用元のタイトル" cite="URL">
	<p>引用の内容</p>
	<cite><a href="URL" target="_blank">引用元のタイトル</a></cite></blockquote>

表示結果は下の通り。(URLは一例)

引用の内容

引用元のタイトル

しかしはてなブログでは、<blockquote>タグの中にcite属性やtitle属性を書いておいても<cite<タグを生成してくれない。はてなブログでは引用文だけ読むことになり、引用元のURLやタイトルは表示されない。これはいかん。

引用記法ならそういうことはない。引用記法は下のようなもの。

>URL:title=引用元のタイトル>
引用の内容
<<

これははてなブログでもちゃんと<cite>タグを生成してくれる。表示結果は下の通り。(URLは一例)

引用の内容

引用元のタイトル

じゃあ「<blockquote cite="URL" title="~">」を「>URL:title=~>」に置換して、次に「</blockquote>」を「<<」に置換して…とやろうとして考え始めたら、ことはそう簡単ではないと気がついた。

blockquote要素の書き方はさまざまなパターンが考えられる。実際、自分の過去日記を検索してみると引用記法が実装される前に「<blockquote cite="URL" title="~">」を手書きしているところがたくさんあった。いくつかはcite属性とtitle属性の順序が逆で「<blockquote title="~"> cite="URL"」なんて書いていたりする。それぞれきちんと「>URL:title=~>」に置換しておかないと「<blockquote~>」タグと「</blockquote>」タグの対応が崩れてしまう。

以下は、blockquote要素の書き方をある程度自動的に「>~>」や「<<」に置換する検索パターンである。「</blockquote>」タグもなるべくうまく「<<」に置換するが、ひと通り置換したら「<blockquote」と「</blockquote」を検索して(正規表現で「</?blockquote」を検索)、対応する終了タグや開始タグが「<<」や「>>」になっていたらうまく書き換えてほしい。

  1. 「><blockquote cite="URL" title="引用元のタイトル"><」という行を「>URL:title=引用元のタイトル>」に置換
    • ①行頭が「>」(あれば)+②「<blockquote cite="」+③「http://」や「https://」で始まり「"」を含まない文字列(URL)+④「" title="」+⑤「"」を含まない文字列(引用元のタイトル)+⑥「">」+⑦「<」(あれば)で行末、という文字列を検索し、「①③:title=⑤>」に置換する
      • 検索:^>?<blockquote cite="([^"]+)" title="([^"]+)"><?$
      • 置換:>\1:title=\2>
  2. 上の「cite="~"」と「title="~"」を入れ替えて検索・置換
    • ①行頭が「>」(あれば)+②「<blockquote title="」+③「"」を含まない文字列(引用元のタイトル)+④「" cite="」+⑤「http://」や「https://」で始まり「"」を含まない文字列(URL)+⑥「">」+⑦「<」(あれば)で行末、という行を検索し、「①③:title=⑤>」に置換する
      • 検索:^>?<blockquote title="([^"]+)" cite="([^"]+)"><?$
      • 置換:>\2:title=\1>
  3. 上の「cite="~"」と「title="~"」がないパターン(「><blockquote><」という行)を「>>」に置換
    • ①行頭が「>」(あれば)+②「<blockquote">」+③「<」(あれば)で行末、という行を検索し、「>>」に置換する
      • 検索:^>?<blockquote><?$
      • 置換:>>
  4. 「><blockquote cite="URL"><」という行を「>URL:title>」に置換(※「URL」に「:title」をつけるとそのページのタイトルが表示される。これまで同様URLを表示したいときは「>URL>」に置換する)
    • ①行頭が「>」(あれば)+②「<blockquote cite="」+③「http://」や「https://」で始まり「"」を含まない文字列(URL)+④「">」+⑤「<」(あれば)で行末、という行を検索し、「①③:title>」に置換する
      • 検索:^>?<blockquote cite="([^"]+)"><?$
      • 置換:>\1:title>(※これまで同様URLを表示したいときは「>\1>」に置換)
  5. 「>」が行頭にあり、「<blockquote cite="URL" title="引用元のタイトル"><」と続く文字列(ここで行末にならない)を「>URL:title=引用元のタイトル>[改行]><」に置換(「><blockquote~><p>~」や「><blockquote~>[改行]<p>~」といった書き方を想定)
    • ①行頭が「>」+②「<blockquote cite="」+③「http://」や「https://」で始まり「"」を含まない文字列(URL)+④「" title="」+⑤「"」を含まない文字列(引用元のタイトル)+⑥「">」+⑦改行(あれば)+⑧「<」+⑨任意の文字、という文字列を検索し、「①③:title=⑤>[改行]>⑧⑨」に置換する
      • 検索:^><blockquote cite="([^"]+)" title="([^"]+)">\n?(<.)
      • 置換:>\1:title=\2>\n>\3
  6. 上の「cite="~"」と「title="~"」を入れ替えて検索・置換
    • ①行頭が「>」+②「<blockquote title="」+③「"」を含まない文字列(引用元のタイトル)+④「" cite="」+⑤「http://」や「https://」で始まり「"」を含まない文字列(URL)+⑥「">」+⑦改行(あれば)+⑧「<」+⑨任意の文字、という文字列を検索し、「①⑤:title=③>[改行]>⑧⑨」に置換する
      • 検索:^><blockquote title="([^"]+)" cite="([^"]+)">\n?(<.)
      • 置換:>\2:title=\1>\n>\3
  7. 上の「cite="~"」と「title="~"」がないパターンを検索・置換
    • ①行頭が「>」+②「<blockquote">」+③改行(あれば)+④「<」+⑤任意の文字、という文字列を検索し、「①>[改行]>④⑤」に置換する
      • 検索:^><blockquote>\n?(<.)
      • 置換:>>\n><\1
  8. 「>」が行頭にあり、「<blockquote cite="URL" title="引用元のタイトル">」と続き(ここで行末にならない)、さらに「<」でない文字が続く文字列を検索して「>URL:title=引用元のタイトル>[改行]任意の文字」に置換(「<blockquote~>」タグは続けて文字を書けるが、「>URL:title=引用元のタイトル>」は独立した行である必要があるため。また「任意の文字」はもともとは<p>~</p>タグでくるまれない書き方だが、引用記法の「>>」に続けて<p>タグの自動生成を抑止する書き方はないため置換後はp要素になる)
    • ①行頭が「>」+②「<blockquote cite="」+③「http://」や「https://」で始まり「"」を含まない文字列(URL)+④「" title="」+⑤「"」を含まない文字列(引用元のタイトル)+⑥「">」+⑦「<」以外の任意の文字、という文字列を検索し、「>③:title=⑤>[改行]⑦」に置換する
      • 検索:^><blockquote cite="([^"]+)" title="([^"]+)">([\^<])
      • 置換:>\1:title=\2>\n\3
  9. 上の「cite="~"」と「title="~"」を入れ替えて検索・置換
    • ①行頭が「>」+②「<blockquote title="」+③「"」を含まない文字列(引用元のタイトル)+④「" cite="」+⑤「http://」や「https://」で始まり「"」を含まない文字列(URL)+⑥「">」+⑦「<」以外の任意の文字、という文字列を検索し、「>⑤:title=③>[改行]⑦」に置換する
      • 検索:^><blockquote title="([^"]+)" cite="([^"]+)">([^<])
      • 置換:>\2:title=\1>\n\3
  10. 上の「cite="~"」と「title="~"」がないパターンを検索・置換(※任意の文字の冒頭には<p>が追加される。cite要素やtitle要素がないなら><blockquote>~のままでもいいかもしれないが、</blockquote><を置換する際、対応する開始タグにこれらの要素があるかどうかを判別できないためこれも「>>」に置換しておく)
    • ①行頭が「>」+②「<blockquote>」+③「<」以外の任意の文字、という文字列を検索し、「>>[改行]③」に置換する
      • 検索:^><blockquote>([\^<])
      • 置換:>>\n\3
  11. 任意の文字に続けて「>」があり、続けて「<blockquote cite="URL" title="引用元のタイトル"><」(ここで行末)という文字列を検索して「任意の文字><[改行]>URL:title=引用元のタイトル>」に置換(「~</p><blockquote~><」のような書き方を想定)
    • ①任意の文字+②「>」+③改行(あれば)+④「<blockquote cite="」+⑤「http://」や「https://」で始まり「"」を含まない文字列(URL)+⑥「" title="」+⑦「"」を含まない文字列(引用元のタイトル)+⑧「"><」(ここで行末)という文字列を検索し「①><[改行]>⑤:title=⑦>」に置換する
      • 検索:(.)>\n?<blockquote cite="([^"]+)" title="([^"]+)"><$
      • 置換:\1><\n>\2:title=\3>
  12. 上の「cite="~"」と「title="~"」を入れ替えて検索・置換
    • ①任意の文字+②「>」+③改行(あれば)+④「<blockquote title="」+⑤「"」を含まない文字列(引用元のタイトル)+⑥「" cite="」+⑦「http://」や「https://」で始まり「"」を含まない文字列(URL)+⑧「"><」(ここで行末)という文字列を検索し「①><[改行]>⑦:title=⑤>」に置換する
      • 検索:(.)>\n?<blockquote title="([^"]+)" cite="([^"]+)"><$
      • 置換:\1><\n>\3:title=\2>
  13. 上の「cite="~"」と「title="~"」がないパターンを検索・置換
    • ①任意の文字+②「>」+③改行(あれば)+④「<blockquote><」(ここで行末)という文字列を検索し「①><[改行]>>」に置換する
      • 検索:(.)>\n?<blockquote><$
      • 置換:\1><\n>>

上でcite属性やtitle属性は「"」~「"」で囲む前提で書いているが、ここは「'」~「'」で囲んだり、そもそもこのような引用符をつけずに書いたりもできる。わーもう大変。「"」のところを「["' ]」で書いてもだいたい大丈夫だと思うけれど、そもそも引用符に「'」を使うのは「'~'」の範囲に「"」を書きたいからだったりする。そうなると「'~"~'」という範囲の「'~"」までしか検索にかからないので気を抜けない。もし「["' ]」と書くなら一括置換は絶対にやめて、確認しながら置換していくのをおすすめしたい。

最後に「<blockquote 」(「<blockquote」に続けて半角スペース)を検索して、引用符に「'」を使っているところや引用符なしのところがたくさんあったら、「"」を「'」にするとか「"を含まない」を「半角スペースを含まない」にして、改めて検索・置換し直す。

</blockquote>の処理も一応考えてみた。でも上のように①②③…で説明していると長くなるし書くのも大変なので、検索・置換のセットだけ並べます。

  • 検索:^></blockquote><$
  • 置換:<<
  • 検索:^></blockquote>\n?<(.)
  • 置換:<<\n><\1
  • 検索:([^>])\n?</blockquote><?$
  • 置換:\1\n<<
  • 検索:([^>]>)\n?</blockquote><$
  • 置換:\1<\n<<

これで、検索にかかる範囲で<blockquote>タグ~</blockquote>タグは引用記法に置き換えられた。念のため「<blockquote~>」が残っていないか検索して、もしあったら必要に応じて手作業で「>>」~「<<」に書き換える。Twitterの「ツイートをサイトに埋め込む」のHTMLを書いてあると検索にかかってくるので、検索結果を一覧できるテキストエディタのほうが使い勝手がいいかも。

  1. ①「<」+②「/」(あれば)+③「blockquote」+④「 」(半角スペース・あれば)+⑤「>」(あれば)を検索
    • 検索:</?blockquote ?>?

フォトライフ記法の「:image」を「:plain」に置換(任意)

※ダイアリー内でフォトライフ記法を使っている方限定です。フォトライフ記法については→はてなフォトライフに登録した写真を表示する(fotolife記法) - はてなダイアリーのヘルプ

はてなブログでは、フォトライフ記法の「f:id:~:image」を「f:id:~:plain」にすると、画像をクリックしたとき拡大表示されるようになる。「f:id:~:image:h300」のような書き方をしていても、「f:id:~:plain:h300」のように書き直して大丈夫。「~:image」のままでフォトライフのページへのリンクにしておいてもよいが、「~:plain」に書き換えるなら以下のようにする。

(参考まで、はてなブログでは「f:id:~:image:plain」という書き方をしても「f:id:~:plain」と書いたのと同じ扱いになる。一方、はてなダイアリーでこの書き方をすると画像に続けて「:plain」という文字が出る)

「f:id:~:image」を「f:id:~:plain」にすると、はてなダイアリーでも画像は表示はされるもののはてなフォトライフへのリンクではなくなる。インポートの直前に置換するのがよいと思う。

  1. ①「f:id:」+②英数字、「_」、「-」を含む文字列+③「:」+④「yyyymmddhhmmss(数字14桁)」+⑤「b、g、j、pのいずれか」(この文字がない書き方もある)+⑥「:image」という文字列を検索して、「①②③④⑤:plain」に置換する
    • 検索:(f:id:[a-zA-Z0-9_\-\+]+:\d{14}[bgjp]?):image
    • 置換:\1:plain

ところで、はてなブログでコメントタグ(<!-- ~ -->)を含む行にフォトライフ記法があると、画像が表示されずフォトライフ記法がそのまま表示されるようだ。(フィードバック済み)

フォトライフ記法の「:movie」ははてなブログでは使えない

※ダイアリー内にフォトライフから動画を貼り付けている方限定です。フォトライフ記法については→はてなフォトライフに登録した写真を表示する(fotolife記法) - はてなダイアリーのヘルプ

はてなフォトライフに上げた動画を表示する記法として「f:id:Imamura:20151122125034f:movie」などがある(動画アップロード機能は現在終了済み)が、これをはてなブログに書いてもなにも表示されない。「f:id:Imamura:20151122125034f:movie」の文字列も表示されない。そこでフォトライフの当該ページ(上の場合http://f.hatena.ne.jp/Imamura/20151122125034)へのリンクに書き換える。

(「[http://jp.youtube.com/watch?v=sfW2rX8IrMI:movie]」など、YouTubeなどの動画を貼り付けるhttp記法はてなブログでもそのまま表示される。ただしプレーヤーが今となってはけっこう小さめに表示される)

  1. ①「f:id:」+②英数字、「_」、「-」、「+」を含む文字列+③「:」+④「yyyymmddhhmmss(数字14桁)」+⑤「f:movie」という文字列を検索して、「[http://f.hatena.ne.jp/②/④:title=f:id:②:④f:movie]」に置換する
    • 検索:f:id:([a-zA-Z0-9_\-\+]+):(\d{14})f:movie
    • 置換:[http://f.hatena.ne.jp/\1/\2:title=f:id:\1:\2f:movie]

この置換をすると、はてなダイアリーでは動画が表示されず単なるリンクになる。こちらもインポート直前に置換するのがよいだろう。

普通の段落の改行を2つにする

※ダイアリーの本文で、段落を改行1つのみで続けて書いている方限定です

はてなダイアリーにおける改行の扱いは「段落モード」と「改行モード」の2種類ある。もともとは「段落モード」のみで、のちに「改行モード」が追加された。今は「改行モード」が初期設定である。詳しくは以下を参照。

一方はてなブログでは、編集画面での改行が1つ(段落と段落の間に空行なし)だと<br>タグが挿入され、改行2つ(段落と段落の間に空行あり)だとそこまでが<p>~</p>になる。詳しくは以下を参照。

はてなダイアリーで「段落モード」にしている人が、はてなブログでも同じように段落を<p>タグで囲んでほしい場合、段落ごとに改行を2つ入れる必要がある。一方で、リスト記法は「-」などで始まる行を連続させて書く。

そこで、まずダイアリーのテキスト全体で改行を改行×2にしてから、不要な改行を削除する方向で修正したい。「-」と「+」と「:」で始まる行が連続していたら間の改行は詰める。また「>|」で始まる行(pre記法、「>||」や「>|css|」なども含む)から「|<」で始まる行までと、「<pre>」~「</pre>」の間の改行は詰めてもいいか個別に確認する。

よく考えるとpre記法の中では行開けが大事だったりするかもしれない。あらかじめ「>\|」を正規表現で検索して、「>|」~「|<」の範囲にある改行のみの行には自分のダイアリー内で使っていない文字、たとえば「㍊」とか「㈲」などを置いておく(念のため検索し、使っていないことを確認すること)。改行を2つに増やしたあと「>|」~「|<」の範囲の改行×2を改行1つに戻し、「㍊」を削除すればいい。

  1. すべての改行を改行2つにする
    • 検索:\n
    • 置換:\n\n
  2. 「-」で始まる行が連続する場所は改行を1つに戻す(ここ以下は、2回検索/置換する。これらの行が3行以上連続するとき、1回の検索/置換では偶数行の次の余分な改行を飛ばして検索していくことがあるため)
    • 検索:^(\-.*\n)\n\-
    • 置換:\1-
  3. 「+」で始まる行が連続する場所は改行を1つに戻す
    • 検索:^(\+.*\n)\n\+
    • 置換:\1+
  4. 「:」で始まる行が連続する場所は改行を1つに戻す
    • 検索:^(:.*\n)\n:
    • 置換:\1:

日付ごとのタイトルをはてなブログへ持っていく

※ダイアリーで「日付ごとのタイトル」を書いていて、「今日の一枚」を登録していない+日記の本文を見出しで始めている方限定です

はてなダイアリーでは1日に複数のエントリを書けるほかに、日付ごとのタイトルをつけることができる。

上の画像で日付の右に入力するのが、ここでいう「日付ごとのタイトル」である。

本文部分が見出し記法(行頭に「*」)から始まり、かつ「今日の一枚」がない場合、「日付ごとのタイトル」ははてなブログへインポートされない。(「今日の一枚」を登録してあれば、タイトルが「日付ごとのタイトル」、内容が「今日の一枚」の画像というエントリがインポート時に作られる。また本文の冒頭に見出し記法を使わない文章があれば、タイトルが「日付ごとのタイトル」、本文がその文章というエントリが作られる)※この仕様は今後修正されるとアナウンスが出ている(仕様変更は「年初の予定」とされている)

なので、日付ごとのタイトルを書きつつ本文を見出しから始めている場合、日付ごとのタイトルを持つ見出しを本文の冒頭に作ることで、日付ごとのタイトルの内容をはてなブログへ移せることになる。

はてダラ」では、日付ごとのタイトルは「2018-01-01:日付ごとのタイトル」という形式で書く。この日付の次の行に、「*日付ごとのタイトル」という見出しをつければ、はてなブログにインポートしたとき日付ごとのタイトルがつけられる。

  1. はてダラ」の日付部分に書いた「日付ごとのタイトル」を次の行へ見出しとしてコピーする
    • ①行頭に「yyyy-mm-dd(年-月-日):」+②任意の文字列(行末まで)、という行を検索し、「①②[改行]*②」に置換
      • 検索:(^\d{4}\-\d\d\-\d\d:)(.*)$
      • 置換:\1\2\n*\2

あきらめた変換:日ごとのエントリの順番

※ダイアリーで1日に複数のエントリを上げている方限定です

1日に複数のエントリがある場合(Twitterがない時代のWeb日記ではそれが普通だった)、エントリの順序が入れ替わる。

はてなダイアリーで、ある日のエントリとして下のように書いていたとする。

 *最初のエントリ
最初のエントリの内容

 *2つめのエントリ
2つめのエントリの内容

 *3つめのエントリ
3つめのエントリの内容

これをはてなブログへインポートすると、下のような表示順序になる。

 *3つめのエントリ
3つめのエントリの内容

 *2つめのエントリ
2つめのエントリの内容

 *最初のエントリ
最初のエントリの内容

これはたまに致命的になるが、全部ちゃんと入れ替えるのはテキストエディタの検索・置換では荷が重いので一括処理は諦めた。Perlなどでスクリプトを書けばできそう。

(方法をぼんやり考えると:ダイアリーの全テキストをおさめたテキストファイルではなく、はてダラスプリッタで日ごとに分割されたテキストファイルを使う。Perlなどで①テキストファイルの冒頭から②行頭が「*」+「*」以外の文字の行、から次の②までを配列に入れて、最初の①に続けて配列を逆順にして出力するとよさそう。処理が終わったら全テキストファイルを連結する)

以前更新していた「まんぷく::日記」(d:id:manpukuya)のトップのエントリは「この日記は来年からd:id:Imamuraに書きます」(d:id:manpukuya:20071231:newdiary)という内容で、これははてなブログでもトップに来てほしいのでここだけ手動で入れ替えた。手順は以下。

  1. 当該日のはてなダイアリーの最初にある「この日記は来年からd:id:Imamuraに書きます」をその日の最後に移動
  2. はてなブログへインポート
  3. はてなダイアリーの内容を元に戻す

これでよし

のはず。ふー、お疲れさまでした。はてなダイアリーを書き換えて、はてなブログにインポートしよう。

はてなダイアリーはてなブログの仕様は実にいろいろ異なっていて、単なるインポートではあちこち問題が出てしまう。ここまでの検索・置換でけっこういい感じに修正できたと思うけれどこれでも見落としがあるかもしれない。「この書き方がはてなブログでは再現されない」というのがほかにあったらご指摘ください。

テストのため、以前書いていた「まんぷく::日記」をはてなブログへインポートしてみた。リダイレクトはまだ設定していないので、はてなダイアリーの側も今のところ見ることができる。両者で見た目がどう変わるかの確認にどうぞご利用ください。

もとのはてなダイアリー
d:id:manpukuya
上をインポートしたはてなブログ
https://manpukuya.hatenablog.jp/

このはてなブログのデザインは「Palette」にしてみた。

あとはトラックバックを移籍したい。はてなダイアリーの全部の月のHTMLを取得して、そこから抽出するしかないかな。

自作キーボードほどわかりやすい沼はない

年末に書いた記事が公開された。

自作キーボードの世界をひと通り理解できる記事にしたくて、調べてはちょっと書き、調べてはちょっと書きのくり返しで時間がかかってしまった。苦労したのでホットエントリになってうれしい。

記事では採り上げられなかったけれど、紹介したかったキーボードがいくつかある。

まず、押下圧280グラム(通常は50グラム前後)というとても重いキースイッチを使ったキーボード。よいしょっと押さないと入力できない。(写真を撮り忘れた)

立体キーボードは記事ではDactyl-ManuFormを紹介したけれど、日本でもColosseum60があるのでこれも紹介したかった(写真を撮り忘れた)。

イベント当日の様子はTogetterにもまとめられている。

去年は自作キーボードのムーブメントが一気に広がった。自分の観測範囲に入ってきたからそう見えるわけではなく、イベントで登壇したアーリーアダプターの人が何人もTwitterに「2018年はフォロワー数がすごく増えた」と書いていた。

キーボードの自作はパラメータが多すぎて、「自作できるんだな」からすぐ「ちょっと待って、それはものすごい沼なのでは」と思い至る。キーの配置、キースイッチ、キーキャップ、キーマップ(どのキーを押したらどんな文字が入力されるか)と、キーボードを作るにあたって自由になる項目はたくさんある。それぞれをどうするかの選択肢もまた無数にある。

自作キーボードの界隈では「エンドゲーム」というフレーズが頻出する。究極の、理想の、迷いがなくなる、そういった意味である。「このキーボードが自分にとってのエンドゲームになるはずだ」のように使う。裏を返せば、そこにたどり着くのがとても大変であることも想像させる。

キーボード沼がどんな沼かを概説した記事が、「沼 Advent Calendar 2018」(すごい名前だね)にあった。キーボード沼が扱う分野として、「既製品沼」「キーマップ沼」「キースイッチ沼」「キーキャップ沼」「電飾沼」「音響沼」「ケース沼」「電子沼」「ケーブル沼」が紹介されている。

沼はいろいろあるけれど、キーボード沼はカメラ沼や自転車沼より実用度が高いのが面白いと思う。なにしろキーボードはパソコンを使うなら絶対必要だ。自分に合うキーボードを使えば肩こりが楽になるといった効能も期待できる。

冒頭の記事を書くために、自作キーボードを販売している人、作ってみた人、いじっている人のブログやTwitterをたくさん読んだ。そうするうちに、自分だったらこういうキーボードがほしいなーというアイデアが出てきた。

現状と不満点

今使っているキーボードはエレコムの「TK-FBP044」である。買ったのは2014年の末。

f:id:Imamura:20141224163304j:plain

写真の上側はそれまで使っていた「TK-FBP014」。新モデルのTK-FBP044はいくつかの不満点が解消されていたので乗り換えた。

TK-FBP044のいいところ

  • フルキーボードとしては左右の幅がややコンパクト。マウスが比較的近いのがよい
  • PCとMacの両方に接続でき、Mac向けのモードも搭載している。Bluetoothで9つまでマルチペアリングできるのに加えて、TK-FTP044はUSB接続も可能

TK-FBP044から改善できるならしたいところ

このキーボードに特有の不満点ではないが、こんなふうになったらいいなというポイントは以下。

  • カーソルキーやテンキー、マウスがホームポジションからもっと近くなったらよい。右手をよっこらしょと移動させずにすむならそうしたい
  • 「=」をワンキーで入力できたら表計算ソフトで便利そう

キーボードを作るならこうする

  • 左右分割型のキーボードを使い、中央にテンキーを置く。ポインティングデバイスも中央に置ければなおよいが、それが無理でもホームポジションからみたマウスの位置は普通のキーボードでいうとテンキーの場所になるので近くなる
  • BLE Micro Pro」を使えばTK-FBP044と同じように自作キーボードを複数マシンで切り替えながら使うことができる。自作キーボードのファームウェアQMK)はMacモードもちゃんとあるようだ
  • 通常のキーボードはファンクションキーも含めて6列あるのが基本だが、キー列はファンクションキーの列や数字キー列を省略して4列あればよさそう。自作キーボードの記事でとてもよく見るのは、「数字キーがない自作キーボードが多いが自分には必要だろうと思って数字列があるキーボードを作った、でも使っているうち数字キー列は不要だとわかった」という感想。中には「数字の列がないキーボードを使い始めてこれは無理と思い数字列つきの自作キーボードを発注、しかし部品が揃って作るころには数字列がないキーボードに慣れていた」という記事もあった

おっと危ない、自作キーボードについて調べているうちに沼に入りかけてしまったようだ。

でももう買ってしまった。

f:id:Imamura:20181229121948j:plain

f:id:Imamura:20190105113316j:plain

いきなりちゃんとしたキーボードを作るのはさすがにハードルが高いと考え、まずはテンキーから作ることにした。感触がわかってフルの分割キーボードを作ったあとも使い道はあるから無駄にはならない。

作例を見るとテンションが上がる。

Attack25はテンキーとしてはキー数が多いので、独立した「=」キーを作れる。紫軸のキースイッチは、「天キー」で触らせてもらったキーボードの中で感触が好みだったものを選んだ。念のためキースイッチを交換できるようにしたいのでベリリウムを買おう。

以下はキースイッチを取り外し可能(ホットスワップ)にする作例。

それからこれも買った。

f:id:Imamura:20190109220316j:plain

ジャンクのMajestouch Linear(黒軸)。十数個のキーが入力できないため安かった。キースイッチとキーキャップを自作キーボードに流用するつもり。キーキャップを取り外す工具(キープラー)はついていなかったので、久しぶりに3Dプリンタを使って出力しよう。3DデータはThingiverseで見つけてある。

左右分割型のキーボードをどういうものにするかは今後考えることにする。たぶん今年中にModulo対応の自作キーボードキットがいくつか出てくると思うので、上の条件でいい感じのを探そう。キースイッチを交換できるようにすれば、しっくり来るものを見つけるまで試行錯誤もできるだろう。

「天キー」を取材した段階では、実はまだ自分でキーボードを作ろうという気分にはならなかった。楽しそうにやっている人たちの様子を知りたいというスタンスである。しかし記事を書くために調べていたらどういうものかだんだんわかってきて、これなら自分でもできそうだしやってみたいという気持ちになってきた。

自作キーボードが盛んになったら、こういうことが起きそうな気がする。

そのほか、「キーボードが別売りのノートパソコンが発売される」…と書いてから「それはタブレットPCだ」と気がついた。ははは。

キーボードの自作で恐ろしいのは、どういうキーボードが一番いいかは使う本人にもわかっていないということだ。作って使ってみると不満が出てきたり、ほかのもっとよさそうなアイデアが出てきてしまったりする。そういうところが沼の沼たるゆえんではないだろうか。

こうしていつの間にか、自分なりのエンドゲームを目指す沼に入りかけている。沼にはまりすぎないよう、ほどほどに楽しみたい。

追記

とか書いていたら「天キー」こと天下一キーボードわいわい会の次回開催が告知された。10連休の真ん中の5月4日とのこと。これは楽しみ。

小惑星探査機「はやぶさ2」の記者説明会(合運用の結果、着陸地点候補、リュウグウの地名)

(編集中)

小惑星探査機「はやぶさ2」は、現在、合運用のため小惑星Ryugu(リュウグウ)から約40kmほど離れた軌道を航行しており、年末にリュウグウから約20kmの位置に戻る予定です。

今回の説明会では、「はやぶさ2」の現在の状況、合運用、リュウグウ地形名称の国際天文学連合への申請状況について説明を行う予定です。

小惑星探査機「はやぶさ2」の記者説明会(19/1/8) | ファン!ファン!JAXA!

日時

  • 2019年1月8日(火)16:30~17:30

登壇者

JAXA宇宙科学研究所はやぶさ2」プロジェクトチーム

中継録画

リンク

配付資料

f:id:Imamura:20190108220437p:plain

本日の内容

f:id:Imamura:20190108220438p:plain

目次

f:id:Imamura:20190108220439p:plain

はやぶさ2」概要

f:id:Imamura:20190108220440p:plain

ミッションの流れ概要

f:id:Imamura:20190108220441p:plain

1.プロジェクトの現状と全体スケジュール

f:id:Imamura:20190108220442p:plain

2.合運用の結果

f:id:Imamura:20190108220443p:plain

f:id:Imamura:20190108220444p:plain

f:id:Imamura:20190108220445p:plain

3.タッチダウンに向けた検討状況

f:id:Imamura:20190108220446p:plain

f:id:Imamura:20190108220447p:plain

4.リュウグウ表面の地名

f:id:Imamura:20190108220448p:plain

f:id:Imamura:20190108220449p:plain

f:id:Imamura:20190108220450p:plain

f:id:Imamura:20190108220451p:plain

f:id:Imamura:20190108220452p:plain

f:id:Imamura:20190108220453p:plain

f:id:Imamura:20190108220454p:plain

5.その他

f:id:Imamura:20190108220455p:plain

6.今後の予定

f:id:Imamura:20190108220456p:plain

今までにはてなブログライター向けに作成したテキストファイルを1つにまとめる方法

以下の記事の続きです。

新しく書く記事を1つのテキストファイル(ここではdiary.txt)から切り出せるようになったので、今度は今までにはてなブログライターで登録したエントリのテキストファイルをdiary.txtにマージしようと思う。

  1. はてなブログライターのあるディレクトリに「add_blog_header.pl」を置く(内容はこの記事の末尾に)
  2. コマンドプロンプトを開き、はてなブログライターのあるディレクトリで「dir /b ????-??-??_??.txt > dir.bat」を実行
  3. テキストエディタで「dir.bat」を開き、行頭に「perl add_blog_date_header.pl 」を追加(正規表現置換が使えるテキストエディタならば、「^(.)」を「perl add_blog_date_header.pl $1」に置換)。その結果、たとえば「2019-01-01_01.txt」が「perl add_blog_date_header.pl 2019-01-01_01.txt」になればよい
  4. 「dir.bat」を実行。その結果、たとえば「2019-01-01_01.txt」から「a2019-01-01_01.txt」が作られればよい
  5. 「copy /b a*.txt diary_old.txt」を実行。手順4で作られたテキストファイルが連結される
  6. 「diary.txt」の冒頭に「diary_old.txt」の内容をコピー

これでOKです。手順の途中で作られた「a」で始まるテキストファイル群は削除してしまってかまいません。

あとは、はてなブログライターを使わずに直接投稿したエントリをはてなブログライターの管理下に入れることができれば最高なんですが、それはちょっと難しいみたい→http://ima.hatenablog.jp/entry/2018/09/07/120000 の末尾

add_blog_header.plの内容

#! /usr/local/bin/perl

# 引数に書かれたファイル名のファイルを読み込んで処理し出力する(改行をまたぐ置換をするためにすべての行を読み込んで一括処理)
foreach $infilename ( @ARGV ){ #コマンドラインで指定された複数の引数をすべて処理する(引数は@ARGVを通して$infilenameに入る)
	$day = $infilename;
	$outfilename="a" . $infilename; #「a元ファイル名」というファイルに出力

	open(IN,"< $infilename");
	open(OUT,"> $outfilename");
		while (<IN>) { #<IN>に入力されたファイルを処理する
			$out = $out . $_; #いったん全部の行をまとめて入れる(改行を含む置換をしたいから)
		}
		$out = $day . $out;
		$out =~ s|^(\d\d\d\d\-\d\d\-\d\d_\d\d)\.txttitle: ([^\n]+)|$1:$2|;
		$out =~ s|(.+)\n*$|$1\n\n|; #各テキストファイルの末尾に改行を2つ入れて統一
		print OUT $out;
	close IN;
	close OUT;
}

このスクリプトGitHubに公開した。

「はてなブログライタースプリッタ」をGitHubに登録

はてなブログライター」は便利に使わせてもらっている。元となった「はてなダイアリーライターはてダラ)」には「はてダラスプリッタ」という補助スクリプトがあって、1つのテキストファイルから各エントリのテキストファイルを分割出力してくれる。これを「はてなブログライター」でもできないかなーと思っていた。

エントリごとにテキストファイルを作っていると、ブログ全体の表記を統一したいときなどにgrepなどのツールが必要になる。ブログ全体の文章が1つのテキストファイルにまとまっていれば、単純な検索や置換ですませられて助かる。

はてダラスプリッタ」(hws.pl)は100行もない短いスクリプトである。これをじろじろ見ていたらあれ? ここをこうするだけで「はてなブログライター」向けにできそう? と気がつき、書き換えてみたらひとまず使えるようになった。

Windowsの「コマンドプロンプト」では、エラーメッセージに日本語が含まれるとき必ず文字化けする。原因が文字コードであることもわかっていて、修正できないかちょっとがんばってみたがうまくいかない。それでも基本的な機能は満たしている。「完璧を目指すよりまず終わらせろ」(マーク・ザッカーバーグ)に従ってGitHubに公開してみた。

GitHubに公開すれば、「こう修正しては」という提案(プルリクエスト)を受け付けることができるようになる。GitやGitHubはテキストの編集にも役立ちそうと考えてから数年、仕事でGitの本を作って理解したことがこうして役に立った。

サルでもわかるGit入門

サルでもわかるGit入門

コマンドラインを使わずGUIのGitクライアントソフトでGitをわかりやすく解説する『サルでもわかるGit入門』は、インプレスから好評発売中です。

関連記事

追記

続きとして以下の記事を書きました。

今年のおみくじは中吉

初詣でのおみくじ、今年は中吉だった。

第四十六番

人生を紡ぐのは まり続けるも縁 離れるもまた縁である ただの一度話した縁にも誠を尽くしてみよ 運とは一瞬の夢のようなもの 縁とは未来に繋いでいくもの
  • 願望:望み事容易には叶い難し 努力が必要
  • 仕事:安定した仕事ぶりが高評価 昇格もある
  • 恋愛:邪魔が入り関係が進まない 今は待て
  • 健康:好調です 運動を続けると尚良い
  • 学業:油断せず励むこと 相談できる相手を作ると吉
  • 金運:投資や新規事業の話は慎重に進めよ
  • 旅行:眺めの良い場所で感性が磨かれる 事故に注意
  • 出産おさん:とても楽な出産です 落ち着いて

縁起物は大黒天だった。

七福神の一神として恵比寿神と共に授福神の代表として知られています。「生産と販売」の御神徳で営業繁栄、商売繁盛、五穀豊穣として古くから信仰を集めています。財布等の中に入れて開運招福のお守として大切にお持ち下さい。

これは仕事柄いい感じな気がする。今年もがんばろう。

スマートリモコンでリモコンいらずを目指す

スマートリモコンという商品ジャンルがあって、家電をスマートフォンなどから操作できるようになる。Google Homeなどのスマートスピーカーからも家電を操作できるようになるそうだ。

我が家にはGoogle Home miniがあって、声でいろいろできるのは便利だという認識がある。本当にちょっとしたこと、たとえばタイマーをセットしたいとか天気予報を知りたいといった程度のことでも、手を使わずにできるのはすごくよい。「声で操作するなんて恥ずかしい」という意見もあるそうだが、使ってみると便利なのですぐ慣れた。スマートスピーカーはHDDレコーダーやルンバのように、使ってみるまで便利さを理解できない種類の家電なのだと思う。

さて、スマートリモコンがあれば声でテレビやエアコンをつけたりできることになる。これはよさそうだ。いろいろ調べて、LiveSmartのLS Miniを買った。

LS Mini【Amazon Echo/Google Home対応製品】

LS Mini【Amazon Echo/Google Home対応製品】

付属の電源用USBケーブルは1.8メートルくらいあって、コンセントから離れたところでも設置しやすい。USB ACアダプタが入っているのもほかのスマートリモコンと違うところだそうだ。セットアップはLS Miniのスマートフォン用アプリで行う。テレビとエアコンは各メーカーのプリセットが入っている。メーカーや機種を選んで「これで電源が入りましたか」のような質問に答えていくだけでよい。スマートフォンからテレビとエアコンを操作できるようになった。

Google HomeとはGoogleアシスタントのアプリで連携する。「ねえグーグル、リブスマートを使ってテレビをつけて」などと声をかけるのがデフォルトだが、設定で短くできる。「ねえグーグル、テレビをつけて」と声をかけると「(♪ホワン)はい、テレビをオンにします」などと言ってテレビをつけてくれるようにできた。テレビのリモコンを手に取る必要はない。これは便利だ。Amazonのレビューにあるような、数日おきにオフラインになってしまうといった問題もない。

さらにサーキュレーターなどのリモコンも登録してみた。プリセットが入っていないリモコンはLS Miniに向かってリモコンのボタンを押して記憶させ、それを呼び出すことになる。しかしこちらはうまくいかず、今のところLS Miniから操作できていない。リモコンの信号の登録はできているようだけれど、LS Miniからその信号を出すのができていないようだ。どうしてだろう?

ともかくスマートリモコンでテレビやエアコンの操作はできるようになった。LS Miniには明るさや温度のセンサーが入っていて、平日暗くなったら電気をつけるとか、気温がこのくらいになったらエアコンが入るといったルールも作れるそうだ。そういう設定もそのうち試してみるつもり。