Rakeでnamespaceなどを使った場合に、Rubyのシンボルをネストさせたい時があるのですが、

   1  task :foo => :"bar:baz"

のように書くのが、DSL的にちょっとかっこうわるいです。 そこで、以下のようなものがあればちょっと奇麗に書けます。

   1  class Symbol
   2    def method_missing(method, *args, &block)
   3      if args.empty? && block.nil?
   4        [self, method].join(':').intern
   5      else    
   6        super 
   7      end
   8    end
   9  end
  10  
  11  >> :foo #=> :foo
  12  >> :foo.bar #=> :"foo:bar"
  13  >> :foo.bar.baz #=> :"foo:bar:baz"

いかがでしょう。

posted by Png genki on Wed 15 Apr 2009 at 05:49

GAE/Jにはファイル数制限(1000まで)があるので、なるべく不要なファイルは減らしたいのが人情というものです。 ということで、unpackしたgemsから不要なファイルを掃除するために、以下のようなスクリプトを使用しています。

script/strip_gems

   1  #!/usr/bin/env ruby
   2    
   3  Dir['gems/gems/*'].each do |dir|
   4    %w(
   5      Generaters TODO README.* README
   6      spec/**/* test/**/* examples/**/* tasks/**/*
   7      tutorial/**/* demo/**/*
   8      CHANGES CHANGES.txt CHANGELOG
   9      LICENSE MIT-LICENSE Rakefile CONTRIBUTORS
  10      Manifest.txt History.txt install.rb setup.rb
  11    ).each do |pattern|
  12      Dir[File.join(dir, pattern)].each do |path|
  13        command = "rm -rf #{path}"
  14        puts command 
  15        system command
  16      end
  17    end
  18  end

Gemの中に含まれているファイルには制約が無いので、 簡単なパターンで全てを掃除するのは難しいですね。

posted by Png genki on Wed 15 Apr 2009 at 04:54

非常にシンプルなのですが、毎回GlobalHelpersに書くのが面倒なので、 Merbから GRAVATAR のアイコンを表示するための merb_gravatarプラグインを作りました。

http://github.com/genki/merb_gravatar/tree/master

インストール方法

   1  % sudo gem install merb_gravatar

使用法

dependencyでmerb_gravatarを指定して、viewで以下のように使います。

   1  <%= gravatar @user.mail, 16 %>

第二引数はアイコンのサイズを1~80で指定します。省略すると80が選ばれます。

ss1

GAE/Jでも使えます(See http://watch-me.appspot.com/people)

posted by Png genki on Tue 14 Apr 2009 at 11:11

dependencyでdata_objectsを指定すると、GAE/Jでなぜか突然exitしてしまうので理由を調べていたところ、data_objectsのtransaction.rbで以下のようなコードがあり、そこで落ちている事が分かりました。

   1  module DataObjects
   2  
   3    class Transaction
   4      HOST = "#{Socket::gethostbyname(Socket::gethostname)[0]}" rescue "localhost"     

Socket::gethostbyname を使っているところですね。

posted by Png genki on Tue 14 Apr 2009 at 04:36

一人で長距離を走るのが暇なので、 走っている間に会話ができる仲間を求めてはじめた MerbJog ですが、 勉強会系イベントの手法として優れた特性を持っている事が分かったので 開催する上でのポイントなどをまとめておきます。

特長

  • 会場スペースの制約が無く、参加人数に制限がいらない
  • 1〜2時間程度と、短時間で終わる
  • 仕切り、準備、後片付けなどがほとんど不要
  • 話した内容とは無関係に、走り終わったあとに満足感がある
  • フォーメーション的に中心人物ができにくいので、全員が比較的フラットに話題に参加できる
  • 体力の許す限り話したい人のそばに移動できる
  • 二次会をしないので安上がり
  • 健康的

短所

  • ググれないので脳に入ってる情報だけがたより
  • ホワイトボード、PCなどが無いので言葉だけで説明する必要がある
  • 悪天候時には中止・延期せざるをえない
  • 体力が無い人は参加できない
  • 参加者と遭遇できない場合がある

開催上のポイント

  • 皇居などの信号が少なく、5〜10kmぐらいのコースが良い
  • 遭遇できなくても泣かない。たまには一人で走るのもよし
  • 遭遇率を高めるために、主催者は携帯を持っていく
    • 携帯はランニングポーチに入れておくと気にならなくて良い
  • 筋肉の疲労が抜けるまで、なか2日程度あけた方が良い

See Also

posted by Png genki on Mon 13 Apr 2009 at 14:05 with 1 comment

DataMapper用のDataStore用アダプタ、dm-datastore-adapterを作りました。

これを使えば、MerbアプリをほぼそのままGoogle App Engine for Javaの上で動かせるようになります。 (実際にはgemの依存関係など、細かい調整が必要になりますが)

実際に以下のサイトでdm-datastore-adapterを使っています。

ローカル環境でも別なアダプタを利用すれば、普通のMerbアプリとして動作テストできるので、開発効率が飛躍的に向上します。

posted by Png genki on Mon 13 Apr 2009 at 05:42

gemを指定したディレクトリにインストールする方法を紹介します。 以下のように -i オプションでディレクトリを指定します。

   1  gem install -i ./gems data_objects --no-ri --no-rdoc

Gemをunpackしている場合に、もう一つ、二つGemを追加したい時などに重宝します。

posted by Png genki on Sun 12 Apr 2009 at 17:36 with 2 comments

現在のところ、JRubyでjgem install do_sqlite3などによってdo_sqlite3をインストールしようとすると、Native extensionを使っているという事でエラーが出ます。

   1  Building native extensions.  This could take a while...
   2  /usr/local/jruby/lib/ruby/1.8/mkmf.rb:7: JRuby does not support native extensions. Check wiki.jruby.org for alternatives. (NotImplementedError)

この問題を解決するには、最新版のdatamapper/doをgithubからとってきて、自分でbuildする必要があります。

http://github.com/datamapper/do/tree/master

doをgit cloneしたら、まずはdata_objectsディレクトリに移動し、以下のようにしてdata_objectsをインストールします。

   1  % jruby -S rake package
   2  % sudo jgem install pkg/data_objects-0.9.12.gem

続いて、do_jdbcディレクトリに移動し、do_jdbcをコンパイルしてインストールします。

   1  % jruby -S rake compile
   2  % jruby -S rake package
   3  % sudo jgem install pkg/do_jdbc-0.9.12-java.gem

最後に、do_sqlite3 ディレクトリに移動し、以下のようにインストールします。

   1  % jruby -S rake package
   2  % sudo jgem install pkg/do_sqlite3-0.9.12-java.gem

以上でインストール完了です。

posted by Png genki on Sun 12 Apr 2009 at 03:48

Bumble はGoogle App Engine for JavaのDateSoreを利用するためのライブラリですが、Railsで利用する前提で作られているので、 Merbで利用する場合には、以下のような修正を加えると良いようです。

bumble.rb

   1  module Bumble
   2    (..snip..) 
   3    def self.included(base)
   4      base.send :include, InstanceMethods
   5      base.send :extend, ClassMethods
   6      Merb::Router.root_behavior = 
   7        Merb::Router.root_behavior.identify(Bumble => :key)
   8    end

これによって、resource(@person) #=> /people/5 のようにidentifyしてくれるようになります。

posted by Png genki on Sun 12 Apr 2009 at 02:23

GAEjのファイル数制限が厳しいので、rails.jarを試作してみました。

rails-2.3.2.jar

jrubyのバグなのか、jarファイルの中身に対してrequireをする時に、 pathの中に../..のような感じの指定が入っているとうまくロードできないようなので、その問題を回避するモンキーパッチをあてる必要がありました。

require_fix.rb

   1  alias :require_original :require
   2  def require(path)
   3    path = File.expand_path(path) if path.to_s.match(/^file:/)
   4    require_original path
   5  end
   6  
   7  alias :load_original :load
   8  def load(path)
   9    path = File.expand_path(path) if path.to_s.match(/^file:/)
  10    load_original path
  11  end      

それでこんな感じに使えます。

   1  % java -jar $JRUBY_HOME/lib/jruby-complete.jar -rrequire_fix -rrails-2.3.2.jar -S rails -v
   2  Rails 2.3.2

実際にはlibの下に設置する感じになりますね。

posted by Png genki on Sat 11 Apr 2009 at 19:34