Chrome拡張機能 “CustomBlocker” のアップデートにあたり、今までどう考えてこれを開発してきたか、今後どうするかについて書いておく。
はじめての方へ
CustomBlockerを知らない方のためにちょっと説明。そもそもユーザがそんなに多いとはいえないのでほとんどがはじめての方かも。
CustomBlockerは私の開発しているGoogle Chrome用拡張機能で、「あらゆるサイト上で、そのサイトの構造に合ったNGワードフィルタを作れる」というもの。
Chrome Web Store – CustomBlocker
![filters]()
メジャーなサイトの例なら、Twitterなら「ハッシュタグによるフィルタ」「NGワードによるフィルタ」が作れるし、Facebookなら「◯◯という言葉を含んだページ経由でシェアされた投稿は非表示」「◯◯という言葉を含んだアプリは全部非表示」というのができる。Googleなどの検索サービスで特定のドメインをフィルタするのにも使えるし、もっともっとマイナーなサイトでもそのサイトにぴったりなNGワードフィルタを作成し、利用することができる。
嫌なら見るな・嫌だから見せるな・嫌だから見ない
Webでは、暴言に心を傷めることもあれば、いいかげんな情報を垂れ流すサイトの記事を見かけて「またか」と呆れることもある。そもそも、あらゆる表現には、誰かが嫌がる可能性がある。そういう物に対して「嫌だから見せるな」「嫌なら見るな」の問答が今日もどこかで繰り広げられている。
その場合、おそらく「嫌だから見せるな」よりも「嫌なら見るな」のほうが正しい。他人に表現をやめさせてはならない。
そうすると、見る側は「嫌だから見せるな」ではなく「嫌だけど我慢する」もしくは「嫌だから見ない」を選択すべきということになる。
その「嫌だから見ない」を実現するため、さまざまな形のフィルタソフトが存在している。しかしどうしても満足がいかず、CustomBlockerを作った。
「嫌だから見ない」はどれだけ現実的か?
「嫌だから見ない」を実行しようとしたとして、それがどれくらい現実的であるかが問題になる。「嫌だから見ない」という選択のために払う犠牲が大きすぎれば、それは非現実すぎて、結局「嫌なら見るな」に対して「嫌だから見せるな」か「嫌だけど我慢する」しかなくなってしまう。
たとえば自分が気に入っているサイトがじわじわと荒れてきて、どうしても嫌なものが目に入るようになった場合。「我慢する」か? それとも「サイトの利用をやめる」か? それは究極の選択に近い。「嫌だから見ない」の代償が大きすぎる。
「特定のキーワードに反応してページ全体が非表示になる」という仕組みも、やはり辛い。
だから、サイトの構造にあわせて「最小単位」で非表示にし、「嫌だから見ない」物の「巻き添え」で見えなくなってしまうものが最小限になるような仕組みが必要なのである。
特定サイト用のフィルタリングツールはよくあるけれど
有名サイト用のフィルタリングツールはたくさんある。多くのTwitterクライアントや2ちゃんねる専用ブラウザには、「NGワード機能」がついている。また、専用クライアントという形ではなくとも、特定のサイトのためのブラウザ拡張機能やユーザスクリプト、ユーザスタイルシートが多数開発されている。
また、大手サイトほど、自前のフィルタ機能が充実している。ニコニコ動画にはコメントNG機能があるし、Twitterはユーザをブロックできるし、はてなブックマークもユーザ単位でのフィルタ機能を提供している。Facebookはフィルタ機能が豊富すぎ、使いこなせていない人のための記事がユーザ達によってたくさん書かれている。
だから、自発的にフィルタを作ってくれるようなユーザが少なかったり、フィルタ機能を充実させる余裕がない、あるいはその必要を感じていないマイナーサイトこそサポートしなければならない。そのために、そのサイト上で、そのサイトにぴったりのフィルタを、「一人で」簡単に作れる仕組みが必要である。
一人で使う
一人で使うことを想定している。誰かが作ったフィルタを共有するような機能は設けない。
それは「何かを『嫌う』という行為は日陰て一人ジメジメと行うものである」という考えがあってのことで、また、「ワンクリックで広告フィルタを共有できるようなソフトウェア」にするつもりもないからである。多くの広告は、CSSやXPathで指定すれば消せる。
また、ちょっとひねったXPathやCSSセレクタを共有するだけで「大勢の人が嫌っているユーザを非表示にするフィルタ」「大多数がうざいと思っているサイトを視界から消すフィルタ」ができてしまったりする。そういう使い方をするソフトじゃないんだよと開発者が主張したところで、共有機能を設けたりしたらあまり幸せな使い方はされないと思う。
やるとしたら、せいぜい「お手本」として、twitterのハッシュタグフィルタやFacebook用のコメントフィルタなどをプリセットとして入れておく程度にする。
要件
ここまでで決まる要件は
- 特定のサイトで特定の箇所を非表示にできる。どこを非表示にするかはユーザ個人が指定する
- NGワード機能がある
- 「巻き添え」で消される部分を最小限にするため、非表示にする最小単位 (コメント、タグ、ツイート) を任意に決定できる
- さらに、「その要素の中のどの部分にNGワードが含まれていたら発動」という条件まで指定できるようにしたい。それができないと、「誤爆」による非表示が多発してしまう
- フィルタはすべてユーザが自力で作る
誰でも使えるように
この要件を実現しようとすると、どうしてもXPathやらCSSセレクタやらを使い、各サイトに合わせたフィルタを作らなければならない。
XPathやCSSセレクタを直書きして使うようなツールは、ユーザスクリプトやユーザスタイルシートとしていくつか見かけたが、どうしてもコンピュータギーク向けになってしまう。
CustomBlockerを開発・メンテナンスするにあたっては、フィルタ作成のためのユーザインターフェイスや、サイトの構造を解析してセレクタの候補を提案するアルゴリズムなどを作るのにほとんどの時間を使っている。
これから
今後は、Chrome Extensionのクラウド同期APIを使って、複数デバイスでのフィルタの共有ができるようにする予定。開発当初にsqliteを使ってデータを保存するという選択をしてしまったため、クラウド同期APIへの対応は若干面倒なことになりそうだが、地道に開発する。
ユーザインターフェイスも、まだまだ簡単にする余地があると思う。まだまだ一部のユーザには「難しい」「マニア向け」と言われる。もっと簡単にしたい。