- 1. Docker + GolangでTimeZoneがうまく設定できない
- 2. GoでgRPCサーバーを立ててみる2(gRPCのスキーマ定義とコード生成)
- 3. Go で OIDC RP が実装できるライブラリを探す
- 4. Connectを使用したgRPCサーバーでReflection APIを有効にする方法
- 5. GoでforEachなど便利機能を提供してくれるgo-funkを紹介したい
- 6. GCP Data Catalog機能/実装
- 7. Goを「何となく使っていた」から、理解して「使える」ようになる
- 8. entでINNER JOINを行う
- 9. Go言語でimportされているmoduleのダウングレードを行う方法
- 10. golang/mockをわかりやすく説明したい
- 11. Go pkg/errorsのerrors.Cause()は何にでも使っていいわけではない
- 12. M1 Mac環境でOracleClientを利用する(Go言語)
- 13. 変態DevOpserが構築するGitHub PRのresolveし忘れリマインダー①(コメントはGemini APIで関西弁で要約)
- 14. 変態DevOpserが構築するGitHub PRのresolveし忘れリマインダー②(コメントはGemini APIで関西弁で要約)
- 15. go で巨大 slice を作ると遅い
- 16. GolangのCIをGitHub Actionsで構築してみる!
- 17. 個人的な勉強メモ4
- 18. 入門者のためのinterface
- 19. GCP Looker機能/実装
- 20. DockerでReact+Mysql+Go環境構築
Docker + GolangでTimeZoneがうまく設定できない
# はじめに
どうも僕です。業務でDockerを使うことがあるのですが、`golang`のコンテナで`cron`の実行をする際、タイムゾーンが`UTC`だったので`JST`に変えようとしたところ、結構つまづいたのでメモっておきます。
# 概要
`golang`にてcronを使って毎日特定の時刻に関数を走らせたい!
↓
しかしタイムゾーンがUTCだ!!
↓
どうにかせんといかん。# 結論
先に結論を言うと、 Dockerfileに次のコードを追加する。“`Dockerfile
FROM golang:1.19WORKDIR /usr/src
# これを追加↓
ADD https://github.com/golang/go/raw/master/lib/time/zoneinfo.zip /usr/local/go/lib/time/zoneinfo.zip
“`そしてコード
“`go:sample.go
package mainimport (
“fmt”
“log”
“os”
“time”
)func main() {
os.Seten
GoでgRPCサーバーを立ててみる2(gRPCのスキーマ定義とコード生成)
こんにちは。
金です。
今日は「gRPCのスキーマ定義」について部分いたします。# 事前準備
まずは、以下のようにディレクトリとファイルを作成します。
“`
.
└─ article
├── client ─ client.go
├── repository ─ repository.go
├── server ─ server.go
├── service – service.go
└── article.proto
“`また、ルート配下でgo moduleの初期化を行なっておきましょう。
“`terminal
go mod init
“`### .protoファイルの記述
.protoファイルにgRPCのスキーマ定義を記述していきます。
実装するarticleサービスの仕様はprotoファイルのservice部分で定義しているように、CRUD+全取得ができるものになっています。“`article/article.proto
syntax = “proto3”;package article;
option go_p
Go で OIDC RP が実装できるライブラリを探す
## はじめに
OIDC RP を実装する場合以下のようなことをする必要があります。
※ 認可コードグラントです。– ディスカバリ構成の管理
– 認可エンドポイントの生成
– トークンエンドポイントへのアクセス
– トークンの検証etc …
OIDC はカッチリ仕様が決まっていますし、そこまで複雑な実装にもならないと思いますが、ライブラリがあるなら頼りたいものです。
本記事では Go で OIDC RP をライブラリを用いて実装するにあたり候補となるライブラリを調査し実際に使ってみたのでご紹介します。## ライブラリ
調べたところ候補となるライブラリは以下の2つがありました。
(ほかにもあったら教えていただきたいです。)https://github.com/zitadel/oidc
https://github.com/coreos/go-oidc
どちらもライセンスは `Apache-2.0 license` です。
本記事執筆で参照しているそれぞれのライブラリのバージョンは
– `zitadel/oidc` : [v3.10.0](https://
Connectを使用したgRPCサーバーでReflection APIを有効にする方法
# Connectを使用したgRPCサーバーでReflection APIを有効にする方法
## はじめに
最近、`connectrpc.com/connect`を使用してgRPCサービスを開発する際、gRPC UIツールで「Failed to compute set of methods to expose: server does not support the reflection API」というエラーに直面しました。この問題は、Connectを使ったgRPCサーバーでReflection APIが有効になっていないために発生します。この記事では、Connectを使用してgRPCサーバーを構築する際にReflectionを有効にする方法を紹介します。## Connectとは?
Connectは、gRPCとHTTP/2をサポートする軽量なGoライブラリで、net/httpサーバーでの使用に最適化されています。しかし、Connectを使用するときには、通常のgRPCサーバーとは異なる方法でReflectionを設定する必要があります。## Reflectionの必要性
gR
GoでforEachなど便利機能を提供してくれるgo-funkを紹介したい
## はじめに
go-funkはJavaScriptにあるforEactやMap,PHPなどにあるFindやGetなどの便利機能を提供してくれるライブラリです。
使い方は公式を見ればわかるので、ここでは代表的な機能について数行で紹介していきます。https://github.com/thoas/go-funk
github.com/thoas/go-funk
## 使用できる機能
個人的によく使用する順で載せていきます。ここに載っているものが全てではないので、公式で使いたいものがあるか探してみるのもいいと思います。`func Map(arr interface{}, mapFunc interface{}) interface{}`
JSのmapと同じで、配列、スライスの各要素を2乗するなどの加工が可能。ただ、goの場合はMap機能によってmapからslice、sliceからmapに変更することができる。`func Find(arr interface{}, predicate interface{}) interface{}`
指定された条件に該当する最初の要素を配
GCP Data Catalog機能/実装
# GCPのData Catalogの概要と機能
## 目次
– [概要](#概要)
– [機能/詳細](#機能詳細)
– [まとめ](#まとめ)## 概要
GCPのData Catalogは、データの探索、検索、モデリング、データガバナンスを容易にするためのメタデータ管理サービスです。Data Catalogを使用することで、組織内のデータリソースを中央集中的に管理し、データの可視性を向上させることができます。Data Catalogは、データ資産に関連するメタデータ(データの特性や関連情報)を統合したデータカタログを提供し、以下のような機能を提供します。
## 機能/詳細
### メタデータ管理
Data Catalogは、データリソースのメタデータを一元管理します。メタデータには、データセット、テーブル、ビュー、ストアドプロシージャなどのデータリソースの情報が含まれます。メタデータは階層的に組織され、関連データリソースを簡単に見つけることができます。以下は、Data Catalogのメタデータを管理する方法の一例です。
“`java
import com.g
Goを「何となく使っていた」から、理解して「使える」ようになる
# はじめに
go を実際に利用をしてきましたが復習も兼ねて、下記の内容を試しに動かしつつ確認をしました。
( 何かリクエストがありましたら、コメントいただければ追記したいと思います )1. func の定義方法の違いに関して
1. context や goroutine の正しい扱い方に関して
1. testingパッケージ の使い方に関して:::note info
自分用のメモとしてまとめているため、細かい解説はありません。
:::※ [go の playground](https://go.dev/play/) を利用しました。
「Share」を押下すると、記載したコードを表示できるリンクが生成されるので、便利ですね。# Struct の Func定義方法による違い
https://go.dev/play/p/CMn_54pImua
“`golang
package mainimport (
“fmt”
)type StructPointer struct {
Hoge string
Fuga string
}func (sp *S
entでINNER JOINを行う
https://github.com/urakawa-jinsei/ent-join
entでのINNER JOINの実装方法がいまいち正確に載っていなかったので、頑張って調べてみました。
## ER図
“`mermaid
erDiagram
uploaded_content ||–|{ content : content
uploaded_content {
string filename
}
content ||–|| content_movie_metadata : content_movie_metadata
content {
string filename
string uploaded_content_filename
}
content_movie_metadata {
string filename
int width
int height
}
“`## スキーマ定義
“`go:ent/sch
Go言語でimportされているmoduleのダウングレードを行う方法
## 1
GO.modに記載されているダウングレードしたいmoduleを全て削除する。## 2
go mod tidyコマンドを実行する以上!
参考リンク
https://gist.github.com/d-kuro/3e78cba6b68d52c01b30a3b2b73b8285
golang/mockをわかりやすく説明したい
## はじめに
golang/mockをわかりやすく解説したいhttps://github.com/golang/mock
## 要点
・go mockによってテスト中にメソッドの返り値を強制的に設定できる。・go mockによってテスト中にメソッドが呼ばれない、または指定した引数で呼ばれていないときはテストを失敗にできる。
## 実際にコードを見てみよう
試しに下のようにsample.goにinterfaceを定義します。“`
package sampletype Sample interface {
Method(s string) int
}
“`その後次のコマンドを打ちます。
“`
$ go install github.com/golang/mock/mockgen@v1.6.0$ mockgen -source sample.go -destination mock/mock_sample.go
“`そうするとmockディレクトリに下のコードが生成されます。
“`
// Code generated by MockGe
Go pkg/errorsのerrors.Cause()は何にでも使っていいわけではない
# はじめに
こんにちは。最近業務でGoを書いているハセガワカンタです。
先日[pkg/errors](https://pkg.go.dev/github.com/pkg/errors#section-readme)のCause()メソッドで少しハマったので書き残しておきます。# errors.Cause()の注意点
errors.Cause()はエラーの連鎖を遡って根本的な原因を探る関数ですが、すべてのエラーを辿ることができるわけではありません。エラーがcauserインターフェースを満たしていない場合、errors.Cause()の再帰的な処理が中断されます。この場合、errors.Cause()だけでは最後までエラーを辿ることができません。https://github.com/pkg/errors/blob/5dd12d0cfe7f152f80558d591504ce685299311e/errors.go#L264-L288C2
“`go
// Cause returns the underlying cause of the error, if possible.
/
M1 Mac環境でOracleClientを利用する(Go言語)
M1 MacでGo言語を利用してOracleに接続する処理を開発したいが、OracleClientにはM1 Macに対応したClientが提供されていません。[Rosetta2](https://support.apple.com/ja-jp/HT211861)を利用して動作確認した際の設定をまとめます
以下のようにIntel x86版しかない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635433/e654c902-57d7-1ef5-3064-04188360091b.png)
https://www.oracle.com/jp/database/technologies/instant-client/downloads.html## 前提
・OracleClient x86_64版がインストールされている
・Goがインストールされている# まずは動かしてみる
環境確認
“`
~ % uname -m
arm64
“`Oracleに接続するコードを用意
[
変態DevOpserが構築するGitHub PRのresolveし忘れリマインダー①(コメントはGemini APIで関西弁で要約)
## はじめに
1日324回DevOpsのことを考えてしまう変態子持ちflutterエンジニアです。
妻からは育児中にいつも~~DevOpsのことばかり考えるな~~スマホばかりいじるなと言われ、悪戦苦闘の毎日です。。
…そんなことはどうでも良いんです、ハイ。本題に行きましょう。私はモバイルアプリのチーム開発をしておりますが、バージョン管理はGitHubが使われてます。
チーム開発において、レビュワーからコメントがあったものは、レビュワーが[resolve](https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/commenting-on-a-pull-request#%E4%BC%9A%E8%A9%B1%E3%82%92%E8%A7%A3%E6%B1%BA%E3%81%99%E3%82%8B)を判断すべきだと思ってますが、私を含めてチーム内で、resolveのし忘れがたまにあります。
そこで勝手に、Discordで
変態DevOpserが構築するGitHub PRのresolveし忘れリマインダー②(コメントはGemini APIで関西弁で要約)
# はじめに
この記事は[変態DevOpserが構築するGitHub PRのresolveし忘れリマインダー①(コメントはGemini APIで関西弁で要約)](https://qiita.com/u_ki0630/private/bf824659a8de290c2acd)の続きです。
一言にまとめると、GitHubのresolveし忘れリマインダーの構築をした話です。## GitHub GraphQL APIとGoを活用した、resolveし忘れリマインダーの構築(続き)
### 最初のコメントをGemini APIで要約(関西弁で)
前回の記事で実装したロジックに基づいて、指定したアカウントに対して、スレッドの最初のコメントを要約し、マークダウン形式で(毎朝定時に)通知します。通知メッセージは以下のような形式です。
“`
未マージの各PRでResolveされてないコメント:
– レポジトリ名_1
– PRのタイトル_1_1
– [スレッドの最初のコメントの要約_1_1_1](スレッドの最後のコメントのURL_1_1_1)
– [スレッドの最初のコメン
go で巨大 slice を作ると遅い
# これは何?
先日、go で巨大な slice を作ると遅いことに気がついたので、どれぐらい遅いのかを調べようと思い、今日も楽しいマイクロベンチマーク。
# 登場人物
コンピュータは
* MacBook Pro M1 (非Max)。
* Raspberry Pi 3B+ with 32bit Raspberry Pi OS
* Raspberry Pi 3B+ with 64bit Raspberry Pi OSの三者。
go は、どこでも go 1.21。
C++ も使うんだけど、こちらは macOS では Apple Clang 15。ラズパイでは gcc-10。# 調べたこと
`make([]uint8, n)`、`malloc(n)`、`std::vector
(n);` などの方法でメモリ確保っぽい処理をおこない、その時間を測り、グラフにした。代表値は 5回やって中央値を採用。 ## メモリの確保っぽい処理
メモリの確保っぽい処理は、以下の通り。
* `make([]uint8, n)` on go
* `make([]uint8, 0,
GolangのCIをGitHub Actionsで構築してみる!
# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。前回:[TypeScript(Next.js)のCIをGitHub Actionsで構築してみる!](https://qiita.com/Senritsu420/items/f51a7eff81a8c1372302)
今回は、Go言語のCIをGitHub Actionsで構築してみた!という内容です。
初めて作成したのでおかしな所もあると思いますが、あまり責めないでください。。。(泣きます)
# GitHub Actionsとは?
こちらの記事が非常に分かりやすいので、詳しく知りたい方は参考にしてみて下さい!(他力本願寺)
[【初心者向け】【入門】GitHub Actionsの書き方についてデバッグ設定、runs-onやcheckoutなどの仕組みや構造も含めて徹底解説](https://qiita.com/shun198/items/14cdba2d8e58ab96cf95)簡単に言うと、GitHub上でCI/CDが構築できるよ!と言うものです。
(今までは、CircleCIなどの外部サービスと連携させる必要が
個人的な勉強メモ4
## ノート
1. Goの並行処理について学習
1. goroutineとchannel
1. channelという概念を初めて知った。
1. 途中でgoleakという外部パッケージでテストをした。
1. するとパッケージがgo1.20以上のバージョンでないと動かなかった。
1. go1.19->go1.21.6にバージョンアップ
1. go mod tidy -go=1.21でgo.modも更新。
1. テストが動くようになった。## キュー
並行処理を通して、今まで学習していた言語ではよしなにやってくれていたことを少しずつ理解していっている。## サマリー
外部パッケージの依存関係を解消する場合、公式のページからinstallしたほうが楽。
並行処理のデッドロックなど、気になるところが多い。
入門者のためのinterface
interfaceが何か分からなかったので勉強してみた。入門者にわかるように説明してみる。
まずは、chatGPTに解説してもらう。
—
## Q:interfaceってなに?
インターフェース(Interface)は、プログラミング言語において、メソッドの集合を定義する抽象的な型です。具体的な実装を持たず、メソッドのシグネチャ(メソッド名、引数、戻り値の型)のみを指定します。
インターフェースは以下のような特徴を持ちます:
メソッドの集合: インターフェースは1つ以上のメソッドの集合を定義します。これらのメソッドはシグネチャのみを持ち、具体的な実装は持ちません。
ポリモーフィズムの実現: インターフェースは、異なる型のオブジェクトを同じインターフェース型として扱うことができるポリモーフィズムの実現に役立ちます。つまり、同じインターフェースを実装する複数の型は、互換性があり、同じメソッドを呼び出すことができます。
データの抽象化: インターフェースはデータの抽象化に役立ちます。インターフェースを使用することで、特定のメソッドを持つオブジェクトを必要とする部分に対し
GCP Looker機能/実装
# GCPのLookerの概要
Lookerは、Google Cloud Platform(GCP)のビジネスインテリジェンス(BI)ツールの一つです。データの可視化や分析に特化した機能を提供し、企業における意思決定のサポートを行います。## 機能/詳細
Lookerには以下のような主な機能が備わっています。### 1. データの接続と統合
– 様々なデータソースに接続可能:Lookerは、データベースやクラウドストレージ、ウェブアプリケーションなど、さまざまなデータソースと連携することができます。
– データ統合とトランスフォーメーション:データの変換やデータパイプラインの構築が簡単に行えます。### 2. 可視化とダッシュボード
– インタラクティブなダッシュボードの作成:データを可視化し、グラフやチャートを使ってわかりやすく表示することができます。
– ユーザーフレンドリーなインターフェース:直感的なドラッグアンドドロップでダッシュボードを作成することができます。### 3. 分析と探索
– 豊富な分析機能:データの集計、フィルタリング、ソートなどのデータ分析操作
DockerでReact+Mysql+Go環境構築
# はじめに
Dockerで、go+react+mysqlで環境構築した際の作り方です!
以下がフォルダの全体図になります。![全体図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3525798/dc854d81-a341-f05e-bd5a-e899de7c170a.png)
# 作成手順
### 手順1. フォルダ作成
– projectフォルダの作成
– `mkdir project`
– `project/backend`フォルダ、`project/frontend`フォルダを作成
– `cd project`
– `mkdir backend`
– `mkdir frontend`### 手順2. reactプロジェクトの作成
– reactプロジェクトの作成
– `cd frontend`
“`
#typescriptの場合
npx create-react-app react-app –template typescript
“