2017-04-29

マストドン会議で技術と自由を語る

マストドン会議というものがあり、清水亮も登壇するというので行ってきた。

マストドン会議 ―― その無限の可能性を、いま語らずしていつ語らう! ~コミュニティもマーケティングも揺るがすTwitterのライバル出現~ | Peatix

マストドンは日本ではやってからまだ2週間しかたっていない。一体そんな状況で誰が集まるのだろうか。主催は角川が絡んでいるらしいが、まあ、あまり期待はせずに行くことにした。

その日は来るべき超会議2017のリハーサルの日だった。会場の幕張メッセではマストドンブースが設営されていた。私が担当なので当然私も現地にいた。そして少し遅れてマストドン会議の会場に着いた。清水亮は私よりも更に少し遅れて会場入りした。

会場に入ってみると、ぬるかる氏のmastdn.jpにサーバーを提供しているさくらインターネットの人とぬるかる氏が、サーバーの運営上の話をしていた。とても技術的な話だった。よかった。技術の話をしている。これが、「えっとぉ、マストドンはぁ、やっぱりぃ、Twitterをオープンなプラットフォームに持ってきたってところがいいと思うんですよねぇ。ユーザーがソーシャライズされてぇ」などと宣うアホで埋まっていたら会場に向かうまでの時間が圧倒的に無駄であった。何しろ、明日は超会議2017のマストドンブースのために、早朝に会場入りしなければならないのだから。

mastdn.jpの運営は技術的な話と、違法な発言を削除したり犯罪的な名誉毀損発言を繰り返すユーザーをBANしたりといった管理上の話だった。

私がぬるかる氏が話すのを見たのはこれが初めてだが、想定していた人物像と印象と全く違った。私が想定していたぬるかる氏は、陰鬱で物憂いナード青年だった。しかし、この壇上ではなすぬるかる氏はどうだろう。120人の聴衆を前に、一切物怖じせず、言い淀まず、冷静にゆっくりと話を続ける。ぬるかる氏何者?

読者は100人の聴衆の前で話ができるだろうか? 私はできる。私はそれだけの場数を踏んでいて経験があるからだ。私は十分に経験を積んでいるのでストレス耐性があり、緊張することはない。しかし、一度もそのような経験のない一般人は、100人の聴衆を前に事前にほとんど準備も練習もなしで話などできるはずがない。しかるに、ぬるかる氏はほとんど準備も練習もできなかったはずなのに、この冷静さ。ただものではない。

ぬるかる氏が話す途中で、第一部が終わった。

その後、津田大介が誰でも言えるようなくだらない一般論をのたりくたりと話し始めた。一体何なんだこいつは。というよりなんで津田がここにいるのだ。津田はマストドンで何かしたのか? というかお前、最近見かけないな。

津田はラリホーでも唱えているかような眠気を誘うどうでもいい話を延々と行う。誰か津田を止めろ。違うだろ。本当に自由の価値を追求する人間は「オープン」なんて言葉を使わない。秋葉原のオタク文化をいきなり語りだしてどうした。どうでもいいだろ。

技術の話をしろ。

結局、津田という人間はこういう人間なのだろう。かつて、津田が勉強会に参加して登壇者の発言をTwitterで要約して流すという行為に「Tsudaる」という言葉が割り当てられた。それは真実だったのだ。津田というのは人の話を要約して議事録を作成するには向いているのかもしれないが、自分の意見を語りだすとこうもどうでもいい一般論ぐらいしか語れない人間なのだ。

と、こう考えているうちにも津田が延々とのたりくたり。もういいから津田を黙らせろ。ぬるかる氏に話をさせろ。

というところで、清水亮に話が振られた。これは正解だった。清水亮は今まで胡散臭いポエマーだと思っていたが、ただこの業界でやっているだけある。一瞬で雰囲気を激変させた。

清水亮は、まず他の登壇者を退場させた。

「お前ら一旦ハケてくれる?」と。

この一言で、会場の空気は完全に津田の辛気臭い話から怒涛のプレゼンスタイルに激変することになる。

清水亮が話す。声が大きい。津田のラリホーで眠っていたものも叩き起こすような声だ。清水亮の話も、結局誰しもが考えるものである。

  1. TwitterやFacebookでは本音で話ができない。バカな発言をすると炎上する。というか家族が見ている。マストドンでは本音で話ができる。
  2. ユーザーが犯罪予告、わいせつ物、名誉毀損などの発言をしたら削除する必要があるし、BANする必要もある。この管理を人間がやるのはダルい。AIにやらせるべきだ。
  3. マストドンの今の秘密会話は全然秘密ではない。インスタンスがユーザーの意思を尊重して秘密にすることに依存している。アリスとボブが秘密の通信をするときはそれぞれローカルで公開鍵暗号を使って安全に鍵交換を行って暗号文でやり取りすべきだ。

たしかこの程度のことを話したはずだ。これはどれもいまさら言うでもない当然の話で、一般論に過ぎない。しかし清水亮のプレゼン力は優秀で、聞いているものを叩き起こした。

そして私に話が振られる。この流れはよい。大声で話すことならば私とても心得ている。準備とても何もないが、津田がのたりくたりと話している間にmarkdownで書いた数枚の話す要点だけメモ書き程度に書いたものがあったので、これを急ぎpandocでreveal.jsに変換してスライドとする。

技術

まず技術の話だ。ここにきてプログラマーとして登壇して技術の話をしないのはタイヘンシツレイにあたる。

マストドンは技術的にはクソである。

  1. マストドンは教科書的なRuby on Railsで実装されている。つまり富豪的プログラミングだ
  2. マストドンはReactで実装されている。我々がHTMLとCSSとJavaScriptを分離してきたのに全部一緒くたにしてしまう。これではPHPに逆戻りだ。しかも生成されたDOMがクソだ
  3. マストドンの元となったGNU Socialは流行らなかった。その理由はOStatusプロトコルにある。
  4. そもそもOStatusプロトコルのドキュメントがない。存在しない。ネットから消えている。Internet Archiveは我々の友達だ。
  5. OStatusプロトコルはスケールしない。リモートフォローによってインスタンス同士のプッシュ通知で大量にトラフィックとストレージを浪費する

そのため、私はプログラマーとして技術的に判断を下した結果、「マストドンはクソだ」と結論した。

本の虫: そろそろマストドンについて語っておくか

しかし、内部実装が技術的にクソかどうかと、利用者にとって面白いかどうかは、全く関係のない話だ。マストドンは面白い。それは純然たる事実である。スケールしない問題など、インフラを分厚い札束で殴ればいいのだ。

自由

さて、技術について語ったので、次は自由について語る。

まず、そもそも会場の聴衆がどれだけ自由なソフトウェアについて知っているのか。自由なソフトウェアについて知らないならば、その解説から始める必要がある。

「GNUを知っている者は挙手せよ」

なんと、ほとんど全員の手が上がったではないか! なんということだ。聞き間違いではないか。いや、文字に起こせばGNUだが、口頭でいうと「ぐにゅー」だ。そんなへんてこなものを何かと聞き間違えるはずがない。ああ、なんということだ! RMSの地道な活動はついに実を結び、ついにGNUを誰もが知るところとなったのだ。自分は今、猛烈に感動している。

全員、GNUを知っているとなれば話は早い。自由なソフトウェアについて説明する必要はない。

さて、我々のソフトウェアは、RMSとFSFとGNUによってほぼ自由になったが、自由に対する新たな脅威が持ち上がっている。SaaS(Software as a Service)だ。

SaaSとは、例えばGMailであったり、Google Docsであったり、あるいはTwitterやFacebookなどだ。今や、ほとんどのWebサイトはSaaSといってよい。

我々がWebサイト上で何かをするとき、その処理の大半自分の所有するローカルのコンピューターではなく、サーバーが行っている。我々はサーバーを所有していないし、サーバーを支配していない。ということは、我々のローカルのコンピューターは自由かもしれないが、サーバーは自由ではない。そして、今や処理の殆どはサーバーで行われている。

これは非常に辛い問題で、我々が所有も支配もしていないコンピューターは、我々の自由にならないのは当然の話だ。私のコンピューターは私の所有しているものであり私が支配している。私のコンピューターが他人の意思で私の望まない処理をされてほしくはない。その理屈で、我々はサーバー側に自由を求めることができない。自由はコンピューターの利用者にかかるもので、サーバーのコンピューターの利用者は、我々ではないからだ。我々は利用者の慈悲によって処理を肩代わりしてもらっているだけだからだ。これはGPLでもどうしようもない。

そこで、AGPLだ。AGPLはGPLと非互換なライセンスで、サーバーに対しても適用される。AGPLなソフトウェアをサーバー上で動かして、それによってサーバーが提供するサービスの利用者には、AGPLに従ってサーバーで動くソフトウェアを自由にしなければならない。つまりユーザーに対してソースコードを公開しなければならないし、その気になればユーザーが全く同じ互換サーバーを立ち上げることも可能になる。

マストドンのライセンスはAGPLである。

そして、マストドンは流行った。ぬるかる氏が2週間前にマストドンのインスタンスを立ち上げてからというもの、この日本で圧倒的にマストドンが流行した。すると、個人や企業が先を争ってマストドンのインスタンスを立てたがる。しかし、そうやって立てる? それにはマストドンを使うしかない。マストドンはAGPLだ。AGPLにしたがってソースコードを公開しなければならない。もし、自分のインスタンスに何らかの改変を加えた場合、それも正直に公開しなければならない。

マストドンの互換サーバーを独立して実装すれば、そのソフトウェアは自分の好きにできる。しかし、そのようなソフトウェアを開発すには、半年、1年、場合によってはもっとかかる。今、この瞬間にマストドンのインスタンスを立ち上げるには、マストドンしかない。ところでマストドンはAGPLである。

この状況は、社内政治などをすっ飛ばしてAGPLを強制させた。いまマストドンを建てないと流行に乗り遅れる。その機会損失と、未だに根強い自由ソフトウェアへの抵抗を天秤にかけて、機会損失が勝ったのだ!

今や、プロプライエタリな製品を販売していた不自由な企業まで、先を争ってAGPLなサーバーを立てるようになったのだ! なんという素晴らしい世界だろう。一体どんな奇跡が起こったというのだ! 私は信じられない光景を目にしている。ああ、自由が尊重されている!

そう、すでに変化はドワンゴ社内にも起こっている。自由ソフトウェアの忌避はドワンゴとても例外ではない。結局社内のリソースを割いて書いたコードを表に出すには、色々と社内政治や偉い人たちの判断などが必要になる。マストドンは最初からAGPLなので、もはや社内政治などと言っている場合ではない。自由になるか、使えないかだ。

そして、本当に奇跡のような展開が起こる。

ドワンゴのエンジニアであるまさらっきが、マストドンに脆弱性を発見したので、修正するPRを送った。

use Twitter::Extractor for creating links by masarakki · Pull Request #2502 · tootsuite/mastodon

すると、マストドンの開発者のオイゲンが、ABCanGを呼び出して、問題を見るように指示する。ABCanGはPixivのエンジニアである。なぜPixivのエンジニアが呼ばれるのかと不思議に思ったら、どうやら該当部分を実装したのはABCanGだそうだ。なるほど、納得だ。

しかし、実はこれは画期的なことである。

そもそも、ドワンゴとPixivはお互いに競合するサービスを提供している企業である。Pixivは絵の投稿サービスを提供していて、ドワンゴもニコニコ静画などの絵の投稿サービスを提供している。このため、基本的に両社は商売敵である。

一時期、Pixivはニコニコ静画へのリンクを検閲するというような強硬な処置さえ行った。

『pixiv』にニコニコのURLを貼ると「有害サイト」として削除される!? ニコニコ担当「非常に残念」 | ガジェット通信

その犬猿の仲であるPixivとドワンゴが相手の不具合を修正して助けているだと。ああ、自由の価値ここに極まれり。

自由は素晴らしい。

しかし、この自由が今、脅かされつつある。スマフォアプリだ。

そもそもスマートフォンは不自由なコンピューターである。iPhoneもAndoridも不自由だ。しかも、AppleやGoogleが提供するアプリの流通プラットフォームは、利用者に不自由なEULAへの同意を求めるので、GPLと互換性がない。スマートフォンを使う時点で不自由で、配布されるアプリも不自由だ。スマートフォンは不自由の塊なのだ。

そして、マストドンのにわかの流行により、雨後の筍のようにぽこぽことマストドンクライアントアプリがストアに並び始めている。いま開発中のものも大勢いるだろうから、今後はもっと増えるだろう。

しかし、よく考えてもらいたい。マストドンは自由だ。自由の価値は素晴らしい。その自由をあえて放擲するのか。不自由なクライアントで閲覧するマストドンは美味いか?

不自由なコンピューターであるスマートフォンの利用は拒否すべきである。

Twitter独占の弊害

なぜマストドンはTwitterより優れているのか。それは、誰もがマストドンのインスタンス、つまりサーバーを建てられるからである。Twitterではこうは行かない。

Twitterでは、Twitter社は正しい。Twitter社の判断は正しい。もしTwitter社がユーザーをBANしたのならば、もちろんそれは正しい。疑問を差し挟むことは許されない。Twitterの判断を疑うことは反逆でありBAN対象である。そのスモーレスラーの画像はわいせつ物なのでBANするのは当然だ。さすがTwitter様。完璧なTwitterユーザーは完全に幸福です。実際、幸福は義務です。ユーザー、あなたは幸福ですか?

現実のTwitterはここまでひどくないかもしれない。しかし、Twitter社がこのような運営をしても、逆らう方法はない。我々はTwitter社の慈悲にすがるしかないのだ。

自由なマストドンではこの恐れはない。あるインスタンスが気に入らなければ、別のインスタンスに行けばよい。自分の思想を受け入れるインスタンスがなければ、自分でインスタンスを立てればよい。自分の思想を受け入れるクラウドやVPSベンダーがなければ、自前でサーバーを立てればよい。もし、自分の思想を受け入れるISPが存在しなければ、それはシーランド公国にでも行くしかないだろう。

そして、マストドンではユーザーがインスタンスの違いをほとんど意識することがない。自由の圧倒的勝利だ。ああ、なんて世界だ!

ドワンゴ広告

ドワンゴは本物のC++プログラマーを募集しています。

2017年4月40日、5月1日に幕張メッセで開催される超会議2017には、マストドンブースがあります。江添亮がブース担当です。ドワンゴが立てたマストドンのインスタンス、https://friends.nicoのインスタンスの宣伝、マストドンステッカーの配布、マストドンについての質問、江添亮がライブマストドンするなどのさまざまな楽しいイベントがあります。

その他にも様々なブースがあるので楽しめますよ。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

2017-04-27

KaTeXを使ってみた感想

ブラウザー上で動いて、texの数式を描画するライブラリには、有名なMathJaxの他に、KaTeXがある。

Khan/KaTeX: Fast math typesetting for the web.

KaTeXにはMathJaxにない様々利点があるが、欠点も多い。

マストドンで数式描画をするのにMathJaxの代わりにKaTeXが使えないかと試してみたが、結論から言うと、KaTeXはマストドンで使うのに適さない。

KaTeXは以下の用途で使うのに適している。

  1. 自分一人、あるいは十分に訓練されて連絡を密に取り合う人間だけで編集された文書
  2. 数式に間違いがなく、KaTeXで処理できること

以下のような場合には適さない。

  1. 不特定多数の人間が数式を入力する
  2. 数式は文法的に誤りを含む可能性がる

KaTeXの利点

KaTeXはMathJaxに比較して様々な利点がある。

速い。文句なくMathJaxより速い。

KaTeX and MathJax Comparison Demo

実装が軽量で依存がなくWebサイトに組み込みやすい。

JavaScriptファイル一つ、CSSファイル一つ、あとはフォントファイルしかない。

KaTeXはかなり理想的なのだが、問題がある。

数式のパースエラーに非寛容

数式がtexの文法違反だったりするとすぐに例外を投げる。例外を無効化もできるが、基本的にパースエラーを出した時点でそれ以上の処理を拒否する。

CJK文字に対応していない。

これは本当に耐え難い問題だ。我々は$力=質量\times加速度$を書くときは、

$力=質量\times加速度$

と書きたい。しかし、KaTeXはCJK文字に対応していない。

一応、\text{}で囲めば使えるらしいが、それは式の意味を買えてしまうし、第一、

$\text{力}=\text{質量}\times\text{加速度}$

とは書きたくない。そもそも意味が変わってしまう。不特定多数のユーザーがいる場合にこれを守らせるのも難しい。それにこうしてもやはりCJK文字の扱いには問題がある。

それ以外にも、基本的にエラーを出すと処理を中止するようになっていて、本当に使いづらい。

このため、KaTeXはマストドンで使うのに適さない。

2017-04-26

どんなWebページでもtexによる数式描画を追加できるブラウザー拡張

EzoeRyou/inject-mathjax: どんなWebページにもMathJaxをロードするブラウザー拡張

任意のWebページにMathJaxを読み込ませてtexによる数式表現を化膿するChromium, Google Chrome向けブラウザー拡張。

インストール


git clone
vim whitelist_urls.conf
make

してからChromiumにインストールする。

whitelist_urls.confには一行にひとつ、MathJaxを読み込ませたいURLをマッチパターンで記述する

Match Patterns - Google Chrome

特徴

このブラウザー拡張はwhitelist_url.confに記述したマッチパターンのURLに対し、

  1. CSP(Content Security Policy)を無効化する
  2. MathJaxをロードする
  3. MathJaxを定期的に呼び出す

という処理を行う。

類似のブラウザー拡張より優れている点

すでに類似機能を提供しているブラウザー拡張があるが、コンピューターリテラシーのないユーザーのためにあまり洗練されていない実装になっている。

CSPの普及により、多くのWebサイトでは外部ドメインのスクリプトがロードできなくなっている。CDN経由でMathJaxをロードするには、まずCSPを無効化しなければならない。CSPはセキュリティを向上させるものであり、不必要に無効化すべきではない。そのため、MathJaxをロードする必要があるURLのみ無効化すべきだ。 Chromium, Google ChromeでCSPを無効化するには、レスポンスヘッダーをブラウザーが解釈する前に改変するブラウザー拡張用の機能を使う。そしてCSPの部分を削除する。

これは以下のようなコードになる。


for (var i = 0; i < details.responseHeaders.length; i++) {
    if ('content-security-policy' === details.responseHeaders[i].name.toLowerCase()) {
        details.responseHeaders[i].value = '';
        // 実際にはCDNを追加するのでもう少しマシ
    }
}

巷に出回っているブラウザー拡張は、このレスポンスヘッダーからCSPを削除するためのコールバック関数を、すべてのURLに対して読み出す。そして、自薦に設定したURLのみに適用するように条件分岐する。


function( details ) {

    if ( !is_whiltelist_urls(details.url) )
        return ;
}

ブラウザー拡張側のコードでURLを判定している。

理想的には、ブラウザー拡張のmanifest.jsonのpermissionsで適用されるURLを厳しく指定すべきだ。しかし、そのためにはユーザーがmanifest.jsonを変更する必要がある。

このブラウザー拡張は、whitelist_urls.confに記述されたマッチパターンをpermissionsにもつmanifest.jsonを生成して、ブラウザー拡張をユーザーが作るようになっている。

2017-04-24

マストドンで数式を表示するブックマークレット

読者はすでにマストドンをしているだろうか。マストドンは自由なSNSで未来がある。もはや不自由なSNSであるTwitterやFacebookの時代は終わった。今年中にも滅びるだろう。

さて、マストドンで不便な点として、数式が表示できないという問題がある。しかし、これは自由なソフトウェアであれば改良が可能だ。

以下のリンクをブックマークバーまでドラッグするか、URLをコピーしてブックマークとして追加しよう。

#mathトドン

そして、マストドンを開いたタブで、ブックマークをクリックするのだ。

すると、

$$
 \mathsf{K}_\nu(x) =
  (\pi/2)\mathrm{i}^{\nu+1} (            \mathsf{J}_\nu(\mathrm{i}x)
       + \mathrm{i} \mathsf{N}_\nu(\mathrm{i}x)
       )
  =
  \left\{
  \begin{array}{cl}
  \displaystyle
  \frac{\pi}{2}
  \frac{\mathsf{I}_{-\nu}(x) - \mathsf{I}_{\nu}(x)}
       {\sin \nu\pi },
  & \mbox{for $x \ge 0$ and non-integral $\nu$}
  \\
  \\
  \displaystyle
  \frac{\pi}{2}
  \lim_{\mu \rightarrow \nu} \frac{\mathsf{I}_{-\mu}(x) - \mathsf{I}_{\mu}(x)}
                                  {\sin \mu\pi },
  & \mbox{for $x \ge 0$ and integral $\nu$}
  \end{array}
  \right.$$

$$ \mathsf{K}_\nu(x) = (\pi/2)\mathrm{i}^{\nu+1} ( \mathsf{J}_\nu(\mathrm{i}x) + \mathrm{i} \mathsf{N}_\nu(\mathrm{i}x) ) = \left\{ \begin{array}{cl} \displaystyle \frac{\pi}{2} \frac{\mathsf{I}_{-\nu}(x) - \mathsf{I}_{\nu}(x)} {\sin \nu\pi }, & \mbox{for $x \ge 0$ and non-integral $\nu$} \\ \\ \displaystyle \frac{\pi}{2} \lim_{\mu \rightarrow \nu} \frac{\mathsf{I}_{-\mu}(x) - \mathsf{I}_{\mu}(x)} {\sin \mu\pi }, & \mbox{for $x \ge 0$ and integral $\nu$} \end{array} \right.$$

と表示される。ちなみにこれはIrregular modified cylindrical Bessel functionだ。

これで、マストドンで数式を表現できる。このブックマークレットを使っているもの同士ならば、数式で会話できる。

ちなみに、コードは以下の通り。

(function(){

var config = document.createElement( "script" ) ;
config.type = "text/x-mathjax-config" ;
config.appendChild( document.createTextNode( 'MathJax.Hub.Config({tex2jax: {inlineMath: [["$","$"], ["\\\\(","\\\\)"]]}});' ) ) ;

document.head.appendChild(config) ;

let script = document.createElement( "script" ) ;
script.type = "text/javascript" ;
script.async="async" ;
script.src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_SVG" ;

let inner_script =
    'window.setInterval( function() { MathJax.Hub.Queue(["Typeset",MathJax.Hub]); '
+   'let textarea = document.getElementsByClassName("autosuggest-textarea__textarea")[0] ;'
+   'if ( textarea !== null && textarea.value === "" )'
+       'textarea.value = "#math " ;'
+   '}, 1000 ) ;' ;


script.appendChild( document.createTextNode( inner_script ) ) ;

document.head.appendChild(script) ;
})() ;

ちなみに、このコードはデフォルトで入力欄に#mathを入力する。この挙動が気に入らない人は、以下のブックマークレットを使うとよい。

mathトドン

コードは以下の通り。

(function(){
var config = document.createElement( "script" ) ;
config.type = "text/x-mathjax-config" ;
config.appendChild( document.createTextNode( 'MathJax.Hub.Config({tex2jax: {inlineMath: [["$","$"], ["\\\\(","\\\\)"]]}});' ) ) ;

document.head.appendChild(config) ;

let script = document.createElement( "script" ) ;
script.type = "text/javascript" ;
script.async="async" ;
script.src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_SVG" ;

let inner_script = 'window.setInterval( function() { MathJax.Hub.Queue(["Typeset",MathJax.Hub]); }, 1000 ) ;' ;



script.appendChild( document.createTextNode( inner_script ) ) ;

document.head.appendChild(script) ;
})() ;

2017-04-20

ここらでもう一度マストドンについて語っておくか

オレが間違っていたぞ、清水亮。

なんで「オレが間違っていた」と最初に書けないのか。つまんねープライドもってんなー

-- 清水亮

https://mstdn.onosendai.jp/users/shi3z/updates/1002

前回、前々回と、マストドンについての批判を書いた。結論を先に書くと、私の技術上の懸念以外の懸念はすべてあたらなかった。

本の虫: そろそろマストドンについて語っておくか

本の虫: マストドンが直面している問題はすでにP2P技術が15年前に遭遇した問題だ

そうこうしていると、ドワンゴがマストドンのインスタンスを立ち上げた。

https://friends.nico/

これはなかなか興味深い。というのも、私はドワンゴに雇用されているので、ドワンゴが悪意を持っているかどうかについては内部の情報があるため判断しやすい。マストドンはインスタンスの管理者が悪意を持っているかどうかが極めて重要だ。内部の情報をもって判断した結果、今は信用できそうだ。

そこでものは試しとアカウントを作ってみた。

EzoeRyou

そして、感動した。これだ。久しく忘れていたインターネットがここにある。何ということだ。

そこにあったのは、黎明期の怪しげな雰囲気を持つインターネットだった。今から20年ほど前の2chやIRCの雰囲気だ。インターネットよ、私は帰ってきた。

ともすればインターネット老人会とも揶揄される環境がそこにあった。我々はぬるぽにガッされ、ゴノレゴが吉野家のにわか客に文句を言い、ペリーに開国を迫りミキコにピアノを教えるあの空気が再現されていた。

そうだ。当時もこうして、夜遅くまで寝不足になりながらインターネットを閲覧したものだ。そうこうしているうちに、誰かがセンシティブなコンテンツのフラグが立てられた画像が投下される。みてみるとうまそうな飯テロ画像であった。「これはけしからん、無修正じゃないか」と文句を言うと、こんどはモザイクをかけた飯テロ画像が投下される。

開始当初のマストドンのドワンゴインスタンスには優れた点が二つある。まずエロが投下されないことと、誰も煽り合わないことだ。放っておいても人はエロを探すし、勝手に煽りあう。そういうものだ。

インターネットからきらめきと魔術的な美がついに奪い取られてしまった。2chや、IRCや、アングラサイトがユーザー達と共に中二病を誇り合い、徹夜でチャットにあけくれ、不毛なネット議論を繰り広げる。そんなことはもう、なくなった。

これからのインターネットユーザーは、安全で静かで、物憂いスマフォを握って、画面を受動的にタップ操作のみする。一方何千というコンテンツ達が、アルゴリズム一つで機械の力によってフィルターされ、検閲される。これから先のインターネットは、安全と引き換えにその娯楽性を完全に殺すだろう。

やがてそれぞれのプラットフォームには、大規模で、限界のない、一度発動されたら制御不可能となるような検閲のためのシステムを生み出すことになる。

人類ははじめて自分たちが手に入れた自由な情報流通手段を、みすみす自ら手放すことになる。これこそが人類の栄光と苦労のすべてが最後に到達した運命である。

結局、Twitterなどの大手のSNSはあまりにも有名になりすぎ、あまりにも大衆化しすぎたために、つまらなくなってしまったのだろう。大衆受けを目指すと、きらめきと魔術的な美が失われてしまうのだ。

この歴史は連続している。パソ通が、あめぞうが、2chが、ニコニコ動画が、開始当初はこの黎明期特有の怪しいきらめきを有していたが、大衆化に伴って消失してしまったのだ。これはどうしようもないことだ。大衆化の過程で、より多くの、より幅広い人間に受け入れやすくなり、その結果利益を出すことができ、その利益をプラットフォームの維持と拡張に使うことができる。大衆化をしない場合、利益が出ずにプラットフォームが継続できないとしたら、結局大衆化するしかない。

もちろん、これはドワンゴのマストドンインスタンスとて例外ではない。いずれはユーザーが集まりすぎて大衆化して万人受けにはなるが陳腐化するか、ユーザーが集まらず過疎化してひっそりと消失するかのどちらかになるだろう。どちらにしても、現在のこの魔術的な美は速やかに失われるだろう。

せめて今は、この雰囲気を楽しむとしよう。

さて、ポエムを書くのはここまでにして、技術的な話をしよう。

マストドンと元になったGNU Socialは、OStatusというプロトコルを使っている。このプロトコルの詳細な内容を筆者は知らない。

というのも、OStatusプロトコルの網羅的なドキュメントが存在しないからだ。5年前は存在していたのかもしれないが、散逸してしまっている。本来ドキュメントをホストしていたはずのURLのドメインの所有者が変わって全く関係ない内容になったりしている。

それでも散らばっているドキュメントを読んでキーワードを拾っていくと、ユーザーの発見にWebFinger、購読にPubSubHubbub、メッセージのやり取りにSalmonを使っていることなどがわかった。あるいは、OStatusプロトコルという単一のものはなくて、細分化されたプロトコルの寄せ集めでできているのかもしれない。

さて、プロトコルの技術的な詳細は後で調べるとして、筆者の理解する限りでは、OStatusプロトコルはスケーラビリティの問題を抱えている。おそらく現在の設計では、規模が拡大したときに、負荷がとても増えていくはずだ。なので、Twitterを代替するほどの規模で成立できるかどうか疑問だ。

また、ユーザーの認証がサーバーに結びついているのも問題だ。ユーザーの発見と認証のプロトコルであるWebFingerを調べたところ、どうやらユーザーには絶対に変わらない永続URLが必要なようだ。これではサーバーレスな実装は困難だ。

したがって、規模の小さい今はこのままOStatusプロトコルを使うのはいいとしても、早急に別のより優れたスケールするプロトコルを設計すべきだろう。

ただし、この技術的にスケールしないという問題は、実は問題にならないかもしれない。というのも、1インスタンスに数万人もユーザーが殺到するような状況を作り出さなければいいのだ。したらばやRedditのように、ユーザーが自分の管理するインスタンスを立ち上げるようなサービスにして、1インスタンスあたりのユーザーを抑える文化を作り出せば、スケールは問題ではなくなる。たかだか1万に満たない程度のユーザーを処理するならば、どんなに富豪的な設計でも耐えられる。ユーザーがジャンルごとにインスタンスを作り、自治を行う。楽しい世界だ。

例えば支持政党ごとにインスタンスがあり、自民党支持者は自民党インスタンスに、民進党支持者は民進党インスタンスに登録する。そしてインスタンス間の戦争が起き、連結が遮断される。「我々自民党インスタンスは民進党インスタンスとの連結を解除した。これは民進党が我々の党議に賛同しないからである」などといった具合だ。

さて、最後に自由の話をしよう。

マストドン、GNU Socialにとって、自由は極めて重要だ。なぜならばその開発目的が、SNSプラットフォームの独占の打倒にあるからだ。

マストドンとGNU Socialでは、サーバー実装が自由なライセンスであるAGPLで公開されているので、誰でも必要なインフラさえあれば、マストドンでは「インスタンス」と呼んでいるサーバーを建てることができる。あるインスタンスの管理が気に食わないのであれば、別のインスタンスを使えばよい。気に入るインスタンスがないのであれば、自分で立ち上げればよい。これによりTwitterやFacebookのような一企業に独占され、一企業の一存で好きなように検閲される問題を解決できる。

すでに解説したように、大抵のユーザーは自前のインスタンスを立ち上げるのではなく、有名なインスタンスに集中する。大勢のユーザーの負荷に耐えられるインフラを運営するには、企業でしか支えられないほどの資金と労働者が必要だ。すると特定のインスタンスが独占的な地位を得て、ユーザーを囲い込み、外部との連結を無効化するという邪悪に走るだろう。そう考えていた。

たしかにその懸念はあるのだが、現実は違った。そのような鎖国を嫌う文化が生まれていれば、利用者の期限を損ねないように、そのような邪悪を行わないインセンティブが生まれる。

ああ、先見性というのは難しいものだ。すっかり見誤った。

結果として、マストドンは流行るだろう。もうTwitterに独占される必要はないのだ。

2017-04-16

マストドンが直面している問題はすでにP2P技術が15年前に遭遇した問題だ

Media content caching strategy · Issue #1847 · tootsuite/mastodon

日本勢がマストドンに目をつけ始め、Pixivがマストドンのインスタンスを立ち上げてからというもの、マストドンは2つの問題に直面している。

  1. 日本国内で合法である現実に基づかない純粋な思想の表現である絵が海外基準では児童ポルノであり違法なデータである
  2. 画像投稿を主目的とするPixivの利用形態により大量のトラフィックとストレージがキャッシュとして消費されるため貧弱なインフラでは耐えられない

これにより、Pixivによるマストドンのインスタンスは海外で主流のマストドンのインスタンスから遮断された。

現在、マストドンのコミュニティではこの問題に対する議論が行われているが、この問題には見覚えがある。15年前のP2P技術が流行した時代と同じ問題だ。我々は歴史に学ぶべきである。

今をさかのぼることおよそ15年前、P2P技術があらゆる問題を解決する夢の技術として期待されていた。当時、P2P通信により、インターネット上に分散メッシュネットワークを構築し、その分散メッシュネットワーク上に、ファイル共有、掲示板、チャット、ブログ、Webページ、その他あらゆるネットワーク通信を実装していた。純粋な分散メッシュネットワークでは、すべての参加者が、計算機、ストレージ、トラフィックなどの資源の大小を別にすれば、平等である。

その実装方法は様々で、例えば特定の機能に特化した実装、例えば、ファイル共有や掲示板のWinny、ファイル共有のBitTorrent、チャットのSkypeのような実装もあれば、Webページのようなより汎用的な機能を提供するfreenetのような実装、あるいは分散メッシュネットワークを構築した上でローカルsocksプロクシーサーバーとして動作して通過的にTCP/IPをアプリケーション層に提供するような実装もあったはずだ。

その具体的な実装方法については様々な方法が乱立して試されたが、どれも同じ問題を抱えていた。現在のマストドンが抱える問題と同じだ。

  1. 著作権侵害、児童ポルノ、その他の違法なデータ(ドイツにおけるナチ党のシンボルなど)がネットワーク上に蔓延する
  2. ネットワークに参加するノードがキャッシュとしてデータを溜め込むためにネットワークに参加するための計算機、ストレージ、帯域などの資源が莫大になり、個人が参加しづらくなり、結果としてゲートウェイ経由での参加が増える

その結果どうなったか。まず、ソースコードを公開せず、プロトコルの仕様も公開しないような閉鎖的な実装であるWinnyは滅びた。純粋な分散メッシュネットワークにこだわったfreenetのような実装は問題2.によってスケールせずに非効率性によって実質的に廃れた。

当時を生き延びて今も使われている実装もある。例えばSkypeとBitTorrentだ。

Skypeは当初P2Pな分散メッシュネットワーク(完全に平等ではなく、特にトラフィックに余裕のあるノードがスーパーノードとして局所的な管理サーバーの役割を果たし、NAT超えのために通信を仲介するリレーノードも存在した)によるチャットの実装であったが、今ではMicrosoftの管理するところとなり、その実装はサーバークライアント型の中央集権的で効率的な実装に切り替わった。もはや、今のSkypeはP2Pではなくなってしまった。とはいえ、表向きの末端のユーザーに対する利便性には違いがないので、よく使われている。

BitTorrentプロトコルは当初、純粋な分散メッシュネットワークではなかった、サーバーでファイルのメタデータやファイルを保有しているシードと呼ばれるノード、ファイルをダウンロード中のピアと呼ばれるノードを管理する。ファイルをダウンロードするには、すでに完全なファイルを保有しているシードの他に、現在部分的にファイルを保有しているピアからも分散してダウンロードを行う。後にファイルのメタデータに対するハッシュ値だけで、ファイルのメタデータとピア/シードの取得も分散メッシュネットワークを介して行う実装も追加されたが、依然として最初のハッシュ値を分散メッシュネットワーク単体で検索したりする機能は提供されないので、やはり何らかの中央管理的なサーバーは必要だ。

P2P技術を利用したファイル共有には著作権侵害などの負のイメージがつきまとうが、BitTorrentプロトコルは数あるファイル共有プロトコルの中でも、特にサーバー側で多大なトラフィックが必要ないという点から、今でも自由なOSのISOイメージの配布とか、ソフトウェアのアップデートを全コンピューターに行き渡らせるためなどの目的で活用されている。

当時のP2P技術を考え、現在の実用化された例を参考にすると、問題の解決方法が見えてくる。

問題1.を解決するには、結局有人の検閲を設置するしかない。問題2.は解決できない。純粋な分散メッシュネットワークによりすべての参加者が平等であることを目指すのであれば、すべての参加者が平等に全ネットワークのコストを負担するので、ネットワークの規模が拡大するほど参加者の負担が増えてしまう。

さて、話をマストドンに戻そう。マストドンはOStatusプロトコルの実装で、もともとは当初StatusNetと名乗り、今はGNU Socialと名乗っているソフトウェアの互換実装だ。その目的は、単一の企業からのSNS支配の解放だ。

その思想と設計はこうだ。TwitterやFacebookのような一企業がSNSの実装とインフラを独占しているから不平等な権利格差が発生するのだ。SNSの自由な実装を提供し、誰もがSNSのインスタンス(サーバー)を立ち上げることができればこの権利格差は解消する。インスタンス同士がデータを相互にやり取りできるように互換性のあるOStatusプロトコルで通信できるようにしておけば、どのインスタンスを選ぶかという問題は、どのインスタンスが便利で信頼に値するかという問題になる。既存のインスタンスのどれもガキに食わないのであれば、自分でインスタンスを立ち上げればよい。

考えようによっては、サーバー同士がゆるくわずかにP2P風に繋がっていると考えることもできる。もちろん、分散メッシュネットワークほどの強い結びつきではない。RSSをすこし強力にしたようなデータ共有用のOStatusプロトコルでお互いにデータを共有できるという程度の薄いつながりだ。

さて、問題1.に対処するには、有人の検閲を設置するしかない。有人の検閲を設置するには、結局企業としての資本や雇用が必要だ。企業による支配から脱却することを目指しているマストドンとしては皮肉なことに、企業が必要になる。自分のインスタンス内のデータの適法性については十分な資本と労力さえかければ検閲できるが、よそのインスタンスのデータはどうしようもない。すると、外から内へのリモートフォローは無効化せざるを得ない。

問題2.に対処するには、強力なインフラが必要だ。大規模なデータセンター、ストレージ、トラフィックを提供する必要がある。これにも、企業による資本が必要だ。ネットワークの規模が大きくなっていくと、これまた皮肉なことに個人ではその規模のインフラを提供できず、企業には勝てない。そして、規模が大きくなっていくと、すべてを無制限にスクレイピングできるAPIを外部に提供することがパフォーマンス上難しくなっていくだろう。そこで、内から外へのリモートフォローも無効化せざるを得ない。

こうして、マストドンのインスタンスをまともに運営できるのは十分な資本と、最低でも数百人規模の労働者を雇用している潤沢なインフラを提供できる企業だけになるだろう。個人がマストドンのインスタンスを立ててももはやマストドン全体のデータを格納できるだけのトラフィックとストレージを用意することすら難しくなる。現在のマストドンは、個人でもインスタンスが建てられるような小規模な実装になっている。ユーザーが増えていくと、企業はマストドンを大規模なインフラ上でスケールさせるために実装を改善していくだろう。そのような大規模にスケールする実装は、個人でインスタンスを立てるのが難しくなってしまうだろう。

そして、自らが管理するインスタンスだけで何十万、何百万ものユーザーを獲得した企業は、もはや外のインスタンスと連携する必要すらない。自らのユーザーだけで自己完結できるのだから、検閲上、パフォーマンス上の理由も合わせて、外部との連携を断つ。これは企業として適切な判断ではあるが、結果としてユーザーは分断される。

その結果実現される未来は、現在のTwitterの実装が公に公開される程度の未来だ。誰でもTwitterと同じサービスを提供するサーバーを立てることは技術的に可能だ。ソフトウェア実装はすべて公開されている。ただしインフラの規模は個人で実現できる範囲を大幅に超えている。

結局、マストドンは思想的にも設計的にも、当初の目的である単一の企業からのSNS支配の解放を達成することはできないだろう。仮にマストドンがTwitterを置き換えたとしても、マストドンのインスタンス運営のためには十分な資本、労働者、インフラ、政治ロビー活動ができる企業が必要になり、現在のTwitterと同じ問題が発生する。ユーザーはマストドンが極めて抑圧的であると不満を持ち、やがて、「既存のマストドンの代替する分散型のSNS実装を公開する。これは単一のマストドンコミュニティにより我々のコミュニケーションが独占されるリスクを防ぐ!」などという運動が持ち上がることだろう。歴史は繰り返す。

唯一の救いは、マストドンのライセンスはAGPLであるので、その実装が公に公開されるということだろう。

追記:Winnyの金子勇が自著でプロトコルを公開したのは、金子勇が刑事裁判に巻き込まれてからであり、もはやWinnyは廃れて、競合の同等機能を提供する他のP2Pファイル共有ソフトウェアの方に人は移行していた。

2017-04-15

そろそろマストドンについて語っておくか

世間ではマストドンが流行っている。結論から言うとマストドンは思想的にも設計的にも失敗しているのでお祭りのように一時の話題になった後、急速に忘れ去られる運命にある。

マストドンを語るには、まずマストドンが実装しているプロトコルであるOStatusについて説明する必要がある。これはもともと、StatusNetというソフトウェアが提唱したプロトコルで、Twitterようなマイクロブログの更新通知のためのプロトコルだ。StatusNetは今は名前を変えてGNU Socialとして自由ソフトウェア財団の傘下になっている。

マストドンはいうなればGNU Socialの互換実装だ。その基本的な思想や設計はGNU Socialと同じだ。どちらも現在の大手ソーシャルネットワークサービスに共通の問題に対処しようとしている。

問題とは何か。権力の一極集中である。TwitterにしろFacebookにしろGoogle+にしろ、そして現在ブログの文章を主にホストしているBloggerやGitHubも、筆者より強い権限を持っている。もしこの文章の内容が、彼らの気に食わないものである場合、彼らの一存のよりこのブログは削除、改変、監視といった検閲を受ける。これはTwitterやGoogleが技術的にサーバーを管理しているために生じる問題だ。

この問題に対処するにはどうすればいいのか。我々全員がサーバーを運営できるようになればいい。インターネットの当初の目的は、全員がサーバーを運営できるようになることだった。残念ながら、ハードウェア資源の制約、IPv4アドレスの枯渇、NAT、不思議な日本国内の法律(プロクシーサーバーを運営する出稼ぎ中国人を日本国政府が都合よく別件逮捕するのに使われている通信事業者法)により、我々は自由にサーバーを運営できるようにはなっていない。しかし、少なくともサーバーの実装であるソフトウェアを提供し、サーバーの設置をかんたんにしてはどうか。

GNU Socialやマストドンはこのような思想で設計された。Twitter社の方針が気に入らないのであれば、別のサーバーに移住すればよい。どのサーバーも気に入らないのであれば、自分でサーバーを立ち上げればよい。

思想としては悪くはないのだが、技術的にはあまりよろしくない。GNU Socialの前身StatusNetは2010年から開発が始まっているが、一向に主流とならない。主流となっていないソフトウェアには主流になれない問題があるのだから、その互換実装を作っても主流となるわけがない。では一体何が問題なのか。

サーバーの設置は自由なソフトウェア実装が存在するだけではだめで、十分な性能を持ったコンピューターと十分なネットワーク帯域が必要になる。GNU SocialはPHPで実装されているし、マストドンはRuby on Railsで実装されている。実行には普通にWebサーバーを運営するのと同じだけの煩わしさがある。

これだけサーバーの実行が面倒だと、結局、既存のサーバーを利用するものが大半だろう。その結果、どこかの学生が1個人が運営している怪しげなサーバーに人が集中する。これはとても問題だ。

信用の話をしよう。Twitter社と一個の人間、どちらが信用できるだろうか。これは圧倒的にTwitter社である。何故かというと、邪悪に至るまでの障害の多さによる。

一個の人間が運営するサーバーで邪悪を為すのは簡単だ。一個の人間が邪悪になるだけでよい。一方、Twitter社は法人格として登録をしており、税金の支払いのために収支を国家に報告する必要がある。Twitter社には現在3000人以上の被雇用者がいる。Twitter社が邪悪をなして、それが露見しないようにするのはとても難しい。Twitter社内の一個の人間がなした邪悪は、速やかに発覚する。Twitter社が社をあげて邪悪をなそうとした場合、3000人以上いる社員のうちの少なくとも数十人から数百人はその邪悪が為されていることを知るだろう。そのうち、一人でも正義感あふれる人間がいて公に邪悪を暴露した場合、邪悪が露見する。

したがって、一個の人間によって管理されたサーバーより、何百人何千人もの人間が関わる法人の方が邪悪に至るまでの障害が多いという点で、信用できるのだ。

事実、マストドンの初期の主流サーバーでは検閲が行われている。どのような検閲かと言うと、ドイツやフランスの法律の法律に違反しないように、ナチ党のシンボルであるハーケンクロイツ、ホロコーストの否定といった内容が検閲されていた。マストドンはむしろ検閲をやりやすくするプラットフォームであると言える。権力を一個の人間に委ねると、その人間の裁量で検閲が行われるわけだ。もちろん、これは効率のいいハラスメント対策にもなるという主張もあるだろうが、それはつまり独裁政権は一人の独裁者の判断だけで政治が進むので効率的というのと同じだ。たしかに効率的だが、失敗に至る道も効率的にたどることができる。かの毛沢東も国力を増そうと大躍進政策を行い、かのポル・ポトも子供によりよい教育を施そうと子供を家庭から取り上げて国家が管理する完璧な教育を施そうとした。かのルーズベルトとトルーマンは日本に降伏させて日本の民間人を守るために日本を無差別爆撃し核爆弾を二回投下し、日本の民間人の虐殺に貢献した。地獄への道は善意で舗装されているというわけだ。

一個の人間がサーバーを管理する場合に憂うべきことは単に恣意的な検閲や改変だけではない。大半の人間はパスワードを再利用するという問題だ。

xkcd: Password Reuse

なんか適当に便利な利用に登録が必要なWebサービス作ったらユーザーIDとパスの組み合わせが大量に手に入るじゃん。やったね。さあ邪悪を行おうぜ。でもなにする?

そして、日本のマストドンのサーバーで注目を集めてユーザーの急激な増加を得た管理者が、某クラウドベンダーからホスティングを促されたり、別の某クラウドメンバーでホスティングしようと動いているなどという話をみるにつけ、もはや悪いとこ取りの様相を呈している。一個の人間が管理する上に、インフラは自分で所有していない。

マストドンとGNU Socialは残念ながら設計的に間違っている。結局、やっていることはTwitter風サーバーのソフトウェア実装を提供したというだけで、解決しようとした問題は何一つとして解決していないばかりか、大半のコンピューターリテラシーの低い者にとっては悪い結果になるだろう。

では、本当に技術的に正しい設計とは何か。まずすべての参加者はサーバーでもありクライアントでもある、完全にP2Pメッシュネットワークを構築し、その上にマイクロブログサービスを実装すべきである。自分のデータは全てローカルに保持する。

問題は、これは15年前、P2P技術が夢の技術のように叫ばれていた時代に試みられたことだ。あの当時は様々なP2Pメッシュネットワーク上に構築されたチャット、掲示板、ブログ、Webページ、ファイル共有などの実装が乱立していた。その実装はどれもすべての参加者はコンピューターの性能やネットワーク帯域を別にすれば平等であり、全員がローカルで同じソフトウェアを実行する作りであった。

そのような状況ですら、当時も今と同じ問題を抱えていた。ローカルでそのようなソフトウェアを実装するのは大変にコストがかかるので、大半のものは他人が実行しているサーバーにアクセスして、そのサーバー経由で参加していた。残念ながら当時のP2Pメッシュネットワークによる全員が平等なネットワークの構築は失敗した。当時の実装の殆どは秘密で不自由なプロトコルやソフトウェア実装で非効率なため打ち捨てられ、残ったのは、BitTorrentプロトコルのような詳細が公開されていて当時のソフトウェア実装も自由で使いやすかったものだ。BitTorrentプロトコルは大容量データの配信に都合がいいもので、これは今も自由なOSのISOイメージの配布とか、ゲームやサーバーのアップデートパッチの全コンピューターへの効率的な配布といった健全でまともな用途にも使われている。その他の当時の有象無象のP2Pプロトコルは、筆者の知る限り絶滅した。

筆者が思うに、真に自由な通信手段のためには、物理層からのP2Pメッシュネットワークの構築が必須だ。例えばコンピューターが無線通信装置を搭載して近隣のコンピューターと通信したり、ストレージをスニーカーを履いた足で運んだりして、物理層からのP2Pメッシュネットワークを構築し、その上にNamecoinのようなP2Pかつ計算資源の多いものが正しいという名前解決の仕組みを導入し、公開鍵署名によって特定の秘密鍵にアクセスできるものによって発信されたデータだと証明できる通信でチャットや掲示板やWebページやメールの仕組みを実装し、すべてのネットワーク参加者は平等である仕組みがほしいが、これとて最終的には計算資源とネットワーク帯域と電力の強いものが正しい弱肉強食の世界になることが予想されるので、世の中は難しい。

とりあえずの対策として、筆者はこのブログの内容をgitで管理している。そのgitレポジトリはGitHubでもホストしていて、GitHub Pagesでも閲覧できる。こうすることによって、BloggerとGitHubが同時に検閲された場合でもローカルに全て残っているので、私はデータを失わない。外部のホスティングサービスがすべて検閲され、かつ、私の所有するストレージが全て強奪、破壊されたときのために、今、誰でも簡単に"git clone git@github.com:EzoeRyou/blog.git"というコマンド一発で複製できるようにしておくのも重要だ。gitレポジトリの複製が存在する限り、私は最新のコミットの40文字のハッシュ値を覚えておけば改変されていないことが保証できる。

2017-04-06

もしスマートフォンが自由だったら今頃実現していた社会

CanonicalがUbuntuをスマートフォンに対応させることを諦めた。これで、スマートフォンにまともなOSを移植するという大きな資本が入っているプロジェクトは、ほとんど全部潰れたことになる。これは当然の話だ。現在のスマートフォンのハードウェアは極めて不自由なので、まともなOSを移植することは不可能なのだ。このため、筆者はスマートフォンの所有を拒否している。

スマートフォンの害悪について詳しくは以下を参照。

本の虫: インターネット端末のシェアでスマートフォンがPCを上回ったというディストピア

しかしもし、スマートフォンが自由だったら、今頃どうなっていただろうか。以下はスマートフォンのハードウェアが完全に自由なコンピューターの将来実現したであろう未来である。

江添亮は13時に目が覚めた。今日は比較的早起きをした方である。江添は眠たい目をこすりながら枕元のスマートフォンを操作する。そう、なんと江添亮はスマートフォンを所有しているのだ。

このスマートフォンは、ファームウェアを含めてあらゆるソフトウェアが自由なコンピューターである。江添亮は自由なファームウェアを使い、その上に自由なブートローダーを使い、自由なカーネルを起動し、完璧に自由なユーザースペースソフトウェアを実行している。もちろんベースバンドプロセッサーの仕様とファームウェアとOSも自由だ。当然だ。不自由で不便で修正されない既知の脆弱性、アメリカ政府が保有している未公開の便利な脆弱性とバックドアが満載のAndroidやiPhoneなどは、とっくの昔に自由競争に破れて滅んでしまったのだから。

今日は休日だが外出する用事があるので、江添は家を出る。歩きながら、公衆無線ネットワークに参加する。今や、無線周波数帯のほとんどは、国民の自由な通信のために開放されている。なぜならば、表現の自由を脅かされない分散型の強い障害耐性を持つ通信ネットワークは、今や電気や水道と並んで重要なインフラであり、基本的人権の一部だからだ。テレビやラジオのような一方的に情報を垂れ流すだけの情報格差の発生する用途に周波数帯が専有、浪費されることはもうない。十分に広い道路を確保すると物流を改善し経済を回す。ネットワークと道路は同じだ。すべての周波数帯は国民の通信ネットワークに再優先で割り当てるべきなのだ。不必要に強い電波を発射する悪意ある電波発信者さえ取り締まればよい。

かつて、日本がまだ不自由だった時代、スマートフォンの通信は中央集権的な仕組みで行われていたと聞く。個々のスマートフォンの発信する電波は微弱で、今のように近隣のスマートフォンと通信して分散型ネットワークを構築するのではなく、強力な基地局を中心とするツリー型のネットワークを構築していたそうだ。これは基地局の管理者に、ネットワークの監視、検閲といった不平等な強権を発生させる極めて危険なネットワークである。

移動中の江添は、もっぱら情報の消費のみをする。これは手のひらサイズのタッチスクリーンで操作するコンピューターだ。このような制限された非効率的な入力装置では、まともなコードや文章を書くことは不可能だ。

さて、江添は目的地についた。しかし待ち合わせの時間にはまだ早い。珍しいことだ。いつもの江添は待ち合わせの時間になった頃に家を出るというのに。どこかで時間を潰す必要がある。そこで江添は、近くにあったターミナルカフェに入る。

「粉末ティーライクひとつとダイミョクラスの入力装置」
「ハイ、ヨロコンデー!」

ターミナルカフェとはドリンクを頼めばコンピューターを快適に操作するための端末と個室も一緒にレンタルできる実際安い作業場だ。江添は端末としてスマートフォンを持っているので、入力装置だけをレンタルすることにした。大画面高解像度のディスプレイ、Cherry MSの青軸を採用したキーボード、そして高精度なマウスをレンタルした。所有しているスマートフォンとは極めて信頼性の高い低遅延広帯域の無線接続が行われる。

作業をしていたが処理能力が足りない。やはり128コアしかない上にメモリが1TBしかない貧弱なスマートフォンでは、基本的人権が保証されない。江添は自宅に設置してあるコンピューターにssh接続をした。これでいい。これでこそ人権があるというものだ。この時代における人権とは、計算力がモノをいう。計算力の強いものは正しい。

計算力、懐かしい言葉だ。そうだ、もう計算力の時代ではなかった。トゥーメニーコアが主流となった今では、もはや計算力は問題ではなくなった。実際、江添が自宅に設置しているコンピューターのコア数は3メガ個ほどある。いや、4メガ個だっただろうか。コア数が1メガを超えた辺りから、もうそのへんはどうでも良くなってしまった。昔、まだ江添が若かった頃、ひとつのコアの計算時間を複数の処理でシェアしていたものだ。今は違う。CPUコアは実質無料である。本当の計算コストは、電力だ。たしかに、江添が自宅に設置しているコンピューターをフル稼働させれば、理論上は、大昔のRSA-4096程度は一時間もあれば任意の秘密鍵に対する公開鍵が計算可能である。ただし、その計算にかかる電力で江添の家計はカーオンファイヤー(ブッダになれなかった死者を乗せる地獄行きの車、転じて家計が苦しい時に使う)になってしまう。

そうこうしているうちに、待ち合わ汗の時間になった。それにしても、今はいい時代になったものだ。後は物理肉体を物理場所まで運ぶという技術的制約を解決できればいいのだが。

Wandboxのスポンサーになるべく、めるぽんに肉をおごってきた

WandboxというWebサイトがある。これはコードを与えるとコンパイルメッセージと実行結果を返してくれるサービスを提供している。コードとコンパイルメッセージと実行結果を保存してURLで共有する機能もある。

ここまではよくあるサービスだが、Wandboxが他のサービスと差別化を図っているのは、コンパイラーの種類だ。様々な言語のコンパイラーをサポートしているのみならず、同じコンパイラーでも複数のバージョンを提供している。これにより、あるコードの挙動がコンパイラーのバージョンで異なる場合の特定ができる。

なぜそんなサービスが必要なのか。コードぐらい自分のローカル環境で実行すればいいではないか。リモート環境にしたって、今日びVPSなど月数百円から使うことができる。ブラウザーから入力する程度の短いコードをコンパイルして実行するぐらい低スペックの格安VPSでも足りるではないか。

問題は、バージョンの異なるコンパイラーの混在と切り替えはだるいということだ。

例えばGCCを3-stage bootstrapでビルドするには1,2時間はかかる。しかも、数GBものストレージを消費する。ということは、GCCの過去のバージョンを10種類用意しようと思ったら、数十時間と数十GBが必要になるということだ。

C++コンパイラーはGCCだけではない。Clangもある。Clangの過去のバージョンを10種類用意しようと思ったら、また別に数十時間の数十GBが必要になる。

プログラミング言語はC++だけではない。Javaは? PHPは? Pythonは? Rubyは? これらの言語にはそれぞれ複数の実装があり、実装ごとに複数のバージョンがある。全部ビルドするには何百時間、何百GBも必要になる。

ほんの数行のコード辺のバージョン間の挙動を、たまに確かめたい時に、ローカルにそんな環境を用意するのはやりたくない。Wandboxの価値はここにある。

さて、そんな便利なWandboxだが、最近スポンサーを募集している。ドワンゴもスポンサーになっている。

Wandboxにはとてもお世話になっているので、ぜひともスポンサーになりたいところだ。しかし、私はクレジットカードという匿名性のない上に不必要な第三者に記録される送金手段を使いたいとは思わない。思えば、Wandboxのめるぽんとは久しく会っていない。めるぽんは無頼の肉好きであるので、めるぽんに直接、肉をおごることでスポンサーになることにした。

さて、めるぽんはグルメでいらっしゃるので、粗悪な肉でもてなすことは大変失礼に当たる。銀座にあるような高級ステーキ店ならば、めるぽんの舌も満足することであろう。しかし、店を探すのは難航した。というのも、店がまともな食事を提供するには、終日全面禁煙であることがまず必要となるからだ。ニコチン中毒の客にまともな味がわかるはずがないから、そのような店は味で客を得る努力をしていないはずで、味による市場の淘汰を経ていない。

さて、結論から言うと、筆者による店探しは完全に失敗した。これは私が携帯電話を持っていないために店の予約ができなかったためである。しかたなくめるぽんの行きつけの店に行くことにした。はじめからこうすればよかったのだ。めるぽんは肉が主食であり、普段から肉を食べ慣れているので、どこにでも行きつけのステーキ店の一つや二つはあるはずだ。

目的の店に向かう道すがら、我々はコンパイラーのブートストラップ問題の話をした。

ブートストラップ問題とは、あるプログラミング言語のコンパイラーが同じプログラミング言語で書かれている場合に起こる問題である。あるプログラミング言語で書かれたソフトウェアをコンパイルするにはコンパイラーがいる。コンパイラーもプログラミング言語で書かれたソフトウェアである。コンパイラーをコンパイルするにはどうすればいいのか。

答えとしては、まずコンパイラーを別の言語で実装するかハンドアセンブルするなどして作成する。そのコンパイラーを使ってコンパイラーをコンパイルする。後は、コンパイラーが前のバージョンのコンパイラーでも正しくコンパイルできることを保証すればよい。

GCCは歴史が長く、かつ多くの環境で標準のCコンパイラーでもあることから、ブートストラップへの対応は極めて優秀だ。かなり昔のバージョンのGCCでも最新のGCCがコンパイルできる。GCCの標準的なコンパイルは、3ステージブートストラップと呼ばれている。まず、システムのC++コンパイラーを使ってGCCをコンパイルするための最小限のC++コンパイラーと周辺ツールをコンパイルする。出来上がったC++コンパイラーで1ステージGCCをコンパイルする。1ステージGCCで2ステージGCCをコンパイルする。2ステージGCCで3ステージGCCをコンパイルする。2ステージと3ステージのGCCをテストして挙動に差がないことを確認する。テストが通れば、3ステージGCCは最低限のテストは通過したコンパイラーということになる。

他の言語はどうか。まず、ブートストラップ問題のない言語がある。あるプログラミング言語のコンパイラーが同じ言語で書かれていない場合、例えばCやC++などで書かれている場合、これは簡単だ。なぜならばGCCは極めて安定したコンパイラーであるので、ある程度最近の安定バージョンのGCCでコンパイルすればよい。

ブートストラップ問題を抱えている歴史の浅いプログラミング言語は問題だ。歴史の浅い、まだ発展段階のプログラミング言語の実装はとても急速に変わる。そのため、古いバージョンのコンパイラーは最新のコンパイラーでコンパイルできないという自体に陥る。そのためソースコードからのビルドが難しく、Wandboxではあまりにも古いバージョンのコンパイラーを提供できない。

このような話をしていると、我々は目的のステーキ店についた。空いていてタバコの害もなく高級な肉を出す店だった。

肉を食べながら、我々の話は、いかにしてめるぽんはプログラミングを学んだかという話題に移った。

人がプログラミングを学ぶ方法は様々だ。プログラミングの教育法はまだ学問として完全に固まっておらず、したがって多くのプログラマーは独学で学んでいる。筆者は幼い時にコンピューターがない環境で育ったので、参考書を読んで言語の文法と意味を脳内で理解するという作業のみしていた。さて、後にコンピューターを手に入れて、コードを書き、そのコードが想定通りに動いた時、筆者は目標を失った。なるほど、私の理解は正しかった。私はC言語の文法とその意味を理解している。ソフトウェアを書くことができる。しかし、今の自分の技術力で完成することがわかりきっているコードなど書いて楽しいのだろうか。そこに学びは何もないし、やりがいもない。自分ができるかどうかもまだわからないことに挑戦してこそ、やりがいというものは生じるものだ。そこで私はC++の規格書を読み始めた。そして今に至る。

めるぽんの経歴を知らない読者には、めるぽんがどうやってプログラミングを学んだかということに対して興味を抱かないだろう。この業界は実力主義で、ほとんどのプログラマーは独学でプログラミングを学んでいる。この業界では中卒と博士が机を並べて仕事をすることだって珍しくない。めるぽんがコンピューターサイエンスの学位や博士号を持っていないのにプログラミングができるというのは不思議でも何でもない。そう思うことだろう。我々は義務教育を不登校気味だった中卒がバリバリコードを書き、コンピューターサイエンスの学位を得た者がFizzBuzzすら書けないという話はいくらでも聞いてきた。しかし、めるぽんのような例は聞いただろうか。

めるぽんは高校時代、アマチュア・レスリングで優秀な成績を収めた。高校卒業と同時に自衛隊に入った。自衛隊では体育学校にいた。自衛隊は数年でやめた。自衛隊をやめた数年後には、すでにフリーランスのプログラマーとなっていた。

いったいめるぽんはどうやってプログラミングを学んだというのか。

めるぽんは高校時代、アマチュア・レスリングで優秀な成績を収めた。つまり、めるぽんは高校生まで相当な量の運動をしていたはずで、ガチガチの体育会系の人間だったはずだ。もちろん文武両道な人間はいくらでもいる。しかし、問題はその後だ。

めるぽんは高校卒業と同時に自衛隊に入った。自衛隊では体育学校にいた。自衛隊の体育学校というところは、運動中毒の人間だけが生きていける特殊な世界だ。世の中には運動中毒の人間がいる。「自衛隊に入ったら毎日、一日中、好きなだけ走ることができて、しかも給料が出る。最高だ」などと発言する人間のいる世界である。そして、この発言をした自衛隊員は何百kmも走るウルトラマラソン大会の走者で、実際に、文字通り一日中走っている。

運動こそ人生。仕事は一日中体を鍛える訓練。そんな環境でプログラミングの勉強ができるだろうか。

めるぽんは中学生の一時期、怪我をして柔道の練習ができなくなったことがあるそうだ。そんなめるぽんに、中学校の教師は、ではコンピューターをやれ、といってPC88だか98とプログラミング雑誌を渡したそうだ。当時はN88BASICの世界で、コンピューターを使うということはBASICでプログラミングをするということであった。当時のコンピューターは単純だった。電源を入れるとBASICインタプリターのプロンプトが表示される。BASICで書く。実行される。それだけだ。当時のめるぽんは、意味もわからないままに雑誌に記載されたBASICコードを入力し、当然入力間違いによりシンタックスエラーを起こし、その「シンタックスエラー」というものが何を意味するのかもわからないままにコンピューターを使おうとしていたそうだ。そして、わからないことがあると中学校の教師に質問に行った。

めるぽん「その教師、図画工作の教師で、他にも当時CADを使った授業とかがあって」
筆者「その教師、当時としてはおかしくないか?」
めるぽん「そういえばおかしい気がしてきた。なんであんな教師がいたんだろう」

さて、高校生になっためるぽんは、家の中で偶然にもBASICの教科書を発見する。なぜそんなものが家にあったのかはわからない。これによってめるぽんは、これまで意味もわからずに写経していたBASICのコードの意味を理解することとなる。

高校を卒業後、自衛隊に入り、その体育会系の空気とあまりの運動中毒に、自分には合わない場所だと判断してやめて、ゲーム会社に一年半ほど雇われた後、フリーランスになった。

肉がやってきた。めるぽんは肉が主食であるが、サラダも注文しておいたので、多大な説得の末、多少の野菜を食べさせることにも成功した。なぜめるぽんは肉を食べるのか。

めるぽん「肉と野菜のどちらを食べるかという選択が与えられた場合、これは当然肉を選ぶに決まっている」
筆者「なるほど、そして肉を食べた後は、野菜を食べるわけだな」
めるぽん「いや、肉を食べる」
筆者「寿司ではトロに満足した後は光物がほしくなるように、肉に満足したら野菜を食べたくなるものでは」
めるぽん「肉を選ぶという選択肢は依然として残っている。選択肢にある以上、肉を選ぶのは当然だ」

肉を食べ終えた後、我々の話題はバージョン番号に移った。

バージョン番号はソフトウェアの開発者が勝手気ままにつけるものである。今ではSemantic Versioningなどと叫ばれているが、本当にバージョン番号には何らの規則性もなく、したがってソートできない。Wandboxでは、バージョンの新しい順にコンパイラーを表示しているが、これは手動で順番をハードコードしているのだという。

自動でソートをしたかったが、数値や文字列による比較を拒否するバージョン文字列が多すぎて、例外ルールだらけになるので、結局手でやるのと手間が変わらない。

バージョン番号の付け方にも謎のルールがある。例えば、PyPyはマイナー番号の偶数と奇数で、Python 3.0対応版とPython 2.7対応版を分けているらしい。他にも、リリース版にもかかわらずバージョン文字列にrcと書いてあるものもある。

肉を食べ終えた我々は店を後にした。久しぶりに本物の肉を食べた実感がある。。

ドワンゴ広告

ドワンゴはWandboxのスポンサーになった。Wandboxはドワンゴの社員がコンパイラーのバグと思われるものを見つけた場合に、バージョンごとの挙動の違いを調べるのに役立っている。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

UbuntuがUnityを捨てる予定

Growing Ubuntu for Cloud and IoT, rather than Phone and convergence | Ubuntu Insights

朝からなかなか衝撃的なニュースが飛び込んできた。結論から言うとこうだ。

Ubuntu 18.04ではデフォルトのデスクトップをGnomeにする。Unity8の開発は中止する。スマフォ対応は中止する。おそらくMirの開発もやめる。

CanonicalのMark Shuttleworthは、Ubuntuをスマフォ対応させて、どこでも同じ環境が実現できるという目標をやめて、UbuntuをクラウドやIoTに向けて発展させると発表した。

これはなかなか衝撃的だ。たしかに、Unity8とMirはこの長年開発しているが、さっぱり日の目を見ないソフトウェアだった。4年も開発していまだに実用化に至っていないデスクトップサーバー、コンポジター、デスクトップ環境は見切りをつけるのは当然だ。また、スマフォは根本的に不自由なコンピューターである。不自由なコンピューターに対応するためにリソースを割くのは無駄だ。

convergenceとやらも無意味だ。もしスマフォが本当にまともなデスクトップコンピューターと同じ使い心地であれば、iPhoneやAndroidのような不自由OSとてデスクトップコンピューターと同じUIを採用していたはずだ。それが採用していないのだから、スマフォは根本的に使いづらいコンピューターで、だからこそおもちゃのようなUIを採用しているのだ。

Canonicalがサーバー用に家事を取るのは当然だし、ぜひ鈍重なRHELを駆逐してもらいたい。すべてのコンピューターは最新の安定版のGCCを使えるべきであり、RHELは業界の癌だ。

さて、個人的な影響で言うと、Unityがなくなることだ。私はあまりデスクトップ環境にこだわらないので正直何でもよいが、Unityのデフォルトのキーボード・ショートカットは気に入っていただけに残念だ。

2017-04-04

インターネット端末のシェアでスマートフォンがPCを上回ったというディストピア

Report: Android overtakes Windows as the internet’s most used operating system | TechCrunch

最近の調査で、インターネット上の閲覧に使うOSのシェアにおいて、2017年3月現在、AndroidのシェアがWindowsのシェアを抜き去ったそうだ。

これはつまり、いまインターネットに接続している個人が使うコンピューターは、デスクトップやラップトップではなく、圧倒的にスマートフォン(AndroidかiPhone)であるということだ。

何というディストピアな世界だろうか。

私が子供の頃、世の中の大人の大半がコンピューターを使いこなせず、我々の社会の日常生活が極めて非効率的であることに不満を持っていた。

しかし、当時の私は物事を楽観的に考えていた。何故といって、我々の世代は個人でも安価にコンピューターが所有できる世代である。コンピューターの性能は年々上がり、価格は年々下がっている。すると、我々の世代が大人になる頃には、全員がコンピューターを使いこなせるようになるはずだ。将来、コンピューターを使えないのはしぶとく生き残っている死に損ないのジジババだけになる。すると、我々の社会はコンピューター利用が当然で、誰もがコードを書ける社会になるはずだ。

残念ながら、そのような未来は来なかった。

「スマートフォン」と呼ばれるものの誕生が、我々をバカにしてしまった。スマートフォンではコードが書けないのみならず、まともな文章も書きにくい。スマートフォンの利用者の大半はただ与えられた情報を消費するだけの愚かな存在になりさがってしまった。情報を与える特権を持った者は、キーボードという効率的な入力装置を使いこなせる者だ。

我々の世代と、我々の次の世代は、スマートフォンという名の毒物によって汚染されてしまった。この手のひらサイズのタッチパネルを搭載した貧弱なコンピューターは、今や大半の人間が使う唯一のコンピューターになってしまっている。

筆者はスマートフォンの所有を拒絶している。我々の社会はとてもスマートフォンの利用が当然な社会になってしまったので、スマートフォンを所有しないということは、日常生活において大変な不便を強いられる。しかし、筆者は利用者によるOSの入れ替えやOSの改変を妨害し、コードや文章を書くのが非効率的なコンピューターを所有するのは利便性を上回るリスクであると考えている。

何というディストピアな世界だろうか。