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

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

👇👇👇
[github.com/ramenjuniti/og](https://github.com/ramenjuniti/og)
👆👆👆

slコマンドみたいなやつです笑

## 挙動（2019/11/16にgif修正）

![ezgif-2-273dbef8bf44.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184505/b0fd6e3d-4341-40a7-e46c-cd5aab0f1e7b.gif)
なんと！逆さまなGopher君が通り過ぎます！ただただ通り過ぎます！

![ezgif-2-a1c5e34657c7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184505/0f98dfd2-52e5-08bc-aaea-86d5a5bb5153.gif)
`og run main.go`みたいな場合でも容赦無くGopher君は通り過ぎます！

**Gopher君かわいい！**

## インストール（2019/11/15に追加）

Goの環境があれば`go get`でインストール可能です。
実行するには`$GOPATH/bin`にPATHが通っている必要があります。(2019/11/16に追加）

```
go get github.com/ramenjuniti/og
```

## 作り方

### 画像を用意する
![gopher.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184505/1d753c12-351d-80c3-039a-ba42ca4c1ab9.png)

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

### [AA変換(アスキーアート生成)](https://tool-taro.com/image_to_ascii/)で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!
```

### コードを書く

もちろんGoで！

```go:main.go
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](https://godoc.org/golang.org/x/crypto/ssh/terminal)を使用
terminalの出力の更新をリアルタイムに行うために[github.com/gosuri/uilive](https://github.com/gosuri/uilive)を使用

## まとめ

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

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

## 参考

* [lsを間違えてdlと入力してしまったときに、D言語くんが通り過ぎるコマンド](https://qiita.com/ueshita/items/06befb8790736c7294ae)
* [本物の golang を... 本物の Gopher を、お見せしますよ。](https://qiita.com/mattn/items/b7889e3c036b408ae8bd)
* [Go言語をWeb上で楽しめる Go Playground で SL 動かしてみた。](https://mattn.kaoriya.net/software/lang/go/20121213175242.htm)