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

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

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
“`

## Usage

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

“`
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
“`

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

“`
S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE
REGION=REGION
“`

次に実行します

“`
envdef
“`

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

“`
REGION=REGION
S3_BUCKET=YOURS3

元記事を表示

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/

元記事を表示

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

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

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

# ■ Memento(メメント・パターン)
「Memento」という英単語は、「形見・記念」を意味します。
このパターンは、あるオブジェクトの任意の時点の状態を覚えておき(保存)、 後でその状態にオブジェクトを戻すための工夫を提供するパターンです。(カプセル化を破壊せずに、状態を元に戻せる)つまり、テキストエディタ等で実装されているような「アンドゥ」(操作をキャンセルして操作前の状態に戻す)機能を提供

元記事を表示

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

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

# ■ Mediator(メディエーター・パターン)
「Mediator」という英単語は、「仲介者」を意味します。
このパターンは、複雑に絡み合った複数のオブジェクト間の関係を、必ず「仲介者」を介して処理を行う様にすることで単純かつ明快なインタフェースを提供するパターンです。つまり、「Mediator」パターンとは、管轄下にある複数のオブジェクト各々からの問い合わせを受け、適宜判断を行い、管轄下にあるオブジェクト全体、または一部へ指示を出す「仲介人」の役割を果たすクラスを利用するパターンです。

## UML class and sequence diagram
![W3sDesign_Mediator_Desig

元記事を表示

「autorest」および「go-autorest」とは?

「[Azure SDK for Go documentation](https://docs.microsoft.com/ja-jp/azure/developer/go/)」サイトの「[Install the Azure SDK for Go](https://docs.microsoft.com/ja-jp/azure/developer/go/azure-sdk-install)」ページを読み進めています。

「[Include the Azure SDK for Go in your project](https://docs.microsoft.com/ja-jp/azure/developer/go/azure-sdk-install#include-the-azure-sdk-for-go-in-your-project)」セクションにて、GoでAzure サービスを使うには [Azure/azure-sdk-for-go](https://github.com/Azure/azure-sdk-for-go) とは別に [Azure/go-autorest](https:

元記事を表示

Golang入門.2 -http.Handleの実装を見る-

## はじめに
 [Golang入門.1 -http.HandleでHello World!-](https://qiita.com/ryuji0123/items/17bde94e206a89f79d77)の続きです。

## 今回のテーマ
 `http.Handle`関数の処理を追いかけます。なお、今回も以下のコードを参照しますが、メインは`http.Handle`関数のソースコードです。

[github] (https://github.com/ryuji0123/go-samples/blob/master/mux.go)

“`go:mux.go
package main
import (
“fmt”
“net/http”
)

type HelloHandler struct{}

func (h *HelloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, “Hello World!”)
}

func main() {

元記事を表示

Go言語でDBアクセス(database/sql)

#はじめに
本記事はGo言語でのDBアクセス(select/insert/updateとトランザクション制御)に関するメモです。DBMSとしてpostgreSQL、ライブラリは標準のdatabase/sqlを使っています。

##database/sql
[database/sql](https://golang.org/pkg/database/sql/)は、Go言語のデータベースアクセス用の標準パッケージです。
database/sqlでは、アプリケーションに対して、DBを操作するためのインターフェースを提供しています。
下図に示したとおり、DBへの実際の操作を行うのはdbDrvierで、アプリケーションからドライバを直接扱うことはしません。

![](http://yuml.me/diagram/class/[Application]->[database/sql]->[dbDriver]->[DataBase])

##database/sqlを使ったDB接続
database/sqlでDB接続するには、database/sqlとDBドライバをimportして、sql.Ope

元記事を表示

Golang コマンドラインツール

## プログラム引数
– プログラム引数とは
– プログラム実行時に渡される引数
– プログラムに対して外から渡されるデータや情報
– コマンドライン引数 = プログラム引数

`$ echo hello`では`hello`がプログラム引数となる

### プログラム引数を取得する
– `os.Args`を使用する
– プログラム引数が入った文字列型のスライス
– 要素の1つ目はプログラム名

“`sample.go
func main() {
fmt.Println(os.Args())
}
“`

“`
$ ./main hello world
[./main hello world]
“`

### flagパッケージ
フラグ(オプション)を便利に使うパッケージ

“`sample.go
func main() {
msg := flag.String(“msg”, “unknown”, “メッセージ”)
n := flag.Int(“count”, 0, “繰り返す回数”)

flag.Parse(

元記事を表示

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

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

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

# ■ Iterator(イテレータ・パターン)
Iteratorパターン(イテレータ・パターン)とは、GoF(Gang of Four; 4人のギャングたち)によって定義されたデザインパターンの1つである。コンテナオブジェクトの要素を列挙する手段を独立させることによって、コンテナの内部仕様に依存しない反復子を提供することを目的とする。

## UML class and sequence diag

元記事を表示

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

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

# ■ Command(コマンド・パターン)
Command パターン(英: command pattern)はオブジェクト指向プログラミングにおけるデザインパターンの一つで、動作を表現するオブジェクトを示す。Command オブジェクトは、動作とそれに伴うパラメータをカプセル化したものである。
例として、印刷を行うライブラリが PrintJob クラスを備えているとする。ライブラリのユーザーは新たに PrintJob オブジェクトを作成し、パラメータ(印刷するドキュメント、印刷部数など)をセットし、最後にプリンターにジョブを送信するメソッドを呼び出す。

## UML class and sequence diagr

元記事を表示

yukicoder contest 241 参戦記

# yukicoder contest 241 参戦記

# A 1009 面積の求め方

8分半で突破. ヒント通り区分求積法でスパッと解いてみた. 区間をどれくらいの数で割ればいいのかに悩んだが、適当にえいやで4096でやったら一発目で良さげな精度が出たので、提出してみたら無事 AC.

“`python
a, b = map(int, input().split())

x = a
result = 0
t = 1 / 4096
while x < b: result += abs((x - a) * (x - b) * t) x += t print(result) ``` # B 1010 折って重ねて 41分で突破. 整数で処理するコードを書いて、なんで AC しないんだと延々と悩んでいた. アホすぎる. 縦と横で短い方を限界まで折ってから、長い方を限界まで折ればいい. ```python x, y, h = map(int, input().split()) if x < y: x, y = y, x x *= 1000 y *= 10

元記事を表示

OTHERカテゴリの最新記事