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

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

【Go】bcrypt を使ってパスワードのハッシュ値を生成して検証する

# サンプルコード

“`golang
package main

import (
“fmt”

“golang.org/x/crypto/bcrypt”
)

func main() {
password := []byte(“password”)

// GenerateFromPassword でパスワードをハッシュ化する。
// 第2引数はコストを指定する。値は 4 ~ 31 の範囲である必要がある。
// コストについてはこの記事がわかりやすい。 → https://qiita.com/istsh/items/ca330d27fe51a6bf7a3d#2-%E3%82%B3%E3%82%B9%E3%83%88%E3%81%AE%E6%8C%87%E5%AE%9A
hashed, _ := bcrypt.GenerateFromPassword(password, 10)
fmt.Println(string(hashed)) // => $2a$10$P9Zr9LES1Yv/n6k77pDy0OVwCRBeHRhHsFMQyU6GfkfpOXfHOPjgG

元記事を表示

CircleCIでGoのテストを並列実行する

## TL;DR

– CircleCIで複数の並列マシンを起動してGoのテストを並列実行します。

## 基本的なアイデア

– CircleCI CLIでテストを並列数に応じて分割
– 環境変数を使用して並列マシンごとに接続先DBを分ける

## CircleCI CLIで並列数に応じてテストを分割

`circleci tests split` コマンドを使ってテストをpackageごとに分割します。
ただ、splitコマンドは分割するだけでテスト自体は実行されません。
なので、結果はファイルに書き出して `go test` に渡す必要があります。
具体的には下記のようにします。

“`bash
go list ./… | grep -v vendor | circleci tests splits > pkgs
export TESTPKGS=$(cat pkgs | tr ‘\n’ ‘ ‘)
go test ${TESTPKGS} 2>&1
“`

## 環境変数を使用して並列マシンごとに接続先DBを分ける

CircleCIには並列処理を制御するための環境変数が用意

元記事を表示

【Go】Base64エンコード・デコードのやり方

# サンプルコード

“`golang
package main

import (
“encoding/base64”
“fmt”
)

func main() {
// Base64 エンコードしたいデータ
data := []byte(“some data”)

// Base64 エンコード
enc := base64.StdEncoding.EncodeToString(data)
fmt.Println(enc) // => “c29tZSBkYXRh”

// Base64 デコード
dec, _ := base64.StdEncoding.DecodeString(enc)
fmt.Println(string(dec)) // => “some data”
}
“`

元記事を表示

intra-mart IM-Noticeクライアント for Mac/Linux

公式の intra-mart IM-Notice デスクトップアプリは Windows でしか動作せず、しかも 1 アカウントでしか利用できないのが不満だったので、Go で作り直してみた。
結局 ZeroMQ で Pub/Sub しているだけっぽかったので簡単に作ることができた。
POST /mq/user で SubscribeID を取得するのがポイント。
通知には [Beeep](https://github.com/gen2brain/beeep) を利用、Mac の場合 OS の通知が利用される。
yaml ファイルにベースURLとアカウントのリストを書いておけば起動時にすべてのURLとアカウントに対して接続/購読処理を行い、以降通知を受け取ることができる。
通知履歴は作ってもいいけどどうせ利用しないので実装しなかった。
もし仮に今作るなら Fyne を使うのが流行なのだろうか。

それにしても Go はマジでイケてる。
本調子ならもっといろいろ作ったり勉強したりしたいのだが・・。
MS には Go の Win32 API を作って欲しい。

“`go:main.go
fu

元記事を表示

Golang入門.4 -template.ParseFilesを追う-

## はじめに
[Golang入門.3 -html/templateを使う-](https://qiita.com/ryuji0123/items/8d97d21bf06cf6b0cf59)の続きです。

## 今回のテーマ
 `html/template`の関数`ParseFiles`の実装を追います。

## 概念
[document](https://golang.org/pkg/html/template/#ParseFiles)
> ParseFiles creates a new Template and parses the template definitions from the named files. The returned template’s name will have the (base) name and (parsed) contents of the first file. There must be at least one file. If an error occurs, parsing stops and the returned *Tem

元記事を表示

Go言語のinterface型に対する個人的な見解

#まとめようと思ったきっかけ
Go言語を勉強していてinterfaceについて調べたことがある方、特に自分のような初心者の方。
interfaceについて説明してあるページってなんでこんなに分かりにくい表現を使うの?って思ったことありませんか?

> これがいわゆるダックタイピングです。

知らねえよ!

> Animalというinterfaceは鳴くことができます。
猫:ミャオ
アヒル:グワッ

いや、わかるけど…!わかるけどさ!
なんかもう少し実装のイメージがつく具体例なかったの!?

> “If it walks like a duck and quacks like a duck, it must be a duck”
(もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルに違いない)

英語の授業ですか!?

#なぜこのような説明が多いのか
ひとえに「高いレベルのもの=抽象的なもの」であることが理由であるような気がします。
また、「高いレベルの人間でありたい=抽象的な理解をしたい」という考えは当然です。
単純な算数ドリルを勉強して、難しい応用問題を解けるよ

元記事を表示

sql-migrate PostgreSQLで環境変数を利用した設定例

## 公式リポジトリ

https://github.com/rubenv/sql-migrate

## 設定例
“`yml:dbconfig.yml
development:
dialect: postgres
dir: migrations
table: migration
datasource: host=${DB_HOST} port=${DB_PORT} dbname=${DB_DATABASE} user=${DB_USERNAME} password=${DB_PASSWORD} sslmode=disable
“`

* `dir` マイグレーションファイルを作成するディレクトリ
* `table` マイグレーションテーブルの名前。省略した場合デフォルトの`gorp_migrations`になる

元記事を表示

golang[][]stringでのtranspose(縦横変換)

####goalngで[[][][][][]]のような二次元配列の順番をtranspose(縦横変換)する。
・csvを読み込んだ際に変換したくなったので、その部分を抜粋。

“`main.go
package main

import “fmt”

func transpose(slice [][]string) [][]string {
xl := len(slice[0])
yl := len(slice)
result := make([][]string, xl)
for i := range result {
result[i] = make([]string, yl)
}
for i := 0; i < xl; i++ { for j := 0; j < yl; j++ { result[i][j] = slice[j][i] } } return result } func main() { sample := [][]string{ []string{"a1", "a2", "a3", "a4", "a5"}, []s

元記事を表示

golangでmapにおいてkeyの存在を確認する。

####golangでmapにおいてkeyの存在を確認する。
“`main.go
if _, ok := Map[key]; ok {
//存在する場合true
}
“`

元記事を表示

Golangで型情報を調べる

#####golangで型情報調べる時に使う

“`main.go
package main

import (
“fmt”
“reflect”
)

func main() {

fmt.Println(reflect.TypeOf(1)) // int
fmt.Println(reflect.TypeOf(“”)) // string
fmt.Println(reflect.TypeOf([]string{})) // []string
fmt.Println(reflect.TypeOf(true)) // bool
fmt.Println(reflect.TypeOf(func() {})) // func()

}
“`

元記事を表示

Golang入門.3 -html/templateを使う-

## はじめに
[Golang入門.2 -http.Handleの実装を見る-](https://qiita.com/ryuji0123/items/9d95c4db88a6b2e3e59f)の続きです。また今回から実際のアプリを作っていきます。詳細は決めていませんが、[Grammarly](https://app.grammarly.com/)と併用して英語の文章を快適に書くためのエディタを作ろうと思っています。

## 今回のテーマ
 `html/template`を使ってhtmlファイルを返せるようにします。なお、内容は[Writing Web Applications](https://golang.org/doc/articles/wiki/)に準拠します。

## 概念
 今回はエディタとして必要な入力画面を出せるようにします。基本的には`IndexHandler`(前回までの`HelloHandler`)内でhtmlファイルを読み込み、必要な変数を`Page struct`を通して渡しています。

## コード
[commit](https://github.com/ry

元記事を表示

gqlgen httprouter recipe

###gqlgenとhttprouteの組み方

“`
import (
“net/http”

“github.com/99designs/gqlgen/graphql/handler”
“github.com/99designs/gqlgen/graphql/playground”
“github.com/julienschmidt/httprouter”
)

// Defining the Playground handler
func PlaygroundHandler() httprouter.Handle {
h := playground.Handler(“GraphQL”, “/query”)

return func(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
h.ServeHTTP(w, req)
}
}

// Defining the Graphql handler
func GraphqlHandler(

元記事を表示

【Go(gorilla)】チャットのサンプルアプリでWebSocketサーバの設計思想を理解しましょう。

こんにちは。
普段はネットワークの組込み系F/W開発をしています。個人的にWebSocketで高効率なソケットサーバ作れないかと思い、GorillaのWebSocketライブラリ内のサンプルコードから設計思想を拝借しました。

私が理解した内容を纏めてみました。Go言語勉強して約2日で知見の浅い記事になってると思います。
間違い等あればご指摘ください。

##趣旨
Go言語のWebSocketサーバの効率よい設計を理解する。

## 前提知識
– Go言語
プログラミング言語。

– Gorilla
WebSocketやHTTPなどのライブラリ。下記記事が分かりやすいです。
https://qiita.com/gold-kou/items/99507d33b8f8ddd96e3a

## 参考文献
[100万回のWebSocket接続とGo](https://postd.cc/100%E4%B8%87%E5%9B%9E%E3%81%AEwebsocket%E6%8E%A5%E7%B6%9A%E3%81%A8go/)
Go言語におけるWebSocketの設計記事。

[ゴルーチンとチャ

元記事を表示

1分でgolangでHello World を表示する。

# 環境
docker for windows
PowerShell

# コマンド

“`
>docker pull golang
>docker run –name golang -it golang /bin/bash
root@*******:/go# git clone https://github.com/go-training/helloworld.git
root@*******:/go# go run helloworld/main.go
Hello World!!
“`

# 備考
docker for windowsが入っていないと時間がかかります。

元記事を表示

GitHub Actionsでcacheに転んでいた

# はじめに
[前回の記事](https://qiita.com/yawn_yawn_yawn_/items/2f4bf5d3ce7e5e77dfd7#yaml%E5%85%A8%E4%BD%93)のまとめを読んでからだと、雰囲気がつかみやすいかも?

# 実現したかったこと
GitHub Actionsを用いてgoの静的解析、テスト/ビルドを行うCIを構築したい。
その際、毎回モジュールのインストールが挟まると時間がかかっちゃうので、キャッシュを使って短縮したい。という話の続き。

[前回の記事](https://qiita.com/yawn_yawn_yawn_/items/2f4bf5d3ce7e5e77dfd7#yaml%E5%85%A8%E4%BD%93)の段階では、キャッシュヒット、と通知されたが、`go vet`や`go test`を行う際にモジュールのインストールが発生する。保存したはずのキャッシュが使えてねえ…

# 起きていたこと

**中身がキャッシュされていなかった事件**

キャッシュ自体はされていましたが、モジュールがキャッシュされていませんでした。な

元記事を表示

よく使うGoのBuildオプションと、UPXの圧縮がバイナリサイズにどの程度影響しているか調べた

# はじめに

GoのBuildオプションでサイズに影響しそうなオプションで、どの程度サイズに差がでるか試しました。

以下の環境です。自分のよくあるGoのユースケースとしてWebAPI開発あるので、go-swaggerやAWS SDK Goに依存したプロジェクトで試してみました。

“`bash
$cat /etc/os-release | head -n2
NAME=”Ubuntu”
VERSION=”18.04.4 LTS (Bionic Beaver)”

$ go version
go version go1.14.2 linux/amd64
“`

# 比較

“`bash
# 1. ノーオプション
go build -o nooption main.go

# 2. ldflagsでdebug情報を削除
go build -ldflags=”-s -w” -o ldflags main.go

# 3. trimpathでパス情報を削除
go build -ldflags=”-s -w” -trimpath -o trimpath main.go
“`

* `

元記事を表示

Go言語のdeferを正しく理解する | How defer in Golang works

deferってなんかかっこいい!
くらいの認識の人向け。

# 環境
“`bash
go version go1.13.7 darwin/amd64
“`

# A Tour of Goより
> A defer statement defers the execution of a function until the surrounding function returns.

> The deferred call’s arguments are evaluated immediately, but the function call is not executed until the surrounding function returns.

> defer文は、上位ブロックの関数がreturnするまで関数の実行を遅延させる。
遅延実行される関数の引数は即時評価されるが、関数の実行は上位ブロックの関数がreturnするまで実行されない。

_出典: [A Tour of Go](https://tour.golang.org/flowcontrol/12)_

# 試してみ

元記事を表示

Golang – MySQL Scan Error

# Problem
“`
sql: Scan error on column index 5, name \”time\”: unsupported Scan, storing driver.Value type []uint8 into type *time.Time]”}
“`

# Solution
You need added string “parseTime=true” in mysql connection setting.

“`
db, err := sql.Open(“mysql”, “root:@/?parseTime=true”)
“`

https://stackoverflow.com/questions/29341590/how-to-parse-time-from-database/29343013#29343013
https://stackoverflow.com/questions/45040319/unsupported-scan-storing-driver-value-type-uint8-into-type-time-time

元記事を表示

GitHub Actionsのcacheでどハマりした

## はじめに
タイトルそのままのことがおこりました。

4/15追記: 今回ハマったこと自体は、原因がわかり、形的に成功しているように見えるのですが、8割解決してないです。
こちらも合わせてどうぞ…。
[GitHub Actionsでcacheに転んでいた](https://qiita.com/yawn_yawn_yawn_/items/3f1f796d6eb600447222)

## 実現したかったこと
CIにgoの静的解析とテスト、ビルドを盛り込むこと。
その過程で、毎回go moduleのインストールが挟まると時間がかかっちゃうので、キャッシュを用いることでで解決したい。

## ハマったこと
キャッシュの探索では、`Cache not found for input keys: …`となり、ごめん見つからんかったわーって言われる。

![スクリーンショット 2020-04-13 15.04.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261043/5abc4d2f-7a56

元記事を表示

WSL (ZSH)でGolang 環境を作ろうとしてハマりかけた罠

# ~~sammary~~ summary
WSL でGolang環境を作ろうとしたらgoenvインストール後ディレクトリ名がおかしくなっていました。

“` ~/.
.goenv~ (ファイル名)
etc…
“`

## やったこと
参考:https://qiita.com/10380r/items/37d0bf71b0e19a49ce53

* golang のバージョン管理ツールgoenvを入れる

“`
git clone https://github.com/syndbg/goenv.git ~/.goenv
“`

* 環境変数設定

“` ~/.zshrc
export GOENV_ROOT=$HOME/.goenv
export PATH=$GOENV_ROOT/bin:$PATH
eval “$(goenv init -)”
“`

この後 “`source .zshrc“`をしてもcommand not found: goenvになってしまうし
“`which goenv“`をしてもgoenv not foundになってしまうしで頭を抱え

元記事を表示

OTHERカテゴリの最新記事