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

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

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

元記事を表示

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

元記事を表示

Go と C++ の可変長引数

# 動機

go の syscall パッケージには、

“`go:go
func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
“`

のように、引数の数に応じて関数が用意されている。

go には可変長引数という素晴らしい仕組みがあるのになぜ? もしかして可変長引数遅いの? と思って今日も楽しいマイクロベンチマーク。

# ソースコード

## go

まあソースコードから。

“`go:go
package main

import (
“fmt”
“os”
“strconv”
“time”
)

func vari6(n …uintptr) uintptr {
return n[0] + n[1] + n[2] + n[3] + n[4] + n[5]
}

func fixed6(a, b, c, d, e, f uint

元記事を表示

Kubernetesで和牛を給付する

# Motivation
コンテナ管理基盤であるKubernetesには、Kubernetes Operatorという概念があり
任意のオブジェクトをKubernetes上で管理することができる。
このKubernetes Operatorを用いると和牛も管理することができるので給付してみる。

ここで、Kubernetes Operatorを開発するツールは、下記の通りいくつか存在しているが
エコシステムが充実しているOperator SDKを採用した。

[Operator SDK](https://github.com/operator-framework/operator-sdk)
[Kubebuilder](https://book.kubebuilder.io/)
[Metacontroller](https://metacontroller.app/)

# QuickStart
## 環境
– [kind](https://github.com/kubernetes-sigs/kind)
– Docker
– Mac

## 和牛の配り方
### [Quay.ioの

元記事を表示

Goの複素数を触ってみた

自分でGo関連の情報を収集してたら、Goだと複素数が組み込みで入ってるらしいので、触ってみることにした。

# やること
シンプルに複素数の積と偏角の和の性質を確かめる。
その過程で使える便利関数を探してみる。

## 角度計算をしてみたコード

“`go
package main

import (
“fmt”
“math”
)

func main() {
const X complex128 = complex(1,1)
ratio := real(X)/imag(X) // 実部と虚部を取り出して比を計算
const radian := math.Atan(ratio) // 比からタンジェントの逆関数で偏角を計算
fmt.Println(radian * 180 / math.Pi) // ラジアンから度数に変換 45度になる
}

“`
複素数型である complex128 を宣言して、
real関数: 実部を取得
imag関数: 虚部を取得

と、組み込み関数で簡単に取り出せるのはすごく楽
ただ、探した感じラジアンを度数法に変換する組み込み関数は

元記事を表示

アプリケーション間でRequestIdを送りあってみる

# やりたいこと
サービスが複数またがってている場合、運用時にサービス間を跨いだログを見たくなる時があるので、その方法をかく。
順番は
1. Spring BootでRequestIdを生成して、ログファイルに出しておく
2. 他アプリケーション(今回はGin)に対して、リクエストを投げる
3. Gin側でRequestIdを受け取る

ソース
[Spring Boot](https://github.com/ririkku/spring-log-demo)
[Gin](https://github.com/ririkku/go-sandbox/tree/master/gin-nginx-sample)

# 環境
– Java
– Spring Boot
– Go
– Gin

# Spring Boot側にRequestIdの設定を入れる

## ログファイルにRequestIdが表示されるようにする

MDCを使用して、リクエスト毎にUUIDを生成して、ログに仕込めるようにしておく

“`SampleFilter.java
import org.slf4j.MDC;
impor

元記事を表示

Golangで、デザインパターン「Chain of Responsibility」を学ぶ

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

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

# ■ Chain of Responsibility(チェーン オブ レスポンシビリティ・パターン)
「Chain of Responsibility」という英単語は、「責任の連鎖」を意味します。
このパターンは、ある要求の受取り対象となる複数のオブジェクトに鎖状の関係を構築し、要求を処理する事が可能なオブジェクトに渡るまで、順次、構築し

元記事を表示

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

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

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

# ■ Proxy(プロキシ・パターン)
Proxyパターンは、プログラミングにおけるデザインパターンの一種。Proxy(プロキシ、代理人)とは、大まかに言えば、別の物のインタフェースとして機能するクラスである。その「別の物」とは何でもよく、ネットワーク接続だったり、メモリ上の大きなオブジェクトだったり、複製がコスト高あるいは不可能な何らかのリソースなどである。
Proxyパターンのよく知られている例として、参

元記事を表示

gormとgolang-mitateでオートマイグレーションをやってみた

# gormとgolang-mitateでオートマイグレーションをやってみた

goのマイグレーション探してたらgolang-migrateが良さそうだったので使ってみた

https://github.com/golang-migrate/migrate

今回やったのはgormを使った場合の実装
https://github.com/jinzhu/gorm

## パッケージ構成
“`
.
├── cmd
│   └── main.go
├── internal 
│   └── infrastructure
│      └── sql_handler.go
└── migrations
   ├── 20200319010701_create_table.down.sql
   └── 20200319010701_create_table.up.sql
“`

## マイグレーションファイル
“`20200319010701_create_table.up.sql
CREATE TABLE sample(
id VARCHAR(26) PRIMARY

元記事を表示

OTHERカテゴリの最新記事