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

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

Go言語でKibana(Elastic Cloud)へのプロキシを作成する

この記事では App Engine Standard Environment(2nd gen) を用いて Kibana へのプロキシを作成する方法について紹介しています。

Elastic Cloud の一番安いプランで一つデプロイを持っているのですが、今回そこで可視化しているダッシュボードを不特定多数に公開したくなりました。
そこで困ったのが、Elastic Cloud には Anonymous ユーザ機能がない・・・。
ダッシュボードにアクセスさせるにはユーザにログインしてもらう必要があり、しかしパスワードとかは勝手に変更されないようにしなければならないので、みなさんどうやってるのか調べた結果、

* nginx や Apache でリバースプロキシ
* Bearer basic ヘッダーで自動でログイン
* https://{ユーザ名}:{パスワード}@yoursubdomain.yourdomain/kibana では自動ログインできないので、ヘッダーで送る必要がある(ただ、ヘッダーの方がユーザパスワードを iframe の url に書かなくていいので安心できそう
*

元記事を表示

gRPC: そもそもRPC って何?

# gRPC: そもそもRPC って何?

今回gRPC を学ぶ上で`RPC`の説明をできるようにするためにRPCとはについてご説明します。

## 概要

リモートプロシージャコール(RPC)は、分散コンピューティングのサブルーチンです。

RPCのリモート実装はローカル呼び出しに似ていますが、通常は同じではありません。

RPCでは通常、オブジェクト名、関数名、またはパラメーターがリモートサーバーに渡され、 サーバーは処理された結果をクライアント側に返します(要求/応答)。

RPCは、TCP、UDP、またはHTTPプロトコルを介して通信できます。

## Go での実装

今回はGoで server / client を実装して体験します。
Goでは、[公式ドキュメント](https://golang.org/pkg/net/rpc/)にあるように
明示的なCodecの指定をしない限り、`gob`を使用してマーシャリングされます。

### サーバーの実装
“`
package main

import (
“fmt”
“log”
“net”
“net/rpc”

元記事を表示

Go言語でのインターフェースの遅さ

## TL;DR

Go 言語において:

1. 関数のパラメータに構造体を渡したい場合、実体コピーで渡すよりポインタを使用したほうが速い。
2. ポインタのダウンキャストはオーバーヘッドが存在する。
3. インターフェースを介したメソッド呼び出しはかなり高コスト。

これらはどれも C/C++ や Java で同様の思い当たることがあるだろう。3 に関しては少し影響が大きいように見受けられ、パフォーマンスを目的として Go 言語を採用したのであればオブジェクト指向や責務の分担といった設計と両立が難しいコストとなるかもしれない。

なお筆者は Go 言語やランタイムの構造にあまり詳しくない点に注意。

## 経緯

以下のようなコードでパラメータの型 `Image` が比較的大きな構造体のポインタとなるインターフェースの場合にパフォーマンスはどうなのかという話がまずあり。

“`go
func (n Entity) LessThan(other Image) bool {
return n.Value < other.(*Entity).Value } ``` Go 言語でのス

元記事を表示

S3へファイルをアップロードするLambda関数をSAMで書く

# はじめに

この記事は、AWS SAMを用いてファイルをS3にアップロードするLambda関数を作成する記事です。

# やりたいこと

今回は、何かしらのファイル(本記事ではJSON)をS3にアップロードする処理を、AWS SAMを用いてCloutWatchイベントから定期的に発火させる、ということをやっていきます。
![スクリーンショット 2020-04-05 23.50.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264906/0831c4ce-9697-a768-098b-27c6b111db09.png)

# 開発環境

– macOS Catalina
– vim
– Golang (1.12.6)
– aws-sam-cli
– Minio

# SAMの設定

今回は[AWS SAM](

元記事を表示

goで作ったツールインストールするの面倒くさい

## goでツール作ろう

「まくる」と言うほどには作ってないけど。
ところで、go製のツールいっぱいあるけど、管理だるくない?

install は楽ちん。

“`
$ go get github.com/foo/bar
“`

で、一月ほど経った頃に、 `bar` がアップデートしたらしいことを知る。
さて、なんだっけなと思いながら

“`console
$ go get github.com/bar/bar
“`

あれ、通らねえやとなる。しょうがないので、調べてああそうだ、fooさんだったこれ、となる。
…ならまだしも、変なツールインストールしちゃったりしたら目も当てられない。

そしてさて、新しい環境作るかな、となるとこれをインストールしたツール分繰り返す。
だるい。

## homebrewっぽくしたい

作った。
https://github.com/kyoh86/gordon

“`console
$ gordon install foo/bar
$ which bar
/home/kyoh86/.local/bin/bar
$ gordon update
$

元記事を表示

PostgreSQLのNotifyを使ってGraphQL Subscriptionを実装する(バックエンド構築編)

# 前置き
**前提**

– prisma2インストール済み
– docker環境インストール済み
– 記事内のgqlgenはエイリアスに登録して使っています。
– gqlgenとprisma2のliftをある程度使っている人向け

**サンプル**
https://github.com/graphql-lab/subscription-with-postgres-notify

**こんな感じの作っていきます**
最終的にpythonのスクリプトを叩くと
異なる端末の画面がリアルタイムに更新されるというもの
これを応用すればスクレイピングした結果を定期的にwebサイトにつぶやかせる、というbotが
作れるかと
![subscription.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224153/764903ec-199e-224e-6ae3-b07de328deea.gif)

# 下準備
`gqlgen init`からビルドし、必要なディレクトリを作って…とやっても良いのですが
今回は

元記事を表示

S3バケット別概算コスト算出ツールを作ってみた

# はじめに

S3って安価なストレージなので、容量気にせずとりあえずなんでも格納して放置なんてことが多いですよね?
将来的に分析するかもってことでデータレイクに蓄積して結果使わないなんてことも多い。(my観測範囲)

で、新型コロナウィルスの影響で先行き不安な状況なので、収束まではどうにか支出を抑えて凌ぎたい。。
という人も多いと考え、S3バケットごとに要否判断(&不要であれば削除)しやすいように、S3バケットごとに
使用量/概算コストを簡単に一覧表示するツールを作ったので、紹介します。

# ツール概要

一言で言えば、
`全リージョン/全バケット別にオブジェクト数/使用バイト数/概算月額料金を出力するツール`
です。(誰かが作ってそうなんですが探してもなかったので作りました)

[CloudWatchからバケットサイズなど取得できる](https://dev.classmethod.jp/articles/s3-cloudwatch/)ようになってるので、それを実行すればawscliでも取得できる
のですが、リージョン指定しないといけないとか、メトリクス/ディメンションを指定する

元記事を表示

AtCoder Beginner Contest 161 参戦記

# AtCoder Beginner Contest 161 参戦記

## [ABC161A – ABC Swap](https://atcoder.jp/contests/abc161/tasks/abc161_a)

3分で突破. 書くだけ. オンラインのコードテストが詰まってて時間がかかってしまった.

“`python
X, Y, Z = map(int, input().split())

X, Y = Y, X
X, Z = Z, X
print(X, Y, Z)
“`

## [ABC161B – Popular Vote](https://atcoder.jp/contests/abc161/tasks/abc161_b)

4分で突破. 閾値が総投票数の 4 * M 分の一なのでまずそれを求め、その閾値を超える票数の商品がM個以上あるかを調べる. オンラインのコードテストが詰まってて時間がかかってしまった.

“`python
N, M = map(int, input().split())
A = list(map(int, input().split())

元記事を表示

Protocol Buffersのメッセージ定義からHTMLのフォームを生成してみる実験

# はじめに

HTMLでフォームを作るのは技術的には簡単なのですが、何度もやることになると作業の重複が多くなって疲れるかと思います。ここではProtocol Buffersを用いてフォームの表示と処理の自動化を試みてみます。実運用するには足りない点も多々ありますので、一つの実験として読んでみて頂ければと思います。

コードは https://github.com/yt76/pbforms にあるので、cloneして(もしくはcloneしたつもりになって)お読みください。 

# Protocol Buffersによるフォームの定義

例えば、名前(string)と年齢(int32)と同意の有無(bool)を取得したいとします。このメッセージを my_form.proto というファイルにあるように次の内容で定義します。

“`
message MyForm {
optional string name = 1;
optional int32 age = 2;
optional bool agree = 3;
}
“`

元記事を表示

もう二度と迷わない!絶対にバグらない二分探索の実装法

# この記事について
二分探索アルゴリズムの概念自体はかなり基本的なものですが、いざ実装するとなると「ここのif文やwhile文の条件には=を入れていいんだっけ?」「leftやrightを動かすときはmiddle+1だっけ?middleそのままだっけ?」などたくさんの迷いポイントがあります。
この記事では、考えられる二分探索アルゴリズム全ての実装についてユニットテストを実施して結果を載せ、そこから見えるアルゴリズムの詳しい挙動について考察します。
この記事を全て読んだときには、正しい実装はどうすればいいのかきっちり覚えるはずです。

## 前提条件
– アルゴリズムの実装はGo(ver1.14)で行います。
– 考察すっ飛ばして結果だけ知りたい方は本記事の末尾まで一気に飛ばしてください。

## 読者に要求する前提知識
– 二分探索アルゴリズムの概要がわかっていること。(本記事では解説しません)

# ループ条件一覧
二分探索の実装でポイントになる箇所は大きく4箇所です。

“`golang
func bisect(array []int, key int) {
var left,

元記事を表示

GormでIN、OR、UNION ALLのクエリ書いてみた

Gormで色々とクエリ書いて見て少し理解したのでメモ

UNION ALLに関しては公式にそれらしいものがなかったので独自で書いてみた

“`user.go
package domain

import “time”

type User struct {
ID string
Name string
CreatedAt time.Time
UpdatedAt time.Time
}
“`

“`repository.go
func (repo *Repository) FindAllByNames(names []string) ([]*domain.User, error) {
var users []*domain.User

// IN
// SELECT * FROM `users` WHERE (name IN (‘taro’,’hanako’))
repo.db.Debug().Find(&users, “name IN (?)”, names)

// OR
// SELECT * FROM `use

元記事を表示

Go言語の環境構築

# Go言語の環境構築

備忘録がてら

## 実施環境
– macOS Catalina 10.15.3

## Home brewのインストール

割愛

## Goのインストール

“`
$ brew install go
$ go version
go version go1.13.8 darwin/amd64
“`

## GoPathの設定

“`bash

$ mkdir $HOME/go
$ vi ~/.bash_profile

以下を追加
————————————
export GOPATH=$HOME/go
export PATH=$PATH:$HOME/go/bin
————————————

$ source ~/.bash_profile
“`

## vscodeの設定

– Goの拡張機能を追加
– 便利ツールたちの追加
– shift + command + P
– Go install/Update Tools をクリック

元記事を表示

web開発独学のためのロードマップと参考資料

# WEB開発
友達のために最初の取っ掛かりのためのカリキュラムを書きます。
これを見ながら勉強の方針を立て、それをもとに自分で検索して、いろいろな勉強サイトを使って勉強していく感じで。
全部やろうとしなくていいです。
随時更新予定。
環境はwindowsを想定してます。

## はじめに
プログラミングは挫折しやすいです。
すべてを理解しようとはせず、ある程度できたらアウトプットしてまた次の新しいものを学び、飽きたり挫折したりしないようにがんばりましょう。
ググってもわからないことがあったら、なるべく早めにできる人に聞くといいと思います。
時間を無駄にしている可能性が高いです。

## 開発環境構築
まずは自分のパソコンにプログラミングをする環境を作ります。

#### [VSCode](https://code.visualstudio.com)をインストール
これはエディタです。これを使ってプログラムを書いていきます。
便利な拡張機能を紹介
* Bracket Pair Colorizer(括弧に色がつく)
* ESLint
* HTML CSS Support
* HTML

元記事を表示

Go database/sql(コネクションプール/タイムアウト)

# はじめに
本記事は、[前回](https://qiita.com/taka23kz/items/cb7ae9ac6cf343b3dec2)の続きで、database/sqlに関するメモです。

– コネクションプール
– クエリーのタイムアウト

DBMSにはpostgreSQLを使っています。

## コネクションプール sql.DB
コネクションプールってどうやるんだっけと調べてみました。
ドキュメントを確認していると、[sql.Open](https://golang.org/pkg/database/sql/#Open)に該当する記述を見つけました。

>The returned DB is safe for concurrent use by multiple goroutines and maintains its own pool of idle connections. Thus, the Open function should be called just once. It is rarely necessary to close a DB.

「sql

元記事を表示

Go+Google Cloud Logging

Go の勉強がてら Google Cloud Logging を使ってみた。
以下の記事で触れられているログをリクエストログに紐づいて表示させられるようにもしてある。

* [AppEngineの旧Log APIを脱却したい話](https://tech.mercari.com/entry/2019/05/22/122803)
* [GAE のログに憧れて](https://medium.com/google-cloud-jp/gae-%E3%81%AE%E3%83%AD%E3%82%B0%E3%81%AB%E6%86%A7%E3%82%8C%E3%81%A6-895ebe927c4)

“`go:gclog.go
package gclog

import (
“context”
“fmt”
“os”
“runtime”
“strconv”
“strings”
“time”

“cloud.google.com/go/logging”
“github.com/gin-gonic/gin”
mrpb “google.golang.org/genproto/goog

元記事を表示

Go+Google Cloud Firestore

Go の勉強がてら Google Cloud Datastore へ読み書きする簡単なプログラムを作成したため共有する。
Go は Java と比べてリフレクション周りが癖があって扱いにくかった。
あと、オーバーロードがないのが辛い。

“`go:fb.go
package fb

import (
“context”
“fmt”
“reflect”

“cloud.google.com/go/firestore”
firebase “firebase.google.com/go”
“google.golang.org/api/iterator”
)

type Document interface {
ID() string
SetID(id string)
Collection() string
}

func NewApp(ctx context.Context) (*firebase.App, error) {
return NewAppWithProjectID(ctx, “your project id here.”) // FIXME
}

func

元記事を表示

Go+Google Cloud Datastore

Go の勉強がてら Google Cloud Datastore へ読み書きする簡単なプログラムを作成したため共有する。
Go は Java と比べてリフレクション周りが癖があって扱いにくかった。
あと、オーバーロードがないのが辛い。

“`go:ds.go
package ds

import (
“context”
“fmt”
“reflect”

“cloud.google.com/go/datastore”
)

type Entity interface {
EntityKey() *datastore.Key
SetEntityKey(key *datastore.Key)
EntityKind() string
}

func NewClient(ctx context.Context) (*datastore.Client, error) {
return NewClientWithProjectID(ctx, “your project id here.”) // FIXME
}

func NewClientWithProjectID(ctx co

元記事を表示

[Golang]テスタブルな現在時刻取得処理を作る

# はじめに
backendサービスを作っていると大抵どこかしらで現在時刻`time.Now()`を取り扱うことになると思います。
しかし`time.Now()`の値は、刻一刻と変わる値なので`time.Now()`を使用する関数のtestを書く際には必ず
`time.Now()`の値を固定化する手段を必ず作っておかなければなりません。

Perlの場合は`Test::MockTime`、Rubyの場合は`timecop`、Pythonの場合は`FreezeGun`のようなlibraryを使ってmockしますが
Goの場合この`time.Now()`を固定化するためにどうすればよいのか幾つか方法を試したので紹介します。

# monkey.Patch()
まずは [monkey.Patch()](https://github.com/bouk/monkey)を使う方法。

**注意:一応書いておきますが、おすすめの方法ではありません。**
monkey.Patch()は実行時に実行ファイルを書き換えて、mockしたい関数を呼び出すイリーガルなツールです。
既に実装されているプロダクト

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事