このブログシステムをRails-2.0.2からRails-2.1に移行する作業をしています。 このエントリはその作業ログです。

  • benchmark_for_rails でエラーが出るようになったので、 最新版 をGitHubからもってくる。
       1  % ./script/plugin install git://github.com/cainlevy/benchmarkforrails.git
    
  • ActiveSupportでエラーが発生。

    wrong number of arguments (0 for 1) /usr/local/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/dependencies.rb:301:in `desc'

    ソースを見てみると、

       1    def will_unload?(const_desc)
       2      autoloaded?(desc) ||
       3        explicitly_unloadable_constants.include?(to_constant_name(const_desc))
       4    end
    
    これはおかしい。調べてみたらバグっぽい。

    benchmark_for_railsプラグインのlib/benchmark_for_rails/rewatching.rbのL39を以下のように修正。

       1  #rescue NameError
       2  rescue Exception
    
    プラグイン側ですでに対処されていたのだけれど、 発生する例外のタイプが変わった為にうまく動いてなかったようですね。

  • テストの実行中にTypeError: can't convert String into Integerが発生したので調査。 このへん の問題らしい。パッチを発見。 rails:freeze:gemsしてパッチを当ててみたが、解決せず。

    • その後調べてみると、どうやらacts_as_searchableのDirtyチェック用コードがRailsの仕組みとコンフリクトしてるのが原因のようでした。 (See Rails2.1でacts_as_searchable)
  • ActionView::TemplateError: undefined method `stringify_keys\' for ...というエラーが出る。
    • これは自作のHash#sliceが干渉していた模様。Railsで採用されたほうのHash#sliceにインターフェイスをあわせる。 hash.slice.valuesとすればOk.
  • Viewのテストでundefined method `cache_erb_fragment'というエラーが出る。 cacue_fuのなかで@controller.cache_erb_fragmentが呼ばれているところでエラーが発生しているようだ。
    • Cache関係の自前拡張の影響していたようなので除去。

ここまでで全テストがGreenに。 一通り動作検証をしたのち、Deploy完了。とりあえず問題なく動いているように見えます。

posted by Png genki on Sun 20 Jul 2008 at 20:37

texvcコマンドを使ってLaTeXで記述した数式の画像を取得するためのラッパーユーティリティとして Texvc を作りました。GitHubで公開しています。

インストール方法

まず、texvcを使えるようにする必要があります。texvcmediawiki-mathパッケージに付属しているので、 適宜パッケージマネージャなどを利用してインストールしてください。 あとは、GitHubからsudo gem install genki-texvcでOKです。

使い方はこんな感じです。

   1  require 'rubygems'
   2  require 'texvc'
   3  Texvc.parse('f(x)=\int_0^x \sin(t)\,dt') #=> Magick::Image

結果は以下のようなRMagickのImageになります。


f(x)=\int_0^x \sin(t)\,dt

posted by Png genki on Sun 20 Jul 2008 at 08:51

Rubyで一時ファイルを作成する場合は、 Tempfileを使うのが一般的だと思いますが、 今回は一時ディレクトリを作成する方法を紹介します。

TempDir

Jim Freezeさん作のTempDirです。 sudo gem install tempdirでインストールできて、 以下のようにして使います。

   1  require 'rubygems'
   2  require 'temp_dir'
   3  TempDir.create do |dir|
   4    puts dir # => "/tmp/temp_dir_24463_24509_oxvgf"
   5  end

dirは生成された一時ディレクトリのpathを示す文字列です。 createブロックを抜けると一時ディレクトリは削除されます。

posted by Png genki on Sun 20 Jul 2008 at 08:08 with 4 comments

最近のレンダリングアルゴリズム研究をフォローしていて、 面白そうなものを見つけたのでメモ。

動的モンテカルロ法を用いたフォトリアリスティックレンダリングに関する研究(pdf)

relt.jpg

一瞬LS+DS+E経路問題が解けたのかと思ったのですが、 面光源なので、実際のところLDS+DS+E経路のようですね。ふむふむ。

しかし、MLTと比べて非常に効率よくレンダリングが行われているようです。MCMCのレンダリングアルゴリズムへの応用はなかなか面白そうですね。

レプリカ交換法は抽象的な乱数空間で変 異を定義しており,乱数空間での小さな変異が経路空間上で は大きな変異になってしまうという問題がある

ふむ。これはMutationをちゃんとやってないって事かな。

posted by Png genki on Sat 19 Jul 2008 at 06:53

Control Variateは モンテカルロ求積法などでVariance reduction の為に利用されるテクニックです。

統計量{}_{m}が与えられた時、期待値は以下のように表します。


\mu=E[m]

この時、期待値が{}_{E[t]=\tau}であり、 相関係数(correlation coefficient)が {}_{\rho_{mt}=Corr[m,t]}であるような統計量 {}_{t}があるとすると、以下の式で表される


m^\star=m-C(t-\tau)

は、{}_{\mu}に対して不偏(unbiased)です。Cは任意の定数です。

ここで、 {}_{\sigma_m}, {}_{\sigma_t}をそれぞれ、 {}_{m}, {}_{t}の標準偏差(standard deviation) とした時、定数Cを以下


C = \frac{\sigma_m}{\sigma_t}\rho_{mt}

のように選ぶと、 {}_{m^\star}の分散は最小化され、以下のようになります。


V[m^\star]=(1-\rho_{mt}^2)V[m]

元の統計量{}_{m}の分散に対して、 {}_{\rho_{mt}^2}の分だけ相対的に小さくなります。

すなわち、{}_{m}と高い相関関係 (正の相関でも負の相関でも良い)にある {}_{t}が既知であるときに、{}_{t}を使って {}_{m^\star}の期待値の推定量を求めることで、 {}_{m}の期待値の推定量を効率よく推定することができます。

See Also

posted by Png genki on Sat 19 Jul 2008 at 02:08

イベントのお知らせです。

EGSR 2008の採択論文が出揃ってきたのを受けて、 OoO(=オフラインレンダラ野郎のためのオフラインレンダラについて議論するオフライン会)の第三回が開催されます。

OoO 第三回 : EGSR08 祭り

オフラインレンダラ野朗の皆様は奮ってご参加ください。

posted by Png genki on Fri 18 Jul 2008 at 04:37

Kagemushaを使って、スコープを汚さないDSLスタイルのinitialize メソッドを提供する方法を紹介します。

   1  require 'rubygems'
   2  require 'kagemusha'
   3  
   4  class Foo
   5    def initialize(&block)
   6      bar = nil # default value
   7      meta = eval('class << self; self end', block.binding)
   8      Kagemusha.new(meta) do |kage|
   9        kage.def(:bar){|bar|} # substitution
  10      end.swap(&block)
  11      @bar = bar
  12    end
  13  end
  14  
  15  def bar(x); puts x end
  16  
  17  foo = Foo.new do
  18    bar 'bar'
  19  end
  20  
  21  puts foo.inspect # => #<Foo:0xb7c03de0 @bar="bar">
  22  bar "hello!"     # => hello!

bindingのコンテクストからメタクラスを取得し、 Kagemushaを使って限定的にbarメソッドを置き換えています。 Foo.newのブロック内から抜けると、 barの呼び出しはグローバルスコープのbarを呼んで、 "hello!"が出力されます。

この方法は、initialize以外にも、 ブロックを受けるインスタンスメソッド全般に利用できます。 例えば、以下のようなコードで、一時変数t の存在が気になる場合などですね。

   1  create_table do |t|
   2    t.string :foo
   3  end

posted by Png genki on Thu 17 Jul 2008 at 19:38 with 1 comment

autotestでall_good時にrerun_all_testsをしないようにする の改良版です。 handle_resultsメソッドの実装の変化を、 なるべく吸収できるような書き方に変えました。 ~/.autotestに書いておくと良いかもしれません。

   1  class Autotest
   2    alias_method :handle_results_old, :handle_results
   3    undef_method :handle_results
   4  
   5    def handle_results(*args, &block)
   6      handle_results_old(*args, &block)
   7      self.tainted = !self.files_to_test.empty?
   8    end
   9  end

posted by Png genki on Tue 15 Jul 2008 at 21:55

ちょっと前にこんな記事(モバイル端末でプログラムを書ける日は来るか)を書いていたのですが、 iphoneの日本語入力のインターフェイスについて説明してる動画を見て、 可能性を感じました。

1方向へのスライドだけでは難しそうだけど、各種コマンドを ↑→↓→みたいに指を離すまでの ストロークにマップしたら相当便利になりそう。 iphoneにおけるVim的な何かが生まれる気がした。

posted by Png genki on Tue 15 Jul 2008 at 21:19 with 4 comments

tridentは、 tail -f log/development.logautotestscript/console を一枚の端末上で同時に実行するRailsプラグインでした(trident: tail -f, autotest and script/console at once参照)

ほぼ全てのRailsプロダクトに入れていたのですが、 毎回プラグインインストールするのが面倒になってきたので、 Gem化してGitHub上でリリースしました。

使い方ですが、RAILS_ROOTで以下のコマンドを実行します。

   1  % trident

すると色々立ち上がって script/console のプロンプトが出ます。 autotestのCtrl+Cをする代わりに、以下のコマンドを実行します。

   1  > Trident.reload

終了する時はexitでOKです。

See Also

posted by Png genki on Mon 14 Jul 2008 at 14:13