mkdiary.rb の使い方 - 詳しいバージョン

手っ取り早く試したい場合は簡単版を 見るべし。

【比較的新しいこと】
カテゴリインデックス作成機能
autoimgでサムネイル生成も可能に

何するものぞ

mkdiry.rbは以下の機能を持つ日記ページ作成支援プログラムである。

(以下はUNIX向け)

かいつまんでいうと、日記の本文となる部分の文章だけ mkdiary にくべてや れば見出し一覧のついた日記ディレクトリが出来上がるという、そんなプログラ ム。

インストール

まず、mkdiary.rb本体のインストールを行なう。

  1. 日記用ディレクトリを掘る。例:
     % mkdir ~/public_html/diary		# ディレクトリ作成
     % cd  ~/public_html/diary		# そこに移動
    
  2. mkdiary.tar.gzをそこに展開する。
     % gzip -dc mkdiary.tar.gz | tar xvpf -
    
  3. 必要ならheader、footerファイルをいじる。それぞれHTMLの先頭、末尾に 挿入されるテンプレートファイル。まあそのままで大抵おっけー。
  4. mkdiary.rb の先頭の
      #!/usr/bin/env ruby
    
    をシステムのenvに合わせて書き換える。そのままでいいかも。
     % chmod +w mkdiary.rb
     % emacs -nw mkdiary.rb
          (書き換えてセーブ)
    
  5. ./mkdiary.rb -date 1999/10/10 と起動してみる。 1999/10/10というディレクトリができて、日記テンプレートができていれ ばOK。
  6. ./mkdiary.rb ./1999 と起動してみる。1999/index.html とい うファイルができていれば完了。

次にこの日記をどうやってつけるかの方法によって道は分かれる。

  1. メイルで更新
  2. サーバにログインしてEmacsで書き書き
  3. サーバにログインして地味に作業

インストール第二段階 - 運用準備

以下の説明では mkdiary.rb~/public_html/diary に インストールされていると仮定。

メイルで更新

サーバのメイルシステムがqmailの場合は簡単。

  1. 日記更新用アドレスを考える。たとえば yourname-diary@gentei.org とする。実際は いたずらされないよう、-diaryじゃなくて推測されにくい 拡張アドレスにした方がよい。

  2. ~/.mkdiaryrcというファイルを作って個人情報を書き込 む。必須なのは連絡用アドレス(自分のメイルアドレス)と日記更新 を許可するアドレス。

        owner=yourname@gentei.org
        allow=yourname@gentei.org|yourname@provider.ne.jp
    

    許可したいアドレスが複数ある場合は |(縦棒)で区切っ てスペースを空けずに列挙する。メイル更新をする場合 エラー報告が owner に送られるので、主に携帯電話から 更新するなら .qmail-keitai とか携帯電話にもフォワードされる アドレスを作って owner には、それを書いておくとよい。

  3. 1で考えたアドレスで、mkdiary.rb -s が走るような dot-qmail ファイルを作る。1の例の場合は、~/.qmail-diary というファイルを作って、

        |./public_html/diary/mkdiary.rb -s
    

    のように書き込む。

サーバがsendmailとかの場合は面倒。procmailを使えば 特定のサブジェクトのものを特定のコマンドに投げるなんてことが できるようになるので はらのの説明とか見て適当に設定しちくり。


さて実際にメイルを出してみよう。こんな感じで書く。

To:yourname-diary@gentei.org
Cc: 
Subject:1999/10/10
m=見出し
今日は富士山に行った。いえー。ちかれた………

Subjectには半角でその日の日付。年月日は左から順に省略可能で、全 て省略するとその日の日付になる(朝9時までは前日の日付)に自動設定さ れる。Subjectに "yesterday" と書くと、日本時間の昨日の日付に設定さ れる。"3 days ago" のように "数字 days ago" と書くと、その日数だけ 遡った日付が設定される。もし今日の日記を書くんだったらサブジェクト は何でもええ。today とかにしとくのが無難じゃな。また、本文先頭の m= の直後は日記インデックスの見出しとして使われる。

二行目以降に日記本文を書いて行く。HTML直打ちでもいいし、 HTML自動変換フィルタ(後述)を使ってもいい。 ~/.mkdiaryrcファイルにフィルタを使う設定を書いてない 場合はHTML直打ちモードなのでまずその説明から。

直打ちモードの場合、二行目以降そのままが日記の本文 HTMLとして使われる。なので、 メイル中にHTMLをがしがし書くべし。段落が一つだけならまあそのまま書 いて桶。もし複数の段落を作りたいときは一つ一つの段落を<p>と </p>でくくってやればよろし。こんな感じ。

m=いい天気
<p>きょうは朝からいい天気だった。</p>
<p>てなことで行って来たじょ、北海道。ほにゃらら〜かにゃらら〜 うんじゃら〜、かんじゃら…………</p>

本文中に画像ファイルなどの埋め込みが必要なときは本文中に直接 <img src="hoge.jpg"> なんてのを書いた上で、 添付画像ファイルとして hoge.jpg も一緒にマルチパート形式 で送信する。base64 でエンコードした添付ファイルのみ処理できる。お そらく普通のメイルリーダは画像ファイルとかはbase64エンコードして送 るんじゃないかと思う。なのであまりきにせんでよい。

画像ファイルが複数あるときは lha, zip, tar+gzip で固めて一個の アーカイブファイルにしたのを添付すれば、mkdiary.rbはそれをほぐして 複数のファイルにしてくれる。ただしこの展開は一回だけしかやらないの で、もし *.lzh, *.zip, *.tar.gz, *.tar ファイルそのものを日記ディ レクトリに置きたいときはそれをもういっぺんアーカイバで固めたものを 添付すると良い。

ちなみに、他の日記支援システムではHTML知らなくても書けるように との配慮でHTMLじゃない簡易記法とか導入しているのもあってそれはそれ で楽になることもあるが、結局あれやこれや覚えることが増えて「だった らHTML覚えたほうが早いんちゃう?」という「元の木阿弥」状況を招くこ とが必至なので、mkdiaryでは一切簡易記法を導入する予定はない……。

でもやっぱ、「どーしても、<p>…</p>とかいちいち書く の面倒や〜」とな? ふむ、ではメイルで普通に書いたプレインテキストの 本文を、段落ごとに<p>…</p>でくくったり、行頭TABと*で 箇条書きにするようなフィルタを用意したのでつこてみてくれ。 とりあえず ~/.mkdiaryrc に

bodyfilter=body2html|autoimg

と追加してみるべし(※))。この例は、 自動変換フィルタとして、body2htmlとautoimgの2つを使うという意味で、 その他のフィルタを使いたかったら縦棒(パイプ; |)で 区切って繋いでいく。フィルタの最初に書いた body2html が一番便利。 どう使うかは body2html というへぼい スクリプトに書いたコメントを見てもらうとして、かいつまんでいうと メイル本文で適当にプレインテキストでTABやら 使ってインデントして書いて行くと勝手にULとかになるのだ。

以前のバージョンではフィルタの直前に ./ が必要だったが現在では不要(付けてはいけない)。その日の日記のディレクト リに移動してからフィルタスクリプトを実行する。

body2html 以外、現在使えるフィルタは以下の通り

この「本文→HTMLフィルタ」のもっと すごいのを募集するで!

ほい、メイルで日記を付けたいという良い子はこの方法だけおぼえれ ばええぞよ。以下のサーバログイン更新はすっ飛ばしてカスタマイズに進んで良いじょ。

サーバにログインしてEmacsで書き書き

Emacsの中から一撃で当日用のディレクトリを作るのが webdiary.elである。まずこれのインストー ルから。

  1. webdiary.el をEmacsの load-path の通ったディレクトリに置く。
  2. ~/.emacs
    (autoload 'webdiary "webdiary" "Keep diary!" t)
    (setq webdiary:dir "~/public_html/diary/")
    
    を追加する。

これでOK。サーバにログイン後、Emacsを起動したら

M-x webdiary

とすると日付を聞いて来るのでリターンを押せばその日の日記用の HTMLソースが現れるので適当に文章を書いたらセーブ。セーブと同時に日 記一覧インデックスページが自動更新される。

サーバにログインして地味に作業

今となってはそんなことするひたおらんのう。

  % cd ~/public_html/diary
  % ./mkdiary.rb -today  (または ./mkdiary.rb -date 1999/10/10 とか)
  % emacs -nw その日の日付ディレクトリ/index.html

カスタマイズ

カスタマイズファイル

mkdiary.rbの動作定義は ~/.mkdiaryrc ファイルに

オプション=値

という型式の行を列挙することで可能である。また、.mkdiaryrc ファイルは動作する mkdiary.rb と同じディレクトリに置くこともできる。複数 の mkdiary.rb を違う目的で使いたいときにはスクリプトと同じディレクトリに 置くと良い。

変数

~/.mkdiaryrc(または ./.mkdiaryrc) で定義できる変数一覧は mkdiary.rb$opt = で始まるブロックを見てもらうのが一 番正確。が、一応良く使うオプションを以下に。

オプション意味デフォルト値
titleleft表題のprefix
titleright表題のsuffix
yearformat年INDEXのタイトル書式%d年の日記
yearleading年INDEXのタイトル直後の文句(なし)
day_ascend日付を昇順で表示1(yes)
outcode出力ファイル漢字コード jis (またはeuc)
need_wday日付に曜日を付けるか1(yes)
monthheading「X月」表示をするか1(yes)
mailmailコマンドのパス/usr/bin/mail
ownermail更新時のエラー連絡先 なし
allowmail更新を許可するアドレスの正規表現 なし
bodyfilter本文変換フィルタなし
decode64base64デコードプログラム mewdecode
addpath実行時にPATHに追加する値
gnutarGNU tarコマンド名 gtar
unzipunzipコマンド unzip
lhalhaコマンド lha
notifymail更新結果を知らせるかどうか 0 (しない)
ownotifymailで上書きとなるときにバックアップを送るか 1 (送る)
bmp2jpgBMP形式の添付画像をJPEGに自動変換するか 0 (しない)
bmp2pngBMP形式の添付画像をPNGに自動変換するか 0 (しない)
convertImageMagickのconvertコマンドの起動名 convert

~/.mkdiaryrcには

yearformat=%d年の食い倒れ日記

のように記述する。メイル更新モードのときの本文の最初に 書くのもこの書式に従う。

なお、メイル更新のときだけ有効なオプションとして append、 repl、merge がある。例えばメイルの本文先頭に

append=1

と書いておくと、現在のその日の日記の本文の末尾に、以降のメイル本文を 追加する。ただし、これは追加前の文章もメイル更新で書いておかないとへんて こりんになる可能性が大きいのでちうい。また、実はその日2回目の日記メイルなの に1回目だと思って送ってしまったときには、1回目で作られた日記ファイルが バックアップとして送られる(owner宛に)。そんなとき、送られたバックアップ メイルを全部引用して、本文先頭に

merge=1

と書いて送ると、1回目で作った日記と2回目に送ったメイルを appendしたものを勝手に作っておいてくれる。逆に2回目に送ったのは なしにしたいときは、メイル本文先頭に

repl=1

と書き、送られたバックアップメイルの全文を引用して送り返す。

ヘッダ・フッタ

毎日の日記HTMLの先頭のテンプレートとなるのがheader、 末尾のテンプレートとなるのがfooterファイルである。 また、年間のインデックスを作るときのテンプレートとなるのがそれぞれ、 yheader, yfooter ファイルである。yheaderファイルがない場合は、 mkdiary.pl(Perl版)時代と同じ定型ヘッダが使われる。

書き換えるときは見本についているファイルを参考に適当に書き換える。 なおこれらのファイル中には以下の%展開変数が使える。

%TITLE%   "Diary of 日付"
%DIARY%「日記」を表す単語
%BG%背景色(.mkdiaryrc中のbg変数)
%DATE%日付(yyyy/mm/dd)
%YEAR%日記の日付の「年」
%MONTH%日記の日付の「月」
%DAY%日記の日付の「日」
%HEADING%最初の見出し
%WDAY%曜日の英語(先頭3文字)
%YOUBI%漢字の曜日(1文字)
%THEME%〜〜に関する語を含む(category.tmpl)
%KEYWORD%カテゴリ分けキーワード(category.tmpl)

カテゴリインデックス

ある程度文書が溜って来ると資料的価値が生ずる。そんなときに 年ごとの分類ではなく、話題ごとに分類したインデックスページがあるとおべんり。 あとからどさっと作ろう。

カテゴリの作り方

ある話題について書いてある文書には絶対含まれそうなキーワードをいくつ か考える。さらにその話題へのリンクを含むページをどんなファイル名に 保存したいか考える。たとえばこんな感じ。

「FreeBSD」について

このような場合は以下のカテゴリ表エントリを作成する。

FreeBSD=f.html:	/freebsd|ip6?fw|natd|vinum|gmirror|\bgeom\b/i

正規表現の分かる人ならすぐ分かる、簡単書式。要は

話題=分類ファイル名:	マッチするであろう正規表現

というものを1行で書く。これを1話題につき1行ずつ列挙したものを category.tbl というファイルに保存しておき、 トップディレクトリで

  % ./mkdiary.rb -mkcat

とする。すると、./category/ ディレクトリの中に カテゴリインデックスHTMLファイルがどさっとできる。それらの カテゴリインデックスファイルのテンプレートの見本が パッケージ内にある category.tmpl なのでこれをいじくって 好きな体裁にしてくれたまい。このテンプレートファイル中の %LIST%の行がインデックス部分になる。

ちなみに ./mkdiary.rb -mkcat するときに標準出力に 生成されたカテゴリインデックスファイル群へのリンクに便利な文字列が 出されるのでこれをどこかに保存しておくと 「カテゴリインデックスファイルへのリンク」ファイルになる。

  % ./mkdiary.rb -mkcat > hoge
  % cat yheader hoge yfooter > categlinks.html

て感じ。なにイメージが涌かないとな。んじゃ カテゴリを使った 例じゃ。

カテゴリインデックス制御のための変数

カテゴリインデックス生成の動きを制御する .mkdiaryrc 変数 には以下のものがある。

オプション意味デフォルト値
categtbl カテゴリ分けパターン登録ファイル名category.tbl
categdirl カテゴリインデックスファイル生成ディレクトリcategory
cldprefix カテゴリインデックスファイルへのリンクを含む a href を 出力するときに、各ファイル名に付けるプレフィクス。年インデックス ページの全てにカテゴリインデックスを #include させる場合は これを "../" なんかにしておくと楽。""
cutstr 文書には全てフッタが付いているのでそこにキーワードっぽいのがあると それがマッチしてしまう。「この文字列以降は切り取る」という文字列。 正規表現ではない。"\nGenerated with"
themes カテゴリインデックステンプレートで%THEME%を置き換える語 "%sに関する語を含む"
other カテゴリインデックステンプレートから未分類ファイル (other.html)を生成するときに%THEME%を置き換える語 "いずれにも分類されない"

mkdiary.rb で実装しないもの

作者のWeb日記に関してのポリシーにより、以下の機能は実装しない可能性が 高い。

段落への <a name="xxx"></a> 付け

なぜか、name属性を付ける日記があると、そこへのリンクを示して、 それに対しての反論などを付ける人がいる。人への意見を自分の日記ペー ジに書くということは、その人に面と向かっていわない分、配慮に欠けた 文章になりやすく、知らないうちに日記フレーム(喧嘩)に発展する例が後 を絶たない。もちろんこれはその機能が悪いのではなくて、利用者に非が あるわけだが、やっぱりname属性が無ければ段落まで指定して文句を書く ことができなくなることは確実なので、やっぱりその機能は付けたくない。 坊主憎けりゃ袈裟まで憎い。

「最近の日記」の単一ページへの集約機能

読み手からすると、特定の固定URLを見るといちばん新しい日記が読め るのは確かにうれしい。楽だ。真剣に読んでくれる人にはそうしてあげた いのだが、この世の中日記ページを見るや、なぜか知らない人のページで も自動巡回装置(アンテナっちゅーの?)に登録して、読みもしないのに毎 日毎日、いや、大抵毎時間毎時間連続アクセスしてくる輩が多い。だいた い日記なんて、一日に一回しか書かんっちゅーの。そういうことをやられ ると、gentei.orgのように回線の細いサイトはたまらない。なので、ブッ クマークから手動で読んでいる人には、申しわけないが、やっぱり固定 URLでアクセスできるような機能はあまり気が進まない。が、そのほうが 回線負荷が下がったり、無駄な自動巡回君をやめさせられるようなアイデ アがあれば実装するかもしれない(かといって、アクセス拒否ってのはい やらしいので無しね、穏便に穏便に)。


yuuji@gentei.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]