- 1. [golang] gRPC の RESTful API を dockernize するにあたって苦労したところ
- 2. [Go]設定ファイルと環境変数の両方をいい感じに使う
- 3. オブジェクト指向な人に捧ぐGO言語の特徴
- 4. Go言語でポリモーフィズムとその便利さを理解する
- 5. gonum/matで単位行列を生成する
- 6. GO言語でmapの値に構造体を使う時はポインタにすると良いらしい
- 7. Goのディレクトリ構成(追記予定)
- 8. goとpythonで始めるgRPCの事始め
- 9. Golangらしいコードを書こう
- 10. 今すぐ「レイヤードアーキテクチャ+DDD」を理解しよう。(golang)
- 11. Beego+MySQL+Docker+Heroku
- 12. Golang APIレイヤードアーキテクチャで組んでみた。
- 13. Goでマルチドキュメントのyamlを読み込む方法
- 14. ノリと勢いで Go で Hello World する
- 15. Golangでベクトル演算を高速化しようとしてみた話
- 16. Goで指定日の0時ジャスト(00:00:00)を取得する処理とテスト
- 17. Prometheus APIをGolangのプログラムから呼び出してexporterから収集されたメトリクス情報を取り出す
- 18. Goのmath/randの共有ロックでハマった
- 19. Goでよく見るnewとNewを調べたときのメモ
- 20. 【Go】goimportsによるimportのグルーピングが不満なので実装した
[golang] gRPC の RESTful API を dockernize するにあたって苦労したところ
## TL;DR
– gRPC gateway 用と server 用で別のコンテナを立てて, オーケストレーションの方で組み合わせられるようにする
## 成果物
こちらの記事の内容を dockernize させていただきました
https://qiita.com/ryu3/items/b2882d4f45c7f8485030コンテナ立てる
“`sh
$ docker-compose up api
Creating network “siiid-gke_default” with the default driver
Creating siiid-gke_api_gateway_1 … done
Creating siiid-gke_api_1 … done
Attaching to siiid-gke_api_1
api_1 | 2019/11/02 23:49:42 Received: nakata
“`API叩く
“`sh
$ curl -vvv -X GET http://0.0.0.0:8765/v1/exa
[Go]設定ファイルと環境変数の両方をいい感じに使う
##TL;DR
– 基本の設定を設定ファイルから取得してから、環境変数で上書きできるようにしよう## アプリケーションと設定
`The Twelve-Factor App`の[III. Config](https://12factor.net/ja/config)には以下のように書いてある
>アプリケーションの 設定 は、デプロイ(ステージング、本番、開発環境など)の間で異なり得る唯一のものである。設定には以下のものが含まれる。
– データベース、Memcached、他のバックエンドサービスなどのリソースへのハンドル
– Amazon S3やTwitterなどの外部サービスの認証情報
– デプロイされたホストの正規化されたホスト名など、デプロイごとの値
…
Twelve-Factor Appは設定を 環境変数 に格納する。これをみたときに環境変数に設定を全て格納すれば良いのかとも思えるが、よく読むと
>なお、この“設定”の定義には、アプリケーション内部の設定は 含まない ことに注意する。内部の設定とは、Railsにおけるconfig/routes.rbや、Sprin
オブジェクト指向な人に捧ぐGO言語の特徴
# TL;DR
GO言語はOOP(オブジェクト指向)な思考回路で書くと割ととっちらかってしまうので、特徴的なところをピンポイントで抑えたいとおもいます。
# 多態性(ポリモーフィズム)はダックタイピングで実現
宣言的に親(あるいはインターフェイス)を記述しなくても、そのオブジェクトが実装条件を満たしていれば親(インターフェイス)として振舞うことができます。
こちらがインターフェイス。
“`go
type Hito interface {
walk() string
}
“``Hito`インターフェイスを満たすにはstructが`walk()`を持つように実装します。`Male`というstructを実装してみました。
“`go
type Male struct {
}func (m Male) walk() string {
return “テクテク”
}
“``Male`は`Hito`インターフェイスを満たしているので`doWalk(h Hito)`に引数として渡せるようになります。
“`go
func main() {
male :=
Go言語でポリモーフィズムとその便利さを理解する
継承・カプセル化・ポリモーフィズムはオブジェクト指向の3大要素と呼ばれています。そのうち今回の記事で扱うポリモーフィズムは日本語では多様性などと訳されますが、どのような概念なのかがいまいち分かりずらく、実装例を見ても何の役に立つのか自分には長らくピンと来ませんでした。
本記事では、ポリモーフィズムとは何か、何が便利なのかをGo言語での実装例と共に紹介していきたいと思います。##ポリモーフィズムとは?
ポリモーフィズムを一言で言うと、**「同じインターフェイスを操作しても、それを実装するインスタンスによって違う動きをさせる仕組み」**であると自分は理解しています。オブジェクト指向の本として有名な「オブジェクト指向でなぜ作るのか」では
>類似したクラスに対するメッセージの送り方を共通化する仕組みと説明されています。Javaで言うと、同じクラスのメソッドを呼び出しても、そのメソッドを持つ親クラスを継承する子クラスによって実際の動きは異なってくるというところでしょうか。ポリモーフィズムはメソッドの呼び出し側で楽をするための仕掛けです。
※言葉で聞いただけでピンと来なくても、実装例
gonum/matで単位行列を生成する
# コード
“`go
idSlice := make([]float64, n*n)
for i := 0; i < n; i++ { idSlice[i*(n+1)] = 1 } idMat := mat.NewDense(n, n, idSlice) ``` これでできる。 # サンプルコード `go get gonum.org/v1/gonum/mat`を実行して、コピペすれば動く。 ```go package main import ( "fmt" "gonum.org/v1/gonum/mat" ) func matPrint(X mat.Matrix) { fa := mat.Formatted(X, mat.Prefix(""), mat.Squeeze()) fmt.Printf("%v\n", fa) } func main() { n := 4 idSlice := make([]float64, n*n) for i := 0; i < n; i++ { idSlice[i*(n+1)] = 1 } idMat :=
GO言語でmapの値に構造体を使う時はポインタにすると良いらしい
# mapの値に構造体を入れたらエラーが・・・
先日、職場でこんな感じのコードを書いたらエラー。(コードはサンプルです)“`go:umaimono.go
package main
import “fmt”type Food struct {
ID int
Name string
Description string
}func main(){
fmt.Println(MakeResult()[“うまいもの”])
}func MakeResult() map[string]Food {
result := make(map[string]Food)
result[“うまいもの”] = Food{
ID: 1,
Name: “焼肉”,
}
result[“うまいもの”].Description = “すこぶるうまい”return result
}“`
これを実行すると `cannot assign to struct field result[“うまいもの”].Descripti
Goのディレクトリ構成(追記予定)
# Goのディレクトリ構成をきっちり知っておきたい
## /src 開発用のディレクトリ
– プロジェクトごとにsrc 以下にディレクトリをつくる。
– ソースコード管理プラットフォームごとに切るのがGoの思想的
– go install するとpkgに実行したパッケージをコンパイルしたものが作られる。
– go buildをmainパッケージで実行すると/binに実行可能なバイナリファイルが作られる。## /bin 実行可能ファイル、バイナリ
– 環境変数PATHに設定することが推奨されている。’export PATH:=$GOPATH/bin’## /pkg コンパイルされたファイル
– srcからコンパイルされた非アプリケーション実行ファイルの.aファイル## tips
– githubからgo getするようなものは、実態としてはgit cloneとgo installである。
goとpythonで始めるgRPCの事始め
gRPCってなんだって思って調べてたら実装してしまっていたので備忘録として残します。
## ゴール
このようなディレクトリ構造でpythonクライアントとgoサーバー間でgRPCを実装していくことをゴールとします.
“`
$GOPATH/src/pygo-grpc/
├ client/
| ├ app.py
| ├ hello_pb2_grpc.py (gRPC自動生成)
| └ hello_pb2.py (gRPC自動生成)
├ protos/
| └ hello.protc
└ server/
├ grpc-server/hello.pb.go (gRPC自動生成)
└ server.go
“`
## プロトコルを定義– `$GOPATH`の配下に新しいワーキングディレクトリを作成し、プロトコルを定義します。
“`
~ $ cd $GOPATH/src
src $ mkdir pygo-grpc;cd $_
pygo-grpc $ mkdir client protocs server serve
Golangらしいコードを書こう
# はじめに
この記事は未完成です。Golangらしいコードというのは文化のようなものだと考えているので、様々な方の意見を取り込みながら、この記事を充実させていきたいと考えています。よろしくお願いいたします。# Goらしいコードの前に
全言語共通のルールについてまとめます。きれいなコードを学びたい方へのおすすめは[リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%
今すぐ「レイヤードアーキテクチャ+DDD」を理解しよう。(golang)
# 今すぐ「レイヤードアーキテクチャ+DDD」を理解しよう。(golang)
とはいっても記事を読み終わるのに三時間くらいかかる気がします。
## 対象読者
– レイヤードアーキテクチャ+DDDの実装に困っている方
– バックエンドエンジニアを目指す学生
– APIサーバを開発したことがある方## はじめに
アーキテクチャは学習コストが高いと言われています。その要因の一つとして考えられるのはアーキテクチャの概念を学んだとしても、アーキテクチャの細かい部分は実装者に左右されるので、ネット上にあるプログラムは概念とはズレがあるので混乱しやすいことだと思います。それに加えて他のサイトを参考にした時もやはり実装者による違いで混乱してしまうからです。
したがって、概念とズレがある部分はしっかり言及したうえで解説することが良いと思います。## アーキテクチャを採用する意味
– レイヤ間が疎結合になるため、ユニットテストが行いやすいこと。
– 責務がはっきりしているので、保守性が高いこと。
– 途中からフレームワーク等を入れたとしても影響範囲が限定されるので外部の技術の変更が容易なこと。
Beego+MySQL+Docker+Heroku
# はじめに
普段は,docker-composeでgolangとMySQLを管理しています.
Herokuへのアプリのアップを試みました.(DBストレージw)
個人開発でDBストレージ消費するサービス運用って,素敵なサーバどうしたものか...# 環境
ubuntu16
Herokuアカウント・クレジットカード登録済み.
ローカルではアプリ動きます.
Dockerfileにはマルチステージビルドを採用しています.
herokuへpushするimageは25MBくらいでした.(もっと小さくしたい)“`:Dockerfile
FROM golang:1.12.12-alpine3.9 AS build
ENV GOPATH $GOPATH:/go
ENV PATH $PATH:$GOPATH/binRUN apk update && \
apk add –no-cache git ca-certificates tzdata && \
go get “github.com/go-sql-driver/mysql” && \
go get “github.co
Golang APIレイヤードアーキテクチャで組んでみた。
# 初めに
今回アーキテクチャを触れるきっかけは、Golangで成果物を作りたいと考えたときに、文法などの知識を知っていてもどのようにフォルダの構造を決めてどの実装から取りかかればいいかわからなかったことです。アーキテクチャを勉強することでどのpackageがどのpackageに依存しているのかを明確にすることができるとともに、どの実装から取りかかれば良いのかも依存関係から知ることができる。##対象読者
* アーキテクチャってなんだろうという方
* Goで何か成果物を作りたいが最初何から実装すればいいかわからない方
* 他# 実装内容
今回実装したのは、TodoリストのRESTAPIである。この記事を書いたのはGetAll()APIを実装した段階である。# アーキテクチャ
今回はレイヤードアーキテクチャを採用しました。アーキテクチャを初めて触れるにあたり触れやすいと聞いたので採用しました。構造は以下の通り作成しました。矢印方向に依存しています。![レイヤードアーキテクチャ.png](https://qiita-image-store.s3.ap-northeast-1
Goでマルチドキュメントのyamlを読み込む方法
Go言語でマルチドキュメントのyamlを取り扱いたい.
具体的にはkubernetesのマニフェストを読み込んでごにょごにょしたかった## マルチドキュメントyaml
“`yaml
—
test: 1
sample: hoge
—
test: 2
sample: hogehoge
—
test: 3
foo: foo
“`こういうハイフン区切りになっているyamlファイル
## 実際のコード
“`main.go
package mainimport (
“fmt”
“gopkg.in/yaml.v2”
“os”
)func main() {
f, err := os.Open(“test.yml”)
if err != nil {
return
}
defer f.Close()dec := yaml.NewDecoder(f)
var tmp map[interface{}]interface{}
for(dec.Decode(&tmp)) == nil {
fmt.Printf(“%v\n”, tmp)
ノリと勢いで Go で Hello World する
# はじめに
タイトルのままです。
読み手の対象者は、
僕と同じで– Go 言語って名前だけ知ってる
– 何ができるのか、とか、実際にコードを見たことはない
– でもなんか触ってみたいそんな人です。
いつも通り、やりながら、書いていきます。
やることは、
[公式のなんかセットアップ系のページ](https://golang.org/doc/install) をやります## 実行環境
持病のローカルに色々入れてはいけない病が出ちゃうので、
docker 内でやります。docker の alpine でやります。
“`
$ cat /proc/version
Linux version 4.9.184-linuxkit (root@a8c33e955a82) (gcc version 8.3.0 (Alpine 8.3.0) ) #1 SMP Tue Jul 2 22:58:16 UTC 2019
“`## 1. install
知らないんだから、持ってないですw
“`
$ apk add go
fetch http://dl-cdn.alpine
Golangでベクトル演算を高速化しようとしてみた話
# はじめに
Goでスライスのベクトル演算などを書いてたときに、今までは
“`go
for i := 0; i対象の演算
Goで指定日の0時ジャスト(00:00:00)を取得する処理とテスト
#概要
担当しているプロジェクトで当日の0時ジャストのタイミングを取得したいという要件があり、以下の記事を参考に実行しました。[golangのtime.Timeの当日00:00:00を取得する方法とベンチマーク](https://qiita.com/ushio_s/items/3e270933641710bbd88e)
が、実装にあたり問題があったので0時ジャストを取得する方法を確認しつつ、時間処理で注意すべきことをまとめます。
# TL;DR
処理速度を求めないのであれば、以下のようにすればできます。処理速度を求めるのであればUnixTimeを使ったやり方がありますが、タイムゾーンの処理で問題が起こる可能性があるのでこの記事を読むことをお勧めします。あと、時間処理はテスト書いた方が良いです。
“`go
func (timeUtil *TimeUtilUsingDate) GetJust0AM(t time.Time) time.Time {return time.Date(t.Year(),
t.Month(),
t.Day(),
0, 0, 0, 0
Prometheus APIをGolangのプログラムから呼び出してexporterから収集されたメトリクス情報を取り出す
Prometheusサーバで収集されたデータの取り出し方として、PrometheusはHTTP APIを提供しています。
[Prometheus HTTP API](https://prometheus.io/docs/prometheus/latest/querying/api/)Exporterをカスタマイズして作成する方法はたくさん記事がありましたが、PrometheusのデータをHTTP APIから取得する方法についての情報があまり見当たらなかったので備忘のため記録しておきます。
## Prometheus HTTP APIをcurlで呼び出してみる
“`json:prometheusに登録されているtarget一覧の取得
$ curl -G “http://
/api/v1/targets” | jq .
{
“status”: “success”,
“data”: {
“activeTargets”: [
{
“discoveredLabels”: {
“__a
Goのmath/randの共有ロックでハマった
## 概要
Go で rand.Float64() を使ったアプリケーションを実装したのですが、goroutine を用いて並列処理をしたときにパフォーマンスが出ませんでした。
pkg/profile でプロファイリングをすると math/rand.Float64 の呼び出しに時間がかかっていることがわかりました。## プロファイリング結果
以下 pprof を用いたプロファイリングの解析結果です。
“`
(pprof) top -cum
Showing nodes accounting for 112.74s, 62.62% of 180.04s total
Dropped 67 nodes (cum <= 0.90s) Showing top 10 nodes out of 45 flat flat% sum% cum cum% 0 0% 0% 155.60s 86.43% github.com/d-tsuji/tpsa.(*TPSA).Solve.func1 7.12s 3.95
Goでよく見るnewとNewを調べたときのメモ
# はじめに
Goのソースコードを読んでいて、構造体関連で `new` や `New` をよく見かけていたのですが、それぞれの意味や違いをあまり理解していなかったので、それらを調べたときのメモです。# new
newは指定した型のポインタ型を生成する関数です。
例えば、構造体型のポインタ型を生成できます。“`go:newを使った初期化
type person struct {
height float32
weight float32
}func main() {
p := new(person)
p.height = 182.0
p.weight = 75.5
fmt.Println(p) // &{182 75.5}
fmt.Printf(“%T”, p) // *main.person person型のポインタであることがわかる
fmt.Println()
fmt.Printf(“%p”, p) // 0xc00001e060 もちろんアドレスもある
}
“`構造体型のポインタ型を生成する手段としては、他にアドレス演算子を使う方法もあります。
【Go】goimportsによるimportのグルーピングが不満なので実装した
# 実装
[github.com/istsh/goimport-fmt](https://github.com/istsh/goimport-fmt/tree/master)## 実装するに至った背景
筆者は普段、`gofmt`や`goimports`を使用しているのですが、importの順序が毎回決まった順序にならず、手動で直すことが何度もあったので、自動でソートしてくれる機能を実装することにしました。# importの順序
https://github.com/golang/go/wiki/CodeReviewComments#importsimportは下記のようにグルーピングして空行を入れて記述することになっています。
“`go
package mainimport (
// 標準パッケージ
“fmt”
“hash/adler32”
“os”// サードパーティのライブラリ
“appengine/foo”
“appengine/user”// 自プロジェクト
“github.co