- 1. ISUCON10 予選でやったこと、失敗したこと
- 2. GoでAtCoder Library (ACL)
- 3. Golang基礎 + MacにGoをインストール
- 4. AtCoder Beginner Contest 178のメモ
- 5. kubernetesでもぷよぷよがしたいので同じ色のPodが4個くっついたらdeleteされるcustom controller「くべくべ」を作った
- 6. A Tour of Go メモ 【3】1日目
- 7. Go言語: 雑多な Tips、文法など
- 8. deferの実行タイミング
- 9. 【Go】http.HandleFunc()とhttp.Handle()の使い分けは構造体のフィールドを使うかどうか
- 10. GoでExcelを操作する
- 11. echoでより高速なJSONを返す
- 12. A Tour of Go メモ【2】1日目
- 13. A Tour of Go メモ【1】1日目
- 14. レイヤードアーキテクチャ+DDDでAPI開発[入門]
- 15. sqlfile : GoでSQLファイルを簡単に実行する
- 16. production-ready なGo製2Dゲームライブラリ Ebiten の紹介 & リンク集
- 17. AtCoder Beginner Contest 174 参戦記
- 18. GoのBenchmarkに出てくる関数名の後ろの数字
- 19. Go言語のチュートリアル A Tour of Go のチートシート その1 - Basics
- 20. [Go] Cobraをgo getでインストールしようとするとcommand not foundになる問題の解決
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 mainimport (
“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 mainimport (
“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 * dvar 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 mainimport (
“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 mainimport “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ゲームを作るなら非常にオススメ! というわけで、改めて紹介記事を書いてみます。
ねずみバスターズ、インドとブラジルに数万人規模でリリースしたんですが、報告されたクラッシュが30件程度なので驚愕の安定性…
— Daigo (@daigo) September 11, 2020
AtCoder Beginner Contest 174 参戦記
# AtCoder Beginner Contest 174 参戦記
9ペナの大爆死. 終了1分半前にギリギリE問題を通したおかげで、レーティングが小ダウンで済んだ.
## [ABC174A - Air Conditioner](https://atcoder.jp/contests/abc174/tasks/abc174_a)
1分で突破. 書くだけ.
```python
X = int(input())if X >= 30:
print('Yes')
else:
print('No')
```## [ABC174B - Distance](https://atcoder.jp/contests/abc174/tasks/abc174_b)
2分半で突破. 書くだけ.
```python
N, D = map(int, input().split())result = 0
for _ in range(N):
X, Y = map(int, input().split())
if X * X + Y * Y <= D * D:
GoのBenchmarkに出てくる関数名の後ろの数字
Goのベンチマークをするときに出てくる
関数名の後ろの数値ってなんだっけとど忘れしたのでメモしておきます。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54313/2f10a318-b5d7-2cf1-3116-f2ab5be38cd1.png)
関数名-4 <-この"-4"の事ですね。 これはベンチマークに使ったCPU数です。 なので ``` go test -bench . -cpu 2 ``` のようにCPU数を指定すると ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54313/61b32db7-e8ba-b004-31b0-4882c21f2fa2.png) ちゃんと変わります。 普段からGo使ってる人にとっては当たり前の事かもしれませんが 使ってないと知らなかったり忘れたりするので。
Go言語のチュートリアル A Tour of Go のチートシート その1 - Basics
Go言語入門の定番、チュートリアル [A Tour of Go](https://go-tour-jp.appspot.com/list) をやったので、復習を兼ねて内容をまとめておきます。
また、チュートリアル中、何度も前のページに戻って確認しなければならなかったので、これからやろうという方にはチートシートとしてお使いいただけます。
チュートリアルをやる代わりに、さらっと眺める用途にもどうぞ。
# Packages, variables and functions
## パッケージとインポート・エクスポート
- プログラムはmainパッケージから実行される。
- importでパッケージを読み込む。
- 大文字で始まる名前はエクスポートされる。```go
// ファイルの冒頭にpackage名を宣言する
package main// パッケージのインポートをグループ化できる
// factored import statementと呼ばれる
import (
"fmt"
"math"
)func main() {
// Printf /
[Go] Cobraをgo getでインストールしようとするとcommand not foundになる問題の解決
## 問題
cobraをインストールしてCLIを書いてみようと思って、cobra公式のインストールコマンドを実行した。
```
go get -u github.com/spf13/cobra/cobra
```その後cobraがインストールされたか確認しようとしたら`command not found`と表示された。
```
cobra --help
command not found
```ちゃんと`$GOROOT`や`$GOPATH`、`$GO111MODULE`などの環境変数の設定もしているので謎だった。
## 環境
* MacOS Catalina 10.15.6
* go version go1.15 darwin/amd64
* goenv 2.0.0beta11## 解決策
よく見るとインストールコマンドを実行した時のメッセージは以下のようになっていた。
```
go: github.com/spf13/cobra/cobra upgrade => v0.0.0-20200909172742-8a63648dd905
go get git