こんにちは、モリモルです。
morimoru@ubuntu:~$ ruby -e '$:.each{|path| puts path}'
/usr/local/lib/ruby/site_ruby/1.8
/usr/local/lib/ruby/site_ruby/1.8/i686-linux
/usr/local/lib/ruby/site_ruby
/usr/local/lib/ruby/vendor_ruby/1.8
/usr/local/lib/ruby/vendor_ruby/1.8/i686-linux
/usr/local/lib/ruby/vendor_ruby
/usr/local/lib/ruby/1.8
/usr/local/lib/ruby/1.8/i686-linux
.
morimoru@ubuntu:~$ gem environment gemdir
/usr/local/lib/ruby/gems/1.8
morimoru@ubuntu:~$ gem environment gempath
/home/morimoru/.gem/ruby/1.8:/usr/local/lib/ruby/gems/1.8
編集中・・・
2009年1月23日金曜日
2009年1月10日土曜日
クラスとか
こんにちは。モリモルです。
Rubyのクラスについて頭の中のイメージを図にしてみました。
これで良いのかな?間違ってるかもしれません。。
Objectクラス
Objectクラスはすべてのクラスのスーパークラスです。
Class#superclassでさかのぼって行くとObjectクラスにたどり着きます。
ObjectクラスにClass#superclassをするとnilが返ってきます。
Classクラス
Classクラスは「クラスのクラスです」
この「クラスのクラス」といのがイメージしにくいですよね。。
「クラスがクラスを持つ」ということは、Rubyではクラスもオブジェクトということになるようです。
つまり、SringクラスはClassクラスのインスタンスということになります。
Classクラスに定義されたClass#superclassインスタンスメソッドをSringをレシーバーとして使えるわけですよね。
Classクラスもオブジェクトで、そのクラスは自身を指しているようです。
なので、Classをレシーバーとしてsuperclassメソッドが使えるということかな。
Class#superclass
ごくごく当然なのですが、"abc"だったり、KernelをレシーバーにするとClass#superclassには辿り着けないようです。クラスじゃないからスーパークラスを返せないというより、そのメソッドにたどり着けないということですよね。
Module#ancestors
Moduleクラスに定義されたインスタンスメソッドは、すべてのモジュール&クラスをレシーバーにして使えるようです。
Moduleがレシーバの場合はClass経由でグルっと回って使えるというイメージなのかな。
"abc"からはたどり着けないようです。
Objectクラスのインスタンスメソッド
Object#object_id、Object#class、Object#instance_of?、Object#kind_of? とか。
Objectクラスのインスタンスメソッドはすべてのオブジェクトをレシーバーとして使えるようです。
Rubyのクラスについて頭の中のイメージを図にしてみました。
これで良いのかな?間違ってるかもしれません。。
Objectクラス
Objectクラスはすべてのクラスのスーパークラスです。
Class#superclassでさかのぼって行くとObjectクラスにたどり着きます。
irb(main):251:0* String.superclass
=> Object
irb(main):252:0> Class.superclass.superclass
=> Object
irb(main):254:0> Fixnum.superclass.superclass.superclass
=> Object
ObjectクラスにClass#superclassをするとnilが返ってきます。
irb(main):261:0* Object.superclass
=> nil
Classクラス
Classクラスは「クラスのクラスです」
この「クラスのクラス」といのがイメージしにくいですよね。。
「クラスがクラスを持つ」ということは、Rubyではクラスもオブジェクトということになるようです。
irb(main):303:0* String.class
=> Class
irb(main):304:0> String.object_id
=> -605238788
つまり、SringクラスはClassクラスのインスタンスということになります。
Classクラスに定義されたClass#superclassインスタンスメソッドをSringをレシーバーとして使えるわけですよね。
Classクラスもオブジェクトで、そのクラスは自身を指しているようです。
なので、Classをレシーバーとしてsuperclassメソッドが使えるということかな。
irb(main):289:0* Class.class
=> Class
irb(main):290:0> Class.superclass
=> Module
Class#superclass
ごくごく当然なのですが、"abc"だったり、KernelをレシーバーにするとClass#superclassには辿り着けないようです。クラスじゃないからスーパークラスを返せないというより、そのメソッドにたどり着けないということですよね。
irb(main):318:0* "abc".superlcass
NoMethodError: undefined method `superlcass' for "abc":String
from (irb):318
from :0
irb(main):319:0>
irb(main):320:0* Kernel.superclass
NoMethodError: undefined method `superclass' for Kernel:Module
from (irb):320
from :0
irb(main):321:0>
Module#ancestors
Moduleクラスに定義されたインスタンスメソッドは、すべてのモジュール&クラスをレシーバーにして使えるようです。
Moduleがレシーバの場合はClass経由でグルっと回って使えるというイメージなのかな。
irb(main):349:0* Module.ancestors
=> [Module, Object, Kernel]
"abc"からはたどり着けないようです。
irb(main):368:0* "abc".ancestors
NoMethodError: undefined method `ancestors' for "abc":String
from (irb):368
from :0
Objectクラスのインスタンスメソッド
Object#object_id、Object#class、Object#instance_of?、Object#kind_of? とか。
Objectクラスのインスタンスメソッドはすべてのオブジェクトをレシーバーとして使えるようです。
irb(main):358:0* "abc".object_id
=> -605469638
irb(main):359:0> Object.object_id
=> -605233518
irb(main):360:0> Kernel.object_id
=> -605233578
2009年1月3日土曜日
WEBrick::HTTPServlet::CGIHandlerを使ってみました。
こんにちは、モリモルです。
WEBrickでCGIを動かしてみます。
使い方は、以前の自作サーブレットと同じような感じで、
HTTPServer#mount("URL", HTTPServlet::CGIHandler, "Rubyスクリプトへのパス")
第一引数のURLにアクセスがあるたびに、
第二引数のインスタンスを生成して、HTTPServlet::AbstractServlet#serviceを呼び出すようです。
第三引数のRubyスクリプトはHTTPServlet::CGIHandlerのコンストラクタに引数として渡されます。
では、簡単なCGIを作ってアクセスしてみます。
/var2/www/cgi/foo.rb
server.rb
ブラウザから“http://192.168.91.128:20080/cgi”にアクセスしてみます。
表示されましたね。
WEBrickでCGIを動かしてみます。
使い方は、以前の自作サーブレットと同じような感じで、
HTTPServer#mount("URL", HTTPServlet::CGIHandler, "Rubyスクリプトへのパス")
第一引数のURLにアクセスがあるたびに、
第二引数のインスタンスを生成して、HTTPServlet::AbstractServlet#serviceを呼び出すようです。
第三引数のRubyスクリプトはHTTPServlet::CGIHandlerのコンストラクタに引数として渡されます。
では、簡単なCGIを作ってアクセスしてみます。
/var2/www/cgi/foo.rb
1 #!/usr/local/bin/ruby
2
3 require 'cgi'
4
5 cgi = CGI.new
6 print cgi.header({"type" => "text/html", "status" => "OK"})
7 print DATA.read
8
9 __END__
10 <html>
11 <body>
12 <h1>foo.rb</h1>
13 </body>
14 </html>
server.rb
1 #! /usr/local/bin/ruby
2 require 'webrick'
3 include WEBrick
4
5 server = HTTPServer.new(
6 :DocumentRoot => "/var2/www/html",
7 :Port => 20080,
8 :BindAddress => "myhost")
9
10
11 server.mount("/cgi", HTTPServlet::CGIHandler, "/var2/www/cgi/foo.rb")
12
13 trap("INT"){server.stop}
14
15 server.start
ブラウザから“http://192.168.91.128:20080/cgi”にアクセスしてみます。
表示されましたね。
2009年1月2日金曜日
WEBrickで“Cannot assign requested address”
明けましておめでとうございます。モリモルです。
正月休みを利用して、CentOSからUbuntuに乗り換えました。
乗り換えた後のWEBrickサーバーを起動で、“Cannot assign requested address”とエラーが出た際のメモです。
今までは、直接IPアドレスを入れていたのですが、
/etc/hostsに記述してあるホスト名に変更したら問題なく動きました。
server = HTTPServer.new(
:DocumentRoot => "/var2/www/html",
:Port => 20080,
:BindAddress => "myhost")
# :BindAddress => "192.168.91.128")
正月休みを利用して、CentOSからUbuntuに乗り換えました。
乗り換えた後のWEBrickサーバーを起動で、“Cannot assign requested address”とエラーが出た際のメモです。
今までは、直接IPアドレスを入れていたのですが、
/etc/hostsに記述してあるホスト名に変更したら問題なく動きました。
server = HTTPServer.new(
:DocumentRoot => "/var2/www/html",
:Port => 20080,
:BindAddress => "myhost")
# :BindAddress => "192.168.91.128")
登録:
投稿 (Atom)