Go Conference 2019 Spring
https://connpass-tokyo.s3.amazonaws.com/thumbs/99/52/99523ec819cd6b991918354bd139dbe4.png
※ 英語の登壇多いのであとで書き直さなきゃならないことが多いです。
Key Note
https://gocon.jp/media/keynote_speaker.jpg
Goのパッケージ管理なんかに取り組んでる
犬好き
Non-reproduct
Chromeのアップデートが。。。
考慮すべきこと
依存性をもたない
マシな方法
モジュール
Go Package
3つくらいのパッケージからPuppyを構成する令
Versioningについて
セマンティックバージョニング
Go.modの方法
バージョン指定
ハッシュ指定
A->C(V.1.5) B->(V.1.8)
より小さいバージョンに、つまりC V.1.5
Mirror (= module proxy )
Cache、Proxyを用いる
Githubをオリジンサーバーとして
Go Commandがモジュールを要求すると
必要かどうかによらず全部持ってこようとする(リポジトリをクローンする)
無駄が多い
Proxyを使うと
Cacheされた中から必要なものだけ取ってくる
Versionを指定して要るものだけ
materを要求する場合?
modファイルを作って要求実行時のバージョンに保護する?
ちょっと聞いてなかった。
以下がなくなる
依存先が消える心配
依存先のサーバー遅い
https古いやり方
もうちょっと新しいのがgo.sum
sumファイルを使って依存性チェーンの最初の使用した状況を保管する
最初に実行したのが信頼できるという思考
新しいやり方
Checksumを記録するDB
問題が別の問題を引き起こす
TrancparentLog
依存の階層が深いほど見通しは悪くなる
ハッシュが変更されたときに何が信頼できるのか
Inclusion Proof
依存性ツリーのトップを保管することで、含まれる依存が検索可能となる
ツリーの再現が可能となるので〜
ツリーはある程度のチャンクに分割して保管する
Consitency proof
ツリーは線形に増加し、ストレージリソースを圧迫するか?
Checksum Databaseの性能
すべての人が同じコードを入手できる
can not lie to you Without Caught(嘘をつけない)
GOSUMDBやProxyはGo1.13からね
setenv GOPROXY=〜
自分でキャッシュサーバーを持ってもいいよ
Trillian
この辺の機能は
index.golang.
質疑
ライブラリ消したらどうなるの?
使う人がいなくなるまで残る?
二つ目の質問聞き取れなかった
TODO:あとでみる
GoProxyのいいところって
話したとおりの利点
ブレイキングチェンジへの対応?
ProxyはGoogleで使ってる?
いやー分からんけど、そのうち使うと思います。
ProxyServerはGCP?
ちがうけど、GoogleのTechnology
GoProxyは依存性ツリーを他のProxyサーバをカスケーディングに?
回答聞き取れず。
B2-1 Yohei Takeda
https://speakerd.s3.amazonaws.com/presentations/f7e186b6b12d412baa69a9e6c59a0ee1/slide_0.jpg
How A "NOT THE GATEATEST ENGINEER" BECAME A GO CONTRIBUTER
コントリビューターになりたいワナビー向けです
どうやっていいかわからない人向け
WHO AM I?
メディアDoのGoエンジニアでチームリーダ
卓球とか
コード触るの難しくて怖いよね
ドキュメントからやってみる。
Issueを見つけるのはどうやるか
大きめのIssueがすでにクローズされてるのはよく見つかる
もう自分でコントビュート出来るIssueなくね?
簡単にできるIssueを見つけよう
DocumentationとかNeedsFixでPR出てないの探す
こういう感じの(スライド参照)
やってみた
Compile/Linkのタグつきのやつを探して全部なおそう
くっそむずいわ
読み込む、読み込む、読み込む…
feedbackに応える
まずFeedbackを理解しよう
丁寧に言ってくれてるけどくっそむずい
言ってる意味はわかるけど、問題切り分けとか
ここにあまり時間を掛けないように。
タダでやってる
面と向かって話してるわけでもない
どうやって丁寧にリマンドすればいいんや。。。
Google先生教えて。。。
まぁ、過去事例を読むしかないよね。。。
で、出来た3つのパッチ
スライド見てね
コントリビューターに入った
やったぜ
まとめ
簡単じゃないよ
英語ムズイ、面と向かってないんで時間使ってテキストかけばいい。
全部のコードはわからんでも出来ることある
やったら良かったなぁってこと
やってよかったよ
エラー設計について/Designing Errors
https://lh3.googleusercontent.com/9uVX4VuT310zYyUo3HpVqy_f7sg1CmwU5LnvL6df8UKazH41WwmoDakChkn29A27pV03iA=w1200-h630-p?.png
アプリケーションのエラーハンドリング
エラーには何が求められるのか
どのように扱うか
参考サイト
このカスタマイズが話すこと
エラーとは
処理が失敗したときに発生する
既知のエラー
未知のエラー
状況によっても、同じエラーでも既知・未知が分かれる
未知のエラーを既知のエラーにするのがハンドリング
既知にもレベルがある
Panic
error
sql.tableNotFound
エラー
関係者への通知
アプリのエラー
識別、ハンドリング
Goでのパターン
errors.New
Typed
Const
return code
クライアント
プロトコルのコード
ユーザー
解決のヒントが見えるメッセージ
理解可能であること
運用者
分かる、解決出来る
再現のための情報
HOW TO ERROR HANDLING WITH APP
エラーコードを定義
外部エラーは内部エラーコードに変更
定義したエラーコードのみを想定してハンドリング
エンドユーザー向けのメッセージを追加する
必要に応じて
a
a
そのためのライブラリ、morikuni/failure
ハンドリング
Exampleあるよ
コード例紹介(スライド見てね)
CloudSign
弁護士ドットコム
クラウドサイン事業部 エンジニアチーム
クラウドサインのアーキテクチャいろいろ
リリース履歴・FW・自社開発Errorハンドリングerth
DBマイグレーション
電子署名ライブラリは外部のものをCGOで呼ぶ
デプロイ
手動 → 自動
We Are Hireing
freee
マイクロサービス基盤におけるContext採用について
経歴いろいろ
Umeda.go
freeeのビジネス
スモールビジネスを世界の主役に
創業からIPOまでを一気通貫で
rails + go gRPCマイクロサービス
100人単位でひとつのサービス
機能の並行開発
WhyGo?
メモリフットプリント
パフォーマンス
マイクロサービス基盤
共通コンポーネント化
機能
context.Context
デッドライン管理
公式が推奨する制約
構造体に埋め込まない etc...
Goによる外部プロセス起動ベストプラクティス及びtimeoutパッケージ徹底解決
Goで外部プロセスを起動する方法をシステムプログラミングにまで踏み込んで解説します。また、外部コマンドのタイムアウトを正しくハンドリングするための、github.com/Songmu/timeoutパッケージの解説もおこないます。これはGNU timeoutのGo portingですが、GNU版との差異についても解説します。
Go活動
執筆
ghq
peep
gocredits
世の中はコマンドラッパーで満ち溢れている
自分で作るの楽しいよ
煩雑な運用をGoを使って楽にする
excelをgoで使うよ
入稿系のシステム
クーポンデータの整理
もらったExcelを手ではいじらないように
バージョン管理
GoogleDrive
Excel→Yaml
セル結合とか書式とか関数とかいろいろ面倒なのをどうにかしたい
GoogleDriveへの操作いろいろサンプルとかつらみとか。
Goで大量のファイルを生成する方法
Writing Go Analyses with go/analysis
The Analysis API is used to write analyses (like those in go vet and go lint) that canhelp surface bugs and show code improvements to users. I’ll show how to use andwrite analyses, and see their results, so you can help improve your code quality.
人間は間違いを起こすので静的解析でどうにかしたいよね
こんなコードみて分かる?(サンプル参照)
で、テストがこういう感じね
で、このテストのエラーメッセージががこれよ。わかる?
これはcmp.Equalの引数が要求する型の問題ね。
で、静的解析のメッセージ見てみようか
check .
わかりやすいメッセージ出たので、ここ沸くところやで。
このように人間がミスりやすいとこをわかりやすく指摘してくれると
さて、人間には出来るけど、コンパイラーには難しいことを見つけるには
静的解析だね
そう、go/analysys
コードで見てみよう(沸くとこやで)
コード事例(設定的に記述する解析ルール)
Syntaxツリー・ASTとしてcmp.Equalをみる
analysys.Passはツリーを処理するのに便利な構造
GoでAPIサーバーをはやくつくる
クリーンアーキテクチャで依存関係を整理しつつ、コード生成(wire, grpc, xorm, gotests, implなど)を利用してGoでAPIサーバを作る方法を説明します
M3のエンジニア・マネージャ
保守性の高いWebアプリを早く作るにはどうしたらよいか
GAE/Goで技術書店むけのダウンロードカードアプリを作った
各カードに固有のQRコード
SPAとAPIサーバーをAppEngineでサクッと開発したい
アーキテクチャをかんがえる
クリーンアーキテクチャを参考にする
実装詳細を自動生成するようにしましょう
自動生成を使う
全体で使える
interface
レイヤで構造をマップする
implを使う
スキーマファーストで外部インタフェース
gRPC-WEB
アプリケーション層
Middleware
ドメイン層
ビジネスルールのための構造
永続化のためのインタフェース定義
インフラ層
ORMでマップ
リポジトリを成立させる
DIする
Wire
テスト
gotests
fix
Javaからgo
gozxing
klab
MMORPGゲームサーバとか
go以前の資産を活かしたい
Pure Goだと使い所で楽そう
Implementing Quota as a Service
Quota、あるいはRate Limitという単語を聞いたことがありますか?あるサービスのリソース単位の割当量をQuota、その中でも特に、APIのリクエスト数など、ある一定時間に対してかけられた制限をRate Limitなどと呼びます。本セッションでは、Quota as a Serviceを実装するに至った経緯や、実際に実装していくにあたって検討したアルゴリズムやOSSとして公開されているQuotaライブラリについて紹介・解説、実装で考慮する必要があった課題とその解決についてお話します。
Emacsつかってます
Twitterができる楽しいエディター
OSSConHokkaido
Quota/RateLimit
割当/レート制限
Quota as a Service?
Metrix Service/Monitoring Service
リクエストが多い
簡単に被害を被る
→制限などが必要です
対象のサービスが多いので、Quotaをサービスとして提供すべきです
やり方いろいろ
TokenBucket
リクエストの平均で制限
特定の時間感覚でTokenが配給される
LeakyBucket
ピークに対して制限する
ATMネットワークとかに使われる
Fixed Window Counter
実時間上のリクエスト数を制限する
時間間隔は固定の位置から始まる
Sliding Window Counter
開始時間がスライドする
QuataLibs
bucket4j ( x )
java
TokenBucket
scalable for multi-threading
ratelimit ( x )
python
decorator
not using database
square/quotaservice
go
TokenBucket
gRPC
WIP
lyft/ratelimit
go
gRPC
assumed to use with envoy
Goで作った
構造
gRPC
自動生成
できるだけ自動生成