Go関連のことを調べてみた2020年06月23日

Go関連のことを調べてみた2020年06月23日

【Go言語 GitHubActions】linterで特定のファイルを無視する方法

調べてもあまりでてこなかったのでメモ用に残す

“`yaml

on:
pull_request:
paths:
– ‘**.go’

jobs:
lint:
name: runner / lint
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v2
– uses: reviewdog/action-golangci-lint@v1
with:
github_token: ${{ secrets.github_token }}
tool_name: golint
# ここに–skipをつけて指定する
golangci_lint_flags: “–disable-all -E golint –skip pkg/”
level: warning
filter_mode: nofilter
fail_on_error: true

元記事を表示

Hyperledger Fabricで個人情報をクエリする(RDB連携)

# Hyperledger Fabricのchaincodeで個人情報を検索します
Hyperledger Fabric(以下HF。HLFが正式な略称なのだろうか?)の`query`メソッドで個人情報を問い合わせます。前に投稿しましたが、HFの`State DB`に個人情報を持つのはよろしくないので、個人情報はRDB(PostgreSQL)から引き当てることにします。
// 最近はHFでも`chaincode`を`Smart contract`と呼ぶようになっている気がします。

# 環境について
動作環境については次の通りです。前回の投稿と(ry

Ubuntu 18.04.4 LTS
docker-compose 1.26.0
docker 19.03.11
HF 2.1.1
go 1.14.4
PostgreSQL(Dockerイメージ) 12.3(latest)

# 下準備
下準備をします。

### RDBのテーブル定義
新しく個人情報用のテーブルを定義しました。DB`asset`内に`owner`テーブルを定義しました。

“`sql
asset=# \d owner

元記事を表示

【SRE/Go】バルクインサート

## バルクインサートとは?
複数行のデータ1回の`SQL`文でインサートしたい時に使用できます。
下記のようなSQLになります。

“`sql
INSERT INTO user values(‘test1’), (‘test2’), (‘test3’);
“`
[SQLのインサートとバルクインサート – Qiita](https://qiita.com/bunty/items/91283160b0a38956655e)
[バルクインサート (bulk insert)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word15497.html)

## なぜバルクインサートを使うのか
>SQLは一文発行するごとに通信が発生します。その通信にかかる往復の時間は「MySQLがSQL文を解釈して、データベースから該当のデータを探して、何らかの処理をする」という一連の流れを行なう時間よりも遅い場合がほとんどです。
ですからなるべくまとめられる処理はまとめることで、総実行時間を短くするというのが目的なのです。
[My

元記事を表示

Hyperledger FabricのGetHistoryForKeyを利用した資産のトレース

#マイカーの一生をトレースしましょう
Hyperledger Fabric(以下HF)の`GetHistoryForKey`を使って、中古で買ったマイカー「ミラ・キータ」の購入から廃車までをトレースしました。シナリオは次の通り。

1. Mira Qiitaの中古車を購入
2. 調子が悪いのでディーラーへ持ち込み
3. ディーラーから工場送り
4. ディーラーへ戻ってくる
5. 我が家へ戻ってくる
6. また調子が悪くなってディーラーに引き取ってもらうことに
7. とても古くて廃車送りに
8. 廃車のために工場送り
9. さようなら。。

# 環境について
動作環境については次の通りです。前回の投稿と同じですね。

Ubuntu 18.04.4 LTS
docker-compose 1.26.0
docker 19.03.11
HF 2.1.1
go 1.14.4
PostgreSQL(Dockerイメージ) 12.3(latest)

# データ構造を考える
あまり考えることもなく、`GetHistoryForKey`から得られる情報を構造体へ定義しました。

“`go:asset

元記事を表示

社内勉強会でGo言語を学ぶのにやってること

# 概要
社内で勉強会の時間を取り分けることが出来たので、数人で集まって毎週2時間程度を取り分けてGo言語の勉強をする事にしました。PHPプログラマや機械学習チーム、インフラさんの混成チームで、社歴も年齢も様々なので、基本的に皆Go言語の初心者としてスタートしました。(途中から詳しいメンバーが合流)

Goを選んだ理由としては、

* PHP以外の選択肢を増やしておきたい
* PHPでは難しい処理(並行処理等)が行える言語がよい
* 複数人で限られた時間で行うので、学習コストがそこまで高くない
* 業務の合間での息抜きや刺激が欲しい

と大それた志があるわけではありません。

業務ですぐいに活かせそうな、Vue.jsとも迷ったのですが、今回はサーバーサイド言語になりました。

# A Tour of Go
* https://go-tour-jp.appspot.com/welcome/1
* 6時間程度
* 「あーでもないこーでもない」 と言いながらドキュメントも参照しつつ動かしてみる
* 環境作りもこの頃学ぶ

# Codewars
* https://www.code

元記事を表示

longcatのオプションメモ

[mattn/longcat]のオプションまとめ

## インストール

“`bash
$ go get github.com/mattn/longcat
“`

## オプション一覧

`longcat [-n,l int][-i float64][-r,R,H][-o filepath][-d dirpath][-t themename][-themes][-pixterm][-dark][-ascii]`

### `-n int`

– how long cat
– 長さ指定(<-5でエラー) - def: 1 ### `-l int` - number of columns - 横に並ぶ数指定 - def: 1 ### `-i froat64` - rate of intervals - lオプションを使用した際のカラム同士の幅を指定 - def: 1.0 ### `-r` - flip holizontal - 横に反転 - def: false ### `-R` - flip vertical - 縦に反転 - def: false ### `-H`

元記事を表示

go修行9日目 ポインタとか

## ポインタ型

– `&n`でポインタのアドレスを指定
– `*int`で指定したアドレスの中身を取得

“`golang

package main

import “fmt”

func main() {
var n int = 100
fmt.Println(n)
fmt.Println(&n)

// pはポインタ型
var p *int = &n

fmt.Println(p)

fmt.Println(*p)
}
“`

“`
100
0xc000104030
0xc000104030
100
“`

## newとmake

“`golang

package main

import “fmt”

func main(){
// メモリのアドレスを確保している
var p *int = new(int)
fmt.Println(p)

// メモリのアドレスは確保していないのでnil
var p2 *int
fmt.Println(p2)
}
“`

“`
0xc0000120b8

“`

## stru

元記事を表示

Goのプロジェクトでもタスクランナーとしてnpmを使う

[Go](https://golang.org/) のタスクランナーとして [npm](https://www.npmjs.com/) を使ってみたら案外よかった。Go に限った話ではないけど、Go が特に開発ツールチェーン周りの管理がしにくいので噛み合いやすいのではないかと思う。

[npm](https://www.npmjs.com/) は [Node.js](https://nodejs.org/ja/) 用のパッケージマネージャだが、[npm-scripts](https://docs.npmjs.com/misc/scripts) という簡易なタスクランナー機能がついている。また、Node.js 用の便利な開発ツールをそのまま利用できて、開発ツールのインストールも一括で管理できる。

## npm をタスクランナーとして使う利点

– Node.js のインストールだけで利用できる
– 簡易なタスクランナーが利用できる
– **Node.js 用の開発ツールが利用できる**
– husky + lint-staged, Prettier, etc
– 開発ツールのイ

元記事を表示

Go Web開発の大枠

#Web開発の大枠

今日学んだWeb開発の大枠の流れについてまとめてみた。

(参考)
[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)
##HTTP通信の流れ
まずHTTP通信の流れを理解する。

1.クライアントがサ

元記事を表示

Go Module Mirror から壊れたパッケージが落ちてくる

“`
$ go version
go version go1.14.1 darwin/amd64
“`

# 概要

今日、Go 向け Discord クライアントライブラリの `DiscordGo` にアップデートが降ってきました:

[bwmarrin/discordgo](https://github.com/bwmarrin/discordgo/releases/tag/v0.21.0)

さて、早速自身のプロジェクトの依存関係のアップデートを試みます:

“`
$ go get -u github.com/bwmarrin/discordgo
go: downloading github.com/bwmarrin/discordgo v0.21.0
go: downloading golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9
go: downloading github.com/gorilla/websocket v1.4.2
go: downloading golang.org/x/sys v0.0.0-

元記事を表示

GoでHTTPサーバを立ち上げる(超基礎)

#GoでHTTPサーバを立ち上げる

“`server.go
package main

import (
“fmt”
“net/http”
)

func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “HTTPserver”)
}

func main() {
http.HandleFunc(“/”, handler)
http.ListenAndServe(“:8080”, nil)
}
“`
##ハンドラを定義する
“`
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “HTTPserver”)
}
“`
・1つ目の引数:**レスポンス先**
・2つ目の引数:**リクエストの受付**
・{ }内はハンドラで行う処理内容
##ハンドラとエントリポイントを結びつけ
“`
http.HandleFunc(“/”, handler)
“`
・1つ目の引数:エントリポイント
・2つ目の引数:呼

元記事を表示

Golangで自作パッケージに対して入力補完が効かない場合

Golangを試している時にハマったので、事象と対応方法のメモです。

# 環境
OS:mac
エディタ:Visual Studio Code(Goの拡張機能インストール済み)
Golang Version:go1.14.4 darwin/amd64

# 自作パッケージに対して入力補完が効かない?

下記のような自作パッケージを作成して、
別のソースから呼び出そうとしたところ、入力補完が効かない・・・

“`golang/sample/testpackage
package testpackage

import “fmt”

func Test() {
fmt.Println(“test”)
}
“`

image.png

# 解決策
go install {パッケージ名} コマンドを実行すると入力補

元記事を表示

次の水曜日の18:30をtimeパッケージで作る

## はじめに

Goの`timeパッケージ`で「次の水曜日の18:30」を作る方法を備忘録として残します。ここではエラー処理は省略します。
作ったコードは以下の通りです。

“`go
// ロケーション情報を取得
loc, _ := time.LoadLocation(“Asia/Tokyo”)

// 指定ロケーション(Asia/Tokyo)の現在時刻を取得
now := time.Now().In(loc)

// 指定ロケーション(Asia/Tokyo)の18:30を作成
next := time.Date(now.Year(), now.Month(), now.Day(), 18, 30, 0, 0, loc)

// 水曜日まで進める
d := time.Wednesday – next.Weekday()
if d <= 0 { d += 7 } next = next.AddDate(0, 0, int(d)) fmt.Println(next) ``` [playgroundで試してみる](https://play.golang.org/p/zQwKkxVb

元記事を表示

[LINE Bot] LIFFとリッチメニューでも管理画面が作りたい! 2 -リッチメニュー切替-

この記事はこの記事の続きです
[[LINE Bot] LIFFとリッチメニューでも管理画面が作りたい! 1 -グループ管理-]()

# リッチメニューを作る
さて、前回はグループへの招待・退会で管理メンバーの追加・削除をできるようにしました。
その際にリッチメニューをユーザ用と管理者用に切り替えます。
今回はそのリッチメニューを作ります。

今回はユーザー用を 3 x 1 (1200 x 405)
管理者用を 3 x 2 (1200 x 810) のメニューを作ります。
動作確認のため、上の段はユーザと同じものにします

## Line Messaging APIでリッチメニューを作る
Line Account Managerで作成したリッチメニューは残念ながらAPIでは使えません。
画像を準備し、APIで作成する必要があります。
画像はpngかjpgで1MB以内です。

pythonで適当に書いたので、ライブラリをインストールします。

“`bash
pip install line-bot-sdk
pip install pyyaml
pip install boto3

元記事を表示

echo APIがGoのオリジナルエラーをハンドリングしてくれたよ

# 初めに
> Qiita…初カキコ…ども…
> 俺みたいな中3でログ見てる腐れ野郎、他に、いますかっていねーか、はは
> it’a true wolrd.狂ってる?それ、400ね。

と言う訳で,駆け出しエンジニアのすなるQiita記事というものを書いてみたいと思います!
(お手柔らかにお願いします……)

# 動機
エラーのハンドリングを全体でカスタマイズする動機は,大きく分けて以下の2つがあると思われます.
1. Webページで,独自のエラーページに誘導したい
2. APIで,独自エラーをハンドリングしたい

恐らく2.に関してはアドホックにその場で対応すれば十分な場合が多く,あまり恩恵は得られないかもしれません.
どちらかというと,大規模なWebページを作る際に独自のエラーページを使用する事が多く,
また独自エラーハンドリングの書き方で調べて出て来るのが[^1]でしたので,
1の需要が大きい様に思われます.

しかし,**「APIが大規模化した場合」**且つ**「独自エラーをハンドリングしたい場合」**は重要性が高まると期待されます.
他の方の記事でも近いものがありま

元記事を表示

AWS X-Ray+Goを使ってSQSでのメッセージングを観測する

## 概要
タイトルの遠り、AWS X-Rayを使って、SQSでのメッセージングを観測します。X-Rayを使えば、複数のアプリケーション間で「どこからどこにメッセージが送られているか」が図示されるため、アプリ間通信の仕様や障害発生箇所の把握がしやすくなります。今回は、Go言語を使って実装します。

結論(ソース)はページ下部にあります。

## 環境

– Go言語 1.14.3
– aws-sdk-go
– aws-xray-sdk-go
– Mac OS X 10.15.4

前提として、aws-sdk-go, aws-xray-sdk-goは`go get`コマンドでインストール済みとします。

## この記事の対象読者
– AWSの有名どころサービスなら開発したことがある。AWS CLIも設定済み。
– SQSは知識があるがX-Rayはあまり知らない。X-Rayの概要や実装方法を知りたい
– (実装部分については)Go言語はそれなりに読める

## X-Rayの概要
アプリから情報を収集して、以下のような__サービスグラフ__を作成したり、リクエストの実行時間を計

元記事を表示

Go言語 + QtでGUIアプリ開発する時の環境構築

# 概要
Go + QtでGUIアプリ開発する環境を整えてみたのでメモを残しておきます。環境構築してサンプルを動かしただけで、開発はまだ全然進んでません。

# Qtとは?
マルチプラットフォームなアプリケーション開発フレームワークです。GUI開発で有名だそうです。
Wikipediaによると登場したのは1992年となかなか歴史が長く、最新版の5.15が出たのが2020年5月26日(記事執筆日の25日前)と現在も活発に開発が進められている、いい感じのフレームワークです。

本来はC++で開発するようなのですが、他の言語でも使えるように多くのバインディングが提供されています。それでGoにも対応しているというわけです。

# なぜGo?
macOSとWindowsの両方で動作し、なおかつランタイム不要なGUIアプリを作りたいと考えていたのですが、「マルチプラットフォーム」で「ランタイム不要」となるとGoだろうという先入観があり、調べてみたらQtとの組み合わせでいけそうだったので使ってみることにしました。
最近流行っているのはElectronでしょうし、Electronでも要件は満たせるわけ

元記事を表示

Golang – 本番環境に向けたDockerfileの書き方

# Dockerfile

本番環境で動くGoアプリのためのミニマルdockerfileを記す。

“`dockerfile:dockerfile
FROM golang:1.14.4 as builder

WORKDIR /go/src

COPY go.mod go.sum ./
RUN go mod download

COPY ./main.go ./

ARG CGO_ENABLED=0
ARG GOOS=linux
ARG GOARCH=amd64
RUN go build \
-o /go/bin/main \
-ldflags ‘-s -w’

FROM scratch as runner

COPY –from=builder /go/bin/main /app/main

ENTRYPOINT [“/app/main”]
“`

## 補足

“`dockerfile:レイヤー1
FROM golang:1.14.4 as builder
“`
ベースイメージには、golangのバージョン 1.14.4 を使いbuilderと名付けた。
後で[マ

元記事を表示

[Go,Rust,React] AWS APIGatewayでもCORSがしたい

# CORS = ブラウザからAPI叩く時にいつも引っかかるやーつ
WebページとAPIがポート番号も含めて同じであれば何も問題ないですが、
そうでない場合はクロスオリジンドメイン関連の設定しないとブラウザがエラーを表示します。
なお、APIのアクセス自体は飛んでいることもあります。

### 開発環境
– Rust 1.4.3
– Go 1.12
– React 16.13
– Serverless Framework

細かい設定や構成はこっち -> [[AWSLambda x LINEBot] GoとRustでも連携がしたい](https://qiita.com/alivelime/items/274966b10df905920d89)

# 結局、何が必要なのか
### ブラウザ側
CORSオプションをつける必要があります。
意外とこれを忘れていたりしてハマったりします。

“`typescript
fetch(
`${process.env.REACT_APP_API_HOST}/${env}/api/hoge/fuga`,
{
metho

元記事を表示

Goでよく見るコードやイディオムを書いとく

# 複数の変数を定義する場合

“`go
//varで変数定義をまとめる書き方(こっちを使おう!)
var (
n = 1
s = “string”
b = true
)

//暗黙的な定義を並べる書き方
n := 1
s := “string”
b := true

“`

この場合は前者の方が、変数定義のブロックを目立たせる事が出来るため前者の方が良い。(普段は暗黙的な定義を積極的に使って、Goの型推論というメリットを享受した方が良いけど)

# 関数とエラー処理について

“`go
//varで変数定義をまとめる書き方
result, err := doSomething()
if (err != nil) {
//エラー処理
}
“`

Goには例外機構がないため、その処理が成功したかどうかを何らかの形で返してあげる必要がある。
Goの関数が複数の戻り値を返す事ができるというメリットを活用して、errを追加してあげるのが良い。
上記の書き方は死ぬほど頻出するので、Goのイディオムとして覚えておく。

ここでerrという名前にしているのも、一

元記事を表示

OTHERカテゴリの最新記事