トップ «前の日記(2008-12-01) 最新 次の日記(2008-12-03)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2008-12-02

_ Ruby-1.9.1-preview2 インストーラパッケージ

riを入れるとサイズがでかくなりすぎるので、previewが付いている間は、ri用のドキュメントを外した格好でパッケージングします。大体10MB弱。

Rubyパッケージ置き場へどうぞ。

添付のリファレンスマニュアルは、okkezさんの1.9.0 chm最新版です(感謝!)。

_ Ruby-1.9.1で引っかかったコード

icmpping.rbを使ってテストしようとしたらエラーになった。
C:/PROGRA~2/RUBY-1~1.1/lib/ruby/vendor_ruby/1.9.1/icmpping.rb:72:in `[]=': can't convert Fixnum into String (TypeError)
うう、今までテストしてなかったのがわかるなぁ。(というエラーになるのが上のパッケージには同梱してある)
エラーになるのは、なんとなくすぐに当たりがつく。というのは、Fixnum into Stringが[]=で出るということは、文字コードを直接Stringへ設定しようとしているからだろう。
で、調べるとまさにその通り。
    dat[2], dat[3] = cksum >> 8, cksum & 0xff
というのが引っかかったのであった。
そこで、Integer#chrを使うように修正する。
    dat[2], dat[3] = ((cksum >> 8) & 0xff).chr, (cksum & 0xff).chr
でも、それで終わりではない。
undefined method `&' for "E":String
というエラーが出る。&というとこのあたりだな。
	  icmpdat = rdat[0].slice((rdat[0][0] & 0x0f) * 4..-1)
確かに、文字列に対して&を呼び出している。
数値を取るように修正する。
	  icmpdat = rdat[0].slice((rdat[0].getbyte(0) & 0x0f) * 4..-1)
というような感じだが、もっとうまい方法はないかな? (このプログラムの場合、String#&にしろString#[]=にしろ他の使い方とは干渉しないから、直接これらのメソッドを修正するというのも方法かも知れない)

というわけで次のようなのを先頭に入れてみたりして。

begin
  "a"[0] = 64
rescue
  class String
    alias :array_set_org :[]= 
    def []=(i, c)
      if Integer === c
        array_set_org(i, (c & 0xff).chr)
      else
        array_set_org(i, c)
      end
    end
    def &(c)
      if Integer === c
        getbyte(0) & c
      else
        self & c
      end
    end
  end
end  
これで、これに関しては1.8でも1.9でも動くはずだ(で試すと動いたのでとりあえずこれでいいや)。

2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|

ジェズイットを見習え