* ChangeLog メモに適切な改行を与える Perl One Liner
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl] [ChangeLog メモ]
以前の私が書いていた、改行が足りず正しくない ChangeLog。
2003-06-16 Saito Hiroaki <hiroaki@example.jp>
* MS SQL Server: 文字列中のシングルクオートのエスケープ
SQL Server で使う Transact-SQL における文字列のエスケープ。
正しい ChangeLog。
2003-06-16 Saito Hiroaki <hiroaki@example.jp>
* MS SQL Server: 文字列中のシングルクオートのエスケープ
SQL Server で使う Transact-SQL における文字列のエスケープ。
2003年頃の私は Emacs 系のエディタを使わずに ChangeLog メモを書いていたため、書式の統一が取れていなかった。このまま放置するのは精神衛生上良くないので修正しておく。
- Perl One Liner で一括置換
こういうのは正規表現で一括置換するのが手軽で良い。使い捨てのワンライナー (1行スクリプト) を書いた。$ perl -i.bak -0777 -pe 's/^(\d\d\d\d-\d\d-\d\d\s+Saito Hiroaki\s+<.+?>\n)\t/$1\n\t/mg' log.txt
-i.bak は元のファイルは ファイル名の末尾に .bak を付けてバックアップするというオプション。
-0777 はファイルを一気に読み込んで Perl ワンライナーに渡すというオプション。
-p は実行結果を出力するオプション。
-e は オプションの引数に与えた Perl スクリプトを実行するオプション。
念のためバックアップと置換後のファイルの diff を取ってざっと確認。うん、問題なさそう。
* chalow が出力する RSS に CDATA で全文を入れる
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [chalow] [ChangeLog メモ] [RSS]
- chalowでitem別ページ
http://nais.to/~yto/clog/2004-11-27-3.htmlitem 別ページ大歓迎。私もこれやろうとしたんですよ。削除アイテムの扱いをどうするか、2004-01-25 の「記事単位での html 出力と記事の削除」で悩んだり。そのときの結論も「削除しない」とか、「削除したらダミーの記事を追加する」とかだった。でも結局、一個ずつファイル作ってたら infoseek では 50MB しかディスク容量が使えないためにあっという間に制限を超えてしまうので断念。もっと容量を使えるサーバに移転すればいいんだけど URL 変えたくないしなあ。
「一記事一 URI」って美しい。SEO を意識してというよりも、自分を含む読み手のことを考えると自然とこうなる。Google の検索結果で、「Landscape - エンジニアのメモ 2004-01-08 」って表示されるより、そのものズバリの「gpg で標準入力からパスワードを渡してバッチ処理で暗号化」って表示された方がわかりやすい。
- item 数と html 生成・ファイル転送
5671 - 「たつをの ChangeLog」の公開item数http://nais.to/~yto/clog/2004-11-28-2.html
今までの日付ページ1650、月ページ59も引き続き出力するので、8400ページ近くになる。昨晩、rsyncでWebサーバに転送したら35分かかった。
すごい数・・・。こうなってくると DB 使ったり動的生成したくなってきたりするなあ。これもいつもジレンマなんだよなあ。ChangeLog メモの良さを損なわずにいかに便利にスケーラブルにするかは悩ましい問題。
- ChangeLog パーサ
ChangeLogの読み込みとハッシュへの格納http://nais.to/~yto/clog/2004-11-28-5.html
こういうライブラリがあると実に便利。あとはハッシュへのアクセスを抽象化してあげれば ChangeLog メモクラスとして完成するなあ。エンティティクラスであるためシンプルで使いやすそう。
- RSS に全文入れる
chalow の RSS の description で CDATAhttp://nais.to/~yto/clog/2004-11-29-1.html
これからは CDATA で全部どかっと行く。
bloglines で読んでいたら突然全文を読めるようになったのはこういうわけか。素晴らしい。2004-10-26 の「content:encodedが足りねぇ… じゃんじゃん 持ってこい」でも書いたように、私は全文入った RSS が大好き。記事単位でサクサク読めるのが最高。
で、その RSS を Bloglines で見てみると、
相対URLがおかしくなってるなあ。2004-11-27-3.html を
http://nais.to/2004-11-27-3.html にしちゃってる。
私は RSS 中の 相対 URL の補完は以下のように簡単に置換しています。私の場合、../ などの処理は考慮する必要がなかったので楽でした。複雑な相対パスを指定してる場合はちょっとだけ手間が増えますね。
# " のあとに http が無かったら補完。
my $home_page_url = 'http://sonic64.com/';
my $content = RSS_DOCUMENT
$content =~ s%(<a href|<img src)="(?!(https?|JavaScript):)%$1="$home_page_url%ig;
- chalow の機能強化
chalow の不満な所が一気に無くなってゆくhttp://tokuhirom.tdiary.net/20041129.html#p03
これまでのバージョンの chalow で気にくわなかった所は
エントリごとのページが生成されない
SEO 的にマズー
見た目的にもマズー
RSS に本文そのものが入らない
という所だったのですが、全部解消って感じですね。
あと、なんかあったっけ?
私は記事の通し番号が変わるという問題を解決したいですね。この問題は私の使い方が変わっていることが原因ですが。
私は LAN の中にだけ公開したい文書は L: カテゴリを指定しています。L カテゴリの文書は、web に出す html を生成するときは p: を指定したプライベートアイテムと同じように削除されます。
この結果、LAN の中だけに公開される文書と web で公開可能な記事が入り交じると、出力先によって記事の数が変わってしまい、同じ記事なのに LAN の中と外で番号が変わってしまうという問題があります。その結果、2004-11-29-1 という日付参照 + アイテム参照の順序が狂います。
これは記事番号の採番を一元的に行う主体や方法がないのが原因で、シンプルなツールなら仕方のないことなんですけどね。
あ、でもなんとかできそうな気がしてきた。結局、出力ファイルの名前空間が YYYY-MM-DD.html や YYYY-MM-DD-ITEM.html しかないから問題になる。だったら、パースの時に独立した名前空間ごとに記事を格納するようにして、html 出力の時も NameSpace-YYYY-MM-DD.html みたいにして名前空間付きでファイル名を生成すればいい。
以前に、「p: を指定されたプライベートアイテムだけを出力したページが欲しい」という要望があったけど、これならできそう。パーサはプライベートアイテムだけのエントリを消すのではなく、プライベートアイテムだけを独立した名前空間に格納してやると。で、html 出力部分 にどの名前空間のデータを渡すかはコントローラが決めるので、p 付きのデータを出力するようなコントローラを書けばいい。
* 過去の ChangeLog メモを読み返す
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
「過去の自分はこんなことやってたんだなあ」とか、「この程度のことも身につけてなかったのか」とか、いろいろと発見があった。楽しい思い出を書き留めたメモもたくさんあったが、辛い気持ちを書き留めたメモが意外とあったことに驚いた。もっとも、辛い思い出でも過ぎ去ってしまえば印象や気持ちは大きく変わる。「おお、こんなこと書いてる。精神的にかなり追いつめられてたんだなー」とか、他人事のように楽しむ事ができた。
- 過去のメモをたくさん修正
ChangeLog メモを読み返していると、どうしても手を入れたくなる。手を入れたくなる理由はこんな感じだ。・表現がおかしい、日本語になっていない。
・メールや別の記録によると、この日付でこの記事が入っているのはおかしい。
・引用文なのに引用になっていない。
・表題が長すぎる。
・公開するべきメモではない
小さなものから大きなものまで、公開メモ・非公開メモに関係なくかなりの量を修正した。記録だから修正しない方が良いのかもしれないが、メンテナンスされ続けている文章の方が価値が高いはず、という理由の元に思い切って手を入れることにした。
- ChangeLog の書き方が変わってきてる
ChangeLog メモの書き方がどんどん変わっていることが面白かった。初期の頃はあまり「> 」による引用とか「- 」による見出しとかの機能を使っていない。chalow の機能が増えたり、自分で chalow やツールを修正したりすることで、ChangeLog メモの書き方がガラッと変わる。これから ChangeLog メモを書き始めるという人のために、ここら辺のノウハウや流儀をまとめておこう。過去のメモは文章の長さが短く、素っ気ない。最近になればなるほど文章が長くなっているようだ。過去のメモが箇条書きだとしたら、今のメモは短いメールくらいの長さだろうか。「自分用のメモなんだから、自分さえわかればいい」という気持ちでメモを取っていたのだが、読み返してみると説明不足だったり、決断の根拠や背景が抜けていたりすることがあった。ちょうど、自分の書いたコードを後になってメンテするときに情報が足りなくて困る、みたいなことが ChangeLog メモで起こっているわけだ。
そういった経験の結果、自分以外の人がメモを読んでも理解できるように書くようになった。その分文章は長くなっているが、他の人に聞かれたときに「****年**月**日のメモに書いてあるから、読んで作業しておいてね。」などと言えるようになった。
* 記事単位での html 出力と記事の削除
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
- やっぱり日付よりも title
今までは chalow の「日付単位での html 出力 + 記事単位アンカー」で十分だと思ってたが、考えが変わった。何日か前に、Google で いっしょにシレン を検索したとき、自分のサイトがヒットした。しかし、title タグには Landscape と日付しか入っていないので、どんな内容が書かれているかわかりにくい。せっかく記事毎にタイトルを付けいているのに、生かされていない。日記なら日付が基準なので良いけど、私はこのサイトは日記ではなくメモだと思ってる。せっかく書いた内容なんだし、最大限に利用できるように整えたい。
- chalow で 記事単位で出力させることはできるだろうけど・・・
日付 + 記事番号をファイル名として利用すれば chalow でも記事単位で出力できる。title タグに ItemHeader を埋め込む修正も可能だろう。しかし、問題がないわけではない。記事を削除したり順番を入れ替えたりすると、URL が変わってしまう。2004-01-24 の記事群から「* amazon: 北島三郎のアルバムの曲目リストが間違ってるのでアマゾンに報告」を削除したり、プライベートアイテム化して不可視にすると、記事番号がずれる。結果、それよりも後ろのにある 「* ラーメン: 駿河@栃木市の塩ラーメン」 の URL が変わってしまう。日付単位の出力であればファイル名は変わらないので、探す手間は少し増えるがアンカーの位置がずれても記事を読むことはできた。しかし、記事単位のファイル名だと、ファイル名の変更は即 404 Not Found に繋がる。これは問題だ。記事の削除や入れ替えなんてほとんどないから良いかもしれない。でも、なんとかする方法は無いものだろうか? MovableType では記事別 html は普通に使われてるが、DB を使って管理している。おそらく、記事登録時に連番を振っているんだろう。記事のタイトルや記事本文のハッシュを元にファイル名を決めるのでは、タイトルや本文を修正するたびに URL が変わってしまう。何か記事番号を手動で振るのは、簡単にメモできるという ChangeLog メモの利点を損なう。それに同じ番号を振ってしまったりするミスが発生しかねない。ツールで検出できるだろうけど。やっぱり記事を管理するファイルなり DB なりを導入するしかないのかなあ。他のシステムでは、この問題をどうやって解決しているんだろう?
- 先行事例調査
うろ覚えだけど、tDiary はファイル単位で記事を管理していたはずだ。参考になる情報があるかもしれない。Google で tdiary 記事別 html で検索。期待する記事がヒットしないな。では、Google で tdiary 記事別 html を検索ではどうだろう。ダメだ。ヒット数0件。記事別 というキーワードが悪いのかな。記事単位で検索してみるか。全体的にヒット件数が少ないので、html という絞り込みもとりあえず外してみよう。Google で tdiary 記事単位 で検索。参考になりそうなサイトがいくつかヒット。
tDiary でも 記事単位で出力できるようだ。
tDiary Blogkit: tDiaryをblog風に運用する
http://cvs.sourceforge.net/viewcvs.py/tdiary/blogkit/README? ...
うーん、削除については書いていないな。
キーワードを変えて、Google で tDiary エントリー 単位で検索してみると同じ問題を考えた人の記録がヒット。
ishinao.net/mylog - Web日記システムの欠点はtitle要素の扱いだ from 気分はノースサイド
http://mylog.ishinao.net/id/574
ドキュメントは、1ドキュメント単位、ジャンル単位、日付単位など自由に表示できるようにする。内部管理単位はそのいずれにも依存しないようにしつつ、それをどう見せるか(Web日記的にするか、Wiki的にするか、blog的にするか)は表示側の処理が決める。管理についての具体例は書かれてないなあ。いくつか関連記事にリンクが張ってあったので読んでみよう。
Web日記システムの欠点はtitle要素の扱いだ
http://www.club-siesta.com/northside/2003/05/08weakpointofdi ...
そのページに記述されている内容を的確にtitle要素に書くことで、ユーザビリティは大幅に向上する。その根底には、「URI一つに対して、リソースが一つ対応する」という、とても美しいWWWの原則がある。ページ内のアンカーに対して一つのコンテンツを対応させるという考え方は、WWWの原則に馴染まないのだ。とても共感できる内容。美学を追究しているという点でも見習うべき。すばらしいなあ。
私はアンカーってあまり良いものだとは思わない。アンカー付きのリンク先をクリックしたとき、ブラウザのスクロールバーが中途半端な位置にあるのがまず美しくない。収まりが悪いというか。男ならわかるよな。で、逆にスクロールバーが無いページや、アンカーが最下段や最上段にあるときにだと、いったいどこをアンカーが示してるのかがわからないことがあって、それも不便だと思う。tDiary だと JavaScript を使って選択されたアンカーをハイライトさせるけど、あれはすばらしい機能だと思う。ブラウザはあの機能を標準でサポートしてくれるといいのにね。
Web日記システムの欠点はtitle要素の扱いだ
http://sho.tdiary.net/20030509.html#p01
やっぱり日記ってそういうものじゃないんだろうという主張から、tDiary のポリシーが伺える。確かに日記ならそれで良いんだよね。ただ、私は前述したように日記としてではなくメモとして書いている。そういう場合は MovableType を使う方が良い、というのも正論だが、今回の問題は Chagelog メモという環境での方法を考えてる訳なので、別のツールを使うのは最後の手段だ。
2003/05/12はどんな日?
http://min.sugama.org/nikki/2003/05/12.html#y2003m05d12c2
一つのタイトル要素がすべての人に最適な情報が伝わるなんてことはありません。『2003/05』よりはマシでしょうが、集約に関してはけっきょくのところどこで妥協するかだけだと思います。確かに。内容はユーザが探しているものと一致しているのにもかかわらず、タイトルの付け方が悪いために求めているものと違うと誤解されることだってあるはず。でも、大量の検索結果のほとんどが日付しか表示していない中で、タイトルが表示されているというのはかなりの強みになるはず。
おもしろいと思ったアイディア。ブラウザはまだまだ進化の余地がある。
http://min.sugama.org/nikki/2003/05/12.html#y2003m05d12c2p7
あと、ブックマークの話はどちらかというとブラウザがブックマークにアンカーを含めることができるインターフェースをもち、なおかつ(たとえば)<p id>〜</p>で囲まれたところをタイトルとして抜き出すという実装ができればいいだけの話で、あまりWEB日記には関係ないような気がします
- 結論は?
ああ、勉強になったなあ。おやすみなさい・・・って、結論が出てないじゃん。それもそうか。今日のサイト群の主張は面白かったが、そもそもデータのハンドリングについて論じているものではない。日記とはどうあるべきか、ユーザビリティから考えるとタイトルはどうあるべきかといったことについて論じていたのだから、私の直面している問題について結論が出ていなくて当たり前だ。- うわあぁああああ〜〜ん どおおおおしよおおお 不安だよォォオオ〜 ねえええ〜〜〜ッ 失敗したら どおおおしよお〜〜 このアイデアがぶっつぶれたら どおおおしよおお〜〜
結局、削除しないとか、削除したらダミーの記事を追加するとか、そういった方法しかないのかなあ。* ChangeLog メモのエントリヘッダの日付と記述者名とアドレスを区切るもの
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
今まで半角スペース一個しか入れてなかったよ・・・。一括置換しなくちゃ。
* 仕事場の ChangeLog メモもヘッドラインを追加して模様替え
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
* 命名 Landscape
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
* Chalow にヘッドライン出力機能を追加
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
ということでヘッドラインを生成する関数を作成した。インデックスぺージ生成関数と月別ページ作成関数に、作成したヘッドラインと各ページのテンプレートに仕込んでおいたマーカーを置換するロジックを追加して一丁上がり。
本当は 自分好みの ChangeLog メモ変換ツールを一から作ろうかと思った。でも、chalow を修正すればとりあえずやりたいことはできるようになったので、ここで切り上げることにした。chalow は関数化とモジュール化を進めればコードの見通しがかなり良くなると思うんだけどなあ。いずれ ruby か何かで書いてみようかな。
# ヘッドラインを生成する
sub make_headline {
my $MAX_DATE = 90;
my $tmplt_item_header = qq(<li class="headline_li"><a href="%s.html#%s-%d">%s</a></li>\n);
my $tmplt_item_list = qq(<dd class="headline_dd">\n<ul class="headline_ul">\n%s</ul>\n</dd>\n);
my $tmplt_item_dt = qq(<dt class="headline_dt"><a href="%s.html#%s">%s</a></dt>\n);
my $tmplt_item_dl = qq(<dl class="headline_dl">%s</dl>\n);
my $headline = '';
my $cnt = $MAX_DATE;
foreach my $ymd (sort {$b cmp $a} keys %all_entries) {
last if (! $cnt);
my $lists = '';
my ($ym) = ($ymd =~ /^(\d{4}-\d\d)-\d\d/);
foreach my $i (sort {$b <=> $a} keys %{$all_entries{$ymd}}) {
next if ($i !~ /^\d/);
my $c = $all_entries{$ymd}{$i}{h};
$c =~ s/[\n\t]+//g; # 改行消し
$c =~ s/\s\s+/ /g;
$c =~ s|<img.+?alt="(.*?)".*?>|[$1]|gosm;
$c =~ s/<.+?>//g; # タグ抜き
$c =~ s/\* //;
$c =~ s/\s+$//;
$lists .= sprintf($tmplt_item_header, $ym, $ymd, $i, $c);
}
$headline .= sprintf($tmplt_item_dt, $ym, $ymd, $ymd);
$headline .= sprintf($tmplt_item_list, $lists);
--$cnt;
}
return sprintf($tmplt_item_dl, $headline);
}
* 自分好みの ChangeLog メモ変換ツール
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
cygwin で動けばいいから、Ruby で書こうかな。
* こんな ChangeLog メモツール、Weblog ツールがほしい
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
- 結城さんの日記を読んでいて触発された。
2003-04-24 にも書いたけど、もっと便利な Weblog ツール、ChangeLog メモツールがほしい。結城浩の日記 2003年7月1日 (火) - WebLogツールのアイディア
http://www.hyuki.com/diary/dia0307.html#i01
- 私が ChangeLog ツールに求めること
テキストエディタで書けること。専用のツールがないと書けないのは NG。面倒な文法やタグ、記述のルールが少ないこと。
そのツールでしか通用しないようなルールを新たに覚えるくらいなら、最初から SGML で書く。
ルールがあったとしても、勝手にそれを付加してくれるフィルタが用意されてるなら構わないけど。
たとえば ChangeLog メモでは、日付と名前以外の部分はタブでインデントしなければならない、というルールがある。
これは日付以外のところはツール側で勝手にタブを付加してくれてもいいはずだ。Emacs の ChangeLog モードはこれをやってくれるので便利だ。自動整形には100%の精度は求めない。ある程度編集を楽にしてくれればそれでいい。
また、文字列を自動的にリンクや文書構造に変換してくれるとうれしい。
http:// や ftp:// という文字列があれば、当然リンクになってほしい。
メールや NetNews でよく使われる引用記号の > や | が行頭に来ていたら、引用部だと解釈してほしい。
行頭に ・ が来ていたら、箇条書きだと解釈してほしい。
行頭に 1.、次の行頭に 2.、さらに次の行頭に 3. とあったら、番号付き箇条書きだと解釈してほしい。
Google で *** を検索、と書いたら、Google へのリンクになってほしい。
日付をある程度定められた書式で書いたら、その日付の ChangeLog エントリへのリンクになってほしい。
ISBN を書いたら、オンライン書店の該当商品ページへのリンクになってほしい。
http:// のリンク先文字列の末尾が .jpg、 .png、.gif のいずれかだったら、
サムネイルを表示してほしい。
・・・。なんかリンクばっかりだな。ハイパーリンクはハイパーテキストの真髄だから当たり前か。
書いた内容を再利用できること。他のツールやフォーマットに変換や移行が簡単にできること。
内容の検索が簡単にできること。
スタイルシートなどで、見た目の変更が簡単に出来ること。
* ChangeLog メモのバックアップ
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ] [バックアップ]
ファイル数が2000個近くになっていた。
$ ls -l /home/hiroaki/backup/changelog |wc
1975 17768 165828
一週間以上経ったものは find で探して rm しているが、それでも2000個。多すぎだろう。
内容が変化していないのに5分おきにバックアップを取るのは非効率だ。
前回のファイルの md5 を求めて、現在のファイルの md5 と比較し、
違っていたらバックアップと html 出力を行うようにすればいいかな。
追記: 2003-06-06 で実装した。
* ChangeLog の各部の名前
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
- 日付ごとのまとまりが entry。
日付 + 名前 + メールアドレスの部分が header。アスタリスクで始まる項目が item。
item のうち、コロンの前が filename、後が function name。
もともとはソースの変更点を記録するためのフォーマットだから、function name などという名前なんだなあ。
・・・? ハイフンで始まる部分は名前がないのかなあ?
たつをの ChangeLog
http://nais.to/~yto/clog/2003-05.html#2003-05-20
http://nais.to/~yto/tools/chalow/image/chalow-cl-name-s.gif
* changelog.pm の設計
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
ChangeLog オブジェクト。
date_part の集合体。
count メソッド
get_date_list メソッド。
イテレータをどこに実装しよう?
date_part オブジェクト。
日付単位の ChangeLog メモ。
ヘッダ部分と ボディ部分に分かれる。
ヘッダは、日付部分、名前部分、メールアドレス部分から成る。これらは単数。
ボディは、subject と message に分かれる。これらは単数または複数。
・・・。うーん、オブジェクト指向の設計の定石がわからないな。
なんだか煩雑になってるだけのような気がする。
悩んでもきりがないので、以下の方針で進めようと思う。
・とりあえず html 変換のために必要な関数群と正規表現群を実装。
・tdiary のコードを読み、どのような設計になってるかを学ぶ。
・tdiary をお手本として changelog.pm を仕上げる。
とりあえず必要な関数と正規表現をリストアップしよう。
共通関数
・html エスケープ
・漢字コード変換 今は必要ないけど、そのうちきっと欲しくなる。
本文部分を生成するには、
・ChangeLog を日付単位に分割して返す
・日付単位に分割された ChangeLog を、さらに subjet 単位に分割して返す
・subject を subject-header と subject-body に分割して返す
・subject-body に対し、置換とリンクを設定する
ヘッドラインを生成するには、
・ChangeLog を日付単位に分割して返す
・ChangeLog から、subject の一覧を返す (p: 付きの subject も含む)
・ChangeLog から、subject の一覧を返す (p: 付きの subject は含まない)
こんなところか。
* やっぱり自分好みの ChangeLog -> html 変換スクリプトが欲しい
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
- 欲しい機能
・タイトルリスト
ページ右側に、日付とその日のタイトルの一覧、およびそのリンクが欲しい。
・可能な限り厳正な html を出力したい
・・・あれ? これだけか・・・? あとは検索かなあ?
tdiary や hns にあるコメントを付加する機能とかは必要ないよね。
- 仕様
ChangeLog クラスメソッド
ChangeLog ファイル読み込み、出力
とりあえず読み込みだけ実装しよう。
データ取得
get_date_part() 日付単位に split して返す。
get_suject() 指定された date_part を subject 単位に split して返す。
ChangeLog2html クラス
メソッド
タイトル一覧を返す
subject 一覧を返す
本文を返す
* ChangeLog メモを日付ごとの固まりに split する正規表現
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
my @date_part = split(/^(?!\t|\n)/m, $str);
* 便利ツール
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
- changelog_util.sh
#!/bin/bash
# ChangeLog memo util
# setting
LOG_PATH=/home/hiroaki/log.txt
DATE_STR=`date +%Y%m%d%H%M%S`
BACKUP_DIR=/home/hiroaki/backup/changelog
BACKUP_FILE_PATH=${BACKUP_DIR}/log.txt_${DATE_STR}.bak
# main routine
cp ${LOG_PATH} ${BACKUP_FILE_PATH}
perl -p -i.bak -e 'if ($_ =~ /^[^\t]/) { if ($_ !~ /^\d{4}-\d{2}-\d{2}\s+.*?<.*>$/) {$_ = "\t" . $_;} $_ =~ s/\s+$/\n/;}' ${LOG_PATH}
/home/hiroaki/chalow-0.13/chalow ${LOG_PATH} -c /home/hiroaki/chalow-0.13/cl.conf &>/dev/null
find /home/hiroaki/backup/changelog/ -type f -mtime +7 |xargs /bin/rm -f
- 整形スクリプトの所要時間を計測。
perl で整形を実行中に書き込みしたりすると、排他制御してないのでいろいろ問題出るかなあと思ったので。
$ time perl -p -i.bak -e 'if ($_ =~ /^[^\t]/) { if ($_ !~ /^\d{4}-\d{2}-\d{2}\s+.*?<.*>$/) {$_ = "\t" . $_;} $_ =~ s/\s+$/\n/;}' /home/hiroaki/log.txt
real 0m0.480s
user 0m0.390s
sys 0m0.070s
なんだ、楽勝じゃん。Pentium 133MHz のマシンでこれしか時間かかってないわけだし。
* 日付と表題一覧を付加2
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
- 2003-04-15 に作った「日付と表題一覧を付加する」perl スクリプト、実はバグあり。
my @part_by_date = ($source =~ /^(\d{4}\-\d{2}\-\d{2}.*?)\n\n/msg);これじゃ日付以外のところに \n\n があると、それ以降が無視されてしまう。
まあ使ってないからいいんだけど。
* 日付と表題一覧を付加
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
- 作ったけど適用してない。どこに適用するのが適切なのかを探す時間がないから。
$source は html エスケープなどのサニタイズが完了していることが条件。my $tmplt_dt = '<dt>%s</dt>';
my $tmplt_dd_start = '<dd><ul>';
my $tmplt_dd_end = '</ul></dd>';
my $tmplt_li '<li>%s</li>';
my $html = '<dl class="subject_list">';
my @part_by_date = ($source =~ /^(\d{4}\-\d{2}\-\d{2}.*?)\n\n/msg);
foreach my $part (@part_by_date) {
my $date = ($part =~ /^(\d{4}\-\d{2}\-\d{2})/)[0];
$html .= sprintf($tmplt_dt, $date);
$html .= $tmplt_dd;
my @subject = ($part =~ /^\t\*\s+(.*?)$/mg);
foreach my $subject_str (@subject) {
$html .= sprintf($tmplt_li, $subject_str);
}
$html .= $tmplt_dd_end;
}
$html .= '</dl>';
* ChangeLog メモ上の文字列の置き換え
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]
- リンクにした方が便利そうなので置換してみる。
s!(\s)(google)(\s)!$1<a href="http://www.google.co.jp/" title="Google">$2</a>$3!ig;
s!(\s)(example)(\s)!$1<a href="http://www.example.co.jp/" title="example">$2</a>$3!ig;
s!(\s)(yahoo)(\s)!$1<a href="http://www.yahoo.co.jp/" title="Yahoo\! Japan">$2</a>$3!ig;
s!(\s)(2ちゃんねる|2ch\.net)(\s)!$1<a href="http://www.2ch.net/" title="2ちゃんねる">$2</a>$3!ig;
s!(\s)(/\.|slashdot)(\s)!$1<a href="http://slashdot.jp/" title="Slashdot Japan">$2</a>$3!ig;
s!(\s)(JM)(\s)!$1<a href="http://www.linux.or.jp/JM/" title="Linux JM project">$2</a>$3!ig;
s!(\s)(namazu)(\s)!$1<a href="http://www.namazu.org/" title="全文検索エンジン Namazu">$2</a>$3!ig;
s!(\s)(redhat)(\s)!$1<a href="http://www.jp.redhat.com/" title="RedHat Linux Japan">$2</a>$3!ig;
s!(\s)(debian)(\s)!$1<a href="http://www.debian.org/" title="Debian">$2</a>$3!ig;
s!(\s)(\@IT)(\s)!$1<a href="http://www.atmarkit.co.jp/" title="\@IT - アットマーク・アイティ">$2</a>$3!ig;
s!(\s)(winny)(\s)!$1<a href="http://www.geocities.co.jp/SiliconValley/2949/" title="Winny Web Site">$2</a>$3!ig;
s!(\s)(mozilla)(\s)!$1<a href="http://www.mozilla.org" title="mozilla.org">$2</a>$3!ig;
s!(\s)(postgres|postgresql)(\s)!$1<a href="http://www.postgresql.org/" title="PostgreSQL">$2</a>$3!ig;
s!(\s)(apache)(\s)!$1<a href="http://www.apache.jp/mirror/" title="The Apache Software Foundation (JP mirror)">$2</a>$3!ig;
s!(\s)(samba)(\s)!$1<a href="http://www.samba.gr.jp/" title="日本 Samba ユーザ会">$2</a>$3!ig;
s!(((\d{4})-(\d{2})-(\d{2}))\s*の\s*changelog)!<a href="#$2" title="$3年$4月$5日の ChangeLog">$1</a>!ig;
s!(>>((\d{4})-(\d{2})-(\d{2})))!<a href="#$2" title="$3年$4月$5日の ChangeLog">$1</a>!ig;
s!^(\t>\s+.*)$!<strong class="quote">$1</strong>!igm;
s!^\t-\s(.*)$!\t<strong>- $1</strong>!igm;
* ChangeLog メモでメモを取ろう
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]