読者です 読者をやめる 読者になる 読者になる

生涯未熟

プログラミングをちょこちょこと。

goroutine使ってゴニョゴニョするCLIツールを作った時の備忘録

備忘録として自分用に書きます。

cobra良いよ

以前までurfave/cli使ってたんですが、「dockerのcliとかcobra使ってたよな〜」とよくcobra見かけるようになったので使ってみた。

$ cobra initでアプリケーションの土台作ってくれるので、煩わしいこと考えずにサクッと開発に入れて良い。

あとは、urfave/cliよりも細かく挙動の管理が出来そう(未検証)。

またエラー時などにカスタマイズした標準出力する場合は、SilenceUsageSilenceErrorsをやっといたら吉。

きちんとデザインパターン使ってみた

結城浩さんのデザパタ本を読み終わったので早速デザパタを取り入れてみた。

Goの場合、こちらのリポジトリに実装例がまとまってるので読むと得るものが多い。

github.com

雑にgoroutine回した時の注意

雑に大量のスレッド作成した時にpanic等で落ちると、大量のログが吐かれて元のエラー内容が確認できない場合があるので、

$ go run main.go 2>hoge.txt

とかでファイルに吐いてあげると良い。

複数のgoroutineから同一mapを参照すると死

エラーで死。1.6からエラー吐いてくれるようになったらしい。

排他制御やるか、channelとWaitGroup使って後からまとめてmapに代入したりするべし。

プログレスバー

CLIツールでプログレスバーを実装する場合、cheggaaa/pbが簡単。

見た目が気に入らない場合はbriandowns/spinnerとか使うと良い。

今回はhttp.Get()でのダウンロードの際にpbを使ってみたが、大量のgoroutineで並列処理した状態でプログレスバーを出すと表示が50%で止まったりしたので、並列度を定義し徐々に表示を増やしていった方が良い感じ。

ちなみにhttp.Get()プログレスバーを出す場合はこんな感じのコード。

 response, err := http.Get(url)
    if err != nil {
            // エラー処理
    }

    fileSize := response.ContentLength
    progressBar := pb.New64(fileSize).SetUnits(pb.U_BYTES)
    progressBar.Start()
    reader := progressBar.NewProxyReader(response.Body)

    defer response.Body.Close()

    io.Copy(file, reader)

Goglandの謎挙動

開発途中でpbをgopkgからインストールし、Goglandで使おうとしたら該当ディレクトリを読み込まず。

再起動したら読み込んだが、もしかしたら読み込みタイミングがアレなのかもしれない。

[追記] 上部メニューバーのFile→Synchronizeの実行でファイルの再読込を行えばOK

vim-goの入力補完が動かなくなった

.vimrcの整理整頓作業をしていたところ、突然vim-goの入力補完が下記のようになった。

f:id:syossan:20170216133259p:plain

「いやいや、こっちがPanicだよ」と思いつつ、色々と対策を探しました。

対策

そもそも、vim-goの補完にはgocodeが使われており、そちらのISSUEを探したところありました。

github.com

「gocodeを再起動させてみ?」って感じのレスがあったので、一度gocodeのアップデートをかましてから再起動しました。

$ gocode close
$ go get -u github.com/nsf/gocode

するとキチンと補完してくれるようになりました。

とりあえず困ったら再起動ですね!

kirimoriにVimのExコマンドを実行する機能を追加しました

細々とkirimoriの開発をしております。

今回はkirimori addkirimori removeをした際に各プラグインマネージャー毎に対応したExコマンドを叩く機能を追加しました。

例えば、Vundleの場合はkirimori addした際に:PluginInstallが、kirimori removeした際に:PluginCleanが自動で実行されます。

実行してみると以下のような動きになります。

f:id:syossan:20170206231645g:plain

これで結構便利なツールになったのでは、と思います。

まだまだ機能改善の余地がありますので、「これ欲しいな」や「動かない」など何でもご意見お待ちしております。

github.com

ranger-cdをzshで使えるようにした

rangerを教えてもらったんですが「めちゃ便利だ!」と今更ながら気付いた私です。

さて、rangerにはexamplesというディレクトリの中に様々な便利関数が置かれています。

その中でもranger-cdは、rangerで最後にqで抜けたところに移動してくれるという便利関数なのですが、zshだとそのままコードをコピっても動きません。

ranger/bash_automatic_cd.sh at master · ranger/ranger · GitHub

なので、zshで動くように変更を加えたものを作ったので置いておきます。

github.com

ここにある、ranger-cd.shの中身をコピって.zshrcに貼り付ければ動くはずです。

Dockerでとんでもないハマり方をした

ちょっとDockerを触ってみてるsyossan27です。

雰囲気でkirimoriが動くDockerImageを作成する時にとんでもないハマり方しました。

一体何が

ホームディレクトリでDockerfile作って、kirimoriのバイナリファイル置いてCOPYでDockerImageにコピーしようとDockerfile書いて、いざ実行とbuild叩きました。

$ pwd
/Users/syossan27
$ docker build -t kirimori .

するとですね、何かメッセージが表示されたんですが表示されるGB数が10GBを越えてたんですよね。

全く止まる気配が無かったので一旦止めて対策を探し求めました。

するとこんなのが。

https://groups.google.com/forum/#!topic/docker-user/UJT6aO4hTrU

結局、適当なディレクトリを作ってそこにDockerfileとバイナリファイルを置いて、先ほどと同じコマンドを実行することでなんとかDockerImage作成出来ました。

いやー、びっくりした・・・