20210720のGoに関する記事は4件です。

【Golang】ベンチマークで "no test files" と出てしまう

Golang でベンチマークが簡単にできるというので、go test -bench ./subpackage/... と打ったら "no test files" と言われてしまう。 go test ./subpackage/... でテストは走る。 「"golang" test bench "no test files"」とググっても、go help test を見ても、なんかゴチャゴチャしてわからなかったので、自分のググラビリティとして。 TL; DR (今北産業) ベンチを走らせる時の構文が間違っています。 go test -bench <正規表現> <テストのパス> <その他のオプション> ベンチを走らせるには -bench オプションが必要で、引数も必要。 引数は正規表現でマッチした関数のみを走らせるために必要です。すべてのベンチを走らせたい場合は . と指定します。 ./subpackage/ ディレクトリ以下にある、テストとベンチを走らせたい場合は以下の通り。 1000回のループを10回繰り返してメモリ使用量も測定する go test -bench . ./subpackage/... -benchtime=1000x -count 10 -benchmem -benchtime=1000x と x を付けると時間ではなく回数扱いになり、ベンチの関数の b.N に渡される。 他の test -bench のオプション一覧 @ pkg.go.dev TS; DR シンプルなテストとベンチマークから始めずに、いきなりサブディレクトリにパッケージをわけたものだから、ふいんき・・・・でコピペピピックするからわけわかめになるので、毎回ドキュメント嫁に叱られるのです。 -bench regexp Run only those benchmarks matching a regular expression. By default, no benchmarks are run. To run all benchmarks, use '-bench .' or '-bench=.'. The regular expression is split by unbracketed slash (/) characters into a sequence of regular expressions, and each part of a benchmark's identifier must match the corresponding element in the sequence, if any. Possible parents of matches are run with b.N=1 to identify sub-benchmarks. For example, given -bench=X/Y, top-level benchmarks matching X are run with b.N=1 to find any sub-benchmarks matching Y, which are then run in full. Testing flags | Documentation @ pkg.go.dev -bench regexp(筆者訳) 正規表現にマッチするベンチマークのみを実行します。デフォルトでは、ベンチマークは実行されません。 すべてのベンチマークを実行するには、'-bench .' または '-bench=.' を使用します。 正規表現は、括られていないスラッシュ(/)文字で正規表現を分割することができます。 シーケンス中(一連の処理を実行中)に、ベンチマークの識別子(関数名)の各部分で対応する要素にマッチすると、一致する可能性のある親を b.N=1 で実行し、サブベンチマークを特定します。 例えば、'-bench=X/Y' と指定した場合、'X' にマッチするトップレベルのベンチマークが 'b.N=1' で実行され、'Y' にマッチするサブベンチマークがないか探した後、それらをフル実行します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Golang】ベンチマークで "no test files" と出てしまう。テストはあるのに。

Golang でベンチマークが簡単にできるというので、go test -bench ./subpackage/... と打ったら "no test files" と言われてしまう。 go test ./subpackage/... でテストは走る。 「"golang" test bench "no test files"」とググっても、go help test を見ても、なんかゴチャゴチャしてわからなかったので、自分のググラビリティとして。 TL; DR (今北産業) ベンチを走らせる時の構文が間違っています。 go test -bench <正規表現> <テストのパス> <その他のオプション> ベンチを走らせるには -bench オプションが必要で、引数も必要。 引数は正規表現でマッチした関数のみを走らせるために必要です。すべてのベンチを走らせたい場合は . と指定します。 ./subpackage/ ディレクトリ以下にある、テストとベンチを走らせたい場合は以下の通り。 1000回のループを10回繰り返してメモリ使用量も測定する go test -bench . ./subpackage/... -benchtime=1000x -count 10 -benchmem -benchtime=1000x と x を付けると時間ではなく回数扱いになり、ベンチの関数の b.N に渡される。 他の test -bench のオプション一覧 @ pkg.go.dev TS; DR シンプルなテストとベンチマークから始めずに、いきなりサブディレクトリにパッケージをわけたものだから、ふいんき・・・・でコピペピピックするからわけわかめになるので、毎回ドキュメント嫁に叱られるのです。 -bench regexp Run only those benchmarks matching a regular expression. By default, no benchmarks are run. To run all benchmarks, use '-bench .' or '-bench=.'. The regular expression is split by unbracketed slash (/) characters into a sequence of regular expressions, and each part of a benchmark's identifier must match the corresponding element in the sequence, if any. Possible parents of matches are run with b.N=1 to identify sub-benchmarks. For example, given -bench=X/Y, top-level benchmarks matching X are run with b.N=1 to find any sub-benchmarks matching Y, which are then run in full. Testing flags | Documentation @ pkg.go.dev -bench regexp(筆者訳) 正規表現にマッチするベンチマークのみを実行します。デフォルトでは、ベンチマークは実行されません。 すべてのベンチマークを実行するには、'-bench .' または '-bench=.' を使用します。 正規表現は、括られていないスラッシュ(/)文字で正規表現を分割することができます。 シーケンス中(一連の処理を実行中)に、ベンチマークの識別子(関数名)の各部分で対応する要素にマッチすると、一致する可能性のある親を b.N=1 で実行し、サブベンチマークを特定します。 例えば、'-bench=X/Y' と指定した場合、'X' にマッチするトップレベルのベンチマークが 'b.N=1' で実行され、'Y' にマッチするサブベンチマークがないか探した後、それらをフル実行します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Amazon S3にある画像のExif情報の削除&向きを自動調整してアップロードするGoのLambda関数

概要 S3に格納されているオブジェクト(JPEG画像)をコピーした際に起動するLambda関数。 Lambda関数の処理としては、コピーした画像を読み込んで向きを自動調整し、Exif情報を削除した上でS3にアップロードしている。 環境 go1.16.5を使用。 Lambdaのランタイムは go1.x 。 ソースコード package main import ( "bytes" "errors" "io" "log" "os" "github.com/disintegration/imaging" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3/s3manager" ) // アップロードされた画像のEXIF情報を削除するのと向きを自動調整し、再アップロードする func HandleRequest(event events.S3Event) error { for _, record := range event.Records { bucket := record.S3.Bucket.Name key := record.S3.Object.Key sess := session.Must(session.NewSession(&aws.Config{Region: aws.String("ap-northeast-1")})) //fileの読み込み obj, err := s3.New(sess).GetObject(&s3.GetObjectInput{ Bucket: aws.String(bucket), Key: aws.String(key), }) if err != nil { log.Fatal(err) } buf, err := io.ReadAll(obj.Body) if err != nil { log.Fatal(err) } // 向きを自動調整 decoded_image, err := imaging.Decode(bytes.NewReader(buf), imaging.AutoOrientation(true)) if err != nil { log.Fatalln(err) } //コピー先の空ファイル名 // Lambdaでは /tmp/ を付けないとエラーになる file_name := "/tmp/tmp.jpg" err = imaging.Save(decoded_image, file_name) if err != nil { log.Fatal(err) } //imagingで作ったファイルをopen f, err := os.Open(file_name) if err != nil { log.Fatal(err) } //S3にアップロード uploader := s3manager.NewUploader(sess) _, err = uploader.Upload(&s3manager.UploadInput{ Bucket: aws.String(bucket), Key: aws.String(key), Body: f, }) if err != nil { log.Fatal(err) } } return nil } func main() { lambda.Start(HandleRequest) } ポイント https://github.com/disintegration/imaging の AutoOrientation で画像の向きを調整。 Lambdaでは一時領域として /tmp が提供されていて、画像は /tmp 配下で処理する必要がある。   参考: https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-context.html ファイルのダウンロード→lambdaで処理→アップロードではなく、ファイルの読み込み→lambdaで処理→アップロードという流れ。 結局Lambdaのストレージを使用しているので、もしかしたら読み込みにした意味はそこまでなかったかも? 最後に これによって、スマホで撮影したきゃわわなネコチャン?の画像が変な向きで表示される...みたいなこともなくなる(はず)。 ちなみにGoは初めて書きました。難しかったです?
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Netlify FunctionsをGoで記述する

Netlify FunctionsをGoで書く AWS lambdaを使う感覚でFaasを使いたい場面がありました。 ただ、AWS lambdaを使うのは少し荷が重い(従量課金制なので万一ミスしたときが怖い)ので、Netlify Functions上でGoを動かしました。 手順 NetlifyとGitのホスティングサービス上のリポジトリを紐づける 紐づけたリポジトリのSitesでFunctionsのディレクトリを設定 GoでFunctionを作成 Functionsのビルドの設定(Netlify.toml、Makefileの記述) pushを行い,Functionsが起動しているかを確認する リポジトリの紐づけ New Site From GitのボタンからGitのホスティングサービスから連携するGitホスティングサービスを選択する画面に飛ぶので、そこから紐づけたいリポジトリがあるGitホスティングサービスを選択します。 今回は、GitHubを選択します。 次の画面で、紐づけたいリポジトリを選択します。 リポジトリが存在しないときは、Configure the Netlify app on *****(ホスティングサービス名)のリンクを押します。 NetlifyにGithubアカウントでログインして紐づけるリポジトリを選択します。 選択するとNetlify側で紐づけたいリポジトリが表示されていると思うので、そのリポジトリを選択します。 次のページBuild commandの設定やデプロイするブランチの画面が出てくるので、適当に設定して Deploy Site のボタンでサイトをデプロイします。 Functionsのディレクトリの設定 一応、netlify.tomlでも設定できます。 作成したSiteの中で、Functionsの設定をします。 Site settings から Functionsの項目を選択します。 ここでのデフォルトはnetlify/functionsになっていると思うので、Functionsのディレクトリを適宜変えてください。 僕は、いつもfunctionsで設定しています。 GoでFunctionを作成 Goのモジュールの依存性を解決するためにリポジトリのルートでgo mod initを叩いて、go modを作っておきます。 さらに、Functionsを使う際に利用するモジュールをgo getで取得します。 go get github.com/aws/aws-lambda-go で必要なモジュールが取得できます。 以下がGoで書いた簡単なFunctionsです。 go-functions/hello/main.go package main import ( "net/http" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(request events.APIGatewayProxyRequest) (*events.APIGatewayProxyResponse, error) { // GET以外はBad Request if request.HTTPMethod != http.MethodGet { return &events.APIGatewayProxyResponse{ StatusCode: 400, Body: "Bad Request", }, nil } return &events.APIGatewayProxyResponse{ StatusCode: 200, Body: "Hello Netlify Functions", }, nil } func main() { // Start Handler lambda.Start(handler) } ビルドの設定 リポジトリのルートにnetlify.tomlとMakefileを作成します。 netlify.tomlは、netlifyでビルドの際のコマンドやFunctionsの環境の設定ができます。 netlify.toml [build] base = "/" command = "make build" publish = "/dist" functions = "/functions" [build.environment] GO_VERSION = "1.14.5" Makefileで実際のビルドの設定をしていきます。 Makefile build: mkdir -p functions go get ./go-functions/hello/... go install ./go-functions/hello/... go build -o ./functions/hello ./go-functions/hello/main.go これで、ビルドの設定が完了です。 pushを行い,Functionsが起動しているかを確認する 後は、デプロイするブランチにpushを行い https://{{ホスト名}}/.netlify/functions/{{関数の名前}}にアクセスする。 こんな感じでデプロイできました。 Netlify Functionsのlambdaの時間制限が10秒程度なので、重い処理や待ちが入る処理は厳しいですが、ちょっとしたものを作る時は結構役に立ちそうです。 参考 https://docs.netlify.com/functions/build-with-go https://github.com/netlify/aws-lambda-go-example
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む