• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

GAEなどでファイル数の多いライブラリを使うために、gemのパッケージから不要そうなファイルを消してjarファイルにまとめるために作ったスクリプトです。

   1  #!/usr/bin/env ruby
   2  
   3  def run(command)
   4    puts command
   5    system command
   6  end
   7  
   8  case ARGV[0]
   9  when 'install'
  10    run "jgem install -i ./gems --no-ri --no-rdoc #{ARGV[1]}"
  11  when 'uninstall'
  12    run "jgem uninstall -i ./gems #{ARGV[1]}"
  13  end
  14  
  15  Dir['gems/gems/*'].each do |dir|
  16    %w(
  17      Generaters TODO README.* README
  18      spec/**/* test/**/* examples/**/* tasks/**/*
  19      tutorial/**/* demo/**/* website/**/*
  20      CHANGES CHANGES.txt CHANGELOG
  21      LICENSE MIT-LICENSE Rakefile CONTRIBUTORS
  22      Manifest.txt History.txt install.rb setup.rb
  23    ).each do |pattern|
  24      Dir[File.join(dir, pattern)].each do |path|
  25        run "rm -rf #{path}"
  26      end
  27    end
  28  end
  29  
  30  Dir['gems/cache', 'gems/bin', 'gems/doc'].each do |path|
  31    run "rm -rf #{path}"
  32  end
  33  
  34  run "jar cf lib/merb.jar -C ./gems ."

posted by Png genki on Mon 7 Sep 2009 at 19:16 with 2 comments

JRubyで相対パスを含む場合に、Jarファイルの中のファイルを読めるようにするためのモンキーパッチの最新版です。

   1  def cleanup_path(path)
   2    if path.to_s.match(/^file:/) && path.is_a?(String)
   3      jar_path, inner_path = path.split('!', 2)
   4      inner_path = File.expand_path(inner_path)
   5      path = [jar_path, inner_path].join('!')
   6    end
   7    path
   8  end
   9  
  10  alias :require_original :require
  11  def require(path)
  12    require_original cleanup_path(path)
  13  rescue Exception => e
  14    raise e unless path.to_s.match(/^file:/)
  15  end
  16  
  17  alias :load_original :load
  18  def load(path)
  19    load_original cleanup_path(path)
  20  rescue Exception => e
  21    raise e unless path.to_s.match(/^file:/)
  22  end
  23  
  24  class Dir
  25    class << self
  26      alias :aref_original :[]
  27      def [](*args)
  28        aref_original *(args.map{|path| cleanup_path(path)})
  29      end
  30    end
  31  end
  32  class File
  33    class << self
  34      alias :mtime_original :mtime
  35      def mtime(path)
  36        if path.match(/^file:/)
  37          jar_file, = path.split('!', 2)
  38          path = jar_file.sub(/^file:/, '')
  39        end
  40        mtime_original(path)
  41      end
  42    end
  43  end

posted by Png genki on Tue 21 Apr 2009 at 02:43

GAEを使う上での大きな制限として、ファイル数1000までというのがあります。 これを乗り越えるために、unpackしたGemの中から不要なファイルを掃除したりする必要があったのですが、 関連するGem群をjarファイルにまとめる事でこの問題を乗り越えられます。

上記のファイルをlibの下に配置して、config/init.rb あたりでrequire_fixを読み込みます。 これはjarファイルの中のrbファイルの読み込みに関するバグを 回避するためのものです。

実際に以下のサイトでmerb.jarを使って運用しています。

これによって、事実上ファイル数制限に左右されずにアプリケーションを開発する事が出来るようになります。 ただ、1ファイルのサイズ制限(10MB)が存在するので、jarファイルが大きくなりすぎた場合は分割する必要があります。

posted by Png genki on Sun 19 Apr 2009 at 08:46

DataMapper用のDataStoreアダプター、dm-datastore-adapter-0.2.2をリリースしました。

今回のリリースで以下のような機能がサポートされます。

  • トランザクション
  • OR条件
       1  Post.all(:id => [1,2,3])
    
    のような事が出来るようになりました。
  • NOT条件
       1  Post.all(:updated_at.not => nil)
       2  Post.all(:id.not => 3)
    
    などが出来るようになりました。

DataMapperのアダプタとして主に必要な機能はだいたい揃ってきました。

デモサイトであるWatchMe!もアップデートしています。

まだ実用的なサービスになってないですが、登録したサイトをクローリングして全てのページの監視を行い、エラーが発生したらメールで知らせるサービスになる予定です。

posted by Png genki on Fri 17 Apr 2009 at 04:37 with 8 comments

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

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

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

2日前ぐらいからいろいろ頑張ってたのですが、ようやくGAEjの本番環境でMerbアプリを動かせました。

http://jmerbist.appspot.com/

ss

使っているgemをfreezeする仕組みがあるフレームワークであれば、どれでも以外と簡単に動きそうな感じがします。

いやー、これは色々面白い事が出来そうですね!

posted by Png genki on Thu 9 Apr 2009 at 17:23

Google App EngineでMerbを動かしてみた。

ss

しかし、本番環境にデプロイするためには別途Google App Engine Javaのアカウント申請が必要らしい。申請してみたけれど、レスポンスが無いので初回の10000万件の枠はもう無くなっている模様。

残念だなー。

posted by Png genki on Thu 9 Apr 2009 at 09:02
posted by Png genki on Tue 15 Apr 2008 at 15:27