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

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

iOS定期購読サーバ実装 verifyReceiptとApp Store Server APIの使い方

# はじめに
こんばんは
この記事は[and factory.inc Advent Calendar 2023](https://qiita.com/advent-calendar/2023/andfactory)の15日目の記事です。

みなさん、iOSの課金処理で使用される[verifyReceipt](https://developer.apple.com/documentation/appstorereceipts/verifyreceipt)はご存知でしょうか?
もちろん知ってますよね。みんな大好きverifyReceiptは、iOSアプリから受け取ったレシートの購入情報をサーバ側で検証する為に使用されることで国民的な知名度があります。

もしも、ある日突然verifyReceiptがDeprecatedになったらどうしますか?
大丈夫、そんな日はまず来ません。まさか俺たちのAppleがそんなことをするはずがありません。
でも備えあれば憂いなし、ということで今日はもしもに備えての妄想をしていきます。

これは妄想の話ですが、verifyReceiptがDeprecatedにな

元記事を表示

Goで実装する基本ソートアルゴリズム

## アルゴリズムとは

アルゴリズムはある目的を達成するための決まった操作のことです。

例えば目的を任意の3つの整数の中で最大のものを取得するとした場合、以下の操作で目的が達成できます。

1. 各整数を任意の順に並べる
1. 1つ目と2つ目の整数の大小を比較して大きい方を取り出す
1. 取り出した整数と3つ目の整数の第上を比較して大きい方を取り出す

これも立派なアルゴリズムです。

上記の整数の個数が10でも100でも3の操作を整数の個数分繰り返して行くと最大が得られます。

## ソートアルゴリズム

アルゴリズムの中でデータを一定の規則に従って並べるアルゴリズムです。

複数の整数がランダムに並んだ状態からある順番に並べ直す

先ほど紹介した最大を取得するを少し発展させて昇順に並べ替えることを目的としてGoのコードを見ていきます。

## ソートアルゴリズムの種類

今回はすべて昇順になるように並べます

### バブルソート

最も基本的なソートアルゴリズムで、隣接する要素を比較して順序が間違っていれば交換するという操作をします。これを繰り返すことで、最大の要素がリストの

元記事を表示

自作のコンテナもどきをGO言語で作成する

こんにちは。Supership株式会社インフラ基盤統括室のhym17です。

:::note warn
この記事は、[Supershipグループ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/supership)のxx日目の記事になります。
:::
# TL;DR
簡単な自作コンテナもどきについて、紹介したいと思います

もっと発展して色々やりたい!簡単すぎるって方はもっと複雑化したのがあるので[GitHub](https://github.com/hayama17/go_container)を参照してみて下さい!

## コンテナとは

Linuxの機能であるnamespaceとcgroupsによってプロセスのisolationを高めたものです。そのため、コンテナはVMと違ってプロセスであり軽量な実行可能になっています。

この記事では、このnamespaceを使って分離されたプロセスを作る事を目的とします。

### Namespace
Linuxが利用するリソースに一意なnamespaceを割り当てるこ

元記事を表示

Goで実践モックテスト

# モックテストとは

メタップスアドベントカレンダー15日目の記事です。
この記事で扱うモックテストとは、ユニットテストを行う際、テスト対象が依存している処理の振る舞いを他のものに置き換えてしまう手法のことです。例えば、データベースに依存したビジネスロジックをテストするときに、データベース処理部分についてはテストを行うのに都合のよいものに置き換えます。このようなことをすることで、何をテストするかに集中でき、ユニットテストを効率よく行うことができます。
私は業務ではGoを扱っていますので、Goにおけるモックテスト手法の紹介したいと思います。

# モックテスト手法

モックテスト手法の説明のために、下記のように外部のAPIを利用して自サーバのIPアドレスを取得し、それをデータベースに保存する処理をテストすることにします。

“`go:service/service.go
package service

type IPAddressService struct {
fetcher IPAddressFetcher
repository Repository
}

func

元記事を表示

[Go] Slice 長さと容量って何?

## はじめに
 こちらは、[RetailAI Adventurers Advent Calendar 2023](https://qiita.com/advent-calendar/2023/rai-adventurers)の15日目の記事です。

https://qiita.com/advent-calendar/2023/rai-adventurers

 昨日は[tanabe_shogo](https://qiita.com/tanabe_shogo)さんの『[GCPでDuet AI使ってみた](https://qiita.com/tanabe_shogo/items/243729c1657f0db67385)』でした。

 この記事では、Goでよく使われる[Slice](https://go.dev/tour/moretypes/7)の仕組みについてご紹介しようと思います。ここで書く内容は、『[100 Go Mistakes and How to Avoid Them](https://www.manning.com/books/100-go-mistakes-and-h

元記事を表示

Goにおけるインターフェースとは

## インターフェースとは
RubyやPythonには明示的に登場する概念ではないため、この場で確認しておきます。
Goにおけるインターフェースとは、メソッドの集合体のこと。他の言語では抽象クラスと呼ばれることもある概念です。

## インターフェースの例
“`golang
type Shape interface {
Area() float64 // 面積
Perimeter() float64 // 周囲
}
“`

`Shape`というインターフェースは`Area()`と`Perimeter()`という浮動小数点を返すメソッドを持っています。
このインターフェースはメソッドの詳細を知りません。

次に、このインターフェースを実装した`Rectangle`という構造体を定義します。
“`go
type Rectangle struct {
Width, Height float64
}

func (r Rectangle) Area() float64 {
return r.Width * r.Height
}

func (
r Rect

元記事を表示

チーム開発参加の記録【2023-10~2024-03】(2) Go言語からTursoを使ってみた

# 本シリーズのリンク

– [チーム開発参加の記録【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/97ca682602b626d5d717))ではSQLiteでORM「Bun」を使ってみました。
本記事では、前回作ったGoプログラムを[Turso](https://turso.tech/)で動かしてみます。

# Tursoチュートリアルに沿ってDBを用意する

[チュートリアル](https://docs.turso.tech/tutorials/)を見ながら、CLIをインストールするところから始めて、テーブル作成&テストデータINSERTまで行います。

## [CLIインストール](https:/

元記事を表示

Go と TinyGo の cgo 呼び出しオーバーヘッドの比較

cgo はビルドも遅くなるし、クロスコンパイルに問題が出ることもあるし、呼び出しオーバーヘッドも大きいです。
ただ、それでも既存の C 言語資産を使いたい場合など、使いどころは多数あります。

以下の記事では、 cgo 使用に対して次のように書かれています。

cgo is not Go

* Slower build times
* Complicated builds
* You lose access to all your tools
* Performance will always be an issue
* C calls the shots, not your code
* Deployment gets more complicated

Go では散々な言われようですが、 TinyGo ではどうでしょうか?

なお、、、 TinyGo については以下の書籍や記事などを参照してください。

https://qiita.c

元記事を表示

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を使用することになりました。
チーム開発に参加しながら、私の学習の軌跡を記事にしていきたいと思います。

# 本シリーズのリンク

– チーム開発参加の記録【2023-10~2024-03】(1) Go言語用ORM「Bun」をDBファーストで使う試み(SQLite使用)
– [チーム開発参加の記録【2023-10~2024-03】(2) Go言語からTursoを使ってみた](https://qiita.com/kanedaq/items/0c81946306d2412df555)

# 本記事で行うこと

[前回のチーム開発](https://qiita.com/kanedaq/items/dcc6b3e50a0b2690033d)ではPostgreSQLを使用しましたが、今回はSQLiteが最有力候補となりました。

元記事を表示

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]

元記事を表示

OTHERカテゴリの最新記事