2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-03-16

これ 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に移行してこんな設定にしない

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?