SlideShare une entreprise Scribd logo
1  sur  58
Goノススメ
21世紀のプログラミング言語
             山口 能迪
      id : ymotongpoo
                        1
自己紹介

• 山口能迪(やまぐちよしふみ)
• YouTube Technical Account Manager, Google
  Inc.
• id: ymotongpoo
  – とんぷーと呼ばれています




                                              2
自己紹介

• Pythonが好きです
• 翻訳

   「Java開発者のための関数プログラミング」
        オライリー・ジャパン
        2012年06月発行 1,365円 (Ebook)


   「Learn You Some Erlang for Great Good!」
        オーム社
        絶賛翻訳中 価格未定


                                             3
これまで使ってきた言語

•   C++       動力学計算をゴリゴリと
•   Java      前職で製品の拡張など
•   PHP       学生時代にWebサービス開発
•   Python   汎用的になんでも
•   OCaml    アルゴリズム
•   Go        汎用的になんでも




                               4
どんな言語を使ってますか?

•   C             •   Python
•   Java          •   Ruby
•   Objective-C   •   Perl
•   C++           •   PHP
•   C#            •   JavaScript
•   Erlang        •   Lua
•   Haskell       •   R
•   OCaml         •   Prolog
•   Common Lisp   •   Tcl

                                   5
なぜその言語を
使っていますか?



           6
◯◯言語を使う理由

• 実行速度が速い
• ビルドをしなくて済む
• 煩わしい型を明記しなくてよい
• テストがしやすい
• Webアプリが簡単に作れる
• 並列処理が簡単に書ける
etc...



                   7
不満に思うことは
 ありませんか?



           8
◯◯言語はここが不満

• 実行速度が遅い
• ビルド時間が長い
• 依存関係解決が面倒(Makefile, Maven)
• 型が緩過ぎてテストが面倒
• インストールしただけでは何もできない
• 並列処理を書くのが面倒
etc…



                               9
誰もが同じような
不満を抱えている



           10
Goが開発された経緯

ある日、Rob Pike、Ken Thompson、Robert
Griesemerは考えた

「今、こういう言語が求められている」
 1.   単一のマシンでも巨大なコードベースをビルド
 2.   依存関係を簡単に解決
 3.   強い型付け・柔軟・型解決も素早い型システム
 4.   GCがありマルチコアの並列性サポートする
 5.   LLな書きやすさ


                                   11
12
Agenda

今日はGoについて次のお話をします
• Goの実行環境&ビルド
• Go言語仕様
• 標準パッケージ&標準ツール
• Goを使った外部サービス
• Goの事例
• Go関連情報



                    13
標準パッ
                          外部サー
実行環境&ビルド   言語仕様   ケージ&標          事例   情報
                  準ツール     ビス



  ここで触れること

  •   実行速度
  •   ビルドの容易さ
  •   対応プラットフォーム




                                           14
実行環境とビルド
    実行速度

前提
• Goはコンパイル型言語
• コンパイルされたバイナリはプラットフォーム
  ネイティブ
• ランタイム環境はビルドされたバイナリに内包

予想
• Cよりちょっと遅いけどLLよりは十分速い?


                          15
実行環境とビルド
            実行速度
出典:The Computer Language Benchmarks Game
                                                                    LL




                                              Go




               http://benchmarksgame.alioth.debian.org/u64q/which-programs-are-fastest.php
                                                                                             16
実行環境とビルド
                実行速度
                                                                  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
実行環境とビルド
               ビルドの容易さ

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
実行環境とビルド
      対応プラットフォーム

CPUアーキテクチャ       OS
 – i386            –   FreeBSD 7+
                   –   Linux 2.6.23+
 – amd64
                   –   Mac OS X 10.6+
 – arm             –   Windows 2000+




           クロスコンパイルが可能!


                                        19
標準パッ
                          外部サー
実行環境&ビルド   言語仕様   ケージ&標          事例   情報
                  準ツール     ビス



  ここで触れること

  • 強い型付けかつ柔軟な型システム

  • 言語レベルでサポートされた並列化
    (goroutine & channel)


                                           20
言語仕様
           型システム

強い型付け
ダメな例
type Celsius float64
type Fahrenheit float64        型の不一致
                               c: Celsius型
func SomeFunc() Fahrenheit {   f: Fahrenheit型
    c := Celsius(100)
    f := Fahrenheit(20)

    return c + f
}




                                                   21
言語仕様
           型システム

強い型付け
良い例
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
言語仕様
           型システム

強い型付け
• ビルドが通った時点で型チェックは問題ない
• 記述量の削減につながっている
  → 型推論          型が暗黙の内にキャストさ
                          れないので、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
言語仕様
            型システム

struct
Goにはクラスはありません
                                  structにはフィールドを持て
type Rectangle struct {
                                  ます
    Width int
    Length int
}
                                  structはメソッドを持てます
func (r Rectangle) Area() int {
    return r.Width * r.Length
}




                                                 24
言語仕様
               型システム

 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
言語仕様
            型システム

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
言語仕様
                   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
言語仕様
                   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
言語仕様
                  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
言語仕様
                    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
言語仕様
                       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
標準パッケージ
                    豊富な標準パッケージ

   “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
標準パッケージ
                 豊富な標準パッケージ

 準標準パッケージ
 標準ではないがコアメンバーが管理している
レポジトリ名
     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
標準パッケージ
     便利な標準ツール群

Goでの開発を助ける標準ツール
• go build   パッケージをビルド
• go get     必要なパッケージを取得
• go install 必要なパッケージを取得&ビルド
• go run     一時的にビルドし実行
• go test    テストとベンチマークを実行
• gofmt      フォーマットを直してくれる
• godoc      ドキュメントを生成

                           35
標準パッケージ
                   便利な標準ツール群

    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
標準パッケージ
    便利な標準ツール群

gofmt       Bike Shed
• 「インデント幅は4にしろ!」「いや8だ!」
• 「ifと{の間にはスペース開けるだろ!」
• 「演算子の前後にスペースは開けるだろ!」

コミット前に“gofmt -w”と打てばいいだけ
自動化スクリプト等が同梱されているので設定しましょう



                           37
標準パッケージ
           便利な標準ツール群

godoc
GOROOTとGOPATH以下のgodocを表示するコマ
ンド

% godoc –http=“:8080”




                              38
標準パッ
                          外部サー
実行環境&ビルド   言語仕様   ケージ&標          事例   情報
                  準ツール     ビス



  ここで触れること

  • Webサービス実行環境

  • 継続テストサービスでのサポート




                                           39
外部サービス
      Google App Engine

• Google App Engine 1.5.0より採用
• Python, Javaとフレームワーク部が薄い
 – 認証やメールなど必要な機能は揃っている
• スピンアップが速い
• インターフェースが標準パッケージと同じ




             https://developers.google.com/appengine/docs/go/


                                                         40
外部サービス
                 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
外部サービス
            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
外部サービス
     Heroku

公式にはサポートしていないが動くらしい
(やってみたらMercurialのインストールでこけた)


動いたら教えて下さい




              https://gist.github.com/kr/299535bbf56bf3016cba
                                                           43
外部サービス
          Travis CI

• 有名なCIサービス
• GitHub上のレポジトリを継続テスト
• go testを走らせるだけ

.travis.yaml の例
language: go
script: go test




                  http://about.travis-ci.org/docs/user/languages/go/
                                                                       44
外部サービス
          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
標準パッ
                          外部サー
実行環境&ビルド   言語仕様   ケージ&標          事例   情報
                  準ツール     ビス



  ここで触れること

  •   Goを利用している事例




                                           46
事例
     vitess (YouTube)

• vitess (vtocc)
• MySQLのロードバランサ
 – YouTubeの全MySQLクエリをさばいている
 – Rowキャッシュとかもしてる
• プレゼンはここで見られます




                               47
事例
     vitess (YouTube)

• Goを採用した理由
 1. CとPythonの間で書きやすく簡潔に書ける
   • ログローテーション             105行
   • コネクションプール             227行
   • memcacheクライアント 250行
 2. ビルド&テストのサイクルが早い
 3. 標準ライブラリが豊富で楽
 4. 簡潔に書ける




                                   48
事例
           Doozer (Heroku)

• Doozer
• PaxosのGo実装

• Goを採用した理由
 1. 言語として並行性のサポート
      •    goroutine
 2.       標準パッケージが豊富
 3.       gofmt
 4.       静的リンクのバイナリ
 5.       文法が簡潔

                              49
事例
        他の大きな事例

• ngmoco:)
  – 独自HTTPサーバ & ロガー
• Canonical
  – JujuをPythonからGoに移行
• Atlassian
  – 仮想マシンクラスタのテストシステム




               https://code.google.com/p/go-wiki/wiki/GoUsers


                                                           50
標準パッ
                          外部サー
実行環境&ビルド   言語仕様   ケージ&標          事例   情報
                  準ツール     ビス



  ここで触れること

  • チュートリアル

  • 環境設定

  • コミュニティ

                                           51
情報
          チュートリアル

たいていのことは公式サイトに載っている
• A Tour of Go
  – http://tour.golang.org/
• パッケージ一覧
  – http://golang.org/pkg/
• Go公式サイト
  – http://golang.org/doc/



• 日本語訳サイト
  – http://golang.jp/

                               52
情報
       環境設定

• インストール
 – ビルド済みバイナリを入れるだけ
 – http://code.google.com/p/go/downloads/list


• 環境変数の設定
 – GOROOT
 – GOARCH
 – GOOS



                                                 53
情報
      環境設定

• ワークスペース
 – 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
情報
       コミュニティ

• メーリングリスト
 – golang-nuts
• Google+上のコミュニティ
 – Go+
 – Golang JP




                     55
乗るしかない
このビッグウェーブに



             56
情報
         イベント告知

Go Conference 2013 spring
http://connpass.com/event/1906/




                                   57
58

Contenu connexe

Tendances

PyCon JP 2014 plone terada
PyCon JP 2014 plone teradaPyCon JP 2014 plone terada
PyCon JP 2014 plone teradaManabu Terada
 
20160730 fluentd meetup in matsue slide
20160730 fluentd meetup in matsue slide20160730 fluentd meetup in matsue slide
20160730 fluentd meetup in matsue slidecosmo0920
 
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発Takuya Ueda
 
Polyphony: Python ではじめる FPGA
Polyphony: Python ではじめる FPGAPolyphony: Python ではじめる FPGA
Polyphony: Python ではじめる FPGAryos36
 
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみようPythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみようShinya Takamaeda-Y
 
謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装した謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装したt-sin
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10Kenta Hattori
 
Vivado hls勉強会4(axi4 master)
Vivado hls勉強会4(axi4 master)Vivado hls勉強会4(axi4 master)
Vivado hls勉強会4(axi4 master)marsee101
 
Vivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームVivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームmarsee101
 
Python と型ヒント (Type Hints)
Python と型ヒント (Type Hints)Python と型ヒント (Type Hints)
Python と型ヒント (Type Hints)Tetsuya Morimoto
 
マスター・オブ・goパッケージ
マスター・オブ・goパッケージマスター・オブ・goパッケージ
マスター・オブ・goパッケージTakuya Ueda
 
Rpn and forth 超入門
Rpn and forth 超入門Rpn and forth 超入門
Rpn and forth 超入門Yoshitaka Seo
 
Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)Uehara Junji
 
続・SECDマシン
続・SECDマシン続・SECDマシン
続・SECDマシンt-sin
 
Polyphony の並列化
Polyphony の並列化Polyphony の並列化
Polyphony の並列化ryos36
 
ROS Tutorial 02 - CIT
ROS Tutorial 02 - CITROS Tutorial 02 - CIT
ROS Tutorial 02 - CITDaiki Maekawa
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみたy-uti
 
PHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩くPHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩くshinjiigarashi
 

Tendances (20)

PyCon JP 2014 plone terada
PyCon JP 2014 plone teradaPyCon JP 2014 plone terada
PyCon JP 2014 plone terada
 
20160730 fluentd meetup in matsue slide
20160730 fluentd meetup in matsue slide20160730 fluentd meetup in matsue slide
20160730 fluentd meetup in matsue slide
 
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発
 
Polyphony: Python ではじめる FPGA
Polyphony: Python ではじめる FPGAPolyphony: Python ではじめる FPGA
Polyphony: Python ではじめる FPGA
 
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみようPythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう
PythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう
 
謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装した謎の言語Forthが謎なので実装した
謎の言語Forthが謎なので実装した
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10
 
Vivado hls勉強会4(axi4 master)
Vivado hls勉強会4(axi4 master)Vivado hls勉強会4(axi4 master)
Vivado hls勉強会4(axi4 master)
 
Vivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリームVivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリーム
 
kyotovim#1
kyotovim#1kyotovim#1
kyotovim#1
 
Python と型ヒント (Type Hints)
Python と型ヒント (Type Hints)Python と型ヒント (Type Hints)
Python と型ヒント (Type Hints)
 
マスター・オブ・goパッケージ
マスター・オブ・goパッケージマスター・オブ・goパッケージ
マスター・オブ・goパッケージ
 
Rpn and forth 超入門
Rpn and forth 超入門Rpn and forth 超入門
Rpn and forth 超入門
 
Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)
 
続・SECDマシン
続・SECDマシン続・SECDマシン
続・SECDマシン
 
Polyphony の並列化
Polyphony の並列化Polyphony の並列化
Polyphony の並列化
 
ROS Tutorial 02 - CIT
ROS Tutorial 02 - CITROS Tutorial 02 - CIT
ROS Tutorial 02 - CIT
 
PECL を数えてみた
PECL を数えてみたPECL を数えてみた
PECL を数えてみた
 
PHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩くPHP 8 で Web 以外の世界の扉を叩く
PHP 8 で Web 以外の世界の扉を叩く
 

En vedette

ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう増田 亨
 
私なりの the Go in 2014
私なりの the Go in 2014私なりの the Go in 2014
私なりの the Go in 2014Ryuji Iwata
 
AWS SDK for Go を使って作ってみた話
AWS SDK for Go を使って作ってみた話AWS SDK for Go を使って作ってみた話
AWS SDK for Go を使って作ってみた話uchimanajet7
 
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会Takuya Ueda
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンAkihiko Horiuchi
 
Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015Yoshito Tabuchi
 
CROSS 2015 モバイル開発環境セッション
CROSS 2015 モバイル開発環境セッションCROSS 2015 モバイル開発環境セッション
CROSS 2015 モバイル開発環境セッションMasahiro Tanaka
 
Delphi のひみつ!(2015/01/29 CROSS 2015)
Delphi のひみつ!(2015/01/29 CROSS 2015)Delphi のひみつ!(2015/01/29 CROSS 2015)
Delphi のひみつ!(2015/01/29 CROSS 2015)Jun Hosokawa
 
Chrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみるChrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみるMasakazu Muraoka
 
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)deris0126
 
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...Hidenori Takeshita
 
Go言語と過ごした一週間
Go言語と過ごした一週間Go言語と過ごした一週間
Go言語と過ごした一週間Shintaro Kitayama
 
Golang, make and robotics #gocon
Golang, make and robotics #goconGolang, make and robotics #gocon
Golang, make and robotics #goconHideyuki TAKEI
 
alphawing meets heroku
alphawing meets herokualphawing meets heroku
alphawing meets herokuKyosuke Kameda
 

En vedette (20)

ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
 
私なりの the Go in 2014
私なりの the Go in 2014私なりの the Go in 2014
私なりの the Go in 2014
 
AWS SDK for Go を使って作ってみた話
AWS SDK for Go を使って作ってみた話AWS SDK for Go を使って作ってみた話
AWS SDK for Go を使って作ってみた話
 
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
Goroutineとchannelから始めるgo言語@初心者向けgolang勉強会
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
100420
100420100420
100420
 
Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015Xamarin 概要 @ 2015/1/29 CROSS 2015
Xamarin 概要 @ 2015/1/29 CROSS 2015
 
CROSS 2015 モバイル開発環境セッション
CROSS 2015 モバイル開発環境セッションCROSS 2015 モバイル開発環境セッション
CROSS 2015 モバイル開発環境セッション
 
Delphi のひみつ!(2015/01/29 CROSS 2015)
Delphi のひみつ!(2015/01/29 CROSS 2015)Delphi のひみつ!(2015/01/29 CROSS 2015)
Delphi のひみつ!(2015/01/29 CROSS 2015)
 
Github第8章
Github第8章Github第8章
Github第8章
 
Chrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみるChrome osとgo言語からgoogleの今後を妄想してみる
Chrome osとgo言語からgoogleの今後を妄想してみる
 
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
Introduction to Vim plugins developed by non-Japanese Vimmer (Japanese version)
 
らくちん Go言語
らくちん Go言語らくちん Go言語
らくちん Go言語
 
HighBatch
HighBatchHighBatch
HighBatch
 
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
cli.go と cli-init で高速にコマンドラインツールを開発する / The command-line tool developed at hi...
 
Go+revel
Go+revelGo+revel
Go+revel
 
Go言語と過ごした一週間
Go言語と過ごした一週間Go言語と過ごした一週間
Go言語と過ごした一週間
 
Golang, make and robotics #gocon
Golang, make and robotics #goconGolang, make and robotics #gocon
Golang, make and robotics #gocon
 
alphawing meets heroku
alphawing meets herokualphawing meets heroku
alphawing meets heroku
 
Goを知る
Goを知るGoを知る
Goを知る
 

Similaire à 20130228 Goノススメ(BPStudy #66)

密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境Fumihito Yokoyama
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
Programming camp code reading
Programming camp code readingProgramming camp code reading
Programming camp code readingHiro Yoshioka
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, CodereadingHiro Yoshioka
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードKazuhiro Hara
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiKen'ichi Sakiyama
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドToru Tamaki
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングterurou
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めMITSUNARI Shigeo
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!Yohei Fushii
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜Taro Matsuzawa
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageTaku Miyakawa
 
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…Yasumasa Suenaga
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺MITSUNARI Shigeo
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Hiro Yoshioka
 
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2tamtam180
 
Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)tamtam180
 
Debianで組み込み環境
Debianで組み込み環境Debianで組み込み環境
Debianで組み込み環境Youhei SASAKI
 

Similaire à 20130228 Goノススメ(BPStudy #66) (20)

密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境密着!わたしのコンソールアプリ開発環境
密着!わたしのコンソールアプリ開発環境
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
Programming camp code reading
Programming camp code readingProgramming camp code reading
Programming camp code reading
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレード
 
Javaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapiJavaで簡単にgpgpu aparapi
Javaで簡単にgpgpu aparapi
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルド
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミング
 
Cプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧めCプログラマのためのカッコつけないプログラミングの勧め
Cプログラマのためのカッコつけないプログラミングの勧め
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
 
ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜ゆるふわLinux-HA 〜PostgreSQL編〜
ゆるふわLinux-HA 〜PostgreSQL編〜
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
 
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011
 
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
 
Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)Getting Started GraalVM (再アップロード)
Getting Started GraalVM (再アップロード)
 
Debianで組み込み環境
Debianで組み込み環境Debianで組み込み環境
Debianで組み込み環境
 

Plus de Yoshifumi Yamaguchi

Pythonを取り巻く開発環境 #pyconjp
Pythonを取り巻く開発環境 #pyconjpPythonを取り巻く開発環境 #pyconjp
Pythonを取り巻く開発環境 #pyconjpYoshifumi Yamaguchi
 
Sphinxで翻訳してたら本が出てた話
Sphinxで翻訳してたら本が出てた話Sphinxで翻訳してたら本が出てた話
Sphinxで翻訳してたら本が出てた話Yoshifumi Yamaguchi
 
Learn You Some Erlang for great good! 日本語化プロジェクト
Learn You Some Erlang for great good! 日本語化プロジェクトLearn You Some Erlang for great good! 日本語化プロジェクト
Learn You Some Erlang for great good! 日本語化プロジェクトYoshifumi Yamaguchi
 
[20120410] @marqsの転職を祝うLT
[20120410] @marqsの転職を祝うLT[20120410] @marqsの転職を祝うLT
[20120410] @marqsの転職を祝うLTYoshifumi Yamaguchi
 
[20110129] sphinx theme collection 2011春
[20110129] sphinx theme collection 2011春[20110129] sphinx theme collection 2011春
[20110129] sphinx theme collection 2011春Yoshifumi Yamaguchi
 
[20101203] ドキュメントを作りたくなってしまう魔法のツールsphinx(山口発表用)
[20101203] ドキュメントを作りたくなってしまう魔法のツールsphinx(山口発表用)[20101203] ドキュメントを作りたくなってしまう魔法のツールsphinx(山口発表用)
[20101203] ドキュメントを作りたくなってしまう魔法のツールsphinx(山口発表用)Yoshifumi Yamaguchi
 

Plus de Yoshifumi Yamaguchi (8)

Pythonを取り巻く開発環境 #pyconjp
Pythonを取り巻く開発環境 #pyconjpPythonを取り巻く開発環境 #pyconjp
Pythonを取り巻く開発環境 #pyconjp
 
Sphinxで翻訳してたら本が出てた話
Sphinxで翻訳してたら本が出てた話Sphinxで翻訳してたら本が出てた話
Sphinxで翻訳してたら本が出てた話
 
Learn You Some Erlang for great good! 日本語化プロジェクト
Learn You Some Erlang for great good! 日本語化プロジェクトLearn You Some Erlang for great good! 日本語化プロジェクト
Learn You Some Erlang for great good! 日本語化プロジェクト
 
[20120410] @marqsの転職を祝うLT
[20120410] @marqsの転職を祝うLT[20120410] @marqsの転職を祝うLT
[20120410] @marqsの転職を祝うLT
 
YouTube APIの紹介
YouTube APIの紹介YouTube APIの紹介
YouTube APIの紹介
 
[20110219] pfffについて
[20110219] pfffについて[20110219] pfffについて
[20110219] pfffについて
 
[20110129] sphinx theme collection 2011春
[20110129] sphinx theme collection 2011春[20110129] sphinx theme collection 2011春
[20110129] sphinx theme collection 2011春
 
[20101203] ドキュメントを作りたくなってしまう魔法のツールsphinx(山口発表用)
[20101203] ドキュメントを作りたくなってしまう魔法のツールsphinx(山口発表用)[20101203] ドキュメントを作りたくなってしまう魔法のツールsphinx(山口発表用)
[20101203] ドキュメントを作りたくなってしまう魔法のツールsphinx(山口発表用)
 

Dernier

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 

Dernier (9)

Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 

20130228 Goノススメ(BPStudy #66)

  • 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
  • 7. ◯◯言語を使う理由 • 実行速度が速い • ビルドをしなくて済む • 煩わしい型を明記しなくてよい • テストがしやすい • Webアプリが簡単に作れる • 並列処理が簡単に書ける etc... 7
  • 9. ◯◯言語はここが不満 • 実行速度が遅い • ビルド時間が長い • 依存関係解決が面倒(Makefile, Maven) • 型が緩過ぎてテストが面倒 • インストールしただけでは何もできない • 並列処理を書くのが面倒 etc… 9
  • 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
  • 57. 情報 イベント告知 Go Conference 2013 spring http://connpass.com/event/1906/ 57
  • 58. 58

Notes de l'éditeur

  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. 日本語訳サイトは結構頑張って本体に追いついています