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

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

眺めて覚える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

元記事を表示

DB接続付きGraphQLサーバ(by Golang)をローカルマシン上でDockerコンテナ起動

# お題
表題の通り。[前回](https://qiita.com/sky0621/items/f03631f0309f5c375b1d)までGraphQLを題材にフロント・バックエンドそれぞれで実装を進めてきた。
まだまだ実装することは山ほどあるけど、今のところローカルマシン内でほそぼそと立ち上げているこのアプリを[GKE](https://cloud.google.com/kubernetes-engine/?hl=ja)にでも載せてみようと思っているので、まず手始めにアプリのDocker化を試みる。
今回は、バックエンド(Golang)だけ。接続するDBはローカルのDockerコンテナのまま。

# 関連記事索引
– 第5回「[DB接続付きGraphQLサーバ(by Golang)をローカルマシン上でDockerコンテナ起動](https://qiita.com/sky0621/items/58fa2bcfc0935f6186cb)」
– 第4回「[graphql-codegenでフロントエンドをGraphQLスキーマファースト](https://qiita.com/sky062

元記事を表示

io.CopyにはなるべくWriteTo関数を渡してあげた方が良さそう

[io.Readerのファイルタイプを判定する](https://qiita.com/knqyf263/items/6dfc891c6d3c6b94f895) を拝見してちょっと気になったので調べました。

`io.MultiReader`では[Write関数](https://golang.org/src/io/multi.go?s=1440:1500#L58)しか実装されておらず、 [WriteTo(w Writer) (n int64, err error)関数](https://golang.org/pkg/io/#WriterTo)が存在しません。
そのため、みんな大好き[io.Copy](https://golang.org/pkg/io/#Copy)で[積極利用](https://golang.org/src/io/io.go?s=13615:13679#L379)される`WriteTo(w Writer) (n int64, err error)`関数が働かず少し残念な気持ちがありました。

もしかすると気持ちだけの問題かもしれないのでBenchmarkしてみました。

元記事を表示

【Go】string型からint64型・uint64型へ変換する方法

# string型からint64型へ変化する方法

“`go
// int64
var strInt64 string = “9223372036854775807”

// strconv.ParseInt(文字列, 基数(10進数),ビット長)
convertedStrInt64, _ := strconv.ParseInt(strInt64, 10, 64)
“`

`9223372036854775807`は`int64`の最大数です

https://golang.org/pkg/builtin/#int64

> int64 is the set of all signed 64-bit integers. Range: -9223372036854775808 through 9223372036854775807.

# string型からuint64型へ変化する方法

“`go
// uint64
var strUint64 string = “18446744073709551615”

// strconv.ParseUint(文字列, 基数(10進数)

元記事を表示

GoでSSO

## やりたいこと

やりたいこととしては、GSuiteのアカウントで認証を一元管理したいなと。

そこでGsuiteのSSOを試してみたところ、色々と苦戦したので共有がてらに。

golangでSSOを試したかったのでその時のメモとして。

## 試しメモ

使ったライブラリはこれ

https://github.com/russellhaering/gosaml2

Gsuiteの設定はqiita teamのSSOから参考に

G Suite を使ったシングルサインオンの設定

https://github.com/galigalikun/saml-go/blob/master/main.go

試したコードはこれ

Gsuiteの「ACS の URL * 」を、「AssertionConsumerServiceURL」にして
「エンティティ ID *」を「AudienceURI」にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.a

元記事を表示

testify の assert.NoError() で fail した場合に処理続行して panic しないために

# 忙しい人のための結論
`assert.NoError()` で failした際には `t.FailNow()` すべし

# Why
goのテストコード書く場合いちいち `if err != nil` でチェックするのが面倒なのでtestifyの `assert.NoError()` を使ってチェックすることがあると思います。

“`Go
t.Run(“hoge func1”, func(t *testing.T) {
hoge := NewHoge()
result, err := hoge.func1() // return (interface{}, error)
assert.NoError(t, err)

actual := result.(*Hoge)
expected := &Hoge{Hoge: “hoge”}
assert.Equal(t, expected, actual)
})
“`

上記のテストコードはassertが通っている場合は問題なく動作しますが
assertがfailした場合 `assert.NoError` で処

元記事を表示

しばらく使わなかった言語はすぐ忘れる

昨年の2019年の6月頃触っていたgolangで素晴らしいモックの作成方法を学んだのに、
半年たってモックを作成しようとしたらテストの書き方含め「どうやるんだっけ…?」と忘れてしまいました。

[エビングハウスの忘却曲線](https://trinity.jp/118843/)によると学んだことは1ヶ月後も経てばほぼ忘れてると同義らしいので、
忘れた事を悲観するのではなく、アウトプットを含めた復習をすることで記憶を強化したいと思います。

[github.com](https://github.com/masa-mu/golang-public/tree/master/test-benchMark/exMock)のソースはこちら

## サンプルプログラム

例えばこんなプログラムがあったとします。

layer1.go

“`
package exPackage

type exStruct1 struct {
Layer2 Layer2Interface
}

type Layer1Interface interface {
Receiver() bool
}

func

元記事を表示

AWS節約術 : 自動で任意の時間にFargateを起動・停止する

# はじめに

マイクロサービスではお馴染みのAWSのコンテナ向けサーバーレスコンピューティングエンジン「Fargate」。基本料金が高額な上、一般的に1つのサービスでもいくつも動かすため、他のAWS製品と比較しても、毎月かなり高額な請求がきます。

しかし、実際のところ常に動かす必要があるわけではないはずです。本番環境は常時稼働させる必要があるかもしれませんが、dev環境や検証環境などは、使っていない時間はそれなりにあるはずです(夜間など)。

なので弊社サービスのdev環境のFargateは、平日は10時に起動、夜の22時に停止。土日は常に停止という風に自動化しています。

今回はこの自動化の方法について共有することで、「現在Fargateを使っているが、いかんせん節約したい」といった同業者の手助けになれば思い投稿しました。

# 構成と流れ

・Fargateのサービスを操作するプログラムを書いたLambda関数を「起動用」「停止用」の2つを作る。

・CloudWatch Eventsで「起動用」「停止用」の時間を任意に設定する。

・必要な実行ロールを付与する。

# 起動・

元記事を表示

time.Time型のSliceを昇順ソートしたい

`time.Time`型のSliceを昇順ソートするにはどのようにすればよいでしょうか?

__まずGoのバージョンが1.8以降の場合は`sort.Slice`を使うのがもっとも簡単です。__

“`go:main.go
package main

import (
“sort”
“time”
“fmt”
)

func main() {
times := []time.Time{
time.Date(2020, 1, 4, 0, 0, 0, 0, time.Local),
time.Date(2020, 1, 1, 0, 0, 0, 0, time.Local),
time.Date(2020, 1, 5, 0, 0, 0, 0, time.Local),
time.Date(2020, 1, 2, 0, 0, 0, 0, time.Local),
time.Date(2020, 1, 3, 0, 0, 0, 0, time.Local),
}

sort.Slice(times, func(i, j int) bool {
return ti

元記事を表示

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

# ハッシュ化
特定の文字列の不可逆変換をする処理ですが、golangではどう書くでしょうか。
結論。以下のようにしてできます。

“`golang

package main

import (
“crypto/sha256”
“encoding/hex”
“fmt”
)

func main() {
s := “Hello, World”
b := getSHA256Binary(s)
h := hex.EncodeToString(b)
fmt.Println(b) // [3 103 90 197 63 249 205 21 53 204 199 223 205 250 44 69 140 82 24 55 31 65 141 193 54 242 209 154 193 251 232 165]
fmt.Println(h) // 03675ac53ff9cd1535ccc7dfcdfa2c458c5218371f418dc136f2d19ac1fbe8a5
}

func getSHA256Binary(s string) []byte {
r := s

元記事を表示

vs codeでerrors.Wrap -> fmt.Errorfに置換

スニペットとして記録

“`
errors\.Wrap\(err, “(.*)”\)
“`

“`
fmt.Errorf(“$1: %w”, err)
“`

元記事を表示

GKE中のプログラムからKubernetesジョブを生成して非同期処理を行う

## 1. はじめに
定期的に稼働されるジョブではなく、リクエストされたらジョブを生成して処理を行いたい時はどの形で実装するか?
ジョブの稼働ステータスは何の方法で連携するか?疑問がある方々がいると思います。
この記事では実装方法のサンプルを紹介したいと思います。

早速ですが実装に行くサンプルアプリケーションの機能は
ウェブ画面からKubernetesジョブ実施を指示します。
実施ジョブ一覧とジョブ処理ステータスを表示させます。

## 2. アプリケーションフォルダの構成
全体のイメージを想像しやすくなるため、アプリケーションのフォルダ構成を先に見せます。

“`sh
gke_dynamic_job
├── README.md
├── app
│   ├── handler
│   │   └── sample_handler.go
│   └── sample_app.go
├── build
│   ├── cloudbuild.dummyjob.yaml
│   ├── cloudbuild.sampleapp.yaml
│   ├── dummyjob.Dockerfi

元記事を表示

Golang – cobraを使ったコマンドラインツール作成

## はじめに
軽微なプログラムを書く機会があり、せっかくなのでGolangでコマンドラインツールの開発に挑戦してみました。
簡単なものであれば、私のような初学者でも抵抗なく取り組めそうなことと、こういうツール欲しいなぁというシーンが私の周りではよくあったのでこの機会に学習することにしました。

作成したものは[こちら](https://github.com/so-heee/firebase-admin-sdk-cmd)のリポジトリにあげています。

## 今回作成するもの
##### Firebase Authentication ユーザーのCRUDコマンド

認証にFirebase Authenticationを利用しているWebアプリの開発に現在携わっているのですが、ユーザーの確認、作成や削除などをする際、周りのメンバー含めコンソールからポチポチしていました。
どうしてもユーザーの作成や削除などを頻繁に行う必要があったのですが、公式から提供されているCLIではCSVベースでのエクスポートとインポートしかないため、これをコマンドラインツールにしてみました。

https://fir

元記事を表示

次世代モブプロ?対戦型オペレーションゲームでスキルを磨け!!

**俺より強いスキルに会いに行く(挨拶)**

#### はじめに

*ハイスコアガールⅡ*面白かったですねー。

 ジブンも格ゲーブームのリアルタイム世代だったんだけど、見ててふと思ったのは「見て真似て盗む」というスキル磨きの手法。
 モブプロやったことないから憧れるけど、磨く方法は手取り足取りだけじゃないよね。(あ。もち否定じゃあないです)
 戦って負ける。から負けた理由なり、もっと上手くなる方法を考えたり、相手の操作から学ぶ。
 **それも一つのモチベーションが高い学習方法ではないか?仮説**

 そんな思いをコードにしました

#### で、こうなった

実況さん「新人くんvsベテランさんスタート!httpサーバーを8080で起動し、TESTの文字列を返すミッションです!!」

実況さん「新人くん、OSやバージョンの確認を手堅く始めたぞーパッケージの確認へと進んでいるー」
![2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189193/8d41e5e3-c515-d739-d0ce-c65

元記事を表示

docker内でhttps化・SSL通信をできるようにする

#はじめに
conohaのvpsでサービス運用を始めようと思います.
ただ,SSL可に意外と苦戦したのでまとめておきます.

#状況
・ubuntu+docker
・ドメイン取得済み
・Golangのbeegoでwebサーバーを立てている.

httpsでの接続をするためには,SSL証明書が必要.
オレオレ証明書はローカル運用でしか,利用できない.
[letsencryptをUbuntu16.04 + Nginxで使ってみた](https://qiita.com/k-yamada-github/items/7314003de7bdcbb2d39b)だと,docker内に作用することができない.
[個人運営サイトのSSLをDockerで良い感じに設定する](https://qiita.com/KappaBull/items/15de7a2bf52a5d38b11e)だと,コンテナが2つあって難しそう.

#結果
https-portalなるコンテナを利用することで,解決できました!!
#####メリット
・既存のコンテナサービスが簡単にSSL可できる
・わかりやすい
・自動で証明書を更新

元記事を表示

io.Readerのファイルタイプを判定する

# 概要
Goでファイルを読み込んでいる時に、そのファイルのタイプを判別したいことがたまにあります。例えばGzipかどうか分からないけど、もしGzipならgzip.NewReader噛ませたい、みたいな場合です。雑にgzip.NewReader噛ませてerr返すかどうかで判定とかやってみたんですが、普通に10バイト読み進められちゃうのでerr返ったあとに別のファイルタイプとして処理しようとするとinvalidなヘッダーになって死にます。実は読み進められたバイトを戻す方法あるよ、という場合は教えて下さい。

そもそもGzip以外の判定をしたいときもあるので、NewReaderの方針も必ず使えるわけではありません。もしファイルがos.Fileとかbufio.Readerの形であればReadしてからSeekしたりPeekしたり出来るのですが、io.Readerの場合どうやるのか分からなかったので調べました。

ちなみに自分では全く思いつかなくて `containers/image` 読んでて見つけました。賢いなーと思ったので書いておきます。よくよく考えると以前も同じようなのを見て賢いなーと思

元記事を表示

OTHERカテゴリの最新記事