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

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

現在使っているConnectionアダプターについて、 Migrationで利用可能なデータタイプを調べる方法のメモ。

   1  ActiveRecord::Base.connection.native_database_types.keys
   2  => [:boolean, :date, :binary, :datetime, :string, :integer, :decimal, :primary_key, :time, :float, :timestamp, :text]

posted by Png genki on Mon 14 Jul 2008 at 03:17

ブラックボックスなシステムを間に挟んで caller と callee 間で通信を行なう Wormholeのバージョン0.1.2 をリリースしました。

新しい機能

  • Named wormhole: ネストしたWormholeの呼び出しに対して、名前を付けて区別することができるようになりました
  • Syntax constraint: catchブロックの直後にreturnメソッドが呼ばれていない場合に例外を投げるようにしました
       1  w = Wormhole.catch do
       2  end #=> Wormhole::LateReturnError
       3  (snip)
       4  w.return
       5  
       6  Worrmhole.catch do
       7  end.return # => OK
    

ついでにWormholeの使用例を。

app/controllers/foo_controller.rb

   1  require 'wormhole'
   2  class FooController < ApplicationController
   3    def index
   4      Wormhole.catch do
   5        render :action => 'index'
   6      end.return do |result|
   7        result[:html] = "Hello, world!"
   8      end
   9    end
  10  end

app/views/foo/index.html.erb

   1  <% Wormhole.throw do |result| %>
   2    <%= result[:html] #=> 'Hello, world!' %>
   3  <% end %>

Viewのコードから一端Controllerのコードに戻って、 またViewに戻って結果を表示しています。

このように、おいそれとは変更できないようなフレームワークのコードを跨いで、呼び出し側と呼び出し元の間で情報のやり取りを行なう事ができます。

posted by Png genki on Sat 12 Jul 2008 at 06:05

D言語やPythonのように、複素数リテラルが欲しかったのですが、 無かったのでそれっぽい動きをさせるようにNumeric#iを定義してみました。

numeric_i.rb

   1  require 'complex'
   2  
   3  class Numeric
   4    def i
   5      self * Complex::I
   6    end
   7  end

これだけです。あとは以下のようにして使います。

   1  require 'numeric_i'
   2  
   3  1 + 1.i                        #=> Complex(1, 1)
   4  (Math::E ** (Math::PI.i)).real #=> -1.0

(自分が)簡単に使えるように、GitHubでGemを作っておきました。 利用する場合は以下の手順で導入できます。

   1  gem sources -a http://gems.github.com
   2  sudo gem install genki-numeric_i

名前空間のお陰で、シンプルなGemも気軽に公開できて良い時代ですね。

See Also

posted by Png genki on Thu 10 Jul 2008 at 22:21

(追記) スキーマのネームスペースが正しくありませんでした。修正しました。最新のネームスペースは適宜参照してください。

検索エンジンに正しくインデックスしてもらうのは大事です。今回モバイルのも同時に作ってみました。

sitemap.xmlの形式

下記Googleのウェブマスター向けヘルプセンターを参照。

routes.rbにサイトマップを登録

   1   map.m_sitemap 'mobile_sitemap.xml', :controller => "mobile", :action => "sitemap"
   2   map.sitemap 'sitemap.xml', :controller => "top", :action => "sitemap"

viewを作成

ファイルを作成します。:app/views/top/sitemap.xml.builder
(注) サイトマップのスキーマが0.9だと、Google,Yahoo, MSNなどのサーチエンジンが読めるようです。
(注) lastmodタグについてはDate.today.xmlschemaのようにxmlschemaが返す表示形式でOKです。

   1  # sitemap.xml
   2  xml.instruct! :xml, :version=> '1.0', :encoding => 'UTF-8'
   3  xml.urlset :xmlns => 'http://www.sitemaps.org/schemas/sitemap/0.9' do
   4    xml.url do
   5      xml.loc root_url
   6      xml.changefreq 'daily'
   7      xml.priority '0.9'
   8    end
   9  
  10    xml.url do
  11      xml.loc help_url
  12      xml.changefreq 'monthly'
  13      xml.priority '0.9'
  14    end
  15  end
ブラウザからアクセスして、サイトマップが表示されるか確認します。
モバイルサイトマップは下記。
(注) モバイルはまだ標準化されていない?ようで、googleのスキーマ 0.84を指定します。
(注) モバイル用のname spaceを設定する必要があります。
   1  # mobile_sitemap.xml
   2  xml.instruct! :xml, :version=> '1.0', :encoding => 'UTF-8'
   3  xml.urlset :xmlns => 'http://www.google.com/schemas/sitemap/0.84',
   4              "xmlns:mobile" => 'http://www.google.com/schemas/sitemap-mobile/1.0' do
   5    xml.url do
   6      xml.loc m_url
   7      xml.lastmod lastmodified.xmlschema
   8      xml.mobile :mobile
   9    end

サイトマップ登録

HTMLに下記を書いておくと、Google, Yahoo!, MSNもとっていってくれます。

   1  <link rel="alternate" type="application/rss+xml" title="your title" href="sitemap.xml" />
Googleウェブマスターツールでサイトマップを登録すると、サイトマップが正しくない時にエラー+アドバイスをくれるので便利でした。一度目はマスターツールで確認して、それ以降は上記のタグでやるのがよさそうですね。

Refs

http://brass.to/blog/sitemap_xml_by_rails2_0.html
http://www.google.com/webmasters/tools/
http://www.google.com/support/webmasters/bin/answer.py?answer=35738 googleのサイトマップのエラーと警告について
http://blog.livedoor.jp/botany/archives/50281545.html Google,Yahoo!,MicrosoftがSitemap protocol(サイトマッププロトコル)で合意に

posted by Png satoko on Thu 10 Jul 2008 at 15:26

今のコミット間違った―!というときに、コミット内容もなしにして戻すのがgit-reset --hard

git reset --hard HEAD~3
Rewind the master branch to get rid of those three commits.
http://www.kernel.org/pub/software/scm/git/docs/git-reset.html

一つ前のコミットまで戻る時は、HEAD^を引数に渡すと戻ってくれます。 あーよかった!

posted by Png satoko on Wed 9 Jul 2008 at 15:35