〜2006年6月上旬〜
558通。Gmail側約5000スレッド。微妙に増えた。 なんか最近Gmailのspam判定が甘いような。日本語のspamが目立つ。
Vimでバイナリファイルを編集するにはいくつか方法がある。
:help edit-binaryすると-bオプションかset binaryせよとある。 set display=uhexとすれば表示できない文字も16進数で表示される。
<Nul> characters are shown on the screen as ^You can enter them with "CTRL-V CTRL-or "CTRL-V 000" {Vi cannot handle <Nul> characters in the file}
コードはCTRL-V x0fとかすれば16進数でも入力できる。 いちいちCTRL-Vって打つのが面倒であるが。
そこで真打。:help xxdを参照。
If one has a particular extension that one uses for binary files (such as exe, bin, etc), you may find it helpful to automate the process with the following bit of autocmds for your <.vimrc>. Change that "*.bin" to whatever comma-separated list of extension(s) you find yourself wanting to edit: >
とあって、以下を.vimrcへ追加しろとある。
" vim -b : edit binary using xxd-format! augroup Binary au! au BufReadPre *.bin let &bin=1 au BufReadPost *.bin if &bin | %!xxd au BufReadPost *.bin set ft=xxd | endif au BufWritePre *.bin if &bin | %!xxd -r au BufWritePre *.bin endif au BufWritePost *.bin if &bin | %!xxd au BufWritePost *.bin set nomod | endif augroup END
すばらしい。これで*.binという拡張子にしとけば16進ダンプ形式で編集できる。 ただxxdコマンドは2バイト単位がデフォルトなので
% echo hoge |xxd 0000000: 686f 6765 0a hoge.
となってしまう。やっぱ1バイト単位のほうがわかりやすいので
" vim -b : edit binary using xxd-format! augroup Binary au! au BufReadPre *.bin let &bin=1 au BufReadPost *.bin if &bin | silent %!xxd -g 1 au BufReadPost *.bin set ft=xxd | endif au BufWritePre *.bin if &bin | %!xxd -r au BufWritePre *.bin endif au BufWritePost *.bin if &bin | silent %!xxd -g 1 au BufWritePost *.bin set nomod | endif augroup END
のようにxxdコマンドの実行に-g 1を追加。
% echo hoge |xxd -g 1 0000000: 68 6f 67 65 0a hoge.
こんな感じになる。 silentは「続けるにはENTERを押すかコマンドを入力してください」 というメッセージで止まるのを抑止。 右側のアスキー文字列を編集しても無効なので注意。
なんだか怪しい番組で1:√2を白銀比と呼ぶと言ってた。 個人的には黄金比より白銀比のほうが美しく感じる。
今日来たfreshmeatがなんか新鮮な気分なのでなぜかと思ったら、 ここ1週間ほど来てないことに気づいた。 Gmailにてin:spam freshmeatで検索したらわらわらと1週間分が出てきた。 ここで食われてたか。しかしなぜ急に?
W杯に備えて FootieFoxを入れた。 いつでも来い。
Key Features
- display of current soccer scores in your status bar
- all matches at a glance on the customizable score board
- support of more than 18 European leagues plus many international championships
- visual and acoustic notification when goals are scored
- kick-off times in local time, world cup teams in local language
Vimでinsert modeで貼りつけると、たとえばRuby modeだったりすると、 階段状になったり余計に深いindentになったりで非常にうっとうしいことになることがしばしば。 そこで:a,:iして貼りつけて"."で終了という有名な技がある。 でもVim7だとinsert modeと同じ挙動になってしまっているようで、どうしたもんだか。
gvimだったらふつうに貼りつければいいようだ。 gvimってあまり使わないしなあ。
昔々の名残りでずーっと~/.vimrcでset aiしてたけど、 やめてもちゃんとautoindentだったりするのはなぜ? filetypeとかsyntaxで決まるもんなのかな。
というわけで、 昨日の問題は解決。
今日はちょっとはまった。Cで
x = 1 << 8 + 1;
とやるとxは0x0101になると思っていた。でも実際は0x0200になる。つまり
x = (1 << 8) + 1;
ではなく
x = 1 << (8 + 1);
ということだ。<<よりも+のほうが優先順位が高い。 ここは
x = 1 << 8 | 1;
と+ではなく|を使えば思った通りになる。逆に+を使いたければ
x = 1 * 256 + 1;
とすればいい。
ビット演算と算術演算を混ぜるな危険ってことで。
1バイト整数と3バイト整数(ビッグエンディアン)というバイナリデータがあって、それをRubyでどうやって読むかというのが今日のお題。 1バイトのほうは種別みたいなもので、3バイトのほうはそのあとの続くデータのサイズと思ってくれればいい。 素直に書くと
type, *s = data.unpack("C4") size = s[0] << 16 | s[1] << 8 | s[0]
という感じになるというか、実は 昨日の話はこれをCで書いていたわけなんだけど、 RubyでもPerlでもやはりCと同じ優先順位なんだね。 それはそれとして、sという一時変数がなんか無駄なのでなくしたい。 Nを使えばいいか。
size = data.unpack("N") type = size >> 24 size &= 0xffffff
てな感じで。あ、Xで戻るのもありだな。もうちょっと工夫してみる。
type, size = data.unpack("CXN") size &= 0xffffff
Xなんて何に使うんだと思っていたけど、意外にも役に立つことがあるもんだ。
マウスのホイールの調子が悪い。回しても回してもスクロールが進まない。 進まないというかむしろ戻る。やはり安物だけあってへたれるのも早い?
暑い。そして akrさんの発表 に感動した。