こもろぐ @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

広告:本ブログで紹介している書籍等商品の紹介でAmazonアソシエイトを利用していることがあります。

jQuery.proxy()の存在意義

ポインタのみのエントリです。
4.2 コールバックパターンを4.2.2 コールバックとスコープまで読むと
jQuery.proxy() の存在意義がわかると思います。

JavaScriptパターン ―優れたアプリケーションのための作法

JavaScriptパターン ―優れたアプリケーションのための作法

JavaScript パターン 4.10 カリー化

4.10.1 関数の適用

「関数の呼び出し」を「関数の適用」という正確な説明に訂正している

関数を呼び出すサンプル …(1)

sayHi('world');

関数を適用するサンプル ...(2)

sayHi.apply(null, ["world"]);

2つのコードでやっていることは同じで、「関数の呼び出し」は「関数の適用」のシンタックスシュガーに過ぎない、
と説明する。
また、sayHi関数が、alienオブジェクトのメソッドだった場合、それぞれ

alien.sayHi('world');
alien.sayHi.apply(alien, ['world']);

となる。メソッドの適用時は、関数内部でthisに束縛されるオブジェクトを指定しなければならない。

関数の種類 (JavaScriptパターン 4.1.1 用語の整理)

名前付き関数式 (named function expression)

var add = function add(a, b) {
    return a + b;
};
console.log(add.name); // => "add"

名前が付いていると、Firebugデバッグ時に便利らしい

関数式 (無名関数) (function expression, a.k.a anonymous function)

var add = function (a, b) {
    return a + b;
};
console.log(add.name); // => "" (Firefox, WebKit), => undefined (IE)

関数宣言 (function declarations)

function add(a, b) {
    return a + b;
}
console.log(add.name); // => "add"

JavaScriptパターン ―優れたアプリケーションのための作法

JavaScriptパターン ―優れたアプリケーションのための作法

楽天の入社問題

何さんが実際に作問したなかで、自分でも気に入っている問題はこうだ。「ここに100段の階段があります。一歩で1段か2段か3段進むとして、100段登り切るパターンは何通りありますか。この問題を解くプログラムをできるだけ短い行数で書きなさい」――。さて皆さんはこの問題を解けるだろうか。

解いてみた(自分で解きたい人のために空白をあけてます)





















#!/usr/bin/env python
class F:
    def f(self, num):
        if num < 1:
            return 0
        res = self.f(num - 3) + self.f(num - 2) + self.f(num - 1)
        if num < 4:
            res += 1
        return res

if __name__ == '__main__':
    f = F()
    print f.f(100)

ただし、これを普通のPCで計算するといつまでも結果が帰ってこないので、f.f(n) の値をキャッシュする

#!/usr/bin/env python
class F:
    def __init__(self):
        self.cache = {}
    def f(self, num):
        if self.cache.has_key(num):
            return self.cache[num]
        if num < 1:
            return 0
        res = self.f(num - 3) + self.f(num - 2) + self.f(num - 1)
        if num < 4:
            res += 1
        self.cache[num] = res
        return res

if __name__ == '__main__':
    f = F()
    print f.f(100)

答え:180396380815100901214157639 通り

解説

…を試みる
n段の時の組み合わせを求める関数F(n)を考える(nは自然数)
100段上るときの最期の1歩のパターンは1段、2段、3段があるので、
F(100) = F(99) + F(98) + F(97) となる
一般化すると F(n) = F(n - 1) + F(n - 2) + F(n - 3)
ただしこれは4以上のとき。
なぜ4以上かというと、1 <= n <= 3 のとき、1歩で到達することをカウントしてないし、
nに0以下の数字が入ることが考えられてない。
ので、n <= 0 のとき F(n) = 0 とすれば
1 <= n <= 3 のときは F(n - 1) + F(n - 2) + F(n - 3) + 1

まとめると、
F(n) = 0 (n <= 0のとき)
F(n) = F(n - 1) + F(n - 2) + F(n - 3) + 1 (1 <= n <= 3のとき)
F(n) = F(n - 1) + F(n - 2) + F(n - 3) (n >= 4のとき)

…って感じかなぁ

HTML5のロゴをDockに入れてみる

W3C HTML5 Logo

今月の18日にw3c公式HTML5ロゴが公開されました。とりあえずロゴを使って何かできないか考えたところ、Dockに入れて見せびらかす見えるとおもしろいんじゃないか、と思ったので、Macのアプリケーションバンドルを作ってみることにしました。手動で作るのは初めてなので勉強がてらです。

アイコンをクリックしたらHTML5 ロゴのページを開く機能しかありません。
ソースコードgithubで公開してます。Dockにロゴを置くだけのネタアプリを作りたい場合は参考になるかと思います。

このネタアプリの作り方

追記

まだ公式ではないらしいです。

Mac で Hudson を動かす

cakephpアプリケーションで継続的インテグレーションしたい、という目的。
Hudsonはhudsonのサイトからダウンロードしたhudson.warをMacアプリケーション化した。

http://d.hatena.ne.jp/kaorun55/20100327/1269618599
http://blogs.sun.com/okazaki/entry/hudson%E3%82%92mac%E3%81%AE%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%81%AB

http://www.ryuzee.com/contents/blog/3473

ほとんどの設定はすんなり通ったが、phingの実行に失敗する。システム情報をチェックしてみると、/opt/local/bin にPATHが通ってないようだ。(Hudson, Java以外のツールphp, phing, phpunitMacPortsでインストールしている)

このPATHの設定にかなりハマった。たぶんMacアプリケーション化したのがいばらの道だったのだろう。Hudsonの設定の環境変数をためしたり、.profileを見直したが、なしのつぶて。最終的に /Application/Hudson.app/Contents/Info.plist に次の行を足すことでHudson実行時の環境変数を設定できました。

    <key>LSEnvironment</key>
    <dict>
        <key>PATH</key>
        <string>/opt/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>

追加したあとは、キャッシュされた設定をクリアするために、Hudson.app を一度どこかに移動しよう。(参考: http://blogger.splhack.org/2007/03/os-x.html )

テストケースが1つもない状態だとテストは失敗になる。テストケースを書くとテスト実行数や成功数がHudsonから参照できるようになった。


まとめ

build.xml以外のほとんどの設定がブラウザでできるのはすごい楽ですね!

追記:NetBeansのHudsonサポート

NetBeans からジョブを実行できたり、失敗の通知を表示できたりする。

いいね

Re: CakePHPで複数語句のlike検索を行う « Php « Prog « Laddy in

一応検証してみたのでメモ
リンク先の記事の方法でうまくいく/うまくいかない理由がわからなかったので。

SQL データ構造+サンプルデータ

CREATE TABLE IF NOT EXISTS `posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `body` text NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- テーブルのデータをダンプしています `posts`
--

INSERT INTO `posts` (`id`, `body`, `created`, `modified`) VALUES
(1, 'ほげら\r\nぴよぴよ', '2010-11-18 01:50:37', '2010-11-18 01:50:40'),
(2, 'ほげほげ\r\nhoge\r\nfuga\r\npiyo', '2010-11-18 01:50:58', '2010-11-18 01:51:00');

うまくいく方法 id=2を取り出す (CakePHPで複数語句のlike検索を行う « Php « Prog « Laddy inの「できそうでできないその2」)

<?php
class HomeController extends AppController {
    var $uses = array(
        'Post',
    );

    function posts(){
        $keys[0] = array('body LIKE' => '%hoge%');
        $keys[1] = array('body LIKE' => '%ほげ%');

        $params = array(
            'conditions' => array(
                'and' => array(
                    $keys
                ),
            ),
        );
        $posts = $this->Post->find('all', $params);
        debug($posts);
    }
}

うまくいかない方法 (違う部分だけ抜粋) (CakePHPで複数語句のlike検索を行う « Php « Prog « Laddy in の「2010/11/22 追記」)

<?php
        $params = array(
            'conditions' => array(
                'and' => array(
                    "body like" => "%hoge%",
                    "body like" => "%ほげ%",
                ),
            ),
        );

「"body like" => "%hoge%",」が消えるので、id=1も取り出されてしまう

この結果が当然だと思っていますが…。