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

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

ISUCON10 予選でやったこと、失敗したこと

初めてのISUCON参加して680点あたりで終わった話です。
`eqval`という3人チームで`Go`言語で挑みまして、僕はアプリ側を担当しました。

## ? 予選前の準備
自分はインフラ周りはあんまり詳しくなかったので, チームメンバーのnoraさんが全部準備しました。
### 秘伝のタレとも呼ばれているもの
環境変数, アライアス, MySQL, nginxの設定ファイルなど

### Makefileに各種コマンドのまとめ
– 各種設定ファイルの変更を適
– アプリのbuild, deploy
– slow query log, access logをSlackに送る
– pt-query-digest, alpでlogを集計した結果を送ってます

## ??‍? 予選でやったこと
### Google Cloud Profiler
`pprof`を使うとベンチマークが回るタイミングに合わせて, プロファイリングかけることや
結果ファイルの変換処理などにも手間がかかると判断して, [Google Cloud Profiler](https://cloud.google.

元記事を表示

GoでAtCoder Library (ACL)

GoでAtCoder Library (ACL)のスニペットを作りました。
コピペするだけで使えると思います。
各コードの使い方はAtCoder Library Practice Contestの提出を見てください。

###注意
動作保証はできないので、使用は自己責任でお願いします。
modintはありません。他にもところどころ実装していないものがあります。
AtCoder Library Practice Contestの全ての問題でACしましたが、ここで使用していない機能は動作確認していないものがあります。

実装に問題があったらご指摘いただけると幸いです。

##目次
・DSU (Union-Find)
・Fenwick Tree (BIT)
・math (floor sumなど)
・MaxFlow
・MinCostFlow
・Convolution
・SCC
・Two SAT
・strings
・Segtree
・LazySegtree
・bits

##Disjoint Set Union (DSU, Union-Find)

“`go:UnionFind.go
type

元記事を表示

Golang基礎 + MacにGoをインストール

#はじめに
####Golang又はGo言語 とは
・コンパイル言語の中でも特に処理が高速
・2009年にGoogle開発された
・シンプルな構文
・コードの可読性が高い
・初心者はpythonやphpやRubyからのが良い

##開発環境
Visual Studio Code
Mac

##Goのインストール
***ターミナルで実行してください***
1. homebrewを最新にします

“`
$ brew update
“`

2. Goのインストール

“`
$ brew install go
“`

3. Goがインストールされたか確認バージョンが返ってくればOK

“`
$ go version
“`

###プログラムの基本構造

###順次進行
上から順に処理していく
###条件分岐
特定の条件の時にAかBなどに分岐する
###繰り返し
決まった回数や条件に当てはまる間は繰り返す

###Goの記述方法

“`例)test.go
package main ←Goのプログラムは1つはmainに属している必要がある
import (“fmt”) ←fmtパッ

元記事を表示

AtCoder Beginner Contest 178のメモ

# 前置き

Atcoderをやってみたので、自分用のメモです。
あとから加筆・修正する予定です。

# 問題

https://atcoder.jp/contests/abc176

# A

“`Q_A.go
package main

import (
“fmt”
)

func main() {
var x int
fmt.Scanf(“%d”, &x)

var c int

if x == 0{
c = 1
} else {
c = 0
}
fmt.Printf(“%d\n”, c)
}
“`

# B
“`Q_B.go
package main

import (
“fmt”
)

func main() {
var a, b, c, d int
fmt.Scanf(“%d %d %d %d”, &a, &b, &c, &d)

var ac, ad, bc, bd int

ac = a * c
ad = a * d
bc = b * c
bd = b * d

var ans int
if ac <

元記事を表示

kubernetesでもぷよぷよがしたいので同じ色のPodが4個くっついたらdeleteされるcustom controller「くべくべ」を作った

Kubernetes使ってると、Nodeにえらい数のPodが溜まってくじゃないですか。消したくなりますよね。連鎖してほしいですよね。なりません?なので、4つ同じ色のPodが4個くっついたらdeleteされる、爽快感のあるカオスエンジニアリング用のcustom contollerを作りました。

deleteされるだけでは寂しいので、deleteされていく様子を見るためのkubectl pluginも作りました。合わせて使うとこんな感じになります。

![kubectl-kbkb-rensa.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38448/f53e2941-7d16-0a61-61b8-cbe207b2277c.gif)

左側の●のひとつひとつがPodです。Nodeが列に対応してます。6Node構成です。各色8個ずつpodを立てていて、右側にreplicasetの増減を置いてみました。

レポジトリはこちらです。

https://github.com/omakeno/kubectl-kbkb

元記事を表示

A Tour of Go メモ 【3】1日目

# ポインタ、 構造体、 配列、 スライス
[A Tour of Go](https://go-tour-jp.appspot.com/moretypes/1 #)

#ポインタ
[Golangのポインタ渡し初心者を卒業した](https://qiita.com/kotaonaga/items/4a93ec40718c279154f5 #)

“`
func main() {
i, j ;= 10, 200

# pはiの値を参照する 
p := &i

# iとpのアドレスを取得する
fmt.Println(&i)
fmt.Println(&p)

   # pが参照している変数、つまり、iを表示する
fmt.Println(*p)

# pが参照する変数に21を代入する。つまり、i に 21 を代入する
*p = 21
fmt.Println(i)

# pはjの値を参照する
p = &j

# pが参照する値に”pが参照する値を100で割った値”を代入する。
# つ

元記事を表示

Go言語: 雑多な Tips、文法など

# この記事について
忘備録として Go言語の雑多なTIPS、文法などを脈絡なくまとめていきます。

# TIPS

## ランダムな文字列の生成

いろんな方法があるが、長さや文字種の指定がなければこんな簡易的な方法もある(Unix時間を36進数表記の文字列に変換してる)。

“`go
s := strconv.FormatInt(time.Now().UnixNano(), 36)
// 実行結果は、例えば “c3av0t23ntsk”
“`
ただ、時刻を用いてるだけなので複数の Goroutine から同時実行すると同じ文字列が返る可能があることは注意。

## ある文字列が数字だけ含むかチェック

“20200601” のように、文字列が数字だけ含むかどうかチェックしたいときは`strings.Trim(<文字列>, “0123456789”) == “”` が使える。

サンプルコード:

“`go
func main() {
params := []string {“1”, “dog”, “20200601”, “5c6”}

for _,

元記事を表示

deferの実行タイミング

# タイミング
– return
– panic

# 参考
– [kakakakakku blog](https://kakakakakku.hatenablog.com/entry/2015/12/15/222217)

元記事を表示

【Go】http.HandleFunc()とhttp.Handle()の使い分けは構造体のフィールドを使うかどうか

# はじめに
http.HandleFunc()とhttp.Handle()でServeHTTPを呼んでいるのに
なにが違っているのか分からなかったので調べてみました。

# 結論
構造体のフィールドを使いたいかどうか

# http.HandleFunc()とhttp.Handle()
[GoのドキュメントのPackage http](https://golang.org/pkg/net/http/)のよると

>ListenAndServe starts an HTTP server with a given address and handler. The handler is usually nil, which means to use DefaultServeMux. Handle and HandleFunc add handlers to DefaultServeMux:

とどちらもDefaultServeMuxのパターンとしてハンドラを登録するもの。

DefaultServeMuxについてやハンドラとの関係性については以下の記事がわかりやすいです。
[【Go】ne

元記事を表示

GoでExcelを操作する

Goでエクセルファイルを操作する方法のメモです。
**tealeg/xlsx**ライブラリを使うと簡単でした。

## Gitのインポート
github上のライブラリを使用するため、[Git](https://git-scm.com/)のダウンロードが必要でした。
※設定はデフォルトのままで行いました。

## ライブラリのインポート

コマンドプロンプトで以下のコマンドを実行すると、エクセルの[ライブラリ](https://github.com/tealeg/xlsx)が使えるようになります。go get の後のURIは[GoDoc](https://godoc.org/github.com/tealeg/xlsx#pkg-index)で検索して取得しました。

“`
go get github.com/tealeg/xlsx
“`

コマンドで実行するだけなので楽でした。

## プログラム作成
テスト用として、エクセルにシートを追加するプログラムを作成しました。

<手順>
1. goファイルと同階層に新規ワークシートを作成
2. ファイル名を「テスト」とリネームして保存

元記事を表示

echoでより高速なJSONを返す

# はじめに
goのwebフレームワークである[Echo](https://github.com/labstack/echo)にてデフォルトのJSONよりも高速なJSONを返したいことがあると思います。その例として[easyjson](https://github.com/labstack/echo)で作ったJSONを返そうとしたときに少し詰まりどころがあったので書き留めておきたいと思います。

# まずはデフォルトから
“`golang:main.go
package main

import (
“github.com/masibw/echo_json/model”
“net/http”
“github.com/labstack/echo/v4”
“github.com/labstack/echo/v4/middleware”
)

func main() {
// Echo instance
e := echo.New()

// Middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())

元記事を表示

A Tour of Go メモ【2】1日目

[A Tour of Go](https://go-tour-jp.appspot.com/flowcontrol/1 #)
時折、コードを変更したり、関連記事を調べたりしながら、学習しました。

# for

“`
func main() {
sum := 0
for i :=0; i < 10; i++ { sum += i fmt.Println(i) fmt.Println(sum) } } #省略可能 for ; sum < 100; { sum += sum } #さらに省略可能 for sum < 100 { sum += 100 } # 無限ループ for { } ``` # if ``` func judge(x int) string { if x > 0 {
return “マイナス”
}
return fmt.Println(“プラス”)
}
func main() {
fmt.Println(judge(−100

元記事を表示

A Tour of Go メモ【1】1日目

# goのチュートリアル
[A Tour of GO](https://go-tour-jp.appspot.com/basics/1 #)
時折、コードをいじって、どんなエラーが出るかなどを試しながら、学習しました。

#出力
“`packages.go
package main

# パッケージをインポート
import (
# 出力のためのパッケージ
“fmt”
)

func main() {
# 出力
fmt.Println(“Hello World”))
}
“`

#パッケージのインポート

“`packages.go
package main

#複数行で書くこともできる
import “fmt”
import “math”

#こっちの方がスマート
import (
“fmt”
“math”
)
“`

#関数と引数

“`function.go
package main

import “fmt”

#変数の後ろに型名を指定する必要がある
func add(x int, y int) int {
return x + y
}

元記事を表示

レイヤードアーキテクチャ+DDDでAPI開発[入門]

## 前書き
– 著者の理解が甘く間違っている箇所もあるかもしれません。その際は優しく教えていただけると幸いですmm
– レイヤードアーキテクチャは具体的なディレクトリ構成等を示すものではなく、あくまで**概念的な指標**です。正解はありません。

なるべく初学者にもわかりやすい様に書きました。
始めは実装コード等理解しづらいと思いますが、概念的な理解の足掛かりにしていただけると嬉しいです☺️

## レイヤードアーキテクチャって何?
### 概要
**ソフトウェアの関心事をレイヤー毎に分離するための設計方法の一つ**です。
他にもクリーンアーキテクチャ・オニオンアーキテクチャなどが有名ですが、どれも**責務・依存関係を明確化する**というゴールは変わりません。

### メリット
アーキテクチャを導入する主なメリットは以下の二つです。

– DBやUI・ビジネスロジックなど、**仕様変更の際にコードの修正箇所が明確・軽微**
– 各レイヤーにおいてテストする目的が明確・処理をモックしやすいことから**テストしやすい**

仕様変更に強くテストもしやすいことから、**保守運用しやすい*

元記事を表示

sqlfile : GoでSQLファイルを簡単に実行する

GoでSQLファイルを簡単に実行するためのライブラリを作ったので,その紹介をします.

https://github.com/tanimutomo/sqlfile

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224401/a8e4399f-cec5-0512-2c5b-75ebaa9ea029.png)

## sqlfileの簡単な使い方
詳しい使い方については,本記事の下,もしくは,上記のGitHubをご参照ください.

“`go:main.go
import (
“database/sql”
“github.com/tanimutomo/sqlfile”
)

db, err := sql.Open(“DBMS”, “CONNECTION”)

s := sqlfile.New()
err := s.File(“example.sql”)
res, err := s.Exec(db)
“`

## はじめに
Goで複数のクエリが書かれたSQLファイルを実行できる

元記事を表示

production-ready なGo製2Dゲームライブラリ Ebiten の紹介 & リンク集

## はじめに
[Ebiten](https://ebiten.org/) は、Goで書かれた非常にシンプルな2Dゲームライブラリです。(公式サイト: https://ebiten.org )

圧倒的な安定性を誇り、今2Dゲームを作るなら非常にオススメ! というわけで、改めて紹介記事を書いてみます。