PCで苔を育てる人

自作シミュレーションゲームPraparatを作っています。 人工生命をシミュレーションするゲームです。https://www.nicovideo.jp/watch/sm41192001

【小説】Solution

「つまり、被験体は直感で方程式を解いているということなんだろう?」

「はい、大衆向けの説明としてはそれで十分かと」

 休日を返上して何とかレポートを読み終えた私の理解は、どうやらやっと大衆レベルだったようだ。

「例として平方根の計算を考えてみましょう。つまり、ルートの計算です。 \sqrt 2の値を求められますか?」

「あぁ、ひとよひとよにひとみごろ、とか言うやつだな。いや、ひとなみにおごれや、だったかな?」

「最初のものであっています。つまり、約1.41421356です。しかし、ここで問うているのはその求め方です」

「求め方か、分からないな」

 \sqrt 7を求めよ、と言われたら、どのように求めますか」

 分からないと言っているのに。

「...そうだな、2の2乗は4で、3の2乗は9だからな、この間にはあるだろう。2.5の2乗は、えーと、6点いくつだから、 \sqrt 7は2.5よりも大きいな」

「二分法ですね。悪くありません。他にも開平法やヘロンの方法、ニュートン法などがあります」

「それで、平方根の計算方法がどうしたんだ」

平方根の計算は結構面倒なのです。人類が初期の計算機を使い始めた頃には、平方根の計算にかかる時間が、その計算機の能力を示すための宣伝文句として使われていたこともあります」

 彼女はどこか活き活きとしているように見えたが、話が逸れていることに気づいたのか、少し間をおくと仕切り直した。

「...ところで、この平方根を自然現象に解かせる方法があります」

ようやく話が見えてきた。

「どうやるんだ」

「高さ hから自由落下させた物体が、何秒で地面に到達するか分かりますか?」

「なんだって?」

「しきたりとして、空気抵抗は無視します」

 また話が見えなくなってきた。彼女は「しきたりというのは冗談ですよ」と言って、今日初めての笑顔を見せていたが、私にはいまいち笑いどころが分からなかった。

「すまない、分からないな。続けてくれ」

「地球表面上で、高さ hから落とした物体が地面に到着するまでにかかる時間は \sqrt{2h/g}と計算できます。 gは重力加速度です」

「そう言えば、昔学校でやったかもしれないな」

「ここにルートが出てきます。これを使います」

 彼女は、昔書かれた文字がうっすらと残るホワイトボードに走り書きを始めた。

「このルートの中身、つまり 2h/gがちょうど7になるような高さ hを計算できます。今回の場合は、約34.32mです。言い換えれば、34.32mの高さから物体を落とすと、約 \sqrt 7秒で地面に落下します」

「つまりストップウォッチで落下時間を計測するだけで、実質 \sqrt 7の計算を行ったことになるのか」

「計算を行ったのはあくまで自然です。私達は都合の良い実験系を用意してそれを観測したに過ぎません」

「被験体はそれを行っていると」

「はい、これよりも遥かに高度に」

「にわかには信じられんな」

 しかし、実験チームの出したレポートは、その事実を雄弁に物語っていた。被験体-00913は、与えられた初歩的な微分方程式を解析的に解くことができなかった。しかし、その方程式に適切な境界条件が与えられたとき、被験体は数値的な解を非常に精度良く求めることができた。そしてその能力は被験体の五感を完全に遮断した場合にのみ失われた。

「彼女は、与えられた方程式の解を身の回りの自然現象から見出すことができるのです」

 彼女は、被験体のことを、時折「彼女」と呼んだ。

「しかし、自然に計算させるというのは、あれだな、ファインマンの言っていた量子の計算を量子にさせるみたいな話だな」

量子コンピュータの話を持ち出すまでもありません。結局のところ、この世界で行っていることは全て物理実験なのです。古典的なコンピュータで方程式を解くというのも実験です。NOT, OR, ANDの回路を組み合わせることで、結果が方程式の解と解釈できるような実験系を組んでいるに過ぎません」

「そして、我々人類の運命は、適切な実験系を発見できるかどうかにかかっているというわけか」

「昔の映画のセリフのようですね」

 確かにそうかもしれない。実際この状況は使い古されたSF映画の設定のようだ。国際宇宙観測機構の公式発表によれば、今から約100年後、地球に巨大隕石が衝突する。そしてこれまでのところ、人類はそれを回避するための有効手段を持っていない。

「それで、目的のカオス軌道が見つかる可能性はどのくらいなんだ。計算チームのレポートにはそれらしい数字はなかったが」

「確率を計算できるほど研究が進んでいません。被験体の能力に関するいくつかの経験則が提案されている段階です。そしてそれも毎週覆っています」

「それは何も分かっていないということではないのか」

「分かったことがすぐに陳腐化するのです。正確には、そう仕向けるように研究を進めています」

「被験体の五感拡張か」

「はい、実際、被験体に原子間力顕微鏡を与えてからは、探索可能な解空間が2桁広がっています。私達の探しているカオス軌道が、この解空間に含まれている確率は10のマイナス120乗のオーダーです。前回の中間報告時に比べれば劇的な向上です」

「軌道変更に利用可能なエネルギーが増加すれば、許容されるカオス軌道の幅も広がるはずだが」

「利用可能なエネルギーは、時刻0ポイントまで線形に伸びていくと予想されています。それを考慮しても有効なカオス軌道の範囲はほとんど変わらないというのが、私達のチームの現在の見解です」

「解空間の拡大に期待するしか無いわけだな」

「はい、彼女が唯一の希望です」

 実際のところ、世界中でさまざまな対応策が検討されていたが、どれが有望かどうかなど誰にも分からなかったし、どれも等しく望みがないとも言えた。私の手元にある研究計画書によれば、近いうちに、被験体は世界中のあらゆる観測機器にアクセス可能な状態にある必要がある。それまでに、人類はこの計画に運命を委ねる覚悟をしなければならないだろう。

 特殊加工されたガラスの向こう側で、1人の少女が、鉛筆を転がして笑っている。

 

はじめて変数xを習ったとき、バカなんじゃないかと思った

数学の授業中、先生がいきなり

「この答えは今はまだ分からないので、とりあえず xと書くことにします」

と言い出した

バカなんじゃないかと思った

分からないものを xと書いて一体何になるというのか

知りたい答えに" x"という別の名前をつけてフタをしただけじゃないか

それなら何か、次のテストの答案には xとでも書けば良いというのか?

バカバカしい子供だましだと、子供ながらに本気でそう思った

浅はかだったという他ない

それは関係性を見渡すための秀逸な道具だったのだ

確かに xと書いたところで何も前進していないように見えるかもしれない

しかし、一旦知らないことは知らないと認めた上で名前をつけてやることで、知らないもの同士の関係性を表現できるようになるのだ

例えば、それを2倍して50を足したものが、別の何かの値になるとか

あるいは、別の何かの値からそれを引くと100になるだとか

そんな、言葉で聞いただけだと混乱してしまう関係性を、 x yなんかを使った式で書いてやることで、問題の全体像が俯瞰できるようになる

そうして、許される式変形を繰り返すと、丸裸になった xの右辺に、その正体が顔を出すのだ

分からないものを一旦 xと置くことの威力が、それを初めて見た当時の私には理解できなかった

 

シグマを習ったときもそうだった

先生がおもむろに

「数列 a_{k}  k=1から Nまで足したものを \sum_{k=1}^{N} a_{k} と書きます」

と言い出すのだ

そんなことをして一体何になるというのだろうか

いよいよ記号を使っただけのただのお遊びだとしか思えない

興味があるのは、その総和がどんな式で書けるかであり、そんな形式的な表記を導入したところで何も嬉しくないのだ

当時の私には、ここから面白そうな発展があるとは微塵も思えなかった

浅慮という他ないだろう

ここで重要だったのは、シグマの持つ性質を知るということであった

例えば、シグマには線形性があるため

 \displaystyle
 \sum_{k=1}^{N} (a_{k} +b_{k}) = \sum_{k=1}^{N} a_{k} +\sum_{k=1}^{N} b_{k}

と2つのシグマに分解できるし、また

 \displaystyle
 \sum_{k=1}^{N} \lambda a_{k} = \lambda \sum_{k=1}^{N} a_{k}

と係数をシグマの外に出すことができる

最初にシグマを定義することで、数列に依らないシグマの一般的な性質を予め調べることができるのである

そして、いざ具体的な数列が与えられれば、これらの性質を利用して式変形を繰り返し、「未知の総和」を「既知の総和」に落とし込むことができるようになるのだ

 

振り返ってみれば、新しい何かを学ぶときは毎回そうだった

こんなことをして何が面白いのかと問い詰めたくなる話から始まって、それでも辛抱して勉強を続けていると、あるところで急に広大な世界が見えてくる

あれほど自明だった導入から、どうしてこうも非自明で興味深い結論が得られるのか不思議でたまらない

私には先見の明がないのだ

大抵の場合、その入り口で面白さを見誤る

しかし、少なくともそのことを自覚できたのは幸運と言えるだろう

 

私は最近、圏論の勉強を始めたのだ

久々の感覚であった

久々に、こんなことをして何が嬉しいのか全く分からないことだらけであった

しかし私には分かる

この先には、間違いなく面白い世界が広がっている

"du -sh .*"で隠しファイルが対象にならない

"du -sh .*"で隠しファイルが対象にならない

% ls -a
./  ../  .ccc/    .ddd/  aaa/  bbb/

% du -sh .*
20K    .
4.0K    ..

ちなみにshellはbash

% echo $0
bash

次のコマンドもだめ

% find . -maxdepth 1 -name '.*' -exec du -sh {} +
20K .

次のコマンドでいける

% find . -maxdepth 1 -name '.*' -exec du -sh {} \;
20K .
4.0K    ./.ccc
4.0K    ./.ddd

他人に言語化されるということ

 何か もやもや した気持ちを抱えてネットを彷徨っていると、ふと文章が目に留まることがある。

 引き込まれる書き出しに、軽妙で流れるような文体、それでいて論理的で理知的で印象的なその文章に、さっきまでの自分の考えが重なる。

 そうだ、これだ。私の中にあった もやもや はこれなのだ。

 私の言いたかったことが完全に言語化されている。

 探していた宝物を見つけたような気になって、その在り処の描かれた地図を他の人に配って回る。

 私の考えはここにあります。と。

 

 自分のとりとめのない考えを理路整然と言語化されるのは気持ちが良い。それは、散らかった部屋が片付いたような居心地の良さがあるというだけでなく、子供っぽかったはずの自分の考えが、ただ好きか嫌いかというそれだけの話だったはずの気持ちが、実は正当な理屈に支えられていたことを確認できる。自分の中にあったのは単なる感情論ではなかった。自分では上手く説明できなかっただけで、それは尊く崇高なものだったのだ。

 

 いやしかし。少し立ち止まって考える必要がある。

 それは本当にあなたの考えていたことだったのかと。

 

 人間の認知や記憶というのはとても脆いものだと思う。それは「若い婦人」にも「老婆」にも見える錯視のようなもので、一度それに気づいてしまうと、そちらに意識が引きずられてしまい、もはやそれ以外に見えなくなってしまったりする。遠い昔の記憶が、自分の都合の良いように歪められているというのも良くある話だ。他人のアイディアを聞いたときに、「そう言えば自分も昔同じことを考えていたな」なんて思ってメモを見返すと、肝心なところが違っていたりする。「そのアイディアを思いついたことがある」ことと、「そのアイディアをすんなり受け入れる下地がある」こととは全く別物のはずなのだが、人は良くこれらを混同する。「そんなことなら自分でも思いつけそうだ」程度の感想を「自分も同じことを考えていた」と表現する人がいても私は何も驚かない。

 ともかくそういった訳で、他の人の文章と自分の考えを重ねる際には注意が必要だ。その境界線は容易く崩れ去る。

 見つけた文章に納得できるのであれば、それはそれで良いのかもしれないが、怖いのは、自分の元の考えを思い出せなくなることだ。どうしてもその素晴らしい言語化に引きずられてしまう。

 世の中には文章を書くのが上手い人間がいる。気をつけた方が良い。彼らは決してあなたの気持ちを書いている訳ではない。

 

 考えや気持ちというのは、脆く儚いものだからこそ、大切にしてほしいと思う。結局のところそれが単なる好き嫌いであっても良いのだ。

 思いついたそのときに、できる限りの力でそれを書き残した方がいい。上手く言語化できなくても良い。

 そして、良く似た小綺麗な文章を見つけたら、自分のメモと見比べてみる。自分の作文能力に落ち込む必要はない。

 良くできたその文章に自分のメモを重ねてみる。なるほど、言いたいことはよく似ているが、ところどころに違いがある。歪に飛び出たその言葉の端々に、あなたの大切な もやもや がまだ宿っている。

本当の初心者が「Scalaわいわい勉強会」に参加するまで

大学でC言語の授業を終えた私の耳に、どこからともなく聞こえてくる。

「どうやら、関数型言語というのがすごいらしい」

同様の現象は世界各地で確認されている。

オブジェクト指向の次は関数型だ」

「なんでも、デバッグと並列化がしやすいらしい」

そんな又聞きに又聞きを重ねた霞の正体を確かめるべく、人々はその魅惑のパラダイムシフトの門を叩いた。

かく言う私もその1人であり、大学の図書館にある関数型言語のエリアを目指して階段を上がった。

当時の私は自信に満ちていた。授業でC言語を学んだ後は、C++はもちろん、C#JavaScriptPythonなどのプログラミング言語を試し、時にはFortranなどという古代語にも手を染めた。「完全に理解した」などと思い上がることはなかったが、どの言語も触り始めてからまとまったプログラムを作成するまでにそれほど時間はかからなかった。結局のところ、それらは最初に学んだC言語に良く似ていた。新しく学ぶ言語でも「つまり、これはC言語で言うところのあれだな」と読み替えることで簡単に対応できた。文法の同じ外国語を学んでいるような感覚だ。ほとんど方言のように見えるものもある。

図書館の本棚に並べられた関数型言語の本をてきとうに手に取りパラパラとめくる。

なんだこれは。

明らかに異質だった。見たこともない不思議な表記が並んでいた。既知の言語での置き換えができない。これはC言語で言うところの何なのだ?

気がつくと私は図書館を飛び出し、帰宅すると同時にGoogleを開いた。誰か分かりやすく解説をしている人はいないのか。

しかし、手当たり次第にサイトを見てみたがどれも難解であった。

プログラマー向けと思われるページを見てみると、突然モナドという謎の概念の説明が始まり、どうやらそれは圏論という数学の分野から来ているらしいが、私には何の話かまるで分からなかった。

より素人向けのサイトを見てみると「私も初めは添字を使わずにプログラムが書けるなんて思っていませんでした。しかし───」といった具合で嬉々としてその素晴らしさが綴られているのだが、やはり私には分からない。今思い返せば、深夜の通販よろしく、右下に小さく「個人の感想です」と書いてあったかもしれない。

色々な解説を見てみたが、最終的に私よりも賢いサルがいるらしいことが分かったあたりで、私は完全に挫折していた。

これはあれだ。数学者が使う何か特殊で崇高な言語なのだ。私のような人間が使うものではないのだろう。俗世からは完全に切り離されたものに違いない。

そういうふうに納得し、私はその憧れを心の奥底にしまいこんだ。

 

今回「Scalaわいわい勉強会」へ参加したのは、そんな私のささやかなリベンジであった。

初めてその名を𝕏(旧:Twitter)で見つけたとき、私は目を疑った。

私の記憶が正しければ、Scalaは格式高き関数型言語であり*1、「わいわい」などという副詞が添えられるものではなかったはずだった。

調べると、これは「Scalaを楽しく学んでほしい」という理念から生まれたものであるという。

そんなことが本当に可能なのだろうか。

 

当日会場に着いた私は、受付で作成した即席の名札を付けて席に着いた。

見渡すと、ノートパソコンを開いて会の始まりを待っている人も多かった。私も負けじとMacを開いたが、画面上のターミナルには勉強中のScalaによるHello Worldが表示されており、慌てて閉じた。勉強会に参加することを決意してから、流石に丸腰で行くわけにはいくまいと、日頃スキマ時間を見つけては、ドワンゴ社の公開しているScala研修のテキスト*2を進めており、ちょうどクラスのあたりまで終わったところだった。誰かに見られはしなかっただろうか?

不安でいっぱいだった私だったが、会が始まると次第に気持ちは落ち着いてきた。いや、内容は1割も分からなかったのだが、発表者が自分の好きなものの話をしているのを見るのは気持ちが良いものだったし、何よりコミュニティの雰囲気を感じ取ることができた。冗談でも何でもなく、会に参加するまでは「あー、ほんとに素人が来ちゃったんだ笑」みたいになるのではと恐れていたのだ。

しかし実際に始まってみれば、Scalaを知らない人でも興味を持てそうなテーマの発表もあったりして、自分みたいな人間が参加しても良い会だったんだと安心できた。それに加えて、「この話は言語に依らず大事なテーマだな」と勉強になる発表や、「どこも似たようなことで苦労しているんだな」と共感できる話も多く、分からないなりに楽しむことができた。

「型、最高〜!!」の乾杯で始まった懇親会でも、私の他に初心者を名乗る2名の方とお会いすることができて、この会に参加した理由や、Scalaに対する思いなどについて楽しくお話をすることができた。

 

人並な感想かもしれないが、実際にScalaを使う人、Scalaを好きな人達とお会いできたのは本当に貴重な経験だった。例え意味は分からなくとも、楽しそうに話をする人を見ると、自分もそれで何かを作ってみたくなる。少なくともかつて図書館で受けたあの冷たく突き放すような印象とは程遠いものがそこにはあった。

 

最後に、このような会を企画・運営してくださった関係者の皆様に感謝しつつ、筆を置くことにする。

 

*1:Scalaオブジェクト指向言語関数型言語の特徴を合わせ持つため、正確にはマルチパラダイムの言語になる。

*2:Introduction · Scala研修テキスト

自分の作ったものに少しだけ胸を張れる理由

 高校生のとき、先生が授業中に「ベクトルには足し算や引き算はあるけど、掛け算は定義されてない」なんてことを呟いた。その先生の意図は今となってはもう分からないけど、ともかく当時の自分は、「じゃあ自分で定義してみるか」なんて思って、色々考えて2つのベクトルA, Bの積を、|A||B|sinθと定義したらいいんじゃないかと思い至った(θはなす角)。その頃、先生に提出する数行程度の日記みたいなものがあって、さっそくそこにこの定義の話を書いて返事を楽しみにしていたら、先生から「何の話ですか?」とだけコメントがついて返ってきた。

 定義の欠点を指摘される訳でもなく、ましてや、話が広がる訳でもなく、単に先生がそのことを忘れてしまっているというのが、そのときは、何というか恥ずかしくて、言うなれば、赤の他人にいきなり自作の小説を披露してしまったような、そんなバツの悪さを覚えて、本当は日記をくしゃくしゃに丸めて投げ捨てたかったけど、それは冊子になってたので、諦めてただページを閉じて忘れることにした。

 でも、忘れようと思って忘れるのは全然簡単なことじゃなくて、というか普通に無理な話で、せめて誰かとこれについてあれこれ話し合ってみたくなって、「ベクトル同士の掛け算を考えてみたんだけどさ…」なんて気持ちの悪い会話を聞いてくれそうな友達に声をかけた。

 そいつは、笑いもせず、かと言って変なやつを見る目をする訳でもなく、渡したノートをじっと見て、「これは外積*1だよ、自分で考えたの?」と言った。「いや、すでにあるんかい」というのが最初に思ったことだったが、それ以上に、ちゃんと話を聞いてくれたのが嬉しかった。

 そいつは、自分なんかよりも頭が良くて、結局その後、良い大学の数学科に行ったようなやつで、普段から難しそうな本を読んでるのだから、自分の話すことなんて幼稚に聞こえるに違いないのに、それでも一番まじめに話を聞いてくれるやつだった。

 自分は、小さい頃から何かを作るのが好きで、それは今でも続いてるけど、作ったものを人に見せるときは恥ずかしいし緊張する。そして、「いやそんな大したもんじゃないんだけどさ」なんて予防線を張ろうとするんだけど、その度に、あいつが真面目に自分のノートを見つめているのを思い出して、「何で自分が自分の作品をバカにしてるんだ?」とか思ったりして、少しだけ胸を張れるようになる。

*1:実際の外積には、これにA, Bに垂直な単位ベクトルがかかります。

UbuntuのDropboxが「開始中」のままで同期が進まない

結論

UbuntuDropboxでは、ファイルの変更をinotifyというソフトで監視しているらしいのだが、このソフトには監視できるファイル数の上限が決まっており、Dropbox内のファイル数がこれを超えると、UbuntuDropboxはファイルの変更を追うことができなくなり、同期が止まってしまうらしい。

私は、端末上に表示されていた下記のメッセージを完全に見逃しており、数日間沼った。

Unable to monitor entire Dropbox folder hierarchy. Please run "echo fs.inotify.max_user_watches=100000 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p" and restart Dropbox to fix the problem.

解決方法書いてあるやん...

結局、端末上で次のコマンドを実行すれば解消する。

% echo fs.inotify.max_user_watches=100000 | sudo tee -a /etc/sysctl.conf; sudo sysctl -p
% sudo sysctl --system
% dropbox stop
% dropbox start

参考

上記の内容のより詳しいものは下記のqiita記事に書いてある。というか、この記事のおかげで助かった。

qiita.com

同期が全然進まず、色々調べていたときにこの記事を見つけ、「でも自分はこんなメッセージ出てないしなぁ」と思って改めて端末見たら普通に書いてあった。

ただ、この記事では『UbuntuDropboxが「開始中」のままで同期が進まない』という事象については触れられていなかったので、そのキーワードで検索した人が答えにたどり着けるようにこのブログを書いた。