Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

fukubaka0825
Site Reliability Engineer at eureka, Inc. devops/AWS/IaC/Terraform/コンテナ/サーバレス/Go/DDD
https://www.fukubaka0825.dev/
Why not register and get more from Qiita?
  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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした