IPアドレスを扱う
IPアドレス・サブネット関係の処理が必要になったので調べた。
"IPAddr"クラスを使うようだ。そのメモ。
irb(main):001:0> require 'pp' => true irb(main):002:0> require 'ipaddr' => true irb(main):003:0> ipaddr1 = IPAddr.new("192.168.0.3") => #<IPAddr: IPv4:192.168.0.3/255.255.255.255> irb(main):004:0> ipaddr2 = IPAddr.new("192.168.0.103") => #<IPAddr: IPv4:192.168.0.103/255.255.255.255> # 素直に文字列としてIPアドレスを渡してやればOK irb(main):005:0> ipaddr1 == ipaddr2 => false # 単純な比較 irb(main):006:0> masked = ipaddr1.mask("255.255.255.0") => #<IPAddr: IPv4:192.168.0.0/255.255.255.0> # 既存のオブジェクトに、指定したネットマスクを適用したオブジェクトを取得 irb(main):007:0> masked.include?(ipaddr1) => true irb(main):008:0> masked.include?(ipaddr2) => true irb(main):009:0> ipaddr3 = IPAddr.new("192.168.1.3") => #<IPAddr: IPv4:192.168.1.3/255.255.255.255> irb(main):010:0> masked.include?(ipaddr3) => false # ネットマスク付きオブジェクトに含まれるかどうかをinclude?で取得 # ネットマスク付きオブジェクトを作るときは、↓こうじゃなくて irb(main):011:0> range = IPAddr.new("172.16.0.5","255.255.0.0") ArgumentError: address family unmatch from /usr/lib/ruby/1.8/ipaddr.rb:436:in `initialize' from (irb):11:in `new' from (irb):11 # ↓こうする。aaa.bbb.ccc.ddd/www.xxx.yyy.zzz 形式か、aaa.bbb.ccc.ddd/xx 形式を使う。 irb(main):012:0> range = IPAddr.new("172.16.0.5/255.255.0.0") => #<IPAddr: IPv4:172.16.0.0/255.255.0.0> irb(main):013:0> ipaddr4 = IPAddr.new("172.16.100.200") => #<IPAddr: IPv4:172.16.100.200/255.255.255.255> irb(main):014:0> range.include?(ipaddr4) => true irb(main):015:0> range.include?(ipaddr1) => false