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

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

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.png大文字小文字を区別しないという不幸な世界のワイルドカード(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

元記事を表示

Goでつくるdaemon処理レシピ集

本記事は、アドベントカレンダー [Go4](https://qiita.com/advent-calendar/2019/go4) の1日目の記事です。

## これは何?

みなさんは、どんなdaemon処理を書いていますか?

ここでは、Go の daemon 処理サンプルを紹介します.
daemon とは、バックグラウンドで動作するプロセス実行し続けるアレで、typoに注意なやつです(いつもdeamonと書いてしまう).

Goではその言語特性から、様々な処理をシンプルに記述しやすいと感じており、daemonの実装例を通してGoらしさを学ぶことにも役立つと思います.
他にも役立つレシピがあれば、教えて下さい :smiley:

## まずは基本から

### 単純に無限実行させる

[The Go Playground](https://play.golang.org/p/RfaXcXsdMd2) で実行してみる

“`Go
func main() {
timeout := 5 * time.Second
ctx, cancel := context.WithTime

元記事を表示

Goのstruct(構造体)はフィールドなしでも定義できる

# 概要

タイトルのままです。

フィールドなしでメソッドだけ定義したかったのですが、パッと調べてもわからなかったので、実際に試して知りました。

『そんなもん知ってるわ!!』という方はブラウザバックどうぞ

# 検証結果

“` go:main.go
package main

import (
“log”
)

func main() {
n := Network{}
log.Print(n.CreateURL())
}

type Network struct {
}

func (n *Network) CreateURL() string {
// TODO: 引数を受け取ってURLを返す
return “https://github.com/”
}
“`

“`bash:実行結果
# go run main.go
2009/11/10 23:00:00 https://github.com/
“`

# 実際に動かせる

こちら =>

https://play.golang.org/p/cuQNOBeEdK_R

元記事を表示

Go Modules 依存パッケージを一括アップデートする

## はじめに

Goのパッケージ管理はGo Modulesを使っていますが、何もわからない・・・
最新版に追従するため`npm update`みたいなことをしたいけどわからない・・・

## アップデート方法

@propellaさんの[記事](https://qiita.com/propella/items/e49bccc88f3cc2407745)を参考に`go get -u`を実行してみました。

“`
$ go get -u
go get .: path /Users/naoki/go/src/github.com/oke-py/usn-api is not a package in module rooted at /Users/naoki/go/src/github.com/oke-py/usn-api
“`

どうやらうまくいっていません。検索して見つけた[Issueコメント](https://github.com/golang/go/issues/34058#issuecomment-527951591)を参考にします。

“`
$ go get -u all

元記事を表示

Go: DepからGo Modulesへの移行

## はじめに
`Go modules`はGo1.13(August 2019)から正式に導入されたGo言語公式の依存パッケージ管理ツールです。`Go modules`以前は、`dep`が依存パッケージ管理のツールとしてはデファクトでした。`Go modules`はGo1.11から使用は可能でしたが、環境変数(ENV GO111MODULE=on)を設定したり色々と手間がかかる事前準備が必要でした。Go1.13からはデフォルトで`Go modules`が組み込まれています。

## そもそもGo Modulesとは何?
Goの新しい依存管理システムである。
モジュールは、一つのユニットとしてバージョン管理されている関連Goパッケージの集まり。1.11からはmoduleモードとGOPATHモードが使えるようになっていましたが、1.13からはmoduleモードがデフォルトでONになっています。Goのオープンソースモジュールのエコシステムをより良く活用できるように、moduleモードがデフォルトで動作するようにしているそうです。
[Golang.org: modules](https://b

元記事を表示

[Go]context.WithTimeoutとcontext.WithDeadlineの違い

## context.WithDeadline

コメントを引用すると、以下のように書いてある
> WithDeadline returns a copy of the parent context with the deadline adjusted to be no later than d. If the parent’s deadline is already earlier than d, WithDeadline(parent, d) is semantically equivalent to parent. The returned context’s Done channel is closed when the deadline expires, when the returned cancel function is called, or when the parent context’s Done channel is closed, whichever happens first.
>Canceling this context releases resour

元記事を表示

ニフクラ用の Terraformカスタムプロバイダを書いてみた(未完)

## 概要

先日[記事](https://qiita.com/shztki/items/d3fa879457f420c4c65a)に書いたニフクラ用Terraform Provider について、中途半端なところではありますが開発を終了しました。
ニフクラを利用する職場を離れたため、今後は動作検証もできないので、ここまでとなりました。

[ニフクラ用Terraform Provider](https://github.com/shztki/terraform-provider-nifcloud)

予定通りロードバランサー、付替IPアドレスまでは追加できたので、作成可能なリソースは最終的に以下のようになりました。

| リソース | ステータス | 備考 |
|—|—|—|
| サーバー | ok | インポートやコピーは作っていません |
| ディスク | ok | |
| ネットワーク・セキュリティ | ok | SSHキーインポートのみ |
| OSイメージ | ok | |
| ロードバランサー | ok | SSL関連は未検証 |
| マルチロードバランサー |

元記事を表示

ASTでドキュメントコメント(Docフィールド)を取得する際にハマった

`”go/parser”` でパースしたASTから、Docフィールドを取ろうとしてちょっとはまったのでメモ

GitHub のIssueによると [^1]
type の前につけたドキュメントコメントは、`ast.TypeSpec` ではなく、`ast.GenDecl` の `Doc`フィールドにつくよという話。

[^1]: GitHub Issue [go/ast: TypeSpec.Doc is nil? Have to grab documentation at GenDecl #27477](https://github.com/golang/go/issues/27477)

“`go
// doc comment
type Foo struct {
}
“`

“`go
// このコメントは GenDecl.Doc につく
type A struct {
}

// このコメントは GenDecl.Doc につく
type (
// このコメントが TypeSpec.Doc につく
B struct {
}
)
“`

動作確認のソース [G

元記事を表示

Github actionsでgo mod download, test, lint

# Github Actions
https://github.co.jp/features/actions
GithubのCI/CDサービス

# モチベーション
現職ではほとんどcircleciで回しているが、Github actionsが便利ということを聞いたので試した。
go.modのキャッシュの問題などあり、実際にやってみて記事としてこれ持って来ればOKみたいのが見当たらず、
githubでpublic repoを徘徊したので、最低限自分にあったやり方をまとめておきたい

# workflow
stepなどはほぼ他のciサービスと同じだと思うので割愛
実際のyamlは以下

“`github/workflows/ci.yaml
// 好きな名前
name: golang_ci
// フック
on: [push]

jobs:
build:
name: all
runs-on: ubuntu-latest
steps:
# GOPATHなどのセットアップ
– name: set up
uses: action

元記事を表示

04. 元素記号

## 04. 元素記号
“Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.”という文を単語に分解し,1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭に2文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.

###Go
“`go
package main

import (
“fmt”
“strings”
)

func main() {
var src = “Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.”;
var dw = map[int]bool{1: true, 5

元記事を表示

DockerでGoのRestAPIを作ってみた(ホットリロード対応)

dockerでGolangのAPIを作りたいと思いましてやってみました。
ちなみに、dockerはホットリロードさせたかったので、docker-composeを使っています。

#環境
それぞれのバージョンはこちら。
Dockerについての説明とかは省きます。

“`console
$ docker-compose –version
docker-compose version 1.24.1, build 4667896b

$ go version
go version go1.13.4 darwin/amd64
“`
■ echo 4.1.11 (ルーティングが便利になるかな、と)
  公式はこちら https://echo.labstack.com/guide
  以下によると、RestAPIに最適化されているらしー。
   https://rightcode.co.jp/blog/become-engineer/go-flamework

■ oxequa/realize
  ホットリロードを行うために入れてみた。

#ファイルの準備
適当なフォルダに以下の3ファイルを用

元記事を表示

構造体へのインターフェースの埋め込み

構造体へのインターフェースの埋め込みについての知識に漏れがあったので、調べたことをまとめました。

Goでは、インターフェースの明示的宣言はなく、インターフェースの持つメソッドを実装することでそのインターフェースを満たしていることになります(ダックタイピング)。

しかし、実はインターフェースを構造体に埋め込むことでも、例えその構造体はインターフェースの持つメソッドを持っていなくても、そのインターフェースを満たしていることになります。

下記のコードでは、user構造体はUserInterfaceを持っているのでUserInterfaceのもつFullName()を持っていなくてもUserInterfaceを満たしていることになります。よって、下記のコードはビルドが通ります。

“`Go
func main() {
taro := testUser{
firstName: “Taro”,
lastName: “Yamada”,
}
outputUser(taro) //testUserがUserInterfaceを満たしているため、taroをoputputUserに渡

元記事を表示

MySQL/PostgreSQLに対応したdump/recreate/validateツールを作りました

## 概要
– MySQL/PostgreSQLに対応したdump/recreate/validateツールを作りました。
– Dump機能はデータベース単位でDDLを生成し、テーブル毎にDDL+Insert文を出力します。
– Recreate機能はデータベースをDrop and Restoreすることでdumpファイルが正常に復元できることをチェックします。
– Validate機能はテーブル単位でCheckSumまたはMD5値を取得して保存し、リストア前後でデータの欠損や変更がないことをチェックします。
– [github.com/m22r/chronicle](https://github.com/m22r/chronicle)にてコードを公開してます。

## インストール方法
“`sh
$ git clone git@github.com:m22r/chronicle.git
$ make build
“`

## 使い方
### dump
“`
Store dump files of all databases and tables

Usage:
chroni

元記事を表示

SSMパラメータストアに対するアクセス検知ツール

## 概要
– SSMパラメータストアに対するアクセス検知ツールを作りました。
– 任意の期間中のアクセスをCloudTrail APIから取得し、ユーザ名、UserAgent, 対象のパラメータ, 期間中のアクセス件数, ソースIPアドレスなどをSlackに通知します。
– [github.com/m22r/doberman](https://github.com/m22r/doberman)にてコードを公開しています。

## slackへの通知サンプル

### terraformでSSMパラメータ内の値を閲覧したときの通知内容
doberman.png

### 対象期間中にアクセスがなかった時の通知内容
doberman2.png

  • OTHERカテゴリの最新記事