static property

仕事の時に見てたコードで、おや?と思ったものがあったので調べた。

 

クラス継承時に、親の持っている static property は子から参照しても同じ値が入っています。(static_property.php)
しかし、子クラスで同名の static property を宣言すると、親と子で別々の値が持てるようになります。(static_property_self.php)

理由はわりと単純で、子クラスで self::$foo と参照したときに、まず自分のクラスで定義を探す。なければ、 parent へ探しに行く。
なので、子クラスからも必ず同じ static property を参照したい場合は、self ではなく parent を指定しておくと良さそう。(static_property_parent.php)

 

コード見た方が早いと思うので、サンプル貼っておきますね。

object が同一かどうかはspl_object_hashで見ているhttp://php.ne ...

Project Euler - Problem 10

もろもろの合間にちょっとした体操。

http://projecteuler.net/problem=10
200万までの素数の合計を求める。
単に素数リストを求めて合計すればいいだけ。

組み込みクラス使ってもいいけど、自前で実装する。

#!/usr/bin/env ruby

class Prime
  def list(max)
    # Eratosthenes
    list = (3..max).step(2).to_a
    result = [2]
    while(list.last > result.last ** 2) do
      result << list.shift
      list.reject! {|n| n % result.last == 0}
    end
    result + list
  end
end

# sum of primes
max = ARGV[0].to_i # 2000000
p Prime.new.list(max).reduce(&:+)

$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]

$ time ruby p10.rb 2000000
ruby p10.rb 2000000 469.85s user 1.62s system 99% cpu 7:53.67 total

reject の部分で素数の倍数を落としているが、件数が多すぎて時間がかかってしまう。
リストにして一気に落とした方が早いか。

#!/usr/bin/env ruby

class Prime
  def list(max)
    # Eratosthenes
    list = (3..max).step(2).to_a
    result = [2]
    while(list.last > result.last ** 2) do
      result << list.shift
      list -= (result.last..list.last).step(result.last).to_a
    end
    result + list
  end
end

# sum of primes
max = ARGV[0].to_i # 2000000
p Prime.new.list(max).reduce(&:+)

$ time ruby p10.rb 2000000
ruby p10.rb 2000000 12.65s user 0.23s system 99% cpu 12.914 total

arrayが演算できる言語だからできる手抜き。
Cでやると面倒そうだなあ。

phantomjs

今更ながらに軽く触ってみた。

http://www.phantomjs.org/

インストールはhomebrewで。

$ brew install phantomjs

Javascriptのコマンドライン実行環境らしい。APIとしては、他のWebkitブラウザと同じJavascript APIに加え、主に以下の2つのが追加されている。

  • phantom: 実行環境へアクセスするためのオブジェクト。args, scriptName, exitなどを持つ。
  • WebPage: webページをカプセル化したオブジェクト。URL経由でHTMLページを読み込んだり、外部のjsをincludeしたり、イベントを発行したりできる。

ちょっとしたツール作ったりとか、ユニットテストとかに便利そうな感じ。

Androidで画面が出ている時だけ音を鳴らす

ActivityのonResume()とonPause()で制御すれば良いと考えられる。

が、ロックスクリーンが表示されてても音がなってしまって困る。

そんな時はonWindowFocusChanged()を使いましょう。

サンプルではonResume()だけを置き換えているけれど、条件によってはこのメソッドだけでハンドルできないかしら。

サンプルコード

Function::arguments

argumentsは引数リストだと思っていたら、実はオブジェクトらしい。
arrayにそのまま渡したい時に困るのだが、変換できる。

Array.prototype.slice.call(arguments)

https://developer.mozilla.org/en/JavaScript/Reference/functions_and_function_scope/arguments