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

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

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についての説明とかは省きます。

“`
$ 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.pngGolangでRDSをPITR(ポイントインタイムリカバリ)するCLI

## 概要

– RDSのポイントインリカバリを簡単に実行するツールをGoで作りました。
– 復元元のDBインスタンス/クラスターの設定を復元先にも引き継ぐようにしています。
– [github.com/m22r/phoenix](https://github.com/m22r/phoenix)にてコードを公開してます。

## インストール方法
“`sh

$ git clone git@github.com:m22r/phoenix.git
$ make build
“`

## 使い方
“`sh

$ ./phoenix -h
Point In Time Recovery Tool for Amazon RDS, Aurora

Usage:
phoenix [flags]
phoenix [command]

Available Commands:
help Help about any command
version Print version

Flags:
–cluster If y

元記事を表示

GOMODULE–Goのパッケージ管理

# Goのパッケージ管理
![go-lenguaje-programacion-google-blog-hostalia-hosting.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320164/709728cb-f955-9459-d0e5-8242e5911a8c.jpeg)

GOMODULEが誕生される前に `GOPATH` と `GOVENDOR`を使用してパッケージの管理をするのが一般的でした。

`GOPATH` : Go言語一度でも使用したことがあれば、お馴染みがあると思います、`GOROOT`と一緒に、Go言語の環境構築時にセットしてると思います。また、配下に `src`フォルダが存在することが必須とされています

`GOVENDOR`: パッケージ管理を専門フォルダー`vendor`に一任する、 `glide, dep,go dep…`などの管理ツールもあります

でも、どっちを使用しても、便利とは言えない

– GOPATH
– 全てのプロジェクトは`src`に置かな

元記事を表示

03. 円周率

## 03. 円周率
“Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.”という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.

###Go
“`go
package main

import (
“fmt”
“regexp”
“strings”
)

func main() {
var src string = “Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.”
var wlen []int
rex := regexp.MustCompile(“([a-zA-Z]+)”)

// 単語に分割
words := strings.Split(src, ” “)
for _, word := range words {
// アルファベットの

元記事を表示

02. 「パトカー」+「タクシー」=「パタトクカシーー」

## 02. 「パトカー」+「タクシー」=「パタトクカシーー」
「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.

###Go
“`go
package main

import (
“fmt”
“strings”
)

func main() {
var p1 string = “パトカー”;
var p2 string = “タクシー”;
var result string;

// 文字を配列にする
p1s := strings.Split(p1,””);
p2s := strings.Split(p2,””);

// 配列数ループ(「パトカー」に合わせる。同じ文字数だから・・・)
for i := range(p1s) {
// 各文字を1文字づつ連結
result += p1s[i] + p2s[i];
}

// 結果を表示
fmt.Println(result);
}
“`

###python
“`python
# -*- coding: utf-8 -*-
p1 = u”パトカー”

元記事を表示

Golang Mac環境構築メモ

Goのバージョンを混在させるためgoenvからGoを入れる

“`
brew install –HEAD goenv
“`

更新時

“`
brew upgrade –fetch-HEAD goenv
“`

bash_profileにgoenv関連のパスを通しておく

“`
vim ~/.bash_profile
“`

以下を記載して`:qw`

“`
#goenv
export PATH=”$HOME/.goenv/bin:$PATH”
export GOPATH=$HOME/go
eval “$(goenv init -)”
“`

bash_profileの変更を反映

“`
source ~/.bash_profile
“`

goenvコマンドが叩けることの確認

“`
goenv -v 
“`

ここからGoの構築
goenvでインストールできるGoのバージョンを確認

“`
goenv install -l
“`

バージョン指定で入れる

“`
goenv install 1.11.4
“`

有効なバージョンに今回入れたバー

元記事を表示

mockeryのOn()にはTimes()を指定しよう

## TL;DR
https://github.com/vektra/mockery のmock指定時の注意点。

1. 同じ引数
2. 返り値が場合によって異なる

の条件を満たすmockを使いまわす場合は `On()` のメソッドチェーンで `Times()` をつける。
それが難しければ `t.Run` のなかで `new` すること。

回数を指定しない場合 `On()` の上書きが効かないので、最初にセットされた `Return()` を返し続けることになる。

## 例

“`Go
func TestHoge(t *testing.T) {
mockFoo := new(mocks.Foo)
mockBar := new(mocks.Bar)

t.Run(“test – first”, func(t *testing.T) {
mockFoo.On(“FuncA”, mock.Anything).Return(1)
mockBar.On(“FuncB”, 1).Return(1)

// テストコード
})
t.Run(“test –

元記事を表示

Slackで誰かの承認をもらえたらRDSにクエリ実行して結果を返す仕組み

## 概要
– SlashコマンドでAWSのアカウントがなくてもRDSにクエリ実行する仕組みを作りました。
– 同じチャンネルで実行者以外の誰かの承認をもらえないと実行できません。
– 実行結果をslackにそのままPostするのではなく、s3にcsv形式で保存し、署名付きURL(有効期限15分)をslackにPostします。
– 特定のチャンネルからのslashコマンドしか受け付けないので、悪意のある第3者がこっそりクエリ実行して結果を閲覧することはできません。

コードは以下に公開しています。
https://github.com/m22r/sequelcat

## コマンド実行時の流れ

### コマンド実行時
slash_command.png
クエリを流したい人が特定のチャンネルでslashコマンドを入

元記事を表示

Goの実装例で理解するダックタイピング

ダックタイピングという単語を聞いたことがあるものの、アヒル以外何も頭に思い浮かばないという方向けの記事です。ダックタイピングについてGoでの実装例と共に初心者の方でも分かるようにやさしく書いていきます。

以前書いたポリモーフィズムの記事の焼き直し感が否めませんが、まあ前回の記事と今回の記事を読めばダックタイピングとポリモーフィズム両方理解できるってことで気にせず書いていきます。

##Wikipediaで理解するダックタイピング
まずはWikipediaのダックタイピングの説明を引用します。この説明を読んでよく分からなくても、記事を読み終わった後に再び読んでみると腑に落ちるはずですので、まずはさらっと読んでみてください。

>ダック・タイピング(duck typing)とは、Smalltalk、Perl、Python、Rubyなどのいくつかの動的型付けオブジェクト指向プログラミング言語に特徴的な型付けの作法のことである。それらの言語ではオブジェクト(変数の値)に何ができるかはオブジェクトそのものが決定する。これによりポリモーフィズム(多態性)を実現することができる。つまり、静的型付け

元記事を表示

Go で DIP に従って依存関係を逆転させたいときは ifacemaker と moq の組み合わせが強い

# はじめに

* Go で DIP(依存関係逆転の法則)に従って依存関係を逆転させたくなったとき ifacemaker を使って構造体からインターフェイスを生成して moq を使ってインターフェイスからモックを作るのが便利

# 例

* 構造体 User の値をメモリに登録・参照するリポジトリ UserMemoryRepository がある
* UserMemoryRepository をサービスなどから利用したくなったとして、直接参照するのではなく UserMemoryRepository を抽象化したインターフェイスを参照するようにしたいとする

“`go:Userの定義
type User struct {
ID int
Name string
}
“`

“`go:UserMemoryRepositoryの定義
type UserMemoryRepository struct {
}

var userMemoryRepositoryMap = map[int]*User{}

func (r *UserMemoryRepository) Get(id in

元記事を表示

Goを書く前に知っておくべき3つのこと

# Goを書く前に知っておくべき3つのこと

**言語について学習する以外**で知っておくとあとあと人生が楽になることがいくつかあるので個人的に必須だと思っていること3つをサクっとリストアップしてみました。

## 1. 環境の準備
Goの面倒な要素として `$GOPATH` という変数(未設定の場合は `$HOME/go`)が指すディレクトリの下に全てのGoのソースコードが(少なくともエクスポートしたいものに関しては)入っている必要があります。変なこと(たとえばiCloudやDropBoxでコードをクラウドで同期するみたいなこと)をしない場合は未設定あるいは `GOPATH=$HOME/go` と明示的に設定してしまっていいと思います。合わせて `PATH=$PATH:$GOPATH/bin` も設定してしまいましょう。

`$GOPATH` 以下の階層は大雑把に以下のように構造化されています。

– `$GOPATH/`
– `bin/` go get などでインストールされたバイナリ郡
– `pkg/` 標準ライブラリ
– `src/` その他のGoコード

ここ

元記事を表示

01. 「パタトクカシーー」

## 01. 「パタトクカシーー」
「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.

###Go
“`go
package main

import “fmt”

func main() {
var src string = “パタトクカシーー”;
var des string = “”;

// rune 型へ変換
msrc := []rune(src);

// 1.ループで処理
for i := 0; i <= 7; i++ { // 問題では 1,3,5,7 指定だが奇数判定で対応 if (i % 2) != 0 { des += string(msrc[i]); } } fmt.Println(des); } ``` ###python ```python # -*- coding: utf-8 -*- src = u"パタトクカシーー" des = "" # 1.ループで処理(range) reverse = "" for i in range(len(src)): # 問題では

元記事を表示

00. 文字列の逆順

## 00.文字列の逆順
文字列”stressed”の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.

###Go
“`go
package main

import_ “fmt”

func main() {
var data string = “stressed”
var reverse string

// 1.ループ
for i := len(data) – 1; i >= 0; i– {
reverse += string(data[i])
}

fmt.Println(reverse)
}
“`

###python
“`python

# -*- coding: utf-8 -*-
data = “stressed”
reverse = “”

# 1.逆カウントのループ
i = len(data) – 1
while i >= 0:
reverse += data[i]
i-=1
print(reverse)

# 2.range->reversed
reverse = “”
for i in reverse

元記事を表示

Golang – Incorrect CPU Numbers of GOMAXPROCS in Docker

The runtime.GOMAXPROCS(??) will read the host machine’s CPU numbers instead of container’s (–cpus=??). We can use UBER’s ***automaxprocs*** to solve it.

“`
go get -u go.uber.org/automaxprocs
“`

“`golang
import _ “go.uber.org/automaxprocs”

func main() {
// Your application logic here.
}
“`

https://github.com/uber-go/automaxprocs

https://mp.weixin.qq.com/s/Lk1EbiT7WprVOyX_dXYMyg

GOMAXPROCS你设置对了吗?

https://colobu.com/2017/10/11/interesting-things-about-GOMAXPROCS/

http:/

元記事を表示

[おすすめ]ターミナルでの作業効率が爆上げするTUIツール5選

こんにちわ、ゴリラです。

普段、筆者は主にターミナルで仕事をしています。そこで作業効率化のためいくつかTUIツールを使っています。
今日は、個人的におすすめのTUIツールを5つ紹介していきます。

これらを導入することで、ターミナルでの作業効率が上がると思いますので、ぜひ導入して試してみてください。
また、こんな便利なツールがあるよって方いましたら、ぜひコメントをくださいー

– 2019/11/28 追記
– ffのブックマーク機能

# Git
[lazygit](https://github.com/jesseduffield/lazygit)というTUIツールを使っています。

`lazygit`機能が豊富なので紹介しようとすると長くになってし

元記事を表示

AWSの利用料金をGoで積み上げ棒グラフ化した

## はじめに

– 最近いろんな所でDevOpsって言葉を聞きますね。
– DevOpsの影響を受けて[FinOps](https://www.finops.org/what-is-finops/)と呼ばれるテクノロジー、ビジネス、財務を融合させたクラウドの運用モデルも提唱されています。
– もしかしたら、数年後にはDevOpsと同じくらいメジャーな概念となっているかもしれません。
– FinOpsを始めるための第一歩としてクラウドの利用料金の可視化、通知が挙げられています。
– というわけで、今回はAWSの利用料金を手っ取り早くグラフ化してslackに通知するツールについて紹介します。

## TL;DR
– CostExplorer APIからサービスごとの利用料金を取得
– [gonum/plot](https://github.com/gonum/plot)でStackedBarChartを生成
– [nlopes/slack](https://github.com/nlopes/slack)でslackに通知

## AWS料金の可視化方法いろいろ
– [CostExp

元記事を表示

OTHERカテゴリの最新記事