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

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

M5StickC Plus (ESP32) とTinyGoでLチカ

# はじめに
最近、仕事でGO使ってて、趣味ではESP32を使ってるので、TinyGoでESP32をプログラミングしたくなってきた。ということで、Lチカすることにした。

# 環境
macOS Big Sur Ver 11.1

# インストール
## TinyGo
tinygoは、ここを参考にして、インストールした。
[macOS :: TinyGo – Go on Microcontrollers and WASM](https://tinygo.org/getting-started/macos/)

いろいろ書かれてるけど、これだけで動くはず。

“`zsh
brew tap tinygo-org/tools
brew install tinygo
“`

## ESP32のためのツール群
これにしたがって下記ツールを入れた。

[ESP32 – mini32 :: TinyGo – Go on Microcontrollers and WASM](https://tinygo.org/microcontrollers/esp32-mini32/)

– pyserial

元記事を表示

Goでnslookupする

“`golang
package main

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

func main() {
addr, err := net.LookupHost(“vamdemicsystem.black”)
if err != nil {
log.Fatal(err)
return
}
fmt.Println(addr)
}
“`

“`
⋊> /t/golang go run main.go 23:06:26
[183.181.88.32]
“`

元記事を表示

deferに入門してみた

# deferに入門してみた

ちょっと退屈してたたので、deferについて調べてまとめてみます。

この記事を書き始めている今時点のdeferに対する認識は、

– 処理を実行を遅らせてくれる便利なやつ
– どこで実行しても最後に処理してくれるから、忘れてた!!ってことを防止できるやつ

こんなイメージを持ってます。

## では早速ごちゃごちゃ動かしてみます。

“`go
package main

import (
“fmt”
)

func main() {
defer fmt.Println(“defer Hello, playground”)
fmt.Println(“Hello, playground”)
}
“`

実行結果

“`
Hello, playground
defer Hello, playground
“`

イメージした通り、処理が遅れましたね。

では、deferが2つあったときは??

“`go
package main

import (
“fmt”
)

func main() {
defer fmt.Println(“def

元記事を表示

Golangで依存パッケージの脆弱性を調査するならNancyがおすすめ

# 概要
* Goで使用する外部パッケージが安全かどうかを調べる時にオススメなのが、[nancy](https://gonancy.dev/)です。
* ちなみにnancyとは、Sonatype OSS Indexを利用して、Golangの依存関係の脆弱性をチェックするツールです。
* nancyではdepまたはgo modの依存関係を調査してくれます。

![nancy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/79fec195-ab17-3383-03db-e5319d156c58.png)

# 導入方法
* install方法

“`

> brew tap sonatype-nexus-community/tap
> brew install nancy
“`

# 試す

* helpを見てみる
* 見てみると、引数にGopkg.lockまたは、go.sumのpathを指定してあげるようです。

“`
❯ nancy –help
Usage:
nancy [opti

元記事を表示

Golangでインストールしたパッケージ(依存パッケージも含む)のversion確認方法

# 概要
Go言語で依存パッケージも含めてパッケージのversionを確認したいときに利用するコマンドです。
ただ、注意点としては、パッケージの開発が別のリポジトリに移動すると最新のversionを追えません。

“`
go list -m -u all
“`

# 試してみた
試しに、goのsample projectで上記のコマンドを試してみたいと思います。
cloneしたsample => https://github.com/golang/example

“`
❯ go list -m -u all
go: finding github.com/yuin/goldmark v1.2.1
go: finding golang.org/x/net v0.0.0-20201021035429-f5854403a974
go: finding golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9
go: finding golang.org/x/tools v0.0.0-20210112183307-1e6ecd4bf1b0

元記事を表示

日報Go

# きっかけ
「リモートワークで勤怠入力が必須になってしまった…」
「いちいちブラウザ開いて入力したくない….」
ということでGolangの勉強がてらに作りました:fist:

上司に許可とって、きちんとやっている内容出していればOKとのことだったので自動化してみた感じです。:tea:
簡単な内容ですが、同僚には受けがよかったです…w

間違いなどありましたらご指摘していただけると幸いです。

# ソース
https://github.com/sgash708/go_chatwork_notice

# 前提
* Golang ver1.15
* goquery
* Agouti
* ChromeDriver ver88.0.4324.96
* zsh
* macOS ver10.15.7

https://chromedriver.chromium.org/downloads

# 注意
スクレイピングは脅威にもなります。
サイトごとに行ってよいか注意しながら行いましょう。
待ち処理などを適宜入れてください。

# 前準備
goファイルが走るように設定しま

元記事を表示

プログラミング超入門(6)〜GO言語〜

#for文(繰り返し制御)
配列から要素を一つずつ取り出せるようになります。GO言語の繰り返し処理には、**while文**(データの個数がわからない時に使用する条件式)が無くシンプルにfor文というデータの個数分までループ構造を繰り返す処理のみになります。`for スタート値; 継続条件; 増減式 { }`スタート値は第一引数にあたり、繰り返し処理をスタートさせる値になります。変数名に**i**(indexやintegerの頭文字)が使われるのが一般的です。0からスタートとなる**カウンタ変数**(アクションの実行回数)を省略形**(:=)**で代入し定義します。継続条件の部分は繰り返しをやめるまでの条件としてブール値を返す式を記述します。通常はiの値に関する式となり、式の値がfalseとなったら繰り返しをやめ、{ }の中から抜けることになります。例として`i <= 4;` `i < len(aprices)`を記述します。増減式は1回の繰り返し処理で1ずつ増やすインクリメント演算子「++」を使用します**「i++」**は、「i += 1」の略です。{ }波括弧の中には繰り返したい処

元記事を表示

WindowsベースのDockerコンテナを動かす

#Windowsのコンテナを作ろう
Dockerといえば、普通はLinuxのコンテナですが、Windowsのコンテナを使いたいときもあると思います。
そんなボーイズ&ガールズにWindowsのコンテナを作るDockerfileをお贈りしよう。

#GO言語の実行環境を構築
試しにGO言語の実行環境を構築してみます。
環境が変わればプレイングも変わるのが常ですが、
GOはオールラウンダーなので、さほど変わりませんから楽ですね。

“`
FROM mcr.microsoft.com/windows:1909

ENV GOLANG_VERSION 1.14.10
ENV GOLANG_DOWNLOAD_URL “https://golang.org/dl/go$GOLANG_VERSION.windows-amd64.zip”

RUN powershell -Command \
$ErrorActionPreference = ‘Stop’; \
(New-Object System.Net.WebClient).DownloadFile(‘%GOLANG_DOWNLO

元記事を表示

Goでテスト用Dockerコンテナ(MySQL, Redis)などを動かす

# はじめに
Goで書いたアプリケーションのテスト時に、データベースへの接続や、キャッシュへの接続などが必要になることが多いかと思います。その際に手軽にテスト用データベースやキャッシュなどをを立ち上げられる[testcontainer-go](https://github.com/testcontainers/testcontainers-go)というツールを利用してみて、非常に簡単に利用することができました。どなたかのお役に立てたら幸いです。

動作するコードは以下のリポジトリに置いてあります。(02_DB_baseのブランチに実装してあります)
[yasuflatland-lf/go-test-sample](https://github.com/yasuflatland-lf/go-test-sample/tree/02_DB_base)

# 動作環境
– Mac 11.2.3 (BigSur)
– Go 1.15.8
– Docker Desktop for Mac (3.2.1)
– Git 2.23.0

# 実行方法
1. [https://github.com/yas

元記事を表示

カフェでプログラミングしてる風(でも何もやってない)Goコード(プログレスバーバージョン)

# おしゃれなカフェで…

私はエンジニア。
コーヒー片手にWindowsのノートPCでプログラミングしています。

っていうのは置いといて・・・
[カフェでプログラミングしてる風(でも何もやってない)Java(クソ)コード](https://qiita.com/3S_Laboo/items/660883a0184dabaea65b)を見た後に、職場であがった話題を絡めたネタ記事です。

# 唐突ですがCRについて

最近、職場でCRについてのこんな話題があがりました。

> 恥ずかしながら、キャリッジリターンの意味を初めて理解した、ただの改行コードと思ってた。
> これ、カーソルを先頭に戻すコードだったんですね

例えばこんな感じ。

“`
opt = ‘aaa’
opt += ‘bbb\r’
print opt # aaabbb

opt += ‘ccc’
print opt # cccaaa
“`

`\r (キャリッジリターン)` はカーソルを先頭に戻す動きなので、元々の`aaabbb`に対して`ccc`が上書きされます。
カーソルは`ccc`の位置なので、

元記事を表示

【Golang】標準入力から1文字のキー入力を読み込む(enter いらずの On KeyPress/KeyDown っぽいやつ)

# Go言語で標準入力のキー押下(`KeyPress`)を検知する

> Golang で**標準入力から1行ごとではなく、1文字だけ取得する方法**を知りたい。

正確には [TTY](https://ja.wikipedia.org/wiki/Tty) からの標準入力を 1 文字欲しいのです。つまり、ターミナルやコマンドラインなどでのユーザー入力(標準入力)で `y` -> `enter` でなく、`y` キーを押しただけで `y` を検知したいのです。

[「golang 標準入力 1文字 読み込む」で Qiita 記事に絞ってググって](https://www.google.com/search?q=site:qiita.com+golang+%E6%A8%99%E6%BA%96%E5%85%A5%E5%8A%9B+1%E6%96%87%E5%AD%97+%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80)も、[競プロ](https://ja.wikipedia.org/wiki/%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E

元記事を表示

Macローカル上にDocker Composeでアプリを立ち上げてみた

#Dockerアプリケーションのアーキテクチャー
![スクリーンショット 2021-03-15 10.32.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1075243/580193e7-2961-57ea-6239-dce0b7315012.png)

##ざっくりとやること・できることの説明
– docker-composeでNginxとGo言語のAPI, DBとしてMySQLのコンテナを3つ立ち上げる
– Nginxのindex.htmlからGo言語で書いたREST API(go-ginのフレームワーク使用)を経由して、DBに問い合わせ
– DBにCRUD(gormのフレームワーク使用)ができることを確認
– ※DockerとDocker Composeはインストールされているものとする。

##バージョン確認
確認してみたら、以下のバージョンでした。

“`
Docker version 20.10.2
docker-compose version 1.27.4
golang:1.14

元記事を表示

Go1.16新機能embedを使ってメッセージが定義されたファイルを読み込む

# はじめに
## Go1.16リリース
Go1.16が2021年2月にリリースされましたね!

– [Go 1.16 Release Notes](https://golang.org/doc/go1.16)
– [Go 1.16連載が始まります | フューチャー技術ブログ](https://future-architect.github.io/articles/20210207/)

様々なアップデートがありましたが、主要でわかりやすい変更点は以下の通りでしょうか。

– M1 Macに対応
– 処理速度やメモリ使用量の改善
– `go:embed`の追加

> Go 1.16 adds support of 64-bit ARM architecture on macOS (also known as Apple Silicon) with GOOS=darwin, GOARCH=arm64.

> For a representative set of large Go programs, linking is 20-25% faster than 1.15 and requi

元記事を表示

JWT を Go で処理するためのパッケージ

Go 言語で JWT (JSON Web Tokens) を処理したい。
以前に書いたコードを見直す機会があって調べたら状況が変化していたので記録に残しておきます。

特に記載がない限り 2021 年 3 月 14 日時点の情報になります。

## 調査対象

– https://github.com/dgrijalva/jwt-go
– https://github.com/square/go-jose
– https://github.com/lestrrat-go/jwx

このうち実際に使ったことがあるのは dgrijalva/jwt-go と square/go-jose です。

## dgrijalva/jwt-go

https://github.com/dgrijalva/jwt-go

最終リリース: [v3.2.0](https://github.com/dgrijalva/jwt-go/releases/tag/v3.2.0) (2018 年 3 月 9 日)

dgrijalva/jwt-go (fork を含む) を使用しているリポジトリの例

– http

元記事を表示

17rep – GolangでMySQLのトランザクションラッパー作成

# 使うシーン
– 一括で複数のInsert Updateで全部成功させないといけないシーン
– リレーションを貼っているテーブルに対してデータの更新や追加などを一括して追加変更しないといけないテーブルが存在するシーン

# Go言語でトランザクション制御
– トランザクション制御のラッパー関数の作成
– トランザクションラッパー関数を開始し、エラーだったらrollbackを実行エラーじゃなければcommit

# Begin()、Commit()、Rollback()が同じ関数内に定義(これは冗長)
– SqlHandlerポインタレシーバからDB接続を定義し同じ関数内で実行

“` go
func (h *SqlHandler) WithTransaction() (err error) {
tx, err := h.db.Begin()
if err != nil {
return
}
defer func() {
if err != nil {
tx.Rollback()

元記事を表示

【Go言語/golang】ブロックチェーンの実装

※備忘録として記載しますので、ご容赦ください。

“`go
package main

import (
“bytes”
“crypto/sha256”
“fmt”
“strconv”
“time”
)

type Block struct {
Timestamp int64
Data []byte
PrevBlockHash []byte
Hash []byte
}

func (b *Block) SetHash() {
timestamp := []byte(strconv.FormatInt(b.Timestamp, 10))
headers := bytes.Join([][]byte{b.PrevBlockHash, b.Data, timestamp}, []byte{})
hash := sha256.Sum256(headers)

b.Hash = hash[:]
}

func NewBlock(data string, prevBlockHash []byte) *Block {
bloc

元記事を表示

【Go/golang】sync.Mutex / sync.WaitGroupで排他制御をする

※本記事は備忘録として記述しておりますので、ご容赦ください。

# sync.Mutex
次のコードは、IDを作成するコードが同時に1つしか実行されないようにしています。
※goroutineにmutex構造体を渡すときは、**必ずポインタでわたすこと。**
値のまま渡してしまうと、ロックしている状態のまま別のsync.Mutexインスタンスを渡すことになってしまうので、注意が必要です。

“`go
package main

import (
“fmt”
“sync”
“time”
)

var id int

func generateID(mutex *sync.Mutex) int {
// Lock() / Unlock()をペアで呼び出してロックする
mutex.Lock()
defer mutex.Unlock()

id++
result := id

return result
}

func main(){
// sync.Mutex構造体の変数宣言
// 次の宣言をしてもポインタ型になるだけで正常に動作する
// mutex := new

元記事を表示

goroutineで値(変数)を共有する

# go routineのスレッド間でデータを共有する
※本記事は備忘録として記載したものでありますため、ご容赦ください。

goroutineで動作している関数でデータを共有するには、
1. 引数として渡す方法
2. クロージャのローカル変数にキャプチャして渡す方法
があります。

“`go
package main

import (
“fmt”
“time”
)

func sub1(c int) {
fmt.Println(“share by arguments : “, c*c)
}

func main() {
// 引数で渡す方法
go sub1(10)

// クロージャのキャプチャで渡す方法
c := 20
go func() {
fmt.Println(“share by capture : “, c*c)
}()

time.Sleep(time.Second)
}
“`
“`
# 結果
share by arguments : 100
share by capture : 400
“`

クロージャのキャプチャ渡しの場合も、内

元記事を表示

DynamoDBでインクリメンタルなIDを管理する場合の実装

# 概要

状況としては以下の様な場合を想定

– 各グループ毎にインクリメンタルなIDを管理する
– グループの設定を管理するテーブルに最新のIDを保存

## 結論

1. 更新式でADDを使ってインクリメントしてIDを生成する
※ただしIDの間が抜ける可能性がある

2. IDの抜けが許容できない場合はトランザクションでUpdateとPutする
※Lockをを考慮する必要がある

### 1. インクリメントするやり方

サンプルはGoと[guregu/dynamo](https://github.com/guregu/dynamo)を使用したコードとなります

“`go
var domainConfig DomainConfig
err := configTable.Update(hashkey, target).
Add(“CurrentID”, 1).
Value(&domainConfig)
if err != nil {
// error処理
}

data.ID = domainConfig.CurrentID
err = dataTable

元記事を表示

Goで実装したHyperledger FabricのChaincodeを単体テストしたい

# はじめに
Hyperledger FabricのChaincodeをネットワークにデプロイする前に、機能チェックしておきたい。

ということで、Go初学者がFabricのChaincodeを題材にして、Goで単体テストする方法を書き残しました。

# 環境
* Hyperledger Fabric v2.2.0
* サンプルソース、バイナリツール、Dockerイメージのインストール方法は[こちら](https://hyperledger-fabric.readthedocs.io/en/release-2.2/install.html)
* Go 1.15.8
* Visual Studio Codeのおすすめ拡張機能
* [Go for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=golang.Go)

### 注意
本記事では、Chaincode開発用のGoパッケージとして[shim](https://pkg.go.dev/github.com/hyperledg

元記事を表示

OTHERカテゴリの最新記事