過去に自作した
Goプロダクトの紹介
@shogo82148
自己紹介
• @shogo82148
• http://shogo82148.github.io/
• 面白法人KAYAC
• ソーシャルゲームのサーバサイドエンジニア
宣伝
Go in KAYAC
• 2014年夏、カヤックは、Go言語を積極的に推
進していきます。

http://www.kayac.com/news/2014/07/
golang
• メインは今もPerl
• ミドルウェアや開発ツールにGoが導...
KAYACで動いてる
Goプロダクト
• go-katsubushi: https://github.com/kayac/go-katsubushi
• snowflake-likeなIDジェネレータ
• stretcher: https://g...
お話すること
• 過去に自作したGoプロダクトの紹介
• Go言語を使う利点・便利な機能の紹介
• バイナリデータを扱うのが楽
• interfaceが便利
• 並行処理を書くのが楽
バイナリデータを扱うのが楽
• go-rgba4444
• androidbinary
androidbinary
• Androidアプリのメタ情報(AndroidManifest.xml)を解
析する
• モバイルで扱いやすいようメタ情報はバイナリ形式
• Android Developer Toolsのaaptコマンドで

...
androidbinary
• encoding/binaryパッケージが便利
• バイト列を整数値に変換するために利用
• var out struct {a int32, b int16, c int16}

binary.Read(buf...
go-rgba4444
• 16bit/pixelの画像形式をGo扱うライブラリ
• Unityではよく使われる形式
減色前(RGBA8888) 減色後(RGBA4444)
go-rgba4444
• C-likeな配列・構造体で省メモリ
• ex. make([][3]int32, 10000)

4bytes 3 10000分アロケート
• 実行時には型情報を持たないので、大きめのデータでも扱
える
• 簡単な...
バイナリデータを扱うのが楽
• 画像・圧縮ファイル等を標準ライブラリだけで
扱うことができる
• 対応していない形式でも encoding/binary パッ
ケージでどうにかなる
• C-likeな配列・構造体で省メモリ
interfaceが便利
• go-sql-proxy
• go-dithering
interface
type Closer interface {
Close() error

}
type A struct {}
type B struct {}
func (a *A) Close() error { return ni...
go-sql-proxy
• database/sqlパッケージを使って発行したSQL
をキャプチャする
• database/sqlのドライバ実装の一つ
• database/sql/driver .Driverを実装した構造
体を書くことで...
go-sql-proxy
// SQLが発行されたときのフックを登録
hooks := &proxy.Hooks{
// Hook functions here(Open, Exec, Query, etc.)
}
sql.Register(
...
go-dithering
• 各種ditheringアルゴリズムのGo実装
オリジナル画像 floyd steinberg
(Go標準)
false
floyd steinberg
jarvis
judice ninke
• image/draw ...
interfaceが便利
• Goの標準ライブラリはinterfaceを受け取ったり
返したりする
• 標準ライブラリの挙動が気に入らなければ、

実装だけ簡単に入れ替えられる
並行処理を書くのが楽
• go-prove/go-tap
• go-webtail/go-tail
go-prove/go-tap
• PerlのproveコマンドのGo移植・TAP(Test
Anything Protocol)のパーサ
• prove: Perlのテストを行うためのコマンド
• TAP: テストプログラムとproveの間の...
go-prove/go-tap
• perl版proveに不満があったので作った
• -jオプションでテストを並列実行できる
• TAPの集約でI/O待ちが発生し、マシン性能の生かし切れない
• 並行処理が得意なGoで再実装
• Perlのテス...
go-prove/go-tap
• 並行処理が得意なGoで再実装
• チャンネルからテスト対象のスクリプトを受け取る
• os .Commandを使ってPerlのプロセスを起動
• テストの結果をチャンネルへ
• プロダクションのコードのテスト...
go-webtail/go-tail
• tailコマンドの結果をWebsocket経由でブラウザ
に表示
• ruby版の実装(https://github.com/
r7kamura/webtail)のgo移植
• tailする処理とweb...
並行処理を書くのが楽
• goroutine
• チャンネル
• goroutine間のやり取り
• syncパッケージ
• MutexやWaitGroupでgorouineの待ち合わせ
まとめ
• Go言語を使う利点
• バイナリデータを扱うのが楽
• encoding/binary パッケージ・配列・構造体
• interfaceが便利
• 標準ライブラリの挙動を自由に変えることができる
• 並行処理を書くのが楽
• gor...
まとめ
• https://github.com/shogo82148 で公開中
• go-rgba4444
• androidbinary
• go-sql-proxy
• go-dithering
• go-prove/go-tap
• g...
過去に自作したGoプロダクトの紹介 - Goオールスターズ
Upcoming SlideShare
Loading in...5
×

過去に自作したGoプロダクトの紹介 - Goオールスターズ

0

Published on

過去に自作したGoプロダクトの紹介 - Goオールスターズ

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
0
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

過去に自作したGoプロダクトの紹介 - Goオールスターズ

  1. 1. 過去に自作した Goプロダクトの紹介 @shogo82148
  2. 2. 自己紹介 • @shogo82148 • http://shogo82148.github.io/ • 面白法人KAYAC • ソーシャルゲームのサーバサイドエンジニア
  3. 3. 宣伝
  4. 4. Go in KAYAC • 2014年夏、カヤックは、Go言語を積極的に推 進していきます。
 http://www.kayac.com/news/2014/07/ golang • メインは今もPerl • ミドルウェアや開発ツールにGoが導入されつつ ある
  5. 5. KAYACで動いてる Goプロダクト • go-katsubushi: https://github.com/kayac/go-katsubushi • snowflake-likeなIDジェネレータ • stretcher: https://github.com/fujiwara/stretcher • Consul/Surfと連携したデプロイツール • rin: https://github.com/fujiwara/Rin • AWS-S3に出力されたログをRedshiftへインポートするツール • mirage: https://github.com/acidlemon/mirage • Dockerを使ったテスト用環境構築 • alphawing: https://github.com/kayac/alphawing • Android/iOSアプリの社内配信ツール
  6. 6. お話すること • 過去に自作したGoプロダクトの紹介 • Go言語を使う利点・便利な機能の紹介 • バイナリデータを扱うのが楽 • interfaceが便利 • 並行処理を書くのが楽
  7. 7. バイナリデータを扱うのが楽 • go-rgba4444 • androidbinary
  8. 8. androidbinary • Androidアプリのメタ情報(AndroidManifest.xml)を解 析する • モバイルで扱いやすいようメタ情報はバイナリ形式 • Android Developer Toolsのaaptコマンドで
 テキスト形式に変換できる • aapt単体で配布していないのでインストールが複雑 • Alphawingのaapt依存を排除するために作成
  9. 9. androidbinary • encoding/binaryパッケージが便利 • バイト列を整数値に変換するために利用 • var out struct {a int32, b int16, c int16}
 binary.Read(buf, binary.LittleEndian, &out) • 型のサイズがはっきりしているので
 unpack( LSS , $buf)みたいな呪文を書かずに済む • apkはarchive/zipパッケージで解凍可能
  10. 10. go-rgba4444 • 16bit/pixelの画像形式をGo扱うライブラリ • Unityではよく使われる形式 減色前(RGBA8888) 減色後(RGBA4444)
  11. 11. go-rgba4444 • C-likeな配列・構造体で省メモリ • ex. make([][3]int32, 10000)
 4bytes 3 10000分アロケート • 実行時には型情報を持たないので、大きめのデータでも扱 える • 簡単な画像処理であれば十分扱える • Goで書いてあると、デザイナにコンパイルしたバイナリを渡 しやすい ※商用のソフト使ってて実際には渡してない
  12. 12. バイナリデータを扱うのが楽 • 画像・圧縮ファイル等を標準ライブラリだけで 扱うことができる • 対応していない形式でも encoding/binary パッ ケージでどうにかなる • C-likeな配列・構造体で省メモリ
  13. 13. interfaceが便利 • go-sql-proxy • go-dithering
  14. 14. interface type Closer interface { Close() error
 } type A struct {} type B struct {} func (a *A) Close() error { return nil } var foo Closer a = &A{} // OK a = &B{} // NG
  15. 15. go-sql-proxy • database/sqlパッケージを使って発行したSQL をキャプチャする • database/sqlのドライバ実装の一つ • database/sql/driver .Driverを実装した構造 体を書くことでドライバを自作できる • ドライバを直接呼び出すことも簡単
  16. 16. go-sql-proxy // SQLが発行されたときのフックを登録 hooks := &proxy.Hooks{ // Hook functions here(Open, Exec, Query, etc.) } sql.Register( new-proxy-name", proxy.NewProxy(&another.Driver{}, hooks), ) // 通常のSQLドライバと同様に扱える db, err := sql.Open("new-proxy-name", dataSourceName)
  17. 17. go-dithering • 各種ditheringアルゴリズムのGo実装 オリジナル画像 floyd steinberg (Go標準) false floyd steinberg jarvis judice ninke • image/draw .Drawerインターフェースを実装し ているので、簡単に置き換え可能
  18. 18. interfaceが便利 • Goの標準ライブラリはinterfaceを受け取ったり 返したりする • 標準ライブラリの挙動が気に入らなければ、
 実装だけ簡単に入れ替えられる
  19. 19. 並行処理を書くのが楽 • go-prove/go-tap • go-webtail/go-tail
  20. 20. go-prove/go-tap • PerlのproveコマンドのGo移植・TAP(Test Anything Protocol)のパーサ • prove: Perlのテストを行うためのコマンド • TAP: テストプログラムとproveの間のプロト コル
  21. 21. go-prove/go-tap • perl版proveに不満があったので作った • -jオプションでテストを並列実行できる • TAPの集約でI/O待ちが発生し、マシン性能の生かし切れない • 並行処理が得意なGoで再実装 • PerlのテストはただのPerlのスクリプト。通常のperlコマン ドで実行できる • proveは標準出力のTAPを集約してるだけ
  22. 22. go-prove/go-tap • 並行処理が得意なGoで再実装 • チャンネルからテスト対象のスクリプトを受け取る • os .Commandを使ってPerlのプロセスを起動 • テストの結果をチャンネルへ • プロダクションのコードのテストで試験 • proveでは32並列で7分。CPU使用率は30%程度 • go-proveで4分で終わるように。CPU使用率も95%程度に改善
  23. 23. go-webtail/go-tail • tailコマンドの結果をWebsocket経由でブラウザ に表示 • ruby版の実装(https://github.com/ r7kamura/webtail)のgo移植 • tailする処理とwebsocketでデータを返す処理を 別gorouineで処理 • 間をチャンネルでやり取り
  24. 24. 並行処理を書くのが楽 • goroutine • チャンネル • goroutine間のやり取り • syncパッケージ • MutexやWaitGroupでgorouineの待ち合わせ
  25. 25. まとめ • Go言語を使う利点 • バイナリデータを扱うのが楽 • encoding/binary パッケージ・配列・構造体 • interfaceが便利 • 標準ライブラリの挙動を自由に変えることができる • 並行処理を書くのが楽 • gorutineとチャンネル
  26. 26. まとめ • https://github.com/shogo82148 で公開中 • go-rgba4444 • androidbinary • go-sql-proxy • go-dithering • go-prove/go-tap • go-webtail/go-tail
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×