static property
仕事の時に見てたコードで、おや?と思ったものがあったので調べた。
クラス継承時に、親の持っている static property は子から参照しても同じ値が入っています。(static_property.php)
しかし、子クラスで同名の static property を宣言すると、親と子で別々の値が持てるようになります。(static_property_self.php)
理由はわりと単純で、子クラスで self::$foo と参照したときに、まず自分のクラスで定義を探す。なければ、 parent へ探しに行く。
なので、子クラスからも必ず同じ static property を参照したい場合は、self ではなく parent を指定しておくと良さそう。(static_property_parent.php)
コード見た方が早いと思うので、サンプル貼っておきますね。
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でやると面倒そうだなあ。
とりあえず
95/1000が残ってたけど作れた。既存のダイアリーからの移行とかどうなるのかなー。
phantomjs
今更ながらに軽く触ってみた。
インストールは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