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

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

ギャリック砲で Pod を打ち抜け!vegeta で始める負荷試験 with GitHub Actions

この記事は [ZOZO Advent Calendar 2023](https://qiita.com/advent-calendar/2023/zozo) シリーズ9の22日目の記事です。

# はじめに
こんにちは、計測プラットフォーム開発本部 SRE ブロックの yamagai です。

タイトルがドラゴンボールのアニメタイトルのようになってしまいましたが、今回は [vegeta](https://github.com/tsenart/vegeta) という Go 製の負荷試験ツールを使って、EKS Fargate で動く Pod に対し GitHub Actions で簡単に負荷試験を実行する仕組みを作ったので、その方法や vegeta の使い方について記事にしました。

# 背景
今回の負荷試験の導入には以下のような背景がありました。

– EKS Fargate の Pod として動かしているアプリケーションのパフォーマンスを分析したかった
– 上記アプリケーションは、ZOZO New Zealand(以下、ZOZONZ)という日本とは別のチームによって開発されており、

元記事を表示

座席統合・移動機能について

![Advent Calendar 2023 Template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143450/c579cfe6-969a-9917-8a28-f9b6a13939e8.png)

この記事は、Chompy アドベントカレンダー 21日目の記事です。

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

## はじめに
はじめまして。エンジニアのKazukiです。
Chompyには、約3年ほど前にGoを勉強し始めて間もない頃にインターンとしてジョインしました。今はバックエンドに限らず、Webやモバイルのフロントエンドも含め開発に携わっています。

Chompyでは、飲食店に関わる様々なシステムを開発しており、その1つとして、飲食店に特化したレジ × ハンディ × CRMツールであるChompy Studio(以降Studio)を提供しています。

https://apps.apple.com/jp/app/chompy-studi

元記事を表示

goenvからGoオフィシャルのバージョン管理に切り替える

goenvでのバージョン管理をやめて、Goでのバージョン管理に切り替える事になったので、
goenvのアンインストール方法と、Goオフィシャルでのバージョン固定方法を記載します。

## 手順

### 前提

* [anyenv](https://github.com/anyenv/anyenv)経由で[goenv](https://github.com/go-nv/goenv)をインストールしている。
* macOS Ventura

### goenvのアンインストール

goenv経由でインストールしているGoをアンインストールする。

“`zsh
$ goenv versions
1.20.3
* 1.21.0 (set by /Users/mitsuaki.ihara/Documents/01_sharefull/sharefull-backend/.go-version)
“`

“`zsh
$ goenv uninstall 1.20.3
$ goenv uninstall 1.21.0
“`

anyenv経由でインストールしているgoenvをアンイン

元記事を表示

WindowsデスクトップアプリをGoで作成する① ~WSL+Docker+Wails~

## はじめに

この記事は「[Qiita Advent Calendar 2023 Go言語](https://qiita.com/advent-calendar/2023/go)」の22日目の記事です。

## ゴール

Windows11上に構築したWSLでGoデスクトップアプリケーションを構築し、開発モードでアプリを起動できるところまでを目指します

## 前提

[前記事](https://qiita.com/miu200521358/private/a668da62bc208f40b121) に基づいて、Windows上にWSL+Docker+VSCode の開発環境が出来ているものとします

## 公式手順

[Wails: Getting Started](https://wails.io/ja/docs/gettingstarted/installation)

## 全体の流れ

1. VSCodeで開発コンテナーを開く
1. npmのインストール
1. ブラウザを開くためのライブラリインストール
1. Wails のインストール
1. 実行中のコンテナーにアタッチ

元記事を表示

Goにおけるinterface{}のnilの挙動

[Go Advent Calendar 2023](https://qiita.com/advent-calendar/2023/go)の22日目の記事です。

# はじめに
あるコードをリファクタリングしている際に得たnilの挙動についての記事となります。

# コード

突然ですが、以下のコードがどのような挙動をすると思いますか?
(実際のコードを簡略化したものとなります)

“`go
func main() {
_, err := hoge()
if err != nil {
fmt.Println(err)
}
}

func hoge() (ret *struct{}, err error) {
defer func() {
if r := recover(); r != nil {
err = errors.New(“hoge error”)
}
}()
// なんか処理してエラーがあったらpanic
if true {
panic(ret)
}
return
}
“`

正解は呼び出し元にて`hoge error`が出力さ

元記事を表示

[Go] ゴルーチンの実例探し

# はじめに

本記事は [RetailAI Adventurers Advent Calendar 2023](https://qiita.com/advent-calendar/2023/rai-adventurers) の22日目の記事です。
昨日は、絶賛キーボード沼にハマっている?(詳しくは[昨日の記事](https://qiita.com/satoshihiraishi/items/3cbc0c0323066029c5a5)を参照) [satoshihiraishi](https://qiita.com/satoshihiraishi) さんの [Quarkus+CloudRunで作る爆速アプリケーション](https://qiita.com/satoshihiraishi/items/3cbc0c0323066029c5a5) という記事でした。まだ見ていない方は是非ご覧ください!♡もよろしくお願いします!!

キーボード、自分にとってベストなものを探すのはとても難しいですよね。。
ちなみに私は少し前に分割キーボードに切り替えまして、現在は [BAROCCO MD770](

元記事を表示

データベースのヘルスチェックのテスト実装

# はじめに

Goで実装されているアプリケーションでデータベース接続のヘルスチェックのテストをするさいに検討した内容です。
アドカレのネタを提供してくれた よっしー と あおしょー には感謝です。

# データベースへの接続状態をチェックするヘルスチェックのテスト

k8sにデプロイされているアプリケーションからいくつかのレイヤを経由してデータベースに接続できることの確認をするヘルスチェック用APIのエンドポイントがあります。
データベース接続に異常があった場合、エラーを検知しアラートを上げる仕組みとして使われるエンドポイントで、エラー際のテストパターンについて検討しました。

## 現在の実装ベースで検討

ヘルスチェック処理ではアプリケーションで利用しているデータベース接続のコードを利用しており `init()` メソッド で接続情報を設定し起動中は変更できないようになっています。

正常系のテストは `sql.Ping()` (実装は `select 1;`) で疎通を確認してエラーが `nil` であればで成功ですが、エラーのテストをどうするのがいいか悩みました。

テスト内

元記事を表示

ent + gqlgenによる爆速GraphQLバックエンド開発

# はじめに
この記事では、バックエンドのコード生成が可能なGoのライブラリ`ent`と`gqlgen`を使用して、爆速&省エネでGraphQLバックエンドの開発を行います。
GraphQLを用いたバックエンドの開発負担を、可能な限り軽減することが目的です。

自分用の備忘録でもあるため、蛇足な説明があるかもしれないです。ご容赦ください。

# なぜGoでGraphQLバックエンドを開発するのか
GraphQLは、クライアント側で必要なデータの形式や量を柔軟に指定できるAPI用のクエリ言語です。そのため、REST APIとは異なり、必要最低限のリクエストで必要なデータだけを抽出するすることができます。(オーバーフェッチの排除)

一方、リクエストパターンが増加することで、その分サーバー側の開発の負担が増加するというデメリットがあります。

そこで、サーバー側の開発負担を軽減しようと考えるのが自然かと思います。その際、Goはバックエンド機能に関してコード生成可能なライブラリが多くサポートされているため、相性の良い開発言語と言えます。

今回はGoのライブラリとして、ORMに`ent`(拡

元記事を表示

クリーンアーキテクチャについて考える 後半

## 概要
前回クリーンアーキテクチャついて考えたので、実現するための構成を考える。

## 注意事項
今回、完璧なクリーンアーキテクチャの実現は目指しません。
理由としては、今回はワンオペに近い運営を想定しています。
(個人で作るもののために考えているのでご理解ください)
そのためチーム運営を考慮せずに、簡易的な実現を目指します。

## 構成検討
![base_arch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688298/d53d576f-3efd-a748-4a64-f87468400237.png)
引用元:[Clean Architecture 達人に学ぶソフトウェアの構造と設計](https://www.amazon.co.jp/dp/4048930656)

クリーンアーキテクチャで有名な構成図といえばこちらなはず。
今回APIのみの利用なので少し置き換えて考える必要があるが、この図を純粋に実装するのが大変なのでその点を課題点として挙げていく

#### データのやりとり
クリーン

元記事を表示

【Go言語】アプリケーションドメインに特化した定義型の作成

Go言語での**定義型の作成**は、アプリケーション固有の**ドメインロジックを効率的に扱うための重要な技術**である。
関心事を分離し、コードの凝集度を高めることができる。

### スライスへの型定義
スライスに対する型定義は、コードの見通しを良くし、ユニットテストを容易にするという利点がある。
例えば、特定の条件を満たす要素のみを抽出するメソッドを定義型に追加することができる。

“`go
package main

import (
“fmt”
)

// Consumer 型の定義
type Consumer struct {
Name string
ActiveFlg bool
}

// Consumers 型の定義
type Consumers []Consumer

// ActiveConsumer メソッドの定義
func (c Consumers) ActiveConsumer() Consumers {
var resp Consumers
for _, v := range c {
if v.ActiveFlg {
resp

元記事を表示

アプリケーションロジックでtime型を扱う際のTips

この記事は、[Go 言語 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/go) の21日目の記事です。

Go言語で時間を扱う際の実装のTipsを2つ紹介します。これらは筆者の個人的な経験に基づくものであり、必ずしもすべてのケースに当てはまるわけではありません。

それでは、本題に入っていきましょう

### Tips1 引数名
time.Time 型の値を引数として受け取る関数を作成する際の引数名について考えます。
“`go
func funcA(now time.Time){
return
}
“`

関数の呼び出しを考えると、以下のように処理が始まるタイミングで`time.Time`型の変数を初期化、`funcA`に渡すと思います。
“`go
now := time.Now()
funcA(now)
“`

`now`という引数名にも違和感がないですね

その際に1点考えて欲しいことが「`funcA`が受け取る`time.Time`は、必ずしも現在時刻を期待するのか? 」ということです。

元記事を表示

Goで学ぶGraphQLサーバーサイド(11)ーディレクティブを利用した認証機構の追加

こんにちは。

今回は「ディレクティブを利用した認証機構の追加」について説明していきます。

# この章について

GraphQLを使っているときにも、

– 認証済みのユーザーにのみリクエストを許可したい
– 特定のフィールとは権限のあるユーザーのみに公開したい

といったアクセス制御を行いたい場面は存在するかと思います。
今回は、そのような認証機構をサーバーに追加する様子を紹介します。

# `Authorization`ヘッダーによる認証機構の追加

まずは「`Authorization`ヘッダーにトークンが入っているかどうか判定する」機構を組み込みたいと思います。

## HTTPリクエストの中身を見る機構はGraphQL層の前に

GraphQLサーバーがレスポンスに必要なデータを集めてくる処理は全てリゾルバの中で行っていましたが、リゾルバ関数の中には「HTTP通信」の要素を感じられるような引数は存在しません。

例えば、`node`クエリに対応するリゾルバを以下に示します。
引数に入っているのは、ユーザーがリクエスト時に渡した`id`パラメータとcontextのみであり、`

元記事を表示

【Go言語】インターフェースが実装されているか調べる方法

## Goにはimplementsがない

他の言語であればインターフェースを実装するときは`implements`などのように明示して実装します。

phpであればこのようにインターフェスを実装するときはimplementsを使います。

“`php
vars[$name] = $var;
}

public function getHtml($template)

元記事を表示

Producer-Consumer Problemとふれあう

# はじめに

この記事は [Wano Group Advent Calendar](https://qiita.com/advent-calendar/2023/wano-group) 2023の21日目の記事となります。

平行プログラミングの古典的な問題であるProducer-Consumer Problemの典型的な解を実装・確認していきます。実装には、golangを用います。golangは業務で扱うこともあるのですが、平行プログラミングを陽に意識したコードを書く機会は普段ないので、golangによる平行プログラミングの個人的な入門も兼ねた備忘録になります。

# Producer-Consumer Problem

登場人物は、あるアイテムをためることができる有限サイズのキュー、そこにアイテムを入れるProducer、そこからアイテムを取り出すConsumerです。Producerはキューがいっぱいの時はアイテムを入れることはできないので待機する必要があり、Consumerはキューが空の時はアイテムを取り出せないので待機する必要があります。ProducerとConsumerが

元記事を表示

人に運勢があるなら、HTTPリクエストにも運勢があるはず(謎

本記事は[富士通クラウドテクノロジーズ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/fjct) 21日目の記事です。
昨日の記事は@ometora_sateyanの[Python初学者がToDoリストリマインダーbotを作ってみた](https://qiita.com/ometora_sateyan/items/da75b9f8c90d8b9d5452)でした。
個人的にこういったBotのトリガーにGitLabのPipeline Scheduleを利用するのはおもしろい発想だなーと思いました。軽いBotであれば、Pipeline Schedule -> Gitlab-CI -> Incoming Webhook -> Slackでシュッと作れてますね。

## TL;DR

HTTPリクエストのヘッダーに一定の確率でGoodを設定するTraefikのPluginをシュッと作りました。
– https://github.com/ystkfujii/traefik-plugin-fortune

おわり

元記事を表示

Golang: 並行処理で何百万ものデータを簡単にフェッチする

## Golang: 並行処理で何百万ものデータを簡単にフェッチする

### 紹介
ソフトウェア・エンジニアとして、私たちはより少ない労力とメンテナンスで非常に強力なシステムを提供することを求められている。バックエンドの皆さんは、docやCSV、APIから何百万ものデータをフェッチするタスクがあるかもしれません。

巨大なデータをフェッチする際の問題は以下の通りです:

1. パフォーマンス
2. リソースの利用
3. データのフィルタリングとソート

### ケーススタディ
例えば、商品データを取得するためにパートナーのAPIと統合する必要があり、10分ごとに新鮮なデータを取得し、データが変更された場合はDBにアップサートする必要があるとします。

データのフェッチにいくつかの同時実行を使用することをお勧めします。データの異なるバッチで5つの同時実行があるとします。そうすると
1. スレッド1は1-100000のデータを取得するために実行されます。
2. スレッド2が100001-200000のデータをフェッチする。
3. 別のスレッドで続行

#### 並行処理とは
並行処理とは

元記事を表示

tcellを使ってアプリケーションを作る

## はじめに

この記事は、[2023年Advent Calendar](https://qiita.com/advent-calendar/2023)の[12月21日](https://qiita.com/advent-calendar/2021/12/21)の記事です。

私はGoで[ov](https://github.com/noborus/ov)というターミナルページャーをまじめに作っています。
ovは[tcell](https://github.com/gdamore/tcell)を使って構築されていて、tcellを使い倒している方だと思うので、tcellの使い方を解説します。

## GoのTUIライブラリ

その前に、GoのTUIライブラリについて説明します。

Goでターミナル上でアプリケーションを作る(いわゆるTUIアプリケーション)には、以下のライブラリが多く使われています。

* [charmbracelet/bubbletea](https://github.com/charmbracelet/bubbletea)
* [gdamore/tcell](htt

元記事を表示

【Go言語】Github Actionsを使って自動テストを回す

開発をする上でテストを使って検証することは重要です。今回はそのテストをgithub actionsを使って自動で行うことに挑戦したので備忘録を残します。

## ファイルを準備する

まずは今回テストする関数を用意します。
今回は簡単な例として、足し算を行う`Add`関数を用意しました。

“`go
// calc.go

package main

func Add(a, b int) int {
return a + b
}
“`

次に早速テストを用意します。テストケースは5つほど用意します。

“`go
// calc_test.go
package main

import “testing”

// TestAdd はAdd関数のテストを行う
func TestAdd(t *testing.T) {
testCases := []struct {
name string
a, b int
expected int
}{
{“Add 1 and 2”, 1, 2, 3},

元記事を表示

認証認可基盤にパスキーを実装するときに悩んだRPID管理の話

この記事は株式会社ビットキー Advent Calendar 2023、21日目の記事です。

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

# はじめに

ビットキーは現在、パスキー認証を導入しようとしています。

ビットキーのシステムは、お客様が実際に触れられるサービス——[workhub](https://www.workhub.site/), [homehub](https://www.homehub.site/homehubapp) を開発するhubsuite領域と、hubsuiteの認証認可を支えるプラットフォーム領域とで構成されています。

私は認証認可を支えるbitkey platform(以下、BKP)を開発するチームに属しており、つい最近パスキー認証のライブラリ選定から設計・実装までを一通り完了しました。

この記事では、「複数サービスを運営する企業の認証認可基盤」ならではの課題とその解決策を共有します。

# 対象読者

– パスキー認証についてはご存知の方
– パスキー認証を自分のアプリケーションに実装予定の方

元記事を表示

Go言語でGCSの巨大な複数ファイルを省メモリでzipファイルに圧縮してまとめる

こちらは、HRBrain Advent Calendar 2023 21日目の記事です。

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

# はじめに
どうもこんにちは、HRBrainでバックエンドエンジニアとして働いてる藤原です。

アプリケーションをつくる上で、一定のメモリ消費で処理が成り立つかどうかを検討することは重要だと思います。
特にWebアプリケーションでは1つのアプリケーションインスタンスで複数のリクエストを同時に処理する必要があります。できるだけ少ないメモリで処理が成り立つとメモリ不足に陥りにくくなり動作が安定しますし、確保するリソースも少なくなり費用も抑えることができます。

今回は巨大な複数のファイルを一定のメモリ消費で1つのzipファイルにまとめる方法について実装を交え説明します。GCSを利用する実用的な内容になってます。

# やること
GCSに置かれている動画ファイルを1ファイルずつストリームで読み、同じくGCSに作成したzipファイルにストリームで書き込んでいきます。
GCSの部分はエミュレータの [

元記事を表示

OTHERカテゴリの最新記事