なんかyahoo.co.jp内へのリンクだろうが外部ドメインへのリンクだろうが全部リダイレクト経由なのがものすごい不愉快。どこへ飛ぶのか分かりにくい。
あと不愉快以前にこれはセキュリティ的に問題があると思うんだけど。ウィルス作者が ttp://example.com/virus.exe をブックマークしたらどうするつもり?
Yahoo!の人たちはみんトピのときも同じようなことをしてたけど。
俺のリンクを見てくれ。こいつをどう思う?
Yahoo!ツールバーダウンロード!
すごく・・・危ないです・・・
とかやると一見yahoo.co.jpドメインなリンクのダウンロードダイアログを作れると思うんですが(このファイルはWindowsについてたcalc.exeですがダウンロード&実行とかはしないでください)。
教訓は何かというと、ユーザが飛び先を任意に指定できるリダイレクタを作るとウィルス配布やフィッシング詐欺に使われる恐れがあるということである。
配布元を完全に詐称できるわけではないけど、実行しちゃう人は増えるだろう。
ド低脳な人/企業が何作ろうが知らんけど、心あるプログラマはそういうものを造らないようにしましょう。
amachang - JavaScript 入門を最初に見たときは見落としてたんだけど、javascript - 勝手に添削 - JavaScript入門でwith()は徹底的に避けるべし
と言われている部分の奇妙なコードが気になって調べて見た。
var nl = document.getElementById('target02').getElementsByTagName('div');
for (var i = 0, l = nl.length; i < l; i ++) {
var e = nl[i];
with({e:e})
setTimeout(function() {
var box = new Box(e);
box.start();
}, i * 500);
}
amachang - JavaScript 入門
なんじゃこの with文? と思ったので色々試したり調べたりしてみた。
正しい挙動
withなし版
var nl = document.getElementById('target02').getElementsByTagName('div');
for (var i = 0, l = nl.length; i < l; i ++) {
var e = nl[i];
setTimeout(function() {
var box = new Box(e);
box.start();
}, i * 500);
}
えっ?と一瞬思った。
正しい挙動では、3つの■が順番に動くのに、withなし版では最後の■しか動かない。
でもよくよく考えれば当たり前だ。
感覚の目でよ~く見てみろ!
withなし版がsetTimeoutに渡したクロージャが使うeは、全部同じ実行コンテキスト上のeを参照している。しがたってsetTimeoutがクロージャを呼び出すときにはループは終わってeはnl[nl.length-1]を参照してしまっていて、みんなして最後の■を動かしてしまう。つまりキングクリムゾンによって過程はすっ飛ばされ、結果だけが残る
withを使うと、ループ毎に作られる無名オブジェクト{e:e}がスコープチェーンの先頭に追加されるので、withブロックの中では単にeと書くとブロックローカルなe(=nl[i])を参照できるというわけ。つまりwithを使ってCライクなブロックスコープを実現している。これは知らなかった。
参考:JavaScript でブロックスコープを実現する: Days on the Moon
標準偏差っていうのが何なのか、最近知りました。
こういう数式で表されます。
ていうか、僕こういう数式にすごく抵抗あるんですよねぇ。
プログラムの方が理解しやすいかも。
これを見て、そういえばBuzzurlのタグクラウドを作るのに、標準偏差を基に重み付けをしたなあと思ってソースを見たら汚かったので書き直してみた。
普通に書くとこう。
#分散を求める。標準偏差が欲しい場合は戻り値をsqrt()
#average関数は自明なので省略
sub variance {
my $num = scalar(@_) or return 0;
my $ave = average(@_);
my $ret = 0;
while(@_){
my $i = shift;
$ret += ($i-$ave)**2;
}
return $ret/$num;
}
まあこれでいいんだけど長ったらしい。多少遅くなっていいとすれば、さらに短く書くほうがperlらしいかも?
#map/reduceを使うバージョン。
#ループが2回走る分、巨大な配列に対しては遅い。
use List::Util qw(reduce);
sub variance_mr {
my $num = scalar(@_) or return 0;
my $ave = average(@_);
my $ret = reduce { $a + $b } map {($_ - $ave)**2} @_;
return $ret/$num;
}
もっと遅くなってもいいなら、さらに短くこんなんでもいいかも。
#あらかじめmap内で濃度で割ってしまう版。
#割り算タイミングの問題で値が変わる場合がある。
sub variance_mr2 {
my $num = scalar(@_) or return 0;
my $ave = average(@_);
return reduce { $a + $b } map {($_ - $ave)**2/$num} @_;
}
後者2つの書き方だと、元の数式とほとんど等価に見える気がする *1
。あと、後者2つは遅いけど、MapReduceフレームワークみたいなものが使える人ならそれにのせやすいのでクソ分散実行できるかも?
まあ何が言いたいかというと、tex記法を使ってみたかっただけなんですが。
午前のチュートリアルはCreating Addictive User Experiencesというのを予約していたのですが、なんとキャンセルになっていました。
こんな事情があるようです。聞けなくて大変残念です。
かわりにHow to Innovate on Timeというのを聞きました。
プレゼンはうまかったけど割と月並みな内容かなぁと思いました。
イノベーションのための思考法のとかは印象的だったけど。
- チャレンジングな形容詞をつけてみる(Challenge words[perfect leading popular])
- 例:完璧な携帯電話ってどんなものか?
- 制限をつけてみる(Constraints[cost time size speed])
- 例:10ドルの完璧な携帯電話ってどんなものか?
- 逆を考えてみる(inversion[worst slowest smelliest ugliest])
- 例:最低な携帯電話ってどんなものか?
午前のチュートリアルはapplying game mechanics to social softwareを選択。
- 収集(collecting)
- 得点(points)
- 結果のフィードバック(feedback)
- 交換(exchanges)
- カスタマイズ(customization)
のようなゲーム的要素をソーシャルなサービスに適用してよりユーザに楽しんでもらうという内容。
これは、Buzzurlにユーザランキングをつけたら好評だったとか、グリーンキャンペーン*1という収集要素に近いキャンペーンが好評あだったりとかの経験上非常に納得できる話でした。


に相当する。
に相当する。