一部記法が JSer っぽくなく、Rubyist っぽいですが気にしないでください。HTML 5 関連の話は全然追いつけてないのでちょっと慌てました。
まとめ
beta 3 まで待つ
pjax
pjax とは History#pushState と Ajax の合わせ技のこと
と思っていいのかな。
Ajax を利用しているので伝統的な意味でのページ遷移をせず、なおかつ任意の URI や効果を作ることができるもの。
HTML 5 の History API がなぜ出てきたのかは恐らく
- 素朴な Ajax は戻るボタンが死亡するのでどうにかして history を残す必要がある
- location は hash 以外を書き換えるとページ遷移が発生してしまう
- location.hash の書き換えが history に残るかどうかは実装依存
だから。たぶん。
jQueryMobileとpjax
beta 2
beta2 の段階では # を使った通常の Ajax でリンクを処理することでページ遷移時のアニメーションを実現している。つまり、
pjax は利用していない。
しかしこの方法は
referrer が必ず最初にアクセスしたページになる
という致命的な問題がある。「聞いてないよー」って感じ。最初から Ajax アプリケーションを作っているならそういう風に考えればいいだけなんだけど、jQuery Mobile を使う理由は
Ajax アプリを作りたいからじゃなくて、既存のマークアップへのルールを受け入れる代わりにスマートフォン対応サイトを手軽に用意できるから
だと思うので、この仕様はちょっと受け入れられない。この挙動は「通常の Web」とは明らかに異なる世界だから。
beta 3
2011-08-29 現在で beta 3 はまだリリースされていないけど、
beta 2 の release note にすでに beta 3 で pushState 対応するよ!と言われているので beta 3 では上のような状況とは変わってきます。
ただし対応状況は iOS 5+, Android 2.2+ になるのかな?
で、beta 2 現在どうしたか
$.mobile.ajaxEnabled = false
にしてみた。つまり
アニメーションを捨てて普通の URI を採った。
beta 2 の段階でも自前で URI の書き換えをし続けて通常の遷移のように見せることはまぁできるんだけど、beta 3 で状況が変わるのが目に見えているのでわざわざ凝ったギミックを beta 2 用に作り込むのはちょっとあり得ない判断ですよね。
beta 3 出てから考えます。
iOS 4 対応とか
github で確認したんだけど、iOS 4 では例のアニメーションしないんですね。Android 2.2 では動作するのでそういう判別をしているようです。で、なんでだろうと思ったらこんなものを見つけました。
#3: We could use History.js for cross-browser compatibility - Issues - defunkt/jquery-pjax - GitHub
要するに iOS 4 の WebKit はバグってるから知らん、て感じなのかな。History.js 噛ませばもしかしたら動くかも。試した人いるかな? 自分はまだやってみないけど。
jquery-pjax と URI
ここから先は脱線。
jQuery で pjax を手軽に実現するための plugin があるんだけど、これは
サーバ側は request header の内容を見て返すコンテンツを変える
というアプローチになっている。この方が jQuery 側の処理は軽いし、Rails 的には layout の調整とかだけで十分対応可能
pjaxが便利過ぎて鼻血出そうになった(railsのサンプル付き) - SELECT * FROM life;
で確かに便利そうなんだけど、
Twitter / @komasshu: でもjquery-pjaxがやってるアプローチ(X- …
とかあって、この辺は実は自分もモヤモヤしてたりする。
一つのURIに異なる表現を割り当てるのはどうなんだろう?
URI 的にも異なる表現1だということが分かった方がよくないかな。
関連しそうなもの
リソース自体は同一と看做してもいいかなと思うので「表現」にしておく ↩
2年前のEmacs の M-x grep をマルチエンコーディングにで文字コードの混ざった環境でも日本語で検索できるようになって便利って話をしたんだけど、実はこれ、手元の環境では emacs -nw でしかちゃんと動いてなかった。
普段 Emacs を Emacs らしく使う際のほとんどの時間は -nw で使っているんだけど、ViewSourceWith や It's All Text を使って Firefox や Thunderbird から、あるいは日本語の文字幅の問題から直接 CarbonEmacs を window で使うこともある。数ヶ月前に初めて気づいたんだけど、以前の設定で lgrep を呼び出すと日本語検索で余計なものが引っかかったり、必要なものが引っかからなかったりしてまったく使いものになっていなかった。
twitter で何度もつぶやいてたりあれこれ検索していたんだけど、該当する現象で困っている人はいないらしく、役に立ちそうな情報はなかなか見つからなかった。当初は emacs の設定の方を見ていたんだけど、もしかすると lgrep かなぁと思って設定をいじっていたら以下の方法で正しく検索できるようになった。
lgrep -Au8 -Ia
どうも lgrep -K で渡すはずの keyboard coding system が期待通りでなかったらしい。
OPTIONS -ASet all coding systems to coding-system. -I Set input coding system to coding-system. -K Set keyboard coding system to coding-system. If it is not set, output coding system will be applied to it.</pre></blockquote> を見ると -Ou8 が書いてあればデフォルトでは -K にも u8 が渡るような感じがするけど、CarbonEmacs から lgrep を呼び出すときに u8 じゃない値が渡ってしまっているようだ。 ということで今、手元の設定は以下のようになっている。 (setq grep-command "find . -type f -a ! -regex '.*\\.svn.*' -a ! -regex '.*\\.git.*' -a ! -regex '.*\\.hg.*' -a -print0 | xargs -0 lgrep -nk -Au8 -Ia ") うむ。やっとまともな状態になった。 こういう問題は CarbonEmacs だけじゃなくて Meadow なんかでも起きそうなのでちゃんと日記に書き起こしておくことにした。
以前勉強してから情勢(って)が変わってきたものや抜けていた部分のメモ。
- Perl のオブジェクトは bless したリファレンス
- 以前はハッシュリファレンスを bless するのが主流だった(と、自分は認識している)が、最近はスカラリファレンスを利用した Inside-Out Object もオシャレなのかも。
- Class::Std を使うと便利
- bless で結びつけられた package 名を取得するには以下の方法がある
- ref
- Scalar::Util の blessed
- オブジェクトには実は便利メソッドがある
- UNIVERSAL 嫁
- isa() と can() がありゃ十分ちゃ十分か。なるほど。
ref は JavaScript の typeof のように使え、bless してないリファレンスに対して使うと以下の組み込みの型を返す。
- SCALAR
- ARRAY
- HASH
- CODE
- REF
- GLOB
- LVALUE
package 以外のものが返って来てしまうという意味ではちょっと危険ではあるけど、それはそれとして ref は知っとくと便利だなと思った。Perl は奥が深いよ、ほんと。
PHP の is_a() と method_exists()、Ruby の Object#is_a? と Module#method_defined? に相当するのは、Scalar::Util を使って
defined( blessed( $ref ) ) && $ref->isa( package_name )
defined( blessed( $ref ) ) && $ref->can( method_name )
になるのかな?
今後 Class::Std を使うかどうかは分からない1けど、自分の目的はレンタルスペースで CGI を動かすことではないし今後もそういうことはないと思うので、便利に使えるシーンがくるかもしれない。押さえておこう。
[2007-09-06 追記]メソッド一覧はやっぱ欲しいなぁと思ったけど UNIVERSAL にはそんな機能はない。Class::Inspector を使うのが楽らしい。Fink にも deb にもパッケージがあるので、まぁそれほど使うのに抵抗はないかな?
というか新規に Perl スクリプトは書きたくないし、Class::InsideOut なんてのもあるらしい。 ↩
今度は
- spamlinkcheck.rb on
- デバッグモード off
で。
referer が記録されつつ TrackBack spam が来ないかどうかを静観。
[追記] だいじょぶっぽい。デバッグモードが原因か?
http://svn.collab.net/repos/svn/branches/1.4.x/CHANGES
によると 1.4.0 では working copy のレイアウトが変わってしまうそうな。TortoiseSVN はまだ本家で全然扱いの大きくない 1.4.0-RC の方が先に出てくるので、それ喜んで使っちゃうと 1.3.x など他のクライアントで同じ working copy を覗いたときに困る。
ま、それだけ機能すればいい場合は別に気にする必要ないんだけど。普通は一人に一つ working copy があるし、同じ working copy を複数のアプリで扱う必要もないしね。
てのは実は知ってたんだけど忘れてたネタ。公開サーバで tdiarygrep はあまりに質素だしなぁ。rast や hyper estraier が使える環境でもないし、検索できないなんてちょっと話にならないし、だからと言って全部 Google っつーのもどうだろうと思うわけですな。
さーてな。
配列操作の比較表: Ruby, Python, JavaScript, Perl, C++ (いやなブログ)
配列操作の比較表は自分のためにも作ったことはなかったので、別に混乱はしないけど、Ruby の分を残して PHP との比較表を起こしてみた。気づいてないだけでもっと賢く書く方法がありそうな気もするけど、とりあえず出しちゃえ。あ、バージョン書いてなかった。PHP4 です。5 は知らない。(マニュアルも見てない。)
Ruby | PHP |
a = [1, 2, 3] | $a = array(1, 2, 3) |
a.length | sizeof( $a ) or count( $a ) |
a.empty? | empty( $a ) |
a.push(x) | array_push( $a, $x ) or $a[] = $x |
a.unshift(x) | array_unshift($a, $x ) |
a.pop() | array_pop( $a ) |
a.shift() | array_shift( $a ) |
a.concat( b ) | $a = array_merge( $a, $b ) |
a.clear | $a = array() |
a.include?(x) | in_array( $x, $a ) |
a.insert(i, x) | array_splice( $a, $i, 0, $x ) |
a.delete(x) | |
a.delete_at(i) | unset($a[$i])1 |
a.nitems{} | $b = array_count_values( $a ); $b[$x]2 |
a.index(x) | array_search( $a, $x ) |
a.first | $a[0] |
a.last | end( $a )3 |
a[i..j] or a.slice(i..j) | array_slice( $a, offset[, length] )4 |
a[i…j] or a.slice(i…j) | |
a.sort | |
a.sort! | sort( $a ) |
a.reverse | array_reverse( $a ) |
a.reverse! | $a = array_reverse( $a ) |
a.uniq! | $a = array_unique( $a ) |
a.join(d) | join( d, $a ) or implode( d, $a ) |
a.each | foreach( $a as $key => $val ) |
insert は 配列のinsert の情報をいただきました。
delete はなんか関数書かないと無理っぽい。
[2005-08-30 追記]array_push() と [] についてツッコミをいただいたので調べてみた。
<?php
define( 'ACCURACY', 5 );
define( 'TIMES', 5 );
define( 'WAIT', 10000 );
function main() {
print "[]<br>\n";
for ( $i = 1; $i <= TIMES; $i++ ) {
$arr = array();
$start = get_microtime();
for ( $j = 1; $j <= WAIT; $j++ ) {
$arr[] = $j;
}
$end = get_microtime();
putime( bcsub($end, $start, ACCURACY) );
}
print "array_push()<br>\n";
for ( $i = 1; $i <= TIMES; $i++ ) {
$arr = array();
$start = get_microtime();
for ( $j = 1; $j <= WAIT; $j++ ) {
array_push( $arr, $j );
}
$end = get_microtime();
putime( bcsub($end, $start, ACCURACY) );
}
}
function get_microtime() {
list( $msec, $sec ) = split( " ", microtime() );
return bcadd( $sec, $msec, ACCURACY );
}
function putime( $sec ) {
$accuracy = (int)ACCURACY - 1;
$str = "%.".$accuracy."f sec<br>\n";
printf( $str, $sec );
}
main();
?>
結果はこんな感じ。マシンスペックは Pen!!! 800 MHz + 256MB。
[]
0.0421 sec
0.0415 sec
0.0419 sec
0.0415 sec
0.0416 sec
array_push()
0.0559 sec
0.0563 sec
0.0561 sec
0.0560 sec
0.0557 sec
[] の方が速いですしタイプ量も少ないけど、個人的には PHP 以外にも触っていると「なんか気持ち悪い」感じ。あとパフォーマンス重要という方は
イテレーションのベンチマーク (Harukiからの平面波)
なども参考にされるとよいかと。
[2005-11-10 追記]
本当に今さらんだけど、マニュアルを読んだら PHP の配列は実際には順番づけられたマップで、配列にもハッシュにもキューにも応用が可能って書いてあった。
そうか、PHP の配列、ハッシュ周りの動きがどうにも納得いかなかったのは、そもそもがいわゆるちゃんとした配列やハッシュとして設計されたもんじゃないからか。ループが遅かったのもハッシュのくせになぜか順番が維持できちゃったりするのも、そういうわけか
この番組の扱うテーマは悪くないと思うんだけど、取り上げ方や編集や、コメンテーターのコメントがどうも納得いかないことが多い。ま、それはともかく今回気になったのは以下のシーン。
「男は仕事、女は家庭」に社内で11%賛成しているという事実に驚いているジョンソンエンドジョンソンの社員。
なんで? そんなに価値観が均一にならなきゃだめ? 今の時代に上に挙げた価値観を持つことはそんなに悪いこと? 違うでしょ。いちばんダメなのは多様性を認めないことですよ。他人を認められないことですよ。