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

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

GO(Gorm) + MySQL 入門

# はじめに
次のPJではGOのGORMとMySQLを採用するとの事だったので、自分がmacで行ったハンズオン内容を簡易的にまとめた。

GORMって何?
[公式ドキュメント](https://gorm.io/ja_JP/docs/index.html)
 → Object-Relational Mappingの略。オブジェクトと関係(関係データベース、RDB)とのマッピングを行う。つまり、実際にSQL文を書かなくても、”直感的”にINSERT, SELECT, UPDATE, DELETEなど簡単にできちゃうイメージ。。。

実際に実機で動作確認を行うのが、早いので行った環境構築とCRUDのソースコードを追記していきます。

## 環境構築編

### MySQL
MySQLのインストール方法に関しましては、「brew mysql」で検索頂けると結構参考となる記事があるので割愛させて下さい(要望がありましたら追記致します)。

### Go ライブラリ
必要なライブラリを前もってインポートします。

“`
% go get -u gorm.io/gorm
% go get -u

元記事を表示

M1 MacとIntel Macのバイナリの見分け方とユニバーサルバイナリの作成

Apple M1 CPU と Intel CPU では
CPUアーキテクチャ(命令文やデータ形式)も異なり
バイナリファイル(実行可能なファイル)の中身も別物になる

※M1搭載のMacで従来(Intel CPU搭載Mac)向けのバイナリが実行できるのは
Rosetta 2というアプリケーションでM1向けバイナリに変換したものを実行しているため

また、macOSの実行ファイル形式[Mach-O](https://ja.wikipedia.org/wiki/Mach-O)では複数のアーキテクチャのバイナリを格納することが可能で
複数のアーキテクチャ向けバイナリを格納したバイナリをユニバーサルバイナリと呼んだりする

## バイナリファイルのアーキテクチャを調べる

`file ファイル名` コマンドで調べることができる

“`sh:
# Intel CPU向けバイナリの場合
$ file file ./foo/bar/hoge
./foo/bar/hoge: Mach-O 64-bit executable x86_64

# M1 CPU向けバイナリの場合
$ file ./foo

元記事を表示

【最速?】GoとEC2で「Hello, World!」

## やりたいこと
GoとEC2を使って、ブラウザでHello, World!するだけです。
こちらの記事を大変参考にしました。
https://qiita.com/Dragon-taro/items/09a67b93093770348ce5

ローカルにGoは既にインストールされている前提です。
ちなみに、僕のGoのバージョンは1.16.6でした。

## Goアプリの作成
ファイル構成

“`
.
└── main.go
“`

“`go:main.go
package main

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

func main() {
http.HandleFunc(“/”, func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, “Hello, World!”)
})

log.Fatal(http.ListenAndServe(“:8080”, nil))
}
“`
## EC2の作成
以下、コンソール画面をポチポチしてEC2を作成する。

|

元記事を表示

oapi-codegenでHash Map (additionalProperties) はどうexportされるか

Go言語で Open API 3.0対応の型情報を生成するとき、
[github.com/deepmap/oapi-codegen](https://github.com/deepmap/oapi-codegen)
を使ってます。

あまりユースケースとしてやりませんが、マップを表現したい時があると思います。
Dictionaries/HashMaps の仕様はこれです。
[Dictionaries, HashMaps and Associative Arrays](https://swagger.io/docs/specification/data-models/dictionaries/)

oapi-codegenの公式のReadmeでは、additionalPropertiesに関しては[一応対応している](https://github.com/deepmap/oapi-codegen#additional-properties-in-type-definitions)と書いてますが、
定義が実際にどう構造体として出力されるか見てみました。

### 定義

“`

元記事を表示

SpannerにおけるMutationの数え方

SpannerのMutationの数え方を調べたのでメモ

# Mutation
MutationはDBへの操作(Insert・Update・Delete)の単位として使われる言葉

Transactionを使ってアトミックに複数のMutationをまとめて実行する際には20kMutation問題を意識する必要がある.
20kMutation問題とは,一つのTransactionで扱えるMutationが2万個までという制限のこと.

# Mutationの罠
spannerパッケージにあるspanner.Mutationはコード上でInsertやUpdateなどの処理の単位を表しているが, Spannerの内部ではもっと細かい処理の単位に分解されるらしく, コード上で扱うspanner.Mutationの数を数えても20k制限対象のMutationの数とは一致しない.コードのMutationの数が20000個以下ならOKとかそういうことではない.

“`golang
func write(w io.Writer, db string) error {
ctx :=

元記事を表示

GoのHOTリロード機能(air)付きコンテナの環境構築

Goはコンパイラ言語なので`go build`でコンパイルが必要だが、パッケージを導入することでフロントエンドの yarn run watchみたいなHOTリロードができるらしい。

https://github.com/cosmtrek/air

https://github.com/oxequa/realize

調べてみたところ、realiseは2018年以降メンテされてない様子。。。
最近はメンテナンスが続いてる`air`の方が導入事例が多いようなので、air導入済みのgo環境をを作ってみました。

### 作成する環境
– Go v1.16
– air v.1.27.3

2021年10月末時点ではGo v1.17が出ているのですが、
airのGo対応状況が~1.16のため、合わせて下げています。

### ファイル構成
最終的なファイル構成は以下のとおりです。

“`
src

├── app
│ ├── go.mod
│ ├── .air.toml
│ └── main.go
├── Dockerfile
└── docker-compose.yml

元記事を表示

golangのTimeについて

これ「なんでそんなこと思ったの?」って言われそう。

も大したことはないですが、
「現在時刻を変数に入れたら、数秒たった後って時間って進むの?」
結論から言えば、`now := time.Now()`をした場合、
その時刻が変数nowに格納されて時間経過で変化がないです。

以下、検証コード。

“`golang
package main

import (
“fmt”
“time”
)

func main() {
now := time.Now()
// 変数
fmt.Println(“before :”, now.Format(“2006-01-02T15:04:05Z07:00”))
// Timeオブジェクト
fmt.Println(“beforeNow :”, time.Now().Format(“2006-01-02T15:04:05Z07:00”))
fmt.Println(“2秒待ちます”)
time.Sleep(time.Second * 2)
// 変数
fmt.Println(“after :”, now.Format(“20

元記事を表示

Raspberry Pi でブロックチェーンの実証実験を行う(その2)


【1960年生まれのおじさん日記】
 60歳の定年退職後に再就職した現在の職場で ≪STM32(32bit汎用マイコン)≫でプログラム作成を
 依頼され その後もRaspberry Pi でブロックチェーンを構築してと言われ 分からないことだらけ!
 一応は、若いころから 製造業で働き 制御用ソフト や アプリケーションの作成をしたこともある
 けれども・・・

 この年齢になって Raspberry Pi でブロックチェーンの構築などするとは思わなかったおじさんの
 メモ書き記録。間違いも多々あるかと思いますが、お許しください。


**はじめに**
CQ出版社刊:「ラズパイで作るブロックチェーン暗号化コンピュータ(2020年3月1日 初版) を参考にして
ブロックチェーンの実証実験を行った。
[(その1)は、こちらから](https://qiita.com/ytetsuo/items/8ebfdfbafcbad61e9b73)

今回は、Windows側から / Raspberry Pi側から ブ

元記事を表示

Golang(Gobot+Firmata+Arduino)でアナログメーターを作ってみる

# Golang(Gobot+Firmata+Arduino)でアナログメーターを作ってみる

こんにちは、最近は色々検索していて、ブラウザのタブを開きすぎて、フリーズしがちな毎日です。
今回は PC の状態を視覚的に素早く認識できる CPU,Memory,Disk の使用率を可視化するアナログメーターを前から気になっていた Gobot 等を使って実践してみました。

成果物

https://github.com/Iovesophy/analog-meter-go

# Gobot セットアップ

Gobot とは

https://gobot.io/

> Next generation robotics/IoT framework with support for 35 different platforms

次世代 robotics/IoT フレームワークですね、
35のプラットフォームをサポートしている強力なライブラリです。

1. Golang をインストールする

https://golang.org/doc/

元記事を表示

Go言語でプライベートなGithubリポジトリにあるモジュールを利用し、DockerでBuildを行う方法

## 経緯

– Go 言語で開発したバックエンド API を Docker イメージにビルドしたい
– Go モジュールに社内で共有している非公開リポジトリにあるライブラリ(非公開ライブラリ)を含んでいる
– docker のイメージをビルドするとき、go mod download の箇所でライブラリにアクセスできないためエラーとなる

## 原因

– Docker ビルド時に Gitの認証情報を含んでいないため、非公開ライブラリにアクセスできない
– マイPCにはGitアカウントの認証情報があるため、ローカル環境では問題なく go install が行える

## 対応

– 秘密鍵を生成し、非公開リポジトリに公開鍵を設定する
– バックエンド API に、非公開ライブラリにSSH通信するための秘密鍵とSSHのconfigを配置する
– Dockerfile で 非公開ライブラリにアクセスするための設定を行う

秘密鍵をGitリポジトリにおくことに抵抗がある人は、github の secrets を利用するなりしてください

### 秘密鍵を生成し、非公開リポジトリに公開鍵を設定

元記事を表示

Raspberry Pi でブロックチェーンの実証実験を行う(その1)

【1960年生まれのおじさん日記】
 60歳の定年退職後に再就職した現在の職場で ≪STM32(32bit汎用マイコン)≫でプログラム作成を
 依頼され その後もRaspberry Pi でブロックチェーンを構築してと言われ 分からないことだらけ!
 一応は、若いころから 製造業で働き 制御用ソフト や アプリケーションの作成をしたこともある
 けれども・・・

 この年齢になって Raspberry Pi でブロックチェーンの構築などするとは思わなかったおじさんの
 メモ書き記録。間違いも多々あるかと思いますが、お許しください。


**はじめに**
CQ出版社刊:「ラズパイで作るブロックチェーン暗号化コンピュータ(2020年3月1日 初版) を参考にして
ブロックチェーンの実証実験を行った。
この書籍に記載されている流れが私にとっては、非常に理解し難いため ここに整理をして記載する。
※この記事を見ただけでは、出来ません!!
※是非、「ラズパイで作るブロックチェーン暗号化コンピュータ」を購入した上で参考に

元記事を表示

【Golang】ラズパイ+ go-sdl2 で /usr/bin/ld: -liconv が見つかりませんエラー【静的リンクのビルド時】

# `/usr/bin/ld: cannot find -liconv` on go-sdl2 static build

> デスクトップ環境(X11)なしの RaspberryPi OS Lite 入りラズパイでスクリーン描画したい。
> [SDL](https://ja.wikipedia.org/wiki/SDL) という X11 の代替となるマルチメディア用のライブラリにスクリーンの描画機能があるらしい。ところが Go 言語(以下 Golang)で SDL を利用するために [go-sdl2](https://github.com/veandco/go-sdl2) を使うも、静的リンクでビルドすると「lib-iconv が見つかりません」とエラーが出るのです。
> でも `static` タグなし(`go build .`)だと、ビルドできるし、ターミナルに描画はできるのです。どうしよう。

“`shell-session:静的リンクでビルドするとエラーが出る
$ go build -v -tags static -ldflags “-s -w” .
github.com/

元記事を表示

go buildはできるのに、VSCodeでgolangのimportがエラーと表示される

めちゃくちゃ詰まったのでメモ。

## 事象

`go build`, `go run hoge.go`は正常に動くのに、VSCode上でimportが解決できないとエラーが表示される。

## 原因
VSCodeで複数のgoのリポジトリを開いているのが原因っぽいです。

“`
VSCodeで開いているフォルダ
└ リポジトリその1
└ リポジトリその2
“`

と開くと、`gopls`がうまく動かないみたいです。
(疲弊しきって深掘りする気力がなかった・・・)

新しいウィンドウでひとつのリポジトリを開いたら解決しました。

複数のgoのリポジトリをひとつのウィンドウで開きたい場合は、
リポジトリその1をはじめに開いたあと、`Files > Add Folder to Workspace…`にて対応するとよさそうです。

こんな使い方してたの自分だけなのかな・・・

元記事を表示

http.ListenAndServeTLSでサーバが起動できずハマったが、エラー出力を自分で書いたらすぐに解決した

# 概要

Go初学者(私)が『[Go プログラミング実践入門](https://www.amazon.co.jp/Go%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E6%A8%99%E6%BA%96%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A7%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B-impress-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-Sheong-Chang-ebook/dp/B06XKPNVWV/ref=sr_1_6?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=go&qid=16355897

元記事を表示

FreeBSDで AWS Session Manager Plugin を導入してみる

# FreeBSDでAWSセッションマネージャープラグインを導入してみる

## はじめに

[AWS Systems Manager Session Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html)とは、

– 「AWSシステムマネージャー」サービスの一つであるところの、「セッションマネージャー」という機能である。
– これはAWS管理コンソールやAWSCLi等によりEC2等のインスタンスにアクセスまたはログインするための機能である。
– この機能を使用してインスタンスへアクセスすると、(グローバルIPでの)受信ポートの維持や、踏み台サーバーの用意、SSH鍵の管理が不要になる。
– バックエンドで稼動するインスタンスが多く、グローバルに公開して無い場合や、孤立した、いわゆるプライベートネットワーク内に設置されたサーバーにアクセスする場合に嬉しい、あるいは必要となる機能である。
– この機能の利用にあたり、対となる [Session Mana

元記事を表示

Go言語 stringsパッケージ

#文字列チェック

#####■文字列に「,」が含まれているかをチェック

“`go:
if strings.Contains(“red,blue”, “,”) {
fmt.Println(“複数”)
} else {
fmt.Println(“単数”)
}

// 複数
“`

#文字列変換

#####■「,」区切りの文字列を配列(スライス)に変換

“`go:
colorArr := strings.Split(“red,blue”, “,”)
for _, v := range colorArr {
fmt.Print(v + “\n”)
// red
// blue
}
“`

元記事を表示

go でGithub Copilot を軽く触ってみた

# なんの記事?

golang でGithub copilot の基本機能を使ってみたログと所感

# Github Copilot とは

“`
関数名とコメントから、関数のコードを丸ごと自動補完するAIプログラミング機能
“`

https://copilot.github.com/

https://www.itmedia.co.jp/news/articles/2106/30/news063.html

# 基本操作

– `Tab`で補完
– `Option+]` (or `Option+[`) で次/前の候補 (Mac OS)
– `Esc` で補完を消す
– `ctrl + enter` で他の候補の一覧

# 実際にgo で触ってみる

環境:VSCode, Mac

vscode でインストール後やることはシンプルでコードを入力してタブで補完するだけ。
提案方法には
– 関数名から補完する方法
– コメントから補完する方法

があるようで、どちらも試してみた。

## 関数名で補完

func main() なんて書いてみると適当な加算のサンプルコードが提案さ

元記事を表示

【Golang】相関係数の算出

## 概要
Goで相関係数を求める

## 数理パッケージ
gonumはちょっと用途に合わなかったので、[montanaflynn/stats](https://github.com/montanaflynn/stats)のCorrelation関数を使う

## 使い方

“`go
package main

import “github.com/montanaflynn/stats”

func main() {
cor, _ := stats.Correlation([]float64{1, 2, 3, 4, 5}, []float64{1, 2, 3, 5, 6})
fmt.Println(cor)
// Output: 0.9912407071619302
}
“`

元記事を表示

【要約版】net/httpでつくるHTTPルーター自作入門

先日、[net/httpでつくるHTTPルーター 自作入門](https://zenn.dev/bmf_san/books/3f41c5cd34ec3f)という薄い本を書いたのですが、もっと手短に内容を伝えたいと思ったので、本の要約を書いてみました。

コードだけ見たいという場合は以下を参照してください。
[bmf-san/introduction-to-golang-http-router-made-with-net-http/blob/main/trie.go](https://github.com/bmf-san/introduction-to-golang-http-router-made-with-net-http/blob/main/trie.go)

合わせて筆者が自作したHTTPルーターも見てもらえると嬉しいです。
[bmf-san/goblin](https://github.com/bmf-san/goblin)

# 何の話?
Goで標準パッケージだけを使ってHTTPルーターを自作するための考え方とやり方の話です。

以下のようなHTTPルーターを自作します。
[

元記事を表示

【1】GolangでWebアプリケーションを作成する【MySQL/CRUD】

# はじめに
この記事は[GolangでWebアプリケーションを作成する](https://qiita.com/blackmax1886/items/7ca44fd1519dbac59dd2 “概要と設計”)の続きです。
今回はtaskのCRUDを作成します。

CRUDは主に[こちらのチュートリアル](https://www.golangprograms.com/example-of-golang-crud-using-mysql-from-scratch.html)を参考にしています。

# 環境
– go1.16.5 windows/amd64
– Goland
– MySQL Ver 8.0.26 for Win64 on x86_64

# 実装
## MySQL DBの準備
localにteamtaskというdatabaseと、その中にtaskテーブルを作成する。
とりあえずフィールドはnameとcontentのみ

“`sql
create database teamtask;
use teamtask;
create table task (id int, n

元記事を表示

OTHERカテゴリの最新記事