あひる焼きfortune

この記事は あひる焼き Advent Calendar 2015 – Adventar の12月05日分の記事です．

みんなでまったり #あひる焼き すればええんじゃないかなと思います。

ということで最近焼いたあひるの話を．

発端

fortune というフォーチュンクッキーのような格言をランダムに表示するプログラムがあります．様々な辞書データが存在していて自作も出来ます．

pi@raspberrypi ~ $ sudo apt install fortunes # fortuneの導入
pi@raspberrypi ~ $ fortune # fortuneの実行
Some of us are becoming the men we wanted to marry.
-- Gloria Steinem
pi@raspberrypi /tmp $ cat <<__EOF__> data # fortuneのデータ作成
テスト
%
1行目
2行目
%
__EOF__
pi@raspberrypi /tmp $ strfile data # データ変換
"data.dat" created
There were 2 strings
Longest string: 16 bytes
Shortest string: 10 bytes
pi@raspberrypi /tmp $ ls data*
data data.dat
pi@raspberrypi /tmp $ fortune data # 自作データを利用
1行目
2行目
pi@raspberrypi /tmp $ fortune data
テスト

その辞書データに @ahiru3netさんのあひる焼きに対するmentionを使うと楽しいかもしれないと思いました．でもデータを集めるのが面倒だなとつぶやいたところ @shimadahさんにGitHub を教えてもらいました．

Na0ki/ahiru_yakuna

@matoken sourceにまとまってまっせ https://t.co/qcEKJRX2yE

— Shimada Hirofumi (@shimadah) 2015, 11月 27

それを元にコネコネして……うまくいかないところに@ahiru3netさんの助言．

@matoken どこも strfile file file.dat したあとに fortune file ってしてますね

— 燃焼のメタファー.exe (@ahiru3net) 2015, 11月 27

焼けた

てことで #あひる焼き fortune こんな感じで https://t.co/ygpnzLoLJk

— (「ΦωΦ)「 (@matoken) 2015, 11月 28

やってることはahiru_yakunaプラグインのmentionのデータをもらってきて乱暴にfortuneで利用できる形式に変換して~/.zshrc に登録してログイン時に台詞を出すようにしています．

mkdir ~/.fortune;wget -O - https://github.com/Na0ki/ahiru_yakuna/raw/master/config.yml|grep ^\-\ \" | sed 's/^-\ \"//'| sed 's/"$/\n%/' | sed 's/\\n/\n/g' > ~/.fortune/ahiruyaki && strfile ~/.fortune/ahiruyaki ~/.fortune/ahiruyaki.dat && echo fortune ~/.fortune/ahiruyaki >> ~/.zshrc

これでログインのたびに以下のようにメッセージが表示されるようになりました :)

焼いちゃうのか？！本当に焼いちゃうのか？！
pi@raspberrypi ~ $

もっと焼く

でもメッセージだけだとちょっとさみしいです．
そこで cowsay を使ってみます．cowsay はアスキーアートで書かれた牛などのキャラクタに指定した台詞を喋らせることの出来るプログラムです．都合のいいことに選択できるキャラクタの中にあひるがいます．あひるに喋ってもらいましょう!

pi@raspberrypi ~ $ sudo apt install cowsay # cowsay 導入
pi@raspberrypi ~ $ cowsay hello cow # cowsay 実行
___________
< hello cow >
-----------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
pi@raspberrypi ~ $ cowsay -f duck hello duck # あひるに喋らせる
____________
< hello duck >
------------
\
\
\ >()_
(__)__ _
pi@raspberrypi ~ $ cowsay -f duck あひる焼き # 日本語を喋らせる
_______
< あひる焼き >
-------
\
\
\ >()_
(__)__ _

日本語を喋らせると吹き出しがずれてしまいます．あひる焼きの台詞の殆どは日本語なのでこのままではまずいです．調べてみるとバグレポートされていました．

#769565 – cowsay: output format with widechar not good – Debian Bug report logs

中国語?もやっぱりずれちゃうみたいです．
文字数と見た目のキャラクタの文字数のズレから起こっているようです．とりあえず日本語だけでも動くように出来ないかと euc-jp に変換して文字数を確認してといったダメな修正をしていたところGoogle+の以下の投稿のコメントで +Masakazu Takahashiさんがさくっとパッチを作ってくれました!

cowsay 結構前に UTF8 対応してるぽいけどうまく動かない % cowsay あひるやき _____ < あひるやき > ——- \ …

cowsay: fix width of multibyte characters

このパッチは報告しましたが，取り込まれてもstretch以降でしょう．ということでDebianだと以下のようにしてソースを入手してパッチを当てることが出来ます．

pi@raspberrypi ~/src $ sudo apt install libtext-charwidth-perl # 必要なパッケージの導入
pi@raspberrypi ~/src $ apt-get source cowsay # cowsay の source 入手
pi@raspberrypi ~/src $ cd cowsay-3.03+dfsg1 # ディレクトリ移動とパッチ適用
pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ wget -O - https://gist.githubusercontent.com/emasaka/639a9168c6a9ddba044f/raw/1a55ec58ded59b3181f1721dbbe814a38d5ea4cb/cowsay-mbswidth.patch | patch -i -
patching file cowsay
pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ ./cowsay -f duck あひる焼き
____________
< あひる焼き >
------------
\
\
\ >()_
(__)__ _

~/bin 辺りにコピーして使ったり，以下のような感じで既存のパッケージを置き換えてしまってもいいかもしれません．

pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ vi debian/control
- Depends: ${misc:Depends}, ${perl:Depends}
+ Depends: ${misc:Depends}, ${perl:Depends}, libtext-charwidth-perl
pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ dpkg-buildpackage -b
pi@raspberrypi ~/src/cowsay-3.03+dfsg1 $ sudo debi

さて，fortuneのことを忘れてしまいそうですが以下のようにしてあひる焼きfortuneの結果をあひるに喋らせます．

pi@raspberrypi ~ $ cowsay -f duck `fortune ~/.fortune/ahiruyaki`
______________
< ヒッヒッヒッ >
--------------
\
\
\ >()_
(__)__ _

いい感じです :)

~/.profile 辺りに登録しちゃいましょう．aliasも設定してみます．

pi@raspberrypi ~ $ echo 'alias a="fortune ~/.fortune/ahiruyaki | cowsay -f duck"' >> ~/.profile
pi@raspberrypi ~ $ echo a >> ~/.profile

これでlogin時や a と入力することで実行されます．

Last login: Fri Dec 4 23:32:05 2015 from 192.168.2.210
________________________________________________________________________________
/ あひる焼きというものには鮮度があります。焼けば焼くほどに、あひる焼きとは廃れて \
\ いくものなのです。 /
--------------------------------------------------------------------------------
\
\
\ >()_
(__)__ _
pi@raspberrypi ~ $ a
________________________
< バーニング通帳！！！！ >
------------------------
\
\
\ >()_
(__)__ _

Xでも焼く

GUI の X 版のcowsayも存在します．こいつも試してみましょう．

pi@raspberrypi ~ $ sudo apt install xcowsay
pi@raspberrypi ~ $ xcowsay `fortune ~/.fortune/ahiruyaki`

なかなか特徴的なcowが喋りました．せっかくなのであひるに喋らせましょう．吹き出しの向きと位置を変えてあひる画像を指定しています．

pi@raspberrypi ~ $ wget https://github.com/Na0ki/ahiru_yakuna/raw/master/ahiru240.jpg -O ~/.fortune/ahiru240.jpg
fortune ~/.fortune/ahiruyaki | xcowsay -l --bubble-at=0,-60 --image=$HOME/.fortune/ahiru240.jpg

背景がちょっと邪魔なので透過処理をしてみます．

いい感じです :)
例によってaliasにしておきます

pi@raspberrypi ~ $ echo alias xa='fortune ~/.fortune/ahiruyaki | xcowsay -l --bubble-at=0,-60 --image=$HOME/.fortune/ahiru240.png' >> ~/.profile

そんなこんなでみんなのおかげであひるがいい感じに焼けるようになりました．@shimadahさん, @ahiru3netさん, @emasakaさんありがとうございました!

＃そうそう，以前はフレームバッファでもあひる焼きしてました．

フレームバッファであひる焼き(fbterm の 背景画像の設定) | matoken’s meme