web-technical-blog

web開発に関する技術メモ

iOS Test Night #5 の勉強会

testnight.connpass.com

  • iosにおけるテスト周りに関する知識を共有することを目的としてイベント

    • テストを初めてみた&ここで苦労した
    • このテスティングフレームワークはここがハマりどころ
    • テスティングフレームワークをこうやって使い分けている
    • こうやって工夫してテストしている
    • CI/CD環境はこんな感じにしている
    • WWDC2017での熱をこの場にぶつけたい
  • イベントレポート dev.classmethod.jp

eureka Meetup #06 -Go! Go! Go!- の勉強会

eure.connpass.com

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あたり
  • 有名なパッケージ
    • aws-sdk-goはAPI Clientのお手本実装の一つ
  • Go界隈の有名人をSNSでフォローする
  • 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のナレッジ

    • キャッチアップと共有は難しい
    • 更新が早い
    • 英語の情報が多い
      • wiki,gophercon,blog,git book
    • 本は古い
    • 日本語の情報インフルエンサー
  • ビジネスナレッジ

    • Qiita,Confluence,Git book
    • OWNERSファイル

Package Layout

  • 難しい
    • プロジェクトの規模・性質によってまちまち
  • 細分化しすぎない
  • 統一しすぎない
    • 分ける軸
    • 機能ベース
    • 依存ライブラリベース

pprof/trace

  • pprofは全員が使えるようになるべき

    • memory,cpu etc…
    • goroutineを追加した場合のリーク検知
    • uber/go-torch,rakyll/gom,mkevac/debugcharts
  • Trace機構は早い段階でいれたほうが良い

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__

inokara.hateblo.jp

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!

CA.go #1

CA.kt #1

CAMPFIRE Growth Hack #2

春の脆弱性祭り

Realm meetup #23

APIドキュメンテーションツールを使いこなす【Api Blueprint編】

Data Engineering and Data Analysis Workshop #1

Go勉強会メモ(#ca_go)

[概要]

サイバーエージェントのメディアサービスを担当している
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

  • サーバーサイド全般がGolang
  • API、データ連携、ログ集計、データ収集..etc
  • Recommendation以外はほとんどGolang
  • 大きなファイルを読んでDBに入れるバッチも

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専用のシリアライザー
  • 定義不要で効率的に利用可能
  • 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側の設定は完了

simple-it-life.com