20130228 Goノススメ(BPStudy #66)

15,188 views

Published on

20130228 BPStudy #66でのGoに関する発表

Published in: Technology
2 Comments
44 Likes
Statistics
Notes
No Downloads
Views
Total views
15,188
On SlideShare
0
From Embeds
0
Number of Embeds
4,490
Actions
Shares
0
Downloads
1
Comments
2
Likes
44
Embeds 0
No embeds

No notes for slide
  • そうだ、Goを作ろう!
  • http://benchmarksgame.alioth.debian.org/u32q/benchmark.php?test=all&lang=go&lang2=gcchttp://blog.jgc.org/2012/05/to-boldly-go-where-node-man-has-gone.htmlhttp://areyoufuckingcoding.me/2012/08/16/parallelism-for-the-win/ただのアルゴリズムベンチマークでしか無いが、速度はJavaに匹敵、コード記述量はPython並。実際のコードはライブラリ等を使う速度や記述力であることを加味してほしい。
  • 147の標準パッケージcrypto: 暗号化関係encoding: フォーマット関係image: 画像関係net: 通信関係testing: テストgo: Goのソースコード解析など
  • 全部紹介するのは大変なので下の3つだけ紹介
  • go build
  • http://blog.dotcloud.com/go-on-dotcloud
  • https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/V0U8LS_gdYw
  • https://www.usenix.org/conference/lisa12/vitess-scaling-mysql-youtube-using-go
  • https://www.usenix.org/conference/lisa12/vitess-scaling-mysql-youtube-using-go動画ではビルドは3秒で終わると言っている他にもconcurrencyとcgoについて触れていた
  • Paxosは、信頼性の低い複数の処理ノードによるネットワークで「コンセンサス」を得るための各種手順Paxos自体は汎用的なアルゴリズムでさまざまな問題に適用できますが、最近のNoSQLの文脈で語られるのは「データストアをマルチマスター構成にしたときに、どうやってデータの整合性を効率的に確保するか」って問題へのPaxos応用です。Paxosは独立した並列なプロセスをメッセージパッシングで行うので、goroutine & channelがはまったwebsocketとか便利だった(いまは準標準パッケージ)無駄な議論をしなくて済むようになったデプロイがすごく楽簡潔に書けてとてもよい
  • Jujuは「サービス実装・オーケストレーションフレームワーク」と呼ばれる管理ツールで、複数の物理/仮想サーバーを一括管理できる。
  • 日本語訳サイトは結構頑張って本体に追いついています
  • 20130228 Goノススメ(BPStudy #66)

    1. 1. Goノススメ21世紀のプログラミング言語 山口 能迪 id : ymotongpoo 1
    2. 2. 自己紹介• 山口能迪(やまぐちよしふみ)• YouTube Technical Account Manager, Google Inc.• id: ymotongpoo – とんぷーと呼ばれています 2
    3. 3. 自己紹介• Pythonが好きです• 翻訳 「Java開発者のための関数プログラミング」 オライリー・ジャパン 2012年06月発行 1,365円 (Ebook) 「Learn You Some Erlang for Great Good!」 オーム社 絶賛翻訳中 価格未定 3
    4. 4. これまで使ってきた言語• C++ 動力学計算をゴリゴリと• Java 前職で製品の拡張など• PHP 学生時代にWebサービス開発• Python 汎用的になんでも• OCaml アルゴリズム• Go 汎用的になんでも 4
    5. 5. どんな言語を使ってますか?• C • Python• Java • Ruby• Objective-C • Perl• C++ • PHP• C# • JavaScript• Erlang • Lua• Haskell • R• OCaml • Prolog• Common Lisp • Tcl 5
    6. 6. なぜその言語を使っていますか? 6
    7. 7. ◯◯言語を使う理由• 実行速度が速い• ビルドをしなくて済む• 煩わしい型を明記しなくてよい• テストがしやすい• Webアプリが簡単に作れる• 並列処理が簡単に書けるetc... 7
    8. 8. 不満に思うことは ありませんか? 8
    9. 9. ◯◯言語はここが不満• 実行速度が遅い• ビルド時間が長い• 依存関係解決が面倒(Makefile, Maven)• 型が緩過ぎてテストが面倒• インストールしただけでは何もできない• 並列処理を書くのが面倒etc… 9
    10. 10. 誰もが同じような不満を抱えている 10
    11. 11. Goが開発された経緯ある日、Rob Pike、Ken Thompson、RobertGriesemerは考えた「今、こういう言語が求められている」 1. 単一のマシンでも巨大なコードベースをビルド 2. 依存関係を簡単に解決 3. 強い型付け・柔軟・型解決も素早い型システム 4. GCがありマルチコアの並列性サポートする 5. LLな書きやすさ 11
    12. 12. 12
    13. 13. Agenda今日はGoについて次のお話をします• Goの実行環境&ビルド• Go言語仕様• 標準パッケージ&標準ツール• Goを使った外部サービス• Goの事例• Go関連情報 13
    14. 14. 標準パッ 外部サー実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • 実行速度 • ビルドの容易さ • 対応プラットフォーム 14
    15. 15. 実行環境とビルド 実行速度前提• Goはコンパイル型言語• コンパイルされたバイナリはプラットフォーム ネイティブ• ランタイム環境はビルドされたバイナリに内包予想• Cよりちょっと遅いけどLLよりは十分速い? 15
    16. 16. 実行環境とビルド 実行速度出典:The Computer Language Benchmarks Game LL Go http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.php 16
    17. 17. 実行環境とビルド 実行速度 x64 Ubuntu Intel Q6600 quad-core Compared w/ C Go 1.0.3 Python 3.3.0 Java 7r11 Benchmark Time Code Time Cod Time Cod e efannkuch-redux 2x 1/2 70x 1/2 = =k-nucleotide 2x 1/2 8x 1/4 = =reverse-complement 2x 2x 10x 1/2 2x 2xpidigits 2x = = 1/2 11x 2xn-body 2x = 46x = = =mandelbrot 2x = 78x = = =spectral-norm 4x = 131x = 3x 2xfasta 4x = 88x = 2x =binary-trees 16x = 30x = 2x =regex-dna 25x 1/4 5x 1/5 3x 1/3 http://benchmarksgame.alioth.debian.org/u64q/benchmark.php?test=all&lang=go&lang2=gcc 17
    18. 18. 実行環境とビルド ビルドの容易さgoツールで依存関係を自動解決&ビルドソースコード 直接レポジトリを指定 ビルド (git, hg, bzr, svn)package hoge $ cd $GOPATH $ go getimport ( $ go build -o main “github.com/foo/go-spam” $ ./main “bitbucket.org/gopher/bar” …) go get: 必要な全パッケージの取得func SomeProcess(…) {…} go build: プロジェクトのビルド 18
    19. 19. 実行環境とビルド 対応プラットフォームCPUアーキテクチャ OS – i386 – FreeBSD 7+ – Linux 2.6.23+ – amd64 – Mac OS X 10.6+ – arm – Windows 2000+ クロスコンパイルが可能! 19
    20. 20. 標準パッ 外部サー実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • 強い型付けかつ柔軟な型システム • 言語レベルでサポートされた並列化 (goroutine & channel) 20
    21. 21. 言語仕様 型システム強い型付けダメな例type Celsius float64type Fahrenheit float64 型の不一致 c: Celsius型func SomeFunc() Fahrenheit { f: Fahrenheit型 c := Celsius(100) f := Fahrenheit(20) return c + f} 21
    22. 22. 言語仕様 型システム強い型付け良い例type Celsius float64 明示的に型をキャストtype Fahrenheit float64func (c Celsius) ToF() Fahrenheit { return Fahrenheit((9*c/5)+32)} Fahrenheit型同士なの で大丈夫func SomeFunc() Fahrenheit { c := Celsius(100) f := Fahrenheit(20) return c.ToF() + f http://play.golang.org/p/sVaOQioOI-} 22
    23. 23. 言語仕様 型システム強い型付け• ビルドが通った時点で型チェックは問題ない• 記述量の削減につながっている → 型推論 型が暗黙の内にキャストさ れないので、Celsius型であ冗長な書き方 ることが保証されているvar c1 Celsius c1 := Celsius(100)var c2 Celsius c2 := Celsius(2)c1 = Celsius(100) c := c1 + c2c2 = Celsius(2)var c Celsiusc = c1 + c2 23
    24. 24. 言語仕様 型システムstructGoにはクラスはありません structにはフィールドを持てtype Rectangle struct { ます Width int Length int} structはメソッドを持てますfunc (r Rectangle) Area() int { return r.Width * r.Length} 24
    25. 25. 言語仕様 型システム interface ダックタイピングのようなことができますtype Shape interface { Interfaceではメソッドだけ Area() int} 定義しますtype Rectangle struct { Width int Length int Interfaceで定義されたメ} ソッドを実装したstructfunc (r Rectangle) Area() int { は、そのinterfaceを実装し return r.Width * r.Length ているとみなされます}func main() { class Rectangle implements Shape r := Rectangle{Width:4, Length:3} fmt.Println(r.Area())} class Rectangle(Shape) 25
    26. 26. 言語仕様 型システムinterfacetype Square struct { Length int} これもShape interfaceを実装 しているfunc (sq Square) Area() int { return sq.Length * sq.Length}func main() { r := Rectangle{Width:3, Length:5} sq := Square{Length:2} Interfaceにキャストもできる s1 := Shape(r) s2 := Shape(sq)} 26
    27. 27. 言語仕様 goroutine 簡単な記述で並列(非同期)処理が可能に同期func Hello() { $ go run main.go fmt.Println(“はろう”)} 5秒まったよfunc Waiter() { はろう time.Sleep(5 * time.Second) $ fmt.Println(“まったよ”)}func main() { 順番通りに呼び出される Waiter() (予想通り) Hello()} http://play.golang.org/p/qSF7AiI80P 27
    28. 28. 言語仕様 goroutine 簡単な記述で並列(非同期)処理が可能に非同期var ch = make(chan string) $ go run main.gofunc Hello() { はろう fmt.Println(“はろう”) 5秒まったよ} $func Waiter() { time.Sleep(5 * time.Second) fmt.Println(“5秒まったよ”) ch <- “done”} “go”と書いて呼び出すだけで 別のgoroutine上で実行され、func main() { 次の処理が呼び出される go Waiter() Hello() <-ch} http://play.golang.org/p/U2mF6jNCYp 28
    29. 29. 言語仕様 channel 非同期な処理同士のやり取りを行うための窓口 “Dont communicate by sharing memory, share memory by communicating.” – Rob Pike イメージ コード例 func ProcessA(c chan int) { Process A Process B … c <- SomeProcessA() … Channel C } func ProcessB(c chan int) { … SomeProcessB(<-c) … }http://talks.golang.org/2012/concurrency.slide 29
    30. 30. 言語仕様 channelfunc Bakery(store chan string) { for i := 1; i <= 10; i++ { チャンネルに値を渡す breadName := "bread " + strconv.Itoa(i) fmt.Println(breadName + "shipped to store!") store <- breadName チャンネルを閉じる } close(store)}func Consumer(store chan string) { for { bread, ok := <-store チャンネルが開いてい if !ok { break る限り値を取得 } fmt.Println("baught " + bread) }}func main() { store := make(chan string) fmt.Println("store open!") 並列化 go Bakery(store) go Consumer(store) http://play.golang.org/p/6RhknPqi2d time.Sleep(60 * time.Second)} 30
    31. 31. 言語仕様 channel 非同期な処理同士のやり取りを行うための窓口素数計算// A concurrent prime sieve // The prime sieve: Daisy-chain Filter processes. func main() {package main ch := make(chan int) // Create a new channel. go Generate(ch) // Launch Generate goroutine.// Send the sequence 2, 3, 4, ... to channel ch. for i := 0; i < 10; i++ {func Generate(ch chan<- int) { prime := <-ch for i := 2; ; i++ { print(prime, "n") ch <- i // Send i to channel ch. ch1 := make(chan int) } go Filter(ch, ch1, prime)} ch = ch1 }// Copy the values from channel in to channel out, }// removing those divisible by prime.func Filter(in <-chan int, out chan<- int, prime int) { for { i := <-in // Receive value from in. if i%prime != 0 { out <- i // Send i to out. } }} http://play.golang.org/p/9U22NfrXeq 31
    32. 32. 標準パッ 外部サー実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • 豊富な標準パッケージ • 便利な標準ツール群 32
    33. 33. 標準パッケージ 豊富な標準パッケージ “Battery included”と呼ばれるPython並archive crypto database errors image net regexp unicode tar aes sql expvar color http syntax utf16 zip cipher driver flag draw cgi runtime utf8bufio des debug fmt gif fcgi cgo unsafebuiltin dsa dwarf go jpeg httptest debugbytes ecdsa elf ast png httputil pprofcompress elliptic gosym build index pprof sort bzip2 hmac macho doc suffixarray mail strconv flate md5 pe parser io rpc strings gzip rand encoding printer ioutil jsonrpc sync lzw rc4 ascii85 scanner log smtp atomic zlib rsa asn1 token syslog textproto syscallcontainer sha1 base32 hash math url testing heap sha256 base64 adler32 big os iotest list sha512 binary crc32 cmplx exec quick ring subtle csv crc64 rand signal text tls gob fnv mime user scanner x509 hex html multipart path tabwriter pkix json template filepath template pem reflect pars xml e timehttp://golang.org/pkg/ 33
    34. 34. 標準パッケージ 豊富な標準パッケージ 準標準パッケージ 標準ではないがコアメンバーが管理しているレポジトリ名 crypto net image bcrypt otr dict bmp blowfish pbkdf2 html testdata bn256 poly1305 atom tiff cast5 ripemd160 testdata curve25519 salsa20 webkit md4 salsa scripted nacl scrypt idna box ssh ipv4 secretbox terminal proxy ocsp test publicsuffix openpgp twofish spdy armor xtea websocket clearsign xts elgamal errors packet https://code.google.com/p/go/source/browse?repo=xxxxx s2k 34
    35. 35. 標準パッケージ 便利な標準ツール群Goでの開発を助ける標準ツール• go build パッケージをビルド• go get 必要なパッケージを取得• go install 必要なパッケージを取得&ビルド• go run 一時的にビルドし実行• go test テストとベンチマークを実行• gofmt フォーマットを直してくれる• godoc ドキュメントを生成 35
    36. 36. 標準パッケージ 便利な標準ツール群 go test • xxx_test.go内のTestXxxやBenchmarkXxxとい う関数を実行するコード例 結果package main % go testimport ( PASS "testing" ok _/…/main 0.006s)func TestAdd(t *testing.T) { const n, m = 2, 3 const want = 6 if out := Add(n, m); out != want { t.Errorf(”%v, want %v", out, want) }} 36
    37. 37. 標準パッケージ 便利な標準ツール群gofmt Bike Shed• 「インデント幅は4にしろ!」「いや8だ!」• 「ifと{の間にはスペース開けるだろ!」• 「演算子の前後にスペースは開けるだろ!」コミット前に“gofmt -w”と打てばいいだけ自動化スクリプト等が同梱されているので設定しましょう 37
    38. 38. 標準パッケージ 便利な標準ツール群godocGOROOTとGOPATH以下のgodocを表示するコマンド% godoc –http=“:8080” 38
    39. 39. 標準パッ 外部サー実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • Webサービス実行環境 • 継続テストサービスでのサポート 39
    40. 40. 外部サービス Google App Engine• Google App Engine 1.5.0より採用• Python, Javaとフレームワーク部が薄い – 認証やメールなど必要な機能は揃っている• スピンアップが速い• インターフェースが標準パッケージと同じ https://developers.google.com/appengine/docs/go/ 40
    41. 41. 外部サービス Google App Engine 構成 myapp/ app.yaml main()はGAE側で暗黙的に持 hello/ つのでinit()を呼ぶ app.goapp.gopackage hello app.yaml application: helloworldimport ( "fmt" version: 1 "net/http" runtime: go) api_version: go1func init() { http.HandleFunc("/", handler) handlers:} - url: /.* script: _go_appfunc handler(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Hello, world!")} 41
    42. 42. 外部サービス dotClouddotCloudのエンジニアが動くようにした構成 dotcloud.ymlmyapp/ golang: dotcloud.yml type: custom golang/ buildscript: golang/builder builder processes: src/ hello: ~/current/bin/hello hello/ ports: app.go www: http config: build_package: hello普通にnet/httpを使うアプリ http://blog.dotcloud.com/go-on-dotcloud 42
    43. 43. 外部サービス Heroku公式にはサポートしていないが動くらしい(やってみたらMercurialのインストールでこけた)動いたら教えて下さい https://gist.github.com/kr/299535bbf56bf3016cba 43
    44. 44. 外部サービス Travis CI• 有名なCIサービス• GitHub上のレポジトリを継続テスト• go testを走らせるだけ.travis.yaml の例language: goscript: go test http://about.travis-ci.org/docs/user/languages/go/ 44
    45. 45. 外部サービス drone.io• CIサービスとしてTravis CIの最右翼• GitHub, Bitbucket, Google Codeが利用可 – Git, Mercurial, Bazaar, Subversionを利用可• go testを走らせるだけBuild Commandsの例go getgo buildgo test -short 45
    46. 46. 標準パッ 外部サー実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • Goを利用している事例 46
    47. 47. 事例 vitess (YouTube)• vitess (vtocc)• MySQLのロードバランサ – YouTubeの全MySQLクエリをさばいている – Rowキャッシュとかもしてる• プレゼンはここで見られます 47
    48. 48. 事例 vitess (YouTube)• Goを採用した理由 1. CとPythonの間で書きやすく簡潔に書ける • ログローテーション 105行 • コネクションプール 227行 • memcacheクライアント 250行 2. ビルド&テストのサイクルが早い 3. 標準ライブラリが豊富で楽 4. 簡潔に書ける 48
    49. 49. 事例 Doozer (Heroku)• Doozer• PaxosのGo実装• Goを採用した理由 1. 言語として並行性のサポート • goroutine 2. 標準パッケージが豊富 3. gofmt 4. 静的リンクのバイナリ 5. 文法が簡潔 49
    50. 50. 事例 他の大きな事例• ngmoco:) – 独自HTTPサーバ & ロガー• Canonical – JujuをPythonからGoに移行• Atlassian – 仮想マシンクラスタのテストシステム https://code.google.com/p/go-wiki/wiki/GoUsers 50
    51. 51. 標準パッ 外部サー実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • チュートリアル • 環境設定 • コミュニティ 51
    52. 52. 情報 チュートリアルたいていのことは公式サイトに載っている• A Tour of Go – http://tour.golang.org/• パッケージ一覧 – http://golang.org/pkg/• Go公式サイト – http://golang.org/doc/• 日本語訳サイト – http://golang.jp/ 52
    53. 53. 情報 環境設定• インストール – ビルド済みバイナリを入れるだけ – http://code.google.com/p/go/downloads/list• 環境変数の設定 – GOROOT – GOARCH – GOOS 53
    54. 54. 情報 環境設定• ワークスペース – 1プロジェクトにつき1ワークスペース – http://golang.org/doc/code.html• 環境変数の設定 newmath/ GOPATH pkg/ – GOPATH linux_amd64/ example/ newmath.a• 補助ツール src/ example/ – GVM, goenv newmath/ sqrt.go 54
    55. 55. 情報 コミュニティ• メーリングリスト – golang-nuts• Google+上のコミュニティ – Go+ – Golang JP 55
    56. 56. 乗るしかないこのビッグウェーブに 56
    57. 57. 情報 イベント告知Go Conference 2013 springhttp://connpass.com/event/1906/ 57
    58. 58. 58

    ×