- 1. A Tour of Go メモ 【4】
- 2. A Tour of Go メモ 【4】二日目
- 3. GolangでDynamoDBとJSONのマッピングを同時に使って躓いた話
- 4. Golang チュートリアル その2
- 5. golangの基本的なこと
- 6. GoでQiitaのトレンドを取得するAPI①作ってみた
- 7. Firebase AuthenticationとIDトークンと更新トークンとセキュリティの話
- 8. ISUCON10 予選でやったこと、失敗したこと
- 9. GoでAtCoder Library (ACL)
- 10. Golang基礎 + MacにGoをインストール
- 11. AtCoder Beginner Contest 178のメモ
- 12. kubernetesでもぷよぷよがしたいので同じ色のPodが4個くっついたらdeleteされるcustom controller「くべくべ」を作った
- 13. A Tour of Go メモ 【3】1日目
- 14. Go言語: 雑多な Tips、文法など
- 15. deferの実行タイミング
- 16. 【Go】http.HandleFunc()とhttp.Handle()の使い分けは構造体のフィールドを使うかどうか
- 17. GoでExcelを操作する
- 18. echoでより高速なJSONを返す
- 19. A Tour of Go メモ【2】1日目
- 20. A Tour of Go メモ【1】1日目
A Tour of Go メモ 【4】
###A Tour of Go
#Methods
“`
type Vertex struct {
X, Y float64
}type Name struct {
first, last string
}func(n Name) Greet() string {
//変数.値でメソッド内で構造体の値を使うことができる
return “I’m ” + n.first + ” ” + n.last
}func (v Vertex) Abs() float64 {
return math.Sqrt(v.X*v.X + v.Y*v.Y)
}func main() {
v := Vertex{3, 4}
fmt.Println(v.Abs())
n := Name{“first”, “last”}
fmt.Println(n.Greed())
}> 5
> I’m first last#通常の関数としてもかける
“`
type Name struct {
first, last string
}func Greet
A Tour of Go メモ 【4】二日目
#A Tour of Go
#Range
“`
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}func main() {
for i, v := range pow {
fmt.Printf(“2**%d = %d\n”, i, v)
}
for i, a := range hiragana {
fmt.Printf(“「%s」は、%d番目\n”, a, i+1)
}
}
> 2**0 = 1
> 2**1 = 2
> 2**2 = 4
> 2**3 = 8
> 2**4 = 16
> 2**5 = 32
> 2**6 = 64
> 2**7 = 128
> 「あ」は、1番目
> 「い」は、2番目
> 「う」は、3番目
> 「え」は、4番目
> 「お」は、5番目
“`#rangeと”_(アンダーバー)”
“`
func main() {
pow := make([]int, 10)
for i := range pow {
pow[i] = 1 << uint(i) // == 2**i }
GolangでDynamoDBとJSONのマッピングを同時に使って躓いた話
Golang x Lambdaで小規模なAPIを作った際、一つの構造体にDynamoDBとJSONのマッピングを同時に使って躓いたのでメモを残しておく。
## うまく行かない方法
DynamoDBから取得したデータに対して以下のような構造体でマッピングをして、それをそのままJSON形式で返そうとした。
雰囲気としては以下の感じ(エラーハンドリングなどは省略)“`go:main.go
type UserInfo struct {
UserName string `dynamodbav:”userName”, json:”userName”`
ContactNumber int `dynamodbav:”contactNumber”, json:”contactNumber”`
}func SuccessResponse(body string) events.APIGatewayProxyResponse {
return events.APIGatewayProxyResponse{
StatusCode: 200,
IsBase64En
Golang チュートリアル その2
##概要
「処理が速い」「並行処理」が得意ということから、
今後大規模webサービスなどで重宝されると思いましたので、
学習していきたいと思います。今回は、「For」や「if」といったところをみていきます。
##参考サイト
以下を実施してみました。[Welcome to a tour of Go](https://go-tour-jp.appspot.com/list)
##環境
GoogleChrome
※ブラウザ操作だけで学習できるため、 エディタを用意する必要がありません。
※私は、ローカルにCentOS8環境を用意して、チュートリアルを行います。
※Goインストール手順です。よろしければ、ご活用ください。
[CentOS8へのGo言語インストール手順](https://qiita.com/tomotomo3/items/38e7fed248278a3295b9)##For文
– 書き方
forループはセミコロン ; で3つの部分に分かれている。
・初期化ステートメント: 最初のイテレーション(繰り返し)の前に初期化が実行される。
・条件式: イテレーショ
golangの基本的なこと
# Basic variable types
* bool
* signed integer: int int8 int16 int 32 int64
* unsigned integer: unint unit8 unit16 unit32 unit64 unitptr
* byte (alias for uint8)
* run (unicode point, alias for int32)
* float32 float64
* complex64 complex128# int comparison
| Type | Description |
|:—|:—|
| int unit unitptr | at least 32 bit based on OS (32 bit on 32 bit OS, 64 bit on 64 bit OS |
| int8 | -128 ~ 127 (-2^7 ~ 2^7-1)|
| unit8 | 0 ~ 255 (-0 ~ 2^8-1)|
| int16 | -32768 ~ 32767 |
| unit16
GoでQiitaのトレンドを取得するAPI①作ってみた
# はじめに
Qiitaのトレンド記事を取得したいと思ったのですが、公式でAPIが提供されていないので自分で作ってみました。Qiitaトップページのdivタグにトレンド記事のJSONが入った属性があるので、これをスクレイピングして取得します。
スクレイピングには、[goquery](https://github.com/PuerkitoBio/goquery)、
フレームワークは [Gin](https://github.com/gin-gonic/gin) を使用しています。リポジトリは[こちら](https://github.com/Le0tk0k/qiita-trend-api)。
# コード
まず、トレンド記事一覧のJSONを取得します。“`go
func qiitaTrend() (string, error) {
doc, err := goquery.NewDocument(“https://qiita.com/”)
if err != nil {
fmt.Fprintln(os.Stderr, err)
return “”, err
}
Firebase AuthenticationとIDトークンと更新トークンとセキュリティの話
## 初めに
[Firebase Authentication](https://firebase.google.com/docs/auth?hl=ja)を使用すると簡単にアプリにユーザー認証の仕組みを実装することができます。
自前のWebサーバーでFirebase Authenticationのユーザー認証を検証したい場合、IDトークンをクライアントから送ることで実現できます。
このIDトークンとセキュリティについて記載します。以下の記事も参考にしてください。
[JWTでセッション管理してはいけない](https://qiita.com/hakaicode/items/1d504a728156cf54b3f8)## 登場する単語
* IDトークン
ユーザーの情報が含まれたJWT。
有効期限が1時間しかない。* 更新トークン
IDトークンを取得するために使用するトークン。
## Webサーバーでのユーザー認証の流れ
1. クライアントはFirebase Backendから更新トークンを使ってIDトークンを取得する。
2. クライアントはWebサーバーにIDトーク
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に属している必要があ
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
}