2010年 12月 10日


撮りたい写真とは別に、写真撮るときの、被写体を感じてから、見て、カメラを構えて、ピントをあわせて、呼吸をおいてシャッターを押すときの感覚は割と好きで、これは、腹の底に溜ってるぐでぐでしたものを、うまく外に出せるスキームとしては自分の中で唯一確立しているもので、そのために、そういったものが溜っているなあと感じると、シャッター押す回数自体が増えます。

2010年 12月 09日


2010年 12月 08日


ミラーレス一眼悪くないと思うし、一眼レフをある程度置き換えるだろうけど、サイズや重さをのぞけば一眼レフはミラーレス一眼の上位互換なので、アナログからデジタルへの移行みたいに完全置換にはならないだろうなあと思った。

Test::HTML::Differences

CPAN にあげました。前回書いたときのは、衝動的に書いて結構挙動が微妙だったので、ちょっとなおしました。

というのも、構造的にだいたい一緒の部分が diff として出てきても鬱陶しいだけなので、比較時にはインデントをせず比較して、表示するときにはインデントして構造がわかりやすくなるようにしました。つまり以下のようになります。

#   Failed test at t/03_output.t line 47.
# +----+-----------------------+----+-------------------------+
# | Elt|Got                    | Elt|Expected                 |
# +----+-----------------------+----+-------------------------+
# |    |                       *   0|<foo>                    *
# |   0|<div class="section">  |   1|  <div class="section">  |
# |   1|  foo                  |   2|    foo                  |
# |   2|  <a href="/">foo</a>  |   3|    <a href="/">foo</a>  |
# |   3|</div>                 |   4|  </div>                 |
# |    |                       *   5|</foo>                   *
# +----+-----------------------+----+-------------------------+

インデント量が違う部分も、変化無しとして検出されます。

あるいは

#   Failed test at t/03_output.t line 47.
# +----+-------------------------+----+-------------------------+
# | Elt|Got                      | Elt|Expected                 |
# +----+-------------------------+----+-------------------------+
# |   0|<div class="section">    |   0|<div class="section">    |
# |   1|  <div class="section">  |   1|  <div class="section">  |
# |   2|    <p>foo</p>           |   2|    <p>foo</p>           |
# |   3|  </div>                 |   3|  </div>                 |
# |    |                         *   4|</div>                   *
# |   4|  <div class="section">  |   5|<div class="section">    |
# |   5|    <p>foo</p>           |   6|  <p>foo</p>             |
# *   6|  </div>                 *    |                         |
# |   7|</div>                   |   7|</div>                   |
# +----+-------------------------+----+-------------------------+ 

とかになります。

また、冒頭のスクリーンショットのように、いろつきに対応しました。これは単に use するときに -color をつけると Test::Differences::Color を使うようになるだけです。


なお、Test::HTML::Differences は HTML の構造をテストするもので、そのテストの書きやすさのために、要素内の始め・終わりの空白類を無視するようになっています。XML 的等価性を検証するテストではなく、あくまでデータの構造テスト用です。つまり、空白を含めた厳密なテストは例えば is とか別の手段でもっと最小限のテストを書くべきです。

2010年 12月 07日


gerry++

IE で postMessage 的実装をちゃんとやる

postMessage、便利でいいですね。ドメインを跨いでうまく連携してスクリプトを書けたときの楽しさはパズル的でこのうえない感じであります。しかしながら postMessage は古い IE で動かないので、代替実装が必要です。ググるといっぱい出てきはするのですが、自分の要求にかなったものがなかったのでひとまず書きました。

$ cat /etc/hosts
127.0.0.1 anotherhost
$ git clone git://gist.github.com/701752.git gist-701752 
$ cd gist-701752
$ plackup -MPlack::App::Directory -e 'Plack::App::Directory->new({root=>"."})->to_app' -p 5000

とかやっておいて、http://localhost:5000/test.html にアクセスするとなんか出るので、ボタンをクリックしたりするとどうにかなります。フレームの中と外で別ドメインです。

要件

実装するにあたって必要だったのは、まさに postMessage だったので、以下のようなことが求められました。

  • メッセージのとりこぼしがない
  • IE で動く

逆に、古いブラウザで動けばいいので速度はそれほど求められていません。

実装

とりあえず動いてほしいので、古くから伝わり慣れている location.hash によるドメイン間通信を用いることにしました。location.hash による通信を要約すると以下の通りです。

  • データを送信したいフレームの location.hash を書きかえる
    • 書きかえるだけならドメイン関係なくできます
  • 読みだし側は location.hash を監視して変化を検知したら処理する

ただ、これには以下のような問題があります。

  • IE の URL 長制限。
    • 2038 バイト制限が存在します。
  • location.hash を監視する以上の速度でデータを送信することができない
    • 監視に使用するのは setTimeout/setInterval なので、監視間隔は厳密には不定です。

なので、2038バイト制限を超えるデータを送信するためにはデータのパケット化が必要なのと、データの紛失を防ぐために何らかの方法が必要ですが、要はパケロスする環境で信頼できるデータ通信を行いたいということなので TCP のやりかたをパクって実装してあります (シーケンス番号 + ACK)。

備考

window.name を使う方法であればデータ長制限がなくなるのでパフォーマンスは向上しそうですが、実装は複雑そうです。また、空のリソースを両方のドメインに求めるので、失敗確立があがります。

ちゃんとした postMessage 互換実装があったら教えてください……