iOS Test Night #5 の勉強会
iosにおけるテスト周りに関する知識を共有することを目的としてイベント
イベントレポート dev.classmethod.jp
eureka Meetup #06 -Go! Go! Go!- の勉強会
Goのパッケージ構成について
Go Package Guidelines
- godocを見る機会が多い
Package構成について
- Goのインターフェースはi/oパッケージを参考にする
- GoではMVCパターンを過剰に意識しないほうが良い
- とにかく、野良でなく標準パッケージを参考にするとよい
- cryptoパッケージも参考になる
登壇資料
https://speakerdeck.com/kaneshin/go-package-guidelines
標準ライブラリのコードリーディングで学ぶGo
Go言語のいいところ
- コンパクトな言語仕様
- 本質に集中するための標準ツール群
- 充実した公式ドキュメント
- 可読性の高い標準ライブラリ
- 他にもいっぱい…
可読性の高い標準ライブラリ
- 標準ライブラリも可読性とパフォーマンスのバランスに優れ、コードリーディングしやすい
- Goには三項演算子すらない
コードリーティングするためのツール
- 普段使用しているエディタの機能で。
- (IntelliJ IDEA + Go plugin) or Gogland(どちらも機能は同じ)
- interfaceの実装満たす構造体へのジャンプも可能
compressパッケージのリーディングから学べたこと
- Goの考え方やイディオム
- ビット演算
- スライス演算
- Goにおけるバイト列の操作方法の一部
- gzip圧縮の概要とそのアプリケーションコードレベルの記述
Go学習リソース
- 公式ドキュメント、Wiki
- Go Blog,Go Wiki,Effective Goあたり
- 有名なパッケージ
- Go界隈の有名人をSNSでフォローする
- Go関連のカンファレンス・イベントのスライドをチェックする
- GopherCon https://github.com/gophercon/2017-talks
- 書籍
- プログラミング言語Go(日英両方あり)
- はじめてのGo言語
- スターティングGo言語
登壇資料
https://speakerdeck.com/yu81/biao-zhun-raiburarifalsekodorideingudexue-bugo
Goぽいんとれっすん
Comments
- ちゃんと書く
- 特に公開している型や関数、パッケージ
- 英語コメント
- 日本語話者の多い会社ではやめたほうが良い
- golint
- エディタ、CI、Git huuk
- しっかり対応するなら英・日
Test
- 書く
- 書く文化を作る
- テストコードがない場合はPRで指摘する
- CIの設定は最初にする。常に緑に保つ
- 実行方法を統一しておく
- make,guip,bazei
- CIの変更も簡単になる
- TIPS
- テーブルドリブンテスト
- TestMain
- サブテスト
- ゴールデンファイル
Continuous Integration
CircleCI? Travis? Jenkins?
- 何でもいいからいれましょう
- gofmt,go vet golint
- golintはコメントを正しく書く必要がある
- go test -p 1
- -pはコア数 並列数のこと
GoのCIはSemaphoreはおすすめ
- ただし、CicleCIとかよりは、機能は少ない
Vendor
していない場合は早めに入れる
- 開発者、テスト、リリースごとに違うバージョン
XXXを使えばいいですか?
- 新しくやるならdepがおすすめ
- gb,glideでもいいみたい
Knowledge Sharing
Goのナレッジ
ビジネスナレッジ
- Qiita,Confluence,Git book
- OWNERSファイル
Package Layout
- 難しい
- プロジェクトの規模・性質によってまちまち
- 細分化しすぎない
- テストが遅くなる
- https://github.com/olivere/elastic
- 統一しすぎない
- 分ける軸
- 機能ベース
- 依存ライブラリベース
pprof/trace
pprofは全員が使えるようになるべき
- memory,cpu etc…
- goroutineを追加した場合のリーク検知
- uber/go-torch,rakyll/gom,mkevac/debugcharts
Trace機構は早い段階でいれたほうが良い
- New Relic,Stackdriver,X-Ray,LightStep,AppDash…
- https://github.com/evalphobia/apptracer
python boto3で認証情報を指定する方法
boto3で認証情報を指定する方法を探していたので 以下にメモしておく。
import boto3 s3 = boto3.client('s3', aws_access_key_id='xxxxxxxxxxxxxxxxxxxx', aws_secret_access_key='yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', region_name='ap-northeast-1') print s3.list_buckets().__class__.__name__ または from boto3.session import Session session = Session(aws_access_key_id='xxxxxxxxxxxxxxxxxxxx', aws_secret_access_key='yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', region_name='ap-northeast-1') s3 = session.client('s3') print s3.list_buckets().__class__.__name__
centOS7をvagrantでインストールした際に固定IPアドレスが有効にならなくてはまったのでメモ
Vagrantファイルの編集(以下の記述が必要) config.vm.provision "shell", inline: <<-SHELL sudo systemctl restart network.service SHELL
勉強会等で集めた資料
Geeks Who Drink in Tokyo–Go Go Golang Edition!
- golang(Go言語)が好きなひと、情報共有しよう!
https://nulab.connpass.com/event/59086/presentation/?utm_campaign=new_event_links_to_group_member&utm_source=notifications&utm_medium=email&utm_content=detail_btn
CA.go #1
- サイバーエージェントのメディアサービスを担当しているGoエンジニアによる勉強会 https://www.google.com/url?hl=ja&q=https://cyberagent.connpass.com/event/58120/presentation/?utm_campaign%3Dnew_event_links_to_participant%26utm_source%3Dnotifications%26utm_medium%3Demail%26utm_content%3Ddetail_btn&source=gmail&ust=1499763990991000&usg=AFQjCNFB-7K2twnUIAoZJikE0PO19OTttQ
CA.kt #1
- サイバーエージェントのメディアサービスを担当しているKotlinエンジニアによる勉強会 https://cyberagent.connpass.com/event/57963/presentation/?utm_campaign=new_event_links_to_group_member&utm_source=notifications&utm_medium=email&utm_content=detail_btn
CAMPFIRE Growth Hack #2
- ヤフーがグロースハックマインドをUPDATEする場をつくっていきます! https://yj-meetup.connpass.com/event/58809/presentation/?utm_campaign=new_event_links_to_group_member&utm_source=notifications&utm_medium=email&utm_content=detail_btn
春の脆弱性祭り
- 〜 基本的なWebアプリの脆弱性について、もう一度勉強し直してみた 〜 https://d-cube.connpass.com/event/59762/presentation/?utm_campaign=new_event_links_to_group_member&utm_source=notifications&utm_medium=email&utm_content=detail_btn
Realm meetup #23
APIドキュメンテーションツールを使いこなす【Api Blueprint編】
- APIドキュメンテーションツールを使いこなす【Api Blueprint編】
https://d-cube.connpass.com/event/60587/presentation/?utm_campaign=new_event_links_to_group_member&utm_source=notifications&utm_medium=email&utm_content=detail_btn
Data Engineering and Data Analysis Workshop #1
Go勉強会メモ(#ca_go)
[概要]
サイバーエージェントのメディアサービスを担当している
Goエンジニアによる勉強会
[概要URL]
[ハッシュタグ]
#ca_go
[その他]
シリーズもので何回もやっていく予定との事
FRESH!にて生放送(以下を参考)
freshlive.tv
developers.cyberagent.co.jp
[タイムテーブル]
『sync.Poolで爆上げメモリ効率』
『知っておきたいinterfaceとreflect』
『今更だけどGob』
『golang profilingの基礎』
================================================
『sync.Poolで爆上げメモリ効率』パフォーマンスチューニングについて
- sync.PoolはGo1.3から標準パッケージに入った
- パフォーマンスチューニングでメモリアロケーションを減らすのは超大事
- sync.Poolでできることはメモリを上手いこと使いまわせる
- メモリを捨てずに再利用することで新しくメモリを確保しなくて済む
- sync.Poolを使用した場合と使用しない場合でのベンチマークを実施した結果はsync.Poolを使用した場合の方がメモリのアロケーションが少ない(メモリの無駄使いをしていない)
■実用的な使い方について(知見)
- 用途に応じて適切な初期化する
- Resetメソッドは使っておいた方が良い
- 何でもとりあえずPollという話ではない
- 高頻度で使いまわすでかいオブジェクトで使用するのがよいみたい
================================================
『知っておきたいinterfaceとreflect』←自分はあまり理解できる内容ではなかった...
■What is a Go interface(Go interfaceとは何か)
- Goの中には色々なタイプがある大きく分けて2つある(concretetypeとabstracttypes)
- interface{}
■Why usin an interface?(なぜinterfaceを使うのか)
- GenericAlgorithm
- HidingImplementationDetail
- InterceptionPoint
■Go interface in Ownd!(Owndというサービスでどのあたりで使用しているのか)
- MarshalHtml
- type assertions
- interfaceはメソッドの集合体ではなく、小さく使う(Rob Pike in his Go Proverbs)
■Where is the reflect?(refletcについて)
- type assertions(*partially)
- "Reflection is never clear"(ww)
================================================
『今更だけどGob』
■Golang
golevedb
bigcache
■Gobって?
- gob形式のバイナリ変換
- RPCのようなNW経由でのデータのやちとり(Golang同士でないと駄目)
- ファイルへのデータ保存
- データ定義不要,self-describing、効率的
- 構造変更が可能
■encoding/jsonは?
- []byteへのEncoder、Decoderがある
- 両者でTypeが一致しなくても良い
- gobと使い方は変わらない?
GobEncode/JsonEncodeとGobDecode/JsonDecodeでベンチ比較
※Gobの方がメモリ、アロケーションを見ても効率的
■protobufは?
■注意点
- interface使う時は注意(事前にgob.Registerする必要がある)
■まとめ
================================================
『golang profilingの基礎』
■Profiling of golang
- GolangのProfilingを行うパッケージ
- CPU、Memory、goroutineなどの情報を収集
- protocol buffer形式でプロファイルを保存
- `go tool pprof`によりプロファイルを分析
■CPU Profiler
- 関数の実行時間をプロファイリング
- CPU Profiler以外のProfilerはLookupで呼び出し
- heap(Heap Profiler)
メモリーのプロファイリング
- goroutine(Goroutine Profiler)
実行中のgoroutineのプロファイリング
- block(Blocking Profiler)
同期処理でwaitingしているgoroutineをプロファイリング
※runtime.SetBlockProfileRateを1以上に設定することで有効化
- mutex(Mutex Profiler) go1.8から追加
同期処理をブロックするmutexのみをプロファイリング
※runtime.SetMutexProfileFractionを1以上に設定することで有効化
■Relational Packages
- runtime/pprof
- net/http/pprof
- HTTP Server用のプロファイラ
- github.com/pkg/profile
`runtime/ppfor`をより簡単に利用できるようなwrapper
■Check Point
- runtime.mallocgc
メモリアロケーションが多く発生している
- runtime.chanrecv,sync.Mutex
ロック処理により多くの待ちが発生している
- syscall Read/Write
ioの読み書きが大量に発生している
ヒープサイズの小ささにより、GCの発生が頻繁に発生している
■Go Debug Options
- Memory Allocator Trace
GODEBUG=allocfreetrace=1
- Garbage Collector Trace
GODEBUG=gctrace=1
- Scheduler Trace
GODEBUG=schedtrace=1000 ./
JenkinsでGitにPush時に自動ビルドさせる
# --- jenkinsユーザーにスイッチ su -s /bin/bash jenkins # --- .sshがなければディレクトリ作成(/var/lib/jenkins/.ssh) mkdir ~/.ssh; cd ~/.ssh # --- 秘密鍵の作成(パスワードが聞かれるが無視) ssh-keygen -t rsa # --- 権限600に設定 chmod 600 id_rsa # --- 公開鍵(id_rsa.pub)をGitHubへ登録する https://github.com/settings/keys GitHubの「SSH Keys」にアクセスして「New SSH Key」を押す # --- GitHubにSSHアクセスする ssh -T git@github.com git ls-remote -h git@github.com:masahiro-yoshitachi/xxx.git HEAD ※上記のどちらかのコマンドを実行すると、known hostsが追加されてGitHub側の設定は完了