Feb 4, 2007

DeleteAndRebuild Plugin公開

Movable Typeで公開状態にあるエントリーを削除したときに依存関係のあるアーカイブの再構築が自動的に行われない(全再構築を行わなくてはならない)という問題が某所で指摘されていた。

そんなに過去のエントリーを削除する機会があるのかというのはさておき、下のような超簡単なプラグインを用意しさえすれば、エントリーを削除したときに関連するアーカイブの再構築が自動的に行える。

DeleteAndRebuild - ogawa - エントリーの削除時に関連するアーカイブの再構築を自動的に行うプラグイン。 - Google Code


以下は蛇足。

それはそれとしてもうちょっとだけ深い話をすると、MTではMTEntryNext, MTEntryPrevious, MTArchiveNext, MTArchivePreviousをネストしたテンプレートを書くことができる。例えば、個別エントリーアーカイブで以下のように書ける。

<ul>
<MTEntryPrevious>
  <MTEntryPrevious>
    <MTEntryPrevious>
      <li>3つ前: <a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
    </MTEntryPrevious>
    <li>2つ前: <a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
  </MTEntryPrevious>
  <li>1つ前: <a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTEntryPrevious>
</ul>
 
<ul>
<MTEntryNext>
  <li>1つ後: <a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
  <MTEntryNext>
    <li>2つ後: <a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
    <MTEntryNext>
      <li>3つ後: <a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
    </MTEntryNext>
  </MTEntryNext>
</MTEntryNext>
</ul>

このネストはいくらでも深くすることができる。他にも例えば、個別エントリーアーカイブにそのエントリーが属するカテゴリーに含まれる他のエントリーの一覧を生成させることもできる。

何が言いたいかというと、MTの「テンプレート言語」がこのような性質(=つまりは容易に非定型な依存関係を作り出せるという性質)の「言語」である以上、エントリーに何らかの変更を行った場合に厳密にすべての依存関係をconsistentに反映するには、テンプレート「プログラム」の依存性解析をしない限り、全再構築するしか方法がないということである。

これに対して、新規エントリーを投稿したときなどに自動的に行われる(部分的な)再構築や前掲のプラグインが実現する(部分的な)再構築は、インデックステンプレートと、そのエントリーの前後のエントリーと、そのエントリーの属している日時別アーカイブ・カテゴリーアーカイブしかその対象としない。だから実は不完全である。例えば、上記のテンプレート片を含む個別エントリーアーカイブがあった場合にはエントリーを削除したときにconsistentに更新されないアーカイブが存在することになる。要は不完全ではあっても実用上は問題ないだろうという判断に基づいてある種の最適化・省力化をしているに過ぎないのだ。

では、静的生成ってダメダメじゃんやっぱりダイナミックパブリッシングがいいんじゃんということになるかというと、それはまったく違う。というのも、ダイナミックパブリッシングは静的生成時にバッチ的を行うレンダリング処理をユーザのページリクエスト時にオフロードするだけだからだ。

もしキャッシュがなくリクエストの度にレンダリングを行うのならば、そのオーバーヘッドの総計は静的生成の場合を容易に上回り得る。もしキャッシュがあり最初のリクエスト時のレンダリング結果を再利用するのならば、エントリーへの変更がなされる度にすべてのキャッシュは正しく無効化されなくてはならない。後者の場合には平均的に見て全再構築するのと同程度の処理コストを払わねばならない。処理が時間的に分散されることのメリットを強調できるかもしれないが、それならば静的生成でもRebuildQueueのようなエフォートがある。RebuildQueueでは、再構築処理を時間的にも空間的にも分散して実行するフレームワークを提供しているようだ。

この話はまともなテンプレートエンジンを備えていない(というかPHPのテンプレート機能をそのまま使う)Wordpressでもほとんどそのまま当てはまると思う。コードの抽象化不足と私自身の忍耐不足のせいもあって、Wordpressのコードをちゃんと読む機会を逸し続けているのだけど、何か特別な魔法があるとは考えにくい、それだけは間違いない。

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

Copyright 2012 Ogawa::Buzz | Powered by Blogger
Design by Web2feel | Blogger Template by NewBloggerThemes.com