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

ねこのて

- nekonote -

Golint < Json should be JSON!

f:id:dojineko:20170216213454j:plain

「えっ、そんなん言われても・・・」


使ってますか Golint

github.com

この子です。Golangを使ってるときには欠かせない(はず)の静的解析ツールです。

細かな関数名のスペルだったり、明らかに冗長なコードを書いていたり、
あるいは公開している関数や構造体なのにドキュメントコメントが無い場合などなど
色々アドバイスをくれる憎いやつです。

具体的にどんなことしてくれるのかは下記のスライドが詳しかったので紹介します。

www.slideshare.net

Golint の簡単な使い方

導入は go get から簡単に行なえます。

go get -u github.com/golang/lint/golint

usage がそのままなので抜粋します。
基本形は golint hoge.gogolint package-name です。

$ golint -h
Usage of golint:
    golint [flags] # runs on package in current directory
    golint [flags] [packages]
    golint [flags] [directories] # where a '/...' suffix includes all sub-directories
    golint [flags] [files] # all must belong to a single package
Flags:
  -min_confidence float
        minimum confidence of a problem to print it (default 0.8)
  -set_exit_status
        set exit status to 1 if any issues are found

ガツンとカレントディレクトリ配下全てのチェックを行う場合は下記のようにします。

# カレントディレクトリ配下のチェックを行う
golint ./...

Json should be JSON

ここで1つされやすい(と思われる)警告を例に上げてみます。

一般的な略語(URLとかXSSとかSSHとか) については合致するものは例えば、
Url や XssSsh と言うように記述しているときに警告されます。

その時は

func hogeFugaJson should be hogeFugaJSON

というように警告されます。

定義されている略語は下記のようになっています。

lint/lint.go at b8599f7d71e7fead76b25aeb919c0e2558672f4a · golang/lint · GitHub

とはいえチェックが五月蠅すぎる・・・

という場合はあると思うので、あくまで最終的な手段として
min_confidence というパラメータを設定することができます。

これは golint を実行した際に警告される最低レベルを実数で設定するとができます。
具体的には下記のような感じです。

golint ./... -min_confidence=1

デフォルトでは Usageにもあったように 0.8 で動作しています。

各解析結果を警告するかどうかはそれぞれで動作する段階があり、
例えば先のJson/JSON問題で言えば下記の行で指定がされており
0.8 で動作するようになっていることがわかります。

lint/lint.go at b8599f7d71e7fead76b25aeb919c0e2558672f4a · golang/lint · GitHub

つまり、この場合は0.9以上の値にすればこの警告については黙ってくれるということになるわけですね。

とはいえ難しいものでなければ可能な限りデフォルトで実行されるgolintに対応できると気持ち良いのではないかと思います

ブックマーク

www.pakutaso.com

io.TeeReader を使って Teeコマンドを作る

f:id:dojineko:20170211215431j:plain

下記のエントリに触発されたのでかるーくやってみました。
ターゲットは tee コマンドです。

takatoshiono.hatenablog.com

teeコマンドって?

標準入力で受け取ったデータを標準出力しながら、
指定したファイルにも出力するようなコマンドです。

Linuxコマンド集 - 【 tee 】 標準入力を標準出力とファイルに出力する:ITpro

他のコマンドの実行結果を tee にパイプして表示しつつログを取るというような使い方をしたりします。

io.TeeReaderって?

teeコマンドのように golang上で指定したReaderで読み取った内容を、
指定したWriterに渡しながら処理をすることのできるReaderです。

io - The Go Programming Language

サンプルプログラム

実際に使ってみないとなんともイメージが湧きにくいと思いますので
最低限 teeコマンドと同じ挙動をする gogotee というコマンドを作ってみます。

続きを読む

Let's EncryptでSSL証明書を取得してHTTP/2な世界にGopherくんを召喚してみた

f:id:dojineko:20170102154432j:plain

独自ドメインを持ってるなら、オレオレ証明書なんか使わずに
VALIDなHTTPSでヤッテイコーという試み。

続きを読む

GOPATHの運用を見なおしてみたら意外と便利だった

f:id:dojineko:20160909000527j:plain

go-get と ghq (+ fzf/peco) の連携 はとても便利

続きを読む

Windows で Vagrant となかよくする方法を考えてみた

f:id:dojineko:20160827232816j:plain

VirtualBoxVagrant を使ってファイル共有すると vboxfs がとにかく遅い。 macOS であれば NFS サーバーを立てて共有フォルダを設定すれば、だいぶ軽くなるけども Windows だと手軽には NFS サーバーを用意できないみたい。うーんどうすればいいものか。

続きを読む

Bashでちょっと凝ったオプションの解析をする

f:id:dojineko:20160630222829j:plain

痒いところに手が届かないのをなんとかしたかったのねん


Bashスクリプトを書いてたら、ちょっと凝ったオプション解析をしたくなった。

  • ロングオプションも使えるようにしたい
  • オプションの第二引数は任意にしたい

Bashスクリプトでオプション解析といえば getopt や getopts を使うと思いますが、

  • getopt はBashのビルトインコマンドなのでどこでも使えるけどロングオプションが使えない
  • getopts は BSD系(macOSなど) と GNU系(Linuxなど) で動きが違う

など微妙に痒いところに手が届かないので、下記のQiita記事を参考に、メモがてらちょっとアレンジしつつオレオレオプション解析を書いてみました。 qiita.com

続きを読む

mruby-cli で ワンバイナリなツールを作ってみた

f:id:dojineko:20160221195105j:plain

今回も長め。


メモツールの移行を思い立ったので、今までのデータを移すべくテキトーなツールをつくって見ました。
移行ツールと言いながらまだ 単一のMarkdownとBoostnote の相互変換くらいにしか対応していませんが、、、

github.com

前回のネタに続いてせっかくなのでGolangでなく、mruby-cli で作ってみました。
今回はその過程でやったことや作ってみて思ったこととかをつれつれなるままに書いてみようと思います。

dojineko.hateblo.jp

続きを読む