Dec 31, 2004

今年ももう最終日なわけですが

30日朝に東京から岐阜に移動したおかげで、年末の二回の降雪をどうにか免れました。

今年のまとめ:

  • Movable Type 3周りのパッチやらカスタマイズやらでブログ界にもそれなりに貢献できました。
  • 仕事もまあぼちぼちです。年明けに締め切り×2、あります。
  • はぐれメタルの鎧×4個、揃えたところです。またーり進行しています。

今年お世話になった皆様に感謝いたします。来年もよろしく。

Dec 21, 2004

Movable Type 3.14

Movable Type 3.14英語版がリリースされました。3.121からのマイナーバージョンアップで、以下の点が新しくなっています。

Movable Type Publishing Platform: Movable Type 3.14 released

  • 事前承認が必要なコメントがポストされたときに従来は再構築していましたが、再構築しなくなりました。
  • ダイナミック・パブリッシングを使っていないときにFileInfoを作らないようになりました。結果として、mt-shrinkfinfoはお役御免になりました。
  • コメントのデフォルト設定が事前承認付きになりました。

Anil Dashに先週末パッチ(Ogawa::Buzz: A bunch of fixes for MT 3.121)を送ったところだったのですが、やはりリリースには間に合わなかったようです。まあ、future releasesでは検討してくれるでしょう。

日本語版の方は今日まとめて平田さんにメールしておきました。こっちはリリースまで多少間があるでしょうから反映されていることを期待しましょう。

Dec 20, 2004

Edyサービス登録とフィッシング

今まで大崎と汐留以外ではまったく使うことのなかったEdy。ご近所さんでも使えるようになったので、とりあえずANAのマイレージを20000マイルほどEdyに移してみた(私の場合、ANAマイレージクラブカードに付いているやつなので)。

しかし、この調子だとすぐにマイルも尽きてしまう。というのも、私は飛行マイレージは全部United Airlinesに付けていて、ANAの方に貯まるのはクレジットカードのポイントを移行したマイレージだけだからだ。私のクレジットカードは三井住友のプロパーカードなので年間最大でも40000マイルしか貯まらない。一年間のクレジットカード利用額もだいたいそれに相当する額でしかないのでANAカードにしてその制約を取っ払っても特に得るものはない。

そんなわけで、クレジットカードからもチャージできるようにしようと思ったわけだが、その手続きで大いに疑問を感じたのでここで書くことにした。ちなみにパソリ(RC-S310)は、eLIOを作って即解約することで予め入手してある。

EdyViewer2.0.1.4をインストールして起動すると、サービス登録というメニューがあって、そこからチャージ用のクレジットカードなどの情報を登録することができる。以前はもっと面倒だったはずだが(だからこそ今まで放置していた)ずいぶん簡単になったものである。

サービス登録とは?

クレジットカードをご登録(新規・変更)された場合、Edyチャージなどオンラインサービスは、ご登録申込者と登録されたクレジットカードの名義人が同一人であることの確認など、当社所定の手続きが完了した場合に限り、ご利用可能となります。(通常1週間程度かかります)なお、上記ご本人様確認に際し当社規程により、原則として、お客様に確認のお電話等をさせていただきますので、あらかじめご了承ください。また、お一人様のご登録は合計5枚(台)までの Edyカード、Edyケータイに限らせていただきます。

さてここからが本題。

「ご登録申込者と登録されたクレジットカードの名義人が同一人であることの確認」はサービス登録時に入力した電話番号を使って行われるのだが、その手続きは以下のようなものだった。

  1. Edyヘルプデスクから私に電話。本人がいなかったので、留守番電話に「03-XXXX-XXXXに電話してくれ」と入っていた。
  2. 私からEdyヘルプデスクに電話。個人認証情報として、氏名と生年月日と電話番号を応える。
  3. 一旦、電話を切る。
  4. Edyヘルプデスクから私に電話。カード情報としてカードに付記されている番号を応える。
  5. 手続き完了。

さて、問題になるのは「私」の認証をしていても「Edyヘルプデスク」の認証はしていないのだから、「Edyヘルプデスク」を騙った(電話を使った)フィッシング詐欺だった可能性がある、あるいはフィッシング詐欺ではないかという疑念を十分に抱かせる方法だった、ということである。

まず 1. の電話は名簿などから無作為にかけられる。2. でかかってきた電話でナンバーディスプレイまたは認証情報として電話番号を聞き出すことで得る。4. では 2. で得た番号に掛けなおせばよい。この一連の操作によって「氏名」と「生年月日」と「カードに付記されている番号」という個人情報を得ることができたわけだ。

この可能性を否定するには、「Edyヘルプデスク」の認証が必要である。現状顧客は「おそらくサービス登録した結果として個人確認の電話がかかってきているのだろう」という因果関係の認識によってしか、「Edyヘルプデスク」なる団体の確認を行えないが、おおよそ「確認」という呼べるほど確実性のレベルは高くない。フィッシング詐欺というのは、つまるところ、この確実性のレベルの識別を個々人にさせることの困難さに由来している。

もちろん、氏名は一部を除いて得てはいけないし(氏名と名簿から電話番号が分かる)、2. では電話番号の下4桁だけを応えさせるに留めて完全な電話番号を得てはいけない。当然、ナンバーディスプレイを使っていないことを証明する必要もあるがそれは無理なので、間違っても留守番電話に対する折り返し電話という秘匿性の低い回線を使用してはいけないし、その上で個人確認などしてはならない。

もっとましなプロトコルを考案・実装してもらいたいと強く思う。

Dec 18, 2004

大丸ピーコック三軒茶屋の杜店・その後

その後、寄せ鍋素材をゲットするべく、Edyを握り締めてもう一度行ってみた。

旭ポンズは売り切れていた。これはある意味納得できる現象なんだけど。
Wine & LiquorコーナーにChimayがないじゃん。
んーというか、全然酒がないじゃん。何これ?

おかしいと思って店員に聞いてみたところ、数日前から取り扱いを一時停止していて可能であれば年内に再開するとのこと。

どうも「一般・大型店舗酒類小売業免許」を取得せずにやっていて、取得でき次第販売を再開(正確には開始)するということらしい。ということはオープニングセール時にどうやって販売していたのかということが問題になるが、おそらく「期限付き酒類小売業免許」を取得していたと推測される。この免許は輸入酒フェアなどのために許可される期限付き免許である。つまり、オープニングセール時に国産酒が皆無だったのは意味のあることだったわけだ。

ちゃんと小売業免許を取得してくれるのは良いが、その時にはやっぱり国産ビールや発砲酒、その他の雑酒(2)にショバを奪われることになるのだろう。それはちょっと(どころではなく)悲しい。そんなのそのへんの道端にいくらでもある自販機やコンビニで買えるっての。

2004-12-24追記:

24日に行ってみたら酒復活していました。Chimayはなくなっていました。

A bunch of fixes for MT 3.121

This entry introduces a bunch of fixes for Movable Type 3.121. The following is an aggregated patch for these fixes.

MT-3.121-en_us-p01.zip

My intension of building this patch is just to fix *not-functioned* and *mal-functioned* features in Movable Type, and to make it work properly as possible. So, the patch does not include any function extensions or any arbitrary changes to the original version of Movable Type.

This patch is also applicable to Movable Type 3.14.

The patch details are shown below.

Perl Part

  1. Two "scrollbars=yes" sentenses appear in QuickPost bookmarklet.

    • lib/MT/App/CMS.pm
  2. In the comment preview page generated by mt-comments.cgi, MTIfAllowCommentHTML always becomes true.

    • lib/MT/App/Comments.pm
  3. mt_uri is hard-coded to "mt.cgi", but it should be subjected to the name of AdminScript.

    • lib/MT/App.pm
  4. MTCategoryCount in a MTSubCategories container includes the count of draft and future entries.

    • lib/MT/Template/Context.pm

PHP Part (Dynamic Publishing)

  1. MTCalendarIfToday doesn't work.

    • php/lib/block.MTCalendar.php
  2. MTArchiveLink ignores archive_type option.

    • php/lib/function.MTArchiveLink.php
  3. Auto-Link URLs doesn't work in MTCommentBody.

    • php/lib/block.MTCommentBody.php
  4. <MTInclude file="filename"> requires a filename with a full path. It is preferrable that MTInclude looks for a file relative to the local site path.

    • php/lib/function.MTInclude.php
  5. MTRemoteSignInLink and MTRemoteSignOutLink doesn't make up with a trailing slash for CGIPath.

    • php/lib/function.MTRemoteSignInLink.php
    • php/lib/function.MTRemoteSignOutLink.php
  6. MTRemoteSignInLink ignores "require comment emails" option.

    • php/lib/function.MTRemoteSignInLink.php
  7. MTEntryLink and MTPermaLink tags, whose "archive_type" options are set to Daily/Weekly/Monthly/Yearly or "Preferred Archive Type" is set to Daily/Weekly/Monthly/Yearly, output wrong URLs.

    • php/lib/mtdb_base.php
  8. MTEntriesWithSubCategories does not include entries in subcategories.

    • php/lib/mtdb_base.php
  9. MTEntries ignores the default sort_order. And when both of sort_order and recently_commented_on specified, sorting order of entries should be always "descending order" irrespective of what is specified as sort_order option.

    • php/lib/mtdb_base.php
  10. MTComments ignores the default sort_order.

    • php/lib/block.MTComments.php
    • php/lib/mtdb_base.php
  11. In date-based archives, MTEntryCategory outputs wrong categories.

    • php/lib/mtdb_base.php
  12. convert_line_breaks rule is different from static rule, especially for <dl></dl>.

    • php/lib/MTUtil.php
  13. Sanitize rule "br /" does not work.

    • php/lib/sanitize_lib.php

Dec 16, 2004

ついに終わりました。

いやー、とうとうエンディング見られましたよ、あの話題のRPG。

結構時間かかったなー。

って、もちろん、

『幻想水滸伝IV』のことですが、何か?

DQ8、始めました。(2004-12-18)

Dec 11, 2004

大丸ピーコック三軒茶屋の杜店

先週末、うちの近所のタワー型マンション(グランドメゾン三軒茶屋の杜)の一階に大丸ピーコックがオープンした。立地的には必ずしも恵まれていないし、まちBBSでは品揃えが少ないだの書かれていたのでどんなものなのか、小川家的には興味津々。

三軒茶屋の杜店オープン 大丸ピーコック

今日早速行ってみた。

結論から言うとこのスーパーは結構気に入った。駅近くのスーパーに比べて野菜が安い。ピーコックであることを考えると随分安いと言ってよい。オープニングセール中だけかもしれないが。輸入食材が多めで、一部は駅近くの店で何とか買い集めることもできなくもないが、この店のように揃えてある利便性には勝てない。あとEdyとクレジットカードが使える(小川家的にはクリティカルな要件)。

各種外国ビールもこの通り。Chimay Bleueが飲めるのは幸せー。しかし、考えてみるとDINKSの購買行動って恐ろしいね。普段は格安の発泡酒を買う一方でChimayに400円強支払うのに何の躊躇も感じないわけで…。

八尾が世界に誇る旭ポンズも普通に手に入ってしまう。

Dec 9, 2004

Ogawa::Hacks

割とどうでも良いことなのですが、Ogawa::Hacksというのを始めました。英語版のブログです。と言うのも、プラグインやハックを作ってこっち(Ogawa::Memoranda)に載せるのは良いのですが、日本語のブログしかないと、Movable Type Plugin Directoryに公開するプラグインのドキュメントや、Six Apart Professional Networkにポストするときの補足情報を格納するのにどうにも具合が良くないからです。

これから公開するプラグインは、原則として管理画面の「ドキュメント」としてOgawa::Hacksのエントリーを参照するようにします(今配布しているmt-shrinkfinfo.cgiなどはもうそうなっています)。ただし、Ogawa::Hacksのエントリーには必ず「SEE ALSO」として対応する日本語のドキュメントへのリンクを付けるようにします。

そういうわけで日本語な方々には少々ご不便をおかけしますが、よろしくお願いいたします。

Dec 7, 2004

“Edit This” Bookmarklet

唐突ですが、Editリンクを付けるのはちょっとどうかなー、ちょっとかっこ悪いかなー、と思います。わざわざexploit用の情報を公開しているようなものですから。

私はoobaさんのBookmarkletを「ちょこっと改造」したものを使っています。個別エントリーアーカイブをブラウザで開いている状態でこのBookmarkletをクリックするだけで編集画面を開くことができ、Editリンクがなくても非常に快適です。

bricklife.weblog."いま見ているエントリーを編集する Bookmarklet"

「ちょこっと改造」というのは、些細なことですが、oobaさんのバージョンのままだと「個別エントリーアーカイブ」以外を開いているときに実行するとエラーになる(エラー時のアクションは処理系依存なのでブラウザによっては気にならないかもしれない)のと、XHTML 1.0 Strict対応を考えてコメント用formのname属性を止めてid属性しか振っていない場合には動作しないからです。

このエントリでは「ちょこっと改造」バージョンを示します。それだけではナンですので「簡単”Edit This" Bookmarklet生成サービス」を提供することで、Editリンク撲滅を推進します。

結論から言うと、以下のようなBookmarkletにすればよいだけです(改行していますが一行です)。

javascript:d=document;f=d.comments_form||d.forms['comments_form'];if(f){id=f.entry_id.value;
location.href='http://www.example.com/mt/mt.cgi?__mode=view&_type=entry&id='+id+'&blog_id=BlogID';}

簡単に動作を説明すると、document.comments_formかdocument.forms['comments_form']があれば、formのhidden属性であるentry_idを見つけて編集画面を開きます。なければ何もしません。

上記から自力でBookmarkletを作れる方はそれでよいですが、下の「簡単”Edit This” Bookmarklet生成サービス」でも作れます。念のために申し上げておきますと、このサービス自体Javascriptを使って実現されていますので、このサービスを使ったからと言ってAdminScriptの場所が私に知れてしまうということは一切ありません。つまり、狭義には「サービス」ですらありません。

簡単”Edit This” Bookmarklet生成サービス (Movable Type 3.x用)

Edit This

使い方

  1. Admin Script URL(mt.cgiあるいはmt.cgiをリネームしたCGIのURL)とBlog IDを入力してGenerateボタンをクリックします。
  2. 「Edit This」リンクをブラウザのメニューバーなどにDrag&Dropするか、右クリックで「お気に入りに追加」するかしてBookmarkletを保存します。
  3. できあがり!自分のブログの個別エントリーアーカイブをブラウザで開いて、Edit This Bookmarkletをクリックすれば編集画面が表示されるはずです。

注意点

  • Internet ExplorerとFirefoxでしか動作確認していません。
  • このBookmarkletは、Movable Type 3.xの標準個別エントリーアーカイブテンプレートのコメントフォームの存在を前提としています。標準テンプレートを大幅に変更して、例えばテンプレートからコメントフォームを除去した場合には動作しません。HINAGATAテンプレート、小粋空間テンプレートなど代表的な配布テンプレートでは問題ありません。

簡単”Edit This” Bookmarklet生成サービス (多分ココログ用、多分TypePad系)

(ココログの場合、変更不要です)

Edit This

おまけ! ”Edit This” Bookmarklet (多分JUGEM用)

Edit This (このままDrag&Drop)

もうひとつおまけ! ”Edit This” Bookmarklet (多分livedoor Blog用)

Edit This (このままDrag&Drop)

Dec 2, 2004

最近のトラックバックをエントリごとにまとめて表示

最近のコメントをエントリごとにまとめて表示するのは、MTEntriesのrecently_commented_onオプションを使うことで簡単に実現できるのですが、トラックバックだとそうはいきません。このエントリでは、最近のトラックバックをエントリごとにまとめて表示する方法を説明します。

ここで説明する方法は、エントリの表示方法をMTEntryIDに基づいた順番だけでなく、最近トラックバックを受け取った順番(recently_commented_onに類似した順番と考えてください)などにカスタマイズ可能です。

· MTCollate Plugin、MTPingEntry PluginがPerl版しかないのでスタティック・ページにしか適用できません。
· 編集過程でテンプレートにバグが入り込んでいましたので修正しました。(2004/12/06)

徒波さんのエントリがとても参考になりました。

徒波 | MT の Recent TrackBack で連続したトラックバックをヘッダー化する方法 [要Plugin : MTCollate , MTPingedEntry]

用意するもの

どちらもプラグインファイルを<MTDIR>/pluginsにコピーするだけで使えます。MTPingEntryの方は以下のパッチを当てておくことお勧めします。理由はこのエントリの下の方に書いてあります。意味が分からなければ当てなくても構いません。下で説明するテンプレートはこのパッチを当てなくても動作するようにはしてあります。

--- PingEntry.pl.bak	2004-10-03 01:46:21.000000000 +0900
+++ PingEntry.pl	2004-12-02 20:22:40.653448144 +0900
@@ -19,6 +19,7 @@
     $ctx->stash('entry', $entry);
     $out = $builder->build($ctx, $tokens, $cond);
     $ctx->stash('entry', $saved_stash);
+    $ctx->stash('ping', $ping);
     return $ctx->error($builder->errstr) unless defined $out;
     return $out;
 }

テンプレートの記述

<MTCollateCollect>
<MTPings lastn="10">
<MTCollateRecord>
<MTCollateSetField name="ping_id"><$MTPingID$></MTCollateSetField>
<MTCollateSetField name="ping_url"><$MTPingURL$></MTCollateSetField>
<MTCollateSetField name="ping_title"><$MTPingTitle$></MTCollateSetField>
<MTCollateSetField name="ping_blog_name"><$MTPingBlogName$></MTCollateSetField>
<MTCollateSetField name="ping_date"><$MTPingDate format="%y.%m.%d"$></MTCollateSetField>
<MTPingEntry>
<MTCollateSetField name="entry_key">
<$MTEntryID$>
</MTCollateSetField>
<MTCollateSetField name="entry_link"><$MTEntryLink$></MTCollateSetField>
<MTCollateSetField name="entry_title"><$MTEntryTitle$></MTCollateSetField>
</MTPingEntry>
</MTCollateRecord>
</MTPings>
</MTCollateCollect>
 
<dl>
<MTCollateList sort="entry_key:#:- ping_id:#:+">
<MTCollateIfHeader name="entry_key">
<dt><a href="<$MTCollateField name="entry_link"$>" title="<$MTCollateField name="entry_title"
encode_html="1"$>"><$MTCollateField name="entry_title"$></a></dt>
</MTCollateIfHeader>
<dd><a href="<$MTCollateField name="ping_url"$>" title="<$MTCollateField name="ping_title"
encode_html="1"$>"><$MTCollateField name="ping_date"$> <$MTCollateField name="ping_blog_name"$></a></dd>
</MTCollateList>
</dl>

カスタマイズ

  1. 表示したいトラックバックの件数を変更するには、以下の部分を変更します。
    <MTPings lastn="10">
    
  2. エントリの表示順を降順(新しいものが上)から昇順(古いものが上)に変更したい場合には以下のように変更します。
    <MTCollateList sort="entry_key:#:+ ping_id:#:+">
    
  3. エントリごとのトラックバックの表示順を昇順(古いものが上)から降順(新しいものが上)に変更したい場合には以下のように変更します。
    <MTCollateList sort="entry_key:#:- ping_id:#:-">
    
  4. エントリの表示方法を最近トラックバックを受け取った順番(recently_commented_onに類似した順番と考えてください)にするには、以下のように変更します。
    <MTCollateSetField name="entry_key">
    <$MTEntryID$>
    <MTPings lastn="1"><$MTPingDate format="%y%m%d%H%M%S"$></MTPings>
    </MTCollateSetField>
    
    ここでやっているのは、簡単に言うとMTEntryIDの代わりに、エントリに投げられた最新のトラックバックの時刻情報(例:20041202175000)をソート用のキーとして使うということです。

補足説明

一色さんのMTPingedEntryを使っている人が多いと思うのですが、MTPingedEntryではトラックバックされたエントリに関する情報としてPermalinkとTitleしか利用できません。一方、平田さんのMTPingEntryでは、大抵のMTEntryXXXタグが使えるので柔軟なカスタマイズが可能です。おかげでMTEntryIDやMTEntryDateを基準にソートすることもできます。さらに 4. で示したように、MTPingsコンテナの中のMTPingEntryコンテナの中でMTPingsコンテナを呼び出すというトリッキーな方法を使えば、そのエントリに投げられた最新のトラックバックの時刻情報を取得して、それを基準にソートするもできます。

ただし、オリジナルのPingEntry.plを使う場合この方法は順番がとても重要です。下のように内側のMTPingsを先に使うと、外側のMTPingsのコンテキストを破壊してしまい、後でMTPingID、MTPingURLなどが正常に取り出せなくなります。上の方で載せたPingEntry.plへのパッチはこの不具合を解決するものです。

<MTCollateCollect>
<MTPings lastn="10">
<MTCollateRecord>
<MTPingEntry>
<MTCollateSetField name="entry_key">
<MTPings lastn="1"><$MTPingDate format="%y%m%d%H%M%S"$></MTPings>
</MTCollateSetField>
...
</MTPingEntry>
<MTCollateSetField name="ping_id"><$MTPingID$></MTCollateSetField>
<MTCollateSetField name="ping_url"><$MTPingURL$></MTCollateSetField>
...
</MTCollateRecord>
</MTPings>
</MTCollateCollect>

Dec 1, 2004

Movable Type 3.121 日本語版・修正案

Movable Type 3.121 日本語版でましたね。平田さんにパッチを送ったかいもあって随分採用していただけようです。3.11で比較的クリティカルだった問題は解決されています。でも最近追加した分を送っていなかったのでほんの一部積み残しになってしまいました。

Movable Type 日本語版サイト: Movable Type 3.121の提供を開始
mtchanges - Movable Typeの更新履歴

引き続き、このスレはMovable Type 3.121 日本語版の修正内容を検討していきたいと思います。

パッチをまとめてダウンロード: MT-3.121-ja-p01.zip

このパッチは無保証です。また、このパッチがSix Apartの製品に反映される場合にはその知的所有権を無償かつ無手続きにて寄贈・譲渡いたします。

ユーザーインタフェース関連の問題

  1. タイトルに「"<>」を含むサイトでクイックポストをしようとすると、不適切なHTMLが生成される。(05/01/21追加)

スタティック・ページ(Perl)関連の問題

  1. mt-comments.cgiが生成するプレビューページでMTIfAllowCommentHTMLが常に真になる。

ダイナミック・パブリッシング(PHP)関連の問題

  1. コメントの設定で「URLを自動的にリンクにする」にチェックを入れても有効にならない。
  2. 日付アーカイブでMTEntryCategoryが不正なものになる。(04/12/03更新)
  3. 「改行を変換する」がエントリーやコメントなどに設定されているとき、<dl>~</dl>まわりに余分な改行が入る。
  4. MTCommentBodyの改行ないし<br />が必ず削除されてしまう。(04/12/03追加)
  5. エントリーの設定で「エントリーの表示順」を設定しても反映されない。(04/12/04追加)
  6. コメントの設定で「コメントの表示順」を設定しても反映されない。(04/12/04追加)
  7. MTEntriesWithSubCategoriesでサブカテゴリーのエントリーが表示されない。(04/12/16)
  8. MTCalendarでcategoryオプションが無視される。(05/01/15)
  9. wordsオプションが正常に機能しない。(05/01/16)

ユーザーインタフェース関連の問題

タイトルに「"<>」を含むサイトでクイックポストをしようとすると、不適切なHTMLが生成される。

例えば「書籍 > 小説」というタイトルを持つサイトでクイックポストしようとすると生成されるHTMLは以下のようになります。

<a title="書籍 > 小説" href="...">書籍 > 小説</a>

以下のようなHTMLが生成される方が望ましいでしょう。

<a title="書籍 &gt; 小説" href="...">書籍 &gt; 小説</a>

以下の修正を行うことでこの不具合が直ります。

--- lib/MT/App/CMS.pm.bak 2004-11-12 12:43:35.000000000 +0900
+++ lib/MT/App/CMS.pm 2005-01-17 16:36:38.820235624 +0900
@@ -917,6 +917,7 @@
                     $param{selected_text} = $param{text};
                     my $enc = MT::I18N::guess_encoding($q->param('link_title') . $param{text});
                     my $bm_link_title = MT::I18N::encode_text(CGI::unescape(scalar $q->param('link_title')),$enc,undef);
+                    $bm_link_title = encode_html($bm_link_title);
                     my $bm_link_href = scalar $q->param('link_href');
                     my $bm_text = MT::I18N::encode_text(CGI::unescape($param{text}),$enc,undef);
 

スタティック・ページ(Perl)関連の問題

以下ではスタティック・ページに限らず、Movable TypeのPerlモジュールが引き起こす問題について述べます。

mt-comments.cgiが生成するプレビューページでMTIfAllowCommentHTMLが常に真になる。

コメント・プレビュー画面などmt-comments.cgiが生成するページでMTIfAllowCommentHTMLがコメントの設定に関わらず常に真になります。コメント・プレビュー、コメント・エラーなどのテンプレートでMTCommentFieldsタグを使っている場合には顕在化しません。

以下の修正を行うとこの不具合が直ります。

--- lib/MT/App/Comments.pm.bak 2004-10-19 17:36:02.000000000 +0900
+++ lib/MT/App/Comments.pm 2004-11-24 18:43:21.756357136 +0900
@@ -924,7 +924,8 @@
     }
     require MT::Blog;
     my $blog = MT::Blog->load($entry->blog_id);
-    my %cond = (IfRegistrationRequired => !$blog->allow_unreg_comments,
+    my %cond = (IfAllowCommentHTML => $blog->allow_comment_html,
+                IfRegistrationRequired => !$blog->allow_unreg_comments,
                 IfCommentsAllowed => $blog->allow_reg_comments
                                        || $blog->allow_unreg_comments,
                 IfNeedEmail => $blog->require_comment_emails);

ダイナミック・パブリッシング(PHP)関連の問題

以下ではダイナミック・パブリッシング時に発生する問題を述べています。機能の不具合やスタティック・ページとの動作の(不適切な)相違を取り上げています。

コメントの設定で「URLを自動的にリンクにする」にチェックを入れても有効にならない。

コメントの設定で「URLを自動的にリンクにする」にチェックを入れても、ダイナミック・パブリッシング時にはMTCommentBodyの生成するコメント本体に含まれるURLをリンクに変換してくれません。

以下のように修正するとよいでしょう。

--- php/lib/function.MTCommentBody.php.bak 2004-09-22 15:40:55.000000000 +0900
+++ php/lib/function.MTCommentBody.php 2004-11-20 23:34:04.530682576 +0900
@@ -4,6 +4,12 @@
     $text = $comment['comment_text'];
 
     $blog = $ctx->stash('blog');
+    if (!$blog['blog_allow_comment_html']) {
+        $text = strip_tags($text);
+        if ($blog['blog_autolink_urls']) {
+            $text = preg_replace('!(http://\S+)!', '<a href="$1">$1</a>', $text);
+        }
+    }
     $cb = $blog['blog_convert_paras_comments'];
     if ($cb == '1' || $cb == '__default__') {
         $cb = 'convert_breaks';

日付アーカイブでMTEntryCategoryが不正なものになる。

日付アーカイブでMTEntryCategoryタグ(エントリのプライマリカテゴリーの名前を返す)を使用すると、すべてのエントリのカテゴリーが同一のものになるという不具合があります。典型的にはテンプレートに以下のように書いていると不具合が確認できます。MTEntryLinkの方は正しくカテゴリーアーカイブのURLを返しますが、MTEntryCategoryは日付アーカイブの最後のエントリのプライマリカテゴリーの名前になってしまいます。

<MTEntries>
...
<a href="<$MTEntryLink archive_type="Category"$>"><$MTEntryCategory$></a>
...
</MTEntries>

以下のように修正するとよいでしょう。

--- php/lib/mtdb_base.php.bak 2004-11-08 10:52:03.000000000 +0900
+++ php/lib/mtdb_base.php 2004-12-03 20:31:00.000000000 +0900
@@ -822,9 +822,9 @@
         if (is_array($results)) {
             foreach ($results as $row) {
                 $entry_id = $row['placement_entry_id'];
-                $this->_cat_id_cache['e'.$entry_id] = &$row;
+                $this->_cat_id_cache['e'.$entry_id] = $row;
                 $cat_id = $row['category_id'];
-                $this->_cat_id_cache['c'.$cat_id] = &$row;
+                $this->_cat_id_cache['c'.$cat_id] = $row;
             }
         }
     }

「改行を変換する」がエントリやコメントなどに設定されているとき、<dl>~</dl>まわりに余分な改行が入る。

以下をエントリ本文に保存したとします。

<dl>
<dt>DDBJ</dt>
<dd>DNA Data Bank of Japan</dd>
</dl>

スタティック・ページではこのまま表示されますが、ダイナミック・パブリッシング時には以下のようにマークアップされるため余分な改行が入ります。

<p><dl><br />
<dt>DDBJ</dt><br />
<dd>DNA Data Bank of Japan</dd><br />
</dl></p>

以下の修正でスタティック・ページと同様のマークアップがなされるようになります。

--- php/lib/MTUtil.php.bak 2004-10-13 14:27:46.000000000 +0900
+++ php/lib/MTUtil.php 2004-11-29 11:41:25.099006392 +0900
@@ -513,7 +513,7 @@
         return '';
     }
     foreach ($paras as $k => $p) {
-        if (!preg_match('/^<\/?(?:h1|h2|h3|h4|h5|h6|table|ol|ul|menu|dir|p|pre|center|form|select|fieldset|blockquote|address|div|hr)/', $p)) {
+        if (!preg_match('/^<\/?(?:h1|h2|h3|h4|h5|h6|table|ol|dl|ul|menu|dir|p|pre|center|form|select|fieldset|blockquote|address|div|hr)/', $p)) {
             $p = preg_replace('/\r?\n/', "<br />\n", $p);
             $p = "<p>$p</p>";
             $paras[$k] = $p;

MTCommentBodyの改行ないし<br />が必ず削除されてしまう。

3.121からMTCommentBodyへのサニタイズチェックが有効になったことにより顕在化した問題(3.11でチェックしていなかったのがバグだったわけですが)。

コメント中の<br />がサニタイズ処理の過程で削除されてしまいます。手で記述した<br />の場合も、「改行を変換する」によって生成された<br />の場合も症状は共通です。これはサニタイズルールのパーザ部分で終了タグのないタグに関するルールが正しく解釈できないために起きています。

以下の修正でこの問題は解決します。

--- php/lib/sanitize_lib.php.bak 2004-10-20 15:43:59.000000000 +0900
+++ php/lib/sanitize_lib.php 2004-12-03 08:24:50.858524904 +0900
@@ -100,7 +100,7 @@
             }
         } else {
             if (preg_match('!/$!', $tag)) {
-                $tag = substr($tag, 0, strlen($tag) - 2);
+                $tag = substr($tag, 0, strlen($tag) - 1);
                 $style = '/';
             }
         }

エントリーの設定で「エントリーの表示順」を設定しても反映されない。

ダイナミック・パブリッシングでは、エントリーの設定で「エントリーの表示順」を設定しておいても無視されてしまい、MTEntriesにsort_orderオプションを明示的に与えない限り表示順を制御できません。また、MTEntriesにrecently_commented_onオプションをsort_orderオプションと一緒に与えた場合、後者の指定はスタティック・ページでは無視されます(リーズナブルな仕様)が、ダイナミック・パブリッシングでは無視されません。

スタティック・ページと同様の振る舞いにするためには以下の修正を行う必要があります。

--- php/lib/mtdb_base.php.bak 2004-11-08 10:52:03.000000000 +0900
+++ php/lib/mtdb_base.php 2004-12-04 08:49:41.286954000 +0900
@@ -285,10 +285,17 @@
         if (isset($args['offset'])) {
             $offset = 'offset '.intval($args['offset']);
         }
-        if (isset($args['sort_order']) && ($args['sort_order'] == 'ascend')) {
-            $order = 'asc';
-        } else {
+        if (!isset($rco)) {
             $order = 'desc';
+            if (isset($args['sort_order'])) {
+                if ($args['sort_order'] == 'ascend') {
+                    $order = 'asc';
+                }
+            } elseif (isset($blog) && isset($blog['blog_sort_order_posts'])) {
+                if ($blog['blog_sort_order_posts'] == 'ascend') {
+                    $order = 'asc';
+                }
+            }
         }
         $sort_field or $sort_field = 'entry_created_on';
         if (isset($args['sort_by'])) {

コメントの設定で「コメントの表示順」を設定しても反映されない。

ダイナミック・パブリッシングでは、コメントの設定で「コメントの表示順」を設定しておいても無視されてしまい、MTCommentsにsort_orderオプションを明示的に与えない限り表示順を制御できません。

スタティック・ページと同様の振る舞いにするためには以下の修正を行う必要があります。

--- php/lib/mtdb_base.php.bak 2004-11-08 10:52:03.000000000 +0900
+++ php/lib/mtdb_base.php 2004-12-04 08:49:41.286954000 +0900
@@ -709,12 +716,15 @@
         } else {
             $limit = '';
         }
-        $order = '';
+        $order = 'desc';
         if (isset($args['sort_order'])) {
             if ($args['sort_order'] == 'ascend') {
                 $order = 'asc';
-            } elseif ($args['sort_order'] == 'descend') {
-                $order = 'desc';
+            }
+        } elseif (isset($args['blog_id'])) {
+            $blog =& $this->fetch_blog($args['blog_id']);
+            if ($blog['blog_sort_order_comments'] == 'ascend') {
+                $order = 'asc';
             }
         }
         $comments = $this->get_results("
--- php/lib/block.MTComments.php.bak 2004-09-22 15:40:54.000000000 +0900
+++ php/lib/block.MTComments.php 2004-12-04 06:49:13.992670264 +0900
@@ -5,6 +5,7 @@
         $ctx->localize($localvars);
         $entry = $ctx->stash('entry');
         $args['entry_id'] = $entry['entry_id'];
+        $args['blog_id'] = $ctx->stash('blog_id');
         $comments = $ctx->mt->db->fetch_comments($args);
         $ctx->stash('_comments', $comments);
         $counter = 0;

MTEntriesWithSubCategoriesでサブカテゴリーのエントリーが表示されない。

カテゴリーアーカイブなどでMTEntriesWithSubCategoriesを使った場合、スタティック・ページと異なり、ダイナミック・パブリッシングではそのカテゴリーに含まれるエントリーしか表示されません(サブカテゴリーのエントリーは表示されません)。

正常に動作させるには、以下の修正を行う必要があります。

--- php/lib/mtdb_base.php.bak 2004-11-08 10:52:03.000000000 +0900
+++ php/lib/mtdb_base.php 2004-12-16 20:57:10.206545232 +0900
@@ -442,11 +449,13 @@
             if (isset($args['children'])) {
                 if (isset($this->_cat_id_cache['c'.$args['category_id']])) {
                     $cat = $this->_cat_id_cache['c'.$args['category_id']];
-                    $children = &$cat['_children'];
-                    if ($children === false) {
-                        return null;
-                    } else {
-                        return $children;
+                    if (isset($cat['_children'])) {
+                        $children = &$cat['_children'];
+                        if ($children === false) {
+                            return null;
+                        } else {
+                            return $children;
+                        }
                     }
                 }
 

MTCalendarでcategoryオプションが無視される。

MTCalendarに与えるcategoryオプションがダイナミック・パブリッシングでは実装されていないため使用できません。以下の変更でcategoryオプションが有効になります。

--- php/lib/block.MTCalendar.php.bak 2004-11-08 10:43:09.000000000 +0900
+++ php/lib/block.MTCalendar.php 2005-01-15 06:39:32.248295400 +0900
@@ -30,7 +30,7 @@
             $prefix = $today;
         }
         // gather category name...
-        $cat_name = '';
+        $cat_name = isset($args['category']) ? $args['category'] : '';
         // caching isn't necessary since we're not building
         // entire site-- just one page
         $today .= strftime("%d", time());
@@ -43,6 +43,9 @@
         $pad_end = 6 - wday_from_ts($y, $m, $days_in_month);
         $this_day = $prefix . sprintf("%02d", $day - $pad_start);
         $args = array('current_timestamp' => $start, 'current_timestamp_end' => $end, 'blog_id' => $blog_id, 'lastn' => -1, 'sort_order' => 'ascend');
+        if ($cat_name) {
+            $args['category'] = $cat_name;
+        }
         $iter = $ctx->mt->db->fetch_entries($args);
         $ctx->stash('cal_entries', $iter);
         $ctx->stash('cal_pad_start', $pad_start);

wordsオプションが正常に機能しない。

MTEntryBodyなどにwordsオプションを与えたとき、日本語版では指定した文字数分を返すべきですが、全文字列を返してしまうという問題があります。以下の修正が必要です。

--- php/lib/MTUtil.php.bak 2004-12-01 17:46:36.000000000 +0900
+++ php/lib/MTUtil.php 2005-01-15 12:00:41.359945168 +0900
@@ -592,7 +592,6 @@
 function first_n_text($text, $n) {
     $text = strip_tags($text);
     $text = preg_replace('/\r?\n/', " ", $text);
-    substr_text($text, 0, $n);
-    return $text;
+    return substr_text($text, 0, $n);
 }
 ?>

About Me

My Photo

つくばで働く研究者

Total Pageviews

Amazon

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