FreeBSD でも UTF-8 な生活を

近くのスーパーが改装のため暫く閉店すると言うので、コーヒーパックをまとめ買い してきた。そしたら、ちょっと量が多かったせいか、会社のおつかいと(勝手に) 思われたようで、レジのおばちゃんが、領収書を添付してくれた。

自宅で飲むんだから、領収書はいいですよと断るのも大人げないので、そのまま貰って きた。気くばりって難しいものですね。

Rubyの穴

BigDecimal("9E69999999").to_s("F")

等とやると落ちるそうです。あの方のPatch袋が開いたのかな?

[sakae@fb ~]$ ruby -v
ruby 1.8.7 (2009-04-08 patchlevel 160) [i386-freebsd6]
[sakae@fb ~]$ irb
irb(main):001:0> require 'bigdecimal'
=> true
irb(main):002:0>  BigDecimal("9E69999999").to_s("F")
Illegal instruction: 4 (core dumped)
[sakae@fb ~]$ ls -l ruby*
-rw-------  1 sakae  kuma  2478080  6 13 08:24 ruby18.core

ruby 1.9.1 以降では、落ちない。(例を実行すると、ものすごく忙しくCPUが仕事を 始めちゃうのは、DoSっぽいけど)これは、早く1.9系へ移行を促すサインだろうか?

そう言えば、前記事でやっていた、JSONデータをRubyで読んじゃえですが、1.8系を 使った時、ruby -Ku としないと、誤変換があったなあ。わざわざ、文字コードを 指定するのもうざいなあ。(私の1.8.7は、デフォで、EUC-JP指定なんです。)

そろそろ、重い腰を上げて、FreeBSDでもUTF-8の生活を始めてみるかな。

FreeBSDでの生活のあらまし

移行に当って、影響度を調べておく。いわゆる傾向と対策ですかね。

twm
まあ、大丈夫でしょう。
kterm
UTF-8って、開発当時は存在してないから、考慮なしだよな。
screen
多分大丈夫でしょう
vi
正確には、nvi-eucjpだから、要変更だ
man
jmanが問題になりそう。

emacs,w3m,firefoxは、UTF-8 Ready だから良いとすると、一番のネックは、ktermかな。UTF-8を使いたいばかりに、gnome-terminalってのも好かん。 それにしてしても、CUI中心の生活ぶりが如実に現れているなあ。マウスを使う時って、javascriptを強要されるサイトを見る時に使う、firefoxだけぐらいかな。

さあ、どうする? 世のCUI好き、100人に聞きました。あなたが使うterminalは何ですか?

mlterm

一位が、これでした。って言うか、これぐらいしか有りません。(gnome/kdeセットを使えば別ですが。)

FreeBSDだと、ports/x11の下にあります。gtk2が要求されるのには辟易させられますが、Firefoxも同様なので、まあ、我慢しますわ。

mlterm上で、Ctrl+右クリックすると、あらかた設定ができちゃうけど、CUI派なので、きちんと文書化しておく。

[sakae@fb ~]$ cat .mlterm/main
ENCODING = UTF-8
not_use_unicode_font = true
logsize = 256

[sakae@fb ~]$ cat .xinitrc
export LANG="${LANG:-ja_JP.UTF-8}"
kinput2  -jserver localhost -wnn &
xmodmap -e "keysym BackSpace = Delete" &
xsetroot -solid \#400040 -cursor_name top_left_arrow
exec mlterm -f gray -b black -0 gold -g 80x40 -lsp 3 &
exec twm

この設定で、NotePCの縦方向一杯に、mltermの画面が広がりました。

vim

これはもう、選択の余地がありません。素直に従います。

[sakae@fb ~]$ cat .vimrc
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8
set fileencodings=ucs-bom,euc-jp,cp932,iso-2022-jp
set fileencodings+=,ucs-2le,ucs-2,utf-8

set shortmess+=I
set showmatch
set compatible
set nobackup

後は、alias vi='vim' を設定しました。こうしておけば、\viで、いにしえの vi を 起動させられますから、安心。嗚呼、もしもの為に、ed の操作訓練もたまに、やって おいた方が良いかも知れません。(災害は忘れた頃にやってくる)

vimの挙動を調べていたら、.viminfo なんていうログが作られるんですね。こんなの 不要なので off にしようと思ったら、コンパイル時オプションなのですね。このログは どこまで成長していくのだろう? 際限なく成長するなら、logoffの時に削除するよう にでもしておくか。

screen

manすると、起動持に -U を付けると utf8端末と理解するよと書いてあったけど、 私の所では、芳しくなかったので、下記のようにしました。

[sakae@fb ~]$ cat .screenrc
defencoding utf8
escape ^t^t

# split window -- ^t x 2, change window -- ^t x o, new shell -- ^t c
bind -c REGION 2 split
bind -c REGION 1 only
bind -c REGION 0 remove
bind -c REGION o focus
bind -c REGION ^ resize
bind x command -c REGION

bind 'u' eval "encoding utf8" "stuff 'export LANG=ja_JP.UTF-8\012'"
bind 'e' eval "encoding euc" "stuff 'export LANG=ja_JP.EUC-JP\012'"
startup_message off

動的にエンコーディングを切替えられるのは、嬉しいです。こういう技を公開 下さった方に多謝!

man

旨い方法が思い付かなかったので、.bashrc をちょいと変更しただけ。

alias man='env LC_ALL=ja_JP.eucJP jman'
export PAGER='lv'

表示が化けたら、screenのエンコードを変えるというトホホな方法です。

その他

twmの表示文字幅がおかしくなったので、ちょいと設定

TitleFont       "*helv*bold*--12*"
MenuFont        "*helv*bold*--12*"
IconFont        "*helv*bold*--12*"
IconManagerFont "*helv*bold*--12*"

後の未確認事項として、TeraTermがあるけど、これはおいおいやる事にしよう。