Category: Golang

golangci-lint v2.x で発生した `--out-format` エラーと v1.55.2 へのダウングレード対応

golangci-lint v2.x で発生した --out-format エラーと v1.55.2 へのダウングレード対応

はじめに

Go の静的解析ツール golangci-lint を Neovim や VS Code で使っている際、以下のようなエラーが発生しました:

Error: unknown flag: --out-format

このエラーの原因と対応、そして環境に適したインストール方法についてまとめます。

エラーの原因

2024年3月以降、golangci-lint の v2 系(例:v2.0.2)がリリースされました。このバージョンでは、内部構成が大幅にリファクタされ、従来の CLI オプション(--out-format など)が変更・削除されています。

そのため、VS Code や Neovim のプラグインが --out-format を使おうとすると、互換性のないエラーになります。

参考:

解決策:安定版 v1.55.2 にダウングレードする

✅ インストール手順

まず、誤ってインストールされた v2.x を削除(任意):

rm /mnt/nfs/home/exampleuser/go/Linux/x86_64/bin/golangci-lint

次に、v1.55.2 を明示してインストール:

curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh \
  | sh -s -- -b /mnt/nfs/home/exampleuser/go/Linux/x86_64/bin v1.55.2

✅ バージョン確認

golangci-lint --version

出力例:

golangci-lint has version 1.55.2 built from ...

なぜ GOBIN をカスタマイズしていたのか?

私の環境では、アーキテクチャ(x86 or arm)ごとにバイナリの配置先を分けたいため、GOBIN を以下のように指定していました:

Read more...

go-chromecast を使って Google Home に喋らせる

google home に喋らせる

vishen / go-chromecastを用いて Linux マシンから 手軽に GoogleHome に WaveNet 音声で喋らせた。

下記のようにワンライナーで喋らせることができる。

~/go/bin/go-chromecast  --device-name shosai tts "こんばんは" --google-service-account=home-hogehoge.json --voice-name ja-JP-Wavenet-B --speaking-rate 1.05 --pitch 0.9

日本語サポート

サポートされている音声と言語

音声名性別
ja-JP-Wavenet-A女性
ja-JP-Wavenet-B女性
ja-JP-Wavenet-C女性
ja-JP-Wavenet-D女性

go-chromecast インストール

go get -u github.com/vishen/go-chromecast

Google Cloud Text-to-Speech を使うための設定

Cloud Text-to-Speechの画面に移動。

[有効にする]を選択する。

次に go-chromecast から Text-to-Speech を使えるように API キーを作成する

認証情報を作成する

使用する API の設定

認証情報を作成する

アカウント詳細。ここでは特に何も設定せず、完了を押した

認証情報を作成する

サービスアカウントをクリックして、そのサービスアカウント用の秘密鍵を作成する

認証情報を作成する

秘密鍵がダウンロードされた

認証情報を作成する

秘密鍵を Linux マシンにコピーして鳴らす

go-chromecast コマンドで家の中にある Google Home をリスト化、その Google Home を鳴らす。

Read more...

Go言語の雑多なメモ

Goのバージョンを上げたい

go mod edit -go=1.20 # 1.20に上げたい go get -u ./… # 依存パッケージを更新 go mod tidy # 不要なパッケージを削除 go list -m all # パッケージのバージョンを確認

まとめると

go mod edit -go=1.20 && go get -u ./... && go mod tidy && go list -m all

zipファイルを展開する

// zipファイルを展開する
// パスワードがかかっている場合もある
// 引数にはzipファイルのパスと展開先のディレクトリを指定
func dellArchive(path string, newDir string) {
 // ファイル名からパスワードを推測
 re := regexp.MustCompile(`対象ファイル_(\d*).zip`)
 password := ""
 if s := re.FindStringSubmatch(path) ; len(s) > 0{
  password = "hogehoge"
 }
 // zipファイルを開く
 r, err := zip.OpenReader(path)
 if err != nil {
  log.Fatal(err)
 }
 defer r.Close()
 for _, f := range r.File {
  if f.IsEncrypted() {
   f.SetPassword(password)
  }
  r, err := f.Open()
  if err != nil {
   log.Fatal(err)
  }
  // ファイルの中身を読み込み
  buf, err := ioutil.ReadAll(r)
  if err != nil {
   log.Fatal(err)
  }
  defer r.Close()
  // fmt.Printf("Size of %v: %v byte(s)\n", f.Name, len(buf))
  // ファイル書き出し
  createDir(newDir)
  fileName,_ := Sjis2Utf8(f.Name)
  err = ioutil.WriteFile(filepath.Join(newDir, fileName), buf, 0644)
  if err != nil {
   log.Fatal(err)
  }
  break
 }
}

OpenAiをgolangから使うライブラリ

参考