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

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

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に変更予定です。

# テスト

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

##

元記事を表示

Go Fyneでandoroidアプリを作ってみた

## はじめに
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

元記事を表示

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]Requests

とりあえず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

元記事を表示

【Go+React】株のipoを管理するWebアプリをSPAで作ってみた【個人開発】

# 目次
| 項番 | ページ内リンク |
|:—-:|:————-|
| 1 | [1. このプロジェクトの概要](#1-このプロジェクトの概要) |
| 2 | [2. どのような機能を](#2-どのような機能を) |
| 3 | [3. どのような技術を用いて](#3-どのような技術を用いて) |
| 4 | [4. どのような工夫をして](#4-どのような工夫をして) |
| 5 | [5. どのような成果に繋がったのか](#5-どのような成果に繋がったのか) |
| 6 | [6. 今後やりたい事](#6-今後やりたい事) |

# システム
**【プロジェクト名】**
manamana ipo管理ツール
![logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455017/521daa34-9d63-082a-c71d-b53d8bc4df53.png)

# 1. このプロジェクトの概要
ipo(新規公開株式)の自動申し込み、
および現資産の確認・管理を行うシステム

元記事を表示

個人開発でgo-elasticsearchを用いたので、使い方を整理する

最近個人開発でElasticsearchを利用しまして、それに伴いgolangからアクセスする公式のgoクライアントを使用しました。
その際に感じたのがsearchやinsertあたりしか掲載されていないネット記事が多く感じたので、今回それ以外のとこも含めてまとめてみようと思います。

# 注意点
* この記事のコードはのelasticsearch 8系を想定しています。8系以下のバージョンは別途別の記事を参考にしてください。(個人開発で使用したのは8.3.3)

* 個人開発で用いた際に確認した環境はDockerとwindows11(ローカル上)です。

# how to
# client作成
client作成は[GitHub](https://github.com/elastic/go-elasticsearch)のusageや[qiitaの記事](https://qiita.com/shiei_kawa/items/d992f7fdd4c75906ea0b)に乗っていますので割愛します。

* 一応上記の記事に乗っていない細かいこととして
もしdocker-composeでgoと

元記事を表示

プログラミング言語Go アウトプット(6章)

# はじめに
これまでの章のアウトプットやプログラミング言語Goのアウトプットをしようと思ったきっかけなどは[こちら](https://qiita.com/AtomuIshida/items/6e05c02a2bd82f1e133d)でまとめているのでぜひ読んで欲しいです。

# 6章 メソッド
## 重要・学びになったと思うところ
### メソッドの宣言
平面幾何学のための簡単なパッケージを実装する
“`golang
pacakge geometry

import “math”

type Point struct{X,Y float64} // float64型のXとYを持つ構造体Pointを定義

func Distance(p,q Point) float64 { // Point型のpとqを受け取り、float64型の値を返すDistance関数を定義
return math.Hypot(q.X-p.X, q.Y-p.Y) // math.Hypotは受け取った二つの引数の二乗の合計値の平方根を返す関数
}

func (p Point) Distance(q Poin

元記事を表示

OTHERカテゴリの最新記事