ShellScript
Go
Git
gopher
BashScript

Gitコマンド打ってGopher君を怒らせてみた(GOPATH配下以外で)


これ is 何

題名の通り。GOPATH配下以外のGitコマンドはGopher君が許しません。

Gopher君可愛いよGopher君

今回はShellScriptでの設定の話が多めになります。

Google様は絶対

顔文字パターン

giphy.gif

gifパターン

giphy.gif



経緯

GOPATH以下でないlocalのディレクトリで作業していたらdep ensureでうまく依存関係入らなくて詰んだ経験から。

他言語も全てGOPATH/srcで管理して入り人もいるようなので、僕もGoogleさまの犬になるために、$GOPATH配下のディレクトリでしかgit cloneできない仕様に変えてしまうことにした。

Go Oriented.

Goに居ては(ry



動作環境

macOS Mojave バージョン10.42.2

go 1.11.4

zsh


プロセス



1.BashScriptを一から学ぶ

Linux初心者のシェルスクリプト入門 - Qiita

シェルスクリプト(bash):基本的な5つのTips - Qiita

などを参考に。

特にエムスリーさんのこの記事よかった

bashスクリプティング研修の資料を公開します - エムスリーテックブログ



2.gopherコマンドを作る

Goで乱数 - Qiita

本物の golang を... 本物の Gopher を、お見せしますよ。 - Qiita

GitHub - mattn/gol-cmd

を参考に作成。

↓をコンパイルしてgopherコマンドとしてぶち込んだ

main.go

package main

import (
"fmt"
"io"
"math/rand"
"os"
"time"
)

var out io.Writer = os.Stdout

func main() {
fmt.Fprintln(out, "\x1b[2J")
gopherMsg := makeGopherMsg()
for i := 0; i < 75; i++ {
fmt.Fprintf(out, "\x1b[10;%dH\x1bK", i)
fmt.Print(gopherMsg)
time.Sleep(50 * time.Millisecond)
}
}

func makeGopherMsg() string {
rand.Seed(time.Now().UnixNano())
var gopherMsg string
randInt := rand.Intn(4)
switch randInt{
case 1:
gopherMsg = ` ʕ◔ϖ◔ʔ { Google万歳!!!! `
case 2:
gopherMsg = ` ʕ◔ϖ◔ʔ { まだGOPATH以外で消耗してるの? `
case 3:
gopherMsg = ` ʕ◔ϖ◔ʔ { まだGo言語以外で消耗してるの? `
case 4:
gopherMsg = ` ʕ◔ϖ◔ʔ { お腹すいた `
default:
gopherMsg = ` ʕ◔ϖ◔ʔ { まだGo言語以外で消耗してるの? `
}
return gopherMsg
}


乱数でメッセージを生成しています。

作成ソースはこちら

GitHub - takafk9/gopher-cmd: gopher is 流れる



3.gitのaliasを$GOPATH以下以外でgopherコマンドに変更するスクリプトを書く

bashのif文でワイルドカード・正規表現を用いて条件判断をさせる | 俺的備忘録 〜なんかいろいろ〜

シェルスクリプトを書く際に便利なコマンド&基本の覚え書き - Qiita

gopher.sh

#!/bin/sh

if [[ $(pwd) != *$GOPATH* ]]
then
# GOPATH配下以外ならgopher様に怒られろ
# gifで怒る
alias "git=imgcat ~/pictures/gopher.gif"
# 顔文字で怒る
# alias "git=gopher"
else
# GOPATH配下なら正常に戻したい
alias "git=git"
fi

ポイントは$GOPATHを含む場合true返したいってことで

3行目にワイルドカードの記述を採用しているところ。bashでもこんな記述できるんやな、、、、



4.cdコマンドを魔改造して、cdするたびにgopher.shを反映するようにする

.zshrc

# cd魔改造

function gocd(){
\cd $1;
source ~/project/udemy/demo/gopher.sh;
}
alias cd=gocd

bashで複数コマンドのエイリアス - Qiita

上のサイトを参考にcdコマンドを、毎回gopher.shを反映するように魔改造しました。

\cdにしないと無限ループになって悲しくなるので注意



5 imgcatインストールして、表示するgif作る

作成したgopher.shのgitのaliasを、gopherコマンドじゃなくてimgcatコマンドにするよ

imgcat - ターミナル上で画像を表示するコマンド - Qiita

まず、上を参考にimgcatをインストールするよ

無料GIFアニメ作成「AlpacaDouga(アルパカドウガ)」

そして、上のアプリでgifを頑張って加工して反映させた



大変だったこと


  1. shellscriptで部分一致でtrue返すとかどうやんねん

  2. cdするたびにスクリプト読み込むってどうすればええんやってなった

  3. gifカスタマイズ辛い


得られたこと


  • bashscriptの基礎知識

  • 作業場を間違えそうになるとgopher君が叱ってくれる環境



今後の展望


  • インフラのコード化の文脈からしても、shellscriptもっとオベンキョせねば

  • imgcatでも何パターンかのgopherくんに怒ってもらいたかったのですが、今後そこの処理を書いていきたい。



結論

go moduleに移行してこんな設定にしない