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

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

golangとAWS Cognitoで認証機能を実装してみた

# 環境について
## Cognitoへのアクセス準備
Cognitoへ接続するためには
`aws_access_key_id`
`aws_secret_access_key`
がそれぞれ必要なので、[AWS SDK for Go](https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#creating-the-credentials-file)を見て下記のファイルを作成します。
“`text:credentials
[default]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
“`
それぞれのKeyについてはIAMでCognitoへのアクセス権限を持ったユーザーを作成すると発行される。

上記で用意したDockerfileにコンテナ内へコピーするコマンドを追加
“`docker:Dokerfile
〜略〜
#

元記事を表示

Gormの使い方についてまとめてみた

goを使ってGormを使ってデータベース操作する必要が出てきたのでいろいろ調べた結果をまとめます。

# データベーススキーマの作成

まずはスキーマの作成の仕方についてみていきます。

### Migrate

Migrateは、接続先のスキーマを参照して、テーブルやカラムがなければ自動的に作ってくれるコマンドです。
足りない関連やテーブルを自動で作ったりはしてくれるが、勝手にカラムを消したりすることはしないとのこと。

> **Auto Migration**
>
> Automatically migrate your schema, to keep your schema up to date.
>
> > NOTE: AutoMigrate will create tables, missing foreign keys, constraints, columns and indexes. > > It will change existing column’s type if its size, precision, nullable changed. It WON’

元記事を表示

Ubuntu22でGo Fyneを使ってAndroidアプリを作ってみた

## はじめに
Go言語でGUIを作ることができるfyneなのですが、モバイルアプリを作ることができるというので、実際にfyneでAndroidアプリが作ることができるか試してみました。

## 前提条件
OS Ubuntu22.04
Go go1.19 linux/amd64
Go言語とfyneのインストールはしてある前提で話を進めます。

Go言語のインストールとfyneのインストールは、[Fyne Develop Getting Started](https://developer.fyne.io/started)、または、@hibikingさんのこちらの記事[GO言語のGUIライブラリ「Fyne」のインストール方法](https://qiita.com/hibiking/items/58a3e93e67394fa1bb4f)を参考にしてください

## 参考にした記事(Youtubeの動画)
実際にAPKファイルを作る方法は、こちら[Golang Fyne: How to compile *apk for Android | Golang Fyne tutorial](http

元記事を表示

非同期処理のメモ

“`server.go
go service.LastAccessUpdater.Run(ctx)
// このdeferでsignal受けた後同期的に溜まっているものがあったらupdateするようにする
defer service.LastAccessUpdater.Flush(ctx)
“`

“`handler/auth.go
// bufferに追加
h.LastAcccessUpdater.Add(user.UserID)
“`

“`service/last_access_updater.go
package service

type LastAccessUpdater interface {
Run(context.Context)
Add(string)
Flush()
}

type LastAccessUpdaterImpl struct {
sync.Mutex

loginManager service.LoginManager
buffer []string
}

func NewLastAccessUpdater(l ser

元記事を表示

CRC32の再現方法を求めて

## 巡回冗長検査

[巡回冗長検査(Wikipedia)](https://ja.wikipedia.org/wiki/%E5%B7%A1%E5%9B%9E%E5%86%97%E9%95%B7%E6%A4%9C%E6%9F%BB)

ファイルの完全性検査などにはSHA256やMD5が使われますが、短いテキストのようなデータの場合、SHA256やMD5は結果が長すぎて使いにくいことがあります。

その点、CRC32は結果が32bitで、16進数表記でも8文字で済むため、元のテキストの代替として使うのに簡便です。

しかし、CRC32と一口に言っても実はいくつかの方式があり、異なる値を算出します。

## CRC32の種類

前掲のWikipediaのページを見ても、32bitのCRCには(厳密にはCRCでないAdler32も含めて)
– CRC-32Adler (厳密にはCRCではないがよく混同される)
– CRC-32
– CRC-32C
– CRC-32K

の4種類が掲載されています。CRC-32Adlerは計算方法が全く異なりますが、それ以外の3つは、Wikipedia記事中で

元記事を表示

【Golang】heredoc で CLI のヘルプ表示のコードをインデント付きで読みやすくする【ヒアドキュメントのインデント】

# 複数行にまたがる文字列のインデント

> Go 言語(以下 Golang)の `(バックティック、バッククォート)を使った、**複数行の文字列を可読性のためにインデントさせたい**。

## TL; DR (今北産業)

1. `import “github.com/MakeNowJust/heredoc/v2″`
– https://github.com/MakeNowJust/heredoc @ GitHub
– Package [heredoc](https://github.com/MakeNowJust/heredoc) provides the here-document with keeping indent.
– [heredoc](https://github.com/MakeNowJust/heredoc) パッケージは、インデント関係を維持したまま、[ヒアドキュメント](https://ja.wikipedia.org/wiki/%E3%83%92%E

元記事を表示

多次元スライスにスライスを挿入する

## やりたいこと
“`
[[1 2 3]]
“`
という多次元スライスに
“`
[4 5 6]
“`
というスライスを足して
“`
[[1 2 3] [4 5 6]]
“`
にしたい

## やり方
“`golang
package main

import “fmt”

func main() {
sliceA := [][]int{
[]int{1,2,3},
}

sliceB := []int{4, 5,6}

sliceA = append(sliceA, sliceB)

fmt.Println(sliceA) //[[1 2 3] [4 5 6]]
}
“`
入れ物になる方の型`[][]int`はintのスライス(`[]int`)のスライスという意味。
`[]int`が挿入する方の型と同じじゃないとエラーになるので注意

元記事を表示

Goコードのクラス図をPlantUMLファイルとして自動生成する

Goコードのクラス図をPlantUMLファイルとして自動生成する (Goにはクラスはないため、正確には「structの関係図をクラス図として表現したもの」である)。

## 環境
– Ubuntu 20.04 LTS (WSL2)
– Go 1.19.3

Goはインストール済みであるとする。

## ツールのインストール

“`sh
# goplantumlのインストール
go install github.com/jfeliu007/goplantuml/cmd/goplantuml@latest
“`

## 手順

“`sh
# クラス定義作成対象のコードを準備 (ここでは、goplantuml自体を利用)
git clone https://github.com/jfeliu007/goplantuml.git input

# plantuml用のファイルを生成
goplantuml -recursive ./input/parser > ./parser.puml
“`

ここまでで、`parser.puml`としてPlantUMLのファイルが生成できた。

元記事を表示

Goの環境構築

## 前提
M1 Macbook

この記事で示す手法は2通りです。
HomeBrewを用いた環境構築
Dockerを用いた環境構築

HomeBrewもしくはDockerの環境構築が済んでいることを前提とします。
参考記事が山のようにあると思うので検索してみたください

## Home Brew
`brew i go`
以上です。

`Goenv`の利用や`GOPATH`の設定は必要ないです。
`Go`は後方互換性が確保されているので、Versionはガンガン上げて良いです。
`GOPATH`に関して昔はいろいろやる必要があったみたいですが、現在(`go 1.19`)では必要無くなったらしい
シンプルで良いですね。むしろシンプルすぎ。

*余談ですが、Goの実行は下記コマンドです*
`go run main.go`

## Docker
`docker-compose.yml`を使います。
`Dockerfile`だけを使う方法もありますが、`servise`が1つでも`yml`使った方が色々便利ですよね。

*構成は下記*
“`
backend
– Dockerfil

元記事を表示

GoのOpenAPI3.0コードジェネレータ、oapi-codegenを触ってみる

GoのOpenAPI3.0コードジェネレータであるoapi-codegenは、yaml定義からGoのコードを生成できる。
今回は、サーバサイドのコードをchiで生成することを試してみる。

https://github.com/deepmap/oapi-codegen

## 環境
– Ubuntu 20.04 LTS (WSL2)
– Go 1.19.3

Goはインストール済みであるとする。

## 手順

生成元となるyamlのサンプルを準備する。以下のファイルを`petstore-expanded.yaml`として作業フォルダに保存する。

https://github.com/deepmap/oapi-codegen/blob/master/examples/petstore-expanded/petstore-expanded.yaml

また、以下を`config.yaml`として作業フォルダに保存。

“`sh
package: petshop
generate:
chi-server: true
client: true
models: true

元記事を表示

GoでミニマムなWebサーバを書く(net/http, chi)

GoでミニマムなWebサーバを書いてみる。以下の2つを書く。

1. net/httpのみを使った例
2. chiでパスパラメータを取得する例

## 環境
– Ubuntu 20.04 LTS (WSL2)
– Go 1.19.3

Goはインストール済みであるとする。

## 1. net/http
以下を実行してプロジェクトを作成する。

“`sh
mkdir go-http
cd go-http
go mod init go-http
touch main.go
“`

main.goに以下を記述する。

“`go
// main.go
package main

import (
“fmt”
“html”
“log”
“net/http”
)

func main() {
http.HandleFunc(“/world”, func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, “Hello, %q”, html.EscapeString(r.URL.Path))
})

log.Fa

元記事を表示

Go gzipで圧縮や解凍時の前後サイズを取得する

## 仕組み

パイプを通す事でサイズを取得しています。
他パッケージ(`compress/~`系)でも使えるはず?

## 圧縮

“`go
func Compression(out io.Writer, in io.Reader) (out_size int64, in_size int64, e1 error, e2 error) {
pr, pw := io.Pipe()
go func() {
w := gzip.NewWriter(pw)
in_size, e1 = io.Copy(w, in)
w.Close()
pw.Close()
}()
out_size, e2 = io.Copy(out, pr)
return
}
“`

## 解凍

“`go
func Decompress(out io.Writer, in io.Reader) (out_size int64, in_size int64, e1 error, e2 error) {
pr, pw := io.Pipe()
go func() {
in_size, e

元記事を表示

tsunagi-functionsでSymbolブロックチェーンのトランザクションを自由自在に作ろう!(Go編)

この記事は、以下に紹介したtsunagi-functionsのGo実装版です。

https://qiita.com/nem_takanobu/items/4b5d67fe9eb80ae35433

トランザクション構築の内部処理やノードへの通知方法については以下の記事もご参考ください。

https://qiita.com/nem_takanobu/items/a8c46d67008e72b713e0

Symbolブロックチェーンをよく知らないという方はこちらで速習することができます。

https://github.com/xembook/quick_learning_symbol

# リポジトリ

##### tsunagi-functions for Go
https://github.com/xembook/tsunagi-sdk/tree/main/go

関数群の提供のため、sdkという名称は今後functionsに変更予定です。

# テスト

テストスクリプトを以下に置いています。実行することができればそのロジックをそのまま実装に利用することができます。

##

元記事を表示

Project Euler 81 80*80のマトリックスの経路上の数字の最小合計値を求める

## 問題
> In the 5 by 5 matrix below, the minimal path sum from the top left to the bottom right, by only moving to the right and down, is indicated in bold red and is equal to 2427.
以下の5*5のマトリックスで、左上の隅から右下の隅に右移動→と下移動↓だけで移動した場合、経路上にある数字の合計の最小値は、赤く示されている数字の合計で2427になる。

“`math
\begin{pmatrix}
\color{red}{131} & 673 & 234 & 103 & 18\\
\color{red}{201} & \color{red}{96} & \color{red}{342} & 965 & 150\\
630 & 803 & \color{red}{746} & \color{red}{422} & 111\\
537 & 699 & 497 & \color{red}{121} & 956\\

元記事を表示

[Golang]APIのバージョン管理

“`go:main.go
package main

import (
“fmt”

“github.com/gin-gonic/gin”
“example/webapp/api/v1”
)

r := gin.Default()

func main() {
r := gin.Default()
v1.GroupRouter(r)

r.Run()

}
“`

“`go:urls.go

package v1

import (
“fmt”
“github.com/gin-gonic/gin”

)

func ApiTemp(router *gin.RouterGroup) {
router.GET(“/ping”, func(c *gin.Context) {
// queryparamerの値を取得する
// fmt.Println(c.Query(“samplequery”))
c.JSON(200, gin.H{
“Message”: “v1 ping healthcheck”,
})
})
}

func

元記事を表示

3分でAWS Lambda Function URLをSAM使ってデプロイする

## これは何

[SAM(Serverless Application Model)](https://aws.amazon.com/jp/serverless/sam/) を使って関数URLを設定したLambdaをデプロイします。
関数URLだけ使いたい(APIGatewayは使いたくない)というケースでテンプレの参考になればと思いました。
内容は比較的薄いです。

経緯

10000000年程前にAWS Lambda Function URLが提供されました。[記事](https://aws.amazon.com/jp/blogs/news/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/)
これはLambdaをHTTPで直接起動できる機能です。

今まではAPI Gatewayを経由しないといけなかったのですがLambda単体でできるようになって便利になりました。こ

元記事を表示

cobraでヘルプをグループ化する機能が追加されたので試してみる

### 目的

cobraでヘルプをグループ化する機能が追加されたので試してみる

### 環境

– spf13/cobra 1.6以上
– go言語 バージョン 1.19

### グループ化してみる

コマンドにグループを追加する。追加順にグループが表示されます。
“`golang
rootCmd.AddGroup(&cobra.Group{ID: “group1”, Title: “group1”})
rootCmd.AddGroup(&cobra.Group{ID: “group2”, Title: “group2”})
“`

グループ化したいサブコマンドにグループIDを付与する
“`golang
var subCmd1 = &cobra.Command{
Use: “sub1”,
Long: “sub1 command”,
GroupID: “group1”,
}
“`

helpやcompletionをグループに含めるには`SetHelpCommandGroupID`と`SetCompletionCommandGroupID`を使う
※r

元記事を表示

GoオンリーでGUI上からQRコード読み取りをしてみた

# はじめに
Goで使えるOpenCV, [GoCV](https://gocv.io)を使ったリアルタイムのQRコードのスキャンをGUIアプリ実現する[therecipe/qt](https://github.com/therecipe/qt)内で実装したので備忘録として残そうと思います.

## 前提条件
– Go, OpenCVがインストール済みであること
– Webカメラが用意されていること
## 環境
– OS: macOS 13 Ventura
– Go 1.19
– OpenCV: 4.6.0
– GoCV: v0.31.0
– therecipe/qt: v0.0.0-20200904063919-c0c124a5770d
– [gozbar](https://github.com/MordFustang21/gozbar): v0.0.0-20191118235142-b46f682b2cab

# インストール
## gozbar
“`zsh
go get -u https://github.com/MordFustang21/gozbar
“`
## GoC

元記事を表示

[Golang]メモ

とりあえずAPIテストに必要なサンプルは揃えた

## GetのAPIを作成

“`go
func SampleGetAPI(router *gin.RouterGroup) {
router.GET(“/ping”, func(c *gin.Context) {
// queryparamerの値を取得する
fmt.Println(c.Query(“samplequery”))
c.JSON(200, gin.H{
“Message”: “pong”,
})
})
}

“`

## requestを送って返ってきた値を取り出す

“`go
func TestRes(t *testing.T) {

resp, _ := http.Get(“http://localhost:8080/ping”)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
//これが中身
var post responseBody
if err := json.Unmarshal(body, &post

元記事を表示

Fiberとは(golang)

# Fiberとは

golangのフレームワークの一種です。
[公式ページ](https://github.com/gofiber/fiber) によると、

> Fiber is an Express inspired web framework built on top of Fasthttp, the fastest HTTP engine for Go.

FiberはFasthttp(Go言語で最速のHTTPエンジン)上に構築された、 ExpressにインスパイアされたWebフレームワークです。
(イメージとしては、golangの速さ+ [Express](https://expressjs.com/) の使い易さを合わせたフレームワークといった感じでしょうか)

## Fiberを実際に使ってみる

実際にコードを見ていきます。

初めにインストールするためには、go getコマンドを実行します。

“`
$ go get -u github.com/gofiber/fiber/v2
“`

main.goに以下のように記述します。

“`main.go
packa

元記事を表示

OTHERカテゴリの最新記事