August 2006

August 30, 2006

このエントリーをはてなブックマークに追加
小便器この写真は、弊社の男子便所の写真です。
なんで大人なのに「男子」って言いかたなんだろう…。

そんなことはどうでもいいや。
とあるサイトの日記に書いたネタですが、意外に反響があったので、Blog にでも書いてみるかってことで書いてみる。

ある日、小便をしようとトイレに入ったら、誰もいない。
あなたの目の前には 4 つの小便器。
選択肢は 4 つ。
君ならどこに立つ?

1. 障害者用の手すりが付いている一番左
2. 左から二番目
3. 右から二番目
4. 一番右





詳細は以下の通り。続きを読む


nipotan at 12:36 | Comments(7) | TrackBack(0) | その他 
このエントリーをはてなブックマークに追加

August 25, 2006

このエントリーをはてなブックマークに追加
株式会社はてなにお勤めの id:secondlife さん (舘野・ぼうんどあれい・祐一) が作った livedoor クリップで、はてブのブックマークユーザ数を表示する greasemonkey は、mashup に見せかけた株式会社ライブドアに対する嫌がらせだということがこの程判明しました。


川o・-・)<ぼうんどあれい


母数が違いすぎてワロタ






舘野・ぼうんd(ry・祐一の連載が読めるのは WEB+DB PRESS だけ!

WEB+DB PRESS Vol.34
WEB+DB PRESS編集部
技術評論社 (2006/08/24)


nipotan at 16:11 | Comments(0) | 雑記 
このエントリーをはてなブックマークに追加

August 15, 2006

このエントリーをはてなブックマークに追加
前に書いた「配列から効率良くプレースホルダを作る」の続編です。。
TMTOWTDI な Perl だけあって、色々面白い解がありますね。
Powered By iwai.ug - [Perl] プレースホルダの作成って、こうすれば速いのか!
ちなみに自分は、今までこんな感じでした↓
sub placeholder_from_array {
    return join(',', ('?') x @_);
}
確かに、配列を作るのに map() を使うより、このほうが倍近く高速になりますね。
あと、もう一つ、
はてなブックマーク - 他人の切抜 / 2006年08月11日
よりobfuscatedな解: 「return @_?"?".",?"x$#_:"";」。
id:another さんの解をほんの少しだけ見やすくすると
sub placeholder_from_array {
    return @_ ? '?' . ',?' x $#_ : '';
}
こんな感じ。
確かに obfuscate ですが、要するに "?," を繋げて末尾を切り落とすのではなくて、"?" の後ろに ",?" を引数の要素数 - 1 個ぶん連続して結合するという方法ですね。
で、ちなみにこの方法の場合の処理速度は、だいたい末尾を置換するのより少し速いぐらいでした。
もしかして三項演算子というか、条件分岐が入っているぶん遅いのかもと思ったので、仮に「必ず引数が渡ってくる」という前提とした
sub placeholder_from_array {
    return '?' . ',?' x $#_;
}
を試してみたのですが、これでも substr() を使ったものより若干遅いという結果になりました。

ところで、前回は
my @a = qw(foo bar baz);
を対象にしてベンチマークを取って、
だから、「一回の処理で数万回この処理を通る」とかじゃないなら、可読性や保守性の高い前者を取りますけどねw
と書きましたが「要素数が少ないから」という前提があることを忘れていました。
よくよく考えれば、要素数が増えれば増える程この効率に差が出ます (※) ので、たった一回の処理でも差が出る可能性もあります。
むしろ滅多に書き換えないという前提であれば、「より高速なものを採用したほうが良い」のかも知れません。

以下に、仮に要素数が 1,000 個あった場合のベンチマーク結果 (1 秒間の処理回数) を掲載しておきますので、「可読性や保守性」を選ぶのか、「処理速度」を選ぶのか…。
自分で振ったネタながら、ちょっと真剣に考えたほうが良い気がしてきました。。。

続きを読む

nipotan at 23:39 | Comments(2) | TrackBack(0) | 技術 
このエントリーをはてなブックマークに追加

August 10, 2006

このエントリーをはてなブックマークに追加
my @a = qw(foo bar baz);
こんな配列から
?,?,?
という文字列を使いたい場合があります。
例えば、
SELECT * FROM hoge WHERE user_id IN (?,?,?);
みたいな SQL にする場合のプレースホルダを作ると言った具合に。

社内 IRC で、clouder さんが言い出して、
18:27 <clouder>join(',', map('?', @a))
18:27 <clouder> こんなのしか思いつかない。。
と言う。
まぁ、それが妥当というか、普通それが思い浮かぶよなーって思ってたら、会社の dos さんという人が
19:15 <dos> '?,' x @a; で s/,$//; というソリューション
とか、異様なことを言い出した。
sub placeholder_from_array {
    return join(',', map('?', @_));
}
こんなのと
sub placeholder_from_array {
    (my $str = ('?,' x @_)) =~ s/,$//;
    return $str;
}
こんなのでベンチマークを取ってみると、後者のほうが倍以上速い。
やべ。ずっと前者でやってたけど全部後者に書き換えたくなってきた。

こういう些細なことでも「いかにも perl らしい」方法で、より高速に動くというのは素敵です。
ただ、まぁ、ぶっちゃけ

「前者は 2.42 μ秒かかったけど後者は 0.95 μ秒で済んだ」

だから、「一回の処理で数万回この処理を通る」とかじゃないなら、可読性や保守性の高い前者を取りますけどねw

追記:
sub placeholder_from_array {
    chop(my $str = ('?,' x @_));
    return $str;
}
置換するより chop() したほうが更に速いかも。

更に追記:
sub placeholder_from_array {
    return substr('?,' x @_, 0, -1);
}
いやー、これのが速い。
最初のやつより 5 倍ぐらい速い。。。

nipotan at 19:57 | Comments(0) | TrackBack(2) | 技術 
このエントリーをはてなブックマークに追加