ある属性を持つ人々にとって、はてなブックマークは、必要な情報源を巡回するための効率的なツールとなっている。もはや「はてブ」されない記事は存在しないのも同然となってしまている人もいるかもしれない。ソーシャルブックマークサービスはなにも「はてな」だけではないのだが、事実上「はてな」が独占状態にあり(少なくとも一部の分野においては)、「はてなブックマーク」でないと情報源となり得ない状況になっている。この状況はアーキテクチャ的に望ましい状態ではないと思うが、しかたない。
そういう中で一つ問題がある。情報セキュリティの話題を追いかけるには「セキュリティ」タグを見ていればよいわけだが、ここに「JVN」のエントリが出てこない。
JVNの認知度が高まらないのにはいろいろな要因があって、JVNのサイトデザインが最悪だ(ユーザビリティを何も考えていない)という問題もあり、私も研究会の席でそのような指摘をしているけれども、一向に治る気配がない。どこが悪いかは、たとえば「水無月ばけらのえび日記」の2007年4月25日のエントリでも指摘されていたが、他にもおかしいところがいっぱいある。表示されている項目の読み方が直感的でない。特に酷いと思うのは「JPCERT/CCによる脆弱性分析結果」の項目。改善の余地はいくらでもあるのに、直さないのは愛がないからだろう。使いにくいという声は読者からもっとあっていいと思う。
であるにしても、「はてなブックマーク」にJVNが現れて来ないのは異常だ。
じつは、これには技術的な原因がある。それは、JVNは「はてブ」不能にされているからだ。
たとえば、「JVN#50876069」を「はてなブックマーク」に登録する操作をして、ブックマークコメントを見ようとコメント一覧のURLにアクセスしても、「このページはまだブックマークされていません」と表示される。
これは、JVN側でファイル名に「#」が含まれているために生じている。そもそも、Webでファイル名に「#」を使うという、JVNサイト実装者のセンスのなさに呆れるところだが、それが原因でブックマークできなくなってしまうのは「はてな」側のバグであろう。
このバグのせいで、日本のセキュリティ向上がいくらか阻害されていると言ってよいかもしれない。
このバグは1年半以上前から「はてなアイデア」に登録されている。私も投票したのだが、効果なかったようで、無念だ。
直りそうにないので、発想を転換して、これを使ってブックマーク不可能なブログを作ってはどうか。
池田先生には朗報だ。「http://blog.goo.ne.jp/ikedanobuo%23/」というアドレスでブログを開設すれば望みはかなう。(もっとも、gooで「#」や「%」を含むIDは取得できないかもしれないが。)
と、これだけではナニなので、直し方を考えてみる。
こうなってしまう原因は、パーセントエンコードされたURLのデコードとエンコードをどこで行うかが、明確な方針に従って設計されておらず、場当たり的に実装されているために、ちぐはぐになって矛盾が生じてしまっているからだろう。
まず最初に決めなくてはならないのは、http://jvn.jp/jp/JVN%2350876069/index.html のブックマークコメントを見るためのURLは、次のどちらとするのかだ。
http://b.hatena.ne.jp/entry/http%3A//jvn.jp/jp/JVN%2350876069/index.html ――(A) http://b.hatena.ne.jp/entry/http%3A//jvn.jp/jp/JVN%252350876069/index.html ――(B)
普通に考えると、(B)のように「%」を「%25」にエンコードしておかないとやっかいなことになりそうなのは直感できる。
実際、はてな公式の「はてなブックマークレット」に「はてブコメント表示」というブックマークレットがあるが、その内容が、
javascript:location.href='http://b.hatena.ne.jp/entry/'+escape(location.href); ――(C)
となっているように、これは (B)の方針で設計されているように見える。しかし、たとえばWikipediaの日本語エントリ名のブックマークではそうなっていない。
http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%93%E3%83%8B%E6%95%AC%E8%AA%9E ――(D)
に対して、(C)のブックマークレットを適用すると、
http://b.hatena.ne.jp/entry/http%3A//ja.wikipedia.org/wiki/%25E3%2582%25B3%25E3%2583%25B3... ――(E)
にジャンプするが、そこは「このページはまだブックマークされていません」となっている。それなのに、このエントリは、
http://b.hatena.ne.jp/entry/http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%93%E3%83%8B%E6%95%AC%E8%AA%9E ――(F)
で閲覧でき、221 users もの人々にブックマークされている。これはどういうことかというと、はてなツールバーでは、(A)の方針になっているようで、(D)のページで「はてなツールバー」の「↑B」ボタンを押したときは、(F)のURLにジャンプするようになっている。
この時点で、少なくとも「はてブコメント表示」機能について、「はてなツールバー」と「はてなブックマークレット」のどちらかが間違っていることになる。
仮に「はてなツールバー」の方が正しい、つまり (A)の方針で設計されているのだとしよう。しかし、(A) のURLにアクセスすると図1の画面になる。
矢印部分は「%23」となっていなくてはならないのに、「#」とデコードされているのがおかしい。このリンクにジャンプすると、「Not Found The requested URL /jp/JVN was not found on this server.」となってしまう。
(A)の方針で設計されているのなら、ここはデコードしてはいけない。
しかし、ここがこうなっているのは、フラグメント識別子指定用としての「#」に配慮したためであろう。もしこの画面で(すべての)「%23」をデコードしないようにしたら、「http://……/diary/20071222.html#p01」などをブックマークしたときに、リンク先が「…….html%23p01」となり 404 Not Found になってしまう。
ここを、(A)の方針に従いつつフラグメント識別子にも配慮するとなると、エンコードされたURL中の「%23」が、フラグメント識別子用なのかそうでないのかを区別しなければならないが、一旦同じ「%23」としてエンコードされてしまうと単純には区別できそうにない。
いや、そもそも、(A)の方針であれば、フラグメント識別子用の「#」を「%23」にエンコードすることもしないようにするのが自然だ。しかし、そうすると今度は、「http://……/diary/20071222.html#p01」用のブックマークエントリのURLが、
http://b.hatena.ne.jp/entry/http%3A//.../diary/20071222.html#p01
となってしまい、「#p01」部分がブラウザ上で解釈されてしまい、サーバ側に届かない。この不具合は過去に起きたようで、idea:7628などで指摘され対処されている。これへの対処が、「#」を「%23」にエンコードする方法であるため、フラグメント識別子用の「#」とそれ以外の「%23」とが区別できなくなってしまっている。
つまり、はてはの設計方針は、(A)でも (B)でもなく、(A)' なのだ。(A) を基本としながら「#」だけは「%23」にエンコードするという方針になっているようだ。
そのため、図1の画面では、「%23」だけが特別扱いされてデコードされているのだろう。(F)のエントリのように他の「%XX」はデコードされていない。
これを直すには、(B)の設計で全体を作り直す……というのは現実的でないだろうから、(A)の方針のまま、URL中の「%23」がフラグメント識別子用なのかどうかを区別する手段を見つけ出すしかなさそうに思える。
しかし、この問題は、図1の画面におけるリンク先URLをどうするかの問題であって、「このページはまだブックマークされていません」となるのは、別の問題であり、おかしい。
実際、http://jvn.jp/jp/JVN%2350876069/index.html のページを「はてなツールバー」または「はてなブックマークレット」を用いてブックマーク登録しようとすると、そこには「2 users」と既に2名がブックマークしていると表示される(図2)。
登録自体はできているのに、ブックマークコメントを表示しようとすると、「このページはまだブックマークされていません」と図1の画面が出てしまうわけだ。
なぜこうなるのだろう? それはもしかして、こういうことではないか。データベース登録時には「JVN%23…」の方のURLをキーにして登録しているのに、コメント表示でデータベースから検索する際には「JVN#…」の方のURLをキーにしてしまっているとか。
つまり、フラグメント識別子用の「#」への配慮として図1の画面で「%23」だけ特別扱いでデコードしているところ、そのデコードをした後のURLを使ってデータベースを検索しているのではないか。
だとすれば、それは明らかなバグだ。「%23」を特別扱いしてデコードする必要があるのは、ブラウザ向けの都合であって、データベースには関係がない。(エスケープを出力直前で行わずに入力直後で行おうとする「サニタイズ脳」問題と似ている。)
フラグメント識別子かどうか区別する方法が見つからないのだとしても、とりあえず、データベースの検索部分は直すことができるのではないか。図1のリンク先が正常に機能しないにしても、コメント一覧は表示できるようになると思われる。
この話は、「変な記号使ったJVNのために修正すんの?」という話ではない。普遍的に不具合を生じさせているバグだ。たとえば、「はてな」内でも、フラグメント識別子指定付きURLのページのブックマークに対するブックマーク(メタブックマーク)ができなくなっている。
http://.../diary/20071222.html#p01 ――(G)
のブックマークページは、
http://b.hatena.ne.jp/entry/http%3A//.../diary/20071222.html%23p01 ――(H)
となるが、メタブックマークは、
http://b.hatena.ne.jp/entry/http://b.hatena.ne.jp/entry/http%3A//.../diary/20071222.html%23p01 ――(I)
となるため、ここで「このページはまだブックマークされていません」となって閲覧できない。ちなみに、(I)の画面に作られるリンク先URL(つまり(H)のURL)にある「%23」は、デコードすると誤りになる。(H)の画面では末尾の「%23」をデコードする必要があることと食い違っており、やはりフラグメント識別子かどうかの判別はそう簡単にはできそうにない。エンコード時に「#」だけ「%23」にエンコードするようにしたのが大間違いだったと言える。
他にも、「はてなツールバー v1.6.0」でも(G)のページで「↑B」を押すと、
http://b.hatena.ne.jp/entry/http://.../diary/20071222.html#p01
に移動してしまい、期待したブックマークエントリが出ないというバグもあるようだ。「:」の扱いもバラバラで「%3A」になるときもあれば「:」のままのときもあるようで、もうグダグダで調べる気がしない。
一度全体を見渡しながら「設計」をするべきではないか。
[雑記]技術的にはてなブックマークを防ぐ(もう1つの)方法 とか はてなブックマークを禁止する技術的方法:高木浩光@自宅の日記 を見てて、これらの情報は最初に誰がみつけたんだろう?と、思い、 「はてなブックマーク ブックマークされない」 で検索していたら、下記ブ..
高木浩光@自宅の日記 - はてなブックマークを禁止する技術的方法, 追記