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

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

golang で aws s3v4 の署名を作成する方法(署名キーを作成する方法)

# aws s3v4 署名バージョン
aws s3 は version4 より署名プロセスが変わっています
https://docs.aws.amazon.com/ja_jp/general/latest/gr/signature-version-4.html

## 署名作成の流れ

1. 署名に必要なキーを作成する(本記事はここ)
2. 1.で作成したキーを使って署名を作成する

## 各言語での署名キー作成方法

各言語の署名キー作成フローは以下の文書にまとまっています。しかしながら、`Java`, `.NET (C#)`, `Python`, `Ruby`, `Javascript` のサンプルコードはあっても、Golangのサンプルコードは存在しません
https://docs.aws.amazon.com/ja_jp/general/latest/gr/signature-v4-examples.html

そのため、本記事ではGolangで version4 用の署名取得処理のサンプルコードを載せることとします
ちなみにですが、本記事では署名キーを作成する部分の説明であり

元記事を表示

ときにはencoding.TextUnmarshalerの話を

飛ばねえホリネズミはただのホリネズミだ…

## うんざり

最近いろいろなプライベートプロジェクトに参加したりしてるんですが、
あっちにいってもこっちにいってもMarshalXXXだのString()だの実装するのDARUすぎませんか。
ここはJSONだからMarshalJSON実装して、こっちはYAMLだからMarshalYAML実装して…
アッ、素敵なHogeフォーマットなんてものを考えたんですね。じゃあMarshalHoge実装しなきゃですね(にっこり)

だいたいGoだとPrimitiveな型を`type Hoge int`とかやりがちなんで、
書くモンが多い多い。

“`go
type Hoge int

func (h Hoge) MarshalJSON() ([]byte, error) {

}

func (h Hoge) UnmarshalJSON(raw []byte) error {

}

func (h Hoge) MarshalYAML() ([]byte, error) {

}

func (h Hoge) UnmarshalY

元記事を表示

golangで文字列からキー付きでsha256ハッシュ化する方法

# キー付きでハッシュ化

キー無しでハッシュ化する方法は以前記事([golangで文字列からsha256でハッシュ化する方法](https://qiita.com/mergit/items/ffdb405173dee651856d))を執筆したのですが、今回はキー付きでhash化する方法です。

“`golang
// キー無しでSHA256
func getBinaryBySHA256(s string) []byte {
r := sha256.Sum256([]byte(s))
return r[:]
}

// キー有りでSHA256
func getBinaryBySHA256WithKey(msg, key string) ([]byte, error) {
mac := hmac.New(sha256.New, getBinaryBySHA256(key))
_, err := mac.Write([]byte(msg))
return mac.Sum(nil), err
}
“`

## サンプルプログラム

hash化は不可逆変換ですが、同じ文字

元記事を表示

golangの並行処理のための言語要素に対応するCSPの記述を理解して形式検証の実践を開始しよう(記述編)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101445/20730446-dabe-52d5-da91-59b75f636534.png)

# はじめに

go言語には、「スレッドの生成・起動」、「スレッド間の通信」といった、いわゆる「並列処理」を意識した言語要素があります。
このような言語要素を使って書く並行処理は、多くの場合振る舞いが複雑で正しいことを保証するのが難しくなります。

本記事では、そのような複雑な振る舞いになりがちなgoで書かれた「並行処理」の振る舞い設計を[CSP(Communicating Sequential Process)](https://ja.wikipedia.org/wiki/Communicating_Sequential_Processes)という形式言語を使った記述と対応させます。そうする事で、並行処理を含むgo言語のコードの振る舞い検証をするための第一歩、「記述」についての説明を試みます。

尚、本記事で「遷移図」として利用した図は、[P

元記事を表示

DockerfileのRUN命令

# お題
DockerfileのRUN命令はコンテナ内で実行されるコマンドを書くんだよというだけの話。
※便宜上、Golangアプリのコンテナ化を事例とする。

# 開発環境
## # OS – Linux(Ubuntu)
“`
$ cat /etc/os-release
NAME=”Ubuntu”
VERSION=”18.04.2 LTS (Bionic Beaver)”
“`

## # Dockerコンテナ
### Docker
“`
$ sudo docker -v
Docker version 19.03.5, build 633a0ea838
“`

# [RUN](http://docs.docker.jp/engine/reference/builder.html#run)

### どこに対して実行されるのか?

Dockerfileは自分の作業PC上で書いている。
Dockerfileは「こういうコンテナを作ってね」という指示書のようなもの。
RUNコマンドは、[FROM](http://docs.docker.jp/engine/reference/bui

元記事を表示

GoとLambdaでAWS使用料金を毎日LINE通知させる

## AWSの使用料金こわい
おっしゃ AWSのコンソールいじるで〜 :nerd:
お、そういや〜AWS今いくらかかっとんねんやろ :nerd:
マイ請求ダッシュボード ポチ〜っと :nerd:
awsbilling.png

んん!?? :innocent::innocent::innocent:

ECSを放置して$100超えの請求がきたり、
キルしたはずのRDSインスタンスが知らぬ間に復活していて地味に$40くらい請求がきたり、
~~この通過儀礼を~~いい加減なんとかしようと簡単な料金通知システムを作りました。 :nerd:

## やったこと
Go言語でLINE notifyの通知APIをキックする関数を実装して
AWS Lambdaにデプロイ:nerd:Cronで定期実行して、毎日AWSの使用

元記事を表示

【Go】GOPATH変更できないときにやったこと

#### 1. はじめに
[anyenv](https://github.com/anyenv/anyenv)経由でインストールした[goenv](https://github.com/syndbg/goenv/goenv)ですが
どうにもGOPATHやGOROOTの設定が動いてくれませんでした。
(結果としてGOPATH設定変更しなくて良かったようですが)
GoのWebフレームワーク [echo](https://echo.labstack.com/)を導入するときに、インストール先がGOPATHが設定されているディレクトリだったので「なんかそこじゃ嫌だな〜」と思って、GOPATH設定変更を試みました。
そのときに行ったことを備忘録として書きます。

*Homebrew、anyenv、goenvのインストール手順は書いていません。
お気付きのことがあれば、コメントいただけると幸いです。*

#### 2. 環境

“`
macOS Mojave ver. 10.14.6
Homebrew インストール済
go version go1.13.5 darwin/amd64
shell

元記事を表示

Golang入門記事の没ネタサンプルコード

Golang入門中です。

以前、以下の記事を書きました。
[Golang入門:AtCoderなどの競技プログラミング問題を解き始めるための基本構文+その他おまけTips](https://qiita.com/shiro01/items/4e12a48816ecd47c0c0e)

記事に載せようかと思い書いてみたけれど、
趣旨から外れるため除外したサンプルコードをせっかくなのでまとめて公開したいと思います。

入門者によるざっくり試してみたコードの羅列ですが、参考になれば幸いです。

#型宣言

基本の型から独自の型を宣言できます。

“`golang:newType01.go
package main

import (
“fmt”
)

// intから新しい型を宣言
type aInt int
type bInt int

func main() {
var a aInt = 5
var b bInt = 55
hoge(a, b)

// 数値はaInt型,bInt型に代入できるので実行可能
hoge(5, 55)

// intだとエラーになる
// エラ

元記事を表示

AWS CodePipelineでgoアプリのDockerイメージをECRに格納する

## 実現したいこと
1. CodeCommitのリポジトリ(hoge-repo)のmasterブランチの更新をトリガーに
masterブランチのリソースからDockerイメージを作成しECRの対象リポジトリに格納したい
1. hoge-repoはgolangのアプリを持っているので,イメージ作成時にアプリのビルドも行う

## 環境
– Golang 1.13.5
– Docker 18
– AWS 東京リージョン

## やったこと
### CodeBuild構築
– プロジェクト名は任意の名前

– 送信元
送信元はCodeCommitの対象リポジトリを選択

スクリーンショット 2020-01-10 15.53.22.png

今回はmasterマージをトリガーにするのでリファレンスタイプは

元記事を表示

GoでデバッグのためにgRPCのリクエストをトレースする

Go で gRPC が使われているライブラリを使っている時に、ライブラリが投げている実際の gRPC のリクエストをトレースしたい場合には Go の gRPC ライブラリが `golang.org/x/net/trace` に対応している為、お手軽に確認する事ができる。

“`golang
grpc.EnableTracing = true

go func() {
http.ListenAndServe(“:8080”, nil)
}()
“`

そのあと、 `localhost:8080/debug/requests` を開けば以下のような出力が得られる。

![スクリーンショット 0002-01-10 17.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/974/9453223b-d16b-1b79-48e3-34bae47c05ab.png)

詳細は [golang.org/x/net/trace](https://godoc.org/golang.org/x/net/t

元記事を表示

眺めて覚えるGo言語 その11 無名関数(Anonymous function)

#では、眺め用サンプルコード

“`f11.go
package main
import (
“fmt”
)
func main() {
h1:=func(a string)(string){ return “

“+a+”

“}
fmt.Println(h1(“Topics”))
}
実行結果
>go run f11.go

Anonymous

“`

##名無しの関数
“`f12.go
package main

import (
“fmt”
)

func main() {
func(){
for i:=0;i<10;i++{ fmt.Println("i=",i) } }() } 実行結果 >go run f12.go
i= 0
i= 1
i= 2
i= 3
i= 4
i= 5
i= 6
i= 7
i= 8
i= 9
“`

元記事を表示

workaround for panic when defining the same flag in multiple packages and go test -coverpkg.

# Issue

– go version: 1.13.5

複数のパッケージが同じ名前のフラグを定義している時、 `go test -coverpkg=all ./…` のように `-coverpkg` をつけて `go test`すると、 `flag redefined` でpanicする問題。

– [cmd/go: test coverpkg panics when defining the same flag in multiple packages · Issue \#27336 · golang/go](https://github.com/golang/go/issues/27336)
– [Go 1\.13 にアップデートするとテスト時に “flag provided but not defined” エラーが発生するケース \- blog\.syfm](https://syfm.hatenablog.com/entry/2019/10/01/063436)

“`
$ go test -v -cover -coverpkg=all ./…
?

元記事を表示

眺めて覚えるGo言語 その10 panic

#Go言語のpanicを知ってパニクッタのである。
なんかエラーがあって継続するのに難しいときに使うのが**panic**です。

“`f9.go
package main

import (
“fmt”
)

func main() {
defer fmt.Println(“パニクリました。”)
fmt.Println(“Start”)
panic(“パニックになりました”)
}
実行結果
>go run f9.go
Start
パニクリました。
panic: パニックになりました

goroutine 1 [running]:
main.main()
C:/Users/hirat/go-work/function/f9.go:10 +0x12b
exit status 2
“`
上記のようにdeferと共に使うとプログラムの中断がうまく行く。

“`f10.go
package main

import (
“fmt”
)

func helloworld() {
defer fmt.Println(“End”)
fmt.Pri

元記事を表示

Goのmapのkeyを連結して平らにする

### Code

“`go
package main

import (
“fmt”
)

type m map[string]interface{}

var data = m{
“version”: “1”,
“meta”: m{
“id”: “2”,
“user”: m{
“id”: “3”,
},
},
}

func main() {
FlattenMapKeyWithPeriod(data, “”)
}

func FlattenMapKeyWithPeriod(data map[string]interface{}, prefix string) {
for k, v := range data {
d, ok := v.(m)
if ok {
FlattenMapKeyWithPeriod(d, prefix+k+”.”)
} else {
fmt.Printf(“%s: %s\n”, prefix+k, v.(string))
}
}
}
“`

#### In

“`json
{
“versi

元記事を表示

GoのDatetime忘れがちなので、まとめてみた

普段良く使うtimeメソッドをまとめてみた。

## Formatについて

他の言語みたいな`YYYY-MM-DD hh:mm:ss`timeフォーマット、Goでは↓このように書く
`2006-01-02 15:04:05`

## String -> Time

`time.Parse(layout,string)`を使って、文字列をTimeオブジェクトにする

例:

“`go
str := “2020-01-09T19:00:00Z”
t, _ := time.Parse(“2006-01-02T15:04:05Z”, str) // 出力結果: 2020-01-09 19:00:00 +0000 UTC
“`

## 時間の比較

`After()`メソッドを使う
t1 > t2なら、t1.After(t2) => true
t1 < t2なら、t1.After(t2) => false

“`go
str1 := “2020/01/10 00:00:00”
str2 := “2020/01/08 00:00:00”

t1, _

元記事を表示

眺めて覚えるGo言語 その9 deferの書き方

#deferは、遅延という意味だが分かりにくい。
###眺めるための例題

“`f7.go
package main
import (
“fmt”
“time”
)
func main() {
defer fmt.Println(“全部終了しました。”)
for i:=0;i<10;i++{ time.Sleep(1) fmt.Println("i=",i) } } //実行結果 >go run f7.go
i= 0
i= 1
i= 2
i= 3
i= 4
i= 5
i= 6
i= 7
i= 8
i= 9
全部終了しました。
“`
最初に書いた **defer fmt.Println(“全部終了しました。”)**は、
for以降のステートメント以降に遅延されたことがわかる。

実際の場面

“`f8.go
package main

import (
“bufio”
“fmt”
“io”
“os”
)
func main() {
fp, err := os.Open(“d:\\00data\\test_utf20.csv”)
if err !=

元記事を表示

ソースコードからdebパッケージを作成する(goの参考ビルド例付き)

# TL;DR

* ソースコードからコンパイルするソフトウェアツールを,ubuntu 18.04などのdebパッケージにまとめる手順を説明します
* いわゆる野良ビルドなので,利用には注意が必要です
* “`go“`のインストールを例に説明します

# 手順

* “`check-install“`コマンドを使用してdebパッケージを作ります.
* ツールをソースからインストールする際に行う,いつもの手順“`./configure && make && sudo make install“`の3番めの“`make install“`の代わりに,“`checkinstall“`コマンドを使用するだけで,debパッケージを生成できます.
* golangのソースコードにはMakefileが無いので,自分でMakefileを作ってしまいます
* Makefileには,“`all“`,“`install“`,“`uninstall“`の3つのディレクティブの記載が必要です

# check-installのインストール

“`bash

元記事を表示

golangをソースコードからインストールする(CentOS/Ubuntu)

# TL;DR

* Go言語のプログラムのコンパイラ+実況環境(“`go“`コマンド)をソースコードからインストールする方法を紹介します

# Go言語のビルド手順

[Installing Go from source](https://golang.org/doc/install/source)の説明をもとにインストールします.

直近のバージョンのgoは,goでビルドします.そのため,(以前のバージョン)“`go1.4“`をいったんビルドしてから,最近のバージョンのgoをビルドする手順を取ります
(もとの説明は「[Bootstrap toolchain from source](https://golang.org/doc/install/source#bootstrapFromSource)」にあります).

手順は以下のとおりです.使用したいgoを1.13.5(2019年12月27日時点)とします.

1. go1.4をダウンロード,ビルドする
1. go1.13.5をダウンロード,go1.4のディレクトリを指定してビルドする

# go1.4のビルド

* まず最

元記事を表示

眺めて覚えるGo言語 その8 関数の書き方

# 一般的な関数の書き方

“` f1.go
package main
func add(a,b int)int{
return a+b
}
func main(){
print(add(10,20))
}

実行
>go run f1.go
30
“`

 - a,b intは、引数です。intは、引数の型を表します。
 - その後ろに書いてあるintは、戻り値の型を示します。

#慣れてきたらnamed return value(naked return)を使ってみよう
“`f2.go
package main
func fun(a ,b int)(x,y,z int){
x=a*10
y=b*20
z=a+b
return
}
func main(){
a,b,c:=fun(10,20)
println(a,b,c)
}

実行
>go run f2.go
100 400 30

“`

– あらかじめ戻り値を定義することによりreturn一発で戻ることができる。(x,y,z int)

“`f3.go
package main
func fun(a ,

元記事を表示

Serverless Framework for AWS Lambda Development

## 0 .Intro

[Serverless Framework]([https://serverless.com/](https://serverless.com/))

> The complete solution for building & operating serverless applications.

就自己這陣子的使用經驗上來看,我覺得這樣的敘述還算名符其實。

目前最主要會用場景為開發在自己的MBPR 上利用Golang 開發AWS Lambda,利用Serverless Framework CLI所提供的功能來開發,部署以及在本機做測試,整體的流暢度滿高的。 雖然Serverless還有提供其他Monorting, integration或policy目前還沒有使用到,但是整理的使用經驗大勝[SAM CLI]([https://github.com/awslabs/aws-sam-cli](https://github.com/awslabs/aws-sam-cli)),特別是早期被SAM對於Golang的支援踩到太多的坑了。

除了AWS之外,其他ser

元記事を表示

OTHERカテゴリの最新記事