冬様もすなる☆日記というもの (2007年5月)

2007年5月25日

DTD は役に立たない (@00:34 +09:00)

以前 DTD は役に立たないと書きましたが、詳しく説明しろというリクエストがあったので書いてみます。

そもそも SGML の DTD の役割として、マーク最小化のために必要な情報を記述することと、文書実現値が構文的に正しいと検証するための情報を記述することの2つがあります。前者の例として、どのタグが省略できるかの指定、要素の内容モデルにおける要素の順序の記述、属性の既定値の指定、短縮参照、データタグなどがあります。また、後者としては要素の内容モデルや属性型などがあります。

ですが、現実には Web ブラウザが HTML 文書を読み込むときにこれらの情報は使われません。 Web ブラウザは SGML とは異なる独自の方法で HTML 文書を構文解析します。そしてその結果が DTD に適合するかも検証しません。これまでそうであっただけではなく、これからもそうです*1 。 Web ブラウザに対して、あるいは Web ブラウザの利用者に対して DTD は何の利益も提供しません。

唯一 W3C Markup Validation Service は DTD を使っています。文書の妥当性を検証したい著者にとってはある程度の利益を得られるかもしれません。ですが、それも有害だという意見もあります。 blockquote が引用であるかどうかのような意味的な正しさを検証できないのはどうにもできませんが、機械的に判断できるはずの要件すらすべてを検証できていないからです。 HTML4 ではブロック水準要素の子である ins 要素の子にブロック水準要素が来ることはできませんが、この条件が満たされているかは検証されません。 style 属性を使うときは Content-Style-Type の指定が必要ですが、これも検証されません*2 。これは単に W3C の Validator が劣っているのではなく、 DTD の表現力自体に問題があります。にも関わらず、 DTD の妥当性検証を通過しただけで HTML 文書が正しいかのような誤解を与えています。

まとめますと、 DTD は実際のところ使われていないし、使おうにも能力不足なので、役に立たないということになります。ちなみに、 HTML 文書の正しさを調べたいなら Another HTML-lint のほうがよほど有用です。

  1. 構文解析の方法を変えると既存の文書との互換性が失われるからです。
  2. こちらの例は W3C Markup Validation Service 自体が違反しています。

Re: DTD は役に立たない (@09:21 +09:00)

少し補足いたしますと、 HTML4 までは HTML は SGML 応用であるとかいう現実と乖離しまくった建前がありましたので、どうしても形式的に DTD が必要でした*1 。しかし HTML5 が SGML を捨てることが事実上確定していますので、もはや名実共に DTD は必要ありません。

以上は HTML における DTD の話で、 XML DTD は多少事情が変わってきますが、たいして役に立たないことには変わりありません*2

  1. 厳密に言えば、 Web SGML ではタグを省略しないなら DTD はなくてもいいのですが。
  2. 妥当性を検証する XML 構文解析器以外が外部実体を処理しなくてもよいこと、名前空間に対応していないこと、表現力が弱いこと (内容モデルや属性型) が主な問題です。
ご感想 (著者に直接送る)
[これは何?]

2007年5月23日

暑い (@09:14 +09:00)

今日のこの暑さはやばい。そろそろ単4電池が必要だw

ご感想 (著者に直接送る)
[これは何?]

2007年5月20日

邪教徒の空要素タグ (@00:56 +09:00)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<link/>
</head>
<body>
</body>
</html>

これW3C Markup Validation Service で妥当性検証してみると、 </head> はここでは使えないとか、 <body> はここでは使えないとか言われます。さてどうしてでしょう?

(答えを読むにはワッフルワッフルと書き込んでください)*1

  1. 実はちゃんと結果の解説に理由が書いてあります。
ご感想 (著者に直接送る)
[これは何?]

2007年5月19日

押し売り (@17:26 +09:00)

こちらの (建物の) オーナーさんが光ファイバーを導入されましたので、簡単なモデムの確認をいたしますので、オートロックの方を開けて・・・

モデムの確認って何? オーナーさんが導入したならオーナーさんにオートロックを開けてもらえば?

ご感想 (著者に直接送る)
[これは何?]

2007年5月9日

暑い (@11:01 +09:00)

  1. 今日も暑いですね。
  2. そうだ、クーラーの試運転をしよう!!!11!!11!!
  3. クーラーのリモコンに電池を入れよう (← 冬は抜いてある)。
  4. 入れたがリモコンが効かない。電池がないらしい。
  5. 二次電池じゃないか。なら充電しよう。
  6. 単三用の充電器しかない。充電したいのは単四。
  7. 念のため単三電池がリモコンに収まるか確認してみた。結果は自明。
  8. ちなみにクーラー本体にスイッチはついていない。使えない奴だ。
  9. (← 今ここ)

自販機 (@12:37 +09:00)

いつものやつが売り切れ。不愉快だw

ご感想 (著者に直接送る)
[これは何?]

2007年5月8日

天気予報通り (@20:03 +09:00)

今日は天気予報通り暑かったですね。

ご感想 (著者に直接送る)
[これは何?]

2007年5月7日

風神雷神II (@16:22 +09:00)

柵の外に野次馬が沢山いて写真を撮っていました。

ご感想 (著者に直接送る)
[これは何?]

2007年5月5日

Re: property と attribute (@12:11 +09:00)

「特性と属性は何う云うニュアンスの違いがあるの?」みたいな話になって、段々わけがわからなくなってきた。んー。

(少なくてもこの分野では) ニュアンスの違いなどないのでは、というのが今までの感想です。

ちなみに The SGML Handbook (P.152, §4.4.3) では:

An element type can have properties other than its content and generic identifier. These properties, called attributes, are defined by an attribute definition list declaration that associates an attribute definition list with the element type.

要素型が持つ特性には内容、共通識別子 (要素型名)、属性があるといっています。*1 ですが、この使い分けは一貫しておらず、同じ本の P10 (ISO 8879 Annex A) では共通識別子も属性だといっています。

  1. ただここでいう属性は専門用語、特性は非専門用語でしょう。
ご感想 (著者に直接送る)
[これは何?]

2007年5月4日

Re: XMDP (@00:21 +09:00)

propertyは何うすれば良いですか。

特性です。

Re: XMDP (@00:51 +09:00)

ただまあ、 HTML5 で profile 属性が削除されたこともありまして、 XMDP の役目は終わったのかなあと思います。 microformats の先駆けとしての XMDP の歴史的意義は大きいと思いますけどね。。。

内部部分集合を使ったときに表示されるごみを隠す (@12:35 +09:00)

いまや HTML は SGML 応用ではありませんし、 XHTML を text/html とすることも不適切となりつつありますので、極めて時代遅れではありますが。。。

text/html な文書中で文書型宣言の内部部分集合を使うと、Web ブラウザで表示させたときに、文書型宣言の末尾の ]> の部分が文字データとして表示されてしまうことがあります。例えば、

<!DOCTYPE html [<-- -->]>
は、 ]>表示されてしまいます。これは、 Web ブラウザの HTML 構文解析器が内部部分集合内の注釈宣言の最後の > で文書型宣言が閉じられたと判断するからです。

昔から内部部分集合を使っていた人はこのごみをどうしようもないと諦めてきたようですが、処理指令と注釈宣言をうまく使えば、 XHTML としても妥当であり、かつ Web ブラウザでごみが表示されることもない文書を作ることができます。 (ただし本質的に意味を持たない処理指令や注釈宣言が文書に含まれてしまいます。ごみをもってごみを制するという感じでしょうか。)

実際どうすればよいかというと簡単で、

<!DOCTYPE html [<!-- --><?a ><!-- ?>]><?a --><? ?>
のように ]> の周りを処理指令と注釈宣言で囲みます。こうすると Web ブラウザでもごみは表示されませんし、XML としても整形式になります。

暇な方はどうしてこうなるのか考えてみてくださいw

Re: 内部部分集合を使ったときに表示されるごみを隠す (@13:14 +09:00)

先の例は、 XML として整形式であり、かつ Web ブラウザでごみが表示されることもありませんが、 HTML4 の SGML 宣言を使った SGML 文書としては非妥当です (文書型宣言が終わっていません)。 SGML 応用である HTML の文書として妥当であるためにはもう一工夫必要になります*1 :

<!DOCTYPE html [<!-- --><?a ><![IGNORE[ ]><!-- ]]><? ?>]><?a --><? ?>

反則的ですがw、条件区間を使っています。 Gecko は <![ (マーク区間開始) から ]> までを無視するようなので、ダミーの ]> が入っています。

これで、 (適当な要素型宣言・属性定義並び宣言を足せば) 完全に妥当な SGML 応用である HTML の文書になります。また、依然として XML としても整形式です。手元で確認した限り、 Firefox 1.5, Opera 9, WinIE 6 のいずれでもごみは表示されません

  1. XML の pic (処理指令閉じ) は ?> ですが、 HTML4 の pic は > だからです。
ご感想 (著者に直接送る)
[これは何?]