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

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

goroutine のユニットテスト(モックの実行を待機)

## はじめに

goroutine のユニットテストで、期待した関数が呼ばれる前にテストが終了する問題に遭遇しました。
今回は、その対策を紹介します。Go のユニットテストやモックについては、[こちら](https://qiita.com/hiroyky/items/4a9be463e752d5c0c41c)の記事がわかりやすいです。

## テスト対象コードの作成

goroutine のテストを書くために簡易的なコードを作成しました。
無限ループで、channel からメッセージを取得して、ログに出力するコードです。

main では、`handler.HandleMessage()` を実行します。

“`go: main.go
package main

import (
“github.com/articles/goroutine_test/handler”
)

func main() {
messageHandler := handler.NewHandler()

var forever chan string

go messageHandler.Hand

元記事を表示

AtCoder Beginners SelectionをGoで解いてみた(後半)

[**前半記事**](https://qiita.com/rapirapi/items/75ff6d4ff5fd9a6a8d4b)の続きから解いていく

### ABC085B Kagami Mochi
https://atcoder.jp/contests/abs/tasks/abc085_b

ソートした後に前から要素を見て今まで見たどの要素より大きい値が取れたら、カウントする

#### ACコード
“`go
package main

import (
“fmt”
“sort”
)

func main() {
var n int
fmt.Scan(&n)
d := make([]int, n)
for i := 0; i < n; i++ { fmt.Scan(&d[i]) } sort.Ints(d) ans := 0 work := 0 for _, num := range d { if num > work {
work = num
ans += 1
}
}
fmt.Println(ans)
}

“`

##

元記事を表示

WASM書いてみた(Go vs Rust)

# はじめに
本記事では、Go言語とRustで同じ機能を持つWASMを書き、3つの観点で比較した

# つくったもの
https://github.com/exit8goodgame/WasmCompare

複数のファイルをZipアーカイブに変換しダウンロードする機能を持つWASMを、Go言語とRustで作成した

## 環境等
Mac Mini (M1)
“`
Darwin root.local 23.1.0 Darwin Kernel Version 23.1.0: Mon Oct 9 21:28:12 PDT 2023; root:xnu-10002.41.9~6/RELEASE_ARM64_T8103 arm64
“`

Go言語
“`
go version go1.21.5 darwin/arm64
“`

Rust
“`
stable-aarch64-apple-darwin unchanged – rustc 1.74.1 (a28077b28 2023-12-04)
“`

# すうじをみる
## コードサイズ
| | 言語 | ファイル名 | サイ

元記事を表示

Goの日時のformatが個人的にびっくりだった

# 時間をプログラムで扱いたい

リクエストやレスポンス、ロギングなど様々な場面で現在時刻を扱うと思います。

JavaScriptならDate型、Pythonならdatetimeモジュールを使うのではないでしょうか。

## 自由自在なフォーマット

JavaScriptでは`toString`, `toDateString`, `toLocaleString`, `toISOString` などのDate型で定義されたフォーマットで表示することができます。

一方で任意のフォーマットにする場合は年、月、日の値を取得することができます。

例えば`YYYY/MM/DD`にするならこんな感じに書きます。

“`javascript
const now = new Date();
const year = now.getFullYear();
const month = (“0” + (now.getMonth() + 1)).slice(-2);
const day = (“0” + now.getDate()).slice(-2);

console.log(`${year}/${

元記事を表示

GitHub Copilot Chat を使ったワンフレーズコードレビュー

# はじめに
こんにちは。今年2023年にココネに入社しましたサーバエンジニアのOです。
@rougan さんからバトンを受け取りアドベントカレンダー14日目の記事となります。

別の記事にもありますが、弊社では GitHub Copilot の導入が進んでおります。
中でも GitHub Copilot Chat はよく使っており、既に並のエンジニア以上のコーディング力があると感じています。
反面、指示を自然言語で行うため、使いこなすには他のエンジニアに対しての指示書を書くようなスキルが求められます。

本記事では **そのような面倒くささを排除し毎度コードチェックに使えるフレーズ5選** を紹介したいと思います。

## こんな方におすすめ
– コードの良し悪しがいまいちピンと来てない初級者〜中級者の方
– 大量のプルリクエストのレビューを効率的に行いたい方
– 文書を考えて指示を与えるのがめんどくさい方

## 前提
– Visual Studio Code + GitHub Copilot Chat Extension
– Go言語
– 出来上がったコードに対してのコードレビュ

元記事を表示

【初心者向け】Goのテストにおけるベストプラクティス

# はじめに
最近初めてGoで単体テストを書きました。
テストの書き方や実行方法などは、多くの記事が存在しておりそれらを利用することで大体理解することができました。
(参考までに自分が調べた記事をいくつか載せておきます)

* [Go 言語でテストコードを書いてみよう](https://note.com/rescuenow_hr/n/n9ed7caf4646d)
* [Go のテストに入門してみよう!](https://future-architect.github.io/articles/20200601/)
* [テスト駆動開発で GO 言語を学びましょう](https://andmorefine.gitbook.io/learn-go-with-tests/)

簡単なテストが書けるようになってから「テストには色々な書き方があるな」と思いました。
そこで、[Google のスタイルガイド](https://google.github.io/styleguide/go/index)や[初めての Go 言語](https://www.oreilly.co.jp/books/97848

元記事を表示

AWS Amazon Lex機能と実装

# Amazon Lexの概要

Amazon Lexは、自然言語で対話するためのサービスです。AWSのクラウド環境で機械学習を用いて開発されており、ユーザーが音声やテキストで質問や注文をしたり、問題を解決したりするために使用されます。人工知能(AI)を応用した対話型のアプリケーションを簡単に構築することができます。

# Amazon Lexの機能

1. **音声認識(ASR)**: 音声入力をテキストに変換するための高度な音声認識技術を提供します。ユーザーは音声で質問や指示を行うことができます。

2. **自然言語理解(NLU)**: ユーザーの入力を理解するための自然言語処理技術を利用します。意図(intent)やスロット(slot)といった要素を抽出し、意図に基づいた応答を行います。

3. **対話マネジメント**: ユーザーとの対話を管理し、適切な応答を生成するための機能を提供します。状態マシンを使用して対話の流れを制御し、コンテキストを保持することができます。

4. **コンソールとAPI**: Amazon Lexはコンソールから直感的に設定することができます。ま

元記事を表示

AWS Amazon Transcribe機能と実装

# Amazon Transcribeの概要と機能

Amazon Transcribeは、音声ファイルやリアルタイムの音声入力をテキストに変換するためのサービスです。自然言語処理技術を用いて、高い精度で音声をテキストに変換することができます。以下に、Amazon Transcribeの主な機能と使い方を説明します。

## 主な機能

### 音声ファイルの変換
Amazon Transcribeは、事前に録音された音声ファイルを変換する機能を提供しています。対応する音声形式は、WAV、MP3、FLAC、OGGなど豊富です。変換後のテキストは、時間情報や音声内の発話者の区別を含む形式で提供されます。

### リアルタイムの音声変換
Amazon Transcribeは、リアルタイムの音声入力に対する変換機能も提供しており、ストリーミングデータを即座にテキストに変換できます。例えば、コールセンターの音声通話や音声入力デバイスからの入力に対して、リアルタイムにテキスト化することが可能です。

### マルチスピーカーアノテーション
この機能を利用すると、Amazon Transcrib

元記事を表示

subcommandsで作るGo製cli

## Go製cliといえば
GoでCLIを作ると言えばglagや[cobra](https://github.com/spf13/cobra)が有名かと思います。ですが今回はあえてGoogle製の`subcommands`でcliを作ってみます。

## google/subcommands

https://github.com/google/subcommands

Google謹製のライブラリということで、使ってみるしかありません。
他のcliを作るライブラリよりも極めてシンプルなのがgihubから伺えます。
今回は引数に渡されたcsvファイルの中身を標準出力として表示するといったものを作成します。(catええやん…)

## インストール
“`bash
go get github.com/google/subcommands
“`

### ファイル作成
“`bash
$ touch main.go
$ mkdir cmd && touch cmd/open_csv.go
“`

### コマンド本体
サブコマンドの設定や、処理の本体をここに書いています。
`

元記事を表示

チーム開発参加の記録【2023-10~2024-03】(1) Go言語用ORM「Bun」をDBファーストで使う試み(SQLite使用)

数か月前まで、あるオンラインサロンでチーム開発に参加していました。
その優勝チームと準優勝チームが合体し、そこにサロン主も加わり、継続部隊を結成して新規開発を行うことになりました。

私は再びバックエンド側メンバーに入りました。
継続部隊のバックエンドは、Go+Echoを使用することになりました。
チーム開発に参加しながら、私の学習の軌跡を記事にしていきたいと思います。

# 本記事で行うこと

[前回のチーム開発](https://qiita.com/kanedaq/items/dcc6b3e50a0b2690033d)ではPostgreSQLを使用しましたが、今回はSQLiteが最有力候補となりました。
それに合わせて、DBクライアントライブラリも見直すことにしました。
候補に挙がったのは、SQLファーストを謳うORM「[Bun](https://bun.uptrace.dev/)」です。
前回は[sqlc](https://sqlc.dev/)を使用して、私は大変気に入りましたが、Bunは気に入るでしょうか?

## DBファーストで開発したい

前回使ったsqlcはDBファース

元記事を表示

AWS Amazon Polly機能と実装

# Amazon Pollyの概要と機能

## 概要
Amazon Pollyは、AWSが提供するテキストから音声合成(Text-to-Speech)サービスです。テキストデータを入力すると、高品質で自然な音声を生成することができます。Amazon Pollyは、アプリケーションやデバイスに音声合成機能を追加するために利用されます。

## 機能
以下に、Amazon Pollyが提供する主な機能を示します。

### 1. 多言語対応
Amazon Pollyは、多数の言語に対応しています。異なる言語やアクセントの音声を生成することができます。

### 2. 音声のカスタマイズ
Amazon Pollyでは、音声のトーンや速度、音量などを調整することが可能です。さまざまな声質や演説スタイルに合わせて、音声合成をカスタマイズすることができます。

### 3. SSML(Speech Synthesis Markup Language)のサポート
Amazon Pollyは、SSMLをサポートしています。SSMLを使用することで、音声の強調や音楽の挿入など、詳細な音声制御を行うこと

元記事を表示

redis-goを使い値を取得するところまで自学習してみた話

## はじめに
この記事は [スタンバイ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/stanby) の13日目の記事です。
昨日の記事は [@smurai_](https://qiita.com/smurai_) さんの「[MCodeが変えるMy行動. 未来神々 視界良好](https://note.com/smurai/n/n344499bb55f8)」でした。

# ごあいさつ
[株式会社スタンバイ](https://stanby.co.jp/)でSEOエンジニアをやっております、[本田](https://qiita.com/arata-honda)と申します!
スタンバイでは、ScalaからGoへのリプレイスを行なっています!
この度Goのキャッチアップもかねて[アドベントカレンダー](https://qiita.com/advent-calendar/2023/stanby)に参加させていただきました!

# 今回のゴール
– [MUST]go-redisを使って簡単な値を取得する
– [MUST]

元記事を表示

SQLBuilderの仕様を考える 目標設定編

# 目的
GolangのSQLBuilerを作ってみたくて、仕様を考える。
最終系をみつつ、Version1にするゴールを考える

# なんでやってみたいのか
GolangにもSQLBuilderはあるが、unionに対応していないことが多い。(もしかしたらやり方を知らないだけかも)
現在業務では、unionを使うことが非常に多いのでどうするべきかに困っていた。
With句を使うことも多いのでこちらも対応したい。
それならやってみようと思ったことと、OSS活動にもならないかと思ってやってみようと思い立った。

# 目標
主要な手段である
– Select
– insert
– Update
– Delete(truncateを含める)
に対応できるようにしたい。
最初は特定のコマンドを実行することでSQL文が取得できる形を目指す。
他のORMなどの連携に関しては形ができたときに検討することとして一旦は保留とする。
最初はMySQL対応をベースにする。
Postgreseに関しては別途対応を考えるものとする。

## Modelとの関係性
Version1では基本見送る。
方針としては

元記事を表示

平均律じゃなくたっていいじゃない 〜2の12乗根は無理数だもの〜

https://qiita.com/advent-calendar/2023/42tokyo

この記事は 42 Tokyo Advent Calendar 2023 の 12日目の記事です。

12といえば、西洋音楽で 1オクターブに存在する半音の数ですよね!

ということで、今回は go言語で wave ファイルを生成しつつ、平均律以外の音律でも演奏できるようにしてみたいと思います。

## WAV ファイル

https://ja.wikipedia.org/wiki/WAV

RIFFベースの音声ファイルフォーマット。
非圧縮リニアパルス符号変調で符号化した音声の格納によく用いられる。
要するに音の波形をそのまま数値化したデータを格納している。

### WAV ヘッダー

“`go
type WaveHeader struct {
ckID_riff [4]byte // “RIFF”
ckSize_riff uint32 // 以降のバイト数 // 36+len(data)
formType [4]byte // “WAVE”

元記事を表示

Goで学ぶGraphQLサーバーサイド(10)ーGraphQL特有のミドルウェア

こんにちは。

今回は「GraphQL特有のミドルウェア」について説明していきます。

# この章について

前章にて「クエリ複雑度によって、リクエストの受付可否を決める」機能を、エクステンションというミドルウェアのようなものを使って導入しました。
しかし、GraphQLには他にもリゾルバによる処理前後にロジックを挟むミドルウェアが存在します。
本章ではそれらを紹介したいと思います。

# GraphQLサーバーに適用できるミドルウェア

`github.com/99designs/gqlgen/graphql`の中に定義されているミドルウェアは全部で4種類存在します。

“`go
type OperationMiddleware func(ctx context.Context, next OperationHandler) ResponseHandler
type ResponseMiddleware func(ctx context.Context, next ResponseHandler) *Response
type RootFieldMiddleware func(ct

元記事を表示

Goのクロスコンパイルのありがたみを知る

# クロスコンパイル
Goはクロスコンパイルをサポートしています。
つまり、MacOS上でWindows上、Linux上それぞれで動作するバイナリを生成することができます。CPUアーキテクチャも複数サポートしています。

## クロスコンパイルできると
実行環境用のバイナリを生成できるということは、わざわざGoが動作する環境を用意する必要がありません。(Goの環境構築は比較的容易ですが)
もっというと、リポジトリをcloneする必要がなかったり、コンテナにはバイナリ一つ載せればよいということになります。

## クロスコンパイルできる環境
クロスコンパイルできる環境一覧です。
`OS/CPUアーキテクチャ`で表示されています。
“`bash
$ go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm6

元記事を表示

[Go]パート4

# はじめに
訳あってGo言語を勉強することになりました。
完全に自分のメモ用です。
馴染みのない書き方を中心にメモしていきます。

## func
“`go:main.go
package main

import “fmt”

func main() {
var a int
var b int

a, b = test(5, 7)

fmt.Println(a)
fmt.Println(b)
}

func test(x int, y int) (int, int) {
return x * y, x + y
}
“`
結果
“`
35
12
“`
戻り値を複数返すことが可能です。

## ポインタ
“`
package main

import “fmt”

func main() {
var val1 int

fmt.Println(val1)
change(&val1)
fmt.Println(val1)

}

func change(hoge *int) {
fmt.Println(hoge)
*hoge = 4
}
“`
結果

元記事を表示

gqlgenで大きなファイルをアップロードできない時の対処法

# はじめに
普段、業務でGo + GQLGenを使ってアプリケーションを構築しているものです。
https://gqlgen.com/

その中で3MBぐらいのファイルをアップロードした時にエラーが出る事象が発生しました。その時の解決まで至る過程を記します。

# 不具合発生
ある日、ビジネス側から不具合の報告が

「ファイル(画像)を50枚ぐらい一度にアップロードしようとするとエラーになる」

すぐにローカルで確認しましたが、再現。コンソールを見ると、

“`
net::ERR_CONNECTION_RESET
“`

が出ていました。

# 調査
エラーメッセージが汎用的なものだったので、全く原因がわからず非常に苦戦しました。

ログを見てみると、バックエンドにリクエスト自体は来ているみたいなので、バックエンドのどこかで落ちていると仮定して、調べてみました。

# 解決法

どうやらGQLGenではデフォルトでファイルの最大が決められているらしく、それを変えたら正常に動くようになりました。

https://stackoverflow.com/questions/756461

元記事を表示

Datadog Go APM の automatic instrumentation

## はじめに
こんにちは、Datadog Japan で Sales Engineer をしている AoTo(@AoTo0330) です。

この投稿は **[AoTo Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aoto) 12日目**の記事です。

**Orchestrion** はご存知でしょうか。

Golang はコンパイル型の言語のため、Java, Python のように実行時にコードを追加することができません。アプリケーションの計装を行うには手動計装か、最近では eBPF を利用した自動計装が知られています。

これに対し Datadog は [**Orchestrion**](https://pkg.go.dev/github.com/jonbodner/orchestrion) と呼ばれる自動的計装のツールを公開しています。

:::note info
Orchestrion による automatic instrumentatio

元記事を表示

プログラミング言語Go 1Dayブートキャンプ に参加して

![Advent Calendar 2023 Template.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618539/1832138c-67bb-ca66-f327-8a8eeb83ea8f.png)
[Chompy Advent Calendar 2023](https://qiita.com/advent-calendar/2023/chompy) の12日目です。

はじめまして。
ChompyでBIZアシスタントをしたり、コーポレートをしたり、エンジニアに転向したりしている吉田です。
経歴が怪しいですが、気になる方は[Podcast](https://open.spotify.com/episode/0OlqreJHXl6a6iFJQ2nI6n?si=onHc9kQjSGW1ud9iFFhRfA)をチラ聞していただけると経緯を話していたりします。

# プログラミング言語Go 1Dayブートキャンプ

Go初心者なのでさまざまな形で勉強しているのですが、
先日ブートキャンプへ参加する機会

元記事を表示

OTHERカテゴリの最新記事