この記事は?
- 前回、仕事の役には立たない、Linuxにおけるジョークプログラムの話という記事でcowsayについてちょっと触れた。
- そのあと、当該記事について呟いてくれた中にこのようなものがあった。
fortuneとcowsayでダー様に喋らせるのてきないかな
— かのーくんと七曜の魔女 (@Canoo11KIT) 2016年7月9日
- よし、やるか。
まずは環境情報
環境情報
前回同様、私の環境では下記です。
今回はPerlとRubyに少し触るのでバージョン明記。
項目 | 情報 |
---|---|
CentOS | CentOS Linux release 7.2.1511 |
Perl | v5.16.3 |
Ruby | ruby 2.0.0p598 (2014-11-13) |
ゴール地点の設定
ダー様に喋らせる、とは
そもそもダー様とはなんだ、という人のために説明をすると、ダー様とは
ガールズ&パンツァー(GIRLS und PANZER)というTVアニメがあり、そこに登場する人物である
ダージリンという女の子を指す。
作中では度々、「こんな格言を知ってる?」という前置きを使いつつ格言や諺を披露することがあったため、
この記事のゴール地点は
『ダー様に様々な格言や諺を披露させる』
と定めようと思う。
Step1:ダージリンさんのAAを出力する
やること
cowsayではデフォルトでは牛がしゃべるが、-fオプションとして用意された様々な動物、
もしくはTuxやハローキティなどのキャラクターを指定することができる。
この設定ファイルをいじって、ダー様のファイルを用意します。
実装
さて、当該の設定ファイルはcowファイルとして保存されており、cowsay -lでどこに保存されているか確認できる。
$ cowsay -l
Cow files in /usr/local/share/cows:
$ ls -l /usr/local/share/cows
合計 196
-rw-r--r-- 1 root root 1595 7月 11 01:00 Darjeeling.cow
-rw-r--r-- 1 root root 584 3月 11 2010 beavis.zen.cow
-rw-r--r-- 1 root root 286 3月 11 2010 bong.cow
-rw-r--r-- 1 root root 310 3月 11 2010 bud-frogs.cow
-rw-r--r-- 1 root root 123 3月 11 2010 bunny.cow
<中略>
touchでもcpでも構わないので次のようなファイルを作成します。
残念ながら私はAA職人ではないのでAAの微調整は各個、お願いしたいところです。
##
## ダージリンさん
##
##
$the_cow = <<EOC;
$thoughts
$thoughts
| . . . . . . x. . .\ . . \ . . . . . . \ . . . . . . .\.∨| . .
x. . . . . . . .|.| . . . . |\ . . \. . / . .\. . . . . . . .|x| . .
x. . . . . . . .|.|i . . . . 、 \ . . Х>― .斗\ . . . |x| . .
x. . . . . . . .|八 . . . . \ ` ‐---/ 弌Y^ . . . . .ト|人厶
|. .| . . .l. .x \\ . . \ 〈/V \ ヽ | . . . |tく ヘ
|. .| . . .| . .|____,\\. . \ \く___ノ | . |. ∧|. . . . . 〉
|. .| . . .|/| .斗≧=‐---- ノイ|/ 人_/〉
|. . . . . ∧. .'. Y^Vj弌 __/ . j. . .イ
. . . . . . . . . .V人 \__〉 |/. . /\イ
\.〈\ . . \\ヽ. ′ k ∧. ∧. . . .ソ
\ \ . . \トヘ. く ノ ∨__,>く
` ‐--- T\ / V ̄\
乂__≧=‐-----rく / \
( \_ノ、__,ノ/| / ト
/ ∧ _/ | \
EOC
実行確認
$ cowsay -l
Cow files in /usr/local/share/cows:
Darjeeling beavis.zen bong bud-frogs bunny cheese cower daemon default
↑ 想定通りのファイルが表示されること
Step2:cowsayではなくDarsayとして出力する
やること
せっかくならcowsayでなくDarsayにしてやりたい。ダー様がしゃべる、としてDarsay。
やることとしては、
1: 日本語の格言にも対応する。
2: デフォルトの動作を牛ではなくダー様にする
3: 「こんな格言を知ってる?」を埋め込む。
そんなわけで日本語対応と若干のアレンジを行う。
実装
1: 日本語の格言にも対応する。
先人がいたのでそちらを参照。
参考:Devlion Memo cowsay日本語化
2: デフォルトの動作を牛ではなくダー様にする
引数設定の場所をちょちょいと変更してあげればOK。
# 変更前
%opts = (
'e' => 'oo',
'f' => 'default.cow',
'n' => 0,
'T' => ' ',
'W' => 40,
);
# 変更後
%opts = (
'e' => 'oo',
'f' => 'Darjeeling.cow',
'n' => 0,
'T' => ' ',
'W' => 40,
);
3: 「こんな格言を知ってる?」を埋め込む。
標準入力をPerlの処理に受け渡すタイミングでメッセージを付与しようと思う。
具体的にはslurp_input関数の中身です。
message配列には受け取った文字列が改行ごとにVAR1,VAR2と格納されるので、
配列の先頭にdarjeeling の2行を追加してあげることで簡易実装とした。
# 変更前
chomp(@message = <STDIN>);
# 変更後
chomp(@message = <STDIN>);
my @darjeeling = ("こんな格言を知ってる?","");
unshift(@message, @darjeeling);
実行確認
Step3:日本語の名言をしゃべらせる その1
やること
せっかくなら日本語の格言や名言をしゃべらせたいよね。
そんなわけでまずは正攻法、fortuneコマンドに日本語の名言を入れ込む。
実装
日本語のfortuneのファイルを提供している場所はいくつかあるのですが、
今回は星が見える名言集から取得。
EUC-JPのエンコーディングのため、UTF-8環境においては、meigenをUTF-8エンコーディングに変換後、strfileで.datファイルを作成する必要がある。
# wget http://web.archive.org/web/20060930055512/http://worris.sakura.ne.jp/fortune-meigen.tar.gz
# tar zvxf fortune-meigen.tar.gz
# iconv -f eucjp -t utf8 fortune-meigen/meigen > meigen
# strfile meigen
# mv meigen* /usr/share/games/fortune
# fortune meigen
ソクラテスがソフィストを批判したのも、彼らが『教える事』を重視し、
教師が『主題を教える』のだと彼らが考えていたからに他ならない。
これは怠慢であり、自惚れである、とソクラテスはみなした。
教師が『学習法を教え』、学生が『主題を学ぶ』のである。
学習は実を結ぶ行為であり、教える事は思い上がり、瞞着行為なのである。
これゆえにデルファイの神託は彼を『ギリシア最高の賢人』と呼んだのである。
--P・F・ドラッカー
実行確認
日本語だと横幅がやや長めになる傾向があるので、-nオプションを付けるとそれらしく出力できる。
Step4:日本語の名言をしゃべらせる その2
やること
せっかくなら日本語の格言や名言をしゃべらせたいよね。
先ほど参考にしたDevlion Memo cowsay日本語化では、
名言格言サイト 言霊inからデータ取得していた。
なるほど、その手法をいただこう。
実装
前述のサイトから丸ごと使わせていただいた。
私の環境では /usr/local/bin/kotodama として設置した。
# !/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
実行確認
終わりに
以上