Rubyレシピブック268の技 |
作成日: 2004-08-13 最終更新日: |
Rubyの本の中で、かゆい所に手が届く、という感じが最も強く出ている。 話題を絞っているところ、 章の頭に名文句を掲げているところは「たのしいRuby」と同じである。
帯には「Rubyの達人が小技、大技、裏技を大公開!!」とある。 大技はないと思うが、この本の性格をよく表している。
Rubyレシピブックサポートページ(www.notwork.org)があるのも親切だ。
第2刷で(2004-08-13現在)上記サポートページで説明されていない誤植を挙げておいたが、 2005-06-19現在これらの誤植がすべて上記サポートページに網羅されたので、ここからは削除した。
なお、2014-11-30 現在は第3版まで刊行されているが、第2版と第3版は未見である。
YAML というマーク付け言語は知らなかった。 調べてみたら、YAML Ain't Markup Language という、 人を食った略語であることがわかった。 http://www.yaml.org/を見れば、だいたいのことがわかるはずだ。
IP アドレスからホスト名を得る(逆引き)の関数を
def reverse_lookup(ip)
という名前で定義している。この関数では
Socket.getnameinfo を使っているが、
私の環境(Windows XP)では、次の表示が出て使えなかった。
c:/socket.rb:4:in `getnameinfo': getnameinfo: address family
for hostname not supported. (SocketError)
from c:/socket.rb:4
そこで、Socket.gethostbyname を使い次のように書き直してみた。
require "socket"
def reverse_lookup(ip)
Socket.gethostbyname(ip)[0]
end
すると、正しいホスト名を返す ip もあれば(たとえば、127.0.0.1 には localhost が帰る)、 次のように例外を出して止まってしまう IP もあった。(たとえば、192.168.1.254 という、 自分が使っていないプライベートアドレスなど)
c:/socket.rb:4:in `gethostbyname': NULL pointer given (ArgumentError) from c:/socket.rb:4
これは私の作ったプログラムのバグかもしれないと思った。 冷静に考えた結果、「これは単に逆引きできないだけの結果である」という結論に達した。 そこで例外が起こればこれを捕捉して、単に同じIPアドレスを返すだけの仕様にすればよいことにした。
require "socket"
def reverse_lookup(ip)
begin
return Socket.gethostbyname(ip)[0]
rescue ArgumentError
return ip
end
end
return はなくてよいはずだが、C 言語以来、return を書く癖が抜けない。
まりんきょ学問所 > Rubyの浮き輪 > Rubyレシピブック268の技