GeekFactory

int128.hatenablog.com

golang

実行中のゴルーチンでwg.Add(1)/eg.Go()を実行すると,Wait()は呼び出し後に追加されたゴルーチンも待ってくれるか?

Goで並行処理のコードを書いている時に以下の疑問が思い浮かびました. sync.WaitGroupを利用する場合,実行中のゴルーチンでwg.Add(1)を実行すると,wg.Wait()は呼び出し後に追加されたゴルーチンも待ってくれるか? errgroup.Grpupを利用する場合,実行中…

golang.org/x/tools/go/packages による構文解析と型解析

golang.org/x/tools/go/packages を利用すると,抽象構文木や型情報を利用したコードが簡単に書けるので調べてみました.日本語の情報があまりないようです. 抽象構文木を表示する Goのソースコードを読み込むには,packages.Load 関数を利用します.packag…

client-goでserviceのselectorに合致するpodを検索する

Kubernetesのクライアントであるclient-goを利用して,serviceのselectorに合致するpodを検索する方法を紹介します.コマンドラインではserviceの名前を受け取るが,実際の処理はpodに対して行う必要がある場合に活用できます. クライアントの生成 準備とし…

client-go@v12.0.0 に移行した

client-go@v12.0.0 で正式にGo Modulesに対応しました.それまでもGo Modulesでclient-goを利用することは可能でしたが,k8s.io/api などの依存関係のバージョンを固定する手順が必要でした(client-go#551).LinuxとmacOSでchecksumが異なる問題(go#27925…

GitHub APIでリポジトリにファイルをコミットするコマンドを作った

GitHub APIを利用してリポジトリにファイルをコミットするコマンド ghcp を作りました。シングルバイナリでgitコマンドに依存しないため、リリースなどでCIからリポジトリのファイルを書き換えたい場合に便利です。 github.com 使い方 GitHub Releasesもしく…

uber-go/dig を使う

GoのDIコンテナ実装である uber-go/dig を使ってみました。 github.com 基本的な使い方はGoDocに書いてあります。あえて3行にまとめると以下になります。 c := dig.New() c.Provide(func (/* 生成に必要な型... */) /* 生成される型 */ { /* 生成処理 */ }) …

Googleフォトに写真をアップロードするツールを作った

Googleフォトに写真をアップロードするコマンドラインツールを作りました。 github.com このツールは先月に公開されたGoogle Photos Library APIを利用しています。 Getting Started APIにアクセスできるように初期設定が必要です。 https://console.cloud.g…

Read dynamic type values from YAML in Golang

GolangでYAMLを読み込む際、要素の型が実行時に決まる場合を考えます。例えば、以下のYAMLでは values で数値、文字列、マップの値が列挙されています。 values: - 100 - foo - key: value このようなYAMLを読み込む場合、型宣言を interface{} にすると実行…

特定URLへのアクセスを契機としたHTTPサーバのGraceful Shutdown

Goで特定のURLへのアクセス(例:GET /shutdown)を受けたらHTTPサーバを停止するにはどうすればよいか考えてみました。 HTTPサーバを停止する http.Server にはGraceful Shutdownを行う Shutdown メソッドがあります。/shutdown へのリクエストを受けた契機…

Sambaにおける複数パーティションの容量の補正

Sambaで複数のパーティションをまたがる共有ドライブを公開すると、空き容量が正しく表示されない問題があります。 例えば、下表のように /home の下に複数のパーティションをマウントしている場合、 /home の共有ドライブに対する容量は10 GBと表示されてし…