と言いつつ、自分ではMongrel使ってない(主にlighttpd)のですが、 RailsChatでshachiさん、くまくまーのmaihaさん、笹田さん、のりおさんと話してた時に出てきた、最近のWebサーバのメモ。

あとで試す。

話は変わりますが、上述のプログラムの大半の実装はCで書かれていて、 インターフェイスの部分だけRubyで実装されている感じのものが 多いですね。これこそがRubyの真骨頂だと思う。

いろんな言語を使ってきたけれど、 最近はCとRubyの組み合わせが良い感じです。 C言語用の高性能プリプロセッサ兼UI記述スクリプト だと思えばRubyの遅さ気にならない。 CとRubyの相性の良さはとても素晴らしい。 Rubyの拡張をCで書くまでは、Rubyの楽しさの半分しか 見えてなかったと思う。

C++(template)とHLSLというのも中々面白い組み合わせだった。

柔の言語と剛の言語を組み合わせて使うのが生産性を高めるのに 良いのではないかと思う。

posted by Png genki on Tue 5 Feb 2008 at 22:27

以前紹介したRakがバージョンアップしたようです。

Rak

Rak is a grep replacement in pure Ruby. It accepts Ruby syntax regular expressions and automatically recurses directories, skipping .svn/, .cvs/, pkg/ and more things you don't care about. It is based on the Perl tool ack by Andy Lester.

Patchを送った問題も修正されているようです。変更点は以下のとおり。

0.9 / 2008-02-03

  • Added .rake to ruby files
  • Colouring works on Win32 if win32console gem is installed.
  • Checks that file is readable by the current user.
  • Ignores socket files.
  • Added .erb and .haml to Ruby filetypes.
  • Added search at end-of/start-of line options
  • Fixed searching up the directory tree when passed '.'
posted by Png genki on Mon 4 Feb 2008 at 11:50

早速、RubyでGoogleの SocialGraph API を利用するためのライブラリが リリースされたようです。

Ruby gem for Google SocialGraph released

We’ve cooked up a Ruby library to talk to the SocialGraph API, and get really interesting info out of it. This is the sort of thing that’s always more useful if more people have access to it, so even better, we’ve licensed it under the LGPL, so you can get all that Google goodness without having to do anything tedious to get it.

新しい技術を利用するライブラリがすぐに出てくるのは嬉しいですね。

posted by Png genki on Mon 4 Feb 2008 at 01:33

原因については調査し切れていないのですが、何らかの理由で RubyGemsをインストールしたときに、Gemのバージョン番号の末尾に 本来あるはずの無い「-」がついた状態でインストールされてしまう 事があるようです。

この問題が発生すると、「-」が付加されたバージョンのGemの存在が 正しく認識されず、ひとつ古いバージョンが中途半端にactivateされて しまい、全体としてアプリケーションが正常に動作しなくなる 事があるようです。

一旦問題の発生しているGemを削除してから、再度インストールを 行うことで問題は解決しますが、gem uninstallコマンドでは 正常にアンインストールが行われない場合もあるようです。 その場合は、RubyGemsがインストールされているディレクトリ (/usr/local/lib/ruby/gems/1.8/gems/など)から手作業で 該当するファイル群を削除する必要があるかもしれません。

posted by Png genki on Mon 4 Feb 2008 at 01:25
3rd Sun

雪景色

珍しく雪が積もっている。

snow_2008_2_3

posted by Png genki on Sun 3 Feb 2008 at 13:57

Railsのテストフレームワークには、Mockを利用する仕組みがあります。 しかし、通常の方法でMockクラスを作成すると、オリジナルのクラスを 完全に置き換えてしまうため、すべての実装をテスト用に 書き直さなければならなくなってしまいます。

そこで、テスト用に改変したい場所だけMockで上書きし、その他の 動作はオリジナルに委譲する方法を紹介します。

   1  require_dependency 'models/foo'
   2  
   3  class Foo
   4    def bar
   5      puts 'baz'
   6    end
   7  end

上記のように、require_dependencyを使ってapp ディレクトリ以下のファイルを参照することで、Fooクラスのbar メソッドの挙動だけを置き換えることができるようになります。

posted by Png genki on Fri 1 Feb 2008 at 12:16

UnitTestやFunctionalTestの中から参照するファイルをどこに置くべきか という疑問について、明確な回答を用意できていなかったのですが、 Railsのソースの中で答えらしきものを見つけたので紹介します。

actionpack/lib/action_controller/test_process.rb L325

   1    # Usage example, within a functional test:
   2    #   post :change_avatar, :avatar => ActionController::TestUploadedFile.new(Test::Unit::TestCase.fixture_path + '/files/spongebob.png', 'image/png')

このExampleによると、test/fixtures/filesというディレクトリを作り、 その中にファイルを置いているようです。

posted by Png genki on Fri 1 Feb 2008 at 00:33

[Ruby] [:name, :yomi] から {:name=>"maiha", :yomi=>"maiha"} を作りたい

最初に思いついたのは、inject

array = [:name, :yomi]
array.inject({}){|h,i| h[i] = "maiha"; h}
=> {:name=>"maiha", :yomi=>"maiha"}

"; h" が冗長で悔しいのよね。

injectでもこんな感じに書けばシンプルにできますよ。

   1  >> [:name, :yomi].inject({}){|h,k| h.merge(k => "maiha")}
   2  => {:name=>"maiha", :yomi=>"maiha"}

Hashinjectmergeと相性がいい。

posted by Png genki on Sun 27 Jan 2008 at 06:45

ActiveSupportでは、メソッドの途中で戻り値を指定するための returningというメソッドがObjectクラスに定義されています。 これを使うと、以下のようにメソッドの最後の式の値が何になるかを 気にせずに記述することができます。

   1  def foo
   2    returning Article.find(parmas[:id]) do |article|
   3      article.foo = 'bar'
   4      article.save
   5    end
   6  end

これと同様のことを、Rubyにあらかじめ用意されているensure を使っても実現可能です。

   1  def foo
   2    article = Article.find(params[:id])
   3  ensure
   4    article.foo = 'bar'
   5    article.save
   6  end

ブロックの値がensureの値を無視する事を利用しています。

posted by Png genki on Sat 26 Jan 2008 at 20:13

rttool 1.0.2.0のgem installに失敗して困ったので記事にしてみます。

RTtoolとは

RTtoolはシンプルな作表ツール。
http://www.rubyist.net/~rubikitch/computer/rttool/

gem installで失敗

   1  gem install rttool
   2  ERROR:  While executing gem ... (Errno::ENOENT)
   3      No such file or directory - /usr/local/bin/rt/rdrt2

ぐぐってルビ吉さんのサイトで解決

下記で解決。tar.gzファイルを落としてインストールすればOKです。
http://www.rubyist.net/~rubikitch/computer/rttool/#3

   1  wget http://www.rubyist.net/~rubikitch/archive/rttool-1.0.2.tar.gz
   2  tar xzvf rttool-1.0.2.tar.gz
   3  cd rttool-1.0.2
   4  ruby setup.rb config
   5  ruby setup.rb setup
   6  ruby setup.rb install

posted by Png satoko on Fri 25 Jan 2008 at 17:26