2012-01-30

親知らず再び

またもや親知らずのあたりの歯肉の盛り上がりが気になってきた。今日の午後、抜く手はずになってる。ああ、またひもじい思いをするのか。

前回の時は、四日間ほどゼリーしか食べられなかった。水をのむのも辛かった。おかゆや豆腐すら受け付けないとは予想外だった。

さて、レントゲンによると、私は親知らずが一本欠けているそうだ。一本はすでに抜いた。二本目も今日抜く。三本目はどうなるのだろう。今のところ、それほど問題にはなっていないが。

2012-01-25

車をダウンロードする時代

The Pirate Bay - The galaxy's most resilient bittorrent site
Pirate Bay To Offer Physical Item Downloads - Slashdot

The Pirate Bayが3Dプリンターのモデルデータ用のカテゴリーを作ったそうだ。アナウンスがぶっ飛んでいて面白い。

進化:新しいカテゴリー

我々はここThe Pirate Bayで、常に未来を見据えている。一つ確かなこととして、将来、我々の社会は、より共有をするようになるだろう。デジタル通信は共有を容易にし、これからもさらに簡単にしていくことに疑いはない。そしてインターネットの進化により、データはアナログからデジタルになった。更にここで次の一歩を進めるべきだろう。

今日、多くのデータは最初からデジタルで作られている。もはや、アナログからデジタルへの変換ではないのだ。もはや変換時の劣化を気にする必要もないのだ。なぜなら、デジタルでは一対一の完全なコピーが可能だからだ。音楽、映画、書籍等など、すべてがデジタル媒体になっている。しかし、我々は物理的な存在であり、依然として物理的な物に触れる必要がある。

思うに、コピーにおける次の進化は、デジタル媒体から物理的媒体となるだろう。これは、物理的な物体である。我々はこれを名付けて、Physiblesと呼ぶことにした。データは物質に変換可能なのだ。思うに、三次元プリンターやスキャナーは、その第一歩である。思うに、近い将来、車の交換部品を印刷できるようになっているだろう。20年もすれば、靴をダウンロードできるようになっているだろう。

この変化が社会にもたらす利益は多大である。もはや,物理的な物品を全世界に流通させる必要はなくなる。不良品の返品などといったこともなくなる。児童労働も撲滅できる。空腹ならば食物をプリントすればよい。もはや、レシピどころか料理そのものを共有できるようになるのだ。その気になれば、フロッピーを本当にコピーすることさえ可能だ。

思うに、共有の未来は、物理化可能なデータであろう。この辺で、ちょっと名前を、The Product Bayとでも変えてみるべきかもしれない。残念ながら、今、新しいロゴを作るアーティストがいない。しかし未来では、それすらダウンロードできるはずだ。(訳注:ロゴのダウンロードなのか、人間のダウンロードなのか・・・)

さっそく、海賊船の形状データへのリンクが登録されている。

3Dプリンターは非常に興味深い技術である。もちろん、今の3Dプリンターは、基本的にはインクジェットで、特殊な樹脂としてのインクを堆積させてプリントしているにすぎない。車を印刷するには、印刷後に金属と比較できるような特性を持ったインクが必要になる。靴を印刷したければ、ゴムのように変化するインクが必要になる。食べ物を印刷したければ、食べられるインクが必要になる。味や匂いを印刷したければ、もちろんそれもインクにしておかなければならない。そしてもちろん、3Dプリンターは相当の精度が要求される。

3Dプリンターはすでに現実化されているし、すでに大人のおもちゃを印刷できるほどの精度がある。木靴や下駄のようなものなら印刷できるだろう。しかし、このようなぶっ飛んだ構想を実現できる3Dプリンターが、はたして我々が生きているうちに現れるのだろうか。

MPAAの警告で、「車を盗んだりはしないだろう?」というのがあるが(そして、著作権侵害と窃盗の混同ということで叩かれているが)、果たして、車をダウンロードする時代は訪れるのだろうか。

2012-01-22

日本人が知るべき記事

Inside the Gaijin Dungeon at Narita Airport in Japan
Gulag for gaijin

事実だろうか。いかにも有りそうな話ではあるが。

追記、エコノミストに載ったので海外で色々と議論されているが、どうもこの話、100%真実かどうか怪しい。理由もなしに入国拒否を受けたと言っているが、VISAに関する情報を、弁護士と相談の上で、とか、プライバシー上の理由で(自分のWebサイトで名前も家族の名前も犬の犬種までも公開しているのに今更何のプライバシーがあるのか)とか、報道機関と独自契約を結んだからなどという理由で説明を拒んでいる。ひょっとしたら、観光客用のVISAで仕事をしていたのではないかとも言われている。

コダックモーメント

What Happened To Kodak’s Moment? | TechCrunch

コダックの131年の栄華、デジタルカメラへの取り組みの遅さ、過去の栄光を捨てきれないプライド、富士フィルムとの戦い。結局何もなくなってしまったので、過去の膨大な特許を利用して、特許ゴロに成り下がった。そして、破産回避の再建手続きに至る。コダックの歴史と経緯をかなり掘り下げて、しかも簡潔にまとめてある。

一方、富士フィルムはどうなったかというと、コダックよりだいぶマシだ。今や、液晶ディスプレイに必要なフィルムのシェアの大部分を占めているそうである。また、化粧品や健康食品にも手を出している。個人的にはあまり好きではないが、儲かることは確かだ。古典的なカメラやフィルム事業は、規模を落として細々と続けているそうだ。まあ、会社の起源というプライドから続けているのだろう。社運をかけるほどではないから、経営に影響が出るほどの赤字にもならないということだろう。

ただ、どうもこれを読んでいると、既視感を覚える。いま、日本企業は技術の分野で振るわない。デジタルカメラでコダックを打ち破ったソニーなど、今はもう落ち目だ。思うに、時代がハードウェアからソフトウェアに移行しつつあるのに、いまだにハード屋の気概が抜けてないのではないだろうか。このまま、昔のアメリカ企業と同じ轍を踏むのだろうか。

2012-01-21

2011-01 pre-Kona 2012 mailingの簡易レビュー

2011-01 pre-Kona 2012 mailingが公開された。

最新のドラフト規格はN3337になる。今回は、単なる文面の細かい修正に留まる。したがって、これを最新のC++11の規格を学ぶために参照しても、恐らく差し支えないであろう。しかし、以前にもC++標準化委員会のMLで、規格書の値段の高さを冗談めかしたコメントにて、「今後公開される無料のドラフト規格は修正を含んでいるので、現行の400ドルもする正式な規格書よりベターといえるのではないか?」という疑問も沸く。閑話休題(あだしごとはさておき)

N3322: A Preliminary Proposal for a Static if
N3329: Proposal: static if declaration

N3322とN3329の根本的な違いがわからない。なぜほとんど同じ提案のペーパーが二つ公開されたのだろうか。

コンパイル時条件分岐の提案。暫定的なキーワードとして、static_ifを使うとすると、以下のようにかける。

static_if( 条件 )
{

}
else
{

}

ifと何が違うのか。それは、条件分岐がコンパイル時に行われることである。たとえば、

template < typename T >
void f( T && t )
{
    static_if( std::is_same<T, std::vector<int>>::value )
    {
        t.push_back( 0 ) ;
    }
}

このようなコードが可能になる。従来のifでは、もし、テンプレートパラメーターTの型が、push_back(int)というメンバー関数を持っていなければ、コンパイルエラーになる。しかし、static_ifはコンパイル時に行われるので、コンパイルエラーにはならない。

これは、現在でも、テンプレートやオーバーロード解決を駆使することによって実現できる。実際、大昔のC++98においても、STLを正しく実装するためにはコンパイル時条件分岐のテクニックは必須である。であれば、最初から言語によるサポートをしたほうがよいのは当然だ。ちなみに、D言語ではネイティブでサポートされているとの由。どこからかD言語信者の勝ち誇ったかような雄叫びが聞こえてくるが、空耳であろう。

N3323: A Proposal to Tweak Certain C++ Contextual Conversions, v3

以下のコードを考える。

template< class T >
class Holder
{
public:
    Holder( ) = default ;
    Holder( T val ) : val( val ) { }
    operator T & ( ) { return val; }
    operator T ( ) const { return val; }
private:
    T val ;
} ;

まあ、よくある簡単なクラスだ。テンプレート引数の型を保持して、ユーザー定義変換で、あたかもその型のように振る舞うクラスだ。変換関数が非const版とconst版に分かれているが、これによって、オブジェクトがconstでも使えるようになる。さっそく使ってみよう。

    Holder<int *> p ;
    p = new int(0) ; // OK
    *p += 1 ; // OK
    int * pointer = p ; // OK

実に楽だ。では、使い終わったので保持しているポインターをdeleteしよう。

    delete p ; // エラー

残念ながら、これはエラーになる。なぜならば、ここではポインターへの暗黙の型変換が行われる。その際、「ポインターに暗黙に変換できる唯一の方法」を要求しているからだ。ところが、ポインターに変換する方法は二つある。よって、エラーとなる。

ではどうするか。明示的なキャストを使う方法もある。しかし、プログラマーというのは怠惰な人間なので、常に一文字でもタイプ数を減らす方法を模索するものだ。

    delete (p+0) ; // OK
    delete +p ; // OK

delete pが通らないのがバカバカしくなるコードだ。これを解決するために、TとTのリファレンス型を返す変換関数がある場合を認めようという提案。

N3324: Terminology: "indirection" versus "dereference"

規格の文面で、「ポインターを経由した間接アクセス」という意味の用語が統一されていない。そのため、すべてのdereferenceを、"indirecting through a pointer"という表現に置き換える提案。単純な置換えだが、かなり広範に渡る変更となる。

N3325: HTML for C++ Standards Documents

C++標準化委員会の公開するペーパーは、色盲やポータビリティを考慮して、HTMLにしようという提案。

ただし、主要ブラウザーがHTML5(というより、HTML5という名前自体に意味がないが)に進みつつあるなか、厳格なHTML 4.01に固執するのはどうかと思う。また、文字コードにはASCIIを使えというのも今時ありえない。第一、委員の多くが、ASCIIでは表現できない名前を持っている。したがって、作者は文字コードがASCIIだと信じていても、実はISO-8859-Xを使っていたりする。

そもそも、HTMLファイル内に、<meta http-equiv="Content-Type" content="text/html;charset=US-ASCII">などと書くのは、どのブラウザーからも機能しないと見放された太古の笑うべき仕様である。誰も正しい文字コードを指定しなかったから、信頼できないのだ。自己言及的なことに、同じく発表された、N3336が、HTMLファイル内ではWindows-1252であると主張しておきながら、"您好世界"という文字列を使っている。HTMLファイルの文字コードは、実際にはUTF-8である。こんなジョークでは何にでも笑う大阪人すら笑わせられない。

N3326: Sequential access to data members and base sub-objects

全世界の変態の皆様、特にBoost.Fusionユーザーの皆様、大変長らくおまたせ致しました。長年待ち望んでいたであろう機能の提案でございます。

unionではない任意のクラスのすべてのデータメンバーの型の一覧を、std::tupleでアクセスできる機能の提案。これさえあれば、メタプログラムがますます面白くなるだろう。

N3327: A Standard Programmatic Interface for Asynchronous Operations

非同期処理のためのライブラリの提案。

N3328: Resumable Functions

名前通り、レジュームできる関数の提案。これにより、非同期処理が実にシンプルに書ける。非同期処理のために単純なlambdaを複数書くのがめんどくさい人向け。

N3333: Hashing User-Defined Types in C++1y

C++11では、ハッシュテーブルを用いたコンテナーを追加した。unordered_setとunordered_mapである。そして、ユーザー定義型からハッシュを得るためのインターフェースも提供した。しかし、ユーザーがハッシュを実装するための補助は何もない。自分の用意したクラスをコンテナに入れたいユーザーは、自分でハッシュの算出を実装しなければならない。しかし、十分に強いハッシュ関数を実装するのは、一般人には困難である。現状を放置すれば、弱いハッシュ実装を使ったプログラムが世にあふれるであろう。そのため、ハッシュ関数の実装を助けるインターフェースを提供する提案。

この提案で用意されるのは、ひとつのプロセスがその回の実行に限り、ローカルにハッシュテーブルを構築するのに必要な強度のハッシュである。このハッシュ値は、プログラムの実行ごとに異なるものが出力される。つまり、ハッシュ値をディスクに格納して、次回の実行時に読み込んで使うということはできないし、複数のプログラムでハッシュ値を共有することもできない。また、文字列のハッシュ値を比較して、内容が一致しているかどうかを確実に確かめられるほどの強度もない。ましてや、セキュリティ上の目的でこのハッシュ値を使うことはできない。ハッシュ関数は目的毎に実装が異なり、すべての利用例をカバーしたハッシュ関数の実装が不可能なことはもちろん、ハッシュ関数のインターフェースの統一もいいアイディアではない。この提案されているハッシュ関数はあくまで、STLのコンテナに使うのに十分な強度のハッシュである。

N3334: Proposing array_ref<T> and string_ref

配列や文字列へのリファレンスというのは、現実によく使われる型である。しかし、どの型を使うかというと、定まった型がない。たとえば、std::vectorを使うことができる。しかし、何もstd::vectorにこだわる必要はない。たとえば、ポインターとその長さでもいい。文字列にしたって、std::stringのこともあれば、ポインターと長さのこともある。

もちろん、テンプレートを使って汎用的に実装することはできる。しかし、実装が複雑になり重複も生まれる。そのため、array_refというクラスを作り、どんな型でも、ある一定の操作方法さえ提供していれば、それを配列とみなして処理し、ユーザー側には統一されたインターフェースを提供しようというのが、このペーパーの提案だ。そのため、ユーザーコードは、わざわざこのような古典的な内容のために、クラスや関数自体をテンプレート化しなくてもよくなる。

N3335: Filesystem TR2 Proposal

TR2で採用する予定のFilesystemライブラリーの叩き台。Boost.Filesystem V3がベースになっている。

N3336: Adapting Standard Library Strings and I/O to a Unicode World

名前の通り、既存の文字列や入出力のライブラリーを、C++11で採用したUnicodeに対応させようという提案。TR2に採用予定。我々Unicodeに生きる日本人としては当然の変更である。

N3339: A Preliminary Proposal for a Deep-Copying Smart Pointer

unique_ptrとsmart_ptrをディープコピーできるようにする提案。ディープコピーとは、ポインターが指し示す派生関係にあるクラスの実行時のオブジェクトのコピーである。俗にクローンとも呼ばれている。

struct A { } ;
struct B : A { } ;
struct C : B {  } ;

A * get() ; // 実行時に型をnewして返す。

std::shared_ptr< A > p1( get() ) ;
std::shared_ptr< A > p2( /*ここで、p1の実行時の型のオブジェクトをnewコピー構築して渡したい*/ ) ;

p1は、実行時にA, B, Cのいずれかの型を取る。実行時に、この型のオブジェクトを何とかしてディープコピーしたい。

これらのスマートポインターは、いわゆるpimplのような実装を隠す手法に使われる。その際、ディープコピーができると嬉しい。そこで、ディープコピーを補助するためのインターフェースの叩き台を提案している。

N3340: Rich Pointers

コンパイラーの支援により強力なRTTIを提供するrich_ptrの提案。大規模な動的サーバーや分散システム、動的プログラミング言語の実装などに使われることを想定している。

N3341: Transactional Language Constructs for C++

2008年から始まった、C++にトランザクショナルメモリーを導入するワーキンググループの経過発表。

N3342: Digit Separators coming back

ユーザー定義リテラル「貴様のようなニューグラマーのなり損ないは、Rejectされる運命なのだ。わかるか!」
数値区切り「まだだ! まだ終わらんよ!」

C++11には入らなかった、区切り付き数字の提案。大きな数字、たとえば123456789が、アンダースコア区切りで、123_45_6_789と書けるようになる。何桁で区切っても構わない。正直、クソなユーザー定義リテラルよりこっちがC++11に入って欲しかった。提案された文法では、既存のクソなユーザー定義リテラルの文法とは曖昧にならない。

int x = 123_4_5_6_780 ; // 123456789

N3344: Toward a Standard C++ 'Date' Class

日付を表現する標準Dateクラスの提案。標準ライブラリーとして広く使えるライブラリーを作るのは難しい。

N3346: Defect Report: Terminology for Container Element Requirements - Rev 1

規格の文面の、コンテナー要素における、用語を統一する修正。

N3347: Modules in C++ (Revision 6)

近代的なプログラミング言語なら普通は備えているモジュールの提案。いつか#includeはもとより、プリプロセッサーのサポートを終了できる日を夢見て。もちろんC++だから、プリプロセッサーと共用できるように設計されている。

N3348: Scoping of operator new

現在、グローバル名前空間スコープとクラススコープでしか認められていないoperator newのオーバーロードを、名前空間スコープで宣言できるようにする提案。

N3349: Ease of using namespaces

本気で提案しているのかちょっと理解しかねる提案。namespace内の名前を無視させるディレクティブ"ignore namespace"の提案。以下のように使う。

namespace foo { class X { } ; }
namespace bar { class X { } ; }

using namespace foo ;
using namespace bar ;

void f()
{
    ignore namespace foo ;
    X x ; // bar::X 
}

このように、ignore namespaceディレクティブがある場所では、指定された名前空間内の名前をすべて無視する。こんなのが何の役に立つのか。おそらく、有名なライブラリのヘッダーをincludeする際に使うのだろう。

// C++11のインライン名前空間
inline namespace Win32 {
#include <Windows.h>
}


int GetLastError() ; // たまたまWin32 APIと名前が一致する関数

void f()
{

{// このスコープではWin32 APIは使わない。
    ignore namespace Win32 ;
    int result = GetLastError() ; // Win32 APIは無視される。
}

}

ある名前空間に属する名前をすべて無視するディレクティブなんて泥臭い機能である。それこそ、using namespaceよりひどい機能である。しかし、現実のプログラミングでは、どうしても変更できない巨大なライブラリ(しかも名前空間を使っていない)を複数組み合わせることを余儀なくされる。ライブラリが巨大であれば、どうしても名前の重複は避けられない。その際、わざわざスコープ解決演算子を使うのはめんどくさい。結局、これなしではもっと泥臭いコードになるのを回避する泥臭い機能なのだろう。それにしても・・・やはり泥臭い。

N3350: A minimal std::range<Iter>

そのまんま、Boost.Rangeの同等ライブラリのTR2への提案。

N3351: A Concept Design for the STL

C++11では却下されたSTLのためのコンセプト。一時C++11のドラフトに入っていたものより洗練されているとのこと。特に、たったの41のコンセプトしか定義せず、コンセプトマップを必要としない実装で、しかもテンプレートメタプログラミング臭いトリックが使われていないそうだ。

N3352: C++ Binary Fixed-Point Arithmetic

固定精度の整数と実数のライブラリの提案。これ上限が示されていないのだけれど、例えばcardinal<1024>にすれば、0 <= n <= 2^1024の範囲の整数クラスが使えるんだろうか。

N3353: C++ Concurrent Queues

同期キューライブラリの提案。

N3353: C++ Concurrent Queues

ストリーム(iostreamのストリーム)のためのロック機構の提案。しかし、ストリームなんてまともに使われていないから今更無駄だと思うのだが。

N3355: C++ Distributed Counters

マルチスレッドな環境で使えるカウンターの提案。頻繁にインクリメントされるが、読み出しは稀であるカウンターを想定している。複数のスレッドからのインクリメントは高速に行える。そのかわり、読み出しの遅さは許容する。

N3356: C++ Mutable Threads

スレッドプールより低レベルなライブラリーの提案。通常のスレッドは、あるひとつの関数を実行して、その関数から戻った際に、実行を停止する。しかし、ひとつの関数を実行するためだけにスレッドを作るのは非効率的な場合がある。例えば、小さな関数を大量に非同期に実行させたい場合などだ。そのような場合に使える、再利用可能なスレッドライブラリーである。このライブラリーは、スレッドプールの実装に使える。スレッドプールというには、やや低級なライブラリである。

以上。さて、今年こそC++本を完成させないといけないのだが、流石に疲れてきた。思うに、紙書籍という媒体には、もう未来がないと思う。それに、どうやら私はひとつのまとまった本を書く才能がないらしい。ブログなら簡単にかけるが、本は難しい。今の私を古人に擬すならば、橘成季だろう。

古今著聞集の作者である橘成季は理想主義者だった。彼は当時の公家らしく、様々な芸事に手を出した。競馬、詩文、作文、音楽、舞踊、はては絵までやっている。しかし、今日の我々は、橘成季を知らない。彼の作品はそれほど評価されず、残っていないからだ。彼は当時はやりだった説話集も作った。理想主義者らしく、説話を分類し、話の典拠を明記し、当時の公家日記に見つからないものはその旨も記した。しかし、古今著聞集は、一流にはなれなかった。読んでいても文章はつまらないし、量でいえば今昔物語に負けている。理想は高かったが、惜しいかな、本人の力量がどうしようもなく足りていなかったのだ。

思うに、もう少し軽いノリの本を作るべきだったと思う。ブログのような、あるひとつの主題に対して短い文章を書いたものをまとめた、それこそ説話集のような形式を取るべきだったのだと思う。代わりに今書いているのは、規格書の劣化コピーだ。それなら最初から規格書を読めばいいのだ。もし英語が読めないとしたら、その者は今日においてプログラマーとなる資格はない。

ともかく、始めたことは終わらせなければならない。初心者向けではない本でしかも自分ですら未熟だと思う内容なのだから、どうも売れる気がしない。しかも悲惨なことに、この数年、本の執筆だけを、如何にしてプログラミング言語の文法と機能を教えるかということだけを考えてきたので、まともにプログラミングできなくなっている。プログラマーとしては役立たずだ。これが終わったら、この業界からは身を引くべきなのかもしれない。C++を極めた挙句プログラマーにはなれませんでした、とは笑い草だ。いや、実際には、極めてすらいないのだ。

2012-01-19

今日起きた企業による権力の悪用

An abuse of power given the freedoms these companies enjoy in the marketplace today - Boing Boing

またもやCory Doctorowによる記事。

Xeniが火曜日に書いたように、MPAAはSOPAとPIPAに反対するブラックアウト運動がお気に召さないらしい。アメリカ映画協会の議長かつCEOである名誉会長のChris Doddは声明で、「今日起きた企業による権力の悪用」と称した。

お前が言うな。

あのスキップ不可なFBI警告(ひどく忌み嫌われていて、しかもDVDは他人に貸し出すことができないなどという法的に間違っている警告)をすべての商用DVDに付加させた団体のCEOはお前じゃないか。すべての映画にあの侮辱的な映画の違法ダウンロード警告をつけさせた団体のCEOはお前じゃないか。

しかも、お前がCEOをしている団体が、DMCAで、あの忌々しい警告や広告をスキップする機能をもったDVDプレイヤーの製造を違法にしたんだろ。

お前だって、「今日起きた企業による権力の悪用」の味は知っているはずだ。

そういえば、最近の映画やゲームには、スキップ不可な警告文やロゴやらが多すぎる気がする。海外ゲームのトレイラーに必ず付いているあのレーティング警告もうざい。

2012-01-17

ハドソンを祭る文

歳は辛辰に在り一月某夜、大恐慌の冬の赤字駅に停まりし時、一星忽焉として墜ちて声あり、嗚呼ハドソン死す矣、而して其光栄ある歴史は全く抹殺されぬ。

嗚呼汝ハドソンの事、吾人之を言うに忍びんや、想うに二十余年前、アタリのクソゲーいまだ余波を米市場に及ぼし、ゲーム興隆の宏謨は正に大頓挫を来すの時に方って、祖宗在天の霊は赫として汝ハドソンを大地に下して、其爆弾男の声を揚げ其十六連打を放たしめたりき、而して汝の父母は実に爆弾と陸蒸気を愛する神ゲーの正気なりき、実に世界を振蘯せるゲーム進歩の大潮流なりき。

是を以て汝ハドソンがゲーム興隆の為めに戦い、ゲーム進歩の為め闘うや、策略をもって爆弾で囲み貧乏神をなすりつけ、残機無きも屈せずコンティニュー無きも撓まず、凛乎たる意気精神、真に十六連打の慨ありき、而して今安くに在る哉。

汝ハドソンの起るや、世間の偏見は益々甚しく迫害は愈よ急也、ゲーム時間は制限せられたり、所有は禁止せられたり、請願は防止せられたり、而して捕縛、而して放逐、而して牢獄、而して電源遮断、而も汝の残機の減るを見るが如し、幾万のお小遣いを蘯尽して悔いざる也、幾百のセーブデータを損傷して悔いざる也、豈是れ汝が一片の理想信仰の牢として譲らざる信念のありしが為にあらずや、而して今安くに在る哉。

汝ハドソンは如此にして堂々たるゲーム会社になれり、幾多ゲーマー、暇人の五臓を絞れる熱涙と鮮血とは、実に汝ハドソンの糧食なりき、殿堂なりき、歴史なりき、嗚呼彼れ高橋や、毛利や、橋本や、桜田や、川田や、其熱涙鮮血を濺げる名人は、汝ハドソンの前途光栄洋々たるを想望して、従容笑を含んで宣伝に就けり、当時誰か思わん彼等忘却せられて即ちハドソンの死せんとは、彼等の熱涙鮮血が他日其仇敵たるヌルゲーとソーシャルゲーと劣化続編の唯一の装飾に供せられんとは、嗚呼彼熱涙鮮血や高難易度や今安くに在る哉。

汝ハドソンや、初めや聖賢の骨、英雄の胆、目は日月の如く、舌は霹靂の如く、攻めて取らざるなく、売りて売れざるなく、以て一たび陸蒸気ゲームの新天地を開拓し、リアルファイトを誘発するの偉業を建てたり、而も汝は発展の才に非ざりき、其死亡はスペランカーのジャンプより脆くして、直ちに旧態依然の怠惰の為めに征服せられたり、而して汝が光栄ある歴史、名誉なる事業今安くに在る哉。

更に想う、吾人年少にして友人の家にてファミコンを遊べるとき、無慚破戒の爆弾男は友人と吾人の貴重な時間を奪いたり。当時諸君の神ゲーのセンスは忘れざりき、而して見よ今や諸君は劣化続編のコナミ、パチンコ企業の忠実なる子会社となり、しかも消失に甘んじたり、而して吾人独り一枚のキーボード、多数のコピペ改変のみして、尚お神ゲーの復興の為めに奮闘・・・せざりき、汝ハドソンの死を吊し霊を祭るに方って、吾人豈に追昔撫今の情なきを得んや、かつての神ゲーのTAS動画を眺めて、慨然として賦して曰く、「ヌルゲー死ね、家ゲー死ね。一本道ストーリー重視クソ食らえ。昔ながらの硬派な2DのRPGと2Dのプラットフォームとスポーツ系FPSをよこしやがれこんちくしょう。バニーホッピングもストレイフもロケットジャンプもできないなんてふざけんな」。嗚呼大衆迎合の世は澆季なるかな、而も光栄ある汝の歴史は今や全く抹殺せられぬ、吾人唯だ此愚痴をつぶやきて以て汝を吊するあるのみ、汝ハドソン若し霊あらば髣髴として来り饗けよ。

2012-01-15

The Pirate Bayは違法か?

ここ数日、SOPAがらみの記事の翻訳をしたので、そのついでに、著作権問題の原因の一端を担っているともいえる、The Pirate Bayの最近の興味深い動きについて調べたことを書いてみようと思う。具体的には、The Pirate Bayが最近発表した、torrentファイルのホストをやめるという宣言だ。ただし、これはThe Pirate Bayの終了を意味するのではない。もっと間接的になるだけなのだ。最終的には、このブログ記事が違法かどうかという問題になるだろう。

The Pirate Bayとは、現在最大手の、マグネットリンクとtorrentファイルをホストしているサイトである。しかし、もうすぐ、torrentファイルをホストしなくなるであろう。マグネットリンクだけを載せるサイトになるはずだ。

まず前提の定義。

  • 著作権者の許可を得ずに複製、公衆送信などをされるファイルを「違法ファイル」とする
  • 違法ファイルのアップロード、ダウンロードを違法とする
  • プロトコルとその実装は違法ではないとする

この記事では、「違法ファイル」とは、複製、公衆送信すると著作権侵害となるファイルを意味する。

違法ファイルのアップロードやダウンロードが違法かどうかということに関しては、様々な議論がある。特に国内では、何をダウンロードするのかあらかじめ分からないのに、ダウンロード違法化とはどういうことだという議論もあるが、その懸念は、この場合、問題にならないから、とりあえず一律違法とする。

プロトコルとその実装は違法ではないということは言うまでもないことである。何故ならば、現在、最も著作権侵害に使われているプロトコルはHTTPであり、その実装はブラウザーだからだ。本記事で扱うBitTorrentプロトコルなど目ではない。HTTPプロトコルとその実装を違法化しようという試みは、無論、言うまでもなくカオスに失敗するであろう。

さて、The Pirate Bayというサイトは何をしているのか。その歴史を紐解けば、最初は、公開トラッカーサーバーであった。The Pirate BayのWebサイトは、The Pirate Bayという公開トラッカーサーバー上のtorrentファイルを検索、ダウンロードできるサイトであった。どんなファイルでも受け付けるので、当然、違法ファイルで溢れかえることになった。

技術的には、トラッカーサーバーは、ファイルのアップロード、ダウンロードは一切行なっていない。トラッカーサーバーが行うのは、ファイルのアップロード/ダウンロードをするノードの管理である。これは違法だろうか。ノードは違法行為を行うかもしれないが、ノードの管理は、果たしてどうであろうか。著作権侵害幇助だろうか。

さて、ノードの管理が違法かどうかはともかく、これは問題視され、実際に警察による捜査まで行われた。そこでThe Pirate Bayは、トラッカーサーバーの運営をやめてしまった。The Pirate Bayは、torrentファイルのホストと検索を提供するだけのサイトになったのだ。

技術的には、torrentファイルは、ダウンロード/アップロードするファイル自体のデータは含まない。ファイル名や、ハッシュ値などの情報を含む。BitTorrentプロトコルも発展し、今や、トラッカーサーバーを必要としなくなっている。ファイル名やハッシュ値に著作権保護などされるわけがないので、torrentファイル自体は違法ではない。私がこのブログに、あるファイルの名前とハッシュ値を書きこんでも、違法ではないはずである。さて、これは違法だろうか? まだ幇助しているといえるのだろうか。

さて、最近のことだが、The Pirate Bayはマグネットリンクをデフォルトにすると発表した。また、将来的には、マグネットリンク一本でいくとも言っている。

技術的には、マグネットリンクは、ファイル名やハッシュ値すら含まない。ただ、torrentファイルのinfoセクションの抜粋である。実際、マグネットリンクとはBitTorrentとは関係ない、以前からあるただのURIの規格である。このURI schemeは、ローカルなアプリに任意の引数を渡して起動するURIである。たとえばこんなふうに記述される。

magnet:?xt=urn:btih:8ac3731ad4b039c05393b5404afa6e7397810b41&dn=ubuntu-11.10-desktop-i386.iso&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80

このリンクは、Ubuntu 11.10のインストールディスクのISOイメージへのtorrentファイルへのリンクである。The Pirate Bayがubuntu-11.10-desktop-i386.iso (download torrent) - TPBで提供しているマグネットリンクは、たったのこれだけの単純な文字列だ。マグネットリンクに対応したBitTorrentクライアントをインストールした上で、マグネットリンクに対応したブラウザーを使えば、上記リンクをクリックすることで、BitTorrentクライアントが起動する。そして、マグネットリンクを経由して渡されたinfoセクションをもとに、torrentファイルを自動的にダウンロードする。その後、取得したtorrentファイルを使い、ファイル本体のダウンロードも自動的に始まる。

このように、The Pirate Bayの歴史は、私から見ると、迂回の歴史に見える。まずノード管理をやめ、今はtorrentファイルすらなくそうとしている。すると、ここで一つ疑問が持ち上がる。違法ファイルのホストは違法である。これはいい。しかし、違法ファイルにリンクしているThe Pirate Bayが違法であるとすると、The Pirate Bayにリンクしているこのブログ記事はどうなるのだ。違法なのだろうか。いや、リンクを貼るまでもない。今や、正確なURIなど示さなくても、"Pirate Bay"と記述すれば、Googleなどを使って、検索されてしまう。これは違法なのだろうか。

しかし、あるサイトにリンクはおろか、名前すら言及してはいけないとしたら、一体どうすればいいのか。某巨大匿名掲示板の例にならって、某巨大torrentファイルのinfoセクション検索サイトとでも書くべきだろうか。しかしそれは第二の名前をつけるだけだ。

ちなみに、日本のWinny裁判は、Winnyを開発したことが罪に問われたわけではなく、Winnyを開発したことが著作権侵害の幇助罪にあたるかどうかが争点になった。最高裁の判決の理由によれば、

他方,この点に関する被告人の主観面をみると,被告人は,本件Winnyを公 開,提供するに際し,本件Winnyを著作権侵害のために利用するであろう者が いることや,そのような者の人数が増えてきたことについては認識していたと認め られるものの,いまだ,被告人において,Winnyを著作権侵害のために利用す る者が例外的とはいえない範囲の者にまで広がっており,本件Winnyを公開, 提供した場合に,例外的とはいえない範囲の者がそれを著作権侵害に利用する蓋然 性が高いことを認識,認容していたとまで認めるに足りる証拠はない

「例外的とはいえない範囲」とは一体どういった状態をいうのであろうか。たとえばThe Pirate Bayだ。The Pirate Bayは親切にもランキングを出してくれている。もっともランキングの高いtorrent Top 100を見ると、どうもタイトルやファイル名からして、ほとんど違法ファイルではないかと思う。もちろん、上記のマグネットリンクはThe Pirate Bayから直接コピペしてきたものなので、中には合法ファイルへのリンクもある。結局、The Pirate Bayがどんなファイルへのリンクでも受け付けるので、こうなっているのだが、はたしてどうなるのか。

かといって、Winnyだって、違法な目的に使われた場合のほうが多いはずだ。Winnyですら「例外的とはいえない範囲」の著作権侵害の割合であるとすれば、The Pirate Bayもそうなのであろうか。とすると、幇助ではないのだろうか。

思うに、今の技術に、法律どころか、我々の常識すら追いつけていないのではないだろうか。もちろん、私は楽観主義者なので、二、三十年ほどすれば、いまの問題はすべて白黒ついているのではないかと思う。もちろんその時は、また別の問題が出てきているだろう。たとえば、「家庭用3Dプリンターを使ってXBox5760やPS7やiPhone 16を印刷するのは合法か」とか、「電子化されてシミュレーション再現された故人に対する人権」とか。

参考文献:
BitTorrent Site The Pirate Bay Turns Away From Torrents
The Pirate Bay
The Pirate Bay - Wikipedia, the free encyclopedia
BitTorrent (protocol) - Wikipedia, the free encyclopedia
BitTorrent tracker - Wikipedia, the free encyclopedia
Torrent file - Wikipedia, the free encyclopedia
Magnet URI scheme - Wikipedia, the free encyclopedia

C++11ですみやかにプログラムの実行を終了する方法

結論:C++11で新しく追加されたstd::quick_exitを使え。

プログラムの終了は、すみやかに行われるべきである。なにしろ、終了なのだ。終了にもたついていてはストレスがたまる。とくに、多くの実行環境では、プログラムの外部から、プログラムを強制終了させる方法がある。強制終了は大抵、プログラムの意志を無視して、強制的に一瞬で行われる。外部からできるのであれば、内部からできてしかるべきである。

なぜプログラムは終了時にもたつくのか。それは、終了時に特別な処理を必要とする場合もあろう。たとえば、数GBものデータを遅いHDDに書きださねばならない場合もあるだろう。これは妥当な理由である。では、確保したメモリやその他のリソースの解放処理はどうか。これは、疑問である。というのも、多くの近代的なOSでは、プログラムは個々に独立している。プログラムには独自の仮想メモリ空間が与えられ、必要に応じて物理メモリが割り当てられ、その他のリソースも独自に確保される。他のプログラムとは区別される。もし他のプログラムとリソースを共有したい場合は、なにか特別な方法を使わなければならない。そして、あるプログラムが確保したリソースは、そのプログラムの終了時に、OSが自動的に解放するようになっている。

プログラムの実行中に、必要のないメモリその他のリソースを解放せずに、延々と確保し続けるのは、これをリソースリークと呼ぶ。しかし、終了時には、どうせOSが解放してくれるのだから、自分でやるのは無駄である。

ここで未熟なプログラマー読者は思うであろう。解放するのがプログラムにしろ、OSにしろ、どちらかがやらなければならないのだから、どちらがやっても同じではないか。もし、プログラムによる解放が、OSに比べて極端に遅いとすれば、それは欠陥ではないのかと。問題は、ひとつのリソースを解放するというほど単純ではない。

例えばメモリだ。近代的なプラットフォームでは、仮想メモリ空間に割り当てる物理メモリはページ単位で確保する。これはたいてい、数KB単位である。しかし、現実のプログラムでは、もっと少ない単位(数十バイト)のメモリを大量に必要とする。これに対し、数KB単位のメモリを割り当てていたのでは、無駄である。そこで、現実には、まず一括してある程度の量のメモリを確保しておき、メモリ上に管理のためのデータ構造を構築し、そのメモリを必要とする小さな単位に切り分けて使う手法がとられる。これをヒープと呼ぶ。プログラムの実行中は、このヒープ内のメモリの確保と解放の処理は意味がある。しかし、プログラムが終了するのであれば、そんな処理は必要ない。ある仮想メモリ空間に割り当てられている物理メモリをすべて解放し、その仮想メモリ空間も破棄すればよい。これはすぐ終わる。ところで、近代的なプログラムであれば、マルチスレッドを使うのは当然である。ヒープに対する操作は、スレッドセーフではない。よって、ヒープの操作には排他的なロックをかける必要がある。プログラムの終了時に、すべてのスレッドが確保していたヒープ上のメモリを一斉に解放しようとしても、ヒープに対する操作は排他的であるので、いかに多数のCPUを搭載していようと、パフォーマンスは全くスケールしない。ましてや、ヒープ上のデータ構造の状態は、ヒープごとすべて破棄する場合には、全く関係ないのだ。結果として、遅くなる。

近代的なOSでは、ファイルやネットワークソケットなどといったその他のリソースには、リソースに対するハンドルが与えられる。リソースへの操作は、このハンドルを介して行われる。実行時に動的な数のリソースを確保するプログラムは、動的な数のハンドルを格納できるデータ構造を使う。一方、OS側でも、ハンドルと実リソースと紐付けるために、何らかの動的なデータ構造で情報を保持して置かなければならない。プログラムが明示的にすべてのリソースを解放する場合、プログラム側のデータ構造を巡り巡って、すべてのハンドルに解放処理を行う。ハンドルに対する解放処理を要求されたOSは、これまたOS側のデータ構造からハンドルに該当する実リソースを探し出し、解放処理を行う。しかし、最初から全てを解放するのだと分かっているならば、プログラム側の処理は二度手間である。

そう、ただちに終了するのであれば、プログラム側は何もしないほうがいいのだ。ところが、近代的なプログラミング言語では、「何もしない」というのは難しい。たとえば、C++にはクラスという機能がある。クラスにはコンストラクターとデストラクターがあり、これは、クラスの構築時、破棄時に、自動的に実行される。

C++においてプログラムを終了させる一般的な方法とは、main関数からのreturnである。しかし、main関数からreturnするためには、ネストして呼び出しているすべての関数からreturnしなければならない。

class X
{
    X() { /* リソースの確保 */ }
    ~X() { /* リソースの解放 */ }
} ;

void f1()
{
    X x ;
    // さあ、終了しよう
    return ;
}

void f2()
{
    X x ;
    f1() ;
    return ;
}

int main()
{
    X x ;
    f2() ;
    return ;
}

この例で、関数f1の中身を実行中に、プログラムを終了させたい場合、ネストされた関数を延々とreturnしなければならない。そればかりではなく、スコープの離脱に伴い、クラスXのローカル変数のオブジェクトxのデストラクターを走らせなければならない。たとえ、デストラクターの処理が、単なるリソースの解放であったとしても、デストラクターの実行を止めることはできない。

C++には、Cから受け継いだstd::exitがある。これを使えば、その場で終了できる。exitを呼び出した後に実行が続くことはない。ところが、このexitにも問題がある。グローバル変数とスレッド変数の破棄が実行されてしまうのだ。

X x1, x2, x3 ;

void deep()
{
    std::exit(0) ; // x1, x2, x3, x4のデストラクターが実行される
}

void f()
{
    thread_local X x4 ;
    deep() ;
}

int main()
{
    f() ;
}

では、終了中かどうかを判定するフラグを作って、すべてのグローバル変数とスレッド変数のデストラクターにチェックさせるべきなのだろうか。それでは、自動的なデストラクターの実行の意味がない。

他にも、C++11には採用されなかったが、他の言語では、ガーベージコレクションなどがある。これも速やかな終了の妨げになる。

多くのプラットフォームでは、プログラム自身の終了を止める独自APIが提供されている。プログラムのすべてのスレッドの実行を問答無用で停止して、終了処理を行うようなAPIだ。特定のプラットフォームだけを考えればいいのならば、そういうAPIを使えばいい。しかし、ポータブルなC++のコードを書く場合、できるだけそのような独自APIには頼りたくない。何故ならば、サポートするプラットフォームの数だけ、別々の実装が必要になるからだ。

C++11では、この状況に鑑み、std::quick_exitを用意した。使い方は、std::exitを全く同じだ。違いは、グローバル変数やスレッド変数の破棄が実行されないこと、Cのファイルストリームのフラッシュが行われないこと、終了前にstd::at_quick_exitで登録した関数が呼ばれることだ。

したがって、近代的なプログラムの終了手順は以下のようになる。

  1. 必要であれば、std::at_quick_exitでプログラム全体の終了処理を行う関数を登録する(プログラムの内部バッファーの書き出しなど)
  2. その場で終わらせるべき処理を速やかに終わらせる
  3. Cファイルストリームを使っていて書き込み結果が反映されて欲しいのであれば、フラッシュする
  4. std::quick_exitを呼び出す

2012-01-14

リチャード・ストールマンは常に正しかった

Richard Stallman Was Right All Along

去年の年末頃、オバマ大統領はテロリストの容疑者を裁判や令状なしに拘束できる法に署名した。世界中で起こっている平和的なオキュパイ運動家は、権力者からテロリストだとレッテル貼りをされている。通信を監視するSOPAを成立させるような圧力もある。30年前、リチャード・ストールマンがGNUプロジェクトを立ち上げてからこのかた30年間、彼の極端な物の見方は、馬鹿げていてパラノイアじみていると嘲笑されたものだ。しかし、この2012年において、パラノイアだと思われていた予測が、現実のものになろうとしている。

ごく最近まで、リチャード・ストールマンを世間離れしたパラノイアの狂人だと一笑に付すことは簡単であった。まあ、いってみれば、奴は古臭いコンピューターヒッピーだ。地下室に引きこもって自分の世界に浸っているパソコンオタクだ。あのヒゲ、あの髪、あの服。我々の価値観からすれば、単に彼を笑い飛ばすのは、実に簡単であった。

彼の思想は常に常軌を逸していた。彼の持つ唯一のコンピューターは、Lemote Yeeloong Notebookである。なぜならば、これは、フリーなソフトウェアだけを使い、ファームウェアに罠はなく、BIOSすら非フリーではないという、完全にフリーなコンピューターだからだ。彼はまた、携帯電話を持たない。なぜならば、携帯電話は追跡を容易にするからだ。Yeeloongのような携帯電話が出るまで、ストールマンは携帯電話を持ちたいとは思わないのだ。そう、すべてのソフトウェアはフリーであるべきだ。フリーソフトウェア財団がいっているように

我々の社会がより一層コンピューターに依存する中、フリーな社会の未来を守るために、我々の実行するソフトウェアの果たす役割は重い。フリーなソフトウェアは、我々が家庭で、学校で、仕事で、コンピューターを使うあらゆる個人、商用の作業において、ユーザーによる技術の制御を実現してくれる。非フリーなソフトウェア企業や政府による制限や監視から逃れることができるのだ。

私自身も、ストールマンは極端にも程があると考えていた。フリーなソフトウェアで政府の支配や監視と戦う? 世界征服をたくらむ悪の企業? プライベートな通信を監視するソフトウェア? まあ、そりゃ、フリーでオープンソースなソフトウェアってのは大事だよ。もし非フリーなソフトウェアと同等機能を提供するフリーなソフトウェアがあるならば、もちろんそっちを選ぶさ。でも、ストールマンとフリーソフトウェア財団の非常識な主張にはうんざりだね、と。

しかし、2012年が始まるや、オバマはNDAA for 2012に署名した。これにより、アメリカ市民は、テロリストの容疑だけで、裁判や何らの令状手続きなしに、無期限に拘束され得るのだ。そして、SOPAだ。これがもし通れば、何らの裁判や令状なしに、Webサイトは消されるし、インターネットの通信を監視することも可能になる。さて、権力者がオキュパイ運動をなんとレッテル貼りしているか、テロリストである。さて、この先どうなるかは、明白である。

この動きを、中国や似たような全体主義国の傾向にみるのは、決して見当違いではない。アメリカ映画協会、すなわちMPAAでさえ、誇らしげに言っているではないか。中国、シリア、イランなどの国でうまくいっていることは、アメリカでもうまくいくに違いないと。中国のグレート・ファイアーウォールや似たようなフィルターシステムは、この自由であるべき世界に対して、実現可能な手法であると。

重要な点は、昔と違い、秘密警察と密告者によって通信を傍受しなくてもいいということだ。ただ、我々の使っているソフトウェアとハードウェアを支配すればいいのだ。我々のデスクトップPC、ノートPC、タブレット、スマートフォン、その他のあらゆるデバイスは、通信に使われる。リアルで体面すれば秘密を守れると思っているのかい? ちょっと待ちたまえ。どうやって密会を取り持ったのかね? まさか電話で? ネットで? しかも、そのポケットやバッグに入ってる、常にネットワークにつながっている状態のデバイスはなんだい? 

これこそが、ストールマンが30年も我々に警告してきた脅威なのだ。それなのに我々は、私も含めて、彼を真面目に取り合って来なかった。しかし、世界が変わろうとしている今この時、自分のデバイスで実行されているコードを検証できるということの大切さは、誰の目にも明らかである。もし、我々が、自分の所有するコンピューターを検証することができなければ、我々は奴隷だ。

これこそが、フリーソフトウェア財団とストールマンの信条なのである。すなわち、非フリーなソフトウェアはユーザーの支配力を奪うものであり、結果として深刻な脅威を引き起こすのである。特に今、我々はコンピューターに全てを依存しているのだから。ストールマンがこの事実を30年も前に気づいていたというのは、驚嘆すべきである。彼の活動は正当化される。この30年に及ぶフリーソフトウェア財団の活動も正当化される。

そして、この2012年において、我々は以前にも増して切実に、フリーかつオープンソースなソフトウェアを必要とするであろう。去年、ベルリンで開かれたChaos Computer Congressにおいて、Cory Doctorowは「汎用コンピューターに来るべき戦争(拙訳:本の虫: 汎用コンピュータ戦争)」と題して、スピーチを行った。その中で、Doctorowは汎用コンピューターに振りかかる脅威、特に、汎用コンピューターに対するユーザーの支配力に対する脅威に対して警告した。著作権戦争など、本当の戦争の前哨戦に過ぎないのだ。

「ウォークマンの世代として、僕が老いたときには、補聴器が必要になることに納得している。もちろん、僕が体に装着するのは補聴器ではなく、コンピューターである。僕が車に乗り込む時というのは、自分の体をコンピューターの中に押し込んでいるのだ。もちろん、補聴器も、僕の体の中に装着しているコンピューターだ。僕は、これらの技術に、何か秘密の機能が搭載されていて、僕の意志に反して動作の強制終了を拒否するようになっていないかどうかを確かめたい。」

上記は、ほんの一部の引用である。コンピューターが聴覚や移動などのあらゆることを補助する世界では、自分の支配できないコンピューターなどもってのほかだ。我々は内部動作を確認できる必要がある。我々が監視、検閲などなされていないように確認できる必要がある。我々は少し前まで、単なるパラノイアだと一笑に付していた。しかし、近年の動きを見るに、もはやパラノイアではない。現実である

「未来の自由を守るためには、自分の使っているデバイスを検証できる必要がある。実行中のプロセスの検証と終了により、デバイスが自分に忠実なしもべであると確証できる必要がある。コンピューターが犯罪者や諜報機関や規制派のための道具に成り下がってはならない。我々はまだ、敗戦しているわけではない。しかし、我々はインターネットとPCを自由かつオープンに保つため、この著作権戦争に必ず勝利しなければならない。何故ならば、インターネットとPCは、将来の戦争のための武器だから、これ無くして来るべき戦争に勝つことはできない。」

だからこそ、我々は、たとえiPhoneの方が気に入っていたとしても、Android(GoogleではなくAndroid)をサポートしたほうがよい。たとえWindowsを使っているとしても、Linuxをサポートしたほうがよい。たとえIISを使っていたとしても、Apacheをサポートしたほうがよい。フリーである、オープンであるというのは、単にかっこいいだけでなく、必要となる時代が来るのだ。

リチャード・ストールマンって実は当時から一貫してすんげー正しかったんじゃね? というお話。

2012-01-13

汎用コンピュータ戦争

28c3: The coming war on general computation

Transcript: transcript.md at master from jwise/28c3-doctorow - GitHub

今夜は、著作権に関しての話はしない。著作権の話はもうたくさんしてきた。文化とか創造性の問題というのは興味深いが、正直なところ、もううんざりだ。僕のようなフリーランスのライターの日銭を稼ぐ現状の変化については、YouTubeで僕の昔のスピーチ動画を探せばいい。今夜は、もっと重要な話をする。汎用コンピューターについてだ。

汎用コンピューターというのは、実際、素晴らしいものだ。あまりに素晴らしいので、我々の社会はまだその真価を完全に把握していない。なんのためにあるのか、なぜ動作するのか、どうやって付き合っていけばいいのか。この疑問は、残念ながら、著作権の話へとつながる。

何故ならば、著作権戦争の背景事情は、将来来るべき汎用コンピュータの命運をかけた戦いへの備えとなるからだ。はじめに、ソフトウェアのパッケージがあった。次に流通があり、そして、メディアコピーがあった。そこで、我々は包装され、段ボール箱に詰められたフロッピーディスクを、店頭に並べ、キャンディーや雑誌と同じように販売していたのである。コピーは簡単であったので、当然コピーは可及的速やかに、かつ、広範に行われた。これは、ソフトウェアを作成して販売する者の、悩みの種であった。

DRM 0.96の時代に入る。彼らソフトウェア作成者は、ディスクに物理的な制限をかけたり、ソフトウェアの実行時に存在を確認する物理的なものを導入した。ドングル、隠しセクター、コピーが難しい物理的な分厚い紙のマニュアルに記載されている事項を実行時に答えさせる認証。もちろん、これらの試みはすべて失敗した。理由は二つある。ひとつには、商業的に成功しなかったからだ。当たり前だ。彼らは正規ユーザーの利便性を損ねているのだし、しかもソフトウェアに対価を払わない連中は、そういう馬鹿げた仕組みにかかずらう必要はなかったのだ。正規品購入者は、バックアップが正しく動作しないことに不満を持ち、認証ドングルが無意味に通信ポートを占有するのを嫌い、ソフトウェアを実行するのに巨大なマニュアルを持ち歩く不便に閉口した。ふたつめには、これらの試みは、海賊行為を防げなかったのだ。ソフトウェアにパッチをあてて認証を回避するのなんて古典的な問題なのだ。大抵、必要な技術を持つ専門家や、ソフトウェアベンダーと同じ能力を持つ者らが、ソフトウェアを解析してクラック版を公開、即座に広まったのだ。このような技術と改造は、非常に高度な専門技能を必要とすると思われるかもしれない。しかし、そうではない。不具合のあるソフトウェアが何をしているのかを解析したり、ヘンテコなフロッピーディスクの欠損部分を迂回したりするということなどは、コンピュータープログラマーにとって必須のスキルであるし、当時のように、ヘンテコなフロッピーが広く出回っていて、場当たり的に対処するのが普通だった時代としては、なおさら必須のスキルだったのである。アンチコピー戦略は、ネットワークが広まっていくにつれ、ますます動かなくなっていった。我々がBBSやオンラインサービスやUSENETニュースグループやメーリングリストを手にした時、このような認証システムをクラックできた者はクラック用のファイルを配布していたし、ネットワークの能力が向上するに連れて、クラック済みのディスクイメージや、さらには実行可能ファイルを直接配布するようになっていったのだ。

これによって、DRM 1.0が起こった。1996年、政治家達は皆、なにか重要なことが始まろうとしていることに気がついた。「我々は情報経済に突入しようとしているのだ。どういう意味かさっぱり分からんがね」と。彼らは、情報経済とは、情報を売り買いできる経済のことであろうと推測した。今や、情報技術は物事を効率的にした。情報経済下における市場とはどうなるだろうか。本を一日だけ買う。映画を観る権利を1ユーロで売る、一時停止ボタンは一秒あたり1ペニーでレンタルされる。映画をある国ではこの価格で売り、別の国では別の価格で売る。等々。こういう時代の未来予測は、旧約聖書を元ネタに書かれたつまらないSFのようなものである。情報という名において挙げられる物を列挙し、それを売ることができるという考え方だ。

しかし、このようなことは、購入者のコンピューターの使用とファイルの送信をコントロールできなくては実現不可能だ。だいたい、ある映画を24時間だけ使用できる権利を販売したとしよう。あるいは、音楽をiPodに転送する権利を販売したとしよう。ただし、iPodから他のデバイスに転送する権利は売っていないとする。どうやったらそんなことが可能なのだ。一度ファイルを渡してしまえば、もうそれをどう使用するかは、ユーザー側の自由だ。このようなことを実現するためには、コンピューターに特定のプログラムの動作を禁止したり、ファイルやプロセスを監視する機能が必要になる。例えば、ファイルを暗号化して、特定の条件下でしかファイルをアンロックしないプログラムをユーザーに使用させることはできる。

しかしだ。インターネットでよく言うように、「問題はふたつになった(訳注:有名な正規表現のミーム、この問題を解決するのには正規表現を使えばいいだろう。問題はふたつになった)」。ファイルを削除する前に、ユーザーがファイルを保存することを防がなければならない。さらに、ユーザーがアンロックプログラムはどのように複合キーを格納しているのか解析するのを防がなければならない。何故ならば、もしユーザーがキーを見つけたら、単にファイルを復号化して、クソアプリとオサラバしてしまうからだ。

さあ、みっつ目の問題だ。ユーザーが復号化済みのファイルを他人と共有することを防がなければならない。さて、よっつ目の問題が出てきたぞ。アンロックプログラムの秘密を解析したユーザーが、解析方法を他人に教えることを防がなければならない。さて、いつつ目の問題だ。アンロックプログラムの秘密を知ったユーザーが、秘密の内容を他人に教えることを防がなければならない。

問題が多すぎる。しかし、1996年には、我々には解決方法があったのだ。著作権に関する世界知的所有権機関条約である。国際連合世界知的所有権団体によって制定されたこの法律は、アンロックプログラムの秘密を解析することを違法にし、実行中のアンロックプログラムから復号化されたデータを取り出すことも違法にしたのだ。さらに、アンロックプログラムから秘密を解析する方法を他人に教えることをも違法化する法律を作った。また、著作権保護された物や秘密情報をホストすることをも違法にし、インターネット上から情報を消し去るために、弁護士、裁判官などのクソを必要としない簡便な方法も法制化した。これにより、違法コピーは永久に撲滅されたのでありました。めでたしめでたし。情報経済は美しい花を咲かせ、全世界を美化したのであります。空母がよく言うように、「任務達成」とね。[聴衆の笑い声]

まあ、もちろん話はそこで終わりはしない。というのも、コンピューターやネットワークを理解している人間は、この法は、解決する問題よりも多くの問題を生み出すことを知っている。だいたい、この法律は、あるプログラムを実行中の自分のコンピューターの内部動作の検証を違法化する法律である。コンピューターの内部でどのような動作が行われているかを、他人に語るのを違法化する法律である。何が悪いということを一切証明せずに、インターネットを検閲できる法律である。つまり、彼らは現実に対し非現実的な要求を突きつけ、現実に無視されたのだ。そもそも、コピーはこの法律の文章が書かれている間にも、どんどん簡単になっていったのだ。コピーはますます簡単になることに疑いはない。今、この2011年は、もっともコピーが難しい時代である。あんたらのお孫さんは、クリスマスの食卓であんたらを囲んで、こう言う。「もっかい聞かせて、おじいさん。もっかい聞かせて、おばあさん。2011年ではどんだけコピーが難しかったの? 爪ほどの大きさのドライブで、今までに録音されたぜーんぶの音楽と、今までに作成されたぜーんぶの映画と、今まで発音されたぜーんぶの言葉、今までに撮られたぜーんぶの画像、ぜーんぶなんでも保存できて、コピーは気がつく間もないほど一瞬で終わる、そんなドライブがなかった時代、2011年ではどんだけコピーがアホくさかったのか教えて」と。そこで、現状が示されて、21世紀初頭は、我々の常識がいかにマヌケだったかというネタで、ひとしきり楽しい笑いを提供した後で、自由美を謳歌するのだよ。

まあ実際には、そこまでうまくはいかない。童謡のハエを捕まえようとクモを飲み込んだおばあさんのように、蜘蛛を捕まえるために鳥を飲み込み、鳥を捕まえるためにネコを飲み込みと、延々と続く。大衆に支持された規制が壊滅的な被害をもたらしたので、その穴をふさぐために、新しい規制を作ったのだ。さて、ここで話を終わらせて、立法者は阿呆か邪悪か、あるいは邪悪な阿呆であるかと結論づけるのはたやすい。あまり満足の行く結論ではない。何故ならば、結果は絶望でしかないからだ。この結論から導かれる考えとは、指導者から愚痴と邪悪を取り除かぬかぎり、この問題は解決しないということになる。ということは、この問題は永久に解決できない。僕は、またひとつ違った説を考えている。

立法者が情報技術を理解していないというのではないのだ。というのも、専門家でなくても、良い法律を作ることができるべきであるからだ。議員たちは、地方と人民を代表するために選ばれるのであって、宗教指導や問題の種をまくために選ばれるのではない。生物学者の議員はいないし、都市計画の権威である上院議員もいないし、児童保護の専門家である欧州議員もいない(たぶんいるべきだが)。彼らは法と政治の専門家で、技術には詳しくないものの、多くの場合、それほど変な規制を通したりはしない。これは、政府がヒューリスティックな手法を用いているためである。専門家や大多数の意見を調停するという仕組みである。

しかし、情報技術には、このヒューリスティックがうまく働かない。めちゃくちゃにしてしまうのだ。規制が目的にかなうかどうかというのは、それが正しく機能するかということにおいて重要だが、次に重要なのは、その規制を施行しようとすると、広範に影響を及ぼすということだ。今、私が、議会や議員やEUに、車輪を規制しようと働きかけたならば、確実に失敗するだろう。今、私が、「まあ、車輪というのはたしかに便利でありますな。しかし皆さんお気づきのように、銀行強盗は皆、車輪のよっつついた車に乗って、現場から逃げ去っております。何とかできないものでしょうか?」と主張したとしても、返答はノーだ。なぜならば、車輪の正規の目的で使う際の利便性を保ったまま、悪用を妨げるなどという方法が、思いつかないからだ。車輪というのは非常に便利なものであり、銀行強盗を防ぐために車輪を規制しようなどという論法は馬鹿げているからだ。たとえ大規模な銀行強盗が起こったとしても、それによって社会が大混乱に陥ったとしても、車輪の規制というのは正しい問題解決の方法ではないということは、誰もが知っている。

しかし、今、私が同じ政治団体に対して、私はハンズフリーフォンが車を危険にする確実な証拠を持っていると主張し、「私は車にハンズフリーフォンを設置するのを違法化する法を通したいのです」といったならば、政治家は、「そうだな。その主張はもっともだ。やってみようじゃないか」と言うであろう。その上で、この意見が良いものかどうか、あるいは、その証拠が正しいものかどうか、などといった議論は起こるであろう。しかし、「車からハンズフリーフォンを取り除いてしまったら、それはもう車ではなくなる」などと主張する人間はいない。こういう機能を取り除いたとしても、車は車なのだ。車は車輪と同様に、特殊化された目的を構成しており、ハンズフリーフォンを付け加えるなどということは、すでに完成された技術に対する追加にすぎないからだ。ここに、ヒューリスティックが用いられる。特殊化された目的の技術というのは複雑である。その技術から、根本的な機能を損なわないで、ある機能を取り除くことができるのである。

この原則は、議員にもよく働くが、こと汎用コンピューターと汎用ネットワーク、すなわちPCとインターネットに対しては、全く働かないのだ。なぜならば、もしあるコンピューターソフトウェアを機能とみたならば、これは表計算を動かすコンピューターであるからして、表計算機能を持つ。これはWorld of Warcraftを動かすので、MMORPG機能を持つ。その上で、このヒューリスティックを適用してみると、「表計算をしないコンピューターを作れ」となる。これは「ハンズフリーフォンを持たない車を作れ」ということと等しいようにみなされる。そして、もしプロトコルやサイトを機能とみたならば、「BitTorrentが動かないように、インターネットを直せ」、あるいは、「thepiratebay.orgが名前解決されないように、インターネットを直せ」などという規制が考え出されることだろう。そしてあたかもこれは、「警告音を変更せよ」とか、「ピザーラの電話番号を無効にしてくれ」などという規制と同じようにみなされ、インターネットの根本的な原理を破壊するような規制だとは思われないのだ。

車や建築物やその他の技術的な規制にはうまく適用できたこの原則が、インターネットに当てはまらないということを理解出来ない人間は、邪悪とか無知という言葉を持って表されるものではない。ただ単に、「チューリング完全」や「end to end」などといった言葉が無意味に聞こえる種類の人間と同じである。そこで、議員は深い考えなしにこれらの規制を通す。そして、現実世界の技術にもたらす影響に直面するのである。急に、インターネット上に書くと違法になる数字がでてくる。公開できないプログラムが出てくる。そして、まったく問題のなかった著作物が、急にネット上から消え去ってゆく。そこで、「え? あれが著作権を侵害してたの?」と気がつくわけだ。規制の本来の目的を達成できはしない。この手の規制で著作権侵害は止まらない。著作権管理団体の根本的に間違った対処方法を受け入れているのだ。単なる自己満足である。「何とかせにゃならん。俺は何とかしてんだよ」と。規制に対する責は、規制内容を正しく考えなかったという批判になる。そもそも、その規制という考え方自体が根本的に間違っているのにもかかわらずだ。

根本的に間違った手法と対処方法は、様々な分野で起こる。私の友達で日用品の大手企業の役員を務めていた奴の話で、マーケティング部門が開発者に、素晴らしい洗剤のアイディアを思いついたと提案した。洗うたびに衣類を新しくする洗剤を開発しよう、と。いやまあ、開発者はマーケティング部門に、「エントロピー」の概念を理解させることができなかったらしい。そこで開発者がとった解決方法がある。「解決方法」、それは、酵素の働きによって、ほつれた繊維の端を断ち切るというものだった。衣類が古くなると繊維の端がほつれてきて、いかにも古くさくみえるからね。これによって、衣類を洗う度に、見た目が新しくなるというわけさ。でもそれは、洗剤が衣類を文字通り傷つけているからにすぎない。この洗剤を使うと、衣類を洗濯機の中で次第に崩壊させていくわけだ。これは、衣類を新しくするというアイディアの全く反対である。洗う度に衣類はダメージを受けていく。ユーザーがこの「解決方法」を適用する度に、衣類を新しく保つ方法が極端になっていく。新しい衣類を買わなくちゃならないんだ。だって古いのは溶けちゃうからね。

この手のマーケティング部門の連中に言わせると、「コンピューターはいらないんだ。必要なのは専用機だ。すべてのプログラムを実行するコンピューターなんてのはやめてくれたまえよ。ただ専用の動作、音声のストリーミングだったりパケットのルーティングだったり、XBoxのゲームだったりとかは提供して欲しいが、不正なプログラムや不利益なプログラムは実行できないようにしてくれたまえ」となる。これは一見すると、理にかなった要求のように聞こえる。ある専門の動作だけを実行するプログラムだ。ほら、ミキサーに電動モーターを取り付けることはできるし、食器洗い機にもモーターを取り付けることはできる。でも、ミキサーが食器洗いプログラムを実行する恐れなんてないだろ、とね。しかし、その手の要求を満たしたコンピューターは、話が違う。そういう要求によって作られた、とあるコンピューターは何か専門のアプリを実行するわけではないのだ。このコンピューターは、どんなプログラムでも実行できる。ただし、ルートキットやスパイウェアやコード署名といった技術を組み合わせて、実行中のプロセスを確認だとか、独自のソフトウェアをインストールだとか、実行されてほしくないプロセスの終了などというユーザーの動作を妨害しているだけなのだ。要するに、専用機というのは、機能を削減したコンピューターではない。完全なコンピューターにスパイウェアを仕込んでいるだけなのだ。

どんなプログラムでも実行できる、ただし、実行されてほしくないプログラムや、法律に違反するプログラムや、不利益をもたらすプログラムは実行できないという汎用コンピューターの作り方を、我々は知らない。それに近いものは、スパイウェアを搭載したコンピューターである。コンピューターがユーザーのあずかり知らぬ所で、ユーザーの意思に反して、勝手に動作ルールを決めているコンピューターである。これこそが、DRMがマルウェア(悪意あるソフトウェア)たる所以である。

かつて、ある有名な事件があった。ソニーが六百万枚の音楽CDにルートキットのインストーラーを仕込んでいたのだ。このルートキットはひそかに実行されて、CDの音楽データの読み取りを監視し、妨害するのだ。しかも、カーネルを騙すことで実行中のプロセスとしては表示されず、ドライブ上のファイルとしても表示されない。もちろん、これは唯一の実例ではない。任天堂は出荷した3DSに対して、ファームウェアを更新する際に、既存のファームウェアに改変が加えられていないかどうかをチェックし、もし改変を検出した場合は、3DSを文鎮にしてしまうのだ。

人権団体は、U-EFIという新しいPCのブートローダーに対して非難声明を出している。これは、署名されたOSしか実行できないように制限をかける機能がある。これにより、政府は、政府の検閲や秘密捜査に協力的でないOSの署名を無効にするかもしれない。

これをネットワークに適用すると、ネットワークを著作権侵害に利用できないように政府が規制をかけるだろう。そこで、SOPA、合衆国アメリカのStop Online Piracy Act(オンライン海賊行為防止法)では、DNSSecのようなツールは禁止される。何故ならば、このツールを使えばDNSブロックを回避できるからだ。そして、Tor(訳注:匿名性の高い多段プロキシ―)のようなツールも禁止される。何故ならば、このツールを使えば、IPブロックを回避できるからだ。SOPAの擁護団体、アメリカ映画協会が、SOPAの考察メモに書いている内容によれば、「SOPAは多分うまくいくだろう。なぜならば、すでにシリア、中国、ウズベキスタンが同じ方法を用いており、とてもうまくいっていると報告しているからだ。だからアメリカでもうまくいくに違いない」とさ。

[聴衆から多大な笑い声と拍手] 僕に拍手しないでくれよ。するならMPAAにしてくれ。

さて、SOPAは著作権とインターネットにおける戦争を終わらせる一大事である。もし、我々がSOPAを撃破できたならば、PCとネットワークの自由を守りぬくことができるのだ。しかし、この話の最初に言ったように、これは著作権の話ではない。というのは、著作権なんて、これからコンピューターに振りかかるであろう戦火から比べたら、0.9ベータ版ぐらいなものだからだ。娯楽業界なんてものは、これから来るべき世紀に渡る紛争における、前哨歩兵みたいなものだ。まあ、彼らは善戦していると思うかもしれない。ベスト40に入る音楽とか、リアリティ番組や、アシュトン・カッチャーの映画を守るために、SOPAでインターネットを根本的に破壊しようとしているわけだから。

実のところ、著作権規制というものは、これ以上まともに進展することはないだろう。だからこそ、カナダの議会は、馬鹿げた著作権法案を毎回提出していながら、可決に至っていないわけだ。だから、SOPAという原子レベルまでクソの固まりを寄せ集めて、「バカ250」みたいになってるふざけたものが、クリスマス休暇の後回しにされてるわけだ。世の中にはもっと重要な、国家的に重大な議論が山ほどあるからね、例えば失業保険だとかさ。だからこそ世界知的所有権機関はアホの集まりがアホくさい著作権条約案ばかり出しているんだ。だからこそ世界各国が国際連合に送るのは、治水の専門家であって、著作権の専門家ではない。医療の専門家であって、著作権の専門家ではない。農業の専門家であって、著作権の専門家ではない。なぜなら、著作権というのはそれほど重要ではないからだ。

カナダ議会が著作権法を可決しないのは、カナダ国内の数多くの問題ごと、すなわち健康問題を始めとして、アルバータの石油問題や、フランス語話者と英語話者の共存や、国家の資源問題などに対して、著作権を修正するなんてことの優先度は限りなく低いからだ。著作権の問題なんてものは、その他の分野の経済がインターネットとPCみせる憂慮とに比べたら、ゴミカスみたいなものだ。なぜ別分野はコンピューターの規制に反対するのか。いや、そりゃ今の我々の生活はコンピューターに依存しているからだ。我々はもはや車には乗っていない。コンピューターに乗っている。我々はもはや飛行機には乗っていない。乗っているのは制御装置が多数取り付けられたSolaris機だ。3Dプリンターというのはデバイスではなくて出力装置であり、動作にはコンピューターへの接続を必要とする。ラジオはもはや鉱石ではなくて、汎用コンピューターに高速なADコンバーターとDAコンバーターを取り付けて、いくつかのソフトウェアを走らせているものなのだ。

不正コピーに対する懸念なんて、今このコンピューター依存の現実世界に対する脅威からみれば、ちっぽけなことだ。たとえばラジオだ。今日までのラジオというのは、製造された時点ですでに固定されたものであって、容易に変更できないものであった。手元のポケットラジオのスイッチをいじって航空管制の電波に割りこむなんてことはできない。しかし、強力なソフトウェアによって実装されているラジオは、実行するソフトウェア次第で、ポケットラジオを緊急無線や航空管制に変身させることができる。だからこそ今、アメリカの通信規制団体である連邦通信委員会は、ソフトウェア無線の導入がどのような影響をもたらすか懸念している。彼らは、すべてのソフトウェア無線は規制済みのコンピューター装置に組み込まれるべきではないかと議論しているのだ。要するには、すべてのPCはロックされていて、中央の権威が、実行を許可されるプログラムについて厳格な規制をしくことができるという考え方だ。

これはまだ問題の序章に過ぎない。考えてみて欲しい、今年はAR-15をフルオートに改造するオープンソースの形状ファイルが公開された年である(訳注:不詳。民間用AR-15は規制によってフルオート機能がない。フルオートに改造するための部品の形状をモデリングした3Dプリンターのためのデータのことか?)。今年は個人製作の遺伝子シークエンシングを行うためのオープンソースのハードウェアが登場した年である(訳注:OpenPCRのことであろう。PCRに必要とするハードウェアは原理的に、それほど複雑で精密ではない)。そして3D印刷が面白いことになっている。今や、大人のおもちゃすら印刷できると、アメリカ南部の裁判官とかイランの宗教指導者とかが知ったら、気絶するだろうね。3Dプリンティングは、麻薬密造やセラミックナイフと同じように、規制派の活動を活発化させるだろうね。

ファームウェアの書き換えが可能な自律運転車とか、航空無線に割り込み可能な装置や、化学、生物学上の各種装置などなど、SF作家を待たずとも、規制派が心配するような技術は、今や山ほどある。モンサント社(訳注:遺伝子組換えによる耐性作物を開発している会社。色々と黒い噂が絶えない)が将来、コンピューターが専用の出力装置を使って、彼らの飯の種を食べてしまうような生物を合成できないように、そのような生物を出力するプログラムを実行できないように規制するのは有意義であると主張しないと、どうしていえようか。これが杞憂であるかどうかはともかく、彼らのようなロビー団体や宗教団体、政治団体は、ハリウッドよりもはるかに高い影響力を持っている。そして将来、彼らは皆、同じ結論に達するだろう。「任意のプログラムを実行できるが、我々の利益を損ねるプログラムだけは実行できない汎用コンピューターを作れないのかね? ある二点間において、任意のメッセージを任意のプロトコルで通信できるが、我々の不利益になるような通信は禁止するインターネットを作れないかね?」と。

将来、汎用コンピューターと付随する出力装置を使って、僕をも驚かすような何かをしでかすようなプログラムが現れるだろう。だから、将来ますます、人々は汎用コンピューターを制限することが有意義であると考えるようになっていくだろう。しかし、我々が著作権戦争で目のあたりにしたように、特定のインストラクションやプロトコルやメッセージを禁止するということは、問題そのものの解決には一切ならない。我々が著作権戦争で目の当たりにしたように、PCを制限する試みというのは、すべてルートキットに行き着く。インターネットを制限する試みというのは、監視と検閲に行き着く。だからこそ、この問題は重要なのだ。何故ならば、我々はここ十年来、ラスボスだと思われるものを相手に戦ってきた。しかし、実際には、序盤ステージの最後にいる中ボスでしかなかったのだ。そして、次のステージの難易度は、格段に上がる。

ウォークマンの世代として、僕が老いたときには、補聴器が必要になることに納得している。もちろん、僕が体に装着するのは補聴器ではなく、コンピューターである。僕が車に乗り込む時というのは、自分の体をコンピューターの中に押し込んでいるのだ。もちろん、補聴器も、僕の体の中に装着しているコンピューターだ。僕は、これらの技術に、何か秘密の機能が搭載されていて、僕の意志に反して動作の強制終了を拒否するようになっていないかどうかを確かめたい。

去年のこと、フィラデルフィアの中流の高級住宅街にあるローワー・メリオン高校に不祥事が発見された。この学校は生徒にPCを貸し出していたのだが、このPCにルートキットが含まれていて、ネットワーク接続と内蔵カメラを通じて、遠隔監視できるようになっており、彼らは生徒を何千枚も、校内、郊外、寝起き、着替え、裸に至るまで、盗撮していたことが発覚したのだ。また、現在の諜報機関は、PCやタブレットやケータイのカメラやマイクやGPSを秘密裏に操作できる法的根拠がある。

未来の自由を守るためには、自分の使っているデバイスを検証できる必要がある。実行中のプロセスの検証と終了により、デバイスが自分に忠実なしもべであると確証できる必要がある。コンピューターが犯罪者や諜報機関や規制派のための道具に成り下がってはならない。我々はまだ、敗戦しているわけではない。しかし、我々はインターネットとPCを自由かつオープンに保つため、この著作権戦争に必ず勝利しなければならない。何故ならば、インターネットとPCは、将来の戦争のための武器だから、これ無くして来るべき戦争に勝つことはできない。こういうと早計なように聞こえるが、何度も言っているように、まだこの戦いは始まったばかりなのだ。我々が今戦っているのは中ボスであり、より難易度の高いボスが、やがてやってくる。しかし、良きゲームデザイナーならば当然そうするように、我々に今、最初に与えられたのは、比較的弱いボスなのだ。我々には勝機がある。本物の勝機がある。もし我々が今、オープンかつ自由なシステムを維持し、我々と共闘してくれるEFF、Bits of Freedom、Edrie、Nets Politique、La Quandrature du Netなどの数多くの味方を維持できたならば、我々には勝機がある。戦争に必要な弾薬の準備をしておけ。

なかなか興味深い考え方だ。今我々が直面している著作権などというものは、中ボスでしかないという。本当のラスボスは、汎用コンピューターの自由を脅かす存在である。任意のプログラムを実行できるが、著作権侵害をおこすプログラムだけは実行できないような汎用コンピューターなどというものは存在しない。そんなものをつくろうと試みても、できあがるのは、スパイウェア入りのコンピューターである。DRMなどというものも、くだらない。DRMを解析するのを違法にするというのは、有名な正規表現ジョークと同じで、問題を二つに増やすだけである。

2012-01-07

oldnewthing: なんでHeapFreeがERROR_POSSIBLE_DEADLOCKで失敗するのか?

Why did HeapFree fail with ERROR_POSSIBLE_DEADLOCK? - The Old New Thing - Site Home - MSDN Blogs

ある顧客がassertに引っかかると報告してきた。何でも、HeapFree関数が、全く問題ないヒープブロックに対する操作に失敗し、GetLastError関数の結果は、ERROR_POSSIBLE_DEADLOCKだという。一体何がどうなっているのだ。

私の同僚が持ち前のエスパー能力を駆使して訊ねた。「ひょっとしてプロセスは終了中かい?」

「ええ、まあ。何で分かったんだい?」

プロセスはどのように終了するかという話を思い出して欲しい。まず最初に起こることは、プロセスの他のスレッドをすべて、強制的に終了させるのである。これにより、スレッドによって所有されていた同期リソースがロックされたままになる可能性がある。この場合、同期リソースとはヒープである。

ある関数がHeapFreeを呼んだ際、ヒープのコードはヒープをロックしようとするが、他のスレッドによって所有されているので、ロックできないことを検知する。そして、その他のスレッドはすでに終了しているのだ(他のスレッドはHeapFreeの操作の最中に強制終了される可能性がある)。ヒープのコードはこの状況を検知し、デッドロックを回避して、ERROR_POSSIBLE_DEADLOCKを返す。

これと同様に、プロセスの終了中に、メモリーを安全に確保することはできない。つまり、メモリーは確保も解放もできないのだ。前回学んだように、プロセスが終了中であるならば、クリーンアップなどすべきではないのだ。プロセスのアドレス空間が解放されるときに、メモリーはすべて解放される。手動で解放する必要はない。時間の無駄である。

Windowsにおいて、プロセスの終了中にリソースを解放する必要はない。この単純なルールを理解出来ないWindowsプログラマーは実に多い。そういうプログラマーの書いたコードは、プログラムの終了時にまぬけにも例外エラーを出したりする。

2012-01-03

著作権の保護期間に思う

来年、すなわち2013年には、吉川英治と柳田國男の著作権が切れる。楽しみで仕方がない。

ところで、一つ疑問がある。いま、各国の著作権の保護期間は、微妙に異なっている。たとえば、アメリカの著作権は、法人名義は公開後95年、個人名義は死後70年保護される。一方、日本では、それぞれ公開後50年(映画は70年)、ないしは、個人の死後50年である。ただし戦時加算と旧法の方が保護期間が長くなる場合に注意しなければならない。ということは、アメリカで公開された著作物が、日本では保護期間が満了しているものの、アメリカでは満了していないということが起こりうる。この時、一体どうなるのであろうか。

今、アメリカで作成、公開されたコンテンツがあるとする。日本では著作権が著作権が切れているが、アメリカでは切れていない。このコンテンツを日本国内で合法的に入手し、アメリカに持って行くとどうなるのだろうか。アメリカからみると、私のコンテンツの入手方法は、海賊行為である。しかし、日本からみると、著作権が切れているために、合法である。すでに私は合法な方法でコンテンツを入手したのだから、それは私の所有物である。私の所有物であるということは、アメリカ国内でも合法であろうか。しかし、私がアメリカ国内でも合法的に所有しているのであれば、コンテンツをアメリカ国内で販売できるはずである。まさか、所有はできるが販売はできないなどという中途半端な状態にはならないだろう。とするとやはり、私はアメリカ国内ではこのコンテンツを合法的に所有できないのだろうか。つまり、私アメリカに入国する際には、そのようなコンテンツを持っていかないように気をつけなければならないのだろうか。

これはやはり、博打や大麻とおなじであろうか。日本では、博打と大麻は禁止されている。しかし、外国では、禁止されていない国もある。大麻の場合は、大麻取締法の第二十四条の八に、「第二十四条、第二十四条の二、第二十四条の四、第二十四条の六及び前条の罪は、刑法第二条 の例に従う。」と書かれてあることから、日本人が日本国外で大麻を摂取した場合は違法である。博打の場合には、そのような規定はないので、国外で行う分には合法である。

では、この著作権の保護期間の違いの場合はどうなるだろうか。

2012-01-01

ChromeのNative ClientにMAMEを移植

Case Study: Porting MAME to Native Client - Native Client — Google Developers

ChromeのNative Clientに、MAMEを移植した事例。MAMEというのは、複数のアーケード基盤のエミュレーターである。今はアーケードすら、中身は普通のPCだったりするが、昔のアーケードには、かなり数多くの特殊な基盤があった。MAMEは、有名な数多くのプラットフォームのエミュレーター集のフロントエンドとでもいうべきソフトウェアである。

MAMEをNative Clientに移植するには、結構な障害がある。なにしろ、Native Clientでは、セキュリティ上許可されていない操作が数多くある。たとえば、シグナルだとかディレクトリ操作はできないし、ファイルの入出力も、Chrome側で用意している特別なAPIを用いる必要がある。pthreadの高度な機能も使えない。手書きのアセンブリも問題だ。メモリの保護フラグの変更もご法度である。

MAMEの移植はだいぶ難しく、4日間かかったとのこと。