irbrc を書いたら ruby 1.9 とだいぶ和解できた話

いつも言ってることだけど、 ruby 1.9 からの m17n のせいで、バイナリツールとしての ruby が色々不便になって、参っていました。特に、 'a' の ASCII code を知るのに、

irb(main):001:0> 'a'[0]
=> "a"

とかやるクセがついてて、これで "a" と出るとか、そういう比較的どうでもいいところで参ってました。

しかしまぁどの環境も ruby 1.9 以降になってるわけで、なんとかしないとなーということで、 IRB の inspector いじって色々やってみて、結果として 1.8 時代より便利になって、最近は割と普通に使えている。

https://github.com/shinh/test/blob/master/.irbrc

何をしてるかというと、評価した結果が文字とか数値だった場合に、補助情報を色々出すようにしてある。で、

irb(main):001:0> 'a'
=> a (97)
irb(main):002:0> 99
=> 99 (0x63 'c')
irb(main):003:0> 2**25
=> 33554432 (0x2000000 33M)
irb(main):005:0* 0xf7e04000 + 0x41060
=> 4158935136 (0xf7e45060 4158M)

などなど。最初の2つは文字と数字の変換結果がついでに出てて便利みたいな話。3つ目は 33M など、数字のだいたいの大きさが出ると便利という話。最後のはアドレス計算とかで特に最近こういうのよくやるので、 16 進数出てると便利。

それ以外にも色々歴史的にちょっとずつ足している機能があって、よく使うのだと、

irb(main):016:0> (99999*29999).cint
=> -1295097295 (0x..fb2ce6231)

31bit overflow してる時に、 C の整数だといくつ、ってのが意外とぱっとわからなかったりするので。 cuint もあるけど、まぁそっちはあまり使わない。

irb(main):010:0> asm("xchg eax, edx")
000000 92                                               >.<
000001
=> nil
irb(main):011:0> disasm("\x55\x57\x31\ff")

/tmp/irb_disasm20140904-6135-1vk633j:     file format binary


Disassembly of section .data:

00000000 <.data>:
   0:   55                      push   %ebp
   1:   57                      push   %edi
   2:   31 0c 66                xor    %ecx,(%esi,%eiz,2)
=> nil

ちょっとアセンブルした結果とか、逆アセンブルした結果とかを見たいことがよくあるので。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h