Plan 9とGo言語のブログ

主にPlan 9やGo言語の日々気づいたことを書きます。

Go

Go関連の比較的新しいTips

Go

READMEにpkg.go.devのバッジを貼る godoc.orgはpkg.go.devに移行していくことが告知されているので、新しいプロジェクトではREADME.mdに貼っているバッジを移行しましょう。pkg.go.devのURLやバッジは // バッジ https://pkg.go.dev/badge/<package path> // リンク https:</package>…

OpenTelemetryメトリックにObserverとResourceが追加されました

以前の記事で、OpenTelemetryでメトリックを記録するを書きましたが、現在いくつか変更が入っています。細かい型名やメソッド名が変わったものは除いて、大きめの変更点をまとめました。 Observerの追加 以前までは、メトリックの種類は Measure - 複数の値…

Go 1.14でシステムコールがEINTRエラーを返すようになった

Go

Go 1.13までのゴルーチンの切り替えは、チャネルの送受信やシステムコール呼び出し、関数呼び出し前にコンパイラが暗黙的に挿入する処理などによって行われていました。そのため、上記の切り替わり操作を全く行わないループなどがあれば、そのゴルーチンがず…

Goモジュールでツールもバージョン管理する

Go

Goモジュール管理下では、プロジェクトで使うGo製ツールのバージョンも管理できます。今までの経験では、ツールのバージョンが上がって困ることは記憶にないですが、とはいえ2018年5月ごろにprotoc-gen-goが大きめの変更を入れたこともあるので、バージョン…

GAE第2世代で実装方法はどう変わったか

久しぶりにGAE/Goで自分用サービス作ったとき、第1世代(Go 1.9まで)と全く違っていて混乱したので自分用メモ。 DatastoreがCloud Firestoreになった 以前はAppEngine専用のDatastore APIを使っていたが、Cloud Datastoreを経て現在はCloud Firestoreを使うよ…

opencensus-goでPlan 9用のmackerel-agentを作っている話

この記事はMackerel Advent Calendar 2019の12日目です。 公式に提供されているmackerel-agentはGoで書かれていて、Windows、Linux、macOSなどに対応していますが、Plan 9には対応していません。個人のサーバはPlan 9が動作しているし良い機会なので、opence…

意外と難しいos/execの話

Go

Goのos/execパッケージは、別のコマンドを扱うためのパッケージですが、使い方を間違えたり、気が散っていたりするとリソースリークを引き起こす可能性があります。こないだリークするコードを目にしたので、どういった理由なのかも含めて紹介します。ここに…

Goでファイルの存在確認

Go

Goでファイルの存在確認について、インターネットではos.Statの戻り値がエラーかどうかを判定する方法が紹介されていますけれど、os.Statはファイルが存在する場合でもエラーを返すことがあるため、この方法では正しく判定できないケースが存在します。また…

GoのPrintfでカスタムフォーマッタを使う

Go

Goの fmt パッケージは、%s や %3.4f のような書式を使えます。基本的にはCと同じですが、%#v や %T などGo固有なものもあります。書式は基本的に %[flag][width][.precision]{verb} のように分かれていて、それぞれの数値は幅や0埋めなどを指定します。{ver…

http.RoundTripperでHTTPクライアントを拡張する

この記事はQiitaで公開されていました GoでHTTPリクエストを行いたい場合、一般的には net/http のhttp.Getやhttp.Postを使うことになると思います。もしくは少し複雑なリクエストする場合、http.NewRequestを使うかもしれません。 net/httpの公式ドキュメン…

Go 2のgenerics/contract簡易まとめ

この記事はQiitaで公開されていました 2020年8月追記 この記事は2018年頃に出てきたGoのジェネリクスに関するドラフトを読んで、個人的に理解した内容をまとめたものです。2020年時点ですでに、contractの代わりにinterfaceが使われるなど、十分に内容が古く…

GoDocドキュメントの書き方

この記事はQiitaで公開されていました Goでドキュメントを書くとき、一般的にはGoDocを使うと思います。GoDocはシンプルにみえて、実際は色々な書き方をサポートしていますし、ブラウザで単純に表示する以外の読み方もあるので、一通りの方法をまとめてみま…

golang.org/x/oauth2で色々な認可フローや方言に対応する

この記事はQiitaで公開されていました OAuth 2.0クライアントの実装 golang.org/x/oauth2を使ってトークンを発行する際に、複数の認可フローや方言があるけれど、どうやって実装するんだろう?と思ったことを調べました。OAuth 2.0自体については、OAuth 2.0…

Go & Versioning(vgo)を読んで大きな変更が入ったなと思った

この記事はQiitaで公開されていました このQiita記事は、Go & Versioningで掲載された一連の記事を読んで、自分なりのまとめと感想です。私の周りはあまり騒いでないけど、これ感覚的なものが大きく変わるなあ、と思ったので、主に表面上に現れる変更をまと…

golang.org/x/sync/semaphoreを使ってゴルーチンの同時実行数を制御する

この記事はQiitaで公開されていました 特定の処理をゴルーチンで並列実行したいけれど、サーバの負荷等を考慮して、同時実行数の上限を設定したい話です。元ネタの記事では、チャネルやsync.Poolを使って実現していて、すでに十分シンプルなのですが、x/sync…

Go+goyaccでシェルを実装する

この記事はQiitaで公開されていました この記事は、Go2 Advent Calendar 2017の17日目です。 特にこれといったネタがなかったので、goyaccを使ってシェルを実装してみました。 何をしたのか Linux/macOSなどのUnix系OSには、bashやzsh、fishなどあります。こ…

TimeoutHandlerでnet/httpのリクエストをタイムアウトさせる

この記事はQiitaで公開されていました 素直な実装 特に何もしない場合、net/httpはタイムアウトしません。以下のサーバにHTTPアクセスをすると、1分後にhello!というレスポンスを返します。 package main import ( "log" "net/http" "time" ) type handler s…

Goでサブディレクトリを含むProtocol Buffers定義ファイルを扱う場合の上手な書き方

この記事はQiitaで公開されていました 問題 Goは、$GOPATH/src/ 以下にパッケージのソースコードを置くルール。自分で書いたコードも例外ではないので、以下の例では、自分で書くコードを $GOPATH/src/example.com/app に置いている。 $GOPATH/ └ ─ /src ├ ─…

golang.org/x/sync/singleflightで重複呼び出しを排除する

この記事はQiitaで公開されていました ユーザ操作などで、同じAPIを同時にリクエストされたけれど、例えばGETメソッドの場合は結果もほとんど同じになるので、リクエストを1回にまとめてしまいたい場合は少なくないと思います。 または、期限付きの認証トー…

GoでFUSEを使ってGitHubのIssuesをマウントする

この記事はQiitaで公開されていました この記事は、Goアドベントカレンダー(その2)の19日目です。 何を言っているのか分からないかもしれませんので、動画を用意しました。 アドベントカレンダーはこれを作った話です。本当はPlan 9対応までやりたかった。 p…

Sierraでgo1.7.3のコンパイル

この記事はQiitaで公開されていました macOS SierraでソースからGoをコンパイルできなくて調べた内容です。macOSなら公式からバイナリパッケージが提供されているので、自分でコンパイルしなくてもそれを使えばいいだけなのですが、他の環境でも使える内容だ…

golang.org/x/time/rateで速度制限を行う

この記事はQiitaで公開されていました 例えば、APIの結果を使った処理を行う場合、ユーザとしてはなるべく早く処理をしたいけど、早すぎるとサーバの処理が追いつかないケースはよくあると思います。 そういう時、APIを実行した後でtime.After等を使って少し…

パッケージのimport pathを好みのURLにする

この記事はQiitaで公開されていました Goのパッケージ名は、リポジトリのURLをそのまま使うことが多いと思いますが、リポジトリはそのままで、別のURLをパッケージ名にすることもできます。 例えば、あるパッケージのリポジトリをGitHubに置いていて、リポジ…

atomicパッケージが必要な理由と使い方

この記事はQiitaで公開されていました 以下のコードは通常分かりづらいバグを持っています。 package main import ( "fmt" "runtime" "sync" ) type Counter int32 func (c *Counter) Inc() { *c++ } func main() { var c Counter var wg sync.WaitGroup for…

ゴルーチンで発生したエラーの返し方

この記事はQiitaで公開されていました ゴルーチンで並行実行中させた処理の中で、エラーが発生した場合にどう扱うかは割と面倒です。 package main import ( "io/ioutil" "log" "net/http" "os" ) func main() { c := make(chan []byte) go func() { res, er…

GoとAlefとLimbo

この記事はQiitaで公開されていました GoとLimboは、一部のファンから、似ていると言われますので、そんなに似ているのか、実際に比較してみました。ついでに、この2つの言語は共通してAlefが先祖になりますので、Alefも含めます。 いちおうこの記事は、Go A…

Go on Plan 9ではまったこと

この記事はTumblrで公開されていました Go 1.3.1をビルド Plan 9(386)にGo 1.3.1をインストールしてみた。通常どおりsrc/all.rcを実行したのだけれど、cmd/8cと出力された後にinvalid opcodeエラーで落ちる。そのため、インストールできない。 Go 1.3.0をビ…

管理者権限が無くてもMacにGoをインストールする

この記事はQiitaで公開されていました brew本体をインストールするのもGo公式パッケージを入れるのも管理者権限を要求されますが、権限が無くてもGoはソースからインストール可能ですしなるべく環境を汚さないようにしたい場合にも有用だと思います。 ただし…

Goワークスペース

この記事はTumblrで公開されていました(Go 1.2の頃に書いたものです) Go言語には、ワークスペースという構造があります。最初はとても取っ付きづらいのですが難しいものではないので、軽く書き流します。 ルール GOROOT環境変数 GOROOT環境変数は、Go言語本…

Goのはじめかた

この記事はTumblrで公開されていました。とても古い記事なので参考にならないかも。 こないだ業務でGoを使ったプログラムを書きました。もともと個人的に使っていましたが、いいきっかけなのでまとめておきます。 インストール ここではソースからインストー…