Anzeige

20130228 Goノススメ(BPStudy #66)

Developer Advocate at Google um Google
28. Feb 2013
Anzeige

Más contenido relacionado

Similar a 20130228 Goノススメ(BPStudy #66)(20)

Anzeige

Último(20)

Anzeige

20130228 Goノススメ(BPStudy #66)

  1. Goノススメ 21世紀のプログラミング言語 山口 能迪 id : ymotongpoo 1
  2. 自己紹介 • 山口能迪(やまぐちよしふみ) • YouTube Technical Account Manager, Google Inc. • id: ymotongpoo – とんぷーと呼ばれています 2
  3. 自己紹介 • Pythonが好きです • 翻訳 「Java開発者のための関数プログラミング」 オライリー・ジャパン 2012年06月発行 1,365円 (Ebook) 「Learn You Some Erlang for Great Good!」 オーム社 絶賛翻訳中 価格未定 3
  4. これまで使ってきた言語 • C++ 動力学計算をゴリゴリと • Java 前職で製品の拡張など • PHP 学生時代にWebサービス開発 • Python 汎用的になんでも • OCaml アルゴリズム • Go 汎用的になんでも 4
  5. どんな言語を使ってますか? • C • Python • Java • Ruby • Objective-C • Perl • C++ • PHP • C# • JavaScript • Erlang • Lua • Haskell • R • OCaml • Prolog • Common Lisp • Tcl 5
  6. なぜその言語を 使っていますか? 6
  7. ◯◯言語を使う理由 • 実行速度が速い • ビルドをしなくて済む • 煩わしい型を明記しなくてよい • テストがしやすい • Webアプリが簡単に作れる • 並列処理が簡単に書ける etc... 7
  8. 不満に思うことは ありませんか? 8
  9. ◯◯言語はここが不満 • 実行速度が遅い • ビルド時間が長い • 依存関係解決が面倒(Makefile, Maven) • 型が緩過ぎてテストが面倒 • インストールしただけでは何もできない • 並列処理を書くのが面倒 etc… 9
  10. 誰もが同じような 不満を抱えている 10
  11. Goが開発された経緯 ある日、Rob Pike、Ken Thompson、Robert Griesemerは考えた 「今、こういう言語が求められている」 1. 単一のマシンでも巨大なコードベースをビルド 2. 依存関係を簡単に解決 3. 強い型付け・柔軟・型解決も素早い型システム 4. GCがありマルチコアの並列性サポートする 5. LLな書きやすさ 11
  12. 12
  13. Agenda 今日はGoについて次のお話をします • Goの実行環境&ビルド • Go言語仕様 • 標準パッケージ&標準ツール • Goを使った外部サービス • Goの事例 • Go関連情報 13
  14. 標準パッ 外部サー 実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • 実行速度 • ビルドの容易さ • 対応プラットフォーム 14
  15. 実行環境とビルド 実行速度 前提 • Goはコンパイル型言語 • コンパイルされたバイナリはプラットフォーム ネイティブ • ランタイム環境はビルドされたバイナリに内包 予想 • Cよりちょっと遅いけどLLよりは十分速い? 15
  16. 実行環境とビルド 実行速度 出典:The Computer Language Benchmarks Game LL Go http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.php 16
  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 e fannkuch-redux 2x 1/2 70x 1/2 = = k-nucleotide 2x 1/2 8x 1/4 = = reverse-complement 2x 2x 10x 1/2 2x 2x pidigits 2x = = 1/2 11x 2x n-body 2x = 46x = = = mandelbrot 2x = 78x = = = spectral-norm 4x = 131x = 3x 2x fasta 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. 実行環境とビルド ビルドの容易さ goツールで依存関係を自動解決&ビルド ソースコード 直接レポジトリを指定 ビルド (git, hg, bzr, svn) package hoge $ cd $GOPATH $ go get import ( $ go build -o main “github.com/foo/go-spam” $ ./main “bitbucket.org/gopher/bar” … ) go get: 必要な全パッケージの取得 func SomeProcess(…) {…} go build: プロジェクトのビルド 18
  19. 実行環境とビルド 対応プラットフォーム CPUアーキテクチャ OS – i386 – FreeBSD 7+ – Linux 2.6.23+ – amd64 – Mac OS X 10.6+ – arm – Windows 2000+ クロスコンパイルが可能! 19
  20. 標準パッ 外部サー 実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • 強い型付けかつ柔軟な型システム • 言語レベルでサポートされた並列化 (goroutine & channel) 20
  21. 言語仕様 型システム 強い型付け ダメな例 type Celsius float64 type Fahrenheit float64 型の不一致 c: Celsius型 func SomeFunc() Fahrenheit { f: Fahrenheit型 c := Celsius(100) f := Fahrenheit(20) return c + f } 21
  22. 言語仕様 型システム 強い型付け 良い例 type Celsius float64 明示的に型をキャスト type Fahrenheit float64 func (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. 言語仕様 型システム 強い型付け • ビルドが通った時点で型チェックは問題ない • 記述量の削減につながっている → 型推論 型が暗黙の内にキャストさ れないので、Celsius型であ 冗長な書き方 ることが保証されている var c1 Celsius c1 := Celsius(100) var c2 Celsius c2 := Celsius(2) c1 = Celsius(100) c := c1 + c2 c2 = Celsius(2) var c Celsius c = c1 + c2 23
  24. 言語仕様 型システム struct Goにはクラスはありません structにはフィールドを持て type Rectangle struct { ます Width int Length int } structはメソッドを持てます func (r Rectangle) Area() int { return r.Width * r.Length } 24
  25. 言語仕様 型システム interface ダックタイピングのようなことができます type Shape interface { Interfaceではメソッドだけ Area() int } 定義します type Rectangle struct { Width int Length int Interfaceで定義されたメ } ソッドを実装したstruct func (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. 言語仕様 型システム interface type 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. 言語仕様 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. 言語仕様 goroutine 簡単な記述で並列(非同期)処理が可能に 非同期 var ch = make(chan string) $ go run main.go func 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. 言語仕様 channel 非同期な処理同士のやり取りを行うための窓口 “Don't 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. 言語仕様 channel func 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. 言語仕様 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
  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 utf8 bufio des debug fmt gif fcgi cgo unsafe builtin dsa dwarf go jpeg httptest debug bytes ecdsa elf ast png httputil pprof compress 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 syscall container 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 time http://golang.org/pkg/ 33
  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. 標準パッケージ 便利な標準ツール群 Goでの開発を助ける標準ツール • go build パッケージをビルド • go get 必要なパッケージを取得 • go install 必要なパッケージを取得&ビルド • go run 一時的にビルドし実行 • go test テストとベンチマークを実行 • gofmt フォーマットを直してくれる • godoc ドキュメントを生成 35
  36. 標準パッケージ 便利な標準ツール群 go test • xxx_test.go内のTestXxxやBenchmarkXxxとい う関数を実行する コード例 結果 package main % go test import ( 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. 標準パッケージ 便利な標準ツール群 gofmt Bike Shed • 「インデント幅は4にしろ!」「いや8だ!」 • 「ifと{の間にはスペース開けるだろ!」 • 「演算子の前後にスペースは開けるだろ!」 コミット前に“gofmt -w”と打てばいいだけ 自動化スクリプト等が同梱されているので設定しましょう 37
  38. 標準パッケージ 便利な標準ツール群 godoc GOROOTとGOPATH以下のgodocを表示するコマ ンド % godoc –http=“:8080” 38
  39. 標準パッ 外部サー 実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • Webサービス実行環境 • 継続テストサービスでのサポート 39
  40. 外部サービス Google App Engine • Google App Engine 1.5.0より採用 • Python, Javaとフレームワーク部が薄い – 認証やメールなど必要な機能は揃っている • スピンアップが速い • インターフェースが標準パッケージと同じ https://developers.google.com/appengine/docs/go/ 40
  41. 外部サービス Google App Engine 構成 myapp/ app.yaml main()はGAE側で暗黙的に持 hello/ つのでinit()を呼ぶ app.go app.go package hello app.yaml application: helloworld import ( "fmt" version: 1 "net/http" runtime: go ) api_version: go1 func init() { http.HandleFunc("/", handler) handlers: } - url: /.* script: _go_app func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Hello, world!") } 41
  42. 外部サービス dotCloud dotCloudのエンジニアが動くようにした 構成 dotcloud.yml myapp/ 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. 外部サービス Heroku 公式にはサポートしていないが動くらしい (やってみたらMercurialのインストールでこけた) 動いたら教えて下さい https://gist.github.com/kr/299535bbf56bf3016cba 43
  44. 外部サービス Travis CI • 有名なCIサービス • GitHub上のレポジトリを継続テスト • go testを走らせるだけ .travis.yaml の例 language: go script: go test http://about.travis-ci.org/docs/user/languages/go/ 44
  45. 外部サービス drone.io • CIサービスとしてTravis CIの最右翼 • GitHub, Bitbucket, Google Codeが利用可 – Git, Mercurial, Bazaar, Subversionを利用可 • go testを走らせるだけ Build Commandsの例 go get go build go test -short 45
  46. 標準パッ 外部サー 実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • Goを利用している事例 46
  47. 事例 vitess (YouTube) • vitess (vtocc) • MySQLのロードバランサ – YouTubeの全MySQLクエリをさばいている – Rowキャッシュとかもしてる • プレゼンはここで見られます 47
  48. 事例 vitess (YouTube) • Goを採用した理由 1. CとPythonの間で書きやすく簡潔に書ける • ログローテーション 105行 • コネクションプール 227行 • memcacheクライアント 250行 2. ビルド&テストのサイクルが早い 3. 標準ライブラリが豊富で楽 4. 簡潔に書ける 48
  49. 事例 Doozer (Heroku) • Doozer • PaxosのGo実装 • Goを採用した理由 1. 言語として並行性のサポート • goroutine 2. 標準パッケージが豊富 3. gofmt 4. 静的リンクのバイナリ 5. 文法が簡潔 49
  50. 事例 他の大きな事例 • ngmoco:) – 独自HTTPサーバ & ロガー • Canonical – JujuをPythonからGoに移行 • Atlassian – 仮想マシンクラスタのテストシステム https://code.google.com/p/go-wiki/wiki/GoUsers 50
  51. 標準パッ 外部サー 実行環境&ビルド 言語仕様 ケージ&標 事例 情報 準ツール ビス ここで触れること • チュートリアル • 環境設定 • コミュニティ 51
  52. 情報 チュートリアル たいていのことは公式サイトに載っている • A Tour of Go – http://tour.golang.org/ • パッケージ一覧 – http://golang.org/pkg/ • Go公式サイト – http://golang.org/doc/ • 日本語訳サイト – http://golang.jp/ 52
  53. 情報 環境設定 • インストール – ビルド済みバイナリを入れるだけ – http://code.google.com/p/go/downloads/list • 環境変数の設定 – GOROOT – GOARCH – GOOS 53
  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. 情報 コミュニティ • メーリングリスト – golang-nuts • Google+上のコミュニティ – Go+ – Golang JP 55
  56. 乗るしかない このビッグウェーブに 56
  57. 情報 イベント告知 Go Conference 2013 spring http://connpass.com/event/1906/ 57
  58. 58

Hinweis der Redaktion

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