にょきにょきのお勉強 -15ページ目

to last me

last を最後の、とかこの間の、という意味でなら自分でもよく使います。

たとえば last monday とか last one とか。


でも last を動詞として使うというのは直感的に理解しがたいです。


The milk lasts me 7 days.


直訳すると"そのミルクは私にとって7日間続く"とかいうことになるようです。


The milk lasts me 7 days, but it lasts you 1 day.


要は「私の場合そのミルクは7日間分だけど、あなただと1日分ね」てことを言っているようなのですが、lasts me っていうのが感覚的に分かりません。


つくづく同じ単語でも名詞の場合、副詞の場合、動詞の場合…と分かれているのは覚えにくいなぁと思います。

WinIE の標準準拠モードで TextRange オブジェクト


ブラウザは DOCTYPE 宣言の違いにより、標準準拠モードか後方互換モードか解釈を変えて動作します。


特に WinIE ではその違いが結構顕著にみられるので、最近は標準準拠モードで作って Firefox でも WinIE でもあまり違わないレンダリングをしてもらおうという姿勢で臨んでいます。


私の周りでは XHTML1.0 Strict な DOCTYPE 宣言を xml 宣言なしで制作していることが多くて、私もコレを使っています。

(xml 宣言を付けると WinIE では後方互換モードになってしまう)

<DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<textarea>の中で選択されている文字列を JavaScript でごにょごにょしたくて、ブラウザが WinIE の時には TextRange オブジェクトを使って操作しようとしていたのですが、どういうわけか moveEnd() メソッドを呼んでいる部分までくると「予期しないメソッドの呼び出し、またはプロパティ アクセスです。コード: 0」 というエラーが起きてしまいます。


TextRange オブジェクトを作るまでは問題ないのにメソッドが呼べないという不可解なエラーを検索してみるもコレという情報を見つけられませんでした。


とにかく何が原因なのか探るべく、コードを最低限のところまで削っていきテストを繰り返しつぎの状況でエラーが起きているところまでは分かりました


1) WinIE で標準準拠モード

2) <div><form><textarea></textarea></form></div> という構造の HTML

3) 外側の<div>に css で position: absolute が設定されている

4) <textarea>に対して作ったTextRange オブジェクトの moveEnd("textedit") を呼ぶ


いろいろ削ったりしているので、なんのコードだ、、ってことになってますが再現用コードはこんな。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml
 " lang="ja" xml:lang="ja">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
        <meta http-equiv="Content-Script-Type" content="text/javascript" />
        <meta http-equiv="Content-Style-Type" content="text/css" />
        <title>Sample</title>
        <script>
          // <![CDATA[
          function get_select(txt) {
              txt.focus();
              var sel = document.selection.createRange();
              var rang = txt.createTextRange();
              rang.moveToPoint(sel.offsetLeft, sel.offsetTop);
              rang.moveEnd("textedit");

              if(rang.text.replace(/\r/g,"").length != 0){
                  var las = (txt.value.match(/(\r\n)*$/),RegExp.lastMatch.length);
                  txt.selectionStart = txt.value.length - (rang.text.length + las);
                  txt.selectionEnd = txt.selectionStart + sel.text.length;
                  alert(txt.value.substring(txt.selectionStart, txt.selectionEnd));
              }
          }
          // ]]>
        </script>

        <style>
            .dame {
                position: absolute;
            }
        </style>
    </head>

    <body>
        <div class="dame">
            <form action="hoge.cgi" name="fm">
                <textarea name="nexturl"></textarea><br />
                <a href="javascript:get_select(document.fm.nexturl);">選択</a>
            </form>
        </div>
    </body>
</html>

このままだと <textarea> 内のテキストを選択してから"選択"をクリックするとエラーになります。


後方互換モードにするとエラーはおきず、期待通り選択した範囲が alert で表示されます。

また、標準準拠モードでも <form> のすぐ外側の <div> の position: absoluete をやめるとエラーはおきず、期待通り。


そこで私の解決方法は、DOCTYPE 宣言を変えると見た目が変わってしまって困り、position: absolute は他のページと共有している css ファイルに書いてあり、position: static ではレイアウトが崩れる、、、という状況だったので、TextRange を使うページでだけ、<style> タグの中で position: relative を上書き設定することで回避しました。


ちなみにこのモードの違いはDOCTYPE スイッチという名前で呼ばれているみたいです。

くるくるの名前

仕事中にブラウザとサーバ間の非同期部分を作ったのですが、いつの間にかそのあたりを操作するとブラウザ(Firefox)の右上あたりにあるアイコンがくるくる動いてずっととまらないという現象がみられました。


作ったときはちゃんと動くことを確認していたので、別なところを修正した際になにかバグができたかな?と思ってコードの差分など調べましたが、特におかしなところも見当たらず。


通信状況を見ていても、問題なく終了しているようだしデータももれなく受け取れてるし。


心当たりもないので、まぁとりあえず google さんにお知恵をお借りしようかと思いました。


が、実際に検索しようと思ったら 「xmlhttprequest ブラウザ くるくる とまらない」とかしか思いつかない…。


そんなのだからこれだというページにも上手く行き当たらないので、くるくるの名前を調べました。


くるくる、では見つからないかも…と思ってましたが案外そういう表現があって助かりました。


Throbbar スロバー というらしいです。

名前も判明したことだし、google さんに再チャレンジ。


…したのですが検索結果はくるくるよりもヒット数が減りました。あまり知られてないらしい。


結局、本来解決したかった問題はブラウザの調子がどんどんおかしくなっていたので、再起動したら治まりました。再現もしないし、私の問題ではなかったみたい。


なんかおかしなページ踏んだのかも。


【追記】

その後、同じ現象が起こりました。しかも再現手順を見つけたので私の問題だったみたいです。(まだ原因不明)

他のページのせいにしてごめんなさいー。

Image::Magick で画像の読み込み


Image::Magick を使って画像を読み込みごにょごにょするというプログラムを書いていたのですが、マニュアルに振り回されて大分時間を浪費してしまい悔しかったのでメモ。


Image::Magick の man をみると、すごく基本的なコード例と詳しくはこちらを参照というポインタがあるので、それにしたがってサイトで確認。


画像の読み込みの時の戻り値が知りたくてマニュアルのRead or Write an Image て部分を確認してみました。


Read 関数の戻り値は「the number of images read」となっているので、読み込みに失敗したら戻り値と数が合わないということだろうと。


  my $img = new Image::Magick;
  $img->Read('sample.jpg') or die "Cannot read image file: $!";

でいいじゃないかと思ったのですが、常に画像の読み込みに失敗している様に見えるので、読み込みファイルを変えてみたりパスを変えてみたりいろいろしたのですが改善しないんですね。


なんとなく Example Script の部分 を見てみたら


  $image = Image::Magick->new;
  $x = $image->Read('girl.png', 'logo.png', 'rose.png');
  warn "$x" if "$x";


てなっているじゃないですか。


$x が真ならWarning出力、しかも $x 自体をエラーログに出力ってことはエラーメッセージかエラーコードが戻るのか?何事もなく画像が読み込めれば戻り値なしってことか。。?


てーい、マニュアルめー、何が読み込んだ画像数を返すだー、真偽値すら逆じゃないかー。


成功時には die って書いてちゃそりゃ動かないよね。

というわけで条件を反転して解決。


RTMPとかなんとか。


ちょっと前に、rtmp とか rtmpt とかのメモを書いていたけれど、rtmp ってなにかとかにはあんまりわかっていなかったので触れてませんでした。

その辺を少し教わったので要約してメモ。


RTMP はAdobe (macromediaか?) が決めているバイナリプロトコル。FMS サーバとの通信するときのお話方法。port は前も書いたけど一般的に 1935。


で、port1935という出入り口をセキュリティに厳しいところでは認めていなかったりします。それでは内側の人は flv を観れないことになりますが、このport1935がダメというのはそう珍しい環境ではなさそうです。


そこで代わりに許可されている可能性が高いHTTP (port80) や HTTPS (port443) のプロトコルに見せかけてデータの送受信をしようというのが RTMPT と RTMPS です。


RTMPT は HTTP を装ってPOSTにより細切れにしたバイナリデータを次々送受信することで flv を再生できるようにします。


RTMPS は HTTPS を装って、というものです。だから port がそれぞれ 80 と 443 というように HTTP, HTTPS と同じものを指定するんですね。


じゃあ RTMPT と RTMPS の使い分けは?というと、たとえば proxy を経由しての RTMPT の場合、セキュリティポリシーによってはダメなケースがあるみたいで、そういうときに RTMPS を使うと大丈夫だったり、ということなのではないかと思います。


そうやって HTTP や HTTPS のプロトコルに見せかけて通信するのでトンネリングといわれるのかしら。


HTTP と HTTPS では暗号化と暗号をほどくという手間隙分だけ速度や負荷がかかり HTTPS の方が遅め。

更に、バイナリを生で流せるプロトコルと HTTP 用にこま切れして装って…とするプロトコルを比べると HTTP の方がより遅め。


そんなわけで速度や効率の面では RTMP > RTMPT > RTMPS となるようですが

つながる可能性となると逆になるのかな。