読者です 読者をやめる 読者になる 読者になる

クソコマンドを支える技術

これは CPS Lab Advent Calendar 2016 12日目の記事です。

www.adventar.org

まじで話すネタがないので、

github.com

これについてちょっと言及する。

クソコマンドを作る

クソコマンドは他人に実行してもらうことに意義がある、このようにね。

f:id:munisystem:20161212234851p:plain

なのでできるだけ環境に依存しない方式を取るべきだ。 python2はだいたいの環境で入ってるし、shellスクリプトもちゃんと書けば機能してくれる。コンパイルしてバイナリが吐ける言語ならもっと良い。Github releaseにでもコンパイル済みバイナリを置いておいて、wgetとかで引っ張ってくるだけで試せるからだ。

今回はバイナリを吐けるGolangを使って、Terminal上に加藤恵を表示させることを考えよう。

ANSI escape codeを使う

画像を表示するだけなら、imgcatを使えば良いだろう。こんな感じで綺麗に表示できるしお手軽だ。

f:id:munisystem:20161213000655p:plain

ただimgcatはOSX・iTerm環境でしか動かないし、そもそもimgcatが対象のマシンにインストールされていないと意味がない。 Windows環境はまだしも、Linux環境ですら動かないのは致命的だ。(一部の層に絞るというのであればそれでも構わない)

なのでANSI escape codeを使った文字での表現がこの場合ベストと言えるだろう。 ANSI escape codeの説明をすると長いので例だけあげるが、

$ echo "\x1b[31mMegumiKato"

のように叩くとターミナル上に赤色でMegumiKatoと表示される。echoで吐き出した文字のうち、\x1b[31mANSI escape codeだ。これについては以下が参考になるだろう。

qiita.com

さて方針が決まったが、画像をANSI escape codeに変換する作業が必要だ。とは言ってもこれをやってくれるツールは既に存在していて、わざわざ苦労してやるほどのものではない

image-to-ascii-cli

hihumiを作る時に作ったツールがこれ。

github.com

$ npm i -g image-to-ancii-cli
$ image-to-ancii -i <file path>

で画像からAnsi escape codeを含んだ文字に変換できる。

f:id:munisystem:20161213012722p:plain

img2txt

pythonで書かれたコンバーター。文字ではなくスペースを使って表現されるので、画像っぽさを出すならこっち。

github.com

virtualenvがなくてもpipがあればなんとかなる。

$ pip install pillow
$ python img2txt -i <file path> --ansi

ただ画像がめっちゃ引き伸ばされるので、

f:id:munisystem:20161213014805p:plain

変換前に画像の縦方向を60%くらいに押しつぶしておくといい感じになる。

f:id:munisystem:20161213015314p:plain

今回はコレを使うことにした。

コマンドを作成する

変換も済んだので、今度はこれをgolangから表示させる。<txt data>の部分にimg2txtの実行結果を貼り付けるだけだ。

package main

import (
    "fmt"
)

const image =`<txt data>
`

func main() {
  fmt.Println(image)
}

OSXの場合はpbcopyを使うと簡単にクリップボードに結果を登録できる。

$ python img2txt -i <file path> --ansi | pbcopy

linux環境では

$ python img2txt -i <file path> --ansi > ansi.txt

みたいにtxtに一回渡してコピーするといいかもしれない。

Raspberry Piで実行する

Golangの強みはクロスコンバイルだ。

$ GOOS=linux GOARCH=arm go build *.go

みたいにオプションを指定すれば、Raspberry Piで実行できるバイナリが作成できる。あとはscpなどでバイナリを送ってやれば...

f:id:munisystem:20161213021604p:plain

加藤恵をRaspberry Piで楽しむことが出来るようになるわけだ。

まとめ

どんな環境でも使えてこそのクソコマンド。皆もクソコマンドを量産して、他人のPCのaliasを勝手に張り替えよう。

因みに今回作ったmegumiコマンドはGithubにあがってるので、よかったら使って欲しい。少なくともhihumiよりは存在価値があるだろう。

github.com