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

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

OpenAPI3.0 から Go のAPIクライアントコードを生成するライブラリ選定

# 結論
[`oapi-codegen/oapi-codegen`](https://github.com/oapi-codegen/oapi-codegen) と [`ogen-go/ogen`](https://github.com/ogen-go/ogen) がよさげ。

1ファイルのみの生成でミニマムにやりたいなら [`oapi-codegen/oapi-codegen`](https://github.com/oapi-codegen/oapi-codegen)、リクエストのクライアント検証や optional 型を gRPC っぽく扱いたいなら [`ogen-go/ogen`](https://github.com/ogen-go/ogen) っていう所管。

# 要件
必須
– OpenAPI3.0に対応していること
– GoのAPIクライアントコードを生成できること

推奨(=選定観点)
– ①ライブラリとして信頼できること
– ②生成に要す時間が短いこと
– ③生成コードが必要最低限であること

# 候補
## [`OpenAPITools/openapi-gener

元記事を表示

Terraformのプロジェクトローカルな小さなプロバイダ(プラグイン)を書いてみる

## はじめに

日常よく使う道具について「**いざとなったら拡張を書いてどうにかしてやるぞ!**」という自信を持つのは精神衛生上良いことです。

今回はTerraformに最低限の機能を持った自作プラグインを追加してみます。

## 簡単なTerraformのプラグインアーキテクチャの振り返り

簡単にTerraformのプラグインアーキテクチャについて振り返ってみます。

Terraform はプラグインアーキテクチャを採用しているソフトウェアであり、基本的なリソースのライフサイクル管理の機能はTerraform本体で提供しているのですが、AWS上などの実際の具体的なクラウドインフラ上のプロビジョニングは専用のプラグイン(例: [terraform-aws-provider](https://github.com/hashicorp/terraform-provider-aws))を呼ぶ構造になっています。

“`mermaid
sequenceDiagram
terraform ->> terraform: 必要なプロバイダの割り出しなど
terraform ->>

元記事を表示

Goの「wire」と「sqlboiler」でレイヤードアーキテクチャを実装してみる

## 0. はじめに
[wire](https://github.com/google/wire)を勉強中なので、レイヤードアーキテクチャーでの使い方を記事として書こうと思います。
今回の記事では、goのバックエンドコンテナ、mysql,adminerを利用しており、docker-composeファイルで管理していました。
また`wire`と`sqlboiler`の基本的なセットアップについてもすでに行った状態で記事をはじめます。

ディレクトリ構造
“`
| .gitignore
| docker-compose.yml
| README.md
|
+—backend
| | .air.toml
| | Dockerfile
| | go.mod
| | go.sum
| | main.go
| | sqlboiler.toml
| |
| +—domain
| | +—entity
| | | book.go
| | |

元記事を表示

Goの静的解析 ~go vet編~

コンパイラによってキャッチされない不具合や懸念を検出するためのものとして、静的解析ツールがある。
Goの静的解析ツールはいくつかあるが、ここでは go vetについて紹介する。

## go vetとは
Go言語に標準で組み込まれた静的解析ツール。
言語標準ツールのため言語のバージョンアップと同じタイミングで更新される。
公式ドキュメントは[こちら](https://pkg.go.dev/cmd/vet)。

## 使用可能なルール
`go tool vet help`を実行すると、使用可能なルールの一覧が表示される。Go1.22.3 時点では32のルールが存在する。

“`
$ go tool vet help

Registered analyzers:

appends check for missing values after append
asmdecl report mismatches between assembly files and Go declarations
assign check for u

元記事を表示

GoでJSON Web トークン (JWT)を用いたログイン認証機能を作成してみる

# はじめに
JWT (JSON Web Token) は、ユーザー認証を行うための方法です。今回は、Go言語を使って、JWTを用いたログイン認証機能を実装した内容を紹介します。今回の実装では、Echoフレームワークを使用してAPIを構築し、ユーザー認証とトークンの生成・検証を行います。
前回のNext.jsをフロントアプリとしてこの機能を使う想定です。

# そもそもJWTって何?
JWT (JSON Web Token) は、Web アプリケーションでユーザー認証や情報の安全なやり取りに使われるトークンです。
トークンは3つの部分から成り立っていて、
– 情報(クレーム)を格納する部分
– 署名部分
– ヘッダー部分

があります。
JWT は署名されているため、改ざんされていないことが確認でき、また、サーバー側でセッション管理をしなくてもトークン自体が認証情報を保持できるのが特徴です。
要は、JWTの”情報”部分に、ユーザーのメールアドレスなどの情報を任意で含められるので、トークンさえあれば、サーバーはいつでもユーザーを認証することが可能になります。
サーバー側でセッションなどを

元記事を表示

sqlmock に AnyString で任意の文字を許可させる

## 概要 と 解説

[sqlmock](https://github.com/DATA-DOG/go-sqlmock) はデータベースをモック化して、テストするのに便利なライブラリです。

sqlmock に `AnyString{}` という Struct を定義することで、任意の文字列を Args に与えられるようにします。

たとえば、 user_id を持つ users テーブルへの検索をする際に、次のようなコードで実際のデータベースを用意しなくてもテストすることができます。
次のコードはその疑似コードです。

“`golang
db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf(“an error ‘%s’ was not expected when opening a stub database connection”, err)
}
defer db.Close()

rows := sqlmock.NewRows([]string{“user_id”, “created_at”, “updated_at

元記事を表示

DiscordBotをPythonからGoにリプレイスした話

# はじめに
こんにちは。社会人1年目のサーバーサイドエンジニアのマグロです。
コロナの熱にうなされながら書いてます。

今回は「1周年!若手エンジニアふんわりLT Day!」で発表した「DiscordBotをPythonからGoにリプレイスした話」をしていこうかと思います。

https://wakate-funwari-study.connpass.com/event/323430/

# bot概要
以下はリプレイス前のBotのコードです。

https://github.com/maguro-alternative/discordfast

機能は
– LINEとのメッセージ連携
– ボイスチャンネルの入退室通知
– Web版VOICEVOXによる読み上げ機能
– niconico,YouTubeのWebhook通知
– 上記を管理するadminページ

になります。

botは“`pycord“`、webは“`FastAPI“`&“`jinja2“`&“`bootstrap“`を採用しています。

# 負債一覧
– Pythonで導入しているパッケージが多い。

元記事を表示

GCPのBillingをDatadogに送るアプリをGoで作った

# 対象者(読むと嬉しくなるかもしれない人)
– GCPのBilling周りの通知をメール以外のプロダクトに飛ばしたい人
– Datadogを使用している人

# 前書き
GCPのBillingは現状メールアドレス宛てにしか飛ばせず、`予算とアラート`の機能でPub/Sub トピックにデータを送ったりもできるんですが、これが予算を超えると1時間毎にPub/Subにデータが送られてくるんですよね。アプリ側で1度送信されたらそのフラグを管理するようにすればよいのですが、フラグを管理するためだけにデータソースを用意するのも大仰だな。と思ったことと折角BigQueryに出力しているのであればそれを使えばよいか。と思ったので作ってみました。
また、現状AWSのコストもDatadogに送っていることやDatadog側でMonitoringの種別を色々便利に使える(例えばForcastMonitoringで使用料金の上がり幅が急激だったり)といったことも理由にあります。

ちなみにメールからZapier等を使ってメールからslackに飛ばしてもいいんですが、自分の会社の環境だと連携が定期的に削除され

元記事を表示

Go言語でsortした時の並び順を初歩的に調査してみた

## 疑問

データをsortした時に文字列はどのような基準で順番が決められるのか。

## 結論

標準ではUnicodeコードポイントを判定して、sortをした時に順番が決まる。

## 実装

“`go
package main

import (
“fmt”
“log”
“sort”
)

type Person struct {
FirstName string
LastName string
Age int
}

func main() {
people := []Person{
{“Bob”, “lob”, 27},
{“Tom”, “aoi”, 13},
{“Roberto”, “kei”, 54},
}

fmt.Println(“sort前”, people)

// peopleのデータがなかったらエラーを出す
if len(people) == 0 {
log.Fatal(“データがありません。”)
}

// ソートする
sort.Slice(people, func(i int, j int) bo

元記事を表示

Goでテーブル駆動のベンチマークをとる方法

公式に記載ありますが、まとめてみます。

[公式サイトのブログ記事](https://go.dev/blog/subtests#table-driven-benchmarks)

# ベンチマークのシナリオ

– 数値を文字列に変換する関数を作った。
– 標準パッケージが提供する同種の関数と、パフォーマンスの比較をしたい。
– テーブルとして用意したテストケースそれぞれについて比較をしたい。

# 書き方(ベンチマークの部分のみ)

“`go
type testcase struct {
name string
input []int
}

var testcases = []testcase{
{ // このテストケース単位で、標準パッケージ関数との比較をしたい。
name: “plus”,
input: []int{1, 2, 3},
},
{ // このテストケース単位で、標準パッケージ関数との比較をしたい。
name: “minus”,
input: []int{-1, -2, -3},
},
}

func BenchmarkStringe

元記事を表示

Go言語(golang)でGoogle Cloud Storageを操作する際の共通部分をメソッド化する

### 概要
Go言語でGCS(Google Cloud Storage )のデータを操作する際に、ファイルのアップロード、取得、削除といった処理で共通部分があります。
共通部分をメソッド化して使いまわしたかったのですが、公式のドキュメントだとdeferを使っており、どのようにメソッドにしたらよいかわからなかったので、自分なりに調べて考えた結果を残しておきます。

### やりたいこと
GCPに対する操作について公式のドキュメントをみてみると、以下の部分は共通化できそうです…

https://cloud.google.com/storage/docs/uploading-objects?hl=ja

https://cloud.google.com/storage/docs/deleting-objects?hl=ja
“` go
// bucket := “bucket-name”
// object := “object-name”
ctx := context.Background()
client, err := storage.NewClient(ctx)

元記事を表示

GoのGORMを使ってみる

# はじめに
`Gorm`って使ったことありますか?
Goでは、コードないにsqlクエリを書いて`github.com/go-sql-driver/mysql`を使えば、データベース操作が行えると思います。

しかし、Djangoなどのmodelを定義するだけでデータベース操作が行えてしまうフレームワークのみを過去に触っていた人は、`sqlクエリ`の書き方がわからず苦戦すると思います。
それにいくらsqlが書けたとしても、長々と`sql`を書きたくないですよね。

なので、今回はそれを解決する`GORM`を使ってみようと思います。

# GORMとは
`GORM`とは、Go言語のORMライブラリです。

ORMって言われてもわからないですよね。

まずはORMから説明します。

### `ORM`とは

オブジェクト関係マッピング(Object-Relational Mapping)の略称で、オブジェクト指向におけるクラスや構造体とデータベースを紐付ける技術のことを指します。Djangoでモデルを定義するだけで、データベース操作が行えたのは標準でORMが使われていたからです。

`メリ

元記事を表示

ES自動生成AIを作ってみた

この記事では以下の拡張機能(ES-writer)を作成した時のことについて記していく。

https://github.com/Yutosaki/es-writer/tree/main

目次
* なぜ作ったか
* どの様に作り始めたか (技術構成など)
* 機能
* 推しポイント
* 上手くいったところ
* どこが苦労したか
* 今後の展望

また、別記事でコードについての解説などもしようと考えている。

# なぜ作ったか
現在自分が大学3年で様々な企業にエントリーシート (ES) を出していたが、毎回おんなじ様な内容をちょっとフォーマットが違ったり、文字数の制限があったりでわざわざ書き換えるのが面倒に感じたため、これらをもっと簡単にできないかと考えた。

# どの様に作り始めたか
そもそもなのだが、これはハッカソンで作ったものである。
(Progateハッカソン powered by AWS エムスリー株式会社賞 受賞 🎉)
最初は、普通にWebアプリケーションで作ろうと考えていた。期間も約1週間ほどで、5人で挑んだのだが5人中2人がハッカソンなどの開発が初めて、という状況もあり、

元記事を表示

動体検知監視カメラ

# はじめに

今回、自作で動体検知のできる監視カメラを作成しました。本記事では、開発にあたって設定した要件をまとめてご紹介します。

# 1.テーマ
「自身で開発から運用までを行い監視カメラを作る」という目標のもと開発した、動体検知で人間のみを検知し、discord(メッセージアプリ)に検知時の画像を送信するアプリケーションです。

# 2.課題の定義
## 解決すべき課題
実家に空き巣が入り、急遽、市販の監視カメラを設置しました。しかし、運用するにあたって、いくつかの課題を発見するに至りました。
#### 2.1 可用性の問題
– 上手く動体検知しないことがある
– デバイスに送信される画像がコマ送りになっており、前後の映像が取得できない
– 画質が悪く、正確な情報を得られない
#### 2.2 ユーザビリティの問題
– 専用アプリが使いにくく、独自の設定をユーザ側が手動で行う必要がある
– アプリの通知が届かない時があり、検知した場合に即座の対応が難しい

## 3.解決方法
フルHDのwebカメラを使用し、Discordを介して画像を送受信することで、画質の問題・通知の不安定

元記事を表示

Go のリスト分割

リストを指定のサイズで分割して返す関数を用意した。
誰かが使うかも知れないので、共有しておく。誰も使わなかったら自分で使おう。

“`go
func Split[T any](elms []T, size int) [][]T {
if size <= 0 { return [][]T{elms} } var split [][]T for 0 < len(elms) { s := size if len(elms) < size { s = len(elms) } split = append(split, elms[0:s]) elms = elms[s:] } return split } ``` テストケースも併せて用意。 ```go func TestSplit(t *testing.T) { tests := []struct { name string elms []string size int want [][]string }{ { name: "partial", elms: []s

元記事を表示

Cloud Functions(2nd Gen)を使い始める上で知っておきたいことメモ(Go)

Cloud Functions で非同期ワーカーをサクッと作ろうと着手し始めたら、第二世代になって色々と変わっていて「あ、ここに書いてあったの?」というものが多かった…。

そこで当記事では、「チュートリアル以上のことをしようとした時に、ドキュメントを読み始める前に知っておくとつまづきが減るかもしれない前提知識」 を整理していきたいと思います。

:::note info
* 当記事では Go 言語を前提として説明していきます
* 2024年8月時点の情報ですので、最新情報はドキュメントをご確認ください
:::

## Cloud Functions 2nd Gen. のアーキテクチャ
ドキュメントを読んでいくと、Go 言語での実装は以下のように案内されている。

**・HTTP関数のサンプル**
“`go
package myhttpfunction

import (
    “fmt”
    “net/http”

    “github.com/GoogleCloudPlatform/functions-framework-go/functions”
)

func ini

元記事を表示

Goの簡易文付きif文について

# Goの簡易文付きif文についての個人的な考察

Goでは、簡易文付きif文を使用することで、エラーハンドリングをより簡潔に書くことができる
しかし、個人的には早期リターンを用いた従来の書き方の方が可読性が高まると考える

## 書き方
ReadAlbumTitle関数からの戻り値(album構造体とerror)を処理する例

“`golang:簡易文付きif文
if album, err := ReadAlbumTitle(file); err != nil {
return err
} else {
albumList = append(albumList, album)
}
“`

“`golang:従来の書き方(早期リターン)
album, err := ReadAlbumTitle(file)
if err != nil {
return err
}
albumList = append(albumList, album)
“`
## 可読性
・簡易文付きif文で

元記事を表示

Goでスクレイピングをやってみる

みなさんスクレイピングを知っていますか?

スクレイピングとは、webサイトのHTML要素をプログラムを使って取得することです。

今回は、以下のスクレイピング練習サイトでGoの`colly`というライブラリを使って、スクレイピングを行ってみました。

https://books.toscrape.com/

# スクレイピングを行う際の注意事項
スクレイピングは、注意して行わないと違法になる可能性があります。
今回、自分が調べられる範囲で注意しなければならないことを調べてみました。

### まず利用規約を確認する
利用規約には、スクレイピングを禁止しているサイトがいくつかあるそうです。
例えば、`Amazon`の利用規約には以下のような文言があります。
>この利用許可には、アマゾンサービスまたはそのコンテンツの転売および商業目的での利用、製品リスト、解説、価格などの収集と利用、アマゾンサービスまたはそのコンテンツの二次的利用、第三者のために行うアカウント情報のダウンロードとコピーやその他の利用、データマイニング、ロボットなどのデータ収集・抽出ツールの使用は、一切含まれません。

元記事を表示

バックスラッシュエスケープされたタブ区切りテキストをCSVに変換する

以下サンプル

“`tsv2csv.go
//usr/bin/go run $0 $@ ; exit
package main

import (
“bufio”
“encoding/csv”
“fmt”
“os”
“strings”
)

func main() {
// 標準入力からデータを読み込む
scanner := bufio.NewScanner(os.Stdin)

// CSVライターを作成し、標準出力に書き込む
writer := csv.NewWriter(os.Stdout)
defer writer.Flush()

// 標準入力を1行ずつ読み込み
for scanner.Scan() {
// タブ区切りでフィールドを分割
line := scanner.Text()
fi

元記事を表示

初心者向けGo言語入門講座。今日から開発したい方向け

# Go言語入門講座

## Chapter 1: Go言語の紹介
Goは、Googleによって開発されたオープンソースのプログラミング言語で、シンプルで効率的なコードを書くことができます。Goの特徴や利点について説明します。

## Chapter 2: 開発環境のセットアップ
Goのインストール方法と開発環境のセットアップについて説明します。Goの公式サイトからダウンロードし、インストールします。

“`bash
# macOSの場合
brew install go

# Windowsの場合
# Goの公式サイトからインストーラーをダウンロードして実行
“`

## Chapter 3: Goプログラムの基本構造
Goプログラムの基本構造を学びます。`main`関数と`package`宣言について説明します。

“`go
package main

import “fmt”

func main() {
fmt.Println(“Hello, World!”)
}
“`

## Chapter 4: 変数と定数
Goでの変数と定数の宣言方法を学びます。型推論と型指

元記事を表示

OTHERカテゴリの最新記事