Capistrano-2.1を使って、Gitリポジトリからデプロイする為のレシピファイルの書き方のメモです。

config/deploy.rb

   1  set :application, "goodstuff"
   2  set :scm,         :git
   3  set :repository,  "git.foo.com:/path/to/#{application}.git"
   4  set :branch,      'master'
   5  set :deploy_via,  :copy
   6  set :deploy_to,   "/mnt/app/#{application}"
   7  set :user,        "app"
   8    (--snip--)

/path/to/goodstuff.gitがベアリポジトリだと仮定しています。 :branch:deploy_viaを指定しているところがポイントでしょうか。 後は

   1  % cap deploy

するだけ。

posted by Png genki on Sat 23 Aug 2008 at 01:58 with 1 comment

Amazon EBSを使う方法のメモ。

Elasticfox拡張 を使い、 EBSボリュームを作成し、適当なインスタンスにアタッチする。 仮にここでは、/dev/sdhにアタッチしたとする。

その後、ボリュームをアタッチしたインスタンスにSSHでログインし、 以下のコマンドでボリューム上にファイルシステムを構築する。

   1  # yes | mkfs -t ext3 /dev/sdh

続いて、適当なディレクトリを作成し、マウントする

   1  # mkdir /mnt/foo
   2  # mount /dev/sdh /mnt/foo

後は普通に/mnt/fooにアクセスすればOk。

See Also

posted by Png genki on Fri 22 Aug 2008 at 21:46

EC2でパッケージのRubyではなく、srcからRubyを入れて使う場合、 イメージの状態によってはAMI-toolsがLOAD_PATH不足で正しく起動できない場合がある。

その場合、以下のようにAMI-toolsのスクリプトを書き換える。

/usr/local/bin/ec2-bundle-vol

   1  #!/bin/bash
   2  ruby -I/usr/lib/site_ruby /usr/lib/site_ruby/aes/amiutil/bundlevol.rb $*

-IオプションでLOAD_PATHを補っている。

posted by Png genki on Fri 22 Aug 2008 at 04:17

Git-1.6がリリース されたようなので、手元の環境をアップデートしてみました。

   1  % su
   2  # cd /usr/local/src
   3  # wget http://kernel.org/pub/software/scm/git/git-1.6.0.tar.bz2
   4  # tar xvjf git-1.6.0.tar.bz2
   5  # cd git-1.6.0
   6  # make
   7  # rm -rf /usr/local/bin/git-*
   8  # make install
   9  # make install-doc

1.6からgit-xxxxxというサブコマンド系のコマンドが無くなったようなので、 古い実行ファイルを削除してみました。

posted by Png genki on Tue 19 Aug 2008 at 13:03

Markdownをpreg-markdownに切り替える ついでに、 Formulaの コメントのプレビューができるようにしました。

コメント中に $x=y$ のように記述することでインライン形式で数式を記述できます。 また、

\[
f(x)=\int_0^x g(t)\,dt
\]

のように書くことで、ディスプレイスタイルで数式を含めることも出来ます。

そのうちこちらのブログでもこの記法を使えるようにする予定です。

posted by Png genki on Tue 19 Aug 2008 at 00:01

RubyでMarkdown記法というと、BlueClothが有名なのではないかと思いますが、rdiscountとrpeg_markdownという新しいライブラリが Daring Fireball氏のこちらの記事で紹介されていました。

Better Markdown Libraries for Ruby: RDiscount and rpeg-markdown

Ryan Tomayko has solved this with two new Ruby extensions that wrap extremely fast (and accurate) C libraries for Markdown: David Loren Parsons’s Discount and Jon MacFarleane’s peg-markdown.

早速 Formula で使ってみようと検証していたのですが、上述の二つのライブラリには、 エスケープの仕方でMARKDOWN記法の解釈に以下のような違いがあるようです。

   1  source = "[test](http://foo.com/?x%3Dx%2B5%2B2y)"
   2  RDiscount.new(source).to_html
   3  #=> "<p><a href=\"http://foo.com/?x%253Dx%252B5%252B2y\">test</a></p>\n"
   4  Markdown.new(source).to_html # rpeg-markdown
   5  #=> "\n\n<p><a href=\"http://foo.com/?x%3Dx%2B5%2B2y\">test</a></p>"

RDiscountの方は、エスケープ済みのQuery Stringをもう一回エスケープしてしまっているようです。

posted by Png genki on Mon 18 Aug 2008 at 23:35 with 2 comments

Rails勉強会@東京第32回 に参加してきました。 お盆の最中だったせいか、いつもの半分ぐらいの参加者でした。 そのせいか、いつもとちょっと違ったRails勉強会となりました。

  • シングルトラック
  • 3セッション
  • 自己紹介が最後

これがなかなか良かったです。 ただ、人数が多いとできない形式でしょうね。

IMG_0139.JPG

実際に行われたセッションは以下の通り。

  • YuguiさんによるRedmineの話(実質は高橋会長によるRESTトーク)
  • 大場さんによるJRubyで拡張を作る話
  • 西さんによるgitの話(入門から仕事で使えるレベルまで)

いずれもハイクオリティなセッションで面白かったです。 僕はgitの話でちょっと話をしました。 リポジトリ間で相互のpush/pullするのが出来たので満足。 それから、git-instawebやgit-guiという、 Git用のGUIツールがある事を教わりました。

posted by Png genki on Mon 18 Aug 2008 at 01:09 with 3 comments
16th Sat

pagination_scope

named_scopeによるPagination を行うためのGemを作りました。 通常はwill_paginateを利用するほうがいいと思いますが、 :joinsを含む複雑なnamed_scopeを介してpaginationを行いたい場合には、 利用すると便利かもしれません。

pagination_scope

使い方

まず、モデルクラスの中でincludeします。

   1  class Post
   2    include PaginationScope
   3  end

これによって、Postクラスにpaginateというnamed_scopeが作成されます。

続いて、Paginationを利用したいコントローラのアクションメソッド内で、

   1  class PostsController < ApplicationController
   2    def index
   3      @posts = Post.not_deleted.paginate(params[:page], 10)

のようにScopeを取得します。

続いて、Viewで以下のようにPagination用HTMLを生成します。

   1  <%= paginate @posts %>

paginateメソッドは PaginationScope によって導入されるViewヘルパーです。

posted by Png genki on Sat 16 Aug 2008 at 23:25

Railsアプリケーションでpaginationといえば、 will_paginate等のプラグインやGemを使うのが一般的だと思います。 しかし、named_scopeでjoinsを使った場合にうまく paginationができなかったので、 named_scopeだけを使ってpaginationする方法を考えてみました。

まずは以下のようなnamed_scopeを作ります。 以下の例はPostクラスで宣言される事を想定しています。

   1  named_scope :paginate, proc{|page, per_page|
   2    {:offset => per_page*((page || 1).to_i - 1),
   3     :limit => per_page}} do
   4      def count
   5        proxy_scope.count(:group => 'posts.id').size
   6      end
   7      def num_pages
   8        (count.to_f/proxy_options[:limit]).ceil
   9      end
  10      def page
  11        proxy_options[:offset]/proxy_options[:limit] + 1
  12      end
  13      def pages(window = 5, left = 2, right = 2)
  14        (1..num_pages).inject([]) do |result, i|
  15          i <= left || (num_pages - i) < right ||
  16            (i-page).abs < window ? result << i :
  17              (result.last.nil? ? result : result << nil)
  18        end
  19      end
  20    end

countを再定義しているのは、:joinsを含む別なnamed_scopeをチェーンした時に、正しいcountを求めるためです。

コントローラでは、以下のようにScopeを取得します。

   1  @posts = Post.paginate(params[:page], 5)

Viewでは以下のように記述します。

   1  <% if @posts.page > 1 %>
   2    <%= link_to '&laquo; Newer',
   3        url_for(:page => @posts.page - 1) %>
   4  <% else %>
   5    &laquo; Newer
   6  <% end %>
   7  <% @posts.pages.each do |i| %>
   8    <% if i.nil? %>
   9      ...
  10    <% elsif i == @posts.page %>
  11      <%= i %>
  12    <% else %>
  13      <%= link_to i, url_for(:page => i) %>
  14    <% end %>
  15  <% end %>
  16  <% if @posts.page < @posts.num_pages %>
  17    <%= link_to 'Older &raquo;',
  18        url_for(:page => @posts.page + 1) %>
  19  <% else %>
  20    Older &raquo;
  21  <% end %>

posted by Png genki on Sat 16 Aug 2008 at 21:10

以前一度紹介しましたが、本来入るべきでないcompadd が補完候補に出てしまっていたので、 xargsコマンドを使うように書き直しました。

   1  _cap () {
   2    compadd `cap -T | grep '^cap ' | sed 's/^cap //' | sed 's/ .*//' | xargs`
   3  }
   4  
   5  compdef _cap cap

posted by Png genki on Wed 13 Aug 2008 at 17:47