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

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

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

# インストール
## GoCV
“`zsh
go get -u -d gocv.io/x/gocv
“`
さらに, pkgconfigにOpenCVのパスを通す必要があるので

元記事を表示

[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

元記事を表示

postgresqlに接続するとSSLが有効になってないため弾かれる場合の対処方法

# はじめに

`golang-migrate` で`postgresql`に接続して`migrate`を試みたところ、以下のエラーが発生した。

調べたところ、`postgres`コンテナーがデフォルトで `SSL` を有効にしないために起こるとのことだったので対処方法をまとめる。

“`bash
migrate -path db/migration -database “postgresql://username:password@localhost:5432/dbname” -verbose up
2022/10/30 17:19:16 error: pq: SSL is not enabled on the server
“`

https://www.postgresql.jp/docs/9.2/libpq-ssl.html

https://github.com/golang-migrate/migrate/tree/master/cmd/migrate

# 対処方法

`?sslmode=disable`をデータベースURLに追加することで接続が可能になります

`

元記事を表示

簡単!CORSの設定

# バックエンドにリクエストを送れないのはCORS設定できてないからかもしれない

例えばReact + Goで開発をしているとします。React`localhost:8000`でGoは`localhost:8080`で動いているとします。

ReactからGoへリクエストを投げてみます。すると次のエラーが出ます。

![Screen Shot 2022-10-30 at 14.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/949101/ccbf9810-613e-af38-f4ea-1fc6c2ce0eaa.png)

# オリジンが異なるときはCORSの設定が必要

エラーの原因はReactとGoでオリジンが違うことです。今回の場合で言うと

React:http://localhost:8000
Go:http://localhost:8080

がオリジンです。

違うオリジンにリクエストを送るにはCORS(Cross-Origin Resource Sharing)の設定が必要で

元記事を表示

「Go言語でつくるインタプリタ」の実行環境構築 M1 Mac

# package monkey/repl is not in GOROOT
「Go言語でつくるインタプリタ」のサイトからソースコードをダウンロードし、Goのコンパイラをインストールし、コンパイルしようとしたら

“`terminal:terminal src/monkey/
$ go run main.go
main.go:5:2: package monkey/repl is not in GOROOT (/opt/homebrew/Cellar/go/1.19.2/libexec/src/monkey/repl)
“`
とエラーが返ってきてつまずいたので解決法を記事にしました。
# 環境
* macOS Monterey
* Apple Silicon(M1)
* Homebrew 3.6.7

# 目標
「Go言語でつくるインタプリタ」のソースコードのコンパイル、実行ができるようにする。具体的には
“`terminal:src/monkey/
$ go run main.go
Hello {username}! This is the Monkey programming

元記事を表示

migrate用のコンテナを作成

## 環境
・Go
・MYSQL8.0
・Docker
## SQLファイルをDBに入れる

SQLファイルを一度読み取り、“;“区切ってfor文で順番に入れた。
“`go:main.go
package main

import (
“database/sql”
“io/ioutil”
“log”
“strings”

_ “github.com/go-sql-driver/mysql”
)

const (
path = “root:password@tcp(mysql:3306)/kartenspielen”)
var (
count = 0
)

func main() {
db, err := sql.Open(“mysql”, path);if err != nil {
log.Println(err)
return
}
c, ioErr := ioutil.ReadFile(“./init.sql”)
if ioErr != nil {
log.Println(ioErr)
}
requests := strings.Spl

元記事を表示

[Go]gRPCの概要をつかむ

来月からgRPCでのAPI開発をすることになっているので、事前に学習した成果をまとめた。
この記事は以下の構成になっている(あとから見返して思い出しやすいように)。

– gRPCのイメージを座学的にざっくり → 詳細につかむ
– gRPC APIのサンプルを実際に動かしてみることで、イメージより強固にする

# 1. ざっくり理解
## 1.1. gRPC
REST APIの対抗馬となる**APIのフレームワーク的なもの**。
対比させると下記のような形。

項目|REST API|gRPC
—|—|—
HTTPプロトコル|HTTP/1.1|HTTP/2
メッセージのフォーマット|JSON や XML(テキスト)|Protocol Buffers(バイナリ)
コードの自動生成|サードパーティ製ツール(Swaggerなど)|Protocol Buffers(※protoc + gRPC拡張プラグイン)
リクエスト実行| <エンドポイントURL> (例. GET /user/1)|gRPCスタブ(内部的にはProtocol Buffers形式へのシリアライ

元記事を表示

【シンプルかつ即戦力!】Go言語 / sqlcの使い方!

今回はGo言語におけるORMツールの一つである __sqlc__ を紹介します!

以前までGo言語のORMといえば、私の中では __GORM__ 一択という印象だったのですが、
たまたま触る機会があり、sqlcを使ってみるとGORMとはまた違ったメリットや使いやすいと感じた点もあったので、今回の記事でまとめていきたいと思います。

# sqlcの概要

前述の通り、Go言語で使えるORM(ORマッパー)の一つがsqlcです。

GORMはRubyのActive Recordに近い感覚で使えるのに対して、sqlcはSQLで書かれたクエリを自分で用意したうえで、それを元にGo言語のクエリ用のコードを自動生成してくれます。

実行するSQLを事前に書かないといけないという手間は発生しますが、ORマッパーならではの「裏でどんなクエリが飛んでるか分からない」といったことが発生しないために、パフォーマンスの調整がしやすいのが嬉しいところですね。

一方で、現時点でGORMに比べて劣っている点として下記の2点が挙げられます。

1. DBのマイグレーションはスコープ外のため、golang-migr

元記事を表示

GolangでLastInsertId is not supported by this driver が発生する話

## LastInsertId is not supported by this driver が発生
GoでDB操作のAPIを作成しているときに出会ったエラー

“`Go
func (ur userRepository) CreateUser(ctx context.Context, user *entity.User) (*entity.User, error) {
statement := “INSERT INTO users (name,mail) VALUES($1,$2)”
stmt, err := ur.db.Prepare(statement)
if err != nil {
log.Println(err)
return nil, db_error.StatementError
}
defer stmt.Close()

res, err := stmt.ExecContext(ctx, user.Name, user.Mail)

if err != nil {
log.Println(err)
return nil, db_erro

元記事を表示

GoでGeocoding APIを使う方法

## Geocoding API のレスポンス

“`json:geocoding.json
{
“results”: [
{
“address_components”: [
{
“long_name”: “1600”,
“short_name”: “1600”,
“types”: [
“street_number”
]
},
{
“long_name”: “Amphitheatre Parkway”,
“short_name”: “Amphitheatre Pkwy”,
“types”: [

元記事を表示

OTHERカテゴリの最新記事