PostgreSQLでの日付処理

PostgreSQLでの日付の扱いをいつも忘れるのでメモ
下記の結果は、2013/06/14 15時くらいの実行結果です

現在をとるのは


select 
current_timestamp
, now() -- current_timestampと同じ
;

結果
“2013-06-14 15:44:12.078+09”

日付の加算は


select 
 now() + '1 days'
;

結果
“2013-06-15 15:44:12.078+09”

日付を丸めるには


select 
  date_trunc('hour', now())
, date_trunc('day', now())
, date_trunc('month', now())
;

結果
“2013-06-14 15:00:00+09”
“2013-06-14 00:00:00+09”
“2013-06-01 00:00:00+09”

上記を利用すれば
今月1日からのログを表示、なんてできます


select *
from log_table
where settime > date_trunc('month', now());
;

vim-quickrunがこける

あるときからvim-quickrunを実行するとこけるように…

<環境>
Windows XP
Vim 7.3 (Kaoriya版)
NeoBundleでvim-quickrunは入れた

なにやらpython部分でこけてるらしいので

.vim\bundle\vim-quickrun\autoload\quickrun\runner
内の
python.vim
を全部コメントアウトしてみました(強引すぎ..)

動作するようになりました。
取り急ぎ、これで応急処置。

cygwinでtelnetをインストール

cygwinでtelnetコマンド打つと、入ってない…
ためしたversionは、1.7.17です

最初からは入ってないようでインストール

apt-cyg install telnet
だと反応がない..

apt-cyg install inetutils
に入ってました

ちなみにWindows7でも
コントロール パネル\プログラム\プログラムと機能
Windowsの機能の有効化または無効化
で、TELNETクライアントにチェックを入れてインストールすれば
コマンドプロンプトでも使えます

[PHP]オーバーライドでの呼び出したメソッドはだれのか?

PHPでのオーバーライドでの親子メソッド呼び出しで
混乱したので整理。

まず、普通のoverride


class A {
    public function who() {
        echo 'Aです';
    }
    public function test() {
        $this->who();
    }
}

class B extends A {
    public function who() {
        echo 'Bです';
    }
    public function test() {
        $this->who();
    }
}

$cls = new B();
$cls->test();

// [実行結果]
// Bです

まだ、Aのメソッドは一つも呼び出されていません。

test()を親クラスのtest()に変えてみると


class A {
    public function who() {
        echo 'Aです';
    }
    public function test() {
        $this->who();
    }
}

class B extends A {
    public function who() {
        echo 'Bです';
    }
    public function test() {
        parent::test();
    }
}

$cls = new B();
$cls->who();

// [実行結果]
// Bです

これもBのwho()が呼び出されます

クラスBから、Aのwho()が呼びたいなら


class A {
    public function who() {
        echo 'Aです';
    }
    public function test() {
        $this->who();
    }
}

class B extends A {
    public function who() {
        parent::who();
        //echo 'Bです';
    }
    public function test() {
        parent::test();
    }
}

$cls = new B();
$cls->who();

// [実行結果]
// Aです

これで、親クラスのwhoメソッドが呼ばれます

そして、staticの場合


class A {
    public static function who() {
        echo 'Aです';
    }
    public static function test() {
        self::who();
    }
}

class B extends A {
    public static function who() {
        echo 'Bです';
    }
    public static function test() {
        parent::test();
    }
}

// [実行結果]
// Aです

BからAのtestを呼ぶ、self::who()はAのwho()となります

overrideしたBのwho()としたいなら
遅延静的束縛 (Late Static Bindings)ってのですね
(PHP5.3以降じゃないと効かないです)


class A {
    public static function who() {
        echo 'Aです';
    }
    public static function test() {
        static::who();
    }
}

class B extends A {
    public static function who() {
        echo 'Bです';
    }
    public static function test() {
        parent::test();
    }
}

// [実行結果]
// Bです

self::でなくてstatic::にしてやると
overrideが効きます

遅延静的束縛を忘れかけてました..