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

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

Golangで、デザインパターン「Visitor」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Visitor」を学ぶ”](https://qiita.com/ttsubo/items/5fea7c0a1f9fc868dc1f)

今回は、Pythonで実装した”Visitor”のサンプルアプリをGolangで実装し直してみました。

# ■ Visitorパターン(ビジター・パターン)
Visitorパターンは、オブジェクト指向プログラミング およびソフトウェア工学 において、 アルゴリズムをオブジェクトの構造から分離するためのデザインパターンである。分離による実用的な結果として、既存のオブジェクトに対する新たな操作を構造を変更せずに追加することができる。
基本的には Visitorパターンは一群のクラスに対して新たな仮想関数をクラ

元記事を表示

Go言語でOTP

二段階認証で必要になったのでGolangでOTPクライアントを実装してみました。
以下をかなり非常に参考させてもらいました。

* [TOTPを実装する](https://blog.web-apps.tech/implementing_totp/)
* [今さらTOTPクライアントを実装する](https://note.com/murakmii/n/n64b6d346172a)

“`go
package otp

import (
“crypto/hmac”
“crypto/sha1”
“encoding/base32”
“encoding/binary”
“time”
)

func TRUNCATE(hs []byte) int {
offset := int(hs[len(hs)-1] & 0x0F)
p := hs[offset : offset+4]
return (int(binary.BigEndian.Uint32(p)) & 0x7FFFFFFF) % 1000000
}

func HMACSHA1(k []byte, c uint64) []b

元記事を表示

モノレポとマイクロサービス

コロナの影響で在宅勤務(テレワーク)も一ヶ月以上も続き環境の変化に慣れてきましたが、`BBCパパ`のように急な家族の割り込みによる対応で頭を悩まされている streampack の Tana です。

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/Mh4f9AYRCZY/0.jpg)](http://www.youtube.com/watch?v=Mh4f9AYRCZY)
(在宅疲れした際に見るとリラックスできますw)

## モノレポ(Monorepo)とマイクロサービスへの取り組みについて

`streampack` は動画配信プラットフォームをお客様の要望にカスタマイズしながら、`AWS`などのクラウド上に提供しているサービスです。既存のシステムとマイクロサービスを最大限に活かすために、案件ごとに管理していた複数のレポジトリ管理から`モノレポ`へ移管したかについての経験談のお話になります。

以前は案件やレイヤー毎にリポジトリを切って開発してました。いわゆる `Polyrepo(Multi-Repo)` と呼ばれる方法です

元記事を表示

GoとDockerとHerokuでLINEBOTをためしてみる

# はじめに
上記の組み合わせのQiitaの記事がなかったのでまとめてみました。
Git, Docker, Herokuの最低限の知識を前提にしています。

## ディレクトリ構成
linebot_go
| — Dockerfile
| — heroku.yml
| — main.go

# GoとDockerとHerokuの環境を準備する
LINEBOTを導入する前に、まずはこちらの記事を参考にして準備します。
[Goで書いたサーバーをHerokuにDocker Deployする](https://qiita.com/croquette0212/items/2b85aa2c6b2933244f07)

## pushしたらHerokuに自動デプロイされるようにする
上記の記事だと毎回デプロイするのに2コマンドを打たなければいけないので、1コマンドでデプロイできるようにします。

・上記記事(2コマンド)

“`
$ heroku container:push web
$ heroku container:release web
“`

・1コマンド

“`
$ git

元記事を表示

Golangで、デザインパターン「Template Method」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Template Method」を学ぶ”](https://qiita.com/ttsubo/items/475ac4810ae44c0ea1bd)

今回は、Pythonで実装した”Template Method”のサンプルアプリをGolangで実装し直してみました。

# ■ Template Method(テンプレート・メソッド・パターン)
Template Methodパターン(テンプレート・メソッド・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。「振る舞いに関するパターン」に属する。Template Methodパターンの目的は、ある処理のおおまかなアルゴリ

元記事を表示

Golangで、デザインパターン「Strategy」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Strategy」を学ぶ”](https://qiita.com/ttsubo/items/b65dab0d494bebada223)

今回は、Pythonで実装した”Strategy”のサンプルアプリをGolangで実装し直してみました。

# ■ Strategyパターン(ストラテジー・パターン)
Strategyパターンは、コンピュータープログラミングの領域において、アルゴリズムを実行時に選択することができるデザインパターンである。
Strategyパターンはアルゴリズムを記述するサブルーチンへの参照をデータ構造の内部に保持する。このパターンの実現には、関数ポインタや関数オブジェクト、デリゲートのほか、オーソドックスなオブジェクト指

元記事を表示

Golang インターフェースと抽象化

## 抽象化
– 具体的な実装を隠し振る舞いによって共通化させること
– 複数の実装を同質のものとして扱う

## インターフェースによる抽象化
– Goではインターフェースでしか抽象化することができない

## インターフェース
– `型T`が`インターフェースI`を実装しているとは
– インターフェースで定義されているメソッドを全て持つ
– `型T`は`インターフェースI型`として振る舞うことができる
– `var i I = t` // tはT型の変数とする

### インターフェースの例
– インターフェースはメソッドの集まり
– メソッドのリストがインターフェースで規定しているものと一致する型はインターフェースを実装していることになる

“`sample.go
package main

import “fmt”

// バスケをするためのインターフェース
type BasketBaller interface {
Run()
Dunk()
Jump()
Shoot()
}

// 人間と犬の構造体
type Human st

元記事を表示

gRPC で認証処理を実装する

## grpc で認証処理を実装する
– [interceptor](https://github.com/grpc/grpc-go/tree/master/examples/features/interceptor)を使って実装すると、良さそう
– interceptor 自体は middleware 的な立ち回りをしてくれる

### 実装
– grpc-ecosystem にライブラリが用意されているのでそれを使っていく
– [go-grpc-middleware/auth](https://godoc.org/github.com/grpc-ecosystem/go-grpc-middleware/auth)
– 基本的には Client に PW を付与して、それをリクエスト時に投げてもらい、interceptor 内でチェックします
– 実際に書くのは以下のようなコード

“`go

grpcServer = grpc.NewServer(
grpc_middleware.WithUnaryServerChain(
grpcMetrics

元記事を表示

(Go言語)WebAssemblyで簡単なWebサイトを作ってみた

#前書き
Go言語の勉強を進める中でWebAssemblyが気になったので試してみました。
いろいろな情報尾参考にしつつ勉強中なので、間違い等ありましたらコメントをお願い致します。
ファイル 【[Githab](https://github.com/daemonkimura/Go_WebAssembly_Calc)】

##目次
・WebAssemblyとは
・実行環境
・ディレクトリ構成と各ファイルについて
・簡易電卓の実装
・感想

###WebAssemblyとは
モダンなブラウザにおいて、
スクリプトファイルをアセンブリ言語に変換したうえで読み込み実行する仕組みのこと

###実行環境
OS:Windows 10 64bit
言語環境:go version go1.14.1
ブラウザ:Firefox バージョン: 74.0

###ディレクトリ構成と各ファイルについて 【[Githab](https://github.com/daemonkimura/Go_WebAssembly_Calc)】
「main.go」はあくまでソースファイルなので実行する際にディレクトリに置

元記事を表示

Golangで、デザインパターン「State」を学ぶ

GoFのデザインパターンをGolangで学習してみたいと思います。
今回は、Qiita記事: “[Pythonで、デザインパターン「State」を学ぶ](https://qiita.com/ttsubo/items/cb3219a520451840f23f)”で取り上げた、Pythonベースの”State”のサンプルアプリをGolangで実装し直してみました。

# ■ State(ステート・パターン)
Stateパターンとは、プログラミングで用いられる振る舞いに関する(英語版) デザインパターンの一種である。このパターンはオブジェクトの状態(state)を表現するために用いられる。ランタイムでそのタイプを部分的に変化させるオブジェクトを扱うクリーンな手段となる。

## UML class and sequence diagram
![W3sDesign_State_Design_Pattern_UML.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103595/2e2b5e97-53c1-09b9-

元記事を表示

Golangで、デザインパターン「Observer」を学ぶ

GoFのデザインパターンを学習する素材として、書籍「[増補改訂版Java言語で学ぶデザインパターン入門](https://www.hyuki.com/dp/)」が参考になるみたいですね。
取り上げられている実例は、JAVAベースのため、Pythonで同等のプラクティスに挑んだことがありました。
[Qiita記事: “Pythonで、デザインパターン「Observer」を学ぶ”](https://qiita.com/ttsubo/items/34690c8e9351f5b2e989)

今回は、Pythonで実装した”Observer”のサンプルアプリをGolangで実装し直してみました。

# ■ Observerパターン(オブザーバ・パターン)
Observerパターンとは、プログラム内のオブジェクトのイベント( 事象 )を他のオブジェクトへ通知する処理で使われるデザインパターンの一種。
通知するオブジェクト側が、通知されるオブジェクト側に観察(英: observe)される形になる事から、こう呼ばれる。
出版-購読型モデルとも呼ばれる。暗黙的呼び出しの原則と関係が深い。
分散イベント

元記事を表示

【Golang】Ginでサブルーティングの定義方法

## やりたいこと

ルーティングを作る時にグルーピングを多段化させたい時ってあると思います。
その方法について記載します。

## 方法

“`go
router := gin.Default()

// api
v1 := router.Group(“api/v1”)
{
// 以下のようにv1.Groupとしてv1を引き継いでGroupを作成する
hoges := v1.Group(“/hoges”)
{
hoges.GET(“/”, func(c *gin.Context) {
c.JSON(200, gin.H{
“message”: “hello”,
})
})
}
}
“`

元記事を表示

golang でコマンドライン引数を使う

2種類のやり方があります

– [os](https://golang.org/pkg/os/) パッケージの Args を使う
– [flag](https://golang.org/pkg/flag/) パッケージを使う

## tl; dr
– flag を使うのが良さそう
– 型指定やオプショナル引数、デフォルト値の設定等、色々できるから

## flag
使い方

“`main.go
package main

import (
“flag”
“fmt”
)

func main() {
flag.Parse()
fmt.Println(flag.Args())
}
“`

“`
$ go run main.go foo bar baz
[foo bar baz]
“`
– 解析には flag.Parse() を呼び出します
– flag.Parse の内部では os.Args[1:] が渡されて解析される
– os.Args[0:] には実行コマンドが格納されている
– Parse は全ての flag

元記事を表示

Goでgoogle analytics apiからpv数取りたい

## Detail
記事は多いけどちょうどやりたい事の記事がなかったので、サクッと
analyticsの準備とか、パッケージの導入は他の記事見て下さい

## TL;DR

“`go
// 本番運用ではSSMとかから取る
key, _ := ioutil.ReadFile(“secret.json”)

jwtConf, err := google.JWTConfigFromJSON(
key,
// スコープ(Readonly以外見た事ない)
analytics.AnalyticsReadonlyScope,
)
if err != nil {
}

httpClient := jwtConf.Client(oauth2.NoContext)
svc, err := analytics.New(httpClient)
if err != nil {
}

res, err := svc.Data.Ga.Get(“ga:viewId入れてね”, “いつから”, “いつまで”,”ga:pageviews”).Dimensions(“ga:pagePath”).Sort(“-

元記事を表示

MFAとAssume IAM Roles を使って環境でAWS SDKをGoで操作する

# はじめに

マルチアカウント運用でAssumeRoleするかつ、MFA入力必須な場合、awscli等の操作も含めてややこしいですよね。awscliはともかく、AWS SDK for Goを使った上記の例が少いように見受けられたので残しておきます。

# 結論

MFAとAssume IAM Roles を使って環境でAWS SDKをGoで操作する方法は…

* `AssumeRoleTokenProvider` を用います
* MFAトークンを標準入力する場合は `stscreds.StdinTokenProvider` を利用すると良いです
* そうすると、下記のような入力を求められるようになります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6463/d76b4c3b-9558-1bed-df28-e12fc4e48c21.png)

# コード

例として、LambdaのCloudWatchLogsのLogStreamを検索するコードです。

“`go:As

元記事を表示

環境変数管理の便利ツール

# 環境変数管理

## 背景
秘密鍵を使うこともあり,
sample用の`.env.sample`と開発用の`.env`ファイルを分けている

`.env.sample` をコミットに残すため、こちらを正として`.env`を管理したい

## インストール方法

“`
go get github.com/locona/envdef/cmd/envdef
“`

## 使い方

### テストデータ準備
プロジェクトのルートにある.envファイルにアプリケーション構成を追加します。

“`
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
“`

プロジェクトのルートにある`.env.sample`ファイル

“`
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
REGION=REGION
“`
### 実行

次に実行します

“`
envdef
“`

その結果、`.env.new`ファイルが作成されます

“`
REGION=REGION

元記事を表示

Goでインターネット上のものではなくローカルのパッケージを使う

# 背景
Goで開発をしていて、依存ライブラリの挙動を確認するために色々仕込みたかったのでローカルにソースコードを持ってきたのですが、参照先をそっちに切り替えるのに少々ハマったので備忘録的に書きます。

# やったこと
go.modファイルを書き換えました。

以下が元々のgo.modファイル。
https://github.com/mura123yasu/cloudevents-go-helloworld/blob/master/go.mod

“`go
module github.com/mura123yasu/cloudevents-go-helloworld

go 1.14

require (
github.com/cloudevents/sdk-go v1.1.2
github.com/kelseyhightower/envconfig v1.4.0
)
“`

sdkの挙動を確かめたくてローカルを参照するように変更したかったのですが、必要なのは `replace` の記載でした。

“`go
module github.com/mura123yasu/clou

元記事を表示

HULFT IoT EdgeStreamingでプラグインを作成してみた【実行編】(3/3)

#はじめに
こんにちは。よろず相談担当 すぎもん:yum:です。
今回は、HULFT IoT EdgeStreamingのSDKを使用したコンポーネント(アダプタ)の開発をやってみようと思います。全3部作で完結するよう記載してます。

#今回やること
今回は、第3弾としてHULFT IoT EdgeStreaming Plugin SDKで開発したプラグインのビルドと実行をしてみようと思います。第1弾、第2弾の記事は、下記にありますので参考にしてみてください。

:arrow_forward: [HULFT IoT EdgeStreamingでプラグインを作成してみた【セットアップ編】(1/3)]
(https://qiita.com/sugimon/items/cf7503479c6e4c46c3b3)
:arrow_forward: [HULFT IoT EdgeStreamingでプラグインを作成してみた【開発編】(2/3)](https://qiita.com/sugimon/items/67bdd6f610e03cdfcef2)
:arrow_forward: HULFT

元記事を表示

HULFT IoT EdgeStreamingでプラグインを作成してみた【開発編】(2/3)

#はじめに
こんにちは。よろず相談担当 すぎもん:yum:です。
今回は、HULFT IoT EdgeStreamingのSDKを使用したコンポーネント(アダプタ)の開発をやってみようと思います。全3部作で完結するよう記載してます。

#今回やること
今回は、第2弾としてHULFT IoT EdgeStreaming Plugin SDKを使用してプラグインを開発してみます。他にセットアップ編、実行編の記事もあるので是非参考にしてみてください。

:arrow_forward: [HULFT IoT EdgeStreamingでプラグインを作成してみた【セットアップ編】(1/3)]
(https://qiita.com/sugimon/items/cf7503479c6e4c46c3b3)
:arrow_forward: HULFT IoT EdgeStreamingでプラグインを作成してみた【開発編】(2/3)
:arrow_forward: [HULFT IoT EdgeStreamingでプラグインを作成してみた【実行編】(3/3)](https://qiita.com/sugi

元記事を表示

HULFT IoT EdgeStreamingでプラグインを作成してみた【セットアップ編】(1/3)

#はじめに
こんにちは。よろず相談担当 すぎもん:yum:です。
今回は、HULFT IoT EdgeStreamingのSDKを使用したコンポーネント(アダプタ)の開発をやってみようと思います。全3部作で完結するよう記載してます。

#今回やること
今回は、第1弾としてHULFT IoT EdgeStreaming SDKを使用するためのセットアップ編として環境準備をしてみようと思います。既に環境あるよ~って方は、読み飛ばしていただき下記の【開発編】、【実行編】の記事を参考にしてみてください。

:arrow_forward: HULFT IoT EdgeStreamingでプラグインを作成してみた【セットアップ編】(1/3)
:arrow_forward: [HULFT IoT EdgeStreamingでプラグインを作成してみた【開発編】(2/3)](https://qiita.com/sugimon/items/67bdd6f610e03cdfcef2)
:arrow_forward: [HULFT IoT EdgeStreamingでプラグインを作成してみた【実行編】(3/

元記事を表示

OTHERカテゴリの最新記事