2009年1月23日金曜日

RubyGemsについて

こんにちは、モリモルです。


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月10日土曜日

クラスとか

こんにちは。モリモルです。

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

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")