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

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

カフェでプログラミングしてる風(でも何もやってない)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文字だけ取得する方法**を知りたい。

つまり、ターミナルやコマンドラインなどでのユーザー入力(標準入力)で `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%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0) の課題にあるような「改行区切りで得られた文

元記事を表示

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

元記事を表示

Go module の Dependency 問題を解決する

今日はGoの依存関係で躓いたので、次回躓かないようにいろいろ試してみる。

“`bash
go mod init
“`

の後次の簡単なk8s client のプログラムを書いて実行する。サンプルのまんまなのに、失敗する。

“`go
package main

import (
“flag”
“fmt”
“path/filepath”
“time”

“k8s.io/apimachinery/pkg/api/errors”
metav1 “k8s.io/apimachinery/pkg/apis/meta/v1”
“k8s.io/client-go/kubernetes”
“k8s.io/client-go/tools/clientcmd”
“k8s.io/client-go/util/homedir”
)

func main() {
var kubeconfig *string
if home := homedir.HomeDir(); home != “” {
kubeconfig = flag.String(“kubeconfig”, fil

元記事を表示

Golang ハンドラ関数のチェインで詰まった過去の自分へ

[Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る](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)を読み進める中で、
第3章にある **3.10 ハンドラとハンドラ関数のチェイン** の項で最初理解不明だったけど向き合ったら理解できたのでその過程を書いていきます。

↓(

元記事を表示

[andlabs / ui] Windows GUI examples

GoでWindowsなGUIを作れるものを見つけたので、
exampleを動かして確認してみます。

今回紹介するのは、andlabs/ui です。

https://github.com/andlabs/ui

この記事を書いている時点では、
まだ安定版ではなさそうなので使用される場合はご注意を。

GoでWindowsなGUIを作成したいときは、
すこし安定している walk をオススメします。

https://qiita.com/hiro_nico/items/08af4c01394527836fff

## examples

サンプルとなるコードは、以下のURLにあります。
https://github.com/andlabs/ui/tree/master/examples

* Control Gallery
* テキストボックス・ボタン・ダイアログ・スライダー など
* Draw Text
* 様々なテキストの表示方法
* Histogram
* 折れ線グラフ
* Table
* 表(行内に画像・ボタン・プログレスバーがある)
* Upd

元記事を表示

パナソニックプログラミングコンテスト(AtCoder Beginner Contest 195)のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/abc195

# A

“`Q_A.go
package main

import (
“fmt”
)

func main() {
var M, H int
fmt.Scanf(“%d %d”, &M, &H)

if H % M == 0{
fmt.Printf(“Yes\n”)
} else {
fmt.Printf(“No\n”)
}

}
“`

# B
“`Q_B.go
package main

import (
“fmt”
)

func main() {

var A, B, W int
fmt.Scanf(“%d %d %d”,&A, &B, &W)

W = W * 1000
var min_n int = 10000000
var max_n int = 0
for i:=0; i*A

元記事を表示

Go の exec.Commandを調査する

コマンド実行をたくさんするライブラリを書いているので、`exec.Command` をしっかりと理解したいと思った。
様々な側面でその挙動を見てみたい。

# exec パッケージの概要

まずは公式の [Package exec](https://golang.org/pkg/os/exec/)の概要を訳してみよう。

> Package exec は外部コマンドを実行します。`os.StartProcess` をラップして、簡単に `stdin` と `stdout` リマップしたり、パイプで、 I/O と接続したり、他の調整も実施することが可能です。
> Cや他の言語のシステムライブラリコールと異なり、`os/exec` パッケージは意図的にシステムシェルを実行しません。そして、`glob` のパターンを展開しませんし、他の拡張、パイプライン、リダイレクションといったシェルが実施することを行いません。このパッケージは、Cの`exec`ファミリーのファンクションのように振るいまいます。glob パターンを展開するために、シェルを直接呼んで、危険なインプットをエスケープし、`path

元記事を表示

GoでSSH接続してコマンドを叩く

下記にてWin10でSSHサーバーを立ててみたので、
ならGoからいじってみようということでいろいろ試してみます。

https://qiita.com/hiro_nico/items/48d091a7200f2012650b

## 試した環境

* Windows 10 Pro (64bit) 20H2
* SSHサーバー

別のPCに接続するわけではなく、同じPC内でやり取りする感じです。

## やりたいこと

Go から SSHサーバーに 接続してコマンド叩く!

## どうやるか

まずは golang.org/x/crypto/ssh の godoc を見てみる。

https://pkg.go.dev/golang.org/x/crypto/ssh?utm_source=godoc#Dial

Dial() の Example 使ったらできそう。

1. Dial する
2. Session 作る
3. Run する

“`go:ssh.go
package main

import (
“bytes”
“fmt”
“log”

“golang.org

元記事を表示

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

#ブール型(Boolean型)
ブール型はTrue`「真」`またはFalse`「偽」`のうちどちらか一つを持つ値の形で文字列ではありません。よって`(“”)`ダブルクォーテーションなどの引用符は必要ありません。GO言語でブール型の値を宣言してみます。

“`booleans.go
package main

import “fmt”

func main() {
a := 10
b := 1
var num_bool bool = a > b

fmt.Println(num_bool)
fmt.Println(reflect.TypeOf(num_bool))
}
“`
##実行結果
“`
true
“`
不等号を逆にしてみます。

“`booleans.go
package main

import “fmt”

func main() {
a := 10
b := 1
var num_bool bool = a < b fmt.Println(num_bool) fmt.P

元記事を表示

【Go言語/golang】値とポインタってどう分ける?ゼロ値のまとめ

変数を宣言した時に、`var`で定義するのか`:=`で定義するのか、`new`で作成すればいいのか迷うことがありました。
そこで、備忘録も兼ねて、どのように定義をした時に、出力がどうなるかを簡単にまとめました。

# 値の定義

“`go

package main

import “fmt”

func main() {
var a int
var b string
var c []string
var d map[int]string
var e = make([]string, 1)
var f = make(map[int]string)
var g interface{}
h := map[int]string{}

testprint(“a”, a)
testprint(“b”, b)
testprint(“c”, c)
testprint(“d”, d)
testprint(“e”, e)
testprint(“f”, f)
testprint(“g”, g)
testprint(“h”, h)
}

func testprint(s s

元記事を表示

aws cli v2.0系でSSO Loginしaws-sdk-goでその情報を使おうとするとエラーになる

# 利用したバージョン

“`
# エラーが発生したバージョン
$ aws –version
aws-cli/2.0.48 Python/3.7.2 Darwin/20.3.0 source/x86_64

# 問題なく実行できたバージョン
$ aws –version
aws-cli/2.1.30 Python/3.8.8 Darwin/20.3.0 exe/x86_64 prompt/off

# go.mod
github.com/aws/aws-sdk-go v1.37.28
“`

# aws-sdk-goのエラー内容
“`
failed to fetch configuration: SSOProviderInvalidToken: the SSO session has expired or is invalid
caused by: expected RFC3339 timestamp: parsing time “2021-03-11T19:47:52UTC” as “2006-01-02T15:04:05Z07:00”: cannot parse “UT

元記事を表示

OTHERカテゴリの最新記事