[#6219] Ruby連載 第4話 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

32 messages 1998/02/04
[#6221] Re: Ruby連載 第4話 — Shin-ichiro HARA <sinara@...> 1998/02/04

原です。

[#6224] Re: Ruby連載 第4話 — Yasunari Momoi <conan@...> 1998/02/04

ももちゃん@あるもにこすです.

[#6225] Re: Ruby連載 第4話 — matz@... (Yukihiro Matsumoto) 1998/02/04

まつもと ゆきひろです

[#6249] Re: i++ — 助田 雅紀 <masaki.suketa@...>

助田です。

33 messages 1998/02/04
[#6252] Re: i++ — gotoken@... (GOTO Kentaro) 1998/02/05

ことけんです

[#6255] Re: i++ — matz@... (Yukihiro Matsumoto) 1998/02/05

まつもと ゆきひろです

[#6260] Re: i++ — Yuji Shigehiro <sigehiro@...> 1998/02/05

しげひろです.

[#6314] RE: ruby's design policy (Re: I'd like to subscr ibe this ML) — 助田 雅紀 <masaki.suketa@...>

オブジェクト指向周辺をぶらぶらしている助田です。

11 messages 1998/02/06

[#6333] ruby 流に添削して下さい — nkon@...2.3web.ne.jp

13 messages 1998/02/07
[#6335] Re: ruby 流に添削して下さい — OZAWA Sakuro <crouton@...> 1998/02/07

さくです.

[#6372] ruby 1.1b7 released — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

24 messages 1998/02/10
[#6402] parsedate (Re: ruby 1.1b7 released) — WATANABE Hirofumi <watanabe@...> 1998/02/13

わたなべです.

[#6405] Re: parsedate (Re: ruby 1.1b7 released) — Tadayoshi Funaba <tadf@...> 1998/02/13

ふなばです。

[#6407] Re: parsedate (Re: ruby 1.1b7 released) — matz@... (Yukihiro Matsumoto) 1998/02/13

まつもと ゆきひろです

[#6373] call for scripts — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

133 messages 1998/02/10
[#6414] Re: call for scripts — Terutuoshi Kaneshiro <k-teru@...06.odn.ne.jp> 1998/02/14

金城です.

[#6428] Re: call for scripts — matz@... (Yukihiro Matsumoto) 1998/02/16

まつもと ゆきひろです

[#6448] Re: call for scripts — Terutuoshi Kaneshiro <k-teru@...06.odn.ne.jp> 1998/02/16

金城です.

[#6452] Re: call for scripts — matz@... (Yukihiro Matsumoto) 1998/02/17

まつもと ゆきひろです

[#6481] Re: call for scripts — Kikutani Makoto <kikutani@...> 1998/02/17

きくたに@ぷ〜たろ〜です。

[#6483] Re: call for scripts — OZAWA Sakuro <crouton@...> 1998/02/17

さくです.

[#6495] Re: call for scripts — WATANABE Hirofumi <watanabe@...> 1998/02/18

わたなべです.

[#6416] Re: call for scripts — shugo@... (Shugo Maeda) 1998/02/14

前田です。

[#6417] rgrep (Re: call for scripts) — shugo@... (Shugo Maeda) 1998/02/15

前田です。

[#6423] Re: rgrep (Re: call for scripts) — matz@... (Yukihiro Matsumoto) 1998/02/16

まつもと ゆきひろです

[#6612] Re: call for scripts — Tadayoshi Funaba <tadf@...> 1998/02/21

ふなばです。

[#6582] File::Separator on cygwin — OZAWA Sakuro <ozawa@...>

小澤さくです。

19 messages 1998/02/20
[#6583] Re: File::Separator on cygwin — WATANABE Hirofumi <watanabe@...> 1998/02/20

わたなべです.

[#6586] Re: File::Separator on cygwin — OZAWA Sakuro <ozawa@...> 1998/02/20

小澤さくです。

[#6591] ruby 1.1b8 released — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

32 messages 1998/02/20
[#6620] rbc.rb and binding — shugo@... (Shugo Maeda) 1998/02/22

前田です。

[#6629] Re: rbc.rb and binding — keiju@... (石塚圭樹 ) 1998/02/23

けいじゅ@日本ラショナルソフトウェアです.

[#6643] Re: rbc.rb and binding — shugo@... (Shugo Maeda) 1998/02/23

前田です。

[#6649] Re: rbc.rb and binding — keiju@... (石塚圭樹 ) 1998/02/23

けいじゅ@日本ラショナルソフトウェアです.

[#6650] Re: rbc.rb and binding — matz@... (Yukihiro Matsumoto) 1998/02/23

まつもと ゆきひろです

[#6667] JRI 0.5 worked (was Re: rbc.rb and binding) — OZAWA Sakuro <crouton@...> 1998/02/23

さくです.

[#6687] Re: JRI 0.5 worked (was Re: rbc.rb and binding) — shugo@... (Shugo Maeda) 1998/02/24

前田です。

[#6712] JRI and JDBC — OZAWA Sakuro <ozawa@...> 1998/02/24

小澤さくです。

[#6635] hello — WATANABE Tetsuya <tetsu@...>

渡辺哲也と申します。

15 messages 1998/02/23

[#6706] Re: Counter class — toyofuku@...

豊福@パパイヤです。

12 messages 1998/02/24

[#6735] Mutex/ConditionVariable/Queue — shugo@... (Shugo Maeda)

前田です。

27 messages 1998/02/24
[#6746] Re: Mutex/ConditionVariable/Queue — keiju@... (石塚圭樹 ) 1998/02/25

けいじゅ@日本ラショナルソフトウェアです.

[#6747] Re: Mutex/ConditionVariable/Queue — shugo@... (Shugo Maeda) 1998/02/25

前田です。

[#6752] Re: Mutex/ConditionVariable/Queue — senda@... 1998/02/25

From: shugo@po.aianet.ne.jp (Shugo Maeda)

[#6754] Re: Mutex/ConditionVariable/Queue — shugo@... (Shugo Maeda) 1998/02/25

前田です。

[#6756] Re: Mutex/ConditionVariable/Queue — senda@... 1998/02/25

From: shugo@po.aianet.ne.jp (Shugo Maeda)

[#6786] Re: Mutex/ConditionVariable/Queue — senda@...

From: shugo@po.aianet.ne.jp (Shugo Maeda)

33 messages 1998/02/26
[#6791] Re: Mutex/ConditionVariable/Queue — shugo@... (Shugo Maeda) 1998/02/26

前田です。

[#6794] Re: Mutex/ConditionVariable/Queue — shugo@... (Shugo Maeda) 1998/02/26

前田です。

[#6796] Re: Mutex/ConditionVariable/Queue — keiju@... (石塚圭樹 ) 1998/02/26

けいじゅ@日本ラショナルソフトウェアです.

[ruby-list:6615] IP address calculator (Re: call for scripts)

From: Yamamoto Kengo <kengo-y@...>
Date: 1998-02-22 00:52:54 UTC
List: ruby-list #6615
山本 健吾です。

最近のサイン本ブームに触発されて(^^;スクリプトを書いてみました。
これでエントリさせて下さい。

IPアドレス用の計算機(199行)です。いろいろと怠ける事ができます。

・ブロードキャストアドレスを求める
ipcalc 192.168.33.43/28 b
192.168.33.47/28

・ネットワークアドレスを求める
ipcalc 172.16.38.32/22 n
172.16.36.0/22

・/27の点区切り10進表記をド忘れしたとき
ipcalc /27
255.255.255.224

・ネットワークを8つに割り、5番目のサブネットのブロードキャストを求める
ipcalc '(172.28.38.17/25 n // 8)[4] b'
172.28.38.79/28

・ネットワークを4つに割り、それぞれのサブネットの先頭と終りのホストア
  ドレスを列挙する
ipcalc '(192.168.22.0//4).collect{|sub| [sub + 1, sub b - 1]}'
[192.168.22.1, 192.168.22.62, 192.168.22.65, 192.168.22.126, 192.168.22.129, 192.168.22.190, 192.168.22.193, 192.168.22.254]

↑このあたりで手抜きがバレますね(^^;
他にも演算子(のふりをしたメソッド)があるのですが、あまり使用しないと思
います。

----------------------------------------------------------------------
#!/usr/local/bin/ruby
# ipcalc : An IP address calculator
# Written by Yamamoto Kengo 1998/2/22

class DottedDecimal
  def initialize(seed)
    @value = 0
    if seed.is_a?(String) && seed =~ /^\d+(\.\d+)+$/
      seed.split(/\./).each{|octet|
	@value <<= 8
	@value += octet.to_i
      }
    else
      @value = seed.to_i
    end
    raise "invalid value #{to_s} for #{type}" unless valid?
  end

  def valid?
    true
  end

  def to_s
    value = @value
    string = []
    for i in 1..value.size
      octet = (value & 0xff).to_s
      string.unshift(octet)
      value >>= 8
    end
    string.join('.')
  end

  def to_i
    @value
  end

  def ==(other)
    @value == other.to_i
  end

  def <=(other)
    @value <= other.to_i
  end

  def >=(other)
    @value >= other.to_i
  end

  def <(other)
    @value < other.to_i
  end

  def >(other)
    @value > other.to_i
  end

  def +(other)
    DottedDecimal.new(@value + other.to_i)
  end

  def -(other)
    DottedDecimal.new(@value - other.to_i)
  end

  def &(other)
    DottedDecimal.new(@value & other.to_i)
  end

  def |(other)
    DottedDecimal.new(@value | other.to_i)
  end
end

class Netmask < DottedDecimal
  def initialize(seed)
    seed = 32 if seed.nil?
    if seed.is_a?(String) && seed =~ /^\/?\d+$/
      seed = seed.sub(/\//, '').to_i
    end
    if seed.is_a?(Integer) && seed <= 32
      seed = (0xffffffff >> seed) ^ 0xffffffff 
    end
    super(seed)
  end

  def valid?
    generated_by_length = (0xffffffff >> length) ^ 0xffffffff
    @value == generated_by_length
  end

  def length
    border = 0
    while @value[border] == 0 && border <= 31
      border += 1
    end
    32 - border
  end

  def inv
    @value ^ 0xffffffff
  end
end

class IPAddress < DottedDecimal
  def initialize(address = nil, mask = nil)
    if address.is_a?(String) && address =~ /^(\d+(\.\d+){3})(\/(\d+))?$/
      address = $1
      mask = $4 if $4
    end
    @mask = Netmask.new(mask) unless mask.nil? || mask == ''
    super(address)
  end

  def valid?
    (0..0xffffffff) === @value
  end

  def to_s
    super + '/' + netmask.length
  end

  def rawaddr
    DottedDecimal.new(@value)
  end

  def /(n)
    bits = 0
    nth = 0
    for i in 0..31
      if n[i] == 1
	bits += 1
	nth = i
      end
    end

    newmask = netmask | (netmask.to_i >> nth)
    blocksize = (netmask.inv + 1) / n
    if bits == 1 && host(netmask) == 0 && netmask.length + nth <= 32
      subnets = []
      for i in 0..(n - 1)
	topaddr = network(newmask) + blocksize * i
	subnet = type.new(topaddr, newmask)
	subnets.push(subnet)
      end
      subnets
    else
      raise "cannot divide #{self} by #{n}"
    end
  end

  def netmask
    if @mask.is_a?(Netmask)
      @mask
    else
      case @value
      when 0..0x7fffffff
	Netmask.new(8)
      when 0x80000000..0xbfffffff
	Netmask.new(16)
      when 0xc0000000..0xdfffffff
	Netmask.new(24)
      else
	Netmask.new(32)
      end
    end
  end

  def network(mask = netmask)
    mask = Netmask.new(mask) unless mask.is_a?(Netmask)
    type.new(self & mask, mask)
  end

  def host(mask = netmask)
    type.new(self - network(mask), mask)
  end

  def broadcast(mask = netmask)
    mask = Netmask.new(mask) unless mask.is_a?(Netmask)
    type.new(network(mask) + mask.inv, mask)
  end
end

exp = ARGV.join(' ')
exp.gsub!(/(\d+)([bhnr])/, '\1 \2')
exp.gsub!(/\/\//, ' / ')
exp.gsub!(/((\d+(\.\d+){3})(\/(\d+))?)/, 'IPAddress.new(\'\2\', \'\5\')')
exp.gsub!(/\b(\/\d+)/, 'Netmask.new(\'\1\')')
exp.gsub!(/\.?\bb(roadcast)?[\s\t]*(\d+)?\b/, '.broadcast(\2)')
exp.gsub!(/\.?\bh(ost)?[\s\t]*(\d+)?\b/, '.host(\2)')
exp.gsub!(/\.?\bn(etwork)?[\s\t]*(\d+)?\b/, '.network(\2)')
exp.gsub!(/\.?\br(awaddr)?\b/, '.rawaddr(\2)')

result = eval(exp)
if result.is_a?(Array)
  print "[#{result.join(', ')}]\n"
else
  print "#{result}\n"
end

In This Thread