Go関連のことを調べてみた

Go関連のことを調べてみた

チーム開発参加の記録【2023-10~2024-03】(7) slogでErrorレベルのログをSlackに飛ばしてみた

# 本シリーズのリンク

– [チーム開発参加の記録【2023-10~2024-03】(1) Go言語用ORM「Bun」をDBファーストで使う試み(SQLite使用)](https://qiita.com/kanedaq/items/97ca682602b626d5d717)
– [チーム開発参加の記録【2023-10~2024-03】(2) Go言語からTursoを使ってみた](https://qiita.com/kanedaq/items/0c81946306d2412df555)
– [チーム開発参加の記録【2023-10~2024-03】(3) slogを使ってリクエスト・レスポンス情報をログ出力してみた](https://qiita.com/kanedaq/items/3914de42cb111c8817bc)
– [チーム開発参加の記録【2023-10~2024-03】(4) Go言語用ORM「Bun」をDBファーストで使う試み(PostgreSQL使用)](https://qiita.com/kanedaq/items/ec9bd42fefc755559df6)
– [チ

元記事を表示

1万ダウンロードのバスアプリを運営している話

:::note info
この記事は[watnow アドベントカレンダー](https://qiita.com/advent-calendar/2023#participating_calendar)の24日目の記事です
:::

# はじめに
busdes!という立命館大学びわこ・くさつキャンパス、衣笠キャンパス向けのバス時刻表アプリbudes!を運営している、立命館大学B4のマーシーです。 [watnow](http://www.watnow.jp/) という学生IT団体に所属しています。

busdes!のiOSアプリのダウンロード数は約1万です。このアプリは、Backend,iOS,Androidで構成されていますが、自分はBackendの開発をしただけで,iOS,Androidに関しては先輩方や友達が開発したものを使用しています。

[びわこ・くさつキャンパス向けのアプリ](https://ritsumeikanunivpress.com/07/11/4430/)は今のバージョンになってから既に3年以上が経過しています。

私は、昨年このアプリの運営を卒業された先輩から引き継

元記事を表示

gRPCでGoのボイラーテンプレートが生成されるディレクトリについて

下記の公式ドキュメントを参考にprotoファイルからボイラーテンプレートを自動生成しようとしましたが、オプションの意味が分かりづらく思ったようなディレクトリに作成されませんでした。
https://grpc.io/docs/languages/go/basics/#generating-client-and-server-code

結論から言うと以下です。

| オプション | 意味 |
| —- | —- |
| –go_out= | `*.pb.go`ファイルが作成される起点となるディレクトリ |
| –go_opt=paths= | `source_relative`を指定すると`–go_out`で指定した`直下に`*.pb.go`ファイルがさ生成される |
| –go-grpc_out= | `*_grpc.pb.go`ファイルが作成される起点となるディレクトリ |
| –go-grpc_opt=paths= | `source_relative`を指定すると`–go-grpc_out`で指定した`直下に`*_grpc.pb.go`ファイルがさ生成される

元記事を表示

チーム開発参加の記録【2023-10~2024-03】(6) Go言語用ORM「Bun」で複数のクエリーをまとめてDBサーバーで実行

# 本シリーズのリンク

– [チーム開発参加の記録【2023-10~2024-03】(1) Go言語用ORM「Bun」をDBファーストで使う試み(SQLite使用)](https://qiita.com/kanedaq/items/97ca682602b626d5d717)
– [チーム開発参加の記録【2023-10~2024-03】(2) Go言語からTursoを使ってみた](https://qiita.com/kanedaq/items/0c81946306d2412df555)
– [チーム開発参加の記録【2023-10~2024-03】(3) slogを使ってリクエスト・レスポンス情報をログ出力してみた](https://qiita.com/kanedaq/items/3914de42cb111c8817bc)
– [チーム開発参加の記録【2023-10~2024-03】(4) Go言語用ORM「Bun」をDBファーストで使う試み(PostgreSQL使用)](https://qiita.com/kanedaq/items/ec9bd42fefc755559df6)
– [チ

元記事を表示

面談で変顔バレないようにGoogle Vision APIとGoCV使ってみた

# はじめに

こんにちは!プラットフォームエンジニア・バックエンドエンジニアビクトルです。

本記事はHRBrain Advent Calendar 2023の24日目の記事です。

https://qiita.com/advent-calendar/2023/hrbrain

明日クリスマスですね!🎄🤶

ところで。。。あなた!面接中で、緊張して、自分の表情が気になっていますか?

それとも面接官で、候補者がどんな顔をしているのか確認したいですか?

多分変な質問ですが、時々自分も気になっている。

まず、注意することを発表したいと思います。

:::note warn
このアプリケーションはコンセプトのPoCです。
:::

この間 ChatGPTとWebSocketsでダイエット相談アプリを作りました。

https://qiita.com/ervitis/items/4432a32ca4770c89ac35

今回GoCVとGoogle Vision APIでwebアプリを作成しましょう。

https://github.com/hybridgroup/gocv

https

元記事を表示

今更だけどCloudflareR2使ってみた

## はじめに
※ S3タグ付いてるけど、ベースはCloudflareR2で進めていきます!
### 作るもの
今回はGolangでaws-sdk-go-v2を使ってCloudflareR2の操作をしていく!
(S3ではないけどS3でも同じだと思う)

### リポジトリのリンク
https://github.com/murasame29/cloudflare-go

### 対象
– aws-sdk-goが初めましての人
– Cloudflare R2使ってみたい人
– なんとなくGoが書きたい人
が対象です!

## 特徴軽く
CloudflareR2は手数料とか無しでS3互換のオブジェクトストレージを提供しているサービス
### 無料枠について
| |無料枠 |課金|
|–|–|–|
|容量|10G/month| + $0.015 per GB/ month|
|クラスA操作| 1M ops/month | +$4.50 per 1M ops|
|クラスB操作| 10M ops/month | +$0.36 per 1M ops|

#### クラスA操作について
クラス

元記事を表示

Serverless Framework ローカル環境でGoをLambdaで実行する例

# Serverlessめっちゃ便利

ローカルでLambdaの実行環境を構築する場合に使うツールにServerless Frameworkがあります。

いつもローカル環境ではDocker、サーバーはECSなりEC2などを使っていたところからマイクロサービスを構築できるように勉強したので

それを共有します。

## 今回のお題

– Goを使ってAPIを構築する
– パッケージはGinを使う
– APIをLambdaを使ってコールできるようにする

これらを満たすやり方を紹介していきます。

## 環境

– M2 Macbook Air
– Go v1.21.4 darwin/arm64
– npm 10.2.4
– Docker 24.0.6, build ed223bc

お急ぎの方は[こちら](https://github.com/tsukasaI/serverless_with_go)から

## コードたち

### Go

まずはGoでAPIを構築していきましょう。

GinとLambdaを使うのでそれぞれインポートします。

今回はついでにenvの読み取り方も示す

元記事を表示

【ElastiCache】Redisサーバーのレプリケーションラグについて

## はじめに
初めまして。
オークファンの新卒3年目エンジニアの@isodaです。
今年もアドベントカレンダーの季節がやってきましたね、毎年頭を悩ませていますが。
今回はRedisサーバーのレプリケーション時のタイムラグについて書いていこうと思います。

## 導入
### なぜ今回のテーマにしたのか
私が開発を行った案件で、Redisを用いたAPIの実装を行った際に、レプリケーション時のタイムラグを考慮していなかったせいで、不具合が発生したので、自分の勉強も兼ねてこちらのテーマにしました。

### RedisとAWS ElastiCacheの概要
Redisは、高性能なキー・バリュー型のインメモリデータベースシステムであり、データの読み書きが非常に速いことで知られています。一方、AWS ElastiCacheは、クラウド環境におけるキャッシングソリューションを提供するサービスで、RedisやMemcachedなどの人気あるオープンソースインメモリデータベースをサポートしています。

### レプリケーションの重要性
ElastiCacheのRedisクラスターでは、レプリケーショ

元記事を表示

窓際でGo! 〜瞬間、PR、重ねて〜

こんにちは!がちむちです!

皆様今年はどんな一年でしたか?
私は、あっという間の一年でした。気持ちはまだ1月です。
[去年のアドベントカレンダーでたくさん書く](https://qiita.com/gachi-muchi-engineer/items/0880535896dccce4f483#%E3%81%BE%E3%81%A8%E3%82%81)って書きましたが、当記事が2023年初めての記事であり、最後の記事になりそうです。
本当にありがとうございます。

さて今年は表題の通りで、窓際でGolangを使ったアプリケーションを結構書いていたりしました。
ちなみに、タイトルですが、よく勘違いされますが、窓際「で」なので。
「へ」ではないです。すでに窓際です。

久々にAPIのサーバーアプリケーションを作ったのですが、フロントチームとエラー周りの仕様をつめているときに「APIのバリデーションでエラーが複数あったら、いい感じに複数返してほしい」と言われました。

元々JavaのSpring界隈勢だったので、当然できると思っていたので、二つ返事でOKとしてしまいましたが、初夏の恐怖体験で軽

元記事を表示

【gRPC】リクエストやレスポンスでプリミティブ型を使いたい場合

## 概要
あまりユースケースはないかもしれませんが、gRPCのリクエストやレスポンスでプリミティブ型を使いたい場合、どうすればいいんだろうとふと気になりました。少し調べてみた内容をメモ書きしたいと思います。

## 調べた結果
[Can protobuf service method return primitive type?](https://stackoverflow.com/questions/28876725/can-protobuf-service-method-return-primitive-type)のstackoverflowの記事にある通り、基本的にgRPCでプリミティブ型をそのまま返すことはできず、何かしらのmessageで包む必要があります。ただ、この記事の回答にある`wrappers.proto`を使用すれば、プリミティブ型をmessage型でラップされてるものが用意されているので、プリミティブ型っぽい感じで定義することはできそうです。
また、golangではラップされている型が[wrapperspb](https://pkg.go.dev/google.

元記事を表示

Go 言語の Struct Tag と JSON エンコーディング

# はじめに

この記事は [MYJLab Advent Calendar 2023](https://qiita.com/advent-calendar/2023/myjlab) の 12/24 の記事です。

こんにちは! 3年の [@ea_gitro](https://qiita.com/ea_gitro) です!

昨日は[いーじー](https://qiita.com/easy_yuki_)先輩の「[初心者さん向けのUnity](https://qiita.com/easy_yuki_/items/c4423fc0e259e70fa680)」講座でした!
僕は昔Unityをやろうと思って、そのあまりの重さにパソコンくんがダウンしてしまったので断念したことがあります。先輩の記事を機にまたはじめてみようかな!

さて、はやいものでもう 12/24 です…
今年ももう少しだというのにやり残したことが山ほどあります…

残された時間は大切に使っていきたいですね!

## この記事について

皆さんが「**~をやってみた!**」「**~入門!**」と

元記事を表示

Goのジェネリクス

# ジェネリクスとは
Golang1.18で導入された機能。
型の安全性は保ちつつ、異なる型を引数で取りうるといったものです。
コードの再利用性の向上が期待できます。

“`go:main.go
package main

import “fmt”

// 型パラメータを持つ関数
func Print[T any](s []T) {
for _, v := range s {
fmt.Println(v)
}
}

func main() {
Print([]int{1, 2, 3})
Print([]string{“a”, “b”, “c”})
}
“`

型パラメータとして`T`を利用しています。

元記事を表示

【Go言語】構造体へのメソッド定義

Goの**構造体**に**メソッドを定義**する際の主要なポイントをまとめる。

### 構造体のメソッド定義
Go言語では、任意の型に**メソッド追加**が可能である。
**構造体**に**メソッドを追加**することで、オブジェクト指向言語のクラスに似た振る舞いを実現できる。

#### サンプル
“`go
type Struct struct {
v int
}

func (s Struct) PrintStatus() {
log.Println(“Struct:”, s.v)
}
“`

### レシーバーの型
レシーバーの型は**値型**か**ポインター型**にすることができる。
これによって、メソッド内で構造体の状態を変更できるかどうかが決まる。

#### サンプル
“`go
package main

import (
“fmt”
)

// ‘Person’ 構造体を定義。いくつかのフィールドを含む。
type Person struct {
Name string
Age int
}

// 値レシーバーメソッド:元

元記事を表示

チーム開発参加の記録【2023-10~2024-03】(5) Go言語用ORM「Bun」でトランザクション、UPSERT、JOINを使ってみた

# 本シリーズのリンク

– [チーム開発参加の記録【2023-10~2024-03】(1) Go言語用ORM「Bun」をDBファーストで使う試み(SQLite使用)](https://qiita.com/kanedaq/items/97ca682602b626d5d717)
– [チーム開発参加の記録【2023-10~2024-03】(2) Go言語からTursoを使ってみた](https://qiita.com/kanedaq/items/0c81946306d2412df555)
– [チーム開発参加の記録【2023-10~2024-03】(3) slogを使ってリクエスト・レスポンス情報をログ出力してみた](https://qiita.com/kanedaq/items/3914de42cb111c8817bc)
– [チーム開発参加の記録【2023-10~2024-03】(4) Go言語用ORM「Bun」をDBファーストで使う試み(PostgreSQL使用)](https://qiita.com/kanedaq/items/ec9bd42fefc755559df6)
– チー

元記事を表示

Kubernetes の外部メトリクスを自作する

Kubernetes の外部メトリクスを次のフレームワークで実装してみました。

* [custom-metrics-apiserver](https://github.com/kubernetes-sigs/custom-metrics-apiserver)

# はじめに

Kubernetes は Aggregation Layer という仕組みを使って Kubernetes の API を拡張できるようになっており、外部メトリクスもこれを使います。

これにより、Kubernetes の API 呼び出し時に Kubernetes API サーバー(kube-apiserver)がプロキシとなって、“`APIService“` で設定した拡張 API サーバー(extension-apiserver)を呼び出すようになります。

この extension-apiserver をカスタムメトリクスや外部メトリクス用に実装するためのフレームワークが [custom-metrics-apiserver](https://github.com/kubernetes-sigs/cus

元記事を表示

Memorystore for Redis Clusterを導入してみる

## はじめに
本記事は「QualiArts Advent Callender 2023」の23日目の記事になります。

23新卒のバックエンドエンジニアの苅谷です。
大学・大学院では機械学習を専攻し、入社後、モバイルゲームのバックエンドエンジニアとして働いています。

今回は、先日Google CloudからGAされたMemorystore for Redis Clusterを導入するために行なったことについて紹介していきたいと思います。

## Redis Clusterとは
ここでRedis Clusterについて簡単に説明する。
詳しく学びたい方は、こちらの公式から提供された動画でわかりやすくまとめられているので、学びやすいです。

Redis Clusterとは、最低6台(ノード)のRedis Instanceから構築することができる。
3台のマスターノードと3台のリードレプリカから構成され、1つのマスターノードと1つのリードレプリカで1シャードとなる。

Redis Clusterの主

元記事を表示

初めてのGoland

# はじめに
新卒2年目のエンジニアです。
この記事では、GolandというIDEの個人的に使いやすいと感じた点についてまとめていこうと思います。
もし、Go言語を使用して何かアプリケーションを制作したいという方のお役に立てればと思います。
ちなみにこの記事は、[株式会社アクティブコアAdvent Calendar](https://qiita.com/advent-calendar/2023/activecore) 16日目の記事になります。
# Golandとは
簡単に言うとVSCodeのようなIDEです。
基本的には以下がデフォルトで使用可能であり、その他の言語を使用するにはプラグインを入れたり、All ProductPackを購入する必要があります。
* Go
* HTML
* JavaScript
* TypeScript
* SQL(RDBMS)

ちなみにGolandは有償のツールですが、2年目以降はディスカウントがされるため、個人的にはお得感があります。
また、30日間のトライアル期間があるため、一度試してから購入を決めることをおすすめします。

# Golandを使用

元記事を表示

卒業研究でGo言語に触れてみた話

## はじめに
こんにちは。

この記事は、私が卒業研究で初めてGo言語に触れてみた感想をつづっていきます。

## 卒業研究について
私の学校で卒業年度になると丸1年かけて、行われる授業です。
数人のグループに分かれ、それぞれの課題意識や目的をもってシステム制作や研究を行います。

私の班では就職などで提出する「公欠届」という書類をデジタルで簡単に提出できるようなWebサービスを開発しました。
自分は主にバックエンドのGoのAPI実装をしました。

## 自分のレベル
まず、Go言語は全く触れたことがありませんでした。
バックエンド言語でも、授業で半年触れたPHPくらいしかまともに使えるものがない状況でした。
知識についてもAPIから何?という状態でした。

## 使用環境
### フロントエンド
– Vue.js
### バックエンド
– Go言語
– Gin
– gorm

## 苦労した点
### エラーハンドリング
一番苦労していまだに理解しきれていないと感じるのが、エラーハンドリングです。
自分が思っている例外を列挙してみても、実はまだ例外があるよと指摘さ

元記事を表示

【Go言語】echoのAPIをテストする [ハンドラー単体のテスト]

テストによってはサーバーを起動させることなくハンドラーの単体テストを行いたいことがあります。そういった場合にはリクエストを直接ハンドラーに流してあげることで結果を得ることができます。

## テスト用にプログラムを用意する

### APIを作成する

前回の記事、[【Go言語】echoのAPIをテストする [サーバーを起動させてテスト]](https://qiita.com/marurusan/items/6579810c3356e0ecedb3)で作成したAPIのコードをそのまま利用しても同じようにテストができるということを証明するためにコードを再利用します。

“`go
package main

import “github.com/labstack/echo/v4”

func InitServer() *echo.Echo {
e := echo.New()

e.GET(“/”, func(c echo.Context) error {
return c.String(200, “Hello, World!”)
})

return e
}

func

元記事を表示

【Go言語】echoのAPIをテストする [サーバーを起動させてテスト]

今回はそのテストの中でもサーバーを起動させてテストする方法について書きます

## テスト用にプログラムを用意する

### サーバーの初期化部分を切り分ける

まず、APIのコードは初期状態であれば以下のようになっていると思います。
しかしこのままではテストができないのでまずはテストを行うためにコードを切り分けます。

“`go
package main

import “github.com/labstack/echo/v4”

func main() {
e := echo.New()

e.GET(“/”, func(c echo.Context) error {
return c.String(200, “Hello, World!”)
})

e.Logger.Fatal(e.Start(“:8080”))
}
“`

このようにサーバーを初期化する部分を外に切り分けます。
これを行うことで、テスト側でサーバーの初期化を行って起動させることができるようになります。

“`go
func InitServer() *echo.Echo {
e

元記事を表示

OTHERカテゴリの最新記事