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版は未見である。

本文を読んでの感想

079 YAMLを解析する

YAML というマーク付け言語は知らなかった。 調べてみたら、YAML Ain't Markup Language という、 人を食った略語であることがわかった。 http://www.yaml.org/を見れば、だいたいのことがわかるはずだ。

224 ホスト名とIPアドレスを変換する

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の技


MARUYAMA Satosi