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

RSpecを使ってViewのスペックを書く時のメモ。

  • RSS Builder等を使っている場合も、renderでOk
       1  render 'articles/index.rss.builder'
    
  • renderはデフォルトではlayoutを伴わないので、必要に応じて明示的に指定する。
       1  render 'articles/index', :layout => 'application'
    
posted by Png genki on Wed 13 Aug 2008 at 15:25

Formulaは、 数式をブログにはりつけて共有するコミュニティサービスです。

このたび、FormulaでXyMTeX記法による化学構造式が利用できるようになりました。 以下のような化学構造式を簡単にブログに埋め込むことができるようになります。

XyMTeXの記法については、以下のサイトを参照ください。

See Also

本サービスに関する各種お問い合わせは までお気軽にお寄せください。

posted by Png genki on Mon 11 Aug 2008 at 21:45

Formulaは、 数式をブログにはりつけて共有するコミュニティサービスです。

このたび、Formulaで利用できるLaTeX記法が増えました。 具体的には、eqnarray*環境で利用可能なLaTeX記法をほとんど全て利用することができます(セキュリティ上の観点から、一部のコマンドは無効化されています)

以下のように、複数行の数式を記述することもできるようになりました。

連立方程式も変数を揃えて記述できます。

posted by Png genki on Sun 10 Aug 2008 at 18:22 with 1 comment