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

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

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

昨年の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/golang-example/tree/master/firebase-admin-sdk-cmd)のリポジトリにあげています。

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

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

元記事を表示

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

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

#### はじめに

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

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

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

#### で、こうなった

実況さん「新人くん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` 読んでて見つけました。賢いなーと思ったので書いておきます。よくよく考えると以前も同じようなのを見て賢いなーと思

元記事を表示

Goの内部パッケージ関係をコミットごとに可視化する

![call-aimation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479931/3ec1a7e5-ce6a-92cd-0a86-8ace5e944941.gif)
使用したプログラム: [bxcodec/go-clean-arch](https://github.com/bxcodec/go-clean-arch)

# 概要
1. Goの内部パッケージの関係が複雑なプログラムは理解するのが大変
– 可視化したい
– せっかくだからコミットごとに可視化してアニメーションにしてみる

# 準備
– [Go](https://golang.org/)
– [Python3](https://www.python.org/)
– [Graphviz](https://www.graphviz.org/)
– [ImageMagick](https://imagemagick.org/index.php)

# コード
– [st34-satoshi/for-each-commit](https

元記事を表示

GoでSTUNサーバを使って自分のパブリックIPアドレスを取得

以下の記事を参考に Go の実装に置き換えてみた。

* [JavaScriptでグローバルIPを取得する(パブリックSTUNサーバーを利用)](https://qiita.com/azechi/items/1a7832e346f42402cca6)

以下のパッケージ使って同等のことが割と簡単に実装できた。

* [pion/webrtc: Pure Go implementation of the WebRTC API](https://github.com/pion/webrtc)

Go言語楽しい。

## 実行結果

“`terminal
# go run webrtc/main.go
2020/01/06 23:31:08 Local IP Address: 192.168.xxx.xxx
2020/01/06 23:31:08 Public IP Address: 113.xxx.xxx.xxx
“`

## 実装

“`go:main.go
package main

import (
“log”
“os”

“github.com/pion/web

元記事を表示

ubuntu環境構築

# 準備

Desktop:HP-550-240jp (graphics=GTX960)
HDDにWindows10が入っているため、SSDを買い、そちらにubuntuを入れることにした。

SSD:WesternDigitalの500GSSD(WDS500G2B0A)
あとは、3.5→2.5inchにするためのアダプタ?
SATAケーブル、電源分岐ケーブル

いざ、筐体を開けてみると、電源は余っていたので、分岐ケーブルはいらなかったのだよな、、、
開けてから買うべきだった。
電源を引っこ抜き、作業開始。
SATAの差込口は1個余っていたけど、随分端っこの方にあって、差し込みにくかった。
とりあえず、SSDを電源につなぐところまでやる。

電源もどして、普通にwin10を起動。
USBメモリを用意して、[本家](http://releases.ubuntu.com/18.04/)より、
ubuntu-18.04.2-desktop-amd64.isoをダウンロードし、書き込み。
[こちら](https://qiita.com/medalotte/items/4bb5cfa709e93d

元記事を表示

利用AWS Fargate5分鐘部署你的Gin/Flask API Cluster

### 0. Prerequisite

在前面的文章我們已經介紹過目前在AWS上相關的container服務,而這篇文章想讓大家體驗Fargate的power,也將會帶著各位透過Cloudformation來部署一個API Cluster,以便提供給你的mobile或是web作為資料的來源。

無論你的API語言是透過Golang [gin]([https://github.com/gin-gonic/gin](https://github.com/gin-gonic/gin)) 或是 Python [Flask](https://github.com/pallets/flask) 開發,只要最後透過包裝成docker image後,都可以透過本篇所教學的方法快速的部署API Cluster。

此外,我們將透過[CloudFormation](https://aws.amazon.com/tw/cloudformation/)的方式來快速部署我們所需要的架構以及Cluster,如果對於CloudFormation還不熟悉的話也沒關係,可以先跟著本篇的範例先做嘗試,稍後我們也會部分裡

元記事を表示

利用AWS S3來部署Hugo Site

## 0. Prerequisite

如果你還不清楚Hugo是怎麼樣的一個靜態網頁工具,可以先參考[使用hugo搭建你的第一個blog](https://qiita.com/p0n2/items/57cabf0ff855e8b473e5)來對hugo有初步的認識。

如果你已經了解並且準備好讓Hugo可以透過internet讓所有人瀏覽,那在這一篇post中我們將會詳細的介紹。

在開始之前,本片文章會使用到AWS的CLI來配置AWS上的相關資源。
[安裝 AWS CLI](https://docs.aws.amazon.com/zh_tw/cli/latest/userguide/cli-chap-install.html)

## 1. Create S3 Bucket and configuration

接著,我們可以透過command line輸入

“` shell
aws s3api create-bucket –bucket –region ap-northeast-1 –create-bucket-configurati

元記事を表示

使用hugo搭建你的第一個blog

在我們開始聊Hugo之前,先看看網路上大家都怎麼利用[Hugo Show Case](https://gohugo.io/showcase/)

## 0. Prerequisite

在開始使用hugo之前,必須要先在你的環境中安裝hugo的cli。

如過你是Mac/linux user,恭喜你!你只需要在你的terminal中輸入 (linux user如果無法執行brew command的話,請先安裝[Homebrew-on-linux](https://docs.brew.sh/Homebrew-on-Linux))

“` shell
brew install hugo
“`

安裝完成後,可以接著輸入

“` shell
hugo version
“`

如果有成功顯示類似下面的訊息(版本可能會不一樣),那就是安裝已經完成囉。

“` shell
Hugo Static Site Generator v0.58.3
“`

## 1. Create first Site

接著輸入下面的command來創建你的第一個blog

“` shell
hugo

元記事を表示

Golangで代表的なソートの復習

# はじめに
Go言語で代表的なソートのプログラミングを実装してみました。
目的はスライスの練習とソートの復習、Goの練習です。
Go初心者なので書き方云々なんか気になるところはコメントください!
注) アルゴリズム理解が目的なのでsortライブラリは用いてないです。

今のところ以下作成しました。

– インサーションソート (Insertion sort)
– マージソート (Merge sort)
– クイックソート (Quick sort)

[github](https://github.com/Sheerlore/sortlib)

順次追加予定です。
自分のメモ用にQiitaに載せますが自分より初心者の方に役に立てばと思います。
学校の課題などの参考になさってください。
それぞれパッケージにまとめてimportする形にしました。
入力と出力どちらも“`[]int“`のスライスです。
他の型にする場合は適当に変更すれば良いと思います

以下に実行コードとそれぞれ

元記事を表示

Go+ AWS SNSを使ってSMSを送信する

# はじめに
個人開発で作成しているアプリケーションの認証にSMSを使いたかったので、何やらややこしいですが『Go + AWS SNS』という組み合わせで、SMS送信を実現しました。今回はそのまとめです。
実際のコードで確認したい方は[こちら](https://github.com/atEaE/golang-aws-sdk-example)からどうぞ。

# 実行環境
– macOS Catalina 10.15.2
– golang 1.13.0
– Visual Studio Code

# AWS SNSって何?
Amazon Simple Notification Service(Amazon SNS)自体の説明は私の拙文を参考にするよりも、[公式](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/welcome.html)を参考にした方が理解が進むと思いますので、ざっくりと説明します。
読んで字の如く『シンプルな通知機能を提供するサービス』です。私からは『何かしらの通知ができるサービス』というざっくりしたことを覚えておいてもらえ

元記事を表示

アナ雪のメロディーに合わせた Golang の歌 – Write in Go – が最高すぎる

[Write in Go – YouTube](https://youtu.be/yhC-361QGJw)

> The schedule’s tight on the cluster tonight
> So I parallelized my code
> All these threads and continuations
> My head’s going to explode
> And all this bolierplate
> This FactoryBuilderAdapterDelegatelmpl…
> Seems unjustified
> Give me something simple
> Don’t write in Scheme
> Don’t write in C
> No more pointers
> That I forgot to `free()`
> Java’s verbose
> Python’s too slow
> It’s time to know
> Write in Go!
> Write in Go!
> No inh

元記事を表示

Node.js が Go より 2 倍も速いなんてことがあるのだろうか

こんにちはフロントエンドエンジニアをしている ku6ryo です。
普段は VR のスタートアップにて JavaScript で SPA を開発しています。
WASM に興味をもち、 WASM x Go は本当に早いのかという疑問から速度検証をしてみたのですが、WASM に辿り着く前に Go が JavaScript (Node.js) よりも遅いケースがあるのを発見したので共有および、なぜこうなるのかわかる方がいらっしゃればご意見をいただきたく、本記事を投稿します。

# 結果
先に結果から。10^7 以下の最大の素数を求めたところ、JavaScript (Node.js) 約 1200 ms に対して Go は 約 2500 ms となった。Node.js は Go よりも約2倍も速い結果となった(10回施行のばらつきは 数% 以内なので Node.js は Go に対して優位な差があるとみなせると判断)。なお、実行環境は `macOS Catalina / 2.3 GHz Dual-Core Intel Core i5 / 16 GB 2133 MHz LPDDR3` です。

元記事を表示

OTHERカテゴリの最新記事