概要
よく使うウィンドウ処理の種類をユースケースとともにまとめます。
ウィンドウ処理
ウィンドウとは集計範囲のことであり、その範囲をどう捉えるか色々な方法があります。
グローバルウィンドウ
一番シンプルな、ウィンドウの区切りがなくすべてのデータが1つのウィンドウに蓄積されるパターンです。
ユースケース
- 全体集計や最終結果の計算
- ストリーミングデータを一括で集計して、システム全体の動作を確認する最終レポート作成時など。
Go 1.18からジェネリクスが導入されました。
とはいえ具体的にどういう時に使えば良いの?と疑問に思う人も多いと思うので、ユースケースの例をいくつか挙げてみます。
Go v1.23.0
ユースケースを挙げていきます。
ジェネリクスのユースケースで代表的なのがリスト、コレクションの操作です。
ただGoの場合はsamber/loでほぼ解決できます。
func Filter[T any, Slice ~[]T](collection Slice, predicate func(item T, index int) bool) Slice { result := make(Slice, 0, len(collection)) for i := range collection { if predicate(collection[i], i) { result = append(result, collection[i]) } } return result }
https://github.com/samber/lo/blob/407b62d3f12eece919463f556c798661f5aabbbf/slice.go#L12-L22
このように中の実装でジェネリクスを利用しています。
続きを読むgo get でアップデートすると、なぜか別のライブラリがダウングレードする不思議な現象に出会いました。
$ go get github.com/userA/hoge go: downgraded github.com/userB/foo v1.2.1 => v1.0.0 go: downgraded github.com/userB/bar v1.10.0 => v1.1.0 go: upgraded github.com/userA/hoge v1.4.0 => v1.5.0
Go v1.23.2
原因は
ためでした。
続きを読むデータモデリングをする際に、エンジニアは次のことに注意しなくてはいけません。
これらを解決する手法として、関数型プログラミングでは代数的データ型があります。
例えば以下の様な要件があるとします。
図書館の書籍
これを愚直に考えたBookモデルを以下の様に表現してみます。
case class Book(title: String, author: String, genre: String, publicationYear: Int, isAvailable: Boolean, checkoutDate: Int, returnDate: Int)続きを読む
Bazelで依存関係を管理している環境で、celライブラリを導入したところ次のようなエラーが発生しました。
'@com_github_google_cel_go//cel:cel': target 'cel' not declared in package 'cel' defined by /external/com_github_google_cel_go/cel/BUILD.bazel and referenced by '@com_github_bufbuild_protovalidate_go//internal/celext:celext' '@com_github_google_cel_go//common/overloads:overloads': target 'overloads' not declared in package 'common/overloads' defined by /external/com_github_google_cel_go/common/overloads/BUILD.bazel and referenced by '@com_github_bufbuild_protovalidate_go//internal/celext:celext' '@com_github_google_cel_go//common/types:types': target 'types' not declared in package 'common/types' defined by /external/com_github_google_cel_go/common/types/BUILD.bazel and referenced by '@com_github_bufbuild_protovalidate_go//internal/celext:celext' '@com_github_google_cel_go//common/types/ref:ref': target 'ref' not declared in package 'common/types/ref' defined by /external/com_github_google_cel_go/common/types/ref/BUILD.bazel and referenced by '@com_github_bufbuild_protovalidate_go//internal/celext:celext' '@com_github_google_cel_go//common/types/traits:traits': target 'traits' not declared in package 'common/types/traits' defined by /external/com_github_google_cel_go/common/types/traits/BUILD.bazel and referenced by '@com_github_bufbuild_protovalidate_go//internal/celext:celext' '@com_github_google_cel_go//ext:ext': target 'ext' not declared in package 'ext' defined by /external/com_github_google_cel_go/ext/BUILD.bazel and referenced by '@com_github_bufbuild_protovalidate_go//internal/celext:celext' '@com_github_google_cel_go//cel:cel': target 'cel' not declared in package 'cel' defined by /external/com_github_google_cel_go/cel/BUILD.bazel and referenced by '@com_github_bufbuild_protovalidate_go//internal/expression:expression' '@com_github_google_cel_go//interpreter:interpreter': target 'interpreter' not declared in package 'interpreter' defined by /external/com_github_google_cel_go/interpreter/BUILD.bazel and referenced by '@com_github_bufbuild_protovalidate_go//internal/expression:expression' '@com_github_google_cel_go//cel:cel': target 'cel' not declared in package 'cel' defined by /external/com_github_google_cel_go/cel/BUILD.bazel and referenced by '@com_github_bufbuild_protovalidate_go//internal/constraints:constraints' '@com_github_google_cel_go//cel:cel': target 'cel' not declared in package 'cel' defined by /external/com_github_google_cel_go/cel/BUILD.bazel and referenced by '@com_github_bufbuild_protovalidate_go//internal/evaluator:evaluator'
これはcel-goに依存していた場合のBazelのターゲットの記述が本来は
go_library(
...
deps = [
...
"@com_github_google_cel_go//cel:go_default_library",
...
],
)
であるべきが、gazelleを使ったところ
go_library(
...
deps = [
...
"@com_github_google_cel_go//cel",
...
],
)
となってターゲットの記述が不適切になってしまったせいです。
今回はこの回避策方法について説明します。
続きを読むGoのテストを書いていると大半のフィールドは検査したいけれど
を対象外としたいケースが出てきます。
単純に考えると以下のような方法が浮かびますが、それぞれ欠点があります。
そういった部分をどう除外するかを説明します。