ダージリンさんに格言をお喋りしてもらおう、という話

# この記事は？
- 前回、[仕事の役には立たない、Linuxにおけるジョークプログラムの話](http://qiita.com/Hiroki_lzh/items/8cf206d54f91e29b3912)という記事でcowsayについてちょっと触れた。
- そのあと、当該記事について呟いてくれた中にこのようなものがあった。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">fortuneとcowsayでダー様に喋らせるのてきないかな</p>&mdash; かのーくんと七曜の魔女 (@Canoo11KIT) <a href="https://twitter.com/Canoo11KIT/status/751680761854504961">2016年7月9日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

- よし、やるか。

# まずは環境情報
## 環境情報
前回同様、私の環境では下記です。
今回はPerlとRubyに少し触るのでバージョン明記。

| 項目 | 情報 |
|:-:|:-:|
|CentOS|CentOS Linux release 7.2.1511|
|Perl|v5.16.3|
|Ruby|ruby 2.0.0p598 (2014-11-13)|

# ゴール地点の設定
## ダー様に喋らせる、とは
そもそもダー様とはなんだ、という人のために説明をすると、ダー様とは
[ガールズ＆パンツァー(GIRLS und PANZER)](http://girls-und-panzer.jp/)というTVアニメがあり、そこに登場する人物である
ダージリンという女の子を指す。
![644862.png](https://qiita-image-store.s3.amazonaws.com/0/129674/65c9be34-2d5f-d4eb-01ba-3b16cf00fca2.png)
作中では度々、「こんな格言を知ってる？」という前置きを使いつつ格言や諺を披露することがあったため、
この記事のゴール地点は
『ダー様に様々な格言や諺を披露させる』
と定めようと思う。

# Step1：ダージリンさんのAAを出力する
## やること
cowsayではデフォルトでは牛がしゃべるが、-fオプションとして用意された様々な動物、
もしくはTuxやハローキティなどのキャラクターを指定することができる。
この設定ファイルをいじって、ダー様のファイルを用意します。

## 実装
さて、当該の設定ファイルはcowファイルとして保存されており、cowsay -lでどこに保存されているか確認できる。

```bash
$ 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の微調整は各個、お願いしたいところです。

```bash
##
## ダージリンさん
##
##
$the_cow = <<EOC;
   $thoughts
    $thoughts
　　　　　 | . . . . .　. x. .　.＼ . . ＼ . . . . . . ＼ . . . . . .　.＼.∨| . .
　　　 　 x. . . . . . . .|.| . . . . |＼ . . ＼. . ／ .　.＼. . . . . . . .|x| . .
　　　 　 x. . . . . . . .|.|ｉ . . . . 、 ＼ . . Х＞― .斗＼ . .　.　|x| . .
　　　 　 x. . . . . . . .|八 . . . . ＼　｀　‐---／　弌Y^ . . . . .ト|人厶
　　　　　 |. .| . .　.l. .x　＼＼ . . ＼　　 〈/Ｖ ＼　ヽ　| . . . |tく ヘ
　　　　　 |. .| . .　.| . .|＿___,＼＼.　. ＼　 　 ＼く___ﾉ　| . |. ∧|. . . . . 〉
　　　　　 |. .| . .　.|／| 　 　 .斗≧=‐----　　　　　　 ﾉイ|/　人＿／〉
　　　　　 |. . . . . ∧. .'. 　Ｙ＾Vj弌　　　　　 　 　 　 　 　 __／ . j. . .イ
　　　　 　 . . . . . . . . . .V人　＼__〉　　　　　　　　　　　 |/. . ／＼イ
　　　 　 　 ＼.〈＼ . . ＼＼ヽ.　　　　 ′　 　 k 　 　 ∧. ∧. . . .ｿ
　　　　　　 　 ＼　＼ . . ＼トヘ.　　　 　 く　　ﾉ　　　　　∨__,＞く
　　　　　　　　　　 　 ｀　‐--- T＼　　 　 　 　 　 ／　 　 V￣＼
　　　　　　 　 　 　 　 　 　 　　乂__≧=‐-----rく　　　 ／　　　 ＼
　　　　　　　　　　 　 　 　 　 （　 ＼＿ﾉ､__,ﾉ／|　 　 ／　　　 　 　 ト
　　　　　　　　　　　　　　　　　　　　　　　／　∧ _／　　　　　　 　 |　 ＼
EOC
```

### 実行確認
```bash
$ cowsay -l
Cow files in /usr/local/share/cows:
Darjeeling beavis.zen bong bud-frogs bunny cheese cower daemon default
    ↑ 想定通りのファイルが表示されること
```

![000049.jpg](https://qiita-image-store.s3.amazonaws.com/0/129674/f6942bb8-bc4d-858f-44fe-bfc632b920fc.jpeg)

# Step2：cowsayではなくDarsayとして出力する
## やること
せっかくならcowsayでなくDarsayにしてやりたい。ダー様がしゃべる、としてDarsay。
やることとしては、

1: 日本語の格言にも対応する。
2: デフォルトの動作を牛ではなくダー様にする
3: 「こんな格言を知ってる？」を埋め込む。

そんなわけで日本語対応と若干のアレンジを行う。


## 実装
1: 日本語の格言にも対応する。
先人がいたのでそちらを参照。
[参考:Devlion Memo cowsay日本語化](http://mjhd.hatenablog.com/entry/cowsay-japanese-edition)

2: デフォルトの動作を牛ではなくダー様にする
引数設定の場所をちょちょいと変更してあげればOK。

```pl
#変更前
%opts = (
    'e'         =>      'oo',
    'f'         =>      'default.cow',
    'n'         =>      0,
    'T'         =>      '  ',
    'W'         =>      40,
);
```

```pl
#変更後
%opts = (
    'e'         =>      'oo',
    'f'         =>      'Darjeeling.cow',
    'n'         =>      0,
    'T'         =>      '  ',
    'W'         =>      40,
);
```

3： 「こんな格言を知ってる？」を埋め込む。
標準入力をPerlの処理に受け渡すタイミングでメッセージを付与しようと思う。
具体的にはslurp_input関数の中身です。
message配列には受け取った文字列が改行ごとにVAR1,VAR2と格納されるので、
配列の先頭にdarjeeling の2行を追加してあげることで簡易実装とした。

```pl
#変更前
chomp(@message = <STDIN>);
```

```pl
#変更後
chomp(@message = <STDIN>);
my @darjeeling = ("こんな格言を知ってる？","");
unshift(@message, @darjeeling);
```

## 実行確認
![WS000013.JPG](https://qiita-image-store.s3.amazonaws.com/0/129674/7d0033d9-52a4-66c7-ad0d-2b360555ce6d.jpeg)



# Step3:日本語の名言をしゃべらせる その1
## やること
せっかくなら日本語の格言や名言をしゃべらせたいよね。
そんなわけでまずは正攻法、fortuneコマンドに日本語の名言を入れ込む。

## 実装
日本語のfortuneのファイルを提供している場所はいくつかあるのですが、
今回は[星が見える名言集](http://web.archive.org/web/20060930055512/http://worris.sakura.ne.jp/fortune.html)から取得。
EUC-JPのエンコーディングのため、UTF-8環境においては、meigenをUTF-8エンコーディングに変換後、strfileで.datファイルを作成する必要がある。

```bash
# 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オプションを付けるとそれらしく出力できる。
![WS000010.JPG](https://qiita-image-store.s3.amazonaws.com/0/129674/e053f85f-6a96-f667-576a-773970c74b93.jpeg)


# Step4:日本語の名言をしゃべらせる その2
## やること
せっかくなら日本語の格言や名言をしゃべらせたいよね。
先ほど参考にした[Devlion Memo cowsay日本語化](http://mjhd.hatenablog.com/entry/cowsay-japanese-edition)では、
[名言格言サイト 言霊in](http://www.kotodama.in/)からデータ取得していた。
なるほど、その手法をいただこう。

## 実装
前述のサイトから丸ごと使わせていただいた。
私の環境では /usr/local/bin/kotodama として設置した。

```rb
#!/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
```

## 実行確認
![WS000011.JPG](https://qiita-image-store.s3.amazonaws.com/0/129674/4d850a43-6a22-7da5-a13c-1f709ef6ddec.jpeg)


# 終わりに
![WS000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/129674/36897376-8608-d8e9-efe3-1e7381f9673b.jpeg)




* * *
以上