agenda 2002-07(上旬) 非精神的人間の反撃

サイトの更新情報は分離しました。

Web Nouveau関連雑文(CSS)

公開
2002年7月13日

IE5/Win CSSバグ

Web Nouveauデッドリンク@2002-09-24T18:59:26+09:00 CSS Forumデッドリンク@2002-09-24T19:00:05+09:00 経由で発見。

WinIE5はプロパティ中に現われるブラケット「}」を文字列として扱わず、宣言の終了と解釈してしまう、らしい。手持ちのIE6では確認できなかった。

CSSでポップアップメニュー

これは新着サイトで発見。Mozilla 1.0 RC2 or Netscape 7.0で可能、とのこと。

それにしても、CSS1とCSS2という区分があっても、それを基準に振り分ける方法が無いのは異常。理想的な「ブラウザ判別」は、CSS1完全対応ならCSS1のみ、2完全対応なら2のみを適用させる方法。

モザイク

No.784。ロシアのサイト。

うざい系と言ってしまえばそれまでだけど、ドキュメントにモザイクをかける効果はちょっと心地よかった(中央のメニューをクリック)。一瞬で変化するより、変化の動きが介在していた方がそれとわかり易いんだよなあ。

余談「777」

さすがに競争率が高かったNo.777。笑い。ちなみに倍率は12倍でした。

XMLにユーザースタイルシート適用

公開
2002年7月11日

ProxomitronのHeadersフィルタ(IN)で、text/xmlをtext/htmlにすげかえてみたところ、なんか知らんがWinIE(6.0)はXMLとして表示してくれる。

IEのこの奇妙な解釈は興味深い。text/htmlでもxml宣言を見ている? じゃあXHTMLはなぜHTMLとして表示されるのか。なにを見てHTMLだと判断するのか……。

ともかく、XMLにユーザースタイルシート(ユーザーXSL?)を使える。RSSな更新情報を一貫したHTMLに変換すれば、埋め込みJavaScriptによるDOM操作で自分寄りのユーザビリティも追求できる、という寸法。どのサイトもThe Web KanzakiのようなXSLを使ってくれていればいいのだけど、大抵のニュースサイトだのその辺りは、RSSを人向けに提供していない。でも私としては、「不思議マークアップされたHTML + 広告 + 段組」のゴタゴタした「ぺーじ」を見るより、RSSを自分のスタイルシートで閲覧したい。90%はさらっと読み流すだけだし。

ところが IEのこの奇妙な解釈を調べてみると、HTMLとして扱うか、XMLとして扱うか、その判断基準が極めて曖昧だった。まあRSSなら確実にXMLとして扱ってくれるみたいだから良いのだけど。好奇心が。

WinIE6はXML宣言つき文書をどう扱うか

一行目にXML宣言が記述されており、かつContent-Type:text/htmlで送られてくる場合、HTMLとして表示するかXMLとして表示するかを判別するIE6の基準みたいなものを調べてみた。

文書の内容を変更してリロードするという方法を使うと、直前に表示した方法が反映されてしまうので、異なる複数の文書を用意して、ともかく色々と試した結果、どうも色々な部分を見ているとしか結論できない。

title要素があるかないかで判別されるケース

例えば、title要素があるかないかで判別されるケースを例示する。

test20020709.html
<?xml version="1.0" encoding="Shift_JIS"?>
<root>
<h1>test</h1>
</root>

title要素無しの文書はXMLとしてツリー表示された。xml宣言をみているらしい。

test20020709_with_title.html
<?xml version="1.0" encoding="Shift_JIS"?>
<root>
<title>test</title>
<h1>test</h1>
</root>

一方、title要素アリの文書はHTMLとしてデフォルトスタイルシートが適用された。

ルート要素がhtmlかどうかで判別されるケース

test20020709_with_html.html
<?xml version="1.0" encoding="Shift_JIS"?>
<html>
<h1>test</h1>
</html>

また、title要素がなくとも、ルート要素がhtmlであった場合、HTML文書として表示されるようだ(XML宣言は無視される)。

というか、別にルート要素じゃなくても、html要素があればHTML文書ということになるらしい。

test20020709_with_html2.html
<?xml version="1.0" encoding="Shift_JIS"?>
<root>
<html>
<h1>test</h1>
</html>
</root>

body要素があるかどうかで判別される場合

test20020709_with_body.html
<?xml version="1.0" encoding="Shift_JIS"?>
<root>
<body>
<h1>test</h1>
</body>
</root>

body要素があるとHTML。h1要素との組み合わせとかも影響していたりして。

まとめ?

IE6は、リソースが「Content-Type:text/html」で送られてきたとしても、xml宣言がある場合には基本的にXML文書として扱うが、title要素があったり、html要素があったり、body要素があったり、ともかく何となくHTMLッぽいと、HTML文書として扱う(なんだ、そりゃ)。

しかし、例えtitle要素があったとしても、XMLとして扱われることもある。例えばコレ。 http://www.w3.org/2000/08/w3c-synd/home.rss (英語)。この文書にはtitle要素が存在するが、ProxomitronでContent-Type:application/xmltext/htmlに改竄してgetしても、XMLとして扱われる。そういうわけで、ともかく色々な判別基準があるようだ。単純なルールに基づいているのだろうという予測は、甘かった。

ファジーなUser Agent、Ineternet Explorer6。

つっこみ

If the server-provided MIME type is either known or ambiguous, the buffer is scanned in an attempt to verify or obtain a MIME type from the actual content. If a positive match is found (one of the hard-coded tests succeeded), this MIME type is immediately returned as the final determination, overriding the server-provided MIME type (this type of behavior is necessary to identify a .gif file being sent as text/html). During scanning, it is determined if the buffer is predominantly text or binary.

Appendix A: MIME Type Detection in Internet Explorer より

どこら辺がpositiveだよ。

注意点

一度でもHTMLとして表示してしまった文書は、改めてContent-Type:text/xml などで送りなおしても、頑なにHTMLとして表示する。正しく表示させるには再起動などが必要。逆も同様。一度でもXMLとして表示してしまった文書は、ValidなXHTML文書に直したとしても頑なにXMLとして表示する。再起動などが必要。

実はあった?ベターな方法

ProxomitronのWebPageフィルタを、text/xml、application/xmlなMIME typeのリソースにも適用させる手段が見つかった。$FILTER(true)というコマンド。

このコマンドを使えばいけそうなことは分かるのだけど、使い方が分からないよ。

In = TRUE
Out = FALSE
Key = "Content-Type:Filter text/xml"
Match = "(text/xml*)\0"
Replace = "\0$FILTER(true)"

一応マッチしていることは分かるのだけど、$FILTER(true)というのが効いていない。バージョンは新しいものだし、ぐったり。

WebSpaceサービス変更(JCOM)

公開
2002年7月11日

6月26、27日のメールにてご案内しておりますが、7月10日のWebSpaceシステム構成変更作業にともない下記の影響がありますのでご注意ください。

  • ホームページ公開のURLは、下記の形式に限定されます。
    • http://members.jcom.home.ne.jp/<アカウント名>/
    http://members.home.ne.jp/<アカウント名>/ でアクセスされている場合、ホームページの参照が出来ませんので、ご注意ください。
  • FTPサーバー名が members-ftp.jcom.home.ne.jpに変更されます。
  • 「ファイルマネージャ」機能がご利用いただけなくなります。 (7月10日)

<WebSpaceシステム構成変更に伴う注意点>(JCOM@Nethomeサポート情報) より

そんなメールは届いていない。FTPサーバ名変更なんて、知らなかったら混乱していたかも知れない。

ちなみに、JCOMのUNIXサーバは、拡張子.xslのテキストファイルのMIME typeを、text/plain としてしまう。IEはtext/plainでもxml宣言を見ていたので今の今まで気づかなかった。クレームでもつけてみるか。

続続・文書構造と無関係な表題(HTML)

公開
2002年7月11日

以上を踏まえて考えると,ニールセン博士の件の文書[see User Empowerment and the Fun Factor (Alertbox July 2002) (英語)]を読むとき,我々は下記のような構造をもつ文章で構成されていると脳内補完して読んでいるのではないでしょうか。

<大見出し>User Empowerment and the Fun Factor</大見出し>
    <小見出し>Summary</小見出し>
        <p>要約文</p>
    <小見出し>The text</小見出し>
        <p>本文</p>

要約文(Web Site Watch) より

DDTさんが要約文と本文を明確に区別されたように、私も明確に区別します。本文ではないということをです。「User Empowerment and the Fun Factor」という「Chapter」の、本文ではない部分と認識します。つまりこの見出しと共に形成されるこのChapterのheaderであり、それとしてマークアップ(グループ化)可能であると思っています。そうであるなら、それが意味するのはISO-HTMLのdivnを考えると(以下略)。

その他、図などの参照されたオブジェクトの扱いについては前回も書いたように同意でして、本来XLinkでいうxlink:type="embed"をもった要素と考えても良いかと思います。そのようなオブジェクトの表題は、title属性にするのも良いかも知れません。CSSの出番。しかし純粋にメタな情報でないなら、できる限り要素にしたいところですが。

何のブロックにすべきか

じゃあ、その本質的にxlink:type="embled"をもった「要素」(分かりやすい例ではIMG要素)は何のブロックとすべきかという問題がありますが、私は野嵜さんのやっている方法が妥当だと思っているんです。

それらの「図」が複数あったなら、間違いなくul、liで列挙する形になりますが、多くの場合それは一つであり、一つであるが故にリストとしては一般に例外扱いされてしまっているに過ぎないのだと思います。

img要素であったなら間違いなくそのようにマークアップするでしょうが、私がpre要素に関してそれを見送っていたことには、2つほど理由があります。

  • CSSの調整が億劫であること
  • pre要素がブロック要素であること

2つ目の理由が主です。既に文書の中でブロックを形成しているものを「列挙」する必要性を感じません。それをやるとしたなら、このWeblogの各セクションやblockquote要素もul、liでマークアップしなければ一貫性を保てません。

しかしそれでも、本来pre要素はul、liでマークアップすべきかも知れないと思っています。つまり、pre要素は本来インライン要素なのではないかと疑っているんです。画像と「アスキーアート」は似たようなものです。

リンク(Web)

公開
2002年7月9日

[2002-06-11] 日弁連は http://www.nichibenren.or.jp/terms.html(これはリンクではありません^^;)で「リンク先は http://nichibenren.or.jp としていただきます」(これではつながらない。正しい URL は http://www.nichibenren.or.jp/),「また、リンクを張られる前に、日本弁護士連合会に以下の事項をメールで報告してください。/リンク元サイトのホームページのURL/リンク元サイトの管理者の住所及び氏名又は名称(団体の場合は代表者の氏名を含む)/担当者の氏名、電話番号及びメールアドレス」と書いている。 Slashdot.jpで馬鹿にされている。

リンクに許可は必要か より

ハイパーリンクじゃないかも知れないが、http://www.nichibenren.or.jp/terms.htmlと書けばリンクだろう(まあ馬鹿を話題にしているので用語の用法を適当に合わせたんだろうけど、相手が馬鹿だろうがなんだろうが顔文字を使ったやり方は虫唾が走る)。アドレスバーに貼り付けて「Go」だの「移動」だの「Enter」だのする手間をなくしたのがハイパーリンク。

参照が便利になっているだけなのに、「移動」だの「ジャンプ」だのといったメソッドを、イコール「リンク」と考えてしまうのが間違い。

しかし、しつこいなー私も。

いやしかし、XMLブラウザの普及が楽しみで楽しみでしかたがないよ。XPointerを利用した参照なんかは、どんな実装になるんだろう。連続しないノード集合を指定したら、「リンク」=「ジャンプ」という認識は崩壊するんじゃないの?(というか、とっとと崩壊しやがれ)

しかしその前にXHTMLの普及が怪しかったりして。願わくは大いに普及してもらいたいなあ。本当に心から楽しみにしているんだ。XPointerのWebでの実用化。まあ駄目なら駄目で、埋め込みJavaScriptを利用して個人的に楽しんでみてもいい。とはいってもまだ実験中で、XLinkの形式を利用した個人ブックマークを試しているのだけど、終点アンカーの位置が変ったりすると困るんでその辺が問題。この意味では、訂正などはすべてdel、ins要素でやってもらえるとちょっと助かる。ただ、p要素であったものをdel要素にすげかえたりするのはNGだ。判別不可能だから。マークアップ作法からしてどうかという問題は別として、やはり既存のp要素の中身をdel要素にしてもらえると有り難い。del要素の子になってしまうと、木構造レベル(階層レベル)で既存の要素の位置が変化してしまうから大変だ。逆にins要素はpタグなどで括られると困る。……以上、奇妙な異世界の話でした。

続・文書構造と無関係な表題(HTML)

公開
2002年7月8日

文書構造と無関係な表題(HTML)について、ご意見を頂いきました。

この手のコラムが書籍で節の途中で出てくるのは,視覚的・参照的効果を狙ってのものと思いますが,意味的には節の末尾に(若しくは,全く別の文章として)書かれているものと考えられます。

コラム(Web Site Watch) より

視覚的・参照的効果を狙ってのもの。その場合ならリンクにしてしまえば良いのでしょう。

参照的な意味をもっている場合

<div>
    <h1>……</h1>
    <p>文章</p>
    <div>
        <h2>……に関する注意点など</h2>
        <p>文章</p>
    </div>
    <p>文章</p>
</div>

表題されたブロックは、章や節の末尾あるいは別の独立したものとして記述し、ハイパーリンクで参照すべき。

<h1>……</h1>
<p>文章</p>
<p><a href="#note">……に関する注意点など</a>も参照。</p>
<p>文章</p>
<h2>Foot Note</h2>
<h3 id="note">……に関する注意点など</h3>
<p>文章</p>

書籍と同じようなプレゼンテーション効果は、ブラウザのリンクの柔軟な扱いに期待したいところですが、実際にはそうもいかないので、JavaScriptで代替することになるでしょうか。ブラウザのデフォルトのリンクトラバーサルをキャンセルして、その場に終点アンカーをポップアップさせるような感じです。(現時点では要素集合の指定が貧弱なので、CSSでは到底不可能ですが、同一文書内のリソース間なら、リンクに関する視覚的効果をCSSで制御できても面白そうです)

要約である場合

しかし、です。Summaryと表題されたこのブロックは、末尾に置かれたのでは無意味です。

Summary:
Designs that engage and empower users increase their enjoyment and encourage them to explore websites in-depth. Once we achieve ease of use, we'll need additional usability methods to further strengthen joy of use.

User Empowerment and the Fun Factor (Alertbox July 2002) より

まあこのブロックをblockquoteタグでマークアップするNielsen氏もアレですが、それは置いておくとして。

書籍の妙な例を持ち出した私が悪いのですが、問題にしているのは、文書構造に基づいた「見出し」ではない、「表題」をどうマークアップするかです。この例ではstrong要素になっていて、強制改行されています。このような場合、dl、dt、ddでも問題ないように思いますが、dt要素は表題を意味しませんから、legendの方がより適切なような気がしたのです。それはそれで問題がありそうなので、どうしようかなあ、と。

特に、このような「要約」という形式は今後どんどん取り入れようと思っていて、意味的にセクションの本文ではなく、ヘッダに含まれるのが妥当かと思っているのです。そうすると当然Hn要素でマークアップできませんから、代わりを模索している最中です。

ちなみに、このようなブロックの登場が文章構造的に間違っている、というのなら、tableのcaption要素を考えてみて下さい。文書中に挿入されたオブジェクトがたまたまtable要素であればそれを表題する要素をマークアップできるではありませんか。

文書構造と無関係な表題(HTML)

公開
2002年7月5日
<div>
    <h1>見出し</h1>
    <p>文章</p>
    <div>
        <h2>Note</h2>
        <p>文章</p>
    </div>
    <p>文章</p>
</div>

このNoteと表題されたブロックは、文書構造において章や節を意味するものではないが、このような形式はよく見られ、批判の的になっている。

しかし、かといってこのNoteにあたる見出し部分を見出しとしてマークアップしなければそれで良いのだろうか。例えば、The Web Kanzakiに良く登場する点線付きのブロック。

先頭に交通標識のような画像があり、alt属性に「Note:」と記述してある。The Web Kanzakiでは、このブロックは各節の末尾に置かれているので何ら問題があるとは思わないが、書籍等では多くの場合「点線等で区画されたブロック」はしばしば節などの途中に登場し、表題がついている。章番号、節番号などからは独立した表題だ。

このような、章や節などの文書構造とは無関係な表題は、なにでマークアップすれば良いのだろうか。

<div>
    <h1>見出し</h1>
    <p>文章</p>
    <dl>
        <dt>Note</dt>
        <dd>文章</dd>
    </dl>
    <p>文章</p>
</div>

このように定義リストとしてマークアップするのも何か引っかかるものがある。

<div>
    <h1>見出し</h1>
    <p>文章</p>
    <fieldset>
        <legend>Note</legend>
        <p>文章</p>
    </fieldset>
    <p>文章</p>
</div>

この方がしっくりくる。Noteが見出しであるという意図も明示できているし、fieldset要素の目的上、他の要素とはっきりとした区別がつくよう、ブラウザによって表現されるはずだ。ただ、フォームコントロールとして誤解される恐れがあるのかどうかが心配。form要素ではないのだから大丈夫だとは思うけれども。

というようなことを以前から考えていた。

form制御要素ではないので、fieldset要素は使えませんでした。行動記録でいわいさんにご指摘頂きました。

フラットなリストのグループ化(XSLT)

公開
2002年7月5日

ulタグを省略するためのテンプレート。これで、ルート要素の直下にli要素を置ける。同様にdlタグやtableタグなんかも省略できそうだ。

<xsl:template match="/child::*[1]/li">
    <xsl:if test="name(preceding-sibling::*[1]) != 'li'">
        <ul>
            <xsl:call-template name="groupListItems" />
        </ul>
    </xsl:if>
</xsl:template>

<xsl:template name="groupListItems">
    <li><xsl:apply-templates select="child::node()" /></li>
    <xsl:for-each select="following-sibling::*[1]">
        <xsl:if test="name(self::*) = 'li'">
            <xsl:call-template name="groupListItems" />
        </xsl:if>
    </xsl:for-each>
</xsl:template>

変換前:

<root-element>
    <p>文章</p>
    <li>リスト</li>
    <li>リスト</li>
    <p>文章</p>
    <ul>
        <li>リスト</li>
        <li>リスト</li>
    </ul>
</root-element>

変換後:

<root-element>
    <p>文章</p>
    <ul>
        <li>リスト</li>
        <li>リスト</li>
    </ul>
    <p>文章</p>
    <ul>
        <li>リスト</li>
        <li>リスト</li>
    </ul>
</root-element>

順序型リストだった場合はlo(List-item Ordered)要素とか何かをでっち上げて同じようにやってみようかと思ったが、素直にolタグでグループ化することにした。あまり使わないし。

xsl:call-templateで自分を呼び出す際、無限ループには気をつけなければ。この例にて、for-eachでカレントノードを変更し忘れた為無限ループをやってしまい、プロセッサを一つ再起不能にしてしまった。リブートで復活。

for-each要素が「繰り返し」だって!? 「繰り返し」としての用法しか説明していない解説って、絶対XSLTを理解してないよ。apply-templates要素だって「繰り返し」じゃん。