ポインタのみのエントリです。
4.2 コールバックパターンを4.2.2 コールバックとスコープまで読むと
jQuery.proxy() の存在意義がわかると思います。
JavaScriptパターン ―優れたアプリケーションのための作法
- 作者: Stoyan Stefanov,豊福剛
- 出版社/メーカー: オライリージャパン
- 発売日: 2011/02/16
- メディア: 大型本
- 購入: 22人 クリック: 907回
- この商品を含むブログ (77件) を見る
広告:本ブログで紹介している書籍等商品の紹介でAmazonアソシエイトを利用していることがあります。
ポインタのみのエントリです。
4.2 コールバックパターンを4.2.2 コールバックとスコープまで読むと
jQuery.proxy() の存在意義がわかると思います。
JavaScriptパターン ―優れたアプリケーションのための作法
「関数の呼び出し」を「関数の適用」という正確な説明に訂正している
関数を呼び出すサンプル …(1)
sayHi('world');
関数を適用するサンプル ...(2)
sayHi.apply(null, ["world"]);
2つのコードでやっていることは同じで、「関数の呼び出し」は「関数の適用」のシンタックスシュガーに過ぎない、
と説明する。
また、sayHi関数が、alienオブジェクトのメソッドだった場合、それぞれ
alien.sayHi('world'); alien.sayHi.apply(alien, ['world']);
となる。メソッドの適用時は、関数内部でthisに束縛されるオブジェクトを指定しなければならない。
var add = function add(a, b) { return a + b; };
console.log(add.name); // => "add"
var add = function (a, b) { return a + b; };
console.log(add.name); // => "" (Firefox, WebKit), => undefined (IE)
function add(a, b) { return a + b; }
console.log(add.name); // => "add"
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のとき)
…って感じかなぁ
今月の18日にw3c公式のHTML5ロゴが公開されました。とりあえずロゴを使って何かできないか考えたところ、Dockに入れて見せびらかす見えるとおもしろいんじゃないか、と思ったので、Macのアプリケーションバンドルを作ってみることにしました。手動で作るのは初めてなので勉強がてらです。
アイコンをクリックしたらHTML5 ロゴのページを開く機能しかありません。
ソースコードはgithubで公開してます。Dockにロゴを置くだけのネタアプリを作りたい場合は参考になるかと思います。
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, phpunitはMacPortsでインストールしている)
この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以外のほとんどの設定がブラウザでできるのはすごい楽ですね!
一応検証してみたのでメモ
リンク先の記事の方法でうまくいく/うまくいかない理由がわからなかったので。
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');
<?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); } }
<?php $params = array( 'conditions' => array( 'and' => array( "body like" => "%hoge%", "body like" => "%ほげ%", ), ), );
「"body like" => "%hoge%",」が消えるので、id=1も取り出されてしまう
この結果が当然だと思っていますが…。