JavaScriptの罠
あなたは、そうとは知らずに、不自由なプログラムをあなたのコンピュータで毎日実行しているかもしれません — ウェブ・ブラウザを通じて。
自由ソフトウェアコミュニティでは、不自由なプログラムはそのユーザを虐待する、という考えがよく知られています。わたしたちの中には、プロプライエタリなソフトウェアをインストールすることを完全に拒否する人もいますし、多くの人は不自由はプログラムへの打撃だと考えます。多くのユーザは、この問題がブラウザがインストールするようにと提供するプラグインにも関係すると知っています。プラグインには自由か不自由かの違いがあるからです。
しかし、ブラウザは、ほかの不自由なプログラムを実行します。そのプログラムについて、ブラウザは、あなたに尋ねることも告げることもないのです。そのプログラムはウェブページに含まれていたり、リンクされてたりします。これらのプログラムはほとんどの場合、JavaScriptで書かれています。ほかの言語も、また、使われていますが。
JavaScript(公式にはECMAScriptと呼ばれますが、この名前はほとんど使われません)は、きれいだが本質的ではないナビゲーションや表示の機能のような、ウェブページのちょっとした装飾のために、かつては使われました。これは本当のソフトウェアとしてではなく、HTMLのマークアップの単なる拡張として考えることが可能で、これが重要な問題を構成することはありませんでした。
多くのサイトは、まだそのような方法でJavaScriptを使っていますが、いくつかのサイトでは大きな処理をする、大きなプログラムのために使っています。たとえば、Google Docsはあなたのマシンに0.5メガバイトにも及ぶJavaScriptのプログラムをダウンロードします。それは、暗黒スクリプト(Obfuscript)と呼び得る、コメントが全くなく、空白もほとんどない、メソッド名は一文字という、圧縮されたものです。改変するにはプログラムのソースコードが望むべき形態ですが、圧縮されたコードはソースコードとは言えず、このプログラムの本当のソースコードはユーザには利用可能ではありません。
JavaScriptのプログラムをロードしたときに、ブラウザは通常何も言いません。ほとんどのブラウザは、JavaScriptを完全に停止する方法を有してますが、どのブラウザでもJavaScriptのプログラムが瑣末ではない不自由のものであるかどうかをチェックできません。この問題を知っていたとしても、このようなプログラムを同定し、ブロックするのには大変な労力が必要となるでしょう。しかし、自由ソフトウェアのコミュニティでさえ、ほとんどのユーザはこの問題を知りません。ブラウザの沈黙がこの問題を隠す傾向にあるのです。
JavaScriptプログラムを自由ソフトウェアライセンスでソースコードを配布し、自由ソフトウェアとしてリリースすることは可能です。しかし、たとえプログラムのソースが利用可能でも、オリジナルの代わりにあなたの改変版を実行する簡単な方法は何もないのです。現在の自由なブラウザでは、ページから配布されたものの代わりに、あなた自身の改変したバージョンを実行する機能を提供しません。この効果はTivoizationと似たようなものです。克服するのに困難を極める、ということはありませんが。
JavaScriptはウェブサイトでユーザに送られるプログラムに使われる唯一の言語ではありません。FlashはJavaScriptの拡張された一種を通じてプログラミングをサポートします。(今後)適切な推奨をするために、Flashの問題をわたしたちは研究する必要があります。SilverlightはFlashと同様な問題を作り出すと思われます。それがより悪いのは、マイクロソフトがそれを不自由なコーデックを使うプラットフォームとして使うからです。それが通常、自由な代替コーデックとともに来るのでなければ、Silverlightの自由な代替は自由な社会のために、その仕事をなし得ないでしょう。
Javaアプレットもブラウザで実行され、同様な問題を引き起こします。一般に、どのような種類のアプレットシステムもこの種の問題を有しています。アプレットの自由な実行環境を有するということは、この問題に出くわすのに十分なところに、わたしたちを連れていってくれる、というだけです。
ウェブサイトに対して、自由な(ある人は「オープン」と言います)、すなわち、その文書が公表されていて誰もが自由に実装できる、そういったフォーマットとプロトコルだけを通じて通信することを要求する、力強い運動が発達してきました。この基準は必要ですが、ウェブページの中のプログラムの存在により、十分ではありません。JavaScriptそれ自身は、フォーマットとして自由で、ウェブサイトでJavaScriptを使うことは必ずしも悪くありません。しかし、上で検討したように、必ずしもOKでもありません。サイトがプログラムをユーザに送信するとき、文書があり障害がない言語でかかれているプログラムだというだけでは十分ではないのです。つまり、そのプログラムも自由でなければなりません。「ユーザには自由なプログラムだけが送信される」ことがウェブサイトの適切な行動の基準の部分となるべきです。
黙ったまま不自由なプログラムをロードして実行することは、「ウェブ・アプリケーション」によって引き起こされるいくつかの問題の一つです。「ウェブ・アプリケーション」という用語はユーザに送られるソフトウェアとサーバで実行されるソフトウェアの基本的な区別を無視するよう設計されています。それはブラウザで実行される特別なクライアントプログラムを指すこともありえますし、特別なサーバソフトウェアを指すこともありえます。また、特別なサーバソフトウェアと一緒に動く特別なクライアントプログラムを指すこともありえます。たとえそれらが密接に統合され単一のプログラムの部分のように構成されていたとしても、クライアント側とサーバ側では異なる倫理上の問題を引き起こします。この論説では、クライアント側のソフトウェアの問題だけを扱います。サーバの問題は別に扱っています。
実際面で、ウェブサイトの不自由なJavaScriptプログラムの問題をわたしたちはどのように扱えるでしょうか? 第一の段階は、それを実行することを避けることです。
「瑣末ではない」とは何を意味するでしょう? これは程度の問題ですから、一つの正解を探すよりも、良い結果を与える単純な基準を設計する問題です。
わたしたちの暫定的ポリシーは、以下のようなJavaScriptプログラムを瑣末ではないとします:
- AJAXのリクエストを作る、あるいは、AJAXのリクエストを作るスクリプトと一緒にロードされる。
- 外部のスクリプトを動的にロードする、あるいは、そうするスクリプトと一緒にロードされる。
- 関数かメソッドを定義し、そのどれかが外部のスクリプトを(htmlから)ロードする、あるいは、(関数かメソッドの)どれかとしてロードされる。
- プログラムを解釈せずには解析することが難しい動的なJavaScriptの構成物を使用する、あるいは、そのような構成物を使うスクリプトと一緒にロードされる。そういった構成物には、下記があります:
- eval関数を使う。
- カギ括弧記法でメソッドを呼び出す。
- あるメソッド(Obj.write, Obj.createElement, ...)でストリング・リテラル以外の構成物を使う。
JavaScriptのコードが自由かどうかをどのように伝えたらよいでしょうか? この論説の最後で、ウェブページの瑣末ではないJavaScriptのプログラムが、そのソースコードのありかを示すURLとそのライセンスを、様式化したコメントを使って提示する慣習を提案します。
最後に、自由なブラウザがウェブページで瑣末ではない不自由なJavaScriptを検出しブロックする変更を、わたしたちは必要とします。LibreJSは、あなたが訪れるページの、不自由な瑣末ではないJavaScriptを検出し、ブロックします。LibreJSはIceCatとIceWeasel(とFirefox)のアドオンです。
ブラウザのユーザには、あるページのJavaScriptの代わりに(別の)JavaScriptコードを指定する便利な機能も必要です。(指定されたコードは全体の置き換えかもしれないし、そのページの改変された自由なJavaScriptプログラムかもしれません。)Greasemonkeyがこれを行うことができるのに近いところですが、まだ足りません。なぜなら、それはプログラムが実行を開始する前に、そのページのJavaScriptのコードを改変することを保証してないからです。ローカルなプロキシを使えば動きますが、現実の解としては今、とても不便なものです。わたしたちは、信頼できる便利な解を構築する必要と、また、変更を共有するサイトを必要とします。GNUプロジェクトは、自由な変更だけに専念するサイトを推奨したいと思います。
これらの機能で、ウェブページに含まれるJavaScriptプログラムを、本当の意味で、現実的に自由とすることがなされるでしょう。そうすれば、JavaScriptはCやJavaがもはやそうではないように、わたしたちの自由の特定の障害ではなくなるでしょう。わたしたちは、不自由な瑣末ではないJavaScriptのプログラムを拒否したり、置き換えたりできるようになるでしょう。ちょうどわたしたちが通常の方法でインストールするように提供された不自由なパッケージを拒否したり、置き換えたりするように。その時、ウェブサイトに対し、そのJavaScriptを解放させる、わたしたちの運動は開始できるのです。
それまでの間、不自由なJavaScriptプログラムを実行する一つの容認できるケースがあります: ウェブサイトのオペレータに、そのサイトで自由なJavaScriptのコードとするか、削除することについて文句を言うためにです。そうするのに一時的にJavaScriptを有効とすることをためらってはなりません。しかし、その後には再度無効とするのを忘れずに。
Matt LeeとJohn Resigに、提案の基準の定義への助力に関して感謝します。また、David Parunakianにこの問題を教えてくれたことに感謝します。
Appendix A: 自由なJavaScriptプログラムをリリースする慣習
対応するソースコードのリファレンスとして、わたしたちは、下記を推奨します。
// @source:
に続いて、URLを置きます。これはGNU GPLのソースコードの配布の条件を満たします。このソースが異なるサイトにある場合、これを適切に取り扱う必要があることに注意してください。ソースコードは、プログラムが自由であるために必要です。
JavaScriptコードのライセンスをページの中に埋め込んで示すには、ライセンスを二つの注釈の形の間に置くことを推奨します:
@licstart The following is the entire license notice for the JavaScript code in this page. ... @licend The above is the entire license notice for the JavaScript code in this page.
もちろん、複数行コメントの中に、このすべてが入れられるのです。
GNU GPLは、ほかの自由ソフトウェアライセンスと同様、プログラムのソースとバイナリの両方の形態に対して、ライセンスのコピーを配布することを要請します。しかし、GNU GPLは長すぎて、JavaScriptのプログラムのページに含めるには不便となることがあります。あなたが著作権を持つコードに対しては、下記のようなライセンス告知で、この要請を除くことができます:
Copyright (C) YYYY Developer The JavaScript code in this page is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License (GNU GPL) as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The code is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU GPL for more details. As additional permission under GNU GPL version 3 section 7, you may distribute non-source (e.g., minimized or compacted) forms of that code without the copy of the GNU GPL normally required by section 4, provided you include this license notice and a URL through which recipients can access the Corresponding Source.
この問題にわたしの注意をもたらしたJaffar Rumithに感謝します。
Appendix B: 自由なJavaScriptプログラムをウェブマスタとして公開する
あなたが自由なJavaScriptソフトウェアをあなたのサイトに採用するウェブマスタである場合、それらのファイルのライセンスとソースコードについての情報を明確に一貫して公表しましょう。あなたのサイトを訪れる人が自由ソフトウェアを実行していると確認するのに役立つでしょうし、あなたがライセンスの条件に従うのにも役立つでしょう。
ライセンスを述べる一つの方法は、上記のAppendix Aで述べられています。第二の方法、JavaScriptのライセンス・ウェブ・ラベルは最小化したJavaScriptコードのライブラリに、より便利でしょう。特に、それをあなたが書いたものでないときに。