突然だが私はいまロンドンにいる。
ブログというのはこういうとき、デジカメ写真を張りまくることになっているらしいが、この日記では画像関係の機能が使えないので張らない。
発見をいくつか。
・白人の赤ん坊は、頭が前後に長い
・ロンドンの冬空には、いい感じの雲が浮かぶ
再確認をひとつ。
・EUの物価は保護されているッッッ!!!!
PICと赤外線でネットワークを作る方法を妄想している。各ノードの経路数が10以上に達することもあるという、妙なネットワークである。
現在の結論: ノードを管理するPICに加えて、経路ごとに8ピンPICを配置し、両者をI2Cバスで接続する。経路PICはIrモジュールにつながっており、モジュールにIrCOMMをしゃべらせる。
9600 bpsとしても、少々辛いような気がする。うーむ。
「CLANNAD」、4月28日発売、全年齢。
発売日はまだしも(なにしろ1年には52週しかない)、全年齢というところまでかぶるとは驚いた。
とはいえ、我が「希望入りパン菓子」は「CLANNAD」よりも面白いので、ぶつかったところでなんの問題もないのじゃよオンナスキー君。
初めてGNU宣言を読んだのは、いつのことだったか。「これはソースコードからビルドする世界の話だ」というのが、当時の感想だった。もちろん人は普通、ソースコードからビルドなどしない。面倒だからだ。とはいえ、そういう世界では筋の通った話だとも思った。
いま、Stallmanの「フリーソフトウェアと自由な社会」を読んでいる。再びGNU宣言を読んでみて、致命的な問題にひとつ気づいた。
プログラムの使用を制限してプログラムのユーザからお金をとることは、その制限のせいで、使用できるプログラムの種類や方法が減ってしまうので、破壊的行為となる。これは、人類がプログラムから得られる富の量を減らしてしまう。故意に制限すると決定したときには、意図的な破壊という有害な結果をもたらすだろう。
この主張は誤っている。プログラムの使用を制限しないことによって、人類がプログラムから得られる富の量を減らしてしまう場合がある。例を示そう。TeXとviだ。
もしTeXとviが有料だったら――いまごろはもう、電算写植やTECOと同じく、歴史のくずかごに送り込まれていたはずだ。では、そのようなパラレルワールドに暮らす人類は、この世界の人類よりも、プログラムから得られる富の量が少ないといえるだろうか。断じて、ノーだ。
ロールズ流の社会契約論的アプローチを思い出していただきたい。それは、こういう思考実験だ。人間心理、社会、科学などの一般的知識については神のごとく完璧な知識を備えているが、自分自身のことはなにも知らない、という人間がいるとする。こういう人間が、自分の暮らす社会をゼロから再設計したら、どんな社会ができるか? もちろん私の知識は不完全だし、自分自身のことを忘れることもできないので、この実験を完全なかたちでは行えない。それでも、少なくとも、3つのことを断言できる。その社会は、QWERTYキーボードのない、TeXのない、viのないものになるはずだ。
Stallmanの、いったいなにが間違っていたのか? 第一に、進歩を無視している。
ハードウェアだけでなく、ソフトウェアの思想も進歩する。1990年代以降に、TeXの構想を人に見せたら、嘲笑されるか無視されるか、どちらかだ。viは80年代にすでに論外だった。これは、HTTPのステートレス性やUNIXのroot特権のような、設計上のバランスにかかわる相対的な問題ではない。グローバル変数しかない高級言語が間違っているように、絶対的に間違っているのだ。
第二に、過去との競争を無視している。
パッケージソフトを売る会社にとって、違法コピーより恐ろしいのは、「ソフトは摩滅しない」という事実だ。売上を維持するには、過去の自社製品をガラクタに仕立て上げる必要がある。パッケージソフトにとって、独占はたいした意味を持たないのだ(だからMSは、WindowsやOfficeをプリインストールで売ることに懸命である)。期限付きライセンスはまだ救われるが、ダウンサイジング以降、こういう楽園はますます希少になりつつある。
フリーソフトウェアでは、過去との競争が起こらない。新製品の宣伝に洗脳されることのないユーザは、「奥が深い症候群」に陥り、バッドノウハウを不要にするかわりにバッドノウハウを蓄積してゆく。
以上、フリーソフトウェアが人類の富を減らす場合があることを論じた。
これは、あくまで「場合がある」という話であり、フリーソフトウェア全体としてどんな得失があるかは、また別の話になる。たとえばライブラリでは、フリーソフトウェアはきわめて有益に思える。が、フリーソフトウェアのない世界と、フリーソフトウェアしかない世界と、どちらかを選べと言われれば、私は迷わず、フリーソフトウェアのない世界を選ぶ。
Windows Installerを使うべく、数年ぶりにOrca (msiファイルを触れるエディタ)をいじっている。
msiファイルという代物は、なんとも独創的な設計をしている。インストーラというとスクリプト的なものが思い浮かぶが、まったく違う。ちょっとしたリレーショナルデータベースなのだ。
あるテーブルには、フォームの部品が列挙してあり、たとえばボタンなら、押されたときのイベントが定義してある。そのイベントの動作は、別のテーブルに定義してある、といった具合だ。
一見したところでは、たいした必然性がありそうにも見えないが、他の事例を見聞きするほど、また考えれば考えるほど、これが唯一完璧な設計に思えてくる。実際に役に立つかどうかはともかく、本物のプログラマの雰囲気を感じるうえでは、いいサンプルではないかと思う。
私が寝ているあいだにも、世の中はますます便利になっている。果報は寝て待て、というわけだ。最近の果報をお知らせしよう。
C/C++、Yacc、Javaに対応した、ソースコード解読支援システムである。このごろCVSWebでできたサイトを見ると、シンボル類に定義・宣言へのリンクが張ってあるが、あれだ。
「ENSEMBLE ~舞降る羽のアンサンブル」というエロゲーに着手した。
若葉というキャラは、幼少時の事故により右目を失明しているらしい。そのうちラブリー眼帯をつけて二代目柳生十兵衛に……とは誰しも一瞬思うところだが、あの眼帯は左目だったと思い出した。
いや、むしろ残った左目をあえて眼帯で覆うことで、二代目柳生十兵衛あらため二代目机竜之介となり甲源一刀流を――と考えたのは私だけではないはずだ。
携帯電話の動画再生について調べている。
私自身をはじめとして、スタッフ・サポーターにはauが多いので、ezmovieから調べてみた。変換も転送も問題なくできたが、Sサイズ(96×80)では動画自体の画素数が少なすぎる。もっと大画素数のezmovieに対応した端末を調達しなければ。それとも誰か505iを買わないものか。
mP-x ◦ mP-x+1 ... ◦ mP-1 (U ) といくら制約を重ねても、先頭までさかのぼらなければ一意に定まらない場合、つまり m0 ◦ m1 ... ◦ mP-1 (U ) が一意でないとは、どんな場合か――オブジェクトの初期状態を引き継いでいるときだ。
変数を初期化せず、不定の中身を参照することは、いかなる場合であれ事実上のバグである。こうした参照を禁止するうえで、2つの考え方がある。ひとつは、そうした参照を記述することは可能だがエラーになる、というもの。多くのCコンパイラはこれを検出して警告を吐く。もうひとつは、言語仕様として変数に初期化を強制する、というもの。XSLTはこれである。
エラーによる方法をとれば、m0 ◦ m1 ... ◦ mP-1 (U ) は必ず一意に定まる。が、このことによる実際上のメリットはほとんどない。まともなプログラマなら、変数を初期化されない状態で長く放っておくはずはないし、長く放っておくことで性能上のメリットが生まれるような言語は、その使用を拒否すべき倫理的義務がある。というわけで、言語仕様として初期化を強制するほうが正しい。
オブジェクトの初期状態がわかっているので、これを参照することもできるし、初期値をいつまでも引きずることができる。具体的には、状態として真理値をとるオブジェクトに、真偽をひっくりかえす(論理否定)アクションだけが備わっている、という場合が考えられる。このようなオブジェクトの状態は、初期値の真偽が逆なら、シーケンス全体を通じて真偽が逆になる。もちろん、このオブジェクトを参照するアクション式も影響を受ける。
自己参照だけでなく、循環参照もある。オブジェクトOa とOb があり、どちらも1から12までの自然数を状態として取るものとしよう。また、どちらもアクションとして、
if(O_a == 12)
O_b = 1;
else
O_b = O_a + 1;
といった式を備えるとする。 Oa とOb に交互にメッセージを出していったとき、その状態はどこまでいっても、どちらかの初期値をひきずる。
自己参照と循環参照をうまく断ち切るには、どうすればいいか。以下後日。
エロレズをよく描く作家は、論理性重視(松原香織、完顔阿骨打)と論理なし(すどおかおる、織倉まこと)に極端に分かれるような気がする。三国ハヂメは後者だ。
先月24日の続き。
HTMLのアンカーへのリンクのように、シーケンス中の任意の地点へと飛び込むとき、その地点の状態を構成するにはどうすればいいか。
シーケンスを頭からレンダリングしてゆく(ただし時間変化はすべて「飛ぶ」で)、というのが答のひとつだった。もうひとつは、「すべてのオブジェクトの取りうる状態が一意に定まるまで、シーケンスを逆方向に解釈していく」である。
シーケンスを逆方向に解釈する――手続き的プログラミングの常識では離れ業というほかないが、HTMLの「親要素へと次々にトラバースしてゆくだけで、その要素のレンダリングに必要な情報がすべて揃う」という性質を思い出そう。一次構造は階層構造ではないため手順は複雑になるが、本質的には同じことだ。
まず、メッセージによって生じる状態変化を定義する式について思い出そう。この式のことを、以下ではアクション式と呼ぶ。アクション式は、十分短い時間で計算可能である。また、アクション式はオブジェクト(自他問わず)を参照することができるが、シーケンス中でアクション式の定義が変化することはないので(宣言的!)、シーケンス中のどの地点でも、すべての参照を数え上げることができる。参照先のオブジェクトの取りうる全状態も、シーケンスから独立に定義されている。
ということは――一次構造においては、アクション式の参照先が取りうる全状態を数え上げることができ、そのすべてについて、アクション式の値を対応させることができる。この対応づけを再帰的に繰り返すことで、シーケンス中の任意の地点におけるオブジェクトの状態を、一意に定めることができる。
このことを数学的に表現してみよう。
あるシーケンスに操作されるオブジェクト(総数n個)を O1, O2 ... On と書き、また Ox の取りうる全状態の集合を s(Ox ) と書く。もし Ox が1個の真理値だけを含むなら、s(Ox ) ={T, F } である。s(O1 ) +s(O2 ) ...+s(On ) のことを、U と書く。メッセージはMx と表す。
シーケンス中の任意の地点 P へと飛び込んだ後、シーケンスの逆方向解釈に着手する前のことを考える。このとき、P の状態はまだ制約されていないので、U であるといえる。
ここからまず、P のひとつ前のメッセージMP-1 を解釈する。さきほど述べた対応づけというのは、U からの全射写像に等しい。この全射写像を、mP-1 (U )と表す。いまやMP-1 を解釈したことで、P の状態は制約を受け、mP-1 (U )となった。
メッセージの解釈を、MP-2 , MP-3 ... MP-x と続けていくことにより、P の状態は、mP-x ◦ mP-x+1 ... ◦ mP-1 (U )と制約を重ねていく。制約によりP の状態が一意に定まれば、そこでメッセージの解釈を打ち切ることができる。
が、この理屈はこのままでは、うまくいかない。先頭までさかのぼらなければP の状態が一意に定まらない、つまり逆方向に解釈する意味がないという状態が生じやすい。以下後日。
MT4iとPHPを使って、この日記を携帯電話に対応させてみた。
とはいえ私は、携帯電話からWebを見られる環境にないので、端末上でなにが起こっているかは神のみぞ知るである。
エミュレータが見つかったので試してみた。果たせるかな、マーフィーの法則により、正しく作動していなかったので修正した。
William Dementの著書『Some Must Watch While Some Must Sleep』(W. H. Freeman and Company, 1974)の中に、次のような挿話がある。彼は自分の講義の中でも最も重要なことを学生たちに教え込もうと努力していた。「こういう話がある」と、彼は学生たちに講義した。「英国の平均的な生徒たちは、ヘイスティングスの戦いは1066年、ということのほかに、歴史についてほとんど何も覚えていない。もし子供が何かほかのことを覚えているとしたら、それは1066年の日付だというのだ。しかし私の講義では、重要なメッセージはほんのわずかしかない。たとえば、睡眠薬を飲むと不眠症になるという非常に興味深い事実もその1つだ。」彼は学生たちに、たとえ講義で話したほかのことはすべて忘れても、そういった非常に重要な事実だけは覚えて欲しいと訴えた。学期を通じて何度もそういう基本的な話に戻り、それを繰り返して訴えた。
講義が終了し、期末試験となった。試験の最後の問題は、こういう質問だった。「講義の中で、あなたが生涯忘れないと思ったことを1つだけ書きなさい。」Dementは、採点にかかろうとして肝をつぶした。ほとんどすべての答案用紙に「1066年」と書かれていたのである。
なんといっても、兄が消えたことを喜びたい。
兄が消えたこと以外にも、いろいろピントが合ってきたような気配がある。
今月は白鐘姉妹のショートストーリーである。
爆発力が欲しい。
アニメに同じ。どこまで百合になるか、結果を見届けてからでも遅くはない。
設定にいわく言いがたい不調和を感じるが、今回はあまり問題にならない。が、百合度も低い。
いつもどおり。
せっかくMovable Typeを入れたので、百合物件をまじめに記録していきたい。
ストロングスタイル・ハートフル。
マリみての影響が大きい。
私見ではマリみては、百合の進歩の流れのなかでは、傍流に属する。たとえば身体の扱いは百合にとって一大テーマだが、マリみて世界では、身体は存在しないかのように扱われる。これは一種の叙述トリックとでもいうべきもので、ここを見抜けないままマリみてに影響を受けると、身体の扱いがきわめて不用意になりやすい。本作もそのきらいがある。
主人公が女ならまだ読めたかもしれない。
ひみつ作戦を遂行中。内容はひみつ。
JIS X 4052 日本語文書の組版指定交換形式を読んだ。
…………………読まなかったことにしよう。
読まなかったことにする前に、いくつか問題点を。
かなり広範にわたって、微妙あるいは大幅に違う。このため処理系のかなりの部分を新たに実装する必要がある。
新たに実装するだけで済めばいいが、中途半端にリソースを再利用できるため、さらに深刻な問題を引き起こしかねない。たとえば、ルビを表現するためにXHTML 1.1 Ruby Annotationに似たものを定義しているが、X4052のそれにはrp要素がない。だが、もしrp要素があれば、XHTML 1.1とリソースを共有するうえで面倒がひとつ減る。このため、非公開の隠し機能として、rp要素のある処理系が作られる可能性が高い(X4052の処理系などというものが作られるとしたら、だが)。このrp要素の有無に似た問題が、規格中のいたるところに埋まっているのだ。
とはいえ、まだ逃げ道がある。処理系にバリデーションを要求し、バリデーションを通らない文書をはじくように要求すれば、ほとんどの隠し機能はふさげる。だが、
X4052が定義しているのは、タグ付きテキストであって、XMLではない。こんなもののバリデータを作ろうと試み、さらにはバリデーションを通らないデータをはじくような勇者がもしいたら、HTMLは今よりもずっと幸せなものになっていたはずだ。
とどめに、
問題の解法としての一般性をまったく感じない。
では、心おきなく、読まなかったことにしよう。
日記をMovable Typeに切り替えてみた。
とにかく操作がややこしい。こんなややこしいものよりは、はてな日記のほうが流行るわけだ。