たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

owariコマンドv2を作りました

作りました。それについてのポエムです

owari コマンドとは

xztaityozx.hatenablog.com

Go言語で制作し公開した「終わりに関するアスキーアートを出力する」だけのコマンドです。 例えば以下のような感じのを出すことができます

GitHubの表示を見るに、公開からだいたい3年ぐらい経っていそうなんですが、今でも時々使ってもらっているのを見るとうれしくて小躍りしてしまいます。 とくにスライドの最後とかに登場するのを見ると嬉しくて泣いてしまいますね。

公開後いくつかのPRが来ました。色をパイプ先にも強制するもの(#5)や、掃除・ドキュメント整備(#16, #8)などがありました。中には無限ヵ月放置してしまっていたやつもあり、マジすいませんという感じです(#38)。 ともかく、自分のリポジトリのなかでは一番PRが来たものとなりました。大感謝です。

そんなowariコマンドですが、最近v2をリリースしました。v2としたのは実装がごろっと変わったからです。それ以外の理由はないです

v2.0について

忍法、ReleaseのMarkdownコピペの術

  • 設計を見直しました
    • 複数のフォントを切り替えられるようにしました(--font)
      • kanbanサブコマンドに追加された、-t, --textimgオプションは--font=NotoSansCJKへのShorthandとなりました
  • owari boomサブコマンドがDeprecatedになりました。ご利用ありがとうございました。
  • 表示幅を指定する--widthオプションがDeprecatedになりました。
  • kanbanサブコマンドで、ギコ猫の表示位置を棒の右側にすることができるようになりました(--reverse)
  • kanbanサブコマンドで、ギコ猫を二匹に増やすことができるようになりました(--twin)
  • --overwriteオプションのShorthandとして-oを追加しました
  • --colorfulオプションのShorthandとして-cを追加しました
  • --durationオプションのShorthandとして-dを追加しました
  • NHKと表記していたところをOWRに変えました
  • シェル芸Bot対応として入れられていた1行目の空白をオプションに切り出しました(-E, --insert-empty, default: true)

v2.0にするきっかけ

1つ目の理由としては、先日来たこのIssueへのコメントです。kanbanサブコマンドの持ち手部分がずれているのが気になって建てたIssueでしたが、どう直そうか考えているうちに忘れたものでした。コメントにより思い出し修正を行いました。

しかし、修正は思った通りになりませんでした。kanbanサブコマンドで使っているдといった文字が、フォントなどの描画される環境によって文字幅が1になったり2になったりするからです。議論の中で特定のフォント(NotoSansCJK-Regularとか)をデフォルトとして出力する案も出ました。しかしそれは今の状態と何が違うのだろうとも思いました。結局、このIssueでは表示したいフォントにあわせて出力するようなオプションを追加することを提案しました(#43)。

さてここから気になるのが「ほかのフォントに対応したい」という要望に対する解答です。同様にオプションを追加する提案を続ければ、いずれ収拾がつかなくなることは目に見えていました。何か別の方法が必要でした。いろいろ考えているうちにモチベがもりもりになって、気づいたらブランチを切っていました。考えるきっかけをくれた@eggplantsさん、本当にありがとうございました。

実装の方は、単純にJSONにテンプレをいくつか用意すればよくない?と思ったので、いくつかのテンプレの中から名前でそれらを切り替えるようにしました。

{
 "Giko": {
    "default": [
      "∧∧   ||        ",
      "( ゚д゚)||          ",
      "/    づΦ       "
    ],
    "NotoSansCJK": [
      "∧ ∧   ||      ",
      "( ゚д゚)||         ",
      "/   づΦ        "
    ]
  },
}

こんな感じです。これらは--fontオプションを通じて切り替えができます。先の議論で追加されたオプションは--font=NotoSansCJKへのショートカットになっています。

JSONの読み込みは、Go 1.16 で追加されたgo:embedを使いました。ファイルの中身などをソースに埋め込む機能ですが、これだ!と思って使ったわけじゃなく「使ってみたかったから使った」ぐらいです。そうです趣味です。go:embedの使い心地は抜群なのですが、ユーザー定義のJSONを読ませたいときにどうすればよいのかわからなくなりました。ワハハ。なんも考えてねえじゃん。

ともあれ、複数のフォント対応をPRで受け付けることが可能になりました。うれしい。

ちなみにすべてのサブコマンドで利用できる実装にしたのですが、kanbanサブコマンドにしか複数のテンプレが存在しないです。


2つ目としては、PrintUtil.goの存在でした。このPrintUtil.goにはアスキーアートの出力に関する処理が書かれており、各サブコマンドで共通して使っているものでした。PrintUtil.goはUtilの名に恥じない何でも屋で、出力はもちろんのこと、各文字の 見た目上の長さ についての計算なども行っていました。

正直実装自体はさして問題ないなと思っていました。実際v2でも元の実装を再利用した部分があります。では何が問題だったかというと、PrintUtil.goowari/cmd以下に置いてあることです。どうせcmd以下に置くようなサブコマンドの実装でしか使わないのですが、サブコマンドの一覧がcmd以下と一致しないのが気になっていました。そうです。気持ちの問題です。なんというかこっちはついでという感じです。

おわり

owariコマンド自体はアスキーアートを出力するだけのコマンドなのですが、実際に使ってみると割と使いどころがあります。冒頭にも書きましたが、スライドの最後の一枚に配置したり、重い処理の後ろに && owariとくっつけたりなどです。自分は owari big -con infで大きな「終」をイルミネーションにするのも好きです。 インストールもgo get -u github.com/xztaityozx/owari するだけですし、ビルド済みのバイナリがよければ、GitHub Releaseに公開しています。ぜひ使ってみてくださいね。

最後にowariは無限にアスキーアートを募集しています。「終わり」っぽかったら何でもよいのでPRやIssue投げつけてください!

$ owari kanban -ga xztaityozx

| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
|        終        |
|    制作・著作    |
|   ̄ ̄ ̄ ̄ ̄ ̄ ̄  |
|    xztaityozx    |
|_________|
  ∧∧   ||
  ( ゚д゚)||
  /    づΦ

うむ…ずれるな…