こもろぐ @tenkoma

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

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

MacBook Pro に再インストールするソフトウェアメモ

はてな義援金受付から寄付登録しました

昨日の地震はすごかったですね。さすがに机の下に潜りました。。。
電車がとまってしまったので徒歩とタクシーでの帰宅になりました
家では電子レンジが落っこちたくらいで、iMac液晶テレビが倒れることはありませんでした。電子レンジも落ち方がよかったのかガラスが割れたりすることもなく。

さて、さまざまな機関・企業で義援金の受付がはじまっていますが、日本赤十字社のWebサイトは断続的にページが表示できないような状態になっています。はてなでも義援金の受付を行っている、ということなので、ポイントの購入を含めて寄付をしました。いつも利用している・信頼しているサービスから寄付できるというのはとてもいいことですね。

いい機会なのでニュージーランド地震と宮崎鳥インフルエンザにも寄付。ポイントで払うと はてな ポイント支払・受取履歴から参照できます。

Redmine 1.1.1 インストール

依存コンポーネントのインストールにかかる部分だけ

sudo aptitude install ruby1.8 rubygems1.8
sudo gem install rack -v=1.0.1
sudo aptitude install rake
sudo gem install -v=0.4.2 i18n
sudo aptitude install libmysqlclient-dev
sudo gem install mysql
sudo gem install passenger
sudo aptitude install libcurl4-openssl-dev apache2-prefork-dev libapr1-dev libaprutil1-dev
sudo passenger-install-apache2-module

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のとき)

…って感じかなぁ