• 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
 
 

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/165

2/18に開催されたRails勉強会に参加してきました。 今回は、過去最大の参加人数だったようで、いつもよりだいぶ賑やかな感じでした。

参加したセッションは、前半が「scaffold_resource」、後半は「FeedのCache」でした。

■前半「scaffold_resource」

scaffold_resourceの話に入る前に、Rails1.2の新機能のおさらいとか、その辺の話で盛り上がっていました。ActiveSupportのrequireとconst_missingの上書きに悩まされてる人が多いようですね。form_forのブロックを用いる形式については、昔からその書き方を使っていたので、それほど影響は無かったです。

それにつけても、scaffold_resourceは便利ですね。

$ ./script/generate scaffold_resource user name:string password:string
のように第二パラメータ以降でテーブルのカラムを指定できたりするんですが、 これが素晴らしい。

■後半「FeedのCache」

FeedのCacheの話から、大規模運用でのキャッシュの話になってしまいました。

大規模運用はRuby on Railsのレイルが敷かれていない、無限の荒野です。 キャッシュの運用については、RubyKaigi2007のCFPに応募したので、 採用されたらお話できるかも。

■懇親会

今回も会場の予約が無かったので、ロデオでおなじみのZESTに行きました。 ここは大人数で予約無しでも入れるので便利ですね。 なんとなくC言語とか、動的言語の次のパラダイムとして、 動き続けるプログラムについて語ってみました。 dRubyとか使ってると、今にも実現しそうなんですよね。

メモリ空間のスナップショットを取って、補足されない例外が発生したら 直前のスナップショットに戻す。 エディタの実装言語とマクロ、SecondLifeの実装言語とLSLのように、 パラダイムの異なる二つの言語においては、動き続けるプログラミングが 半分だけ実現されているように見えますが、LSLからSecondLifeのコア部分は 書き換えられないのですよね。 Rubyのような言語なら、それが出来そうな気がする。 あるいはJavaScriptかな。

二次会はなぜかJavaの話をしていました。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/165

posted by Png genki on Wed 21 Feb 2007 at 03:31

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/164

最近、各所でgem listを公開するのが流行っているようですね。

やってみたら相当数入っています。そしてほかのGemとの依存関係でインストールされたと思われる、あまり記憶に無いGemも結構入っています。

僕の経験では、こういったGemは便利なものが多い。以前紹介したHoeもこの方法で知りました。頻繁にCiteされる論文が良い論文であるというように、よくrequireされるGemは良いGemに違いないと思います。

今回やってみて気になったGemは、

・call_stack (0.1.0.0)
・cgi_multipart_eof_fix (2.1)
・daemons (1.0.4, 1.0.3)
・fastthread (0.6.4.1, 0.6.3)
・syntax (1.0.0)
・wirble (0.1.2)

この辺です。まだ何も調べて無い段階ですが、なんか面白そうだなあ。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/164

posted by Png genki on Sun 18 Feb 2007 at 11:20

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/163

Rubyのダックタイピングを活用して、シンプルかつ汎用的な Stringパーサ&コンバータstring_to.rbを書いてみました。

このコードは、to_xxxx_xxxxメッセージを受け取り、 XxxxXxxx#parse(self)を呼び出すことで 自分自身をXxxxXxxxに変換する method_missingハンドラをStringクラスに付け加えます。


class String
  def method_missing(method, *arg, &block)
    method_name = method.to_s
    if method_name.slice!(0..2) == "to_"
      method_name.gsub!(%r(__), '::_')
      method_name.camelize.constantize.parse(self, *arg, &block)
    else
      super
    end
  end
end

利用方法:

  1. 上のコードをコピーして、

  2. $:の通った場所にstring_to.rbとして保存し、

  3. そしてこの機能を使いたいところからrequireします。

require 'date'
require 'uri'
require 'string_to'

"2007-2-11".to_date #=> Date.parse(self)
"http://www.drecom.co.jp/".to_URI #=> URI.parse(self)

[English]

POSTSCRIPT:

constantizecamelize等のRails依存のメソッドを 書き直して、RubyForgeにプロジェクトを登録しました。

  string-to
これでようやく、いつものようにgemコマンドでインストールできるようになりました。
$ sudo gem install string-to
使い方は以下のとおり:
require 'rubygems'
require 'string_to'
require 'date'

"2007-2-13".to_date # => Date.parse("2007-2-13")
parseメソッドを実装しているクラスやモジュールは意外と多いですね。 CGI、Date、Name、Ripper、URI、Time、YAML、JSON、CGI::Cookie...

次のバージョンでは、parseメソッドがあったら便利なモジュールにparseを追加するのをやろう。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/163

posted by Png genki on Sun 11 Feb 2007 at 09:32

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/162

RailsのIntegrationTestの仕組みを使って、Code To Test Ratio(コード量に対するテストコードの割合)が一定以上に保たれているかどうかを検証するテストを書いてみました。

require "#{File.dirname(__FILE__) }/../test_helper"

class TestingRuleTest < ActionController::IntegrationTest
  def setup
    @stats = `rake stats`
  end

  def test_code_to_test_ratio
    cttr = @stats.match(%r{Code to Test Ratio: 1:([\d\.]+)})[1].to_f
    assert cttr >= 0.8, "Need more tests."
  end
end
多人数で開発をしてるとなかなか面白いですよ。一人の場合でも自分への戒めに使えるかな。

[English]

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/162

posted by Png genki on Sat 3 Feb 2007 at 05:47

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/161

Railsを使っていると、formにActiveRcordオブジェクトのアトリビュートが勝手に入ってくれたり、フォームの内容が勝手に解析されて、Controllerからparamsで参照できたりと、とても便利です。

Railsのフォームヘルパーが生成したフォーム要素のnameやidを見てみると、"user[name]"のように、ARオブジェクトの属性名がマーシャリングされた状態で織り込まれています。 このようなフォームから送信されたリクエストの結果を解析して、paramsでアクセスできるように変換してくれるのがFormEncodedPairParserです。

今回は、FormEncodedPairParserが解析可能な形式で、ネストしたHashやArrayをQueryStringに変換するFormEncoderモジュールを作ってみました。

module FormEncoder
  def self.encode(parameters, prefix = "")
    case parameters
    when Hash; encode_hash(parameters, prefix)
    when Array; encode_array(parameters, prefix)
    else "#{prefix }=#{CGI.escape(parameters.to_s) }"
    end
  end

private
  def self.encode_hash(hash, prefix)
    hash.inject([]) do |result, (key, value)|
      key = CGI.escape(key.to_s)
      result << encode(value, prefix.empty? ? key : "#{ prefix }[#{ key }]")
    end.join('&')
  end

  def self.encode_array(array, prefix)
    array.inject([]) do |result, value|
      result << encode(value, "#{prefix }[]")
    end.join('&')
  end
end
使用法:
FormEncoder.encode :foo => {:bar => [1, 2], :baz => "Rails"}
#=> "foo[baz]=Rails&foo[bar][]=1&foo[bar][]=2"

CGIMethods.parse_query_parameters(
  "foo[baz]=Rails&foo[bar][]=1&foo[bar][]=2")
#=> {"foo"=>{"baz"=>"Rails", "bar"=>["1", "2"]}}
これを使用することで、formから送信するのと同様な形式でさまざまな情報をQUERY_STRINGに変換できるので、paramsで受け取ることが出来ます。

[English]

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/161

posted by Png genki on Fri 2 Feb 2007 at 07:02

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/160

簡単にカレンダーを表示できるcalendar_helperプラグインは大変便利ですが、これをインストールすると'CalendarHelper'という名前がRuby on Railsに予約されてしまうのをご存知でしょうか。

これはつまり、CalendarControllerを作るのが難しくなるということです。もしCalendarControllerの雛形をscript/generateコマンドで作成しようとしても、以下のようなメッセージが出力されて拒まれます。

The name 'CalendarHelper' is reserved by Ruby on Rails

この問題を回避してCalendarControllerを作成する方法を紹介します。そのためには、次のような手順を踏みます。

  1. calendar_helper plugin. をインストール
  2. mv vendor/plugins/calendar_helper other_place
  3. ./script/generate controller calendar
  4. mv other_place/calendar_helper vendor/plugins
  5. vendor/plugins/calendar_helper/init.rbを編集

こんな感じに

require File.join(File.dirname(__FILE__), 'lib/calendar_helper')

[English]

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/160

posted by Png genki on Fri 26 Jan 2007 at 07:12

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/159

今年最初のRails勉強会に参加してきました。 今回は、井上さん、もろはしさんが体調不良ということでお休みだったのをはじめ、 急遽参加できなくなった方が多かった模様です。

参加したセッションは、前半が「ARとテーブル設計」、後半が「TDDB」でした。

■前半「ARとテーブル設計」

ARといえばmaihaさん、maihaさんといえばAR。最近ブログでなんだか面白そうなことを書いているなあと思ってたのですが、それでした。

内容はかなりマニアック。ウィトゲンシュタインの論理哲学論考からT字型の話、存在論の話へと展開。いやあ、面白かった。

■後半「TDDB」

僕がオーナーをやりました。もともとTDDの実演という感じだったんですが、 すぐに終わってしまいそうだったので、前半セッションの続きでDBの話もやろうということで、 TDD + DBなセッションでした。

TDDについては、railsコマンドでサンプルアプリを作り、zsh/screen/vimで開発。 お馴染みのredgreen+autotestでライブコーディングしました。

続いて前半セッションの続きでARとDB設計の話。 カラム不要論、CRUDのUD不要論、DBの負荷分散、YamazさんによるPostgressの2層コミットの話、などなど、非常に面白い内容でした。

最後は、script/renameの設計を10分ぐらいでやろうといろいろ知恵を出し合ってみたのですが、 実際なかなか難しいことが判明。evalできる言語は難しい。

■懇親会

今回は会場の予約が無かったので、ロデオでおなじみのZESTに行きました。 ogijunさんが恒例のあとで来るメソッドで合流し、高橋さん、大森さんたちとRubyの将来について話したりしていました。非常に濃い話ができて楽しかったです。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/159

posted by Png genki on Mon 22 Jan 2007 at 09:26
20th Sat

rake svn:commit

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/158

馬場さんが書いてるやつをちょっと修正したもの。

   1  desc 'Commit to the repository safely.'
   2  task :commit =&gt; [
   3    :up,
   4    :'db:migrate',
   5    :test,
   6    :'test:plugins',
   7  ] do
   8    if msg = ENV['M']
   9      msg.gsub!(/\"/, '\"')
  10      system %Q{svn ci #{RAILS_ROOT} -m "#{msg}"}
  11    else
  12      system "svn ci #{RAILS_ROOT}"
  13    end
  14  end
  15  
  16  desc 'Update working copy.'
  17  task :up do
  18    system "svn up #{RAILS_ROOT}"
  19  end
テストが成功したときだけコミットします。結構便利ですよ。

[English Version]

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/158

posted by Png genki on Sat 20 Jan 2007 at 22:04

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/157

redgreenは、テスト結果の出力をカラフルにしてくれるRubyGemsです。 (詳しくはRailsのテストでRed Green Yellow参照。)

とてもテストを書くのが楽しくなって便利なので、 Railsプラグインのテスト結果に対しても、色づけをするプラグインを作ってみました。

http://svn.labs.drecom.jp/rails/plugins/trunk/redgreen_plugin_testing/
redgreenを導入後、このプラグインをインストールするだけで、
$ rake test:plugins
の結果が色づけされます(Rails-1.2RC)。

[English Version]

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/157

posted by Png genki on Fri 19 Jan 2007 at 16:14

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/156

Railsでは、config/routes.rbファイルでURIとコントローラ&アクションのマッピングを行いますが、URIを分解してセグメントに分けるためのセパレータは、デフォルトでは次の文字になっています(Rails-1.2RC1)

ActionController::Routing::SEPARATORS
=> ["/", ";", ".", ",", "?"]
セパレータとなる文字を追加するためには、config/environment.rbの中で、ActionController::Routing::SEPARATORSに要素を追加すればOKです。
ActionController::Routing::SEPARATORS << '@'
これでconfig/routes.rbのなかで'@'をセパレータとして使用することができます。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/156

posted by Png genki on Tue 16 Jan 2007 at 15:26