cowsayというコマンドをご存知だろうか。
こいつである。
Linux系のジョークソフトとして有名なこの牛なのだが、肝心の日本語を表示しようとすると、表示が崩れてしまう。
こんな具合である。
そこで今回は、こいつを日本語対応させようと思う。
ソースを改ざんする
まずは、cowsayのプログラムのありかを突き止めよう。
$ which cowsay
/usr/local/bin/cowsay
ちょろいもんである。
こいつを適当なディレクトリにコピーしよう。
$ cp `which cowsay` ./
ついでに、書き込み権限も付加。
$ chmod +w ./cowsay
よし、そしたら好きなエディタでコピーしたcowsayファイルを開こう。
変更する場所は以下の4箇所。
13行目追加: use Encode; 106行目: $l = length $i; ↓変更 $l = length encode('sjis', decode('utf-8', $i)); 115行目: my $format = "%s %-${max}s %s\n"; ↓変更 my $format = "%s %s%s %s\n"; 133行目: sprintf($format, $border[0], $message[0], $border[1]), ↓変更 sprintf($format, $border[0], $message[0], " " x ($max - &maxlength($message[0])), $border[1]), 135行目: map { sprintf($format, $border[4], $_, $border[5]) } ↓変更 map { sprintf($format, $border[4], $_, " " x ($max - &maxlength($_)), $border[5]) } 138行目: sprintf($format, $border[2], $message[$#message], $border[3])), ↓変更 sprintf($format, $border[2], $message[$#message], " " x ($max - &maxlength($message[$#message])), $border[3])),
変更した点は、文字数のカウントをsjisの状態で行うようにしたこと、空白の出力を、sprintfの機能ではなく自前でやるようにしたこと。
ちなみに、utf-8の環境以外での動作は保証できない。というか動作しないだろうなぁ。
おまけ
実はなぜ日本語に対応させたかったかと言うと、fortuneの日本語版的なコマンドと一緒に使いたかったためである。
というわけで、適当な名言を出力するプログラムを以下に貼る。
#!/usr/bin/ruby
require 'rss'
rss = RSS::Parser.parse("http://www.kotodama.in/bbs/rss/board/remark/", false)
i = rand(rss.items.length)
puts rss.item(i).title
puts " -- " + rss.item(i).content_encoded
今回は、言霊.inというサイトからデータを拝借した。
この二つのプログラムを組み合わせることで、例えばこんなことができるようになる。
以上、めでたしめでたし。