merbで採用されているジェネレータフレームワークの本命、 templater に、ruby-1.9.1対応のパッチを取り込んで頂きました。

ss

posted by Png genki on Sat 31 Jan 2009 at 19:49

レガシープロダクトをruby-1.9.1に対応させる方法のメモです。

  • RSTRING(str)->ptrはRSTRING_PTR(str) にする
  • RHASH(hash)->tblはRHASH_TBL(hash)にする
  • RFLOAT(float)->valueはRFLOAT_VALUE(float)にする
  • #include "re"#include "ruby/re"
  • #include "st"#include "ruby/st"
  • require "sha1"は、require "digest/sha1"にして、
       1  SHA1.new(string).to_s
    
       1  Digest::SHA1.hexdigest(string) 
    
    に変える
  • string.to_aはstring.each_line。EnumeratorではなくArrayが必要な場合は string.each_line.to_a にすれば良い。
  • string.eachはstring.each_lineに。
posted by Png genki on Sat 31 Jan 2009 at 14:35

merb本体全部対応するのはちょっと厳しかったので、 merb-genを起動する所までで必要なgemをruby-1.9.1対応にしてみました。

これに加えて、merb-gen自体のコードもruby-1.9.1対応させました。

これでmerb-genコマンドでappのひな形を生成する所までは動きます。

posted by Png genki on Sat 31 Jan 2009 at 14:20

Ruby-1.9.1リリースおめでとうございます。 バージョン番号からすると想像しにくいですが、これはRuby-1.9系の最初の安定版リリースであり、新しいRubyの時代の幕開けです。

[ANN] Ruby 1.9.1リリース

Ruby 1.9はRubyの新しい系統です。近代的に、高速に、文法も明確に、多言語化 され、多くの改善がなされました。Ruby 1.8系統は2003年以来利用され、多くの 素晴らしい製品を生み出しました。本日、1.9の歴史が始まります。

関係者の皆様、お疲れさまでした。

posted by Png genki on Sat 31 Jan 2009 at 08:32

こんな風に書いてみたいと思った。

   1  <% posts.each.if do %>
   2  <ul>
   3    <% iterate do |post| %>
   4    <li><%= h(post.body) %></li>
   5    <% end %>
   6  </ul>
   7  <% end.else %>
   8  <div>
   9    Not yet posted.
  10  </div>
  11  <% end %>

Enumerator#ifを作れば実現出来そうだ。

追記

という事で、作ってみた。

   1  module Enumerable
   2    class Iterator  
   3      def initialize(enumerable)
   4        @enumerable = enumerable
   5      end
   6  
   7      def iterate(&block)
   8        block.call(@enumerable.next) while true
   9      rescue StopIteration                 
  10      end                                  
  11    end                          
  12  
  13    class Enumerator 
  14      def if(&block)
  15        Iterator.new(self).instance_eval(&block) if count > 0
  16        self
  17      end
  18  
  19      def else(&block)
  20        block.call if count == 0
  21      end
  22    end
  23  end

posted by Png genki on Fri 30 Jan 2009 at 18:56

MerbのRakeタスク間の依存関係が知りたかったので、調べてみました。

   1  app <= [slices:merb-auth-slice-password:freeze:app_with_gem]
   2  clobber_coverage <= [spec:clobber, spec:coverage]
   3  copy_assets <= [slices:merb-auth-slice-password:install]create <= [db:reset]
   4  db:migrate:up <= [db:migrate]
   5  drop <= [db:reset]
   6  env <= [slices:list]
   7  freeze:app <= [slices:merb-auth-slice-password:freeze]
   8  freeze:views <= [slices:merb-auth-slice-password:patch]
   9  gem <= [slices:merb-auth-slice-password:freeze:app_with_gem]
  10  load <= [db:migrate:down, db:migrate:up]
  11  merb_env <= [audit:actions, audit:controllers, audit:routes, db:automigrate, db:
  12  autoupgrade, db:database_yaml, db:migrate:load, sessions:clear, sessions:create]
  13  migrate <= [db:reset, slices:merb-auth-slice-password:install]
  14  preflight <= [slices:merb-auth-slice-password:install]
  15  setup_directories <= [slices:merb-auth-slice-password:install]
  16  slices:list <= [slices]
  17  spec <= [default]
  18  spec:default <= [slices:merb-auth-slice-password:spec, spec]
  19  spec:explain <= [slices:merb-auth-slice-password:spec]
  20  stubs <= [slices:merb-auth-slice-password:patch]

右側が左側に依存してる感じです。 以下のようなコードをRakefileの末尾に記述して取得しました。

   1  tree = {}
   2  Rake::Task.tasks.each{|t| t.prerequisites.each{|r| (tree[r] ||= []) << t.name}}
   3  tree.sort_by{|i,j|i}.each{|r,a| puts "#{r} <= [#{a.sort.join(', ')}]"}

posted by Png genki on Fri 30 Jan 2009 at 03:07

Merbの良い所を紹介するシリーズ第2回。 今回はMerbのドキュメントViewerを紹介します。 Merbの公式ドキュメントは以下のサイトで見る事が出来ます。

http://merbivore.com/documentation/current/doc/rdoc/stack/index.html

ss

常に最新のドキュメントが公開されていて、 インクリメンタルな検索が出来たりして便利です。

追記

唯一の難点は、URLが覚えにくい事だと思ったので、 短くて覚えやすいショートカットを作ってみました。

上記のURLから、公式のgit-head docにリダイレクトします。

これでいつでも、思い立ったらすぐにドキュメントを参照出来ますね。

posted by Png genki on Wed 28 Jan 2009 at 17:06

しばらく、Merbの良い所を紹介していこうと思います。

Merbのpartialは、以下のように使います。

   1  <%= partial :form, :hello => @hello %>

Railsの場合だとこんな感じ。

   1  <%= render :partial => "form", :locals => {:hello => @hello} %>

Merbの方がシンプルなだけでなく、 Controllerの中からも同じように利用出来ます。

posted by Png genki on Tue 27 Jan 2009 at 14:57

MerbアプリケーションでAtomフィードを配信する方法のメモです。

まずは、config/dependencies.rbに、利用するGemを登録します。

   1  dependency "merb-builder"
   2  dependency "merb_full_url"

merb_full_url は、フィード中で埋め込まれる absoluteなURLを生成するためのプラグインです。 以下のようにインストールできます。

   1  % sudo gem install merb_full_url --source http://merbi.st

次に、コントローラのindexアクションで atomフィードを提供する事を指示します。

   1    def index
   2      provides :atom

さらに、config/init.rbで、MIMEタイプとしてatomを登録します。

   1  Merb::BootLoader.before_app_loads do
   2    # (..snip..)
   3    Merb.add_mime_type(:atom, :to_atom, %w[application/atom+xml])
   4  end
   5  

続いて、フィードを生成するためのindex.atom.builderファイルを app/views/{resource_name}の下に作ります。 このあたりはRailsのXmlBuilderと同じような感じです。

   1  xml.instruct! :xml, :version=>"1.0"
   2  xml.feed(:xmlns => "http://www.w3.org/2005/Atom") do |feed|
   3    feed.title @title
   4    feed.link :type => 'text/html', :rel => 'alternate',
   5      :href => full_resource(:posts)
   6  
   7    @posts.each do |post|
   8      feed.entry do |entry|
   9        entry.id post.id
  10        entry.title post.title
  11        entry.content post.body, :type => 'text'
  12        entry.issued post.created_at
  13        entry.modified post.updated_at
  14        entry.link :type => "text/html", :rel => "alternate",
  15          :href => full_resource(post)
  16        entry.author do |author|
  17          author.name post.user.login
  18        end
  19      end
  20    end
  21  end

以上で完了。これで後は/{resource_name}.atom にアクセスすれば、フィードが表示されます。

ちなみに、Vimでmerb.vimを使っている場合、.builderのfiletype を認識させるために、.vim/ftdetect/merb.vimの中で、 以下の1行を加えると、正しくファイルタイプを認識してくれます。

   1  au BufRead,BufNewFile */app/{mailers/,}views/*.builder set ft=ruby.merb_controller

posted by Png genki on Tue 27 Jan 2009 at 06:41

Twitter的な動画共有サイトである Seesmic では、Merbを使っているようです。

ss

プロダクションで使ってるところも増えてきましたね。

弊社では、PokéDiaの祝日情報共有サービスのバックエンドとなる Webサービスを、Merbで開発中です。

posted by Png genki on Tue 27 Jan 2009 at 04:35