✖
ミラーレス一眼悪くないと思うし、一眼レフをある程度置き換えるだろうけど、サイズや重さをのぞけば一眼レフはミラーレス一眼の上位互換なので、アナログからデジタルへの移行みたいに完全置換にはならないだろうなあと思った。
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 とか別の手段でもっと最小限のテストを書くべきです。
✖
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 互換実装があったら教えてください……
✖
✖
餅しか食べてない
✖
ジェーン・エア、上巻が読み終わった。ジェーンが「ロチェスター氏はわたしのことが気に入っているのでは?」から「そんなことはない! とんだ思い違いだ! 愚かなわたしめ!」となる一連のシーンは、ジェーンの、他人の感情に鋭敏なところや謙虚で意志が強いところが出ていて、非常に可愛らしくて良かった。
関連エントリー
- ✖ 最近ジェーン・エアという小説を図書館で借りてゆっくりながらも読んでいて、久しぶりに読書の楽しみを思い出している。全体的に静かに話が進んでいく...
- ✖ ジェーン・エア(下) (新潮文庫) cho45 C・ブロンテ ★ 3.0 / 5.0 cho45 読み終わった。結局二ヶ月ぐらいかけて読んで...
- 『赤髪の白雪姫 』あきづき空太 赤髪の白雪姫1 (花とゆめCOMICS) cho45 あきづき空太 ★ 3.0 / 5.0 cho45 欲しいなー と思いつつ amazon...
- 『彼女のひとりぐらし』玉置勉強 彼女のひとりぐらし 1 (バーズコミックスデラックス) cho45 玉置 勉強 ★ 3.0 / 5.0 cho45 すごく面白かった。なんか...
- 電源 VRM フェーズ数ってなんなのか PC関係だとよく VRM (Voltage Regulator Module) フェーズ数という用語にでくわす。マザーボードやグラフィックボ...






