カテゴリ:Ruby( 173 )

アイディアプロセッサーでスニペット管理

プログラム言語を習得するときに一番便利なのは、動作確認済みのスニペットをたくさん持っておくことだ。

これらのスニペットは一般にはテキストファイルとして管理しているだろう。しかし、テキストファイルは中身を見るのにエディタを使っていちいち開かなければならないし、検索も手軽にはできない。

今回たまたま、アイディアプロセッサ gjots2 と Nami2000 のことを知り、使い方を練習しているうちにこのソフトがスニペット管理に非常に便利だということに気がついた。アイディアプロセッサの使い方については前回の記事で述べたのでここではふれないが、Ubuntu で jots2 を使って Ruby のスニペットを管理して見たので記事にしてみた。

次の図が、jots 2 に Ruby のスニペットを入力した状態だ。左側のペインにスニペットの名前、右側にスニペットの本体を記入してある。Jots2 の場合、Tree メニューの New Page を選択して新しいページを挿入したとき第1行目に記入したものが自動的に左側のペインの項目名になる。
d0038298_18312975.jpg

後で一覧する時はこの項も区項目名をクリックすると、その内容が右側に表示されるので、簡単にコードの閲覧を行うことができる。

また、コードを選択してクリップボードにコピーしておき、irb のコマンドラインにペーストしてやると動作を確認することができる。また、C言語のプログラムの場合などは空のテキストファイルにコピーするとコンパイルして実行できる。

次の例は、先ほどの画像のプログラムを、irb にペーストして実行させた例だ。

$ irb
irb(main):001:0> begin
irb(main):002:1* total = 0
irb(main):003:1> print "number = "
irb(main):004:1> n = gets.to_i
irb(main):005:1> for i in 1..n
irb(main):006:2> total += i
irb(main):007:2> end
irb(main):008:1> puts "total = #{total}"
irb(main):009:1> end
number = 10
total = 55
=> nil

プログラム言語習得のためのスニペット集めがこれで随分簡単になるような気がする。
[PR]
by tnomura9 | 2010-01-11 18:06 | Ruby | Comments(0)

SWIG

自分で作ったC言語の関数をRubyで使えたら便利だが、拡張ライブラリを作るのは少々敷居が高い。しかし、SWIGというアプリケーションを使うと、C言語のヘッダーから自動的に拡張ライブラリを作ることができる。

Ubuntu で SWIG を利用するための準備としては、SWIGのインストールと、拡張ライブラリを作るためのRubyのヘッダファイルのインストールが必要だ。どちらも、Synaptic で行うことができる。swig パッケージと libruby-dev パッケージをインストールしておく。

次に使いたい関数をCで記述した example.c を作り、gcc -c example.c でオブジェクトファイル example.o を作る。

/* File : example.c */

/* Compute factorial of n */
int fact(int n) {
    if  (n <= 1) return 1;
    else return n * fact(n-1);
}

/* Compute n mod m */
int my_mod(int n, int m) {
    return(n % m);
}

次に、example.c のヘッダーファイルにSWIGのディレクティブを付け加えた example.i を作る。

/* File : example 1 */
%module example
%{
/* Put headers and other declarations here */
%}

extern int fact(int);
extern int my_mod(int n, int m);

このファイルを使って、swig -ruby example.i でラッパープログラムのファイル example_wrap.c を作る。さらに、gcc -c example_wrap.c -I/usr/lib/ruby/1.8/i486-linux でコンパイルしてオブジェクトファイル example_wrap.o をつくる。

最後に、gcc -shared -o example.so example.o example_wrap.o で shared library の example.so を作る。

この、example.so を require すると、Example モジュールの関数、fact() と my_mod() が使えるようになる。

$ irb
irb(main):001:0> require 'example.so'
=> true
irb(main):002:0> include Example
=> Object
irb(main):003:0> fact 5
=> 120
irb(main):004:0> my_mod 5,3
=> 2

これで、ユーザインターフェースはRubyで記述し、速度の必要な処理はC言語でプログラムするという使い勝手の良いプログラミングが誰にでもできるようになる。

C#にしても、SWIGにしても、だんだん共通に使う部品は単に組み合わせるだけで作れるようにして、本当に必要な部分だけをプログラミングできるという開発効率の高い手段が得られるようになってきている。

この傾向を見て分かるのは、プログラムを作るときに、ユーザーインターフェースのように、共通な部分がひどく多く、ユニークな部分は実は少ししかない場合が多いということだ。この、共通な部分の部品化がだんだん進んできたために、少ない労力でプログラムを作ることができるようになってきている。

これからは、プログラム言語のどれが優れているという議論ではなく、部品化されたモジュールを活用して、本当に必要な部分にだけ力を集中するにはどうしたら良いかという議論がなされていくのではないだろうか。

C#の良いところは、このような部品の利用と、低レベルのプログラミングがシームレスに行われるということだろう。これからC#が普及していくのかどうかは予測できないが、魅力のあるプログラミング言語だと思う。
[PR]
by tnomura9 | 2009-12-30 03:32 | Ruby | Comments(0)

delegate (委譲)

Ruby 標準ライブラリの tempfile.rb をのぞいたら、require 'delegate' となって、delegate (委譲) が使われていた。

Ruby リファレンスマニュアルの説明では

メソッドの委譲(delegation)を行う。

Delegatorクラスは指定したオブジェクトにメソッドの実行を委譲する。 Delegatorクラスを利用する場合はこれを継承して__getobj__メソッドを再定義して委譲先のオブジェクトを指定する。

SimpleDelegatorはDelegatorの利用例の一つであり、コンストラクタに渡されたオブジェクトにメソッドの実行を委譲する。

関数DelegateClass(supperclass)はsuperclassクラスのオブジェクトをひとつとり、そのオブジェクトにインスタンスメソッドを委譲するクラスを定義して返す。


何回読んでもさっぱりわからないので今まで敬遠していたが、サンプルとしてベクトルの計算をするプログラムを作ってみたら何となくわかったような気がした。

まず、ベクトルは Array クラスを利用すれば配列として表すことができる。しかし配列の足し算をすると、[1,2] + [3,4] = [1, 2, 3, 4] となってベクトルの計算はできない。

それならということで、ベクトル専用のクラスを作ってもいいが、a[1] のようなものもメソッドで定義しなくてはいけなくなる。

そこで、delegate (委譲)を利用して Array クラスのメソッドを Vector クラスのオブジェクトで使えるようにすればずいぶん手抜きができる。delegate は Delegator クラスを継承する方法、SimpleDelegator を使う方法、DelegateClass() 関数を使う方法の3つがあるが、そのうちの DelegateClass() 関数を使う方法を試してみた。

DelegateClass() を使ってVectorクラスのオブジェクトをArrayクラスに移譲するには、次のようにする。

class Vector < DelegateClass(Array)

つまり定数 Array を DelegateClass() 関数の引数にして呼び出すと、Arrayクラスに移譲するためのクラスができる。そこで、そのクラスから継承させて Vector クラスを作ると、Vector クラスのオブジェクトはすべてArrayクラスのメソッドが使えてしまうというわけだ。

実は次のように、DelegateClass(Array) を継承するだけで、Vectorクラスのオブジェクトを作ることができてしまう。

C:\Users\******\Ruby>irb
irb(main):001:0> require 'delegate'
=> true
irb(main):002:0> class Vector < DelegateClass(Array)
irb(main):003:1> end
=> nil
irb(main):004:0> a = Vector.new([1,2])
=> [1, 2]
irb(main):005:0> a[0]
=> 1

しかし、a = Vector.new のように引数なしの使い方もしたいし、initialize メソッドを定義してみた。

def initialize(obj = [])
  super(obj)
end

iniitalize メソッドの引数を上位クラスに渡すだけだから楽なものだ。

つぎに、ベクトルの加算を定義した。

def +(other)
  result = Vector.new
  for i in 0...self.size
    result << self[i] + other[i]
  end
  result
end

たったこれだけのプログラムで、ベクトルの足し算ができるようになった。今までのプログラムを、vector.rb という名前で保存した。

ファイル名: vector.rb

require 'delegate'

class Vector < DelegateClass(Array)
  def initialize(obj=[])
    super(obj)
  end

  def +(other)
    result = Vector.new
    for i in 0...self.size
      result << self[i] + other[i]
    end
    result
  end
end

irb で実行してみた。

irb(main):001:0> require 'vector'
=> true
irb(main):002:0> a = Vector.new([1,2])
=> [1, 2]
irb(main):003:0> b = Vector.new([3,4])
=> [3, 4]
irb(main):004:0> a + b
=> [4, 6]

自分でメソッドを定義しなくても委譲しさえすれば、すぐに自作のクラスのオブジェクトを操作できるようになるのだから便利なものだ。わけのわからなかった delegate (委譲)だが、ずいぶん便利な道具だったのだ。
[PR]
by tnomura9 | 2008-11-20 19:14 | Ruby | Comments(0)

Beautiful Code

『Beautiful Code (ビューティフルコード)』 Andy Oram, Greg Wilson 編を読んだ。

残念ながら、管理人の知識では読みこなせなかった。「美しいコード」という言葉はよく聞いていたが、一流のプログラマーたちの考える美しさが多様なのに驚いた。無駄を省いたコンパクトなコードを美しいとい人もあるし、コードは少々長くなっても実行速度の速いコードを紹介する人もあるかと思えば、読みやすさこそが美しさだと主張する人もあり、また、大規模なソフトウェアが高信頼性で動くのを美しいと感じる人もある。

しかし、それらの主張には共通するものがあるように感じられた。つまり、コードの美しさとはコードの簡潔さや単なる読みやすさによるものではなく、問題を「あざやかに」解決するやり方に対して感じられるものであるということだ。Rubyのイテレータは、見た目の読みやすさを提供するので美しいのではなく、オブジェクトの要素をひとつずつ取り出してブロックに渡すという概念が巧妙なのだ。

この本の冒頭ではカーニハンによる記事があり、ロブの作った基本的な正規表現の処理プログラムを行う30行のCプログラムが紹介してあった。たった30行のCプログラムで、冒頭マッチ、末尾マッチ、繰り返しのある正規表現のマッチを実行できてしまうが、このプログラムがこのような芸当をすることができるのは、ポインタと再帰呼び出しを巧妙に組み合わせてあるからだ。

ところで、正規表現のオートマトンもCのポインタも再帰呼び出しも実はアルゴリズムだ。美しいコードの秘密はアルゴリズムやその組み合わせのやり方のスマートさにあったのだ。
[PR]
by tnomura9 | 2008-11-16 22:05 | Ruby | Comments(0)

irb を shell として使う

edit.rb を使うと、irb 上で Ruby のプログラム開発ができるようになったので、irb から出るのが面倒くさくなった。それで、irb を shell として使う方法はないかといろいろと考えてみた。

まず、カレントディレクトリを表示してみた。

C:\Users\ganesh>irb
irb(main):001:0> Dir.pwd
=> "C:/Users/ganesh"

カレントディレクトリを変更した。

irb(main):002:0> Dir.chdir 'Ruby'
=> 0

カレントディレクトリのファイルのリストをとった。

irb(main):003:0> Dir.glob '*'
=> ["a.txt", "aa.txt", "aminoacid.rb", "aminoacid.txt", "array_grep.rb", "c2r.rb", "code.rb", "cv.rb", "easydb.rb", "easydb.txt", "easydb2.rb", "easydb2.txt", "edb.rb", "edit.rb", "names.txt", "open-uri.txt", "pick.rb", "picker.db", "redirect.rb", "sample.db", "sample.rb", "sample.txt", "seiseki.txt", "srb.rb", "stat.txt", "temp.txt", "to_array.rb", "ubin.db", "utf8com.rb"]

Dir クラスのメソッドのリストをとった。

irb(main):002:0> (Dir.methods - Class.methods).sort
=> ["[]", "chdir", "chroot", "delete", "entries", "foreach", "getwd", "glob", "mkdir", "open", "pwd", "rmdir", "unlink"]

ファイルをソートして表示した。

irb(main):005:0> puts File.readlines('aminoacid.txt').sort
Alanine ,Ala,A,nonpolar,neutral , 1.8
Arginine ,Arg,R,polar ,basic (strongly),-4.5
Asparagine ,Asn,N,polar ,neutral ,-3.5
Aspartic acid,Asp,D,polar ,acidic ,-3.5
Cysteine ,Cys,C,nonpolar,neutral , 2.5
Glutamic acid,Glu,E,polar ,acidic ,-3.5
Glutamine ,Gln,Q,polar ,neutral ,-3.5
Glycine ,Gly,G,nonpolar,neutral ,-0.4
........

ほかにもいろいろ面白いことができそうだが、今日はこれで。
[PR]
by tnomura9 | 2008-11-14 22:48 | Ruby | Comments(0)

irb でリダイレクトを使う redirect.rb

手前味噌だが、irb で edit.rb を利用すると、Ruby の勉強がかなり楽になる。

次の例のように、変数にプログラムを記述すると、プログラムのテストは eval foo で簡単にできるし、puts foo でプログラムの内容をすぐに確認することができる。

これに比べて、通常のファイルを作成するやり方では、ファイル名を考えたり、エディタに入ったり出たりする手間が、snippet のような短いプログラムを試すのには煩雑に感じる。

edit.rb の利用例

C:\Users\********\Ruby>irb
irb(main):001:0> require 'edit'; include Edit
=> Object
irb(main):002:0> prog = edit
=> "for i in 1..10\n for j in 1..i\n print '*'\n end\n puts\nend"
irb(main):003:0> puts prog
for i in 1..10
  for j in 1..i
    print '*'
  end
  puts
end
=> nil
irb(main):004:0> eval prog
*
**
***
****
*****
******
*******
********
*********
**********
=> 1..10

ただ、この方法では外部との入出力のあるプログラムを作成できないのが、難点だ。

コマンドライン引数を ARVG で引き受けるようなプログラムなら、ARVG = %w(foo bar) のように直接代入したあと irb のプロンプトで eval prog すればよい。しかし、入力をリダイレクトで受け取るプログラムの場合はどうすればいいのだろうか。

答えは、$stdin にファイルハンドルを代入するといい。

次のスクリプトは、変数に入っているフィルタプログラムにファイルをリダイレクトさせるためのスクリプトだ。

ファイル名: redirect.rb (openは半角英数に変換して使用)

def redirect(prog, source)
  f = open(source)
  $stdin = f
  eval prog
  $stdin = STDIN
  f.close
end

メソッド redirect の第1引数はプログラムの入っている変数。第2引数はファイル名を表す文字列だ。

実行例を次に示す。

C:\Users\********\Ruby>irb
irb(main):001:0> require 'edit.rb'; include Edit
=> Object
irb(main):002:0> require 'redirect.rb'
=> true
irb(main):003:0> prog = edit
=> "while (line = gets)\n  puts line\nend"
irb(main):004:0> puts prog
while (line = gets)
  puts line
end
=> nil
irb(main):005:0> redirect(prog, 'redirect.rb')
def redirect(prog, source)
  f = open(source)
  $stdin = f
  eval prog
  $stdin = STDIN
  f.close
end
=> nil

これで、書籍やウェブなどにあるかなりのサンプルプログラムを irb 上で試してみることができるようになった。
[PR]
by tnomura9 | 2008-11-12 19:38 | Ruby | Comments(0)

RoR 2.x の scaffold を使ったウェブアプリケーションの作り方

script/console でデータベースを操作するために、もう一度 scaffold を使ったウェブアプリケーションの作り方をおさらいする。scaffold は RoR 2.x のものを使うので、標準のデータベースは sqlite3 を使うので、sudo gem install sqlite3-ruby で sqlite-3 をインストールしておく必要がある。

まず、Rails のプロジェクトを作る。
~/console/rails$ rails demo

demo ディレクトリに移動して、scaffold で hero というモデルを作る。
~/console/rails$ cd demo
~/console/rails/demo$ script/scaffold hero name:string sex:string age:integer

データベースに Sqlite3 を使う場合はフィールドの定義も一度にできてしまうが、rake db:migrate は必要だ。
~/console/rails/demo$ rake db:migrate

後は、いつもの手順で script/server を起動すれば良い。
~/console/rails/demo$ script/server

最後はブラウザで、http://localhost:3000/heros にアクセスすると、ウェブアプリを使用できてしまう。script ディレクトリの中のコマンドの中身を見たりしているので、自分が何をやっているのかというイメージが湧くようになってきたので少し気が楽だ。

ついでにブラウザで次のようなデータを入れておく。

Listing heros
Name Sex Age
Spiderman male 18 Show Edit Destroy
Wonderwoman female 31 Show Edit Destroy
Superman male 25 Show Edit Destroy

これだけの準備が済んだら、一旦サーバーを Ctrl + C で止める。

ここからが本題だが、再度 script/console を起動する。
~/console/rails/demo$ script/console
Loading development environment (Rails 2.1.1)
>>

RoR の CoC(convention over configuration) や MVC(model view controller) の解説は参考書にまかせることにして、heros テーブルのデータは Hero クラスのメソッドで操作できる。そこで、Hero.find(id) メソッドを scirpt/console 上で使ってみることにする。

>> Hero.find(1)
=> #<Hero id: 1, name: "Spiderman", sex: "male", age: 18, created_at: "2008-11-03 00:16:34", updated_at: "2008-11-03 00:16:59">

すると、テーブル heros の id=1 の行のデータをオブジェクトとして取り出すことができた。つまり、ActiveRecord や ActiveHelper などを利用して様々な処理が script/console 上で出きることがわかる。これらの解説を読んで実際にコンソール上で試してみることができるようだ。

Ruby on Rails を Ruby で書かれているが全く別のフレームワークだと考えるのと、RoR といえどもやはり Ruby のプログラムで、他のRubyのプログラムを扱うのと同じ発想で考えることができるのだと考えるのでは、垣根の高さがずいぶん違うような気がする。

RoR に関して長々とプログラムネタを扱ってきたが、つかみ所のなかった RoR の姿が何となく分かって来たような気がしてきたので一連の記事の終了としたい。
[PR]
by tnomura9 | 2008-11-03 10:40 | Ruby | Comments(0)

RoR 特定のクラス固有のメソッド

Class.method でクラス共通のメソッドのリストを取得することができる。したがって、特定のクラス特有のメソッドのリストは、Foo.methods - Class.method で取得できる。RoRの特定のクラスのメソッドのリストを一覧するには次のようにする。

~$ cd console/rails/demo/
~/console/rails/demo$ script/console
Loading development environment (Rails 2.1.1)
>> puts (Date.methods - Class.methods).sort
_load
_parse
_strptime
ajd_to_amjd
ajd_to_jd
amjd_to_ajd
civil
civil_to_jd
commercial
commercial_to_jd
current
day_fraction_to_time
exist1?
exist2?
exist3?
exist?
existw?
gregorian?
gregorian_leap?
jd
jd_to_ajd
jd_to_civil
jd_to_commercial
jd_to_ld
jd_to_mjd
jd_to_ordinal
jd_to_wday
julian?
julian_leap?
ld_to_jd
leap?
mjd_to_jd
new!
new0
new1
new2
new3
neww
ns?
ordinal
ordinal_to_jd
os?
parse
strptime
time_to_day_fraction
today
tomorrow
valid_civil?
valid_commercial?
valid_date?
valid_jd?
valid_ordinal?
valid_time?
yesterday
zone_to_diff
=> nil

Dateクラスは、Ruby標準にはないので、RoR で追加されたものだ。yesterday, today, tomorrow などのメソッドが使えるようだ。

>> Date::yesterday
=> Sun, 02 Nov 2008
>> Date::today
=> Mon, 03 Nov 2008
>> Date::tomorrow
=> Tue, 04 Nov 2008

こうしてみると、RoR といえども普通の Ruby のプログラムで、self.class.constants で調べたモジュールやクラスを使えば、script/console で起動する irb で様々なオブジェクトを操作できることが分かる。データベースへのアクセスさえ可能だ。それについては次のエントリーで記述する。
[PR]
by tnomura9 | 2008-11-03 09:43 | Ruby | Comments(0)

RoR Class のメソッド

Ruby の基本的な使い方は new コンストラクタでクラスからオブジェクトを作ってそれを操作することになる。

オブジェクトにどういう操作をすることができるのかは、そのクラスのメソッドをみれば分かる。例えば A というクラスがあれば、A.methods あるいは、A.instance_methods でメソッドの名前のリストを取得することができる。

また、ユーザ定義の全てのクラスは、Class クラスを継承しているので、Classクラスのメソッドを引き継ぐことになる。したがって、Class クラスのメソッドを調べれば、Rails で使うオブジェクトに共通なメソッドを知ることができる。

このエントリーの最後の図1に、Rails の Class クラスのメソッドを表示させたが、かなり拡張されている。例えば、to_json や to_yaml が使えるようになっているので次の例のように、script/console 上では、オブジェクトを簡単に JSON や YAML の文字列に変換することができる。

~/console/rails/demo$ script/console
Loading development environment (Rails 2.1.1)
>> a = {'apple' => 1, 'orange'=> 2, 'lemon' => 3}
=> {"apple"=>1, "orange"=>2, "lemon"=>3}
>> puts a.to_json
{"apple": 1, "orange": 2, "lemon": 3}
=> nil
>> puts a.to_yaml
---
apple: 1
orange: 2
lemon: 3
=> nil

図1. Rails script/console の Class のメソッド

~$ cd console/rails/demo/
~/console/rails/demo$ ruby script/console
Loading development environment (Rails 2.1.1)
>> puts Class.methods.sort
<
<=
<=>
==
===
=~
>
>=
__id__
__send__
`
acts_like?
alias_attribute
alias_method_chain
allocate
ancestors
as_load_path
attr_accessor_with_default
attr_internal
attr_internal_accessor
attr_internal_naming_format
attr_internal_naming_format=
attr_internal_reader
attr_internal_writer
autoload
autoload?
b64encode
blank?
breakpoint
cattr_accessor
cattr_reader
cattr_writer
class
class_eval
class_inheritable_accessor
class_inheritable_array
class_inheritable_array_writer
class_inheritable_hash
class_inheritable_hash_writer
class_inheritable_reader
class_inheritable_writer
class_variable_defined?
class_variables
clone
const_defined?
const_get
const_missing
const_set
constants
copy_instance_variables_from
daemonize
dclone
debugger
decode64
decode_b
delegate
deprecate
deprecated_method_warning
deprecation_horizon
display
dup
duplicable?
enable_warnings
encode64
enum_for
eql?
equal?
extend
extend_with_included_modules_from
extended_by
find_hidden_method
freeze
frozen?
gem
hash
id
include?
include_all_modules_from
included_in_classes
included_modules
inheritable_attributes
inspect
instance_eval
instance_exec
instance_method
instance_methods
instance_of?
instance_values
instance_variable_defined?
instance_variable_get
instance_variable_names
instance_variable_set
instance_variables
is_a?
kind_of?
load
local_constant_names
local_constants
mattr_accessor
mattr_reader
mattr_writer
method
method_added
method_defined?
methods
model_name
module_eval
name
nesting
new
nil?
object_id
parent
parents
private_class_method
private_instance_methods
private_method_defined?
private_methods
protected_instance_methods
protected_method_defined?
protected_methods
public_class_method
public_instance_methods
public_method_defined?
public_methods
rails_original_const_missing
read_inheritable_attribute
remove_class
remove_subclasses
remove_subclasses_of
require
require_association
require_dependency
require_library_or_gem
require_or_load
reset_inheritable_attributes
respond_to?
returning
send
send!
silence_stderr
silence_stream
silence_warnings
singleton_methods
subclasses
subclasses_of
superclass
superclass_delegating_accessor
superclass_delegating_reader
superclass_delegating_writer
suppress
taguri
taguri=
taint
tainted?
to_a
to_enum
to_json
to_param
to_query
to_s
to_yaml
to_yaml_properties
to_yaml_style
type
unloadable
untaint
with_options
write_inheritable_array
write_inheritable_attribute
write_inheritable_hash
yaml_as
yaml_tag_class_name
yaml_tag_read_class
yaml_tag_subclasses?
[PR]
by tnomura9 | 2008-11-02 05:50 | Ruby | Comments(0)

RoR script/console $: (require のサーチパス)

script/console であらかじめロードされているライブラリ以外を利用するときは require でファイルを読み込む必要があるが、その時のサーチパスは $: というグローバル変数が保持している。それを、次のようにして表示させてみた。

~/console/rails/demo$ script/console
Loading development environment (Rails 2.1.1)
>> puts $:
/usr/lib/ruby/gems/1.8/gems/actionmailer-2.1.1/lib/action_mailer/vendor/text-format-0.6.3
/usr/lib/ruby/gems/1.8/gems/actionmailer-2.1.1/lib/action_mailer/vendor/tmail-1.2.3
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.1/lib/action_controller/vendor/html-scanner
/usr/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/active_support/vendor/tzinfo-0.3.9
/usr/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/active_support/vendor/memcache-client-1.5.0
/usr/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/active_support/vendor/xml-simple-1.0.11
/usr/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib/active_support/vendor/builder-2.1.2
/usr/lib/ruby/gems/1.8/gems/activesupport-2.1.1/lib
/home/********/console/rails/demo/app/controllers/
/home/********/console/rails/demo/app
/home/********/console/rails/demo/app/models
/home/********/console/rails/demo/app/controllers
/home/********/console/rails/demo/app/helpers
/home/********/console/rails/demo/config
/home/********/console/rails/demo/lib
/home/********/console/rails/demo/vendor
/usr/lib/ruby/gems/1.8/gems/rails-2.1.1/lib/../builtin/rails_info/
/usr/lib/ruby/gems/1.8/gems/rails-2.1.1/lib
/usr/lib/ruby/gems/1.8/gems/rake-0.8.3/bin
/usr/lib/ruby/gems/1.8/gems/rake-0.8.3/lib
/usr/lib/ruby/gems/1.8/gems/activesupport-2.1.1/bin
/usr/lib/ruby/gems/1.8/gems/activerecord-2.1.1/bin
/usr/lib/ruby/gems/1.8/gems/activerecord-2.1.1/lib
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.1/bin
/usr/lib/ruby/gems/1.8/gems/actionpack-2.1.1/lib
/usr/lib/ruby/gems/1.8/gems/actionmailer-2.1.1/bin
/usr/lib/ruby/gems/1.8/gems/actionmailer-2.1.1/lib
/usr/lib/ruby/gems/1.8/gems/activeresource-2.1.1/bin
/usr/lib/ruby/gems/1.8/gems/activeresource-2.1.1/lib
/usr/lib/ruby/gems/1.8/gems/rails-2.1.1/bin
/usr/local/lib/site_ruby/1.8
/usr/local/lib/site_ruby/1.8/i486-linux
/usr/local/lib/site_ruby/1.8/i386-linux
/usr/local/lib/site_ruby
/usr/lib/ruby/1.8
/usr/lib/ruby/1.8/i486-linux
/usr/lib/ruby/1.8/i386-linux
.

いろいろなところからファイルを持ってくるらしい。Rails の世界は広大だ。
[PR]
by tnomura9 | 2008-11-01 05:02 | Ruby | Comments(0)