goを間違えてogと入力してしまった時に、逆さのGopher君が通り過ぎるコマンド

概要

go ... って打ちたくて og ... って間違えちゃうことごく稀にありますよね?よね?
そんな時にいい感じにtypoを注意してくれる og コマンドを作りました!!
github.com/ramenjuniti/og

挙動

og_demo2_1.gif
なんと!逆さまなGopher君が通り過ぎます!ただただ通り過ぎます!

og_demo2_2.gif
og run main.goみたいな場合でも容赦無くGopher君は通り過ぎます!

Gopher君かわいい!

インストール(2019/11/15に追加)

Goの環境があればgo getでインストール可能です。

go get github.com/ramenjuniti/og

作り方

画像を用意する

gopher.png

元画像はここから頂きましたhttps://golang.org/doc/gopher/frontpage.png

AA変換(アスキーアート生成)でAAを生成

   D;;:;;:;;:;;:;:;:;;:;:;:;:;;:;;:;;:;;:;z
   $;:;:;::;::;:;;:;;:;;:;;:;;::;;::;;:;;;I
  .I;;:;;:;;:;;::;;:;:;:;;:;:;;:;:;:;::;;:I
  ,<;;::;:;;::;;:;;;;;;;;:;::;;:;;:;;;:;;;I
  ,(;;;:;::;:;;::;;j=1J71<;;;:;:;;::;:;:;:I
  J;;:;;;:;;::;;;;:r  ] .>;;;:;:;:;;:;:;;;r
  z;;::;:;;:;;:;;j=<?75?7~?I;;:;;:;;;:;:;<]
  (<;;;;;;:;;;;;;?+~(J-J-_(3;;;;;;::;;:;;+\
  ,(;:;:;j/7!''??1+?MMMMM1+?7771+<;;;:;;:j
  .P;;;;J!..       4;<<iJ        .4<;;:;;2 
.3;J<;;j\(M#Q       D;<2.MM5.      1:;;;j73,
$;jMN<;?|,WH3       $;:t.MM#       ,(;;jP;;?|
4<;T9TJ;?.        .J;;;?&         .t;;jM@:;+%
 (1++++Y+;?C+...J7<;;;:;;?i..  ..J>;jv<;;;j=
         .71+<;;;;;;;:;;;;;;;;;;<+J=  ?77!
             '_?771+++++++++?77!

コードを書く

package main

import (
    "fmt"
    "os"
    "strings"
    "syscall"
    "time"

    "github.com/gosuri/uilive"

    "golang.org/x/crypto/ssh/terminal"
)

func main() {
    og := []string{
        "   D;;:;;:;;:;;:;:;:;;:;:;:;:;;:;;:;;:;;:;z  ",
        "   $;:;:;::;::;:;;:;;:;;:;;:;;::;;::;;:;;;I  ",
        "  .I;;:;;:;;:;;::;;:;:;:;;:;:;;:;:;:;::;;:I  ",
        "  ,<;;::;:;;::;;:;;;;;;;;:;::;;:;;:;;;:;;;I  ",
        "  ,(;;;:;::;:;;::;;j=1J71<;;;:;:;;::;:;:;:I  ",
        "  J;;:;;;:;;::;;;;:r  ] .>;;;:;:;:;;:;:;;;r  ",
        "  z;;::;:;;:;;:;;j=<?75?7~?I;;:;;:;;;:;:;<]  ",
        "  (<;;;;;;:;;;;;;?+~(J-J-_(3;;;;;;::;;:;;+|  ",
        "  ,(;:;:;j/7!''??1+?MMMMM1+?7771+<;;;:;;:j   ",
        "  .P;;;;J!..       4;<<iJ        .4<;;:;;2   ",
        ".3;J<;;j|(M#Q       D;<2.MM5.      1:;;;j73, ",
        "$;jMN<;?|,WH3       $;:t.MM#       ,(;;jP;;?|",
        "4<;T9TJ;?.        .J;;;?&         .t;;jM@:;+%",
        " (1++++Y+;?C+...J7<;;;:;;?i..  ..J>;jv<;;;j= ",
        "         .71+<;;;;;;;:;;;;;;;;;;<+J=  ?77!   ",
        "             '_?771+++++++++?77!             ",
    }
    ogw := len(og[0])

    tw, _, err := terminal.GetSize(syscall.Stdin)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }

    for i := range og {
        og[i] = strings.Repeat(" ", tw) + og[i]
    }

    writer := uilive.New()

    writer.Start()
    for i := 0; i <= tw+ogw; i++ {
        var out string
        for _, v := range og {
            if i < ogw {
                out += v[i:tw+i] + "\n"
            } else if i < len(v) {
                out += v[i:] + "\n"
            } else {
                out += "\n"
            }
        }
        fmt.Fprint(writer, out)
        time.Sleep(10 * time.Millisecond)
    }
    writer.Stop()
}

コードはこれだけ!簡単!

terminalのサイズを取得するためにgolang.org/x/crypto/ssh/terminalを使用
terminalの出力の更新をリアルタイムに行うためにgithub.com/gosuri/uiliveを使用

まとめ

研究室にいるときにふと思いついて深夜テンションで作ったんですが、可愛く出来たので満足しています笑

今後時間があったら動きなんかも追加したいですね

参考

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away