Hatena::ブログ(Diary)

grafi-note

2011-11-03

夢日記とも呼べないなこれ 11/1未明

僕は何かあるちょっとした、もしくはたいした計画を半ばまで終えて、残り半分をどうしようかと考えているところだった。例えば、込み入った分数の分母の計算を終えて、ちょっと一息つきながらさあ分子をどう計算しようかと考えているところを想像して欲しい。その時、僕は何かの障害にぶつかったのだと思う。そこで世界が停止した。夢の外の僕は不意に目を覚ました。

その瞬間、僕は人間の思考はリニアであると直観した。「リニア」という言葉自体が、直観のプリミティブとして浮かび上がった。要は、人は線をなぞるように一つ一つ物事を考えていて、決して並列な演繹なんて出来ないということだ。そして、全てはフラットな線に展開される。木構造深さ優先探索を使って直列化するアルゴリズムのように。何か困ったことが一つ夢のなかの思考で起こり、思考の線が破綻して、夢の世界の構築が停止した。この事実から僕はそう感じたのだろうが、明らかに論理は飛躍している。

目を覚ました僕は、直観を枕元のスマートフォンで記録した。寝ぼけて覚束ないフリック入力で、ホーム画面のGoogleの検索ボックスに取りもあえずと打ち込んだ。ロフトで寝ていて枕元に紙とペンは無くて、はしごを降りようとする気にはならなかったようだ。大学の休み時間に何とはなしにウェブブラウザを立ち上げて思い出したその壊れかかった日本語には、その論理の飛躍はそのままの形で一片たりとも壊されずに存在していた。きっと、飛躍してるから直観なのだろう。有りもしない論理のグルーを捏造するほどに目が覚めてはいなかったのだろう。そして、記録しながらもそのとき、僕が論理の欠落にすでに気づきながらもどうしようもなかった、そんな記憶が確かにある。

しかし、なお。そこに紙とペンがあったなら。夢の啓示を記録するにはフリックは低速すぎたのではないか。せめて、枕元に置いていたノートパソコンが壊れておらず、サスペンド状態にあったなら。目覚めの後の一瞬に、もしかしたら何かを描けたのでは、そんな気もしなくはない。

もちろん、この文章は、不完全な記録と記憶を言葉の装飾で結び会わせたもので、啓示としての正当性はすでに損なわれている。ただ、いくら考えても、この文章に記されていない善き直観が在ったという仮定を信じることもやはり出来ないのだ。意識は自らを過信しているのだろうか。

2011-10-30

みらいのたくはいびん

きっと僕の生きてるうちには普通の自動車は空は飛ばないし、透明チューブの道路も極めて疑わしいが、有り得なかった未来の代わりに。


Amazonで商品を注文する。広大なAmazonの倉庫からロボットが商品を選び出し、またRFIDライターによって記録された配送情報が貼りつけられ、コンベアに送出される。適切なアルゴリズムを使って管理されたルートに沿って、荷物は車から車へと積み替えられ、無人運行の自動車によって消費者の最寄りの営業所に移送される。

荷物の受け渡しに日時指定なんて古臭い仕組みは必要ない。スマートフォンの位置情報、予定情報と連動して在宅時間が予測される。個人宅に荷物を運ぶ車はトヨタとNTTの共同して作られた汎用インテリジェントカーベースの後部ブロックに、中型個別貨物配送ユニットを取り付けたものだ。常にインターネットに接続され、Googleのサーバから暗号化されて配信される現在の位置情報にリアルタイムに接続し、最適なルートを受信し、また真にリアルタイム性が要求される車の運転そのものには車内のCPUが当たる。

宅配便が家の前に到着すると、僅か十メートルしか無い距離を遙かに遠回りして情報が伝達し、携帯端末のSMSトリガーが叩かれて気づく。携帯端末を持って自動車の後部ユニット部のICタグリーダ部位にかざす。既にユニット内のベルトコンベアやエレベータを組み合わせたような複雑な機構は必要な荷物をすぐ手前に運び出しており、シャッタが開くと目の前に目当ての荷物が有る。RFIDタグを取り外してその場に置いて、荷物を取り出す。シャッタが降りる。目的を果たしたことを個別貨物配送ユニットに伝えられたRFIDタグは自らの情報をリセットし、RFIDタグタンクに溜め置かれ、適宜回収、再利用される。


こんなことを書いたが、きっとこんな未来はそう来ない。人間はオフィスのペーパーレス化すら出来てないそうじゃないか。

2011-10-25

RubyのEnumerator.newが素敵な話

大学のRubyを使ったプログラミングの入門講義で、友人がsin(x)をテイラー展開して評価するという課題を出されたという。多少手伝いつつ友人が自力でなんとか出来て良かったのだが、どうにもなかなかRubyらしく書けず気持ち悪かった。

特に、テイラー展開の各項の生成過程を、次の項の生成に利用するような書き方をすれば、それが顕著になる。

注意 ここからRuby1.9系しか考慮しない話を始める。大抵の大学のシステムはRuby1.8系だろうから、以降のコードはそのままでは大学の課題には使えない。

注意 でっかい数値入れたらFloat溢れて死んだけど、その辺のチェックもちゃんとするなら必要。

def taylor_sinx_1(x)
  ruijo = x.to_f
  kaijo = 1
  sign = 1
  kou = ruijo
  taylor = kou
  loop.with_index(1) do |_,n|
    ruijo *= x**2
    kaijo *= (2*n)*(2*n+1)
    sign = -sign
    kou = ruijo * sign / kaijo
    return taylor if kou.abs <= Float::EPSILON
    taylor += kou
  end
end

どうにも気持ち悪い。何が気持ち悪いかって、結局は、各項を生成するループに、各項を足しあわせていくコードが混ざり込んでるのが気持ち悪い。でも、漸化式を回しながら項を生成しているから、普通に関数を作ってループを分離することは出来ない。

さて、ここでFiberを使えばと思った人も多いはず。フィボナッチ数列の生成に利用するサンプルよく見るし。実際初め僕も使ってみて、かなり綺麗になった。コルーチン素晴らしい。

def taylor_sinx_2(x)
  gen = Fiber.new do
    ruijo = x.to_f
    kaijo = 1
    sign = 1
    loop.with_index(1) do |_,n|
      Fiber.yield ruijo * sign / kaijo
      ruijo *= x**2
      kaijo *= (2*n)*(2*n+1)
      sign = -sign
    end
  end
  taylor = 0; kou = 0
  taylor += kou while (kou = gen.resume).abs > Float::EPSILON
  taylor
end

綺麗だけど、while微妙。inject使いたい。無限リストに出来ないの?それEnumerator.newで出来るよ!

def taylor_sinx_3(x)
  kous = Enumerator.new do |y|
    ruijo = x.to_f
    kaijo = 1
    sign = 1
    loop.with_index(1) do |_,n|
      y << ruijo * sign / kaijo
      ruijo *= x**2
      kaijo *= (2*n)*(2*n+1)
      sign = -sign
    end
  end
  kous.inject{|sum,kou|kou.abs>Float::EPSILON ? sum+=kou : (break sum)}
end

見事に遅延評価無限リストっぽいものが出来た。FiberやEnumeratorを使うと漸化式や足し合わせる部分のそれぞれだけを意識してコードを書けるので、見た目が綺麗になるだけでなく、すんなりと混乱せずに書けるというのも嬉しかった。コルーチンは無限リストだけじゃなく様々な用途がある強力のフロー制御だと思うけど、ジェネレータが欲しいときにはEnumerator.newがおいしい場合が多そう。

ほんの少し、より抽象的に書いてみる。

def taylor_sinx_4(x)
  kous = Enumerator.new do |y|
    ruijo = x.to_f
    kaijo = 1
    sign = 1
    calc = ->{ruijo * sign / kaijo}
    y << calc.call
    loop.with_index(1) do |_,n|
      ruijo *= x**2
      kaijo *= (2*n)*(2*n+1)
      sign = -sign
      y << calc.call
    end
  end
  kous.take_while{|kou|kou.abs>Float::EPSILON}.inject(:+)
end

take_whileは関数型っぽくて凄くかっこいい。ただ、実際使いどころがそんなにあるのだろうか…という気もする。

Haskellなんかだと、変数を書き換えて漸化式を回すのではなくその部分も無限リストにするのだろうし、こういう手続型と関数型が奇妙に混じったコードはRubyらしいと思う(Pythonもそうかな)。

2011-09-18

『ノルウェイの森』感想

村上春樹の作品を読んだこと無かったんですが、今さらながら読みました。

余分な価値判断が廃された透明な語りは、「こいつの言ってることの是非を問う」というフィルターを経ることなく気がついたら脳に浸透しており、なかなか精神にこたえる読書でした。実際、結構胡散臭いことを、主張すらしていないにも関わらず言ってると思うんですよね。

あと、背表紙が面白い。本を裏向けると書いてある、あらすじ紹介。『喪失の物語』などと物々しく書かれていて、なんとまあ。

そして、そりゃこういう話を読めば思い浮かぶ身近な人なんかもいるわけですが、それが全員男だというのが男子校出身者の皮肉です。