Devlion Memo

どことなくそれっぽい大学生の日記

cowsay日本語化

cowsayというコマンドをご存知だろうか。

f:id:wait0000:20150823201002p:plain こいつである。

Linux系のジョークソフトとして有名なこの牛なのだが、肝心の日本語を表示しようとすると、表示が崩れてしまう。

f:id:wait0000:20150823201008p:plain

こんな具合である。

そこで今回は、こいつを日本語対応させようと思う。

ソースを改ざんする

まずは、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というサイトからデータを拝借した。

この二つのプログラムを組み合わせることで、例えばこんなことができるようになる。 f:id:wait0000:20150823201025p:plain

以上、めでたしめでたし。