- 1. golangでの自分なりの作法
- 2. pprofのweb viewでパフォーマンス測定
- 3. 構造体のsliceはポインタ定義しない方がハイパフォーマンス
- 4. grpc-gateway enumを含んだリクエスト
- 5. Go言語でディレクトリサーチ
- 6. PostgreSQLへの接続
- 7. Sunriseに参加してきました
- 8. GoでMockを用いてテストする方法
- 9. MacにDockerでGolang環境を作ってみる vol.1 Dockerインストール編
- 10. Wantedly における Go 導入にまつわる技術背景
- 11. protobufのoneofを使う【Go + gRPC】
- 12. Go言語のテンプレート機能について
- 13. IntelliJにてgoenvで落としているGoを指定
- 14. go lang 任意の場所に要素を追加するのロジック説明
- 15. Goのmodules を使い始めたばかりでbuild出来ずに困った話
- 16. Goでシンプルに単体テストを書く
- 17. OpenID Connectを使ったアプリケーションのテストのためにKeycloakを使ってみる
- 18. CLI の愚痴投稿ツールを作ってみた
- 19. はじめてのGolang Webアプリケーション ~ テスト, Dockerコンテナ化まで
- 20. 【Hyperledger Fabric】GetHistoryForKeyを使って、StateDBのKeyに紐づくHistoryをGetしよう!!
golangでの自分なりの作法
# 命名規則
– 基本的には、[Effective Go](https://golang.org/doc/effective_go.html#names)に則り記載する。
– 変数やメソッド名は基本的にキャメル・パスカルケースにする。
– ファイル名についてはスネークケースにする。## 参考サイト
pprofのweb viewでパフォーマンス測定
### 概要
pprofでサーバーのパフォーマンス検証する時、
web viewで簡単にボトルネックを特定できます。
### pprofとは
go toolに入っているプロファイラーツール
関数単位でボトルネックになっている処理を特定できます
https://golang.org/pkg/net/http/pprof/
UI上で処理の流れがこんな感じに見れます![pprof.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254185/ee5aa2f6-7b35-c776-4c08-bcd9ab160230.png)
## 使用ツール
1. Go“`
go version
go version go1.13 darwin/amd64
“`2. [graphviz](http://www.graphviz.org/)
dotファイルとかをいい感じに可視化してくれるツール
今回は吐き出されたプロファイルを見やすくしてくれる“` shell
brew install graphviz
構造体のsliceはポインタ定義しない方がハイパフォーマンス
# Goで構造体slice
Goの構造体sliceはいつもポインタで定義していましたが、
要素追加の時毎回allocationが走るので初期化時に構造体のsliceにした方がパフォーマンス的に良いそうです。“` go
package main
import (
“strconv”
“testing”
)
type human struct {
age int
name string
}
func BenchmarkPointerSlice(b *testing.B) {
// 初期化時にslice分のメモリ容量を確保している
people := make([]*human, 0, b.N)
b.ResetTimer()
for i := 0; i < b.N; i++ { people = append(people, &human{ age: i, name: strconv.Itoa(i), }) } } func Ben
grpc-gateway enumを含んだリクエスト
# 概要
grpc-gatewayでenumを含んだリクエストってどのようにすれば良いのだろうか?のメモ## protoファイル
例えば、通知許諾フラグを更新するAPIがあります。“`proto
// ==================== サービス ====================service Notification {
rpc UpdatePermissionFlag(UpdatePermissionFlagRequest) returns (UpdatePermissionFlagResponse) {
option (google.api.http) = {
post: “/api/v1/notification/permission_flag”
body: “*”
};
}// ==================== メッセージ ====================
message UpdatePermissionFlagRequest {
string fcm_registration_t
Go言語でディレクトリサーチ
[学習履歴](https://qiita.com/__init__/items/e0a672f1437badf3eae0)
# はじめに
Go言語で特定のディレクトリ内にあるディレクトおよびファイル名をterminal上に出力する処理を調べた時のメモ。# 関数内呼び出し
ディレクトリサーチプログラムの前に、Go言語の面白い処理をお見せする。“`main.go
package mainimport “fmt”
func do(start int, end int) {
fmt.Printf(“do(%d, %d) called\n”, start, end)
fmt.Println(start)
if start < end { do(start+1, end) } fmt.Printf("Returning from do (%d, %d) call\n", start, end) } func main() { do(1, 3) } ``` main関数で、do関数を呼び出している。 通常の関数と違う所は、do関数の中で、**do関数自身**
PostgreSQLへの接続
PostgreSQLへの接続を標準の[database/sql]を利用した場合と
ORMのGORMを利用した場合の比較しました。#標準
まずは、標準[database/sql]を利用した場合“`go:main.go
package mainimport (
“database/sql”
“fmt”
“log”
_ “github.com/lib/pq”
)type Sale struct {
Id string
OrderId string
}func main() {
db, err := sql.Open(“postgres”, “postgres://user:pass@host:port/dbname”)
if err != nil {
log.Fatalln(“接続失敗”, err)
}
defer db.Close()// 取得件数を条件[$1]にする
// ?だとエラーが発生
//cmd := “select id, order_id from final_sales where id like $1”
cmd
Sunriseに参加してきました
# Sunriseってなに?
– Voyage Groupさんの大規模サービス構築インターン
– [公式サイト]
(https://voyagegroup.com/internship/sunrise/)# どんなことやったの?
– 計測用のインスタンスを3日間でどれだけリクエストを捌けるように性能を向上させれるかという内容# 印象に残ったこと
– 仮説、検証、考察の一連の業務の流れを体験できた
– ビジネスでは教育現場と違って、新しいこと、興味があることよりも、価値を生み出せることを優先した
– VGさんの実際に業務している時の雰囲気みたいなものを感じることができた# ネタバレ元
– ここに技術的なネタバレ、それ以外のネタバレ両方あるので、注意してください
– [VoyageGroupインターン Sunriseに参加してきました](https://www.slideshare.net/secret/GHN896vPc0gBqp)# 感想
– 楽しかった!!!
– というのも私は技術が好き(多分)で楽しいのでこのサイクルを回すのが楽しくて仕方なかったです
– 逆に合わな
GoでMockを用いてテストする方法
# はじめに
最近GoでMockを用いてテストを行うことが多いのですが,その手法がシンプルで使いやすいので紹介したいと思います.
# 実装
今回はDBからユーザーを全件取得して,指定したユーザーの年齢以上のユーザーのみを抜き取るという処理に対するテストを考えます.(そんなことはDB側で処理すればいいですが,いい例が思いつかなかったので悪しからず)
まずはUserのModel定義をします“`go:user.go
type User struct {
ID int
Name string
Age int
}
“`次にDBに関する実装を行いますが,interfaceとその具体実装の2つに分けて書きます.
“`go:user_db.go
type UserDB interface {
GetAllUsers() ([]User, error)
}type UserDBImpl struct {
}func (db *UserDBImpl) GetAllUsers() ([]User, error) {
// 全Userを返す処理
}
“`ここ
MacにDockerでGolang環境を作ってみる vol.1 Dockerインストール編
DockerもGolangも初心者ですが、とりあえずDockerでGolangを使ってみようと思います。
とりあえず、動かすための環境を作ります。
参考までに環境情報を。
- macOS Mojave(10.14.6)
## 1 Dockerのインストール
Docker for Mac は、以下のURLからGUIでもインストールできます。
でも、~~ちょっとめんどくさいので~~CUIでやってみたいので、CUIで入れてみます。ターミナルで以下のコマンド実行。
### 1.1 Homebrew Cask の確認
Homebrew Cask は Homebrew の拡張機能だそうです。
まずはこれが入っているかの確認。“`
$ brew cask
“`brew cask はGUIでダウンロードするような(chromeとか)を
CUIで入れられるみたい。
※詳しくはこちら参照
https://qiita.com/swallowtail62/items/61244ea3c7d0
Wantedly における Go 導入にまつわる技術背景
(本記事は [Go Conference 2019 Autumn](https://gocon.jp/) にて無料配布した冊子『WANTEDLY TECHBOOK GoCon Edition vol.2』からの掲載です)
配布した冊子の前半では Go の導入にあたってどのような工夫をしてきたのかを紹介しました。そこに書かれていたように、新しいプログラミング言語を導入するにはそれなりの整備コストがかかります。それではなぜそこまでして Go を導入したのでしょうか。本記事では Go を導入した背景について説明していきたいと思います。
## なぜ Go か
### 技術的・事業的背景
どのプログラミング言語を採用するかや、どのようなアーキテクチャを選定するかというようなことは非常に影響範囲の大きい決断になるため、会社全体の技術的・事業的なコンテキストと切り離しては語れません。そこでまずは Wantedly の技術的・事業的な背景について、この後の話をするために必要最低限の部分を紹介したいと思います。
Wantedly というサービスはもともと、一つの Ruby on Rails の
protobufのoneofを使う【Go + gRPC】
[Protocol Buffers](https://developers.google.com/protocol-buffers)のoneofを使って実装しようとしたときに微妙に悩んだので、使用方法を備忘録として残しておきます。
Protocol Buffers、Go、gRpc、どれも触り始めて数ヶ月なので、変な箇所がありましたら指摘していただけると大変助かります。
## oneofとは
あるメッセージで複数のフィールドを定義して、「このフィールドのうち、**最大でどれか1個だけ**がセットされてるよ!」と宣言できる機能です。
“`
message SampleMessage {
oneof test_oneof {
string name = 4;
SubMessage sub_message = 9;
}
}
“`上記のようにメッセージを定義すると、「`SampleMessage`には`name`フィールドか`sub_message`フィールドのどちらかが入っている。どちらのフィールドも入ってない場合もある」ということになります。
ただし、
Go言語のテンプレート機能について
#概要
go言語に標準で搭載されているテンプレート機能について紹介します。
テンプレート機能を使うことで、ロジックとデザインを分離することが出来ます。
変数の埋め込み、ループ、条件分岐などが出来ます。ただし、それほど多機能ではないため使い所は限られるでしょう。
例えばメールではJavascriptが使えないため使用に適しています。複雑なことはできませんが独自関数を作成できるため、何かをやろうとする場合は逐次独自関数を作成していくことになります。
##packageについて
Go言語には組込みのテンプレート・パッケージとして、 `text/template` と `html/template` パッケージが搭載されています。
`html/template` パッケージは`text/template` をラップしたもので、同じインターフェースを提供し、コードインジェクション対策を施した安全なHTMLを生成します。
出力が HTML の場合は常に `html/template` を用いるべきです。##基本的な使い方
“`go
//テンプレートを用意
tex
IntelliJにてgoenvで落としているGoを指定
# やること
[goenv](https://github.com/syndbg/goenv)を使ってGoのVersionを管理してIntellijを利用する場合の手順です。
“`
$ cd YOUR_PROJECT
$ go env GOROOT
/Users/YOUR_NAME/.goenv/versions/1.11.0
“`上記のように出たならば、以下スクショのように設定してあげましょう。
以上。
go lang 任意の場所に要素を追加するのロジック説明
https://qiita.com/egnr-in-6matroom/items/282aa2fd117aab9469bd
こちらの記事の“`
pos := 追加する位置
// slice , slice[pos] = append(slice[:pos+1], slice[pos:]…), 追加する要素
slice = append(slice[:pos+1], slice[pos:]…)
slice[pos] = 追加する要素
“`このロジックがようわからんかったので軽く解説。
———————————–
“`go
slice = [0 ,1 ,2 ,3 ]
2まで取得 |——–| => [0,1,2]
2から取得 |—–| => [2,3]//appendの第一引数でsliceの[0,1,2]を取得
//appendの第二引数でsliceの[2,3]を取得
//それらをsliceに代入 or 再定義する。
//すると、slice = [0,1,2,2
Goのmodules を使い始めたばかりでbuild出来ずに困った話
# Go moduleを使い始めたばかりで`build`が通らず困った話
Hello Worldを終えて、少しすると、`main.go`で定義していた関数を別のディレクトリに切り出したくなる時がくると思います。
その時に`build`通らず、解決するのに時間がかかりました。
`go module`を使わず、`GOPATH`配下にプロジェクトのディレクトリを作る際と、`goのmodules`を使う時で外部パッケージの呼び出し方のパスの指定方法に違いがあります。現状、Web上の情報も古い情報の方が多く、
結構、盲点であると思いましたので、覚書として残します。“`bash:Goのバージョン
$ go version
>> go version go1.13.4 darwin/amd64
“`## 何が困ったか?
“`bash
piyo
├── go.mod
├── go.sum
└── main.go
“`“`go:main.go
package main
import “fmt”main(){
hoge()
fuga()
return
Goでシンプルに単体テストを書く
`Go`の標準ライブラリである`testing`を使ってテストを書くお話です。
いわゆる**単体テスト**と呼ばれるレベルでのテストを書いていきます。
## テストするコード
テストコードを書くお題には次のような関数を使いました。
“` color.go
package mainimport (
“fmt”
)func showColor(fruit string) (string, error) {
fruitBasket := map[string]string{
“banana”: “yellow”,
“apple”: “red”,
“melon”: “green”,
}if color, ok := fruitBasket[fruit]; ok {
return color, nil
} else {
return color, fmt.Errorf(“%s does not exist in Fruit Basket”, fruit)
}
}
“`果物の名前を放り込むと何色かを返してくれる関数ですね。(フルーツ
OpenID Connectを使ったアプリケーションのテストのためにKeycloakを使ってみる
ユーザーの認証と認可を行う方法としてはOpenID Connectがメジャーですよね。ローカルで簡単にテストするために、ローカルで[Keycloak](https://www.keycloak.org/)をDockerで起動してテストしてみます。外部システムはモックを使う、というのがセオリーですが、気軽に使える本物のサービスを使った方が楽ですよね、ということで。
なお、認証周りのGoのアプリケーションコードは超簡易実装なので、本番実装に入れちゃダメですよ。
# Keycloakとは
KeycloakはIBM傘下のRedHat傘下のJBossが作成している認証のすごいソフトウェアです。
* 自分自身でユーザーIDとパスワードを管理するID Provider機能を持つ
* OpenID Connect、OAuth2、SAML経由でユーザー認証ができる(OIDCなどのサーバーになれる)
* LDAPやActive Directoryで管理しているユーザー情報を取り込める
* GoogleやTwitterなどの外部のSNSを使った認証ができる(OIDCなどのクライアントになれる)認
CLI の愚痴投稿ツールを作ってみた
# 愚痴投稿 CLI ツール guchi を作成しました
CLI から愚痴を吐くツールを作りました。ここ最近ストレス溜まってたのでね。。なお、愚痴は私が用意している以下ページ (というかただのテキスト) に吐かれます。もちろん CLI コマンドでも取得可能。
https://guchis.site/guchisリポジトリは以下です。舐め腐ったツールですがよかったら使ってみてください。
https://github.com/daiching/guchi動作確認は WSL (Ubuntu) と CentOS7 で実施しています。残念ながら Mac はわかりません (もし試した方がいて、動作報告していただけたら大変有り難いです!)
取得方法としては、以下でイケるはずです。
“`bash
# 実行バイナリのみ
$ wget https://github.com/daiching/guchi/raw/master/guchi
$ sudo chmod +x ./guchi
$ ./guchi# go get する場合
$ go get github.com/daiching/g
はじめてのGolang Webアプリケーション ~ テスト, Dockerコンテナ化まで
#
# 概要
こんにちは。kwashiです。最近、コンテナ関連の技術にハマリ気味で、Golangの勉強を始めました。いままで、Pythonばかり使っていたのですが、すっかり、Golangにハマってしまいました。そこで、復習も兼ねて、GolangのインストールからWebアプリケーションの作成、テスト、Dockerコンテナ化までを対象に記事にしてみました。Golangの構文はわかったけど、次どうしようと思っている方にはちょうどいいかもしれません。
Golangのメリットは、以下のようなことが挙げられます。
+ Dockerイメージが軽量
例えば、本記事で作成したアプリケーションは、以下のように22.6MBとかなり軽量です。“`bash
REPOSITORY TAG IMAGE ID CREATED SIZE
kwashizaki/example-golang-rest-api v1.0.0
【Hyperledger Fabric】GetHistoryForKeyを使って、StateDBのKeyに紐づくHistoryをGetしよう!!
## はじめに
みなさま、お久しぶりです。
どーも、のぶこふです。プロキシという足枷に行く手を阻まれながらも、
どーにかこーにか、生きながらえております。今回は、Hyperledger Fabricで履歴(History)を取得するやり方です。
諸事情により、Golangでの記述となりますが、Node.jsやJavaでも同様の方法で取得できるかと思います(未確認)。
なお、環境構築やその他チェーンコード箇所等については記載しませんのであしからず。
## 環境
* Windows10 Behind Proxy(ホストOS)
* VirtualBox
* CentOS7(ゲストOS)
* Hyperledger Fabric(HLF)1.4.3
* Golang## 登場人物
`Fabric-Shim`の`GetHistoryForKey(key string)`
▼GoDoc
https://godoc.org/github.com/hyperledger/fabric/core/chaincode/shim#ChaincodeStub.GetHistoryForKey