Nov 29, 2004

HanPanda


Nyanpan

微発砲サプリ(キリンビバレッジ | 微発泡サプリ)、一瞬で見かけなくなったなー、いやー残念だー、胸にぽっかり穴が開いたみたいだー、と思っていたが、意外なところで発見された。

東京建物のデザイナーズ高級賃貸マンション アパートメンツ東雲:トップページ

手元のチラシの方にはHanPandaキャラの脱力マンガが載っていて、これがまた野田凪サン、ナゲヤリな仕事を事も無げにやっていて、いやー軽く感銘を受けてしまったよ。

よく広告主の東京建物はオーケー出せたなーという感じ。ある意味、漢だね。

Nov 28, 2004

MT-ShrinkFInfo

Movable Type 3.1でしばしば問題となる、肥大化したfileinfo.dbをshrinkするための簡単なツールを公開します。3.14以降のバージョンでは不要です。

MTShrinkFInfo - ogawa - Google Code

Movable Type 3.1でBerkeleyDBを使っている場合、再構築を繰り返すたびにfileinfo.dbが肥大化するという問題が知られています(TITO's Web Page: Movable Type「fileinfo.db」の肥大化)。具体的には、MTは再構築のたびに古いFileInfoオブジェクトを削除して、新しいFileInfoオブジェクトを生成しますが、このときBerkeleyDBを使っている場合に限って、(1) 古いFileInfoオブジェクトの消去をし損なう場合があること、(2) 削除してもfileinfo.dbファイルの空き領域が開放されないこと、がこの肥大化の原因となっています。

mt-shrinkfinfo.cgiは、この肥大化したfileinfo.dbをshrinkするための簡単なツールです。Movable TypeのPerl APIを使って実現されているため、直接DBイメージファイルを削除したりする方法に比べて安全であり、また容易です。

Nov 23, 2004

The Cronicles of Riddick / The Village

初・三軒茶屋シネマ。自宅から徒歩5、6分のところ。だいたい三ヶ月遅れくらいで売れ筋の映画が2本1300円で観られる、ナイス映画館。券売機がボロいので800円で観られたり…、もうこうなるとレンタルビデオ並みの料金。


Title: The Chronicles of Riddick
Director: David N. Twohy
Year: 2004
Place: 三軒茶屋シネマ
Eval: ☆

The Cronicles of Riddickは、物語的にはギリシャ劇から連綿と続くドラマを背景にした宇宙冒険活劇で、あえて語るには値しない。要するにStar Warsシリーズと大差ないが、有機的な造形やアメコミ然とした暗さや音楽が救いである一方、超人的な活躍をするRiddickを中心とした展開がほとんどで単調でもある。監督のDavid TwohyはThe Grand TourやPitch Blackの監督で、まあまあ面白い映画を作る人。特に前者は初監督作であることを考えると非常に良い出来だと思う。


Title: The Village
Director: M. Knight Shyamalan
Year: 2004
Place: 三軒茶屋シネマ
Eval: ★

The VillageはThe Signsですっかり化けの皮の剥がれたShyamalanの映画。彼の映画には「チャリラリ ラリラリ チャリラリ ラリラリ…」とTwilight Zoneのテーマをつけると妙にしっくり来る。それくらい1アイディアで作られた小作を撮るのがShyamalanの本来のスタイル(考えてみれば地元のフィラデルフィア近辺で起きるちっさい話ばかり)で、The Sixth Senseでたまたま注目され過ぎてしまったのが不本意だったと言えなくもないだろう。皮肉でも何でもなく、Hitchcockもそうやって沢山の映画を撮り、Shyamalan同様カメオ出演を続けてきたわけでこのまま濫作を続けてもらいたい。

実は今回も最初でTwilightなオチが分かってしまった。それは出演者が○○訛りで話すからなのだが、それが意図したものだったのかミスなのかはよく分からない。村を出るのが本質的に盲人でなくてはならなかったとか細かいところの辻褄は実によく考えてあってミステリーとしての完成度は高い。ただ赤を禁じられた色にした理由はよく分からない。上空から視認可能だから? 血を連想するから? 後者よりはマシな理由付けが欲しいところ。また、80年代の佐藤史生の漫画に「アシラム」という小作品があるが、コミュニティの仕組みに関して佐藤(というか原作は徳永メイ?)くらいネガティブで突っ込んだ設定を考えても良かったかなとも思う。例えば、あんな小さな村であれだけの衣類を賄うのはどだい無理な話である。

あとはThe Signsに引き続き、出た!クリーチャー!自主制作映画然としたこのクリーチャーもオチが分かっていると笑いながら観られる(しかも前回よりは安っぽさに必然性があるよ)。そしてAdrien Brody、リメイク版King Kongにも期待が募る。

Nov 20, 2004

MTEnumVar Plugin

MTEnumVar.zip

0.01(2004.11.20): First Release

また、極小のプラグインを作ってみました。このプラグインは、単にカウンター機能を提供するだけの変数タグ <$MTEnumVar name="counterName"$> を実現します。

上記のMTEnumVar.zipを展開するとmt-enumvar.plとfunction.MTEnumVar.phpという2つのファイルが得られます。それぞれ静的生成用、ダイナミック・パブリッシング用で、前者は<MTDIR>/pluginsに、後者は<MTDIR>/php/pluginsに、コピーすれば使えるようになります。

以下では簡単に使い方を説明します。

テンプレートで <$MTEnumVar name="counterName"$> が呼び出されるたびに1, 2, 3,...と順に値を返します。nameで指定するカウンター名を変えると別のカウンターとして機能します。

<$MTEnumVar name="counterA"$> → 1を返す
<$MTEnumVar name="counterA"$> → 2を返す
<$MTEnumVar name="counterB"$> → 1を返す
<$MTEnumVar name="counterA"$> → 3を返す
<$MTEnumVar name="counterB"$> → 2を返す

また、このカウンターはMTSetVar/MTGetVarを使って、初期値を設定したり、値を参照したりすることができます。

<$MTEnumVar name="counterA"$> → 1を返す
<$MTSetVar  name="counterA" value="10"$> → counterAの初期値に10を設定
<$MTEnumVar name="counterA"$> → 11を返す
<$MTEnumVar name="counterA"$> → 12を返す
<$MTGetVar  name="counterA"$> → couterAの値を取り出す(12を返す)

だいたい分かってきたと思いますが、MTSetVarやMTGetVarで値を格納・取り出しする領域と、MTEnumVarが値を取り出して1加えて格納し直す領域は共通になっています。単純ですが、想像力を働かせて使ってください。

私がなぜこのプラグインを作ったのかと言うと、それはinput要素などに振るtabindex属性のせいです。このtabindex属性はHTML 4.01/XHTML 1.0/1.1的には必須ではありませんが、アクセシビリティ的には必要なようです。

ようですが。一般的には特定の要素のtabindex属性の値がいくつになるのかというのは、よほど慎重に考えてテンプレートを設計しないと決まりません。論理的な構造から定まるべきなのでしょうが、現実的には(というかアクセシビリティの実現という意味では)論理的な構造はレイアウトに左右される側面があります。例えばよくある2カラム構造で検索フォームを右カラムからトップに移動しようとした場合を想像してみるとよいでしょう。

また、コンポーネントとしての独立性を考えるなら、あらかじめ一意の値が特定のテンプレートの特定の要素に振られているべきではないという言い方もできます。Movable Typeでは複数のコンポーネント(テンプレート)を結合することができますから、結合の有無や順序によって容易にtabindexの値は変わり得ます。

要するに私は、tabindexの値を人手で管理するのは非現実的で、MTEnumVarのようなプラグインで自動化するのが筋ではないかと思うわけです。例えば、MTEnumVarを以下のように(適当ですが)使うことでtabindexを自動的に連番で振ってくれます。テンプレートがモジュール化されていても生成されるアーカイブ内で一意かつ連番のtabindexが生成されます。

<form method="post" action="...">
<fieldset>
<p>Author: <input tabindex="<$MTEnumVar name="tabindex"$>" name="author" value="" /></p>
<p>E-mail: <input tabindex="<$MTEnumVar name="tabindex"$>" name="email" value="" /></p>
<p>URL: <input tabindex="<$MTEnumVar name="tabindex"$>" name="url" value="" /></p>
<p>Comments:<br />
<textarea tabindex="<$MTEnumVar name="tabindex"$>" name="text"></textarea></p>
...
</fieldset>
</form>

Nov 18, 2004

mt-search.cgiを捨てて簡単メタサーチにしてみよう

言うまでもなく標準のmt-search.cgiは無茶苦茶遅いです。CGI起動のオーバーヘッドもありますが、検索をPerlのパターンマッチだけでやっているから遅いのです。パターンマッチと言ってもmt-search.cgiは大した機能を持っているわけではないのですから、素直に「SELECT * FROM mt_entry WHERE entry_text LIKE 'hoge%'」とか何とか適当にやってくれた方が100倍以上速いでしょう。これはもう、mod_perlだとどうこうというレベルではないです。

MT 3.1のPHP APIを使って(多分かなり頑張って拡張して)mt-search.cgiをPHPで書き直してみるというチャレンジもあり得ますが、所詮MySQLでしか使えませんし、たかがサイト内検索ですから労力に見合うリターンが期待できるとは思えません。

そういうわけでか、Google Site Searchを貼り付けている人も多いのですが、私とGoogle Searchの相性が必ずしも良くないのでわざわざ検索窓を設けても、できるのはサイト内検索で(それも万全とは言えず)、むしろページ内のアクセスの良い場所を体よく宣伝に利用されてしまっているのが現実ではないでしょうか。

そういうわけで実際の検索は止めて簡単メタサーチポータルにしてやれ、というのがこのエントリの主旨です。Google Web APIsを使ってホントにメタサーチすればいいじゃんと思ったユーは正しいです。lolipopのPEARにSOAPとSOAP_Googleが入ってからとも思いましたが、Google Web APIsを使いたい場合のことも考慮しています。

以下はレシピです。

用意する材料

作り方

  1. まず、msearch.phpsをブラウザで開いておきます(ファイルに保存するとマークアップされたHTMLファイルとして保存されてしまします)。
  2. 次にインデックス・テンプレートを一つ作ります。テンプレートの名前はお好みで、出力ファイル名はmsearch.php(拡張子はphpsではなくphp)としてください。別に他の名前でも構いません。
  3. 1. を「テンプレートの中身」にコピペした後、保存と再構築をしてください。
  4. 検索フォームのあるテンプレート(例えばメインページのテンプレート)の該当部分を以下のように編集します。
    <h2>検索</h2>
     
    <div class="link-note">
    <form method="get" action="<$MTCGIPath$><$MTSearchScript$>">
    <form method="get" action="<$MTBlogURL$>msearch.php">
    <input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />
    <label for="search" accesskey="4">サイト内の検索</label><br />
    <input id="search" name="search" size="20" /><br />
    <input type="submit" value="検索" />
    </form>
    </div>
    
  5. 保存後、再構築すれば完成です。このページの一番上に完成品の見本があります。

また、お好みでGoogle Web APIsを使った検索結果を表示に含めることができます。今私のサイトはグルグル様に嫌われていてインデックスに入っていないみたいなので、真価のほどがよく分かりません。

  1. まず、SourceForge.net: Project Info - NuSOAP - SOAP Toolkit for PHPからnusoap-0.67.zipをダウンロードしてください。
  2. ダウンロードしたZIPファイルを展開するとたくさんファイルが作られますが、libの中のnusoap.phpというファイルだけ、msearch.phpが作られるディレクトリにFTPなどを使ってアップロードしてください。
  3. 次にGoogle Web APIs - Homeの「Create Acount」でアカウントを作成します。メールでの承認が終わると32文字くらいのGoogle Web APIs license keyが送られてきます。このライセンスキーを既に持っている場合には改めてアカウントを作成する必要はありません。
  4. msearch.phpのテンプレートを編集してライセンスキーを設定します。28行目あたりを以下のように変更します。
    #define('GOOGLE_SEARCH_KEY', 'Your Google Web APIs license key');
    define('GOOGLE_SEARCH_KEY', '[送られてきたライセンスキー]');
    
  5. 保存後、再構築すれば完成です。きっとうまく行きます。祈りましょう。

よりおいしい作り方

通常のテンプレートとほとんど同じですから、Movable Typeのタグを使って自由にカスタマイズすることができます。どのように変更しても「<?php」から「?>」までを変更しない限り正常に動作するはずです。

検索サイトを追加したい場合には、「<?php」から「?>」の中で定義している$searrayという配列を変更する必要があります。例えば「その他」というカテゴリーを作って、All AboutとYahoo!知恵袋の検索機能を使いたい場合、以下のような配列を定義することになります。まあ、見よう見まねでいろいろ試してみると分かってくると思います。

  $searray["その他:"] =
    array(
      array("All About", 
            "http://allabout.co.jp/sitesearch.htm?qs={$qstring['shift_jis']}"),
      array("Yahoo!知恵袋", 
            "http://ksearch.yahoo.co.jp/search/searchresultlist.php?str={$qstring['euc-jp']}")
      );

XHTML 1.0 Strictなコメントフォーム

XHTML 1.0 Strictでは、form要素にname属性が使えません。そのname属性の代わりにid属性を使うことにしたとすると、標準のIndividual Archive Templateなどに含まれている以下のJavascriptのコードが使えなくなります。

<script type="text/javascript" language="javascript">
<!--
if (document.comments_form.email != undefined)
    document.comments_form.email.value = getCookie("mtcmtmail");
if (document.comments_form.author != undefined)
    document.comments_form.author.value = getCookie("mtcmtauth");
if (document.comments_form.url != undefined)
    document.comments_form.url.value = getCookie("mtcmthome");
if (getCookie("mtcmtauth") || getCookie("mtcmthome")) {
    document.comments_form.bakecookie[0].checked = true;
} else {
    document.comments_form.bakecookie[1].checked = true;
}
//-->
</script>

…使えなくなるわけですが、どうも勘違いしてまたgetElementByIdのオンパレードにする人(c.f., Ogawa::Buzz: Javascriptでの表示・非表示切り替え)が出てきそうなので、大流行する前に一応書いておきます。

form要素のname属性をなくすとdocument.comments_formでは参照できなくなりますが、id属性にcomments_formを指定してあればdocument.forms['comments_form']で参照できます。また、当然のことですが、input要素のname要素は廃止されておらず、nameの値を使ってformオブジェクトから参照することができます。つまり、input要素はdocument.forms['comments_form'].emailなどで参照することができます。

したがって上記のコードは以下のように修正するだけで済みます。

<script type="text/javascript">
var comments_form = document.forms['comments_form'];
if (comments_form.email != undefined)
    comments_form.email.value = getCookie("mtcmtmail");
if (comments_form.author != undefined)
    comments_form.author.value = getCookie("mtcmtauth");
if (comments_form.url != undefined)
    comments_form.url.value = getCookie("mtcmthome");
if (getCookie("mtcmtauth") || getCookie("mtcmthome")) {
    comments_form.bakecookie[0].checked = true;
} else {
    comments_form.bakecookie[1].checked = true;
}
</script>

ちなみに私自身はこのあたりはcomments.jsに分離してIndividual Entry Archiveの該当箇所には以下のようにだけ書いています。

if (document.forms['comments_form'])
    fillCommentFieldsByCookie(document.forms['comments_form']);

Nov 17, 2004

iTSCOM が地上デジタル放送OFDMパススルーを始める件について

来月から我が家でも地上デジタル放送がOFDMパススルーで観られるようになるらしい。iTSCOMはアナウンスがいつも遅いわけだが、今回は年末商戦を前に絶妙のタイミングだ。

iTSCOM.net/イッツコム | ケーブルテレビ | インフォメーション | 地上デジタル放送OFDMパススルー方式による配信開始について |

チューナーをどうするかだけど、いまだにDVDレコーダーを持っていない(ビデオデッキも持っているがテレビに接続していない)小川家的には↓のような剛毅な「マシン」を買ってハッピーになれるのだろうか。地上デジタル・BSデジタルの無料視聴可能分だけチャンネルが増えるだけであることを考えると投資額に見合わない気もする。

HITACHI:ハイビジョンHDD/DVDレコーダー DV-DH400T/DH250T/DH160T
デジタルハイビジョンレコーディング:次世代デジタルハイビジョンレコーダーDV-HRD200/DV-HRD20/DV-HRD2

それとも滅多に使うことのない録画のことなんか何にも考えずにSTB(TZ-DCH500)に突っ走るべきなのか。CATVとDVDが観られるだけで十分ハッピーなテレビライフだと思える。

しかし、STBがあると「録画」という概念はどうなってしまうのだろう。STBの録画機能を使わないという方法もあるが、テレビ側で入力を切り替えてビデオの設定をするという面倒は引き受けがたい。STBの録画機能を使うと、ビデオ側では外部入力から録画することになる。当然番組の情報をビデオデータに自動的に付与できないし、ビデオ側の凝った番組表機能とかダブルチューナー機能とか野球延長などに対する録画時間シフト機能といった最近の流行の機能はことごとく無意味になってしまう。逆にSTBにその機能があればよいということになるが、STBにそういうカスタマイゼーションは期待できないか、あるいは特定のメーカー内で閉じたネットワークシステムが必要になるだろう。

というと、東芝でもパイオニアでも日立でもシャープでもなく、松下か。

Nov 16, 2004

Google Searchとの戦いの日々

MSNサーチ(beta)なんですが、今のところメンテ作業がたびたびあるものの、実際のところ悪くないんじゃないかと思います。「ogawa」「memoranda」で検索するとこのページがトップに表示されるという意味ではむしろ良いのかもしれません。うちのサイトにも熱心にクロールに来てくれますので、全文検索をMSNサーチ(beta)に任せてもよいくらいにキャッシュされています。

正直Google Searchはもう飽きました。もう何万回検索したか分かりませんが、日常的に使い続けているせいで「もしかして」機能のようなサプライズがないとトキメキを感じられません。インデックスが多いというメリットより、デッドリンクが多いというデメリットを最近では強く感じてしまいます。80億ページとか喜んでいる場合じゃないですよ(>中の人)。何らかのロジックでデッドリンクを排除しているはずですが、有効に機能していない気配があります。

しかも(実はここからが本文)、どういうロジックなのだか、7月末(Ogawa::Buzz: 独自ドメイン取ってみました)から3ヶ月以上が経とうというのにas-is.netにはクロールに来てくれず、hassaku.main.jpに相変わらずクロールに来ます。前者へのリンク数の方が今では遥かに多いと思うのですが。また、ときどきはサイトの登録 / 削除から登録してみたりもしています。ひょっとして「as」と「is」が検索除外語だからとか変なロジックが入ってはいまいかと要らぬ憶測をしてしまうほどです。

8月初旬

当初私は「.htaccess」に↓のように書いて素朴にRedirectさせていました。

RewriteCond %{HTTP_HOST} ^(hassaku\.main\.jp)(:80)? [NC]
RewriteRule ^(.*)$ http://as-is.net/$1 [L,R=permanent]

この方法でRedirectするとURLのユニフィケーションが機能してしまって新URLへのクロールが起きないらしい話も(真偽のほどは怪しいものの)ちらほら見かけます。でもそれってロジックが逆では? とも思うのですが、でも確かに待てど暮らせどクロールに来てはくれないのでした。

9月頃

次に試してみたのは、↓みたいな感じでリダイレクト用のCGIに投げるようにするというものです。リダイレクト先ではNOFOLLOW, NOINDEXを指定したり、titleを工夫したりしてさまざまなバリエーションを試みましたが、これも駄目でした。短期間にいろいろ試しすぎたかもしれません。

RewriteCond %{HTTP_HOST} ^(hassaku\.main\.jp)(:80)? [NC]
RewriteRule ^(.*)$ http://as-is.net/redirect.cgi?$1 [L,R]

10月

そろそろ業を煮やしてきたので、↓のようにしてみました。つまり、旧URLにアクセスしてきたのは全部「403 Forbidden」です。新しいURLへの誘導もしてやりません。

RewriteCond %{HTTP_HOST} ^(hassaku\.main\.jp)(:80)? [NC]
RewriteRule ^.* - [L,F]

うちにGoogle経由で来てくれる人というのは、「検索して旧URLが引っかかり、一旦アクセスしてみたものの403 Forbiddenを食らい、さらに検索ページに戻ってキャッシュ内にあるリンクをクリックしてくれた人」というとてもとても奇特な人、ひょっとしてファンですか? ということになります。それから一月、別にas-is.netにクロールに来るでもなく、hassaku.main.jpがキャッシュから消えるでもなくという状態です。

11月16日

この状態もナニかなーと思うので、最終手段として「410 Gone」を発動してみることにしました。ただ今回は少し誘導しましょうということでErrorDocumentも設定してあります。「403 Forbidden」のときに誘導しなかったのは「アクセス禁止にも拘らず誘導する」のに意味的な矛盾を感じたからで、今回の「ここのはなくなったので誘導する」というのはむしろ自然に感じられます。

RewriteCond %{HTTP_HOST} ^(hassaku\.main\.jp)(:80)? [NC]
RewriteRule ^.* - [L,G]
 
ErrorDocument 410 /error/410.shtml

で、/error/410.shtmlの中身は↓のような感じですね。これでしばらく(今度こそ)放置しようと思います。

<html>
<head>
<title>410 Gone</title>
<meta name="ROBOTS" content="NOINDEX,NOFOLLOW">
</head>
<body>
<h1>410 Gone</h1>
<p>The requested URL was gone from this server.
The link on the referring page seems to be wrong or outdated.</p>
<p>The requested page will be found on: 
<a href="http://as-is.net<!--#echo var="REQUEST_URI" -->">
http://as-is.net<!--#echo var="REQUEST_URI" --></a></p>
<hr>
<address>as-is.net</address>
</body>
</html>

12月23日

とうとう、ErrorDocument 410 /error/410.shtmlを削除しました。hassaku.main.jp以下にアクセスするとすべて410 Goneとなり、しかも移動先も示されません。

Nov 15, 2004

Fedora Core 3 on VMware

出張中にリリースされたFedora Core 3をようやくマイThinkPadのVMwareにインストールした。

Fedora Project, sponsored by Red Hat

普通にMozilla Firefoxがインストールされているし、yum updateも勝手に近場のミラーサーバーを選択してダウンロードするようになっていたりして実用度が増している。フォントを追加インストールするくらいしかやることがなくて寂しいかぎり。

わざとらしいスクリーンショット。撮ったらすぐにinit 3するけどな。

インストールの説明を書こうかとも思ったのだが、こんな親切なページもあるこのご時勢なのだなー。

Fedora Core 3

Nov 11, 2004

The Biggest Loser

多分秋からの新番組ではないかと思うのだが、NBCのThe Biggest Loserは面白い。

NBC.com > The Biggest Loser

12人の巨デブの男女が赤チーム、青チームに分かれて減量に取り組むサバイバー型番組。毎週チームごとの減量量を計測して、負けたチームから一人脱落する。脱落者は負けチームによる公開投票により決定されるのはほぼサバイバーと同じ手続き。

なんせ巨デブが揃っているので、加藤大(加藤大 自宅まで日本縦断)のような香ばしいキャラが両チームとも2,3人は揃っている。チーム戦略的には、こういう巨デブは基本的には扱いづらい上、あっさり番組側の誘惑(ケーキの山とか)に負けてリバウンドしてしまう危険性も孕んでいるが、減量余地が大きいことからチームの勝利には欠かせない。個人戦略的には、自分の減量余地が小さくなってチーム戦略的には脱落させられそうになってもこうした巨デブをうまく手なずけて支持を取り付けておくことで、チーム内でライバル(この場合同じく減量余地の小さい、アクティビティの高い人)に対する優位を築くことができる。

…という具合で、自然に「加藤大」がキャスティングボートを握ることになるという、私のような「加藤大」ファンにはたまらない、加藤の加藤による加藤のための番組になっている。

というわけで日本でも放送してくれないか。

Nov 7, 2004

SC04 @ Pittsburgh

8年ぶりくらいでSC (SC04 Home)でPittsburghに来ています。もう以前の風景をすっかり忘れてしまいました。思えば、8年前は初めての国際会議でハイになっていたかもしれません。Station Squareの中華屋でアメリカの中華を初めて体験して「あり得ない!」と思ったのも今ではすっかり良い思い出となっています。

Ramada Plaza Suites (Ramada Plaza)に宿泊しているのですが、(所詮Ramadaじゃんと思っていたのが裏切られて)ここすごいですよ。一泊119USDなのにスイートで、キッチンも付いています。ダウンタウンにホテルの少ないPittsburghですから条件のよいカンファレンスホテルは結構な競争率で、ここも早めに申し込んで断られた人も多いようです。私は締め切りを大幅に過ぎてからガクブルしながら申し込んだのですが、大量キャンセルかリノベーションの進行とともにできた余剰部屋に割り当ててくれたみたいです。

スティーラーズの調子がやたらに良いので妙にユニフォーム姿の人が多いです。ホテルでも隣室の人が大騒ぎです。

Yahoo!スポーツ NFL - チーム ピッツバーグ・スティーラーズ
Official site of the Pittsburgh Steelers - Home Page

スティーラーズが馬鹿勝ちしていた。

一緒にはしゃいでもいいですが、土日はExhibitionの準備でいっぱい、いっぱい。

Nov 2, 2004

ダイナミック・パブリッシング時のカレンダーの不具合をアレする。

私自身は一ヶ月10エントリーが目標なのでカレンダーの表示はしていませんが、ダイナミックパブリッシングが可能になったおかげで、日別アーカイブを使うのも悪くないかなと思い始めています。

ところでMT3.11には、ダイナミックパブリッシング時のMTCalendarタグの中でMTEntryLinkタグなどを使うと不正なURLを返すというバグがあります。このエントリではこの問題点を回避する方法を述べます。

ついに抜本的な修正方法ができました!!

Ogawa::Buzz: Movable Type 3.11 日本語版・修正案の「MTArchiveLinkでarchive_typeオプションが無視される」と「MTEntryLink、MTEntryPermaLinkがアーカイブの設定によっては不正なURLを返す」がそれになります。

以下では「この修正方法を適用しないものとして」、問題点を回避する方法を述べます。

もう少し具体的な話をするために、カレンダーを生成するテンプレートを考えます。

<table class="calendar" summary="Calendar">
<tr class="calendar">
<td><$MTDate format="%B %Y"$></td>
 
<MTCalendar>
<td <MTCalendarIfToday>style="font-weight: bold"</MTCalendarIfToday>>
<MTCalendarIfEntries>
<MTEntries lastn="1">
<a href="<$MTEntryLink archive_type="Daily"$>"><$MTCalendarDay$></a>
</MTEntries>
</MTCalendarIfEntries>
<MTCalendarIfNoEntries><$MTCalendarDay$></MTCalendarIfNoEntries>
<MTCalendarIfBlank> </MTCalendarIfBlank>
</td>
</MTCalendar>
 
</tr>
</table>

…と、このようなテンプレートをよく見かけますが、こと日付アーカイブへのリンクを生成するだけであることを考えると、下のようなテンプレートにした方がよいでしょう。MTEntriesタグを使ってエントリーデータにアクセスする必要がないのでDBへのアクセスが減り、生成速度の改善が期待できます。

<MTCalendar>
<td <MTCalendarIfToday>style="font-weight: bold"</MTCalendarIfToday>>
<MTCalendarIfEntries>
<a href="<$MTArchiveLink archive_type="Daily"$>"><$MTCalendarDay$></a>
</MTCalendarIfEntries>
<MTCalendarIfNoEntries><$MTCalendarDay$></MTCalendarIfNoEntries>
<MTCalendarIfBlank> </MTCalendarIfBlank>
</td>
</MTCalendar>

さて、静的アーカイブの場合、上の2つの例ではいずれもエントリのある日付には「その日付のアーカイブ」へのリンクが生成されるはずです。が、これらのテンプレートをダイナミック・パブリッシングにすると、なぜか特定の日付のアーカイブへのリンクが生成されたり、日付アーカイブではなく月別アーカイブへのリンクが生成されたりする障害が発生します。また、日付アーカイブの代わりに月別アーカイブへのリンクを生成するようにしても同様の問題が発生します。

Ogawa::Buzz: Movable Type 3.11 日本語版・修正案で修正方法を述べていますが、こうした修正を施さないとすると何らかの回避手段を講じる必要があります。

ここで紹介するのは、直接日付アーカイブへのリンクを生成することで回避する方法です。

<MTCalendar>
<td <MTCalendarIfToday>style="font-weight: bold"</MTCalendarIfToday>>
<MTCalendarIfEntries>
<a href="<$MTBlogArchiveURL$><$MTCalendarDate format="%Y/%m/%d/index.html"$>">
<$MTCalendarDay$></a>
</MTCalendarIfEntries>
<MTCalendarIfNoEntries><$MTCalendarDay$></MTCalendarIfNoEntries>
<MTCalendarIfBlank> </MTCalendarIfBlank>
</td>
</MTCalendar>

また、MT3以前の形式のアーカイブを使っている場合には以下のように設定する必要があります。

<MTCalendar>
<td <MTCalendarIfToday>style="font-weight: bold"</MTCalendarIfToday>>
<MTCalendarIfEntries>
<a href="<$MTBlogArchiveURL$><$MTCalendarDate format="%Y_%m_%d.html"$>">
<$MTCalendarDay$></a>
</MTCalendarIfEntries>
<MTCalendarIfNoEntries><$MTCalendarDay$></MTCalendarIfNoEntries>
<MTCalendarIfBlank> </MTCalendarIfBlank>
</td>
</MTCalendar>

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

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