2010年7月31日土曜日

難しい日本語

このエントリーをはてなブックマークに追加
日本語という言語は実にシンプルな言語であるが、同時にとても複雑で煩雑なルールで溢れている。
そのため、外国人からすると日本語は非常に「難しい」言葉になっている。

例えば、カタカナ。
外来語をカタカナ表記するという謎ルールを僕らは自然に受け止めているが、外国人からすると意味不明な言葉らしい。
音が違う、文字が違う、さらには意味まで違うなんてのはザラだろう。
なので、彼らは非常に混乱する。

例えば、助数詞。
この複雑さは日本人ですら理解出来ないほどであろう。
例えば、田んぼの数え方を知っている人は少ない。
田んぼは1枚とか1面と数える。
例えば、羊羹。
1棹、1本、1切れなどと複数の呼び方がある。
なんて複雑なのだろう。

そういう事を気にしだすと、(一応)日本人である僕が、まともな日本語を話そうと思っても話せなくなる時がある。
あれ、自分のこの言葉、正しい日本語なのかな、正式名称で言ってるかな。
そもそも、この数え方合ってるのかな。
そんな事が一瞬でも脳裏をよぎるともう駄目だ。
しどろもどろになって次に何を語るべきかを忘れてしまう。

日本語ってとても難しい(むつかしい)。

2010年7月30日金曜日

プログラマ35歳限界説について

このエントリーをはてなブックマークに追加

なぜ、35歳が限界なのか


プログラマ35歳定年説の方が正しいかもしれませんが、敢えて限界説としてみます。
深い意味はありません。

さて、幾つかのエントリに書かれていますように、35歳で限界を迎える、又は定年とされている職業、それがプログラマです。
曰く、体力が付いていかない。曰く、新しい知識を吸収できない。
故に、35歳が限界である。

これ、プログラマに限った話ではないですよね。

「職人」の世界は、一部の人を除いて、35歳くらいが限界だと思うんです。
体力、知力、経験、そして意欲。
これらがバランス良く保たれているのが35歳ぐらいで、後は体力がゆっくりと落ていく。
平均寿命から適当に類推するに、この辺が人生の折り返し地点であり、ピークになると僕は思います。
(人間の年齢と能力が正規分布に準ずるとして)


僕が見てきた現実


2010年7月28日水曜日

JSONPでの最速ローディング模索

このエントリーをはてなブックマークに追加
ひとつ前のエントリが嘘ばっかりだったので、再度書き直しです。
今回、JSONPでの最速ローディングを模索して、こんなコードを書いていました。

function retが条件分岐している所。
あくまでも、JSONPのcallbackが走ってからという考え方なので、真の最速には程遠いと思います。


  • operaはscriptのcallbackが走る段階では、まだDOM構築が終わっていない。

  • Firefox,Google Chrome,SafariはDOM構築が終わっている

  • IEはsetTimeoutの10msでほぼ確実に実行出来る(1msだと失敗するケースがある)



今まではDOMContentLoadedっぽいのを確認してから走らせていたけれども、それより先にJSONPリクエストを投げる形にしたかった。
IEの所、もしかしたらdoScroll判定した方が良いかもしれない。
色々悩ましい……。

==チラシの裏==
jsdoitに書いた最速のローディングからの発展です。
今までの自分の認識
・windowのloadイベントに割り当てときゃとりあえずおk
現在の自分の認識
・windowのloadイベントって全部読込み終わるまで待つのかよアホか。
・DOMContentLoadedで最速だべさ
・ん、でも考えてみたら、scriptタグ内での関数が最速だよね
・headのscriptタグ内で動的生成したらもうちょい早く読み込めるんじゃないの?
・callbackの時点でDOM出来てるよねー?
・Operaたんorz そして、IEめ……。
・ひとまず、Firefox、Safari、Chromeはこれが一番速い予感!!←チェックしろよ
・OperaたんはやっぱりDOMContentLoadedに頼るしかない
・IEはまあ、setTimeoutでも十分じゃろ
・正直アイディア切れ
・また今度考えよう
==チラシの裏終わり==

JSONPを適当に実行するためにはてなスターのJSONP使っています。
テストする時は適当なURLに変えてください。お願いますm(_ _)m。


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>JSONP Test</title>
<script type="text/javascript">
(function(_d){
var start = [];
var init = function(uniq){
var t = (new Date).getTime();
start.push(t);
var script = _d.createElement('script');
script.src = 'http://s.hatena.ne.jp/blog.json/http://looxu.blogspot.com/?callback=callback'+uniq + '&dummy='+t;
script.type = 'text/javascript';
script.charset = 'UTF-8';
var head = _d.getElementsByTagName('head')[0];
head.appendChild(script);
window["callback"+uniq] = function(obj){ ret(obj,uniq) };
}

function ret(obj,num){

if(0/*@cc_on +1@*/ ){ //IE
setTimeout( function(){ resout(obj.title,num) }, 10 );
}else if( window.opera){ //Opera
document.addEventListener('DOMContentLoaded', function(){ resout(obj.title,num) },false );
}else{ //Firefox,Webkit
resout(obj.title,num);
}
}

function resout(text,i){
var end = (new Date).getTime();
_d.getElementById('time_result').innerHTML += (end - start[i]) + 'ms<br>';

var res = _d.getElementById('result');
res.innerHTML += text;
}

for( var i=0; i<3; i++ ){
init(i);
}

})(document);
</script>
</head>
<body>
<div id="result">Loading...</div>
<div id="time_result"></div>
<br>
<iframe src="http://www.yahoo.co.jp/" frameborder="1"></iframe>
</body>
</html>

2010年7月27日火曜日

JavaScriptの最速実行を行うとき、Opera限定で起きる謎現象。

このエントリーをはてなブックマークに追加
15:28追記
このコード全部のブラウザで駄目だw
自宅に帰ったら、再度エントリしなおします。



知ってる方が居られたら教えて欲しい。
下記のコードをOpera10.6で実行すると、「done!」が表示されない。

・動かないケース(scriptが取得したいElementより前に書いてるケース)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Load test</title>
<script type="text/javascript">
(function(_d){
var res = _d.getElementById('result');
res.innerHTML = "done!";
})(document);
</script>
</head>
<body>
<div id="result">test</div>
</body>
</html>


ちなみに、こっちだと動く(当たり前だけど)
・動かないケース(scriptが取得したいElementより後ろに書いてるケース)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Load test</title>
</head>
<body>
<div id="result">test</div>
<script type="text/javascript">
(function(_d){
var res = _d.getElementById('result');
res.innerHTML = "done!";
})(document);
</script>
</body>
</html>


ま、素直にdocumentのDOMContentLoadedにaddEventListenerすれば問題解決
エラーコードから考察するに、Operaのscript実行は生HTMLのDOM構築前に実行されてる可能性が高そうな事が分かった。
というよりかは上から順番に読んで、DOMを逐次構築しつつscriptも実行みたいな感じかな。


そこで、仮説を立ててみた。
・documentの中身がscriptタグの位置により変わっているのかもしれない。
そのテスト用コードは下記の通り。


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Load test</title>
<script type="text/javascript">
(function(_d){
window.missing_document = _d;
_d.write(_d.getElementById);
_d.write('<br>');
var res = _d.getElementById('result');
_d.write(res);
})(document);
</script>
</head>
<body>
<div id="result">test</div>
<script type="text/javascript">
(function(_d){
var next_missing_document = _d;
var res = _d.getElementById('result');
_d.write(res);
if( window.missing_document !== next_missing_document ){
document.getElementById('result').innerHTML = "diff";
}else{
document.getElementById('result').innerHTML = "same";
}
})(document);
</script>
</body>
</html>


残念ながらsameと出力される。
オブジェクト的にはどうやら同じもの扱いみたいだ。
(もしかしたら、比較の仕方が間違っているかもしれないけれど)。

どちらにしろ、このような書き方は滅多にしないし、そもそもOperaの場合、DOMContentLoadedで十分じゃまいか。
結論としましては、OperaではDOMContentLoaded使えという事で。
(その他のブラウザだと、こういう事しなくても良い。あのIEたんですら実行出来るのだっ!)

2010年7月15日木曜日

simple_html_domでFatal error: Allowed memory sizeが出まくった。

このエントリーをはてなブックマークに追加
simple_html_dom.phpを使ってクローリングしたデータを加工してたんだけど、なぜだかメモリ不足になりまくったので調べたら、file_get_htmlで得たデータは解放しない仕様らしい。
んで、FAQに書いてあるように、


$html = file_get_html(...);
// do something...
$html->clear();
unset($html);


と書けば良い事を知った。
結論:ドキュメントはちゃんと読みましょう