Image 01 Image 02

0
Posted on 10th 3月 2009 by y

jsが入っているのにJavascriptのインタプリタ以外に使い道がないなあ、と思っていたらPeclにspidermonkeyというのが追加されていた。検索するともう記事が見つかったりして、楽しそうなのでさっそくインストール。PHP5.3beta0以上が必要なので、テスト環境のPHPもついでに更新。php.iniのextension_dirを

extension_dir=/usr/lib/php/exntesions/no-debug-non-zts-20090115

のように更新しておかないといけない。

で、pecl install spidermonkey-alphaを実行したら見事にこける。ヘッダファイルjsapi.hがないとのこと。でもそのファイルは/usr/include/直下にある。で、手動でspidermonkey拡張モジュールをダウンロードしてconfigureの中身を見ると、

for i in $PHP_SPIDERMONKEY /usr/local /usr; do
    for j in js mozjs; do
      test -f $i/include/$j/jsapi.h && SPIDERMONKEY_BASEDIR=$i
&& SPIDERMONKEY_INCDIR=$i/include/$j && SPIDERMONKEY_LIBNAME=$j
&& break
    done
    test -f $i/include/$j/jsapi.h && break
  done
  if test -z "$SPIDERMONKEY_INCDIR"; then
    { { echo "$as_me:$LINENO: error: jsapi.h not found. Please reinstall libjs." >&5
echo "$as_me: error: jsapi.h not found. Please reinstall libjs." >&2;}
   { (exit 1); exit 1; }; }
  fi

こんな箇所があり、spidermonkeyのヘッダファイルは/usr/includeか/usr/local/include直下ではなくその下のjsかmozjsディレクトリでないといけないらしい。なんなんだ。以前spidermonkeyをインストールしたときの手順に問題があるんだろうか。

まあ、ヘッダファイルはみんなjs*.hという名前だったので、さくっと

# mkdir /usr/include/js && cd /usr/include/js
# for i in `ls ../js*.h`; do ln -s $i `echo $i | sed "s/..\///"`; done
# pecl install spidermonkey-alpha

適当なことをやって、ようやくインストール完了。ちなみにmozjsにするとやっぱりpeclからのインストールは出来なかった。なぜだ?

Popularity: 8% [?]

0
Posted on 21st 1月 2009 by y

Internet Explorer 7で下のJavascriptを実行するとエラーになるのね。

<span id="here" style="color:#000000">hoge</span>
<script>
document.getElementById("here").style.color = '#0000000';
</script>

Popularity: 3% [?]

1
Posted on 14th 7月 2008 by y

iPhoneでアクセスしてきたら、とりあえず先に90度回転しておいて、縦にしても横にしてもずっと画面が傾いたままにしてしまえばいい。(参照

Safariでアクセスして動いてたからたぶんこれで大丈夫だ。

iPhone専用ページ

update: 実機を借りたので試してみたらだめだった。畜生め。
update2: いちおう動いていた。
update3: くそっ!Windowの幅や高さが変わったら回転するというのはできなかった。画面をフリップさせてもwindow.outerWidthやwindow.outerHeightの値は変わらないらしい。

function flipYou(){
        document.body.style['-webkit-transform']='rotate(90deg)';
        height = window.outerHeight;
        base = 90;
        setInterval(function(){
                if(height != window,outerHeight){
                        base += 90;
                        com = 'rotate(' + base + 'deg)';
                        document.body.style['-webkit-transform']=com;
                        height = window.outerHeight;
                }
        }, 5000);
}

これではちゃんと検知しない。heightをwidthにしてもダメ。

Popularity: 3% [?]

0
Posted on 11th 6月 2008 by y

ファイル名や変数名にはみんないろいろこだわりがあると思うが、同好の士を見つけるとうれしくなる。

live365.comのプレイリスト表示ページのソースだが、クッキーを扱うらしきJavaScriptの名前に驚いた。3年くらい前から、仕事でもクッキーの名前の一部や何かのキー、関数名、変数名に自分でもこの名前を使っていたので。

Popularity: 2% [?]

0
Posted on 10th 4月 2008 by y

もうすぐ廃止になるJavaScriptのescape関数なのだが、例えばこんな風に文字列をescape関数に渡すと

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<script language="javascript">
function test(){
	var str = document.getElementById('tibet').innerHTML;
	var esc = escape(str);
	alert(esc);
}
</script>
</head>
<body>
<div id="tibet">ダライラマ</div>
<button onClick="test();">test</button>
</body>
</html>

alertに表示されるのは「%u30C0%u30E9%u30A4%u30E9%u30DE」という書式になっている文字列で、ようするにescape関数は文字列を%uで始まる16進数のかたまりにする。

これをそのままPHPに渡してデコードするには、

<?php
$str = '%u30C0%u30E9%u30A4%u30E9%u30DE';
$decode = preg_replace_callback("/(%u)([0-9a-zA-Z]+)/", '_decode', $str);
function _decode($array){
	return mb_convert_encoding(pack("H*", $array[2]), 'UTF-8', 'UCS-2');
}
?>

こんな感じで処理する。逆に、PHP側で文字列をJavaScriptのescape処理と同様に加工する場合は

<?php
$str = 'ダライラマ';
preg_match_all("/(.)/u", $str, $matches);
foreach($matches[1] as $k => $v){
	$matches[1][$k] = '%u' . strtoupper(bin2hex(mb_convert_encoding($v, 'UCS-2', 'UTF-8')));
}
$encode = implode("", $matches[1]);
?>

でできる。

と、ここまではいいのだが、JavaScriptでエスケープ処理された文字列をやり取りして面白いことができないか考えても、特に何も思いつかないので困った。

Popularity: 2% [?]

0
Posted on 26th 10月 2007 by y

Yahoo! Japanのトップページにアクセスすると、デバッグモードにしてLog JavaScript ExceptionsをオンしたSafariではコンソールに

http://www.yahoo.co.jp/:TypeError – Value undefined (result of expression hm.isHomePage) is not object.

というエラーが出てくる。なんだろう。たぶんここに書かれているのと同じだから、Operaでも再現するらしい。というわけでFirefoxで開いてみたのだが、

Yahoo

これじゃねえの?

Popularity: 3% [?]

0
Posted on 22nd 10月 2007 by y

exit関数(dieはこのエイリアス)の引数に文字列を渡すと、メッセージとして文字列を出力してスクリプトが終了するのだが。

PHP4.2以降ではintegerを渡すと終了時のステータスコードになる。0は正常終了なので、適時利用すればいい。利用できるのは254までの整数で、255は予約されている。

255を越える値を渡すと無視される。

で、何が言いたいのかというと、

public static function response($str){
    header('Expires: ' . gmdate('D, j M Y H:i:s', 1));
    print("\xef\xbb\xbf");
    die($str);
}

うっかりこんなコードを書くと、$strに整数しか入っていない場合は何も出力されない。Ajaxでサーバ側からのレスポンスを記述するときによくやってしまいがち。

public static function response($str){
    header('Expires: ' . gmdate('D, j M Y H:i:s', 1));
    print("\xef\xbb\xbf");
    print($str);
    exit;
}

これが正しい。って、自分がやってしまったわけですが。

Popularity: 2% [?]

0
Posted on 1st 9月 2007 by y

コンテンツをブロックに分けて、それぞれをWidgetと称して自由に位置を変更したり非表示にしたりするJavaScriptライブラリ、Prototype Portal Classyoumosで紹介されている

PCサイト向けCMSのページ編集機能なんかに使えるな、と思ったら、これってJetspeedの画面みたいだな。

Popularity: 2% [?]

0
Posted on 15th 8月 2007 by y

TinyMCEでページ内のアンカーにリンクを挿入しようとすると、#で始まるURLは勝手に親ページのURLを拾ってきて補完して絶対パスに変換してしまう。

http://hoge.com/hoge.cgiにて動作させる

リンクアイコンをクリック
ポップアップ画面のリンクのところに「#test」と入力
リンクを挿入してポップアップ画面を閉じる
HTMLを確認 ← 「http://hoge.com/hoge.cgi#test」に補完されている

という感じ。該当箇所はlink.js。

// Make anchors absolute
      if (href.charAt(0) == '#')
              href = tinyMCE.settings['document_base_url'] + href;

これ、仕様なんだけど、いろいろ困るんだよな。

Popularity: 3% [?]

0
Posted on 1st 8月 2007 by y

「href=”#” onclick”…”」はそろそろやめよう

周囲には「萌え野郎に説教されたかねえや」という声もあったが、総論では賛成。ただし、アンダーライン入れるとか文字色を変えるとかもしないといけない。社内ではfake_linkクラスをCSSに追加している。

Popularity: 2% [?]