Go関連のことを調べてみた2019年12月02日

Go関連のことを調べてみた2019年12月02日

goのenumは文字列でいいのではないかという話

## goにおけるenumの一般的な定義

世の中で真っ当とされているgoにおけるenumの定義は、

“`go
type Zodiac int

const (
Rat Zodiac = iota // 子
Ox // 丑
Tiger // 寅
:
)
“`

ですね

とはいえ数値でJSON化されたり、ログ出されたり、DBに書き込まれたりされても、
理解が一歩遅れるので、文字列化は欲しくなるわけです。
enumを文字列化するために、`String()` 設けたりします。

“`go
func (z Zodiac) String() string {
switch z {
case Rat:
return “Rat”
case Ox:
return “Ox”
case Tiger:
return “Tiger”
:
}
return “”
}
“`

何を書かされているんだ…

という悩みを解決するために Stringer とか Apache Thrift とかがよく使わ

元記事を表示

Goで正規表現を使うときに考えたいこと

# はじめに

以前コードレビューをしたときに、日時形式のバリデーションに正規表現が利用されていたので、 `time.Parse` 使おうとコメントしました。また、それについて記事にしてみようと伝え、[記事も書いてもらいました](https://qiita.com/shohei-ojs/items/17348a282add17c65ab2)。

あらためてベンチマークを実行すると、time.Parseによるチェックが高速なことが分かります。

“`go
var validater = regexp.MustCompile(`\d{4}(/\d{2}){2} \d{2}(:\d{2}){2}`)
func BenchmarkRegexpPack(b *testing.B) {
b.ResetTimer()
for i := 0; i < b.N; i++ { validater.MatchString("2012/12/10 12:30:45") } } func BenchmarkTimePack(b *testing.B) { l

元記事を表示

Homebrew Taps 自動更新で比べる CircleCI Orbs と GitHub Actions

自分は Go で CLI ツールを作って配ることが多く、それの配布には GitHub Actions と Homebrew の [Taps repository](https://docs.brew.sh/Taps) を利用している。このリリース作業は結構面倒になので、極力自動化したい。

リリースの流派は「どこでやるか」「どのようにやるか」などの観点で、いろいろな考え方がある。

– WHERE
– 手元でコマンド一発でぜんぶやる派
– `git push –tags` から CI でやる派
– HOW
– 全部入りツールでエイッてやる(e.g. [GoReleaser](https://goreleaser.com/))
– 「一つのことをうまくやる」ツールを組み合わせる(e.g. [goxz](https://github.com/Songmu/goxz) + [ghr](https://github.com/tcnksm/ghr) + [maltmil](https://github.com/Songmu/maltmill))

自分は「CI

元記事を表示

初心者でも理解して実装できるDIP(依存性逆転の原則)

SOLID原則というオブジェクト指向設計原則があります。

S : The Single Responsibility Principle(単一責任の原則)
O : The Open Closed Principle(オープン・クローズドの原則)
L : The Liskov Substitution Principle(リスコフの置換原則)
I : The Interface Segregation Principle(インターフェース分離の原則)
D : The Dependency Inversion Principle(依存性逆転の原則)

本記事ではDの依存性逆転の原則について説明します。まだあまり知識・経験がないという方でもDIPを理解し、GoでDIPを適用した実装までできるようにかなり細かく解説しています。説明・実装に使用する言語はGo言語です。オープン・クローズドの原則についての説明記事は[こちら](https://qiita.com/masalennon/items/cc45791c7cc2ba7fac50)。

## 良い設計とは?
DIPについて説明しても、良い

元記事を表示

Ubuntu18.04でLXD3.18をビルドからコンテナのデプロイまで

# はじめに
このエントリーは,CyberAgent20新卒エンジニアAdvent Calendar 2019の2日目の記事です.
大学院の研究でLXDを取り扱っているので,LXDのビルドからコンテナのデプロイまでを紹介します.
興味があったら,ぜひやってみてください.

# 目次
1. CRIUのビルドとインストール
1. LXCのビルドとインストール
1. LXDのビルドとインストール
1. LXD起動の準備とコンテナのデプロイ

# 1. CRIUのビルドとインストール
LXDのコンテナライブマイグレーションを行うためには,Linuxのプロセスマイグレーションツールである[CRIU](https://criu.org/Main_Page)が必要です.そのため,CRIUのビルドとインストールを行います.

## CRIUのビルド準備(必要なパッケージのインストールとソースコードの取得)
ここはほとんど,[公式ページ](https://criu.org/Installation)の「Installing build dependencies」情報とおりです.

何行かに分かれていたり

元記事を表示

golang/oauth2を使ってgithubのOAuth認証用APIサーバを作ってみる(WIP)

# はじめに
この記事は、[Go4](https://qiita.com/advent-calendar/2019/go4) アドベントカレンダーの2日目になります。
OAuthの認証ってどうやって実装するのだろう。
[golang/oauth2: Go OAuth2](https://github.com/golang/oauth2)があることは知っていましたが、実際に触ったことがなかったので、今回認証用のAPIサーバを作ってみようと思いました。
時間がなくてまだWIPです。。。
[hirano00o/github-oauth-sample](https://github.com/hirano00o/github-oauth-sample)

# golang/oauth2の使い方

[oauth2/example_test.go at master · golang/oauth2](https://github.com/golang/oauth2/blob/master/example_test.go) を見ると、使い方がわかります。

簡単にまとめるとこんな感じ。

1. `co

元記事を表示

Go言語のVueライクなライブラリ、Vuguを利用したWebAssembly入門

# 概要

VueやReactにインスパイアされ、Go言語で書かれたWebAssemblyのライブラリ、Vuguが登場しました。Vuguでは、Vueのような単一コンポーネントファイルを利用して、簡単にWebAssemblyのアプリケーションを作ることができます。

– [Vugu: A modern UI library for Go+WebAssembly](https://www.vugu.org/)

ちなみに、WebAssemblyについて知りたい方は、こちらの記事などをご参照ください。

– [WebAssemblyとは?〜実際にC言語をブラウザで動かす〜【2019年6月版】](https://qiita.com/umamichi/items/c62d18b7ed81fdba63c2)

本記事では、Vuguを使ってWebAssemblyを利用したサンプルアプリケーションを作っていきます。
具体的には、GitHubのAPIを利用して、ユーザのリポジトリの一覧を表示するアプリケーションを作ります。

本記事で作成するアプリケーションの挙動を確認したい方は、以下から閲覧することが

元記事を表示

【Go】S3のファイルを取得する方法

## 環境

– Go – `1.13`

## 事前準備

`aws-sdk-go`パッケージを使用するため、`go get`する。

“`bash
$ go get -u github.com/aws/aws-sdk-go
“`

## サンプルコード

“`go
package main

import (
“bytes”
“fmt”

“github.com/aws/aws-sdk-go/aws”
“github.com/aws/aws-sdk-go/aws/session”
“github.com/aws/aws-sdk-go/service/s3”
)

func main() {
bucket := “bucket” // バケット名
path := “path/to/file” // ファイルパス

/*
* アクセスキーID・シークレットアクセスキーを直接指定する場合
*/
// svc := s3.New(session.New(), &aws.Config{
// Region: aws.String(“ap-north

元記事を表示

脱初心者Gopherのための言語仕様Tips

# はじめに
Go歴=GOPATHを通してからの年月(独断と偏見による定義)はおよそ1年半になった。
GoはRubyの次に学習したい言語、Googleが開発しているモダンな言語(2009年に設計された。Go歴が10年を超えたとかいってる輩がいたら鼻で笑ってあげましょう)、MercariやCyberAgentなど国内のメガベンチャーを筆頭に使われている言語であったりと、1年半前は非常に話題性に富む言語だった。
一方で、GoでHello Worldをすることは以下の5行で済むが、[Effective Go](https://golang.org/doc/effective_go.html)を初めから読むには難易度が高かったり、[Tour of go](https://tour.golang.org/list)はやってみたがしっくりこない感じがする人も多いのではないか。特に初心者のフェーズの次の段階で知りたい知識を体系的にまとめた文献はない気がする。

“`go
package main

import “fmt”

func main() {
fmt.Println(“Hello

元記事を表示

GoでIteratorパターンを実装する

## 概要

デザインパターンの1つであるIteratorパターンをGoで実装してみます。

## Iteratorパターンとは

Iteratorパターンは、任意のオブジェクトを集約して列挙しながら参照する時によく用いられるデザインパターンです。

forで回せないような複雑なリストを列挙したい場合などに、列挙処理を内部に隠蔽して順次に参照できるようになる利点があります。

## Goでイテレーターが使われている処理

例えばdatabase/sqlの内部実装でイテレーターが使われています。
sql.Drivers.Rowsにイテレーターが実装されていて、上流レイヤであるsql.Rowsでmutexなどを使って処理をラップしているようです。

sql.Rows
https://golang.org/src/database/sql/sql.go?s=75693:76415#L2672

sql.Drivers.Rows
https://golang.org/src/database/sql/sql.go?s=75693:76415#L2672

## 実装例

Iteratorパタ

元記事を表示

golangのAtCoder向けデバック方法

golangでAtCoder(競技プログラミング)を始めたところVSCodeでのデバッグでつまづいたのでメモ.

## TL;DR
– VSCodeのDebug機能では標準入力を受け付けられない
– testファイル内でos.Stdinをスタブし, bufio.NewScannerを再定義して解決した

## Sample Code
回答用コード.
globalでscannerを定義している.

“`main.go
package main

import (
“bufio”
“fmt”
“os”
)

var scanner = bufio.NewScanner(os.Stdin)

func nextLine() string {
scanner.Scan()
return scanner.Text()
}

func main() {
N := nextLine()
fmt.Println(N)
}
“`

テストコード.
stubしたStdinを使ってscannerを上書きし, main()を実行.

“`main_test.go
package main

元記事を表示

GolangでDBアクセスがあるユニットテストのやり方を考える

こんにちは、こちらはLinc’wellアドベントカレンダーの1日目です。

皆さんはDBに対して書き込みが発生する関数のテストをどのように行われているでしょうか?
私はgolang初心者どころかサーバサイド初心者なので、最適解が全くもって分からなかったのですが、いろいろ調べた末「こんな感じで用意すると良さそう」というテスト環境・書き方に落ち着いたのでそれをここに記します。

同じ悩みを持った方に判断基準を提供できるような記事になっていると嬉しいです。(あわよくば強い人からのフィードバック待ってます)

はじめに: どんなテストを書きたいのか
—–

はじめに要件をクリアにするためにどんなテストを書きたいのかの具体例を書きます。

ただ今私はECサイトの開発をしていて、その中で定期購入の仕組みを作っています。
定期購入はユーザが定期購入を申し込んだ際に「次にどの日付にどんな商品を購入するのか」というデータを持った Subscription というデータを作り、日次でその日の日付が指定された定期購入に応じて注文を作るバッチ処理を行う、という仕組みで作ります。

なので、テストの擬似コ

元記事を表示

Go Benchmark Toolingで実行結果の可視化機能を利用する

# はじめに

[フューチャーAdvent Calendar 2019](https://qiita.com/advent-calendar/2019/future) の1日目です。

この記事ではGoのベンチマーク機能について書いていきます。

普段わたしは業務系アプリのサーバサイド開発でGoを利用しています。いままでの経験では性能的なボトルネックはGoで書いたアプリケーションロジック部分ではなく、外部のデータストア(RDBやらAWS DynamoDB)の問い合わせ部分であることが多かったのですが、何度か非常に低速なコードを書いてしまったことがあります[^1]。そういった場合にも対応できるよう、コードのどの部分が処理負荷が高いのか切り分けるようにGoのベンチマーク機能を調査した結果を残していきます。

[^1]: 例えば、GPSの緯度経度から地域メッシュコードを特定する処理などです

# Go Benchmark 概要

Goにはtestingというパッケージやユーティリティツール(CPUなどのプロファイリングなど)が標準機能として提供されています。基本形のテストは `func T

元記事を表示

jqより便利そうなTUIツールtsonが良さげな件

ども、ゴリラです。

みなさん`jq`を使っていますか?とても便利なのでおそらく多くの方は`jq`を使っていると思います。
ぼくもその一人ですが、最近JSONをツリー状にして編集、フィルタリング、保存できたら便利では?と思い立って`tson`っていうTUIツールを作りました。
意外と便利だったので、紹介していきます。

# どんな感じ?
ウホウホウ
![tson-demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66178/6d89e430-c517-44f6-86e6-6fe3013ae853.gif)

## 対応OS
Mac/Linuxのみになります。(Windowsだと画面が崩れます)
将来的

元記事を表示

Goによる画像処理テストパターンの考察とまとめ

cover.png

この記事は [Go2 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/go2)の1日目の記事です。

こんにちは pon です。

僕はよくGoで画像処理をやるのですが、実は画像のテストに関してネットにあまり情報がありません(というかほぼない)。そこで、僕が他の画像処理パッケージのコードリーディングをしてまとめた画像処理テストの実装パターンを紹介します。

実はこの内容は Go Conference’19 Summer in Fukuokaで発表したことがあるのですが、それをより詳細な解説にしています。

## 画像のテストパターン

### 1ピクセルずつ愚直にテスト

標準パッケージやOSSなどの様々なパッケージでは

元記事を表示

GoでBMI計算機を作ってみた

# 作成したもの

https://github.com/usk81/go-pi

# 設計

BMIだけの計算するものはあったので、実際の使われ方に合わせて、年齢ごとに使用する体格指数を変えるようにしてみました

## 仕様に関して

今回は一般的になものを使いましたが、体格指数はいろいろな種類があるので、Interfaceを用意しています

“`go
type PonderalIndex interface {
Calc(weight, height float64) (result float64, err error)
}
“`

測定結果

“`go
// Result is a ponderal index calculation result
type Result struct {
Classification string
Index float64
IndexType string
Status string
}
“`

### Classification (分類) / Status

| Classi

元記事を表示

gRPCから見たHTTP/2

HTTP/3も出てきて今更感があるが、改めてHTTP/2についてまとめてみました。

# HTTP1.1とその問題点

HTTP/2誕生前から使用されているHTTP/1.1では基本的には1つのリクエストが完了しレスポンスが返ってくるするまで、次のリクエストを送ることができません。

http11.png

HTTPパイプラインという仕組みを使えばHTTP/1.1でも完了を待たずに、複数のリクエストを送信することが可能ですが
サーバーはリクエストの順番通りにレスポンスを返さなければならないという制約があります。

http11_pipeline2.pngRails10年選手がGoの勉強会に参戦してきた

# はじめに

静岡でRailsのWebエンジニアをしているkazuomatzです。2019年も残り1ヶ月を切りましたが、どうやら最近は業界的にRailsはオワコンらしいです。

僕は、2007年くらいからRailsを使ってきたので、かれこれ10年以上Railsを触ってきたことになるわけですが、オワコンなんて言われると、このままRailsを使い続けるか、それとも新しい言語に乗り換えるかの岐路に立たされているような気にもなってきます。

Railsが世の中に登場したのが2004年、2019年現在、Railsのバージョンは6.0です。2007年の12月にRailsのバージョン2が公開されていますから、かれこれ、5世代のRailsを使ってきたことになります。

# Web2.0とRailsとの出会い

ちょっと昔話になりますが、2000年半ばに「Web」はバージョン1からバージョン2にバージョンバップされました。「[Web 2.0](https://ja.wikipedia.org/wiki/Web_2.0)」です。

これまでのWeb(=Web 1.0)は、ユーザーが情報を取得するだけのも

元記事を表示

大文字小文字を区別しないという不幸な世界のワイルドカード(macOS)

# この記事について

macOS のファイルシステムは、デフォルトでは殆どのディレクトリで大文字小文字を区別しない。
そのような世界で、ワイルドカードを用いると何がマッチするか、という話。

# 大文字小文字を区別しないということ

例えばこんなスクリプトを実行すると

“`bash:bash

#!/bin/bash

set -eu

# ASCII の英数字
touch foo.txt FOO.txt
ls *.txt && rm *.txt

# 所謂全角文字
touch zen.txt ZEN.txt
ls *.txt && rm *.txt

# ギリシャ文字・キリル文字・ローマ数字
touch ωяⅶ.txt ΩЯⅦ.txt
ls *.txt && rm *.txt

# DZ, NJ
touch dz.txt # U+01F3 Latin Small Letter DZ
touch Dz.txt # U+01F2 Latin Capital Letter D with Small Letter z
touch DZ.txt # U+01F1 Latin Capital L

元記事を表示

Docker – How to Get Private Git Repository Inner Golang Container via HTTP?

You may be put your golang modules in a self-hosting git repository which likes gitlab. The most ways to tell us using ssh method and it is not easy enough (need to generate ssh key). I am just want to use https to get golang modules.

“`dockerfile
FROM golang:1.13.4-alpine



ARG GIT_URL
ARG GIT_GROUP
ARG GIT_ACCOUNT
ARG GIT_PASSWORD

RUN apk update -qq && apk –no-cache add git

RUN printf “machine ${GIT_URL}\n\
login ${GIT_ACCOUNT}\n\
password ${GIT_PASSWORD}\n”\
>> /roo

元記事を表示

OTHERカテゴリの最新記事