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

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

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

元記事を表示

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

コロナの影響で在宅勤務(テレワーク)も一ヶ月以上も続き環境の変化に慣れてきましたが、`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」はあくまでソースファイルなので実行する際にディレクトリに置

元記事を表示

OTHERカテゴリの最新記事