昨日の(ひとつめの)エントリを書くにあたって,見出しの中に「質問」を含むエントリをチェックしておきたいなと思いました.
しかし,日記上部の検索フォームを使うのでは,見出し以外に「質問」を含むものが多数,ヒットしてしまいます.日記のテキストファイルは月1回の頻度でダウンロードして保存していますが,XMLファイルなもんで,そのままでは見やすいとは言えません.それでも見てみると,最初に「質問」を含む見出しを書いたのが
*1196802262*[教育] いい質問を作り出す5つ+4つのアイデア
で,この情報だけからでは,該当するページをブラウザで開けません.…いや,1196802262はいわゆるUnix timeのことなんだから,一手間加えればURLが出てくるじゃないか,と気づいて,手を動かしました.
まずはXMLファイルのダウンロード方法です.
- 自分のブログを開きます.自分のidでログインしておきます.
- 「管理」をクリックします.当雑記のデザインであれば,ログインしているとページ上部にあります.
- 左のカラムの中で「データ管理」を見つけ,クリックします.
- 「はてなの日記データ形式」の「ダウンロード」をクリックします.これでファイルを取得できます.自分の場合はtakehikom.xmlで保存されます.
…というのは,漢字とカタカナの使用回数でも書いていました.2011年2月17日の時点で,takehikom.xmlは7172506バイト,gzip圧縮して2454697バイト.いずれも1年8か月前と比べておよそ倍ですか.
さて,この非圧縮XMLファイルから,エントリの見出しになっている行だけを取り出し,かつそれぞれに対してURLを求めるのは,スクリプトファイルでなくてもワンライナーでいいでしょう.こうなりました*1.
$ grep "^\*[0-9]\+\*" takehikom.xml | ruby -pe '$_.sub!(/.(\d+)/){Time.at($1.to_i).strftime("http://d.hatena.ne.jp/takehikom/%Y%m%d/")+$1+" "}' > takehikom_title.txt
いくつか注意点があります.
- grepの正規表現が,Rubyのそれと似ているようで違います.【 どのような正規表現があるのか 】 | 日経 xTECH(クロステック)で学び直しましたが,grepでは,数字を表す\dが使えないほか,1回以上の繰り返しは「正規表現+」ではなく「正規表現\+」と書かないといけません.
- Rubyのワンライナーの中に「+$1+」というのがありますが,これはRuby 1.8,1.9両対応のためです.Ruby 1.9では「(略).strftime("http://d.hatena.ne.jp/takehikom/%Y%m%d/%s ")」で済みます.1.9のTime#strftimeでは,%sでUnix時間が得られるのですが,1.8では使えないようです.
- はてなの日記のモードは,「ブログモード(初期設定)」「日記モード」「日記モード・見出し別ページ」の3種類があり,「管理」をクリックしたあとの「設定>記事の設定」で参照・変更ができます.今回の実行コマンドは,ブログモード(初期設定)を前提としています.そうでなければ,自分の日記に合わせたURLにしてください.
- CygwinとUbuntu,zshとbash,Rubyは実行環境付属のものとビルドした1.8と1.9,合計12通りで動作確認していますが,環境によってはクォーテーションマークの変更や,「\」のエスケープが必要かもしれません.
自分の雑記に対しては,出力が1972行となります*2.もともと知りたかった,「質問」で,絞り込みますか.
$ grep '質問' takehikom_title.txt http://d.hatena.ne.jp/takehikom/20071205/1196802262 *[教育] いい質問を作り出す5 つ+4つのアイデア http://d.hatena.ne.jp/takehikom/20071215/1197669561 *[学会] じんもんこん2007 発表と質問 http://d.hatena.ne.jp/takehikom/20090730/1248904304 *[研究室][大学教育] ゼミで学生からの質問を奨励する理由 http://d.hatena.ne.jp/takehikom/20091020/1255967938 *[研究室] 小ゼミ質問案 http://d.hatena.ne.jp/takehikom/20091203/1259787862 *[研究室] ゼミ発表での質問の仕方 http://d.hatena.ne.jp/takehikom/20100215/1266186089 *[大学教育] 質問対策 http://d.hatena.ne.jp/takehikom/20100217/1266353990 *[大学教育] 質問対策2 http://d.hatena.ne.jp/takehikom/20100518/1274132755 *[教育] 全国学力・学習状況調査に関する質問主意書 http://d.hatena.ne.jp/takehikom/20100611/1276203311 *[研究室] 後輩から先輩への,ゼミの質問文例 http://d.hatena.ne.jp/takehikom/20100612/1276289569 *[研究室] 質問対策3 http://d.hatena.ne.jp/takehikom/20100628/1277664461 *[研究室] 質問型ブレインストーミング
コマンドに,もうひと手間かけましょう.
$ gzip takehikom.xml $ export HATENA_ID=takehikom
とした上で,
$ zcat $HATENA_ID.xml.gz | grep "^\*[0-9]\+\*" | ruby -pe '$_.sub!(/.(\d+)/){Time.at($1.to_i).strftime("http://d.hatena.ne.jp/HATENA_ID/%Y%m%d/")+$1+" "};$_.sub!(/HATENA_ID/,ENV["HATENA_ID"])' > ${HATENA_ID}_title.txt
とすれば,コマンドからtakehikomを消すことができました.
*1:公開直後に,コマンドを,スーパーpre記法から引用記法に変更してみました.長い1行は,引用記法のほうが見やすそうです.しかし表示にあたって,情報落ちないかな….
*2:せっかくなので,http://d.hatena.ne.jp/takehikom/files/takehikom_title.txtから取得できるようにしました.今後も,忘れていなければ,XMLファイルのダウンロードに合わせて更新するようにします.