2005 年 8 月の履歴(もしくは日誌)


2005 年 8 月

8 月 23 日

hatenab の意味 / rel 属性と class 属性について

microformats であるなら,一度「意味付けと記述書式」を決め たら,それが他での使い回す事ができないと意味がありません.限定された問題を解ければ良いとはいっても,特定の問題にしか対応できないほど限定してたら駄目なのですって書きましたが,これは撤回しましょう.microformats としての仕様を考える時にぼくならどうしたいかという事であって,使い回す事ができなくて特定の問題にしか対応できないからと言ってまったくの無価値な訳ではないしね.

でも目的が「自分が使っているサービスを宣言」するためであれば,yohei さんが使っているサービスも,ぼくが使っているサービスも同じように記述できる程度の汎用性がある記述方法を期待してしまいます.オレ専用 profile を書くよりは皆で使い回せるほうが良いですよね.

XFN では youhei さんの友達もぼくの友達も同じように rel="friend" と記述できます.ぼくの友達である susumu さんや maki さんを友達だって記述するために rel="susumu" とか rel="maki" って記述するのは良くないと思うし,それと同様に はてなブックマークを rel="hatenab" と記述するのも良くないと思うのです.XFN で rel="friend met" って書くのと同様に rel="onlinebookmark" で良いぢゃないかと.

でもいろいろ説明していただいたように rel="hatenab" って書く事でメリットがあるという主張は受け入れましょう.rel="hatenab" はダメだ間違いだというのも取り消しましょう.

でも,もっと他の方法も考えられます.

rel="hatenab" のデメリットは,新たなサービスを追加するためには profile の更新が必要だということです.ぼくは rel="onlinebookmark" といった感じでリンクの関係性を表現したうえで,hatenab のような個々のサービスを表す値は class 属性で扱うのが良いのではないかと思います.

「hatenab」は「はてなブックマーク」の事で,rel="hatenab" は「リンク先が元ページの著者のはてなブックマークへのリンク」という表現という事で話をすすめます.

rel 属性と class 属性は XHTML での定義からしたらこうですよね:

rel 属性
リンクの関係性を表現.リンクタイプを記述する.
class 属性
要素識別子としてクラス名を与える.

まず最初に yohei さんは,自分が使っているサービスを宣言したいということで rel="hatenab" という記述形式を提案しました.

<link rel="hatenab" href="http://b.hatena.ne.jp/onohiroki/"/>

これは hatenab がリンクの関連性であり,リンク先が元ページの著者のはてなブックマークへのリンクという意味ですね.

hatenab よりは,オンラインブックマークを示すような表現が良いのではないかという話で次ぎに rel="onlinebookmark hatenab" のような記述はどうかという話になりました.

<link rel="onlinebookmark hatenab" href="http://b.hatena.ne.jp/onohiroki/"/>

上のようにするのであれば onlinebookmark も hatenab もリンクの関連性を示すということですね.

たしかに a 要素や link 要素で指し示す URI に対して意味付けするなら rel 要素でリンクタイプを記述するのが自然なんです.でもリンクタイプとしてなら,オンラインブックマークというリンクタイプのほうが自然に感じます.onlinebookmark というのがリンクタイプであるというのは良いとして,hatenab は本当にリンクタイプが一番良いのでしょうか.

onlinebookmark も hatenab もリンクタイプでありリンクの関連性を示すとするのに対して onlinebookmark はリンクの関連性で hatenab は識別子だという考えからしたら下の例のほうが自然でしょう.

<link rel="onlinebookmark" class="hatenab" href="http://b.hatena.ne.jp/onohiroki/"/>

この場合は「リンク先は元ページの著者のオンラインブックマークで,そのオンラインブックマークは はてなブックマーク」という意味になると思います.

hatenab や delicious がソーシャルブックマークという概念に含まれる概念であり,クラス名という識別子であるという考えを受け入れることができるのであれば,hatenab や delicious などは識別子として class 属性に記述して rel 属性ではオンラインブックマークへのリンクという事を表現するという方法が考えられます.yohei さんの主張でも URI からオンラインサービスを識別するよりは hatenab という文字列マッチで識別したいという話でしたから,hatenab を識別子として取られることにはことさら異議がないのではないでしょうか.

yohei さんは「リンク先が元ページの著者のはてなブックマークへのリンク」と表現したかったということですが,それを「リンク先は元ページの著者のオンラインブックマークで,そのオンラインブックマークは はてなブックマーク」という表現にしてもおかしくはありません.そう考えれば hatenab は,オンラインブックマークの中のサービスの識別子であると考えられます.shckor さんはhatenab という“属性”は onlineBookmark という“属性の属性”とも言えるという表現で同様の事を書いていますね.

「リンク先は元ページの著者のオンラインブックマークで,そのオンラインブックマークは はてなブックマーク」という表現なら hatenab は class 属性に記述しても良いでしょう.他のサービスである del.icio.us が profile に定義してなかったとして class="delicious" と書いても XHTML の文法違反になりません.これはメリットだと思います.後になってから profile にそれを定義して,意味付けをすることもできます.

yohei さんは microformats では,クラス名が構造情報と対応していると説明していますが,元の規格でのメタデータの構造をクラス名に対応づけて構造化しているだけではないでしょうか.hatenab の場合は「リンク先は元ページの著者のオンラインブックマークで,そのオンラインブックマークは はてなブックマーク」と表現する時に class 属性を使って class="hatenab" という記述は妥当だと思います.

では hatenab を rel 属性にするのと,class 属性にするのとでは,どっちが良いでしょうか.

  • ありとあらゆるサービスについてもどんどん profile を更新して定義を足して行くというのが実現できていて,class 属性を使う事に異議があれば,rel 属性で hatenab と書く事になります.

  • ありとあらゆるサービスについてもどんどん profile を更新して定義を足して行くというのが実現できていて,class 属性を使う事に異議が無ければ,rel 属性でも class 属性でもどちらでも良いでしょう.

  • ありとあらゆるサービスについても,どんどん profile を更新して定義を足して行くというのが実現するのが疑わしいという立場なら,rel 属性よりは class 属性のほうが望ましいですね.

それで,実は yohei さんの話では,ありとあらゆるサービスについてどんどん profile を更新して追加するってわけでないのですよね.もちろん新しいサービスについても記述したくなったら profile に追記して更新するわけです.rel 属性を使った場合は,「自分が使っているサービスを宣言」するためには,そのサービスが profile で定義済みではなかったら記述できない訳です.ある会社がが自社のサービスの為だけに profile を作るのなら rel="hatenab" かもしれないけど,それなら del.icio.us などの他者のサービスは同じ profile の中では定義されないでしょう.第三者が profile を作るとして,はてなと del.icio.su は定義済みとして,それ以外のサービスを使っている人は,同じようなことを表現したいのに表現できないことになってしまいませんか.

だからいずれにしても rel 属性ではオンラインブックマークへのリンクであるという事を示す rel="onlinebookmark" というような表現を用意しておくのが良いと思います.これについては異論がないと思います.さらに hatenab を rel 属性の中に加えるか,それとも class 属性にするかです.

hatenab のようなのを class 属性にすることにしておくと,profile で特に定義しておきたいのは定義しておいて,それ以外は未定義でも XHTML の文法違反にはならないから,書き手が好きに書けて良いと思います.profile に未定義のサービスに対して profile に追加したくなった時に,追加すれば良いし.

でも yohei さんの話では hatenab がどうして必要なのかについては,なにかの実装で情報を抽出するために hatenab という識別子が URI とは別に必要だという事だったので,rel="onlinebookmark" としてリンクタイプが記述できていれば hatenab はどこかに記述する必要はあっても意味付けする必要は無いのではないでしょうか.

「自分が使っているサービスの宣言」を XHTML で表現し microformats で利用することまで考えた時にどのような表現にすべきかについて,ぼくの考えをまとめると:

  • rel="onlinebookmark" というような表現は必須と考えます.
  • hatenab は rel 属性でしか扱えないような内容ではないと考えます.
  • hatenab はリンクタイプというよりは,識別子(クラス名)ではないかと考えます.
  • hatenab は識別だから class 属性に属性値として記述するのが良いと考えます.
  • hatenab に識別子であるという以上の意味付けする必要は無いのかもしれないですが,必要なら profile で意味付けすることができると考えます.
  • profile に定義されていない class 属性値は,単に意味付けを profile でされていないという扱いにするのが妥当と考えます.
  • profile に定義されていない rel 属性値は,単に HTML/XHTML の仕様に反します.

profile に定義されていない rel 属性値が HTML/XHTML の仕様に反するという事については,そんなに厳密に考えなくてもいいのかもしれないけど,避ける方法があれば避けた方がより良いですよね.

ぼくなら hatenab は削除してオンラインブックマークサービスというリンクタイプだけにするでしょう.

<link rel="onlinebookmark" href="http://b.hatena.ne.jp/onohiroki/"/>

なんかの実装の都合で hatenab がやっぱり必要ってことなら,リンクタイプでなく識別子で hatenab を記述します.

<link rel="onlinebookmark" class="hatenab" href="http://b.hatena.ne.jp/onohiroki/"/>

rel="onlinebookmark hatenab" という記述がより良いという場合は,hatenab は識別子としては扱えなくて,あくまでもリンクタイプであると言う事が説明され,「リンク先は元ページの著者のオンラインブックマークで,そのオンラインブックマークは はてなブックマーク」というのは不適切で「リンク先が元ページの著者のはてなブックマークへのリンク」が適切だという説明が必要だと思います.

関連リンク

でも,まぁGRDDL でメタデータが RDF として抽出できるのであれば,他の人が同じ profile を利用する事を一切考慮しない「オレ専用 profile」を書いてオレだけの microformats って事でも良いかもしれない.

http://onohiroki.cycling.jp/tb/tb.cgi/weblog_d20050823n2 TrackBack