Photo by Markus Spiske
[https://unsplash.com/@markusspiske?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit]
/ Unsplash
[https://unsplash.com/?utm_source=ghost&utm_medium=referral&utm_campaign=api-credit]
※go version go1.19 darwin/amd64
ファイルを作成するGoの関数os.OpenFileは、3つの引数を取ります。
https://pkg.go.dev/os#OpenFile
func OpenFile(name string, flag int, perm FileMode) (*File, error)
第2引数のflag intは以下のような値を入れられます
os.OpenFile("filename.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
この縦棒でつない
自社のサービスではOpenAPIを使ってサーバーを書いています。
https://swagger.io/specification/
ほぼ全てのエンドポイントに影響のあるリファクタリングをした時に、動作確認が辛すぎたのでインテグレーションテストを書くことにしました。
できたものは以下になります。
integration-test/integration_test at main · yutakahashi114/integration-test
Contribute to yutakahashi114/integration-test development by creating an
account
on GitHub.GitHubyutakahashi114
[https://github.com/yutakahashi114/integration-test/tree/main/integration_test]
以下、簡単に説明を書いていきます。
サンプルアプリケーション
以下のschemaを元にサーバーを実装します。ユーザーの一覧取得、ID指定の取得、登録、更gomockでスライスを順不同で一致させるためにMatcherを自作しました。
※追記
v1.6.0 から InAnyOrder というMatcherが用意されているので、不要になりました。
gomock package - github.com/golang/mock/gomock - pkg.go.devGo
[https://pkg.go.dev/github.com/golang/mock/gomock#InAnyOrder]gomock
GolangでUTを書く際に使います。
GitHub - golang/mock: GoMock is a mocking framework for the Go programming
language.GoMock is a mocking framework for the Go programming language. -
GitHub
- golang/mock: GoMock is a mocking framework for the Go programming language.
GitHubgolang [htt
結論
O(log (n))となり
1000項目めを求めるには0.000199s
10000項目めは0.000405sで求められました。
完成品
https://github.com/kooooohe/fibonacci/blob/master/main.g
[https://github.com/kooooohe/fibonacci/blob/master/main.go]o
通常の再帰を使った簡単な解き方
fib_blog_1.goGitHub Gist: instantly share code, notes, and snippets.Gist
262588213843476
[https://gist.github.com/kooooohe/17818f61bcfe287eb2709466eaccbf7f]func fib(num int) int {
if num <= 1 {
return num
}
return fib(num-2) + fib(num-1)
}
これだとO(2^n)となるためかなり遅い。
※メモ化については今回は割愛 結論
1つのcollectionに大量のdocumentを一括書き込みする際、500件のバッチ書き込みを20並列で実行したところ、以下の時間で完了した。
Firestoreの書き込み制限
Firestoreは書き込み時にいくつかの制限があります。詳しくは
https://firebase.google.com/docs/firestore/quotas
[https://firebase.google.com/docs/firestore/quotas?hl=ja] にあります。
今回気になったのは4番目の制限です。ある条件下では1つのcollectionに対するdocumentの書き込みは 1秒間に500件が上限、という事です。
※2022/05/11 追記
制限について、以下のように変更されていました。「できなくは無いがパフォーマンスが悪くなるかも」という閾値のようです。
あるシステムのパフォーマンス調査をしていて、この上限のせいで遅くなってるかも?という話になりました。書き込み速度について調べていると以下の記事を見つけました。
Firestoreに負荷試験(L結論
単一documentを連続で読み込むと、約 300/s 程度の速度は出せそう。
読み込み速度
前回は書き込み速度を測定
[https://medium.com/anti-pattern-engineering/firestore%E3%81%AE%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF%E9%80%9F%E5%BA%A6%E3%81%AE%E6%A4%9C%E8%A8%BC-8e1d4595a701]
しましたが、今回は読み込み速度を調べました。
環境
* Google Compute Engine、e2-medium (2 vCPU、4GB メモリ)
* Ubuntu 20.04 LTS
* Docker 19.03.8
* Golang 1.14.9
* cloud.google.com/go/firestore 1.3.0
検証
単一のdocumentを、1秒毎に指定したrateの数だけ取得し、全ての取得処理が完了するまでの時間を測定します。これを指定した回数(今回は60回)繰り返しました。使用したコードは以下です。(crea最近、GolangのORMとしてXormを使っています。GoのORMといえばGormが主流で、調べてもXormに関する記事が少なかったので、備忘録としてまとめてみました。
自分が業務で使用している機能のみをまとめたので、さらに詳しく知りたい場合は公式ドキュメントを参照ください。
環境
* Go : 1.13.1
* Xorm : 0.7.9
* PostgreSQL : 11.6
使用するテーブル
create table users( id BIGSERIAL, first_name VARCHAR(20) NOT NULL, last_name
VARCHAR(20) NOT NULL, first_name_kana VARCHAR(20), last_name_kana VARCHAR(20),
version BIGINT NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT
CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAM開発環境から本番環境まで構築し、Google Cloud Platform(GCP)にデプロイしてみました。
環境
* フロントエンド:Nuxt.js (Firebase Hosting)
* バックエンド:Go (Cloud Run)
* DB:MySQL (Cloud SQL)
()内は使用するGCPのサービスです。
ブラウザからユーザーの氏名を送信するとDBに登録され、画面に全ユーザーの氏名を表示するだけの単純なアプリケーションを作成し、GCPにデプロイしました。最終的なソースは以下です。
GitHub - yutakahashi114/go_nuxt_mysqlContribute to yutakahashi114/go_nuxt_mysql
development by creating an account on GitHub.GitHubyutakahashi114
[https://github.com/yutakahashi114/go_nuxt_mysql]ディレクトリ構成はこんな感じです。
.
├── client/
│ └── vaTop down operator precedence(再帰下降構文解析 Pratt
Parser)におけるExpression(式)の解析、AST(抽象構文木)構築 処理を追う
Goで作る インタプリタ
Go言語でつくるインタプリタ | Thorsten Ball, 設樂 洋爾 |本 | 通販 | AmazonAmazonでThorsten Ball, 設樂
洋爾のGo言語でつくるインタプリタ。アマゾンならポイント還元本が多数。Thorsten Ball, 設樂
洋爾作品ほか、お急ぎ便対象商品は当日お届けも可能。またGo言語でつくるインタプリタもアマゾン配送商品なら通常配送無料。AmazonThorsten Ball
[https://www.amazon.co.jp/dp/4873118220/ref=cm_sw_r_tw_dp_U_x_E91IDbNW6D0K4]
死ぬほどおすすめなので是非、
Goの基礎とTDDの基礎、簡単なデザインパターンの理解があるとよりよい。むしろそれらを知っている人にかなりおすすめの本である。
この本に出てくる Pratt ParserによるAS