Go関連のことを調べてみた2022年12月17日

Go関連のことを調べてみた2022年12月17日

JavaScriptの非同期処理でgoroutine(WaitGroup)っぽい動きを実装してみる

# JavaScriptでgoroutine(WaitGroup)っぽい動きを実装してみる
## 背景
卒業研究の検証を行う際、常に一定数の非同期処理を同時に実行するプログラムが必要になりました。`Promise.all`を用いて並行実行することはできるのですが、ある程度の処理をまとめて実行する関係上、処理の数を常に一定にすることができませんでした。他に情報も見当たらなかった(記事書いてる時に発見したやつは最後に)ので、並列処理が扱いやすいと言われているGoのWaitGroupを元にして実装してみました。

## 環境
– TypeScript Playground
– TypeScript 4.9.4

## 使い方
1. インスタンスを生成
1. 非同期処理の実行前に`addメソッド`を実行
1. 非同期処理の実行
1. 非同期処理の終了時に`doneメソッド`を実行
1. 2~4を繰り返す
1. 一通り実行したら、`waitメソッド`で全ての処理が終了するまで待機

基本的にはGolangにおける使い方([公式ドキュメント](https://pkg.go.dev/sync#Wa

元記事を表示

Elasticsearchへのアクセスレイヤーの単体テストをmockせず実装する

## 本記事でやること
– Elasticsearchへのアクセスレイヤーに対する単体テストを書く際にmockせず本物のElasticsearchを利用する実装方法の紹介

今回実装したコードは[こちらのレポジトリ](https://github.com/kurakura967/unittest-for-es)で公開しております。

## 対象読者
– Elasticsearchを使ったアプリケーションを実装したことがある方
– Elasticsearch周りの単体テストの書き方に悩んでいる方

## 使用言語とライブラリー
– Go言語 1.18
– [olivere/elastic](https://github.com/olivere/elastic) (非公式 Elasticsearch clientライブラリー)

## 背景
以下、[t_wada](https://twitter.com/t_wada)さんのツイートを拝見し、DBとしてElasticsearchを使っている場合はどのような実装になるのかなとふと疑問に思ったのが、本記事を執筆した背景になります。

テスト時に

元記事を表示

Goのテストライブラリtestifyのsuiteを使ってDynamoDBテストを実装する

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

# はじめに
データの取り扱いのテストはどのように実装していますか?
例えば、RDBMSであれば、コネクション単位でロールバックしてくれるような、[go-txdb](https://github.com/DATA-DOG/go-txdb)等があるので、割と簡単にテスト単位でデータ制御ができると思いますが、DynamoDBなどのNoSQLにはそのような機能(ライブラリ)がなかったため、`testify`の`suite`を使用して同じようなことを行ったので、紹介したいと思います。

# testify
[testify](https://github.com/stretchr/testify)は、おそらくGoを使ってテストを書いたことがあれば知っているであろうというくらい有名なライブラリかと思います。

テストを書く際に簡潔かつ便利な機能が備わっていますが、今回は、その中の1つである[suite-package](https:

元記事を表示

DockerでGo+React+TypeScript+Chakra-UI+MySQLの環境をつくる

# はじめに
業務でタイトルの環境を作ることが多くなってきたことと、今後教える際に楽をするためにまとめてみます。
以前にDockerでGo+MySQLの環境をつくる記事を出しているので、こちらと重複している部分があります

https://qiita.com/does_not_exist/private/0f948f137a926928ae07

# ディレクトリ構成
“`
sample-project
┣ docker
┃ ┣ go
┃ ┃ ┗ Dockerfile
┃ ┣ reactapp
┃    ┗ Dockerfile
┣ .env
┣ docker-compose.yml
┣ my.cnf
“`

# ファイル作成

“`Dockerfile
# docker/go/Dockerfile

FROM golang:1.18.0
RUN apt-get update && apt-get install -y build-essential make

# vscodeの拡張機能のためにインストール
RUN go install golang.org

元記事を表示

【Go】打ち込みでスマホの着メロを作ろう【3和音】

昭和エンジニアの四谷です。

自作プログラムと打ち込み譜面で、スマホの着メロを作りたいと思います!
タイトルに「3和音」と書きましたが、「携帯 3和音」でググると、出るわ出るわ、なつかしいiモード。イメージ的にはあんな感じ。ビープ音による3和音に挑戦してみます。

こちらを参考にさせていただきました。

https://news.mynavi.jp/techplus/article/gogogo-18/

## おおまかな手順

独自の定数表現で楽譜を打ち込んで音楽を作成し、できた音源をスマホ(iPhone)に着信音として登録します。

プログラムで音符打ち込み

実行

wavファイル生成

ファイル形式を変換しスマホに転送

着信音に登録

完成!

## 打ち込む音の定義

高さ/強さ/長さの構造体とします。
音楽についての基本知識的なものは[楽典](https://xn--i6q789c.com/)をご参考ください。

https://xn--i6q789c.com/

### 高さ
ピアノと同じ88鍵の周波数を以下サイトを参考にしました。

https:

元記事を表示

go + gin + gormでtodo Webアプリを作ってみた

# go + gin + gormでtodo Webアプリを最速で作ってみた

go歴3ヶ月でtodo webアプリを作ってみました。

環境:Macbook + Goland

#機能概要
* todoリスト
* todo作成
* todo更新
* todo削除

# ginのインストール
[ginの公式サイト](https://gin-gonic.com/)

“`go get -u github.com/gin-gonic/gin“`

## その他ライブラリのインストール
### GORM:O/Rマッパー
[gormの公式サイト](https://gorm.io/ja_JP/)
* gormのインストール
“`go get -u gorm.io/gorm“`
* gorm sqliteドライバのインストール
“`go get -u gorm.io/driver/sqlite“`

### configライブラリのインストール
“`go get gopkg.in/ini.v1“`

### todoアプリの開発
#### ディレクトリ構成
Go/Gin sessionsで構造体の受け渡しについて

# Gin勉強の備忘録
今回Webアプリケーション開発中に躓いたところ→sessionsでの構造体の受け渡し

“`
“github.com/gin-contrib/sessions”
“github.com/gin-contrib/sessions/cookie”
“`

## サンプルコード
“`go:main.go
package main

import (
“net/http”

“github.com/gin-contrib/sessions”
“github.com/gin-contrib/sessions/cookie”
“github.com/gin-gonic/gin”
)

type User struct {
ID int
Name string
}

func main() {
router := gin.Default()
store := cookie.NewStore([]byte(“secret”))
router.Use(sessions.Sessions(“mysession”, store))
router.Load

元記事を表示

samber/lo で三項演算子っぽくコードが書けるよ

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

[samber/lo](https://github.com/samber/lo)に三項演算子のようなコードを書くことができる関数が在ることをしったので紹介します。

## `samber/lo`とは

`samber/lo`は,多種多様な便利関数を提供するパッケージです。
JavaScriptのライブラリの`Lodash`ライクであるとREADMEにも記載があります。
個人的には大好きなパッケージでして,`Map`,`Filter`等のスライスを操作する関数をよく使っています。

https://github.com/samber/lo
https://github.com/lodash/lodash

## `Ternary`

アドベントカレンダーのネタ探しに`samber/lo`のREADMEを眺めていたところ`Ternary`という関数があることを知りました。
この関数を用いると三項演算子のようなコードを書く

元記事を表示

ノートンさんなにやってんの(Go言語のプログラム実行時にウイルス誤検出)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154400/09b48e5d-b652-1f32-e3fd-a31273e8c7cf.png)

## 概要
Go言語にて以下のソースを入れて実行すると、なぜかビルドしたexeファイルがウイルスファイルとして扱われて削除された。

内容はこんなかんじ。

arr3 := [3]int{1, 2, 3}
fmt.Println(arr3)

ノートン画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154400/e777c9df-4b5f-6a7e-4470-4d570ca7b63f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154400/661a8dae-d1fb-3138-3da4-9ada06f0b64f.

元記事を表示

Go言語の並行処理について

## はじめに
こちらの記事は個人学習でGo言語の並行処理について学習をした際のアウトプットになります。

勉強する際に使用させていただいた、主な教材はこちらになります。
– 書籍
– [実用 Go言語](https://www.oreilly.co.jp/books/9784873119694/)
– [スターティングGo言語](https://amzn.asia/d/hhIIVU0)
– 記事
– [Goでの並行処理を徹底解剖!](https://zenn.dev/hsaki/books/golang-concurrency)
– こちらの記事は初心者の方でも、すごく読みやすいと思いますので是非一度ご覧いただきたいです。

## 並行処理について

並行処理を行うことのメリットとデメリットについて

– メリット
– 複数のCPUに処理が渡されることで、実行時間が速くなる可能性がある。
– デメリット
– プログラムの実行される順番が分からない。

※以下の例のように処理の流れが決まっている場合は、実行時間が速くなる訳ではない。

元記事を表示

Azure App Service と Azure AD で OAuth 2.0 の認可コードフローを実装してみる

# 1. はじめに
昨今のシステムでは認証認可の仕組みを導入することは必須条件となっていますが、(私個人の見解では)認証認可の仕組みをドキュメントを読み込むだけで理解するのは難しいと思います。

そこで[NRI OpenStandia Advent Calendar 2022](https://qiita.com/advent-calendar/2022/nri-openstandia)の16日目は、少しでも認証認可の仕組みを理解していただくために Azure App Service と Azure AD を使用して OAuth 2.0 の認可コードフローを実装していこうと思います。

# 2. OAuth 2.0 と 認可コードフロー
まずは基本となる OAuth 2.0 の説明からです。[RFC 6749 (The OAuth 2.0 Authorization Framework)](https://openid-foundation-japan.github.io/rfc6749.ja.html)から引用します。

> OAuth 2.0 は, サードパーティーアプリケーション

元記事を表示

Treasure2022体験記【Matchong】

### はじめに

こんにちは!神奈川県の大学に通っている mayukorin と申します.本日は,今年の夏に参加した Treasure というインターンのことについて書きたいと思います!Treasure については他にも様々な方が記事にしているのでぜひ見てみてください!

– [Treasure2022に参加してきた](https://rio-1.hatenablog.com/entry/2022/08/31/182334)
– [Treasure2022に参加](https://note.com/akira4649/n/nf5d8aff0ecec)
– [「Treasure2022」企画への意気込みと概要について](https://techblog.cartaholdings.co.jp/entry/treasure2022-planning)
– [過去最大規模のTreasureへ!インターン裏側奮闘記](https://techblog.cartaholdings.co.jp/entry/treasure2022-report)
– [Treasure 2022で学生にFB

元記事を表示

OpenTelemetryからStackdriverにメトリクスを送る方法

# はじめに
本記事は[QualiArts Advent Calendar 2022](https://qiita.com/advent-calendar/2022/qualiarts) 15日目の記事です。
GolangでOpenTelemetryを使ってGCPのCompute(今回CloudRunでの検証)からTraceとMetricを転送する方法についての記事になります。
OpenTelemetryは、Trace機能はStableになったもののMetric機能に関してはまだAlpha段階( https://opentelemetry.io/docs/instrumentation/go/ )ですので、今後この記事の内容とは大きく変更される可能性があります。そのあたりはご了承ください。

# OpenTelemetryとOpenCensus
これに関してはググればおそらくたくさん出てくるので多くは書きませんが、Google社内で作られたCensusというライブラリが一般公開されたのがOpenCensusで、一方[CNCF](https://www.cncf.io/)でもOpenTr

元記事を表示

Casbinで学ぶアクセス制御モデルRBAC

このエントリーは [3-shake Advent Calendar 2022](https://qiita.com/advent-calendar/2022/3-shake) 15日目の記事です。

## 自己紹介
* サーバーサイドメイン(フロント、インフラチョットだけ)で18年くらいエンジニアやってます
* 2022年10月に面白そうということで株式会社スリーシェイクにJoin
* インフラ構築運用もバリバリできる**スーパーエンジニア**になりたい
* 趣味はスノボ・ビール・うさぎ
* Qiita初投稿、Advent Calendar初参加なので乱文ご容赦ください

## どんな記事?
プロダクトで利用しているCasbinというライブラリを使う中で、
アクセス制御モデルのRBACについて学んだのでそのご紹介です。
こんなことができるんだーという感じで気軽に読んでいただければ!

## Casbinとは
ACL、RBAC、ABACなどの様々なアクセス制御モデルでアクセス制御(≒リソース認可)を行えるライブラリです。
バックエンドAPIではリソースに対してのアクセスを制御するために使

元記事を表示

GoでDB接続からテーブル作成まで

# はじめに

Goの開発環境をDockerで構築していることを前提にすすめます
前日の記事でまとめているので、こちらを参考にしていただければと思います

https://qiita.com/does_not_exist/private/0f948f137a926928ae07

# やりかた

まずサーバーを立てます
今回はginの公式ドキュメントを参考にしました

https://gin-gonic.com/ja/docs/quickstart/

その後、Postmanからサーバー(localhost:8080/ping)にアクセスして結果が返ってくることを確認します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/107ed424-e783-ca7a-722e-b0b78407d6ee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2889192/5d2

元記事を表示

Go言語 + ElasticSearchで単体テストを実行する

:::note info
この記事は、Go Advent Calendar 2022 15日目の投稿です。
:::

https://qiita.com/advent-calendar/2022/go

# 1.はじめに
以前、Go言語+ElasticSearchを用いたプロジェクトに参画していたので、
その時に携わっていた「Go言語」+「ElasticSearch」で実施する単体テスト方法を2つ紹介します。
– ElasticSearchサーバーの動作をモックする方法
– TestContainersでElasticsearchのインスタンスを起動する方法

前提として、Elastic社がサポートしている公式の[Goクライアント]((https://github.com/elastic/go-elasticsearch))を利用します。
こちらのライブラリについては[この記事](https://qiita.com/shiei_kawa/items/d992f7fdd4c75906ea0b)をご参照ください。

今回の記事のソースコードは、[GitHub](https://gi

元記事を表示

迅速開発GoAdminでマスタ管理

### はじめに
これは 株式会社 RetailAI X Advent Calendar 2022 の 15 日目の記事です。

昨日は @Mikey さんの記事でした。[NFTはなぜ難しいのだろう?](https://qiita.com/esoul/items/f699b7e40766bba92e76)
本日は、[『迅速開発GoAdminでマスタ管理』](https://qiita.com/risei/private/499e357f8864e1dc71d2)について書いています。

### この記事の目的
go-adminの使い方法をまとめます:

サンプルコード:https://github.com/GoAdminGroup/example

### GoAdminのコマンドラインツールをインストールします。


GO111MODULE=on GOPROXY=https://goproxy.cn go install github.com/GoAdminGroup/go-admin/adm

### インストールした後、ver

元記事を表示

Goで平方根を求める、の一歩先

この記事は、[and factory.inc Advent Calendar 2022](https://qiita.com/advent-calendar/2022/andfactory)の **15日目** の記事です。
昨日は@cpp0302の[【IDEA】【GoLand】エラーハンドリングのライブテンプレートを作成する](https://qiita.com/cpp0302/items/311c9e8ed3ed03fd7e5b)でした。

この話は普段の業務とはほぼ関係のないちょっとしたパズルです。リラックスして読んでいただければと思います!

# 平方根を求めるのは簡単?

突然ですがGoで平方根を求めたいとします。正確には整数値を渡して平方根を超えない最大の整数を返す関数を作りたいとします。どうすれば良いでしょうか?

ちょっと慣れた方であればmathパッケージにあるのではないかと想像できるでしょうし、「Go 平方根」で検索すればmath.Sqrtという関数にはすぐに行き着くのではと思います。math.Sqrtはfloat64を受け取ってfloat64を返すなので変換をかけ

元記事を表示

Goのinternalパッケージを使いこなそう

## はじめに

どうも[ナレッジワーク](https://tenn.in/kw)の[tenntenn](https://tenn.in)です。

Goのinternalパッケージはご存知でしょうか?
本記事では、うまく使うととても便利なinternalパッケージについてご紹介します。

## internalパッケージとは

Goパッケージは、基本的には外部のモジュールに公開されます。
パッケージ内のどの識別子を公開するかは、先頭の文字を大文字にするかどうかで決まりますが、パッケージにはその機能はありません。

しかし、Goにはinternalパッケージ(内部パッケージ)という特別なパッケージがあります。internalパッケージは、モジュール外には公開されません。
また、internalパッケージの親パッケージおよびその子パッケージ以下からしか参照できません。

たとえば、以下のようなパッケージ構成があった場合を考えます。

“`
a
├── b
│   ├── d
│   └── internal
│   └── e
├── c
└── go.mod
“`

`a/b

元記事を表示

とっても便利なgoleakでゴールーチンリークを見つけよう

## はじめに

どうも[ナレッジワーク](https://tenn.in/kw)の[tenntenn](https://tenn.in)です。

本記事では、テストでゴールーチンリークを検出する便利なライブラリについて紹介し、その仕組について解説します。

## ゴールーチンリークとは

ゴールーチンリークとは、ゴールーチンが終了せず、ずっと残ってしまうことを指します。ゴールーチンが終了しないと、メモリも開放されないため、メモリリークが発生します。

たとえば、次のようなコードではゴールーチンリークが発生します。

“`go
package main

import (
“fmt”
“runtime”
)

func f() {
ch := make(chan int)
go func() {
for x := range ch {
fmt.Println(x)
}
}()
ch <- 10 ch <- 20 } func main() { fmt.Println(runtime.NumGoroutine()) // 1 f() fmt.Prin

元記事を表示

OTHERカテゴリの最新記事