Go関連のことを調べてみた2023年01月13日

Go関連のことを調べてみた2023年01月13日

mackerel-agent-plugin に Pull Request してみたかった

# TL;DR

自分の調査能力が甘すぎて完全に無駄な開発と記事作成をしてしまったので供養のために。読む価値はあまりありません。
Mackerel の plugin は [公式リポジトリ](https://github.com/mackerelio/mackerel-agent-plugins) だけじゃなく [plugin registry](https://github.com/mackerelio/plugin-registry) も探しましょう。
あと、今は公式リポジトリではなく plugin registry に PR を出すものらしいです。
ちゃんと公式のドキュメントを読んで、既存のプラグインを探してから開発しましょう。

# 背景

Go で Slack に常駐する bot をいくつか書いたり、mackerel にカスタムメトリックを投稿するスクリプトを書いたりということができるようになってきたあたりで、passenger のリソース使用量を監視する必要が生じた。
普段は自社サービス・サーバへゴリゴリにロックインした雑なカスタムメトリックばかり作っていたので特に OSS

元記事を表示

GraphQLのschema.graphqlsファイルをバックエンドとフロントエンドで同期するベタープラクティス

# この記事は何か?
フロントエンドとバックエンドをGraphQL APIで連携する場合、スキーマファイル(schema.graphqls)をどうやって連携するか悩んでいました。
色々と試行錯誤して、ベストプラクティスとまでは言えないまでもベタープラクティスに近い解決策に至ったので共有してみます。

# 構成
バックエンドは Go, Gin, gplgen、
フロントエンドは TypeScript, React, Next.js

のSPA構成でそれぞれ別リポジトリで管理しています。

# やりたいこと
バックエンドとフロントエンドでschema.graphqlsファイルから型を自動生成したい。
※ schema.graphqlsファイルの管理はバックエンドが主導で行う前提です。

# やりたくないこと
graphqlsファイルの二重管理。バックエンドの差分を逐一フロントエンドでコピーして追従、というケースだけは避けたい。

# 辿り着いたベタープラクティス
バックエンドでは、[gplgen](https://gqlgen.com/)のコマンドによりGoの型を自動生成し、
フロントエン

元記事を表示

Go:健康データの簡易APIサーバーの作り始め

作成:2023年1月11日

体重など健康データを保存するアプリとバックエンドを作ってみたく、Go でバックエンドを作成する為の情報収集と練習の為に、バックエンドをシンプルなGo言語で書いてみます。

# 事前準備

Postmanをインストールしておきます([参考リンク](https://qiita.com/nlog2n2/items/b5e11332087c335e126e))

# 簡易APIサーバー

GETするコードです(githubのコード置き場:[qiita20210111](https://github.com/ryoyuki6/go-api202301/blob/qiita20230111/main.go))
“`go:main.go
package main

import (
“bytes”
“encoding/json”
“fmt”
“log”
“net/http”
“time”
)

type HealthData struct {
UserID int `json:”user_id”`
Weifgt float64

元記事を表示

Goの並行処理に関して簡単にまとめてみた

## 初めに
[A Tour of Go](https://go-tour-jp.appspot.com/concurrency/1Go)の「Concurrency」項目を終了したので、簡単にGoの並行処理に関してまとめました。
今回は簡単な挙動をまとめたものになるので、詳細に理解したい場合は[Go言語による並行処理](https://www.oreilly.co.jp/books/9784873118468/)等の書籍を読むのも良いと思いました。

## 基本的な挙動
Goはgoroutineという軽量のスレッドを作成して並行処理を行います。
goroutineは下記のコードで作成できます。
“`go
go 関数呼び出し
“`

Goは通常の処理にもgoroutineを使用します。
下記だと、最初にmainのgoroutineが作成され、`go say(“new goroutine”)`のコードで新しいgoroutineが作成されます。
そのため、下記ではmainのgoroutineと新しいgoroutineの2つが動作していることになります。

“`go
func say(s

元記事を表示

PHPerが学ぶGo言語① 変数・定数・配列

どうも、豚さんです。
今回はGo言語に関して書いていきます。

今回もPythonみたいに深く触れずに記事を書いていきたいと思います。
Pythonの記事同様、変数から配列の記事で始めていきます。

公式サイトのサンプルソースを変えて使っています。

プログラムは *func main() {}* の中を見てください。
**あくまで変数〜配列についてです。**
それ以外はまだ理解していないので、ご了承ください。

※ 注意:内容はPHPか何かの言語を書いたことがある方向けなので、
説明を割愛している箇所は多々ありますので、ご了承ください。

**go version go1.19.4 darwin/amd64**

# 1. 変数
変数宣言時は「var 変数名 型名」で宣言します。
値を代入しない時の初期値はint型だと0、とstring型だと””です。
“`sample.go
package main

import “fmt”

func main() {
// 型が明確な場合は、型の記載が不要
var num int
va

元記事を表示

【ド基礎】Goコマンドをフローで整理する

GoのDocker環境を立てている時に `go install` と `go mod tidy`の厳密な動作内容などでつまづいたのでフローで整理しておきます。正しいんだろうかと悩んでいるのでお気軽にツッコミください。

![スクリーンショット 2023-01-09 10.50.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893208/f81fa14f-ef74-0a91-77d3-fc593923063f.png)

# `go install`

外部のモジュールを新しく導入したい時に使う。ただソースコードをダウンロードしてくるだけではなく、ダウンロードしたモジュールを実行可能なバイナリにビルドもしてくれるコマンド。

ってことは差分が `go install` しただけであれば理論上は `go build` しなくて良い?

# `go mod tidy`

go.modファイルとソースコードとの整合を取ってくれるコマンド。go.modとgo.sumに必要なエントリを加え不要なエントリを削除

元記事を表示

Go x MySQLのDocker環境でconnect: can’t assign requested addressというエラーが出たときの対処法

# エラー内容
Dockerで作ったGo x MySQL環境内でDBを作成するため、以下コマンドを実行しました。
“`zsh: ターミナル
docker compose up -d –build
go run main.go
“`

で以下エラーが発生しました。

“`zsh: ターミナル
[error] failed to initialize database, got error dial tcp :0: connect: can’t assign requested address
panic: DB Error: dial tcp :0: connect: can’t assign requested address
“`

## 結論
`docker container exec -it server /bin/sh`でコンテナに入ってから、`go run main.go`しました。

“`zsh:ターミナル
% docker container exec -it server /bin/sh
/go/src/ToDoList-Server # go run m

元記事を表示

各言語のコンテナ

# これは何?

コンテナクラスとかコレクションライブラリとか呼ばれるものの各言語の対応について知りたくなったので、調べた。

# コンテナの色々

思いつく限り書いていくと。

* 配列・vector・slice
* リンクリスト
* 双方向リスト
* 単方向リスト
* deque
* ring buffer
* 辞書 / 集合 / マルチ辞書 / マルチ集合
* 順序がないやつ
* 順序があるやつ
* 挿入削除が速いやつ
* 挿入削除が遅いやつ

当然全部網羅とかはありえないわけだけど、これぐらいで。

## 配列・vector・slice

要素をダラダラ並べた感じ。
インデックスアクセスが速い。末尾への追加もたいてい速い。
末尾以外に追加削除すると時間がかかる。

配列 (Array) と呼ばれることもあるし、vector と呼ばれることも Slice と呼ばれることもある。

List と呼ばれることもある。私はリンクリストを先に想像するのでそう呼びたくはないんだけれども。

## リンクリスト

「次はここ」という情報で要素をたどる。
双方向

元記事を表示

Nix Flakes による Go + Protocol Buffers 開発環境の紹介

# Nix Flakes による Go + Protocol Buffers 開発環境の紹介

## 概要

Nix パッケージマネージャの機能の一つである **Nix Flakes** を使って, Go 言語における Protocol Buffers を扱える開発環境を構築したときのメモです.理解した内容の整理も兼ねて公開します.

Nix に関連する日本語の情報はとても少ないため,布教の目的で Nix 自身についての簡単な紹介もします.
実用的な使用例をみてもらうことで,興味を持っていただける人がいたら嬉しいです.
それに加えて Protocol Buffers についての紹介を行い (#技術的背景),本題に入ります.

※この記事の内容は筆者の理解で書かれています.
自分自身使いながら覚えていっているので,もし間違っている点などあればご指摘いただけると嬉しいです.

## 技術的背景

Nix / NixOS / Nix Flakes, Protocol Buffers についての紹介を行います.
Nix 関連については過去にも似たような [紹介記事](https

元記事を表示

GraphQL と gRPC で通信する Go 製のマイクロサービスをセットアップする

## 背景
年末年始に Go を勉強したので、 GraphQL と gRPC のサンプル実装を作ってみた。

## 作りたいもの
– フロントエンドから gateway 間を GraphQL で通信する
– gateway とバックエンドサービス間を gRPC で通信する

“`mermaid
graph TD;
ブラウザ –> graphql-gateway
graphql-gateway –> grpc-user-service
“`

## 前提知識
### GraphQL
– 独自のクエリ言語を用いて、フロントエンドで必要なリソース・プロパティだけを柔軟に取得できる
– スキーマ定義をフロントエンドとバックエンドで共有できるので変更にも強い
– https://graphql.org

### gRPC
– 独自のプロトコルを用いてバックエンドサービス間の高速な通信を実現できる
– 同じランタイム内の関数を呼ぶ感覚でバックエンドの処理を呼ぶことができ、様々な言語・フレームワークで実装されたサービスをシームレスに接続できる
– スキーマ定義をクライアントと

元記事を表示

DynamoDBで1:nのデータ構造を表現する

こんにちは太郎です。
最近、DynamoDBを触る機会があり1:nのデータ構造を表現しようとしました。
しかし、DynamoDB特有の設計方法に戸惑ったのでメモを残します。

## 前提条件
この先は例を挙げながら進めます。
ひとつのチームに複数の選手が所属しているという想定です。
チームの一覧を表示する画面と属する選手の一覧を表示する画面があります。
DynamoDBではRDBとは違い、どのようにデータにアクセスするのか次第で構造がかなり変わるため、最初にユースケースをリストアップすることが重要になってきます。

### テーブル設計
RDBで設計するなら2つテーブルを作って、一方が片方を参照しているという設計が一般的かと思います。
しかし、DynamoDBではテーブルの数は極力減らすという方針があります。
それぞれの一覧が取得できるように以下のような設計にしました。

| ID(PK) | dataType(GSI) | teamName | memberName | teamID |
| – | – | – | – | – |
| 1 | team | teamA |
| 2 |

元記事を表示

【Vue.js + golang】ログイン機能をdockerで構築

## はじめに
フロントの描画をvue、バックエンドをgolangで実装し、ログイン機能を実現したものをgithubで公開しました。
https://github.com/rirma/vue_golang_framework

Vue.jsとgolangで構築している記事は何個か見かけましたが、そのまま使えるログイン・ログアウトの機能を実装しているものや、dockerで開発できる環境をgitで公開してくれているものが存在しなかったため構築しました。

今回は、公開した機能一式の説明をします。

## 環境
+ PC: MacBook Pro (15-inch, 2019)
+ OS: Monterey
+ golang: ver1.17
+ Vue: ver3.2.13

goのフレームワーク
Webフレームワーク: gin
DB接続関連: gorm

LaravelライクなMVCモデルを目指して構築しています。

試される方いらっしゃいましたらまずはgithub記載の手順に沿ってVueのコンパイル、及びgolangサーバの立ち上げを行なってください。

## 画面
### ログイン画

元記事を表示

PCでKindleの書籍リストを取得するGo言語のコード

Kindle for PCが持つ情報を使って、Kindleの書籍リストを取得するGo言語のコードです。Gistにはっつけてたものです([extkindlecache.go](https://gist.github.com/hoshimin108/795b5010733136b7521e569331debda6 “extkindlecache.go”))。昔はQiitaにGist連携なんてものがあったようですが、いまは無くなったみたいですね。

[Kindle蔵書一覧を出力するツール作成時の工夫](https://qiita.com/tsukasa_labz/items/08d6217723941fd139b3 “Kindle蔵書一覧を出力するツール作成時の工夫”)で紹介されているアプリケーションを使うのが便利かと思いますが、Go言語を使っている人で自分でやってみたいかたには役に立つんでは無いかな?と思い記事を書きました。

macOSを使っている人は[Kindle for Macの情報を使って蔵書一覧を作成する](https://namaraii.com/post/2022/20220

元記事を表示

proxy-wasm を使って JWT 検証を go 言語で実装できるのか?

proxy-wasm での JWT 検証の実装を通して proxy-wasm でどこまでできるのかを調べた。
proxy-wasm は将来性に期待できる技術なものの、WebAssembly(wasm) のメインの用途はブラウザ上と思われる。
そのため proxy-wasm は発展途上で、現時点では色々な制約・将来性がある中でその魅力・使いやすさなどを知るために触ってみた。

# 要約
– proxy-wasm で JWT 検証を go 言語で実装するのは下記理由で困難だった。おそらく他言語でも同様だと思われる。
– proxy-wasm では tinygo を使う必要があるが、[利用可能な package に制約がある](https://tinygo.org/docs/reference/lang-support/stdlib/)
– proxy-wasm における [http アクセス](https://github.com/proxy-wasm/spec/tree/master/abi-versions/vNEXT#proxy_dispatch_http_call)の

元記事を表示

【Golang】日付の月を数値で取得する

## 結論

“`go:main.go
package main

import (
“fmt”
“time”
)

func main() {

// Januaryなどの英語表記で取得
targetMonthString := time.Now().Month()
fmt.Println(“targetMonthString: “,targetMonthString)

// 1や2などの数値で取得
targetMonthInt := int(time.Now().Month())
fmt.Println(“targetMonthInt: “,targetMonthInt)
}
“`

“`実行結果
~/go/src/jikken$ go run main.go
targetMonthString: January
targetMonthInt: 1
“`

元記事を表示

【Go+gorm】sql.Openとmysql.Openの違い

# はじめに
gorm.Openの第一引数にデータベース接続情報をもったsql.Openの返り値を渡せないことが気になりました。
正しくはmysql.Openを渡してあげることになるのですが、名称も似ていてよく分からなかったので調べてまとめてみます。
“`
gorm.Open(mysql.Open(dbConn), &gorm.Config{})
“`

# 結論
そもそも返り値の型や数が違いました

# sql.Openとmysql.Openの違い

sqlパッケージの公式ドキュメントでは以下のように定義されていました

“`sql.Open
func Open(driverName, dataSourceName string) (*DB, error)
“`

一方、mysqlパッケージの公式ドキュメントでは以下のように定義されていました

“`mysql.Open
func Open(dsn string) gorm.Dialector
“`

また、gormパッケージの公式ドキュメントでは以下のように定義されていました
第一引数のDialector型はmysql.

元記事を表示

go言語 ent migrationメモ

golang + ent のmigrationメモ

“`hoge.go
func (Hoge) Fields() []ent.Field {
return []ent.Field{
field.String(“name”).Optional().Annotations(entsql.Annotation{Size: 200}),
}
}
“`
– null可
.Optional()

– varcharのmax length
.Annotations(entsql.Annotation{Size: 200}),

元記事を表示

gqlgenでDataLoaderを用いてN+1 問題対処 (1対多のデータの取得)【実装編-Part4-2】

# DataLoaderを用いてN+1問題対処(1対多のデータの取得)

:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::

## 今回はPart5-2になります。

**前回の内容を実装した上での実装になります。**

前回:1対1のデータの取得の際のDataLoaderの実装を行いました。
(todoに紐づいている一人のユーザをDataLoaderを用いて取得しました)

https://qiita.com/shion0625/items/47c2b73c1b2d652d8e6c

## この記事の内容
– 1対多のDataLoaderの実装(ユーザに対して紐づいている複数のTodoをDataLoaderを用いて取得する)

## Github Repo
この記事で紹介するコードはGithubに置いています。

**Part5-2までの切り取り**

https://github.com/shion0625/gqlgen-todos/tree/part5-2

## DataLoader(1

元記事を表示

gqlgenでDataLoaderを用いてN+1 問題対処【実装編-Part4】

# DataLoaderを用いてN+1 問題対処

:::note warn
間違っている部分、エラーが発生する部分、わかりにくい部分などがございましたら、是非ご指摘をお願い致します。
:::

## 今回はPart5になります。

**基本的な事をメインに行っているので前回までの内容を知らなくても基本的には問題ありません。前回までの内容をgithubから取得して来ても良いかと思います。(importのgithub.comを調整する必要があるかも知れないですが…)**

前回:一人のユーザから複数のTodoを取得する処理を実装しました。

https://qiita.com/shion0625/items/e59fecfd14843f20bd8b

## この記事の内容
前回一人のユーザから複数のTodoを取得する処理で発覚したN+1問題を対処していきます。
– 前回のおさらい
– DataLoaderの実装

## Github Repo
この記事で紹介するコードはGithubに置いています。

**Part5までの切り取り**

https://github.com/shio

元記事を表示

Go で AtCoder を半年やってみたのを思い出す

# はじめに
おはこんハロチャオ!
正月実家でやることがなく暇すぎるので昨年半年の振り返りと言う意味も込めて Go で AtCoder をやった感想をまとめようと思います。正月らしく(?)アニメを観ながらだらだら書きます。
![Screenshot from 2023-01-04 03-31-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3088500/671ff032-d891-3d80-58ad-e6c62b2d8384.png)
# Go で始めた理由
2022年の4月からコードを書くバイトを始めました。そこで Go を使うかもと言われていたので勉強しようと思っていたところ、それと同時期に複数の知人から AtCoder を勧められました。それ以前には Python しか書いたことがなかったのですが、実行速度が気にかかったのと、どうせなら新しい言語を勉強しようということで Go で始めてみることにしました。
# アカウント作成時
レートの画像を見てわかるとおり実はアカウントを作成したのは202

元記事を表示

OTHERカテゴリの最新記事