2004-10-23 アーカイブ

http://hxxk.jp/2004/10/23/

Movable Type 3.11 のサブカテゴリ機能についての所感 (3)

記事データ

投稿者

望月真琴

投稿日時

2004-10-23T22:13+09:00

タグ
概要

<MTEntries> 〜 </MTEntries> の代わりに、 <MTEntriesWithSubCategories> 〜 </MTEntriesWithSubCategories> とすることで、そのカテゴリにサブカテゴリが設定されている場合、サブカテゴリの記事も含めて表示することになります。

リプライ

2 件のリプライがあります。

記事本文

カテゴリアーカイブにサブカテゴリを表示させる

Movable Type 3.11 のサブカテゴリ機能についての所感 (2) サブカテゴリの設定の失敗例 にて、 デフォルトのテンプレートでは、ある記事にサブカテゴリのみを設定していた場合、親カテゴリのアーカイブにはその記事は含まれません と述べました。 今回は、親カテゴリを指定することなく、サブカテゴリの指定のみで親カテゴリのアーカイブに反映させるテンプレートについて書きます。

デフォルトのカテゴリアーカイブ

デフォルト・テンプレート - カテゴリーアーカイブを見ると、そのカテゴリに属する記事の内容が <MTEntries> 〜 </MTEntries> で囲まれているのがお分かりでしょうか。

テンプレート・タグ - MTEntries - category=``category name'' によると、 MTEntries テンプレート・タグに category 属性を指定することで、そのカテゴリに属する記事を表示することができるということになります。 しかし、カテゴリアーカイブはそのアーカイブ自体が属するカテゴリを内部的に持っているため、 category 属性を指定してはいけません。 ( 指定しても、再構築時にエラーとなるわけではありません。 しかし、仮にカテゴリアーカイブにて <MTEntries category="mt"> 〜 </MTEntries> といった記述をしてしまうと、全てのカテゴリにおいて <MTEntries category="Foo AND mt"> 〜 </MTEntries> と指定したことと同じになってしまうため、 mt カテゴリに属していない記事は表示されなくなってしまいます。 )

よって、カテゴリアーカイブにおける <MTEntries> 〜 </MTEntries> は、そのカテゴリに属する記事を全て表示する、ということになります。 ( category 属性以外の属性、たとえば lastn 属性などで更に絞込みをすることは可能です。 )

しかし、これはあくまでそのカテゴリのみが表示対象となるため、そのカテゴリにサブカテゴリが存在していても、サブカテゴリは別のカテゴリとして扱われ、サブカテゴリの記事は含まれません。

MTEntriesWithSubCategories テンプレート・タグ

そこで、サブカテゴリ機能の実装と共に追加されたのが、 MTEntriesWithSubCategories テンプレート・タグです。

MTEntriesWithSubCategories

サブカテゴリーを認識しているMTEntriesコンテナ・タグの代わり。 これをカテゴリー・アーカイブ・テンプレートの中でMTEntriesの代わりに使って、テンプレートにそのカテゴリーに属するサブカテゴリーの全エントリーを含めるようにします。

アトリビュート:

Category

設定されると、MTEntriesWithSubCategoriesは、カテゴリーのOR付きリストとそのすべてのサブカテゴリーにまで拡張します (例: ``Parent Category OR Sub Category 1 OR Sub Category 2 OR Sub Sub Category 3 ... '')

そのほかの引数はすべて直接MTEntriesに渡されます。

<MTEntries> 〜 </MTEntries> の代わりに、 <MTEntriesWithSubCategories> 〜 </MTEntriesWithSubCategories> とすることで、そのカテゴリにサブカテゴリが設定されている場合、サブカテゴリの記事も含めて表示することになります。

MTEntriesWithSubCategories の実例

実際に、 <MTEntriesWithSubCategories> 〜 </MTEntriesWithSubCategories> を用いたカテゴリアーカイブがどのように作られるかを示してみようと思います。

Movable Type 3.11 のサブカテゴリ機能についての所感 (2) サブカテゴリの設定の失敗例にて例に出した Template sample 3.11 default: firefox アーカイブですが、 <MTEntriesWithSubCategories> 〜 </MTEntriesWithSubCategories> を用いる前は、 extension サブカテゴリを持っているはずの firefox カテゴリアーカイブに、 extension カテゴリの記事が表示されないという状態になっていました。

そこで、 <MTEntries> 〜 </MTEntries><MTEntriesWithSubCategories> 〜 </MTEntriesWithSubCategories> に書き換えて再構築をすると、 firefox カテゴリアーカイブに、無事 extension カテゴリの記事を表示することができました。

親カテゴリにおける注意点

カテゴリの運用方法にもよると思いますが、サブカテゴリ機能を使っていると、記事が存在しない親カテゴリというものが生じることがあります。 先ほど別件で作成した、 TuneDoc を例にとってみましょう。

TuneDoc - permutation-city というカテゴリアーカイブがあります。 これはトップレベルカテゴリが favourites カテゴリであり、そのサブカテゴリである irc カテゴリの更にサブカテゴリとして存在します。 このとき、 irc カテゴリや favourites カテゴリは、サブカテゴリを総称する意味しか持っておらず、その直下には記事が配置されていません。

こういったカテゴリにおける問題点については Ogawa::Memoranda: サブカテゴリー機能について考えてみた。 - 問題点の説明に詳しく書かれてありますが、 親カテゴリーのアーカイブがそもそも生成されないという現象 が発生します。 実際に http://hxxk.jp/mt/template_sample/tunedoc/favourites/irc/http://hxxk.jp/mt/template_sample/tunedoc/favourites/ にアクセスしても、 index.php ( この場合はカテゴリアーカイブ ) が存在しないために 403 Forbidden が返されるはずです。

デフォルトのテンプレートでは、 Main Index にカテゴリが階層化された状態で表示され、記事が存在しないカテゴリについてはリンクを張らないような条件式のテンプレートタグが使われているので、あまり気にする必要はないのかもしれません。 しかし、サブカテゴリのアーカイブを表示して、そこからブラウザのアドレスバーの URI を削って上の階層を見ようとした場合、またはカテゴリアーカイブ上で上の階層へのリンクを作成した場合などに不都合が出る可能性は充分にありますので、気に留めておいた方が良いかもしれません。

なお、親カテゴリがサブカテゴリを総称する意味で存在しているのではなく、基本的に親カテゴリに記事を配置して、その中でさらにカテゴリを絞る意味でサブカテゴリが使われている場合 ( たとえば、 TuneDoc - newsTuneDoc - mass-communication の例 ) はこの問題は関係ありません。

リプライ

2 件のリプライが送られています。 この記事に対するご意見やご質問、ご感想などありましたら個別記事ページの送信フォームからお送り下さい。

2004-11-11T19:50+09:00 - http://uneri.daa.jp/weblog/archives/2004/11/1020.html < うねり。

10月20日に掲載した"記事の右肩に日付とカテゴリーを載せたんですが・・・"で困...

2005-01-09T15:19+09:00 - 使えるようで使えないサブカテゴリ < Mugifa_Net

MovableType 3.1x以降、標準装備されたサブカテゴリー機能。 「わーい、便利ー」と思ったのも束の間、壁にぶち当たってしまった。 なぜなら、※「あるカテゴリーに属するサブカテゴリにエントリが追加されたとき、その親カテゴリーにエントリーが一つもない場合、再構築さ...

RFC によるメールアドレスの local-part におけるピリオドの取り扱いについての考察

記事データ

投稿者

望月真琴

投稿日時

2004-10-23T12:28+09:00

タグ
概要

RFC 2822 における、 Some of the structured header field bodies also allow the period character (".", ASCII value 46) within runs of atext. An additional "dot-atom" token is defined for those purposes. という記述と、 If the string can be represented as a dot-atom (that is, it contains no characters other than atext characters or "." surrounded by atext characters) という記述が、 メールアドレスの@の直前にはピリオドは使ってはいけない ということの根拠になると思います。

リプライ

2 件のリプライがあります。

記事本文

よそで参考記事として出されるのは嬉しい

RFCを読まなかった携帯キャリアの罪 - Webビジネスコンサルタントのネタ帳のコメント欄にて、北村さん ( 曉に死す ) が メールアドレスに使える文字を参考記事として提示して下さっていました。 自分で活用しやすいように整理して web に記録していくので、必要とされる情報が私の記録の中にあるのならどうぞご活用ください、というのがこのサイトのスタンスです と言っているのですが、実際に活用されると非常に嬉しいものです。

メールアドレスに使える文字の補足

補足というか要点のみの抜粋ですが、 Some of the structured header field bodies also allow the period character (".", ASCII value 46) within runs of atext. An additional "dot-atom" token is defined for those purposes. ( いくつかの構造化されたヘッダフィールドボディはまた、一連のatext中ピリオド(".", アスキーコード46)が許可されている。 追加の「dot-atom」トークンがその目的で定義される。 ) という記述と、 If the string can be represented as a dot-atom (that is, it contains no characters other than atext characters or "." surrounded by atext characters) ( その文字列がdot-atomとして表現され得るならば(つまり、atextとatextに囲まれた「.」以外の文字が存在しないならば) ) という記述が、 メールアドレスの@の直前にはピリオドは使ってはいけない ということの根拠になると思います。

例を挙げて示すと、

  • "." で始まる local-part で構成されるメールアドレス ( 例 : .makoto@hxxk.jp )
  • "." で終わる local-part で構成されるメールアドレス ( 例 : makoto.@hxxk.jp )
  • "." が連続する local-part で構成されるメールアドレス ( 例 : makoto..mobile@hxxk.jp )

これらのような local-part に存在する "." は、 atextに囲まれた「.」 ではありません。

RFC 2821 ? RFC 2822 ?

RFCを読まなかった携帯キャリアの罪 - Webビジネスコンサルタントのネタ帳にて根拠として取り上げられている RFCRFC 2821 の方ですが、私は RFC 2822 の方で前項のように理解していました。 これは単純に検索で Request for Comments: 2822 - Internet Message Format を見つけただけであって、 RFC 2821 の方を読むべきなのか RFC 2822 の方を読むべきなのかはあまり気に留めていませんでした。 RFC 2822 の方も知りたい情報のみを斜め読みしただけですし。

@の直前にピリオドがある等、RFC に準拠していないアドレスを含むメッセージを送受信できないでは、

概要

この資料では、Exchange 2000 Server と Exchange Server 2003 で、インターネット メール アドレスが xxxx.@xxxxxx や xx..xx@xxxxxx のように、ピリオドがメール アドレスの最後についていたりピリオドが連続しているような RFC2821 に準拠していないアドレスを含むメールを送受信できない現象について記述しています。

原因

Exchange 2000 Server と Exchange Server 2003 の SMTP サービスは、アドレスのフォーマットが RFC2821 に準拠していない場合エラー "501 5.5.4 Invalid Address" を返します。 RFC2821 では、"@" の前の文字列をピリオド"." で区切ることを許可しておりますが、区切り文字であるピリオドや"@" 等を連続して使用することを許可しておりません。 従いまして、このようなアドレスを持ったメッセージの送受信を拒否しています。

これは Exchange 2000 Server と Exchange Server 2003 の仕様です。

と書かれてありますし、 RFC 2821 を参考にした方が良いのかもしれません。

RFC 2821 を読んでみる

Request for Comments: 2821 - Simple Mail Transfer Protocol の、メールアドレスに関する部分の記述を読んでみると、

Mailbox = Local-part "@" Domain

Local-part = Dot-string / Quoted-string
      ; MAY be case-sensitive

Dot-string = Atom *("." Atom)

Atom = 1*atext

Quoted-string = DQUOTE *qcontent DQUOTE

String = Atom / Quoted-string

と書かれてあります。 Dot-string = Atom *("." Atom) とあり、かつ Atom = 1*atext とあるため、 Dot-string = 1*atext *("." 1*atext) と読み換えて良いでしょう。

これは Request for Comments: 2822 - Internet Message Format における dot-atom-text = 1*atext *("." 1*atext) という記述と同じですので、同様に If the string can be represented as a dot-atom (that is, it contains no characters other than atext characters or "." surrounded by atext characters) であると考えて良いと思います。

ただ、私は先に Request for Comments: 2822 - Internet Message Format を読んでいたからこの根拠を持っているわけであって、 Request for Comments: 2821 - Simple Mail Transfer Protocol だけを読んでいたら分からなかったかもしれません。 dot-atom-text = 1*atext *("." 1*atext) という記述自体が、 If the string can be represented as a dot-atom (that is, it contains no characters other than atext characters or "." surrounded by atext characters) であることを表しているのならば、 Request for Comments: 2821 - Simple Mail Transfer Protocol だけでも xxxx.@xxxxxx や xx..xx@xxxxxx のように、ピリオドがメール アドレスの最後についていたりピリオドが連続している local-part は RFC 2821 に準拠していないと判断できると思いますが、この記述方法がそれを表しているかといういうことまでは私には分かりません。

リプライ

2 件のリプライが送られています。 この記事に対するご意見やご質問、ご感想などありましたら個別記事ページの送信フォームからお送り下さい。

2006-06-02T12:32+09:00 - DoCoMoの説明にある「RFCに準拠しています」はウソ < Web屋のネタ帳

NTTドコモのこのページがいつからこのように書かれているのかは知らないが、こう...

2006-11-22T15:34+09:00 - メールあれこれ RFC2821 RFC2822 < 音のない声

 なんかこう、携帯電話でE-Mailが普及してからというもの、アドレスがありえないことになってる人が多い気がする。以前Hxxk.jpさんで紹介されていたよ...

補足情報

著作、講演、制作実績など