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

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

lambda + Goで定期バッチを作成する

この記事はディップ株式会社[Advent Calendar 2022](https://qiita.com/advent-calendar/2022/dip-dev) の18日目です

## 概要

私が所属しているチームでは週1回定例があり、[DocBase](https://docbase.io/)という情報提供ツールに議事録を残しています。
議事録は毎週定例実施前にテンプレートを手動で準備していましたが、以下問題点がありました。

#### 新規issueの記入が面倒
議事録には、定例までの期間に新しく作成されたissueを記入をする必要がありますが、所属チームではリポジトリを複数管理しています。
そのため、リポジトリごとにissueを検索 -> md形式に変換 という工程を複数回を行う必要があり、issueの記入に時間がかかりました。

#### 手作業によるミス
人の手で作業を行うため、日付のミス・issue起票のミス・議事録作成忘れなどが稀に発生していました。

これらを解決し業務を効率化させるために、定例議事録の作成をバッチ化させました。

## 詳細

定例バッチの作成

元記事を表示

Golang の Generics で使いたいものは大体 samber/lo にあった話

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

Generics を使った関数でやりたかったことが、[samber/lo](https://github.com/samber/lo) に大体揃ってたという話をします。
すでに自前で書いてた関数もいくつかあったのですが、このライブラリを知り置き換えていったという体験談です。

※結果的に「`samber/lo` のなかでこの辺り使えるかも」というものを私の独断と偏見でピックアップする記事になってます。

# `samber/lo` とは
`samber/lo` は [16日目のアベンドカレンダーの記事](https://qiita.com/sakashin10291029/items/bb16c24bea1399353295) でも取り上げられていまして、そこから説明を引用させていただきました。

> samber/loは,多種多様な便利関数を提供するパッケージです。
JavaScriptのライブラリ

元記事を表示

【GORM】CRUD操作する方法まとめ

この記事は DeNA 23 新卒 Advent Calendar 2022 の18日目の記事です!
さまざまなジャンルの技術に関する記事が投稿されていくので, ぜひご覧ください!??
https://qiita.com/advent-calendar/2022/dena-23-shinsotsu

## 背景
インターン業務のなかで, Go言語のORMである[GORM](https://gorm.io/ja_JP/docs/index.html)を使う機会がありました. その際に, GORMが高機能であるがゆえに, 個人的に次の2つの課題を感じていました.

– 「レコードを取得したい」, 「レコードを更新したい」などの目的に対し, 方法がいくつかあり, どれを使えばいいのかわからない
– DBに関する知識が乏しいため, ドキュメントにある説明だけでは使用方法がわからないことがある

本記事ではこれらの課題を解消すべく, GORMを使った基本的なCRUD操作の方法についてまとめました.
なお, 基本的に[公式ドキュメント](https://gorm.io/ja_JP/docs/inde

元記事を表示

rclgoのhumble対応(中)

# はじめに

すいません,私もこのネタ(includeパス問題)です.

Go言語(以下,golang)はクラウドネイティブな各モジュールと相性が良い.Webサーバ機能がPy○○onなどと違ってテスト用ではなく商用にも耐えられるモノが標準で採用されてる点が大きい.その他諸々からもREST APIファーストな用途には欠かすことが出来ない言語と言える.

そんなgolangをROS2でも利用したい!と考えるのは最早,必然である(?)

2022年現在,目についたrclgo実装は次の通り.

– [https://github.com/tiiuae/rclgo](https://github.com/tiiuae/rclgo)
– [https://github.com/juaruipav/rclgo](https://github.com/juaruipav/rclgo)
– [https://github.com

元記事を表示

【Go/Gin】画像を返すAPI

imagesフォルダにある画像を
(ルートURL)/(任意のパス)/(画像名)
にアクセスすることによって返してくれるAPIを作りました。

## フォルダ構成
“`
root
├ images
├imageA.png
└imageB.png
└main.go
“`

## コーディング
“`Go:main.go
package main

import (
“github.com/gin-contrib/static”
“github.com/gin-gonic/gin”
)

func main() {
router := gin.Default()

//画像を返す
router.GET(“/api/Image/:imageID”, HandlerImage)

router.Run()
}

func HandlerImage(ctx *gin.Context) {
imageID := ctx.Param(“imageID”)

//パスをここで指定
path := “/images/” * imageID + “.png”

元記事を表示

Goで作るインタプリタ/コンパイラ入門!

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

プログラミング言語ってどうできているんだろう?自作できたらめっちゃかっこいい!と思って出会った以下2冊の紹介です?‍♂️
– [Writing An Interpreter In Go](https://amzn.asia/d/0wrNAvK)
– tree-walking型インタプリタで動作するプログラミング言語をGoで自作できるようになる
– 邦訳: [Go言語でつくるインタプリタ](https://amzn.asia/d/aIKHG5e)
– [Writing A Compiler In Go](https://amzn.asia/d/gvrVPng)
– ASTから中間表現であるバイトコードを出力するコンパイラとそれを実行する仮想マシンを実装する
– 邦訳版はないので英語を頑張って読んだ? (kindle版で翻訳かければよかった)

元記事を表示

Vue-CLIで作ったページをGo/GINで表示する最短手順

Vue-CLIで作ったフロントエンドをGinのバックエンドで配信する方法が意外と見つからなかったため、記事を書くことにしました。

# 全体的なディレクトリ構成
“`
root
┝ client #フロントエンド、Vue-cliがここに
┝ public
┝ src
(その他)
└ server #バックエンド、Goがここに
┝ main.go
(その他)
“`

# フロントエンドのセットアップ
普通にVue-cliを作るだけ。
“`
###rootディレクトリにて

# clientフォルダ直下にvue-cliプロジェクトを作成
$ vue create client
“`

# フロントエンドのビルド
フロントエンドが書けたら(特に何もしなくともデフォルトでページがあります)、バックエンド側で表示するために下記のコマンドでビルドする必要があります。

フロントエンドを更新したものを反映するには、その度にビルドする必要があります。
“`
$ npm rum build
“`

# バックエンドのセットアップ
こちらも普通にgo、

元記事を表示

Go/Gin Gormでよく使うDB操作 + 簡単なアプリ作成

# Gin勉強の備忘録
Gormの簡単なまとめ + Gormを使用した簡単なWebアプリ作成
## Gormとは
Go言語専用のORMライブラリ。
構造体を引数に渡すことによって簡単にDB操舵が可能。
## Gormを使うには
下記のインストールを行う(ファイルgo.modがないとインストール不可)
“`terminal
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite
“`

mainやinit内でDBファイル作成&開く
“`go
db, err := gorm.Open(sqlite.Open(DBName), &gorm.Config{})
if err != nil{
log.Fatalln(err)
}
“`

## よく使うCRUD
### レコードの作成
“`go
db.Create(&構造体)
“`
### レコードの更新(単一のカラム)
“`go
db.Model(&構造体{}).Where(“カラム名 = ?”, 検索値).Update(カラム名, 更新値)
“`

### レコード

元記事を表示

Open Match チュートリアルをminikubeでやる場合の落とし穴

「 [Applibot Advent Calendar 2022](https://qiita.com/advent-calendar/2022/applibot) 」 18日目の記事になります。
前日は @smoto-shei さんの [Amazon SageMaker でモデルをデプロイしてみた](https://blog.applibot.co.jp/2022/12/17/amazon-sagemaker-deploy/)という記事でした。

## はじめに
Open Matchとminikube何もわからんという状態からOpen Match チュートリアルをminikube環境で実行する際にハマった箇所を紹介します。
※チュートリアル自体の解説はしません。

## 動作環境
今回、動作確認した環境は下記の通りです。
![Screen Shot 2022-12-17 at 23.01.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893255/5021acd8-6f8a-7f23-4a57-

元記事を表示

GoでCSVのファイルを読み込んで情報を保存する

この記事は [Howtelevision Advent Calendar 2022](https://qiita.com/advent-calendar/2022/howtelevision) 18日目の記事です。

17日目は [mayuko_okamoto](https://qiita.com/mayuko_okamoto) さんによる[「数字アレルギーのド文系が元エンジニアに教えを乞うてRedash使ってみた」](https://qiita.com/mayuko_okamoto/items/739292b8d36f0416d399) でした。

今月12月にハウテレビジョンに入社しました川原です。主に外資就活ドットコムの開発をしています。
弊社が運営する外資就活ドットコムではバックエンドにGoを採用しています。そこで個人的な練習としてGoを用いてCSVファイルの処理を実装してみました。

## やったこと

あらかじめダウンロードしておいたクレジットカード明細のファイルを用意し、プロジェクト直下のディレクトリで`go run`するとクレジットカードの明細からほしい情報を読み込んで

元記事を表示

【Go】paiza練習問題「じゃんけんの手の出し方」を解いてみた

# 元ネタ
じゃんけんに関するコーディング問題がどこかに落ちてるかなと思い、検索したら以下サイトが出てきたのでこれを勉強中のGoで解いてみました。 :fist: :v_tone5: :raised_hand_tone1:

https://paiza.jp/works/mondai/skillcheck_sample/janken

# コード
“`go:main.go
package main

import (
“fmt”
)

const (
FINGER_NUM_G = 0
FINGER_NUM_C = 2
FINGER_NUM_P = 5
)

type Conditions struct {
times int // N
totalFingers int // M
enemyMoves string // s
fingerNumMapAllWin map[string]int
totalFingersAllWin int
}

func (c *Conditions) SetAllWinI

元記事を表示

Goのpackage管理

## はじめに
goのpackage管理関係は変更が多くて苦労した
理解できた気がするのでまとめる

## 基本は下記でなんとかなりそう

“`go
// global install
go install @

// local install
1 go mod init [module名] // 基本はリポジトリ名に合わせる
2 import文記載
3 go mod tidy
“`

3の`go mod tidy`は使ってないpackageの掃除もする
新規packageのinstallのみしたい場合は `go get`を引数なしで実行する

元記事を表示

Goのlog.Fatalではプログラムが終了してしまう

# TL;DR

Go言語の例外発生時に下記のような処理を行うことがあると思います。
“`go
if err := hogeFunction; err != nil {
// エラー処理
}
“`

エラー処理のところでログ出力のために`log.Fatal(err)`を使っていたところ、意図せずプログラムが終了してしまいました。
処理を継続したければ`log.Print(err)`を使うのがよさそうです。

# 解決したい課題

Ruby on RailsのRakeタスクから、別のRuby on Railsアプリケーションにリクエストを送り、Goのコードを実行して外部のAPIを呼び出すシステムを構築をしていました。

(1) Ruby on Rails
↓ GraphQLにてリクエスト
(2) Ruby on Rails
↓コマンド実行
(3) Go
↓リクエスト
(4) 外部API

実行するRakeタスクについてはもとのRuby on Railsにある`Category`モデルのフェッチ対象を抽出する処理が書かれています。`ApiClient.new.request_t

元記事を表示

【Go】Generics を使って、null 許容 scalar type 的なものを作る

string や int など、プリミティブな型は、それがゼロ値なのか、意図してその値になっているのかわからない時がある。
それを判別するために database/sql pkg などでは、[NullString](https://pkg.go.dev/database/sql#NullString) などの独自型を用意して、ゼロバリューなのかどうかを判定できるようにしている。
それをジェネリクスを使って、汎用的に書いてみたものが以下。

“`go
package main

import (
“fmt”
)

type NullValue[T any] struct {
value T
valid bool
}

func NewNullValue[T any](v T) NullValue[T] {
return NullValue[T]{
value: v,
valid: true,
}
}

func (nv NullValue[T]) Value() (T, bool) {
var noop T
if !nv.valid {
return noop

元記事を表示

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アプリの開発
#### ディレクトリ構成

  • OTHERカテゴリの最新記事