SlideShare a Scribd company logo
1 of 43
Download to read offline
明日から使える気になる

Go言語による並行処理
@Peranikov
明日から使える気になるために
• とりあえずこの辺を覚えておけばGoの並行処
理のコードが読めるようになるまでを目指す
• 並行処理のパターンやより実践的な内容につ
いては書籍「Go言語による並行処理」を読も
う
おしながき
• goroutine
• sync package
• channel
• context package
goroutine
goroutine(ゴルーチン)
• Goプログラムにおける最も基本的な構成単位
• main()もGCもこのgoroutineで動いている
• 並行処理を書く基本
goroutine(ゴルーチン)
func main() {
// go キーワードを関数前に置くだけで
// 並行実行される
go func() {
fmt.Println(“ʕ◔ϖ◔ʔ”)
}()
}
goroutineは重くないのか?
• 1つにつきわずか数キロバイトのメモリで動
く
• コンテキストスイッチが速い
• 書籍の計測ではOSスレッドの90%以上速い
• 以上から生成コストについては基本無視して
よい
sync package
さきほどのコード
func main() {
// go キーワードを関数前に置くだけで
// 並行実行される
go func() {
fmt.Println(“ʕ◔ϖ◔ʔ”)
}()
}
このコードはgoroutineの完了を待っていないので
出力される前に終了してしまう可能性がある!
syncパッケージ
• メモリアクセス同期に便利なプリミティブを含む
• WaitGroup
• Mutex/RWMutex
• Cond
• Once
• Pool
WaitGroup
• カウンタを内包しており、waitすると0にな
るまでブロックするという単純な機構
• こいつが関数の引数で渡される場合、だいた
い中でカウンタを減らす(Done)処理がある
WaitGroup
func main() {
var wg sync.WaitGroup
wg.Add(1) // カウンタを1追加
go func() {

defer wg.Done() // カウンタを1減らす
fmt.Println(“ʕ◔ϖ◔ʔ”)
}()



wg.Wait() // 0になるまでブロック
}
Mutex/RWMutex
• よくあるMutex
• Lock()とUnlock()でメモリアクセス動機を取
る
• RWMutexは書き込みロック(Lock)と読み込
みロック(RLock)を提供する
Mutex/RWMutex
var m sync.RWMutex
    c := 0
    increment := func() {
        m.Lock() // 書き込みロック
        defer m.Unlock()
        c++
    }
    decrement := func() {
        m.Lock() // 書き込みロック
        defer m.Unlock()
        c--
    }
    read := func() int {
        m.RLock() // 読み込みロック
        defer m.RUnlock()
        return c
    }
Mutexの代わりにAtomicも
var count int64
increment := func() {
atomic.AddInt64(&count, 1)
}
Cond
• Wait()でブロッキングし、Signal()を実行し
goroutineにシグナルを伝えることでブロッキング
を解除する(FIFO)
• またBroadcast()を用いることですべての
goroutineのブロッキングを解除することができる
• 特にBroadcast()はchannelで実装するのは難しく
(closeでできないことはない)、またchannelより
パフォーマンスが良い
Cond
c := sync.NewCond(new(sync.Mutex))
    for i := 0; i < 10; i++ {
        go func(i int) {
            c.L.Lock()
            defer c.L.Unlock()
            c.Wait() // goroutineを待機させておく
        }(i)
    }
    for i := 0; i < 10; i++ {
        time.Sleep(1 * time.Second)
        c.Signal() // 1つずつWaitを解除(FIFO)
    }
    c.Broadcast() // まとめて解除
Cond
c := sync.NewCond(new(sync.Mutex))
    for i := 0; i < 10; i++ {
        go func(i int) {
            c.L.Lock()
            defer c.L.Unlock()
            c.Wait() // goroutineを待機させておく
        }(i)
    }
    for i := 0; i < 10; i++ {
        time.Sleep(1 * time.Second)
        c.Signal() // 1つずつWaitを解除(FIFO)
    }
    c.Broadcast() // まとめて解除
Waitのループに入る時にUnlockが呼ばれるため
事前にLockしておく必要がある
Cond
c := sync.NewCond(new(sync.Mutex))
    for i := 0; i < 10; i++ {
        go func(i int) {
            c.L.Lock()
            defer c.L.Unlock()
            c.Wait() // goroutineを待機させておく
        }(i)
    }
    for i := 0; i < 10; i++ {
        time.Sleep(1 * time.Second)
        c.Signal() // 1つずつWaitを解除(FIFO)
    }
    c.Broadcast() // まとめて解除
Waitを抜ける時にLockが掛かるため
deferでUnlockする
Once
• 複数のgoroutineをまたぐ場合などで一度だ
け実行したい処理がある時に使う
Once
    once := new(sync.Once)
    wg := new(sync.WaitGroup)
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            once.Do(func() {
                fmt.Println("Once") // 一回だけ呼ばれる
            })
            wg.Done()
        }()
    }
    wg.Wait()
// 関数が変わっても呼ばれることはない
once.Do(func() {
        fmt.Println(“Second")
    })
Pool
• オブジェクトプールパターンを並行処理で安
全な形で実装したもの
• DBのコネクションプールとかのあれ
• オブジェクトの初期化が重いものを扱う時な
どに使う
Pool
    pool := &sync.Pool{
        New: func() interface{} {
            fmt.Println("Create new instance")
            return struct{}{}
        },
    }
    ins := pool.Get() // Create new instance
    pool.Put(ins) // プールに戻す
    ins = pool.Get() // 使い回されるので初期化されない
Poolを使う際の注意点
• Newにはスレッド安全な関数を持たせる
• Getで得たインスタンスの状態に依存しない
• Putでオブジェクトを戻す(deferを使おう
channel
channel
• メモリアクセスの同期や、goroutine同士の
通信として使うこともできる
• Goで並行処理を行う上で超重要
channelの生成
// interface{}型のチャネルを生成
var ch chan interface{}
ch = make(chan interface{})
// 送信専用チャネル
var ch chan<- interface{}
ch = make(chan<- interface{})
// 受信専用チャネル
var ch <-chan interface{}
ch = make(<-chan interface{})
// キャパシティ付チャネル
// 5つ目を書き込もうとすると読み出されるまでブロックする
var ch <-chan interface{}
ch = make(<-chan interface{}, 4)
channelの使用例
ch := make(chan string)
go func() {
time.Sleep(3 * time.Second)
ch <- “(´・ω・`)” // chにメッセージを送信
}()
fmt.Println(<-ch) // メッセージを受信するまでブロック
channelを返す例
// 戻り値がチャネルということは中で並列処理が
// 呼ばれているサイン
f := func() <-chan string {
    c := make(chan string)
    go func() {
        time.Sleep(3 * time.Second)
        c <- "(´・ω・`)"
    }()
    return c
}
fmt.Println(<-f()) // 戻り値のチャネルで合流する
channelとclose/range
    c := make(chan int)
    go func() {
        defer close(c) // 関数を抜けたらclose
        for i := 0; i < 3; i++ {
            time.Sleep(1 * time.Second)
            c <- i
        }
    }()
    for i := range c { // closeされたらループを抜ける
        fmt.Println(i)
    }
channelとselect
    c1 := make(chan int)
    c2 := make(chan int)
    go func() {
        defer close(c2) // c2だけcloseする
    }()
    select { // いずれかのchannelが完了するまでブロックする
    case <-c1:
        fmt.Println("c1")
    case <-c2:
        fmt.Println(“c2") // こちらだけが呼ばれる
    }
channelとselectとTimeout
    c1 := make(chan int)
    select {
    case <-c1:
        fmt.Println(“c1")
    case <-time.After(1 * time.Second):
// time.Afterは <-chan Time を返す
// c1は終了しないのでこちらが呼ばれる
        fmt.Println("timed out”)
    }
channelとselectとfor
    c1 := make(chan int)
    go func() {
        defer close(c1)
        time.Sleep(1 * time.Second)
    }()
    loop:
    for { // 無限ループ
        select {
        case <-c1:
            break loop
        default:
            // チャネルが完了しない間行われる処理
        }
    }
context package
context package
• Goで並行なコードを扱う際のキャンセル、タ
イムアウト、デッドラインを各goroutineに
伝達させる
• Go 1.7から標準ライブラリ追加された
• 超重要
contextが持つ関数(一部)
func Background() Context
func Todo() Context
func WithCancel(parent Context) (ctx Context, cancel
CancelFunc)
func WithDeadline(parent Context, d time.Time) (Context,
CancelFunc)
func WithTimeout(parent Context, timeout time.Duration)
(Context, CancelFunc)
func WithValue(parent Context, key, val interface{}) Context
context.WithCancel
// Contextを生成
    ctx, cancel := context.WithCancel(context.Background())
    f := func(ctx context.Context) (string, error) {
        select {
        case <-ctx.Done(): // cancelされた場合Doneが呼ばれる
            return "", ctx.Err()
        case <-time.After(3 * time.Second):
        }
        return "(´・ω・`)", nil
    }
    cancel() // 処理をキャンセルする
    _, err := f(ctx)
    if err != nil {
        fmt.Println(err) // context canceled
    }
context.WithDeadline
    ctx, cancel := context.WithDeadline(
context.Background(),
time.Now().Add(1*time.Second) // deadlineを設定
)
    defer cancel()
    f := func(ctx context.Context) (string, error) {
        time.Sleep(3 * time.Second)
        if deadline, ok := ctx.Deadline(); ok {
            if deadline.Sub(time.Now()) <= 0 { // deadlineの判定
                return "", context.DeadlineExceeded
            }
        }
        return "(´・ω・`)", nil
    }
    _, err := f(ctx)
    if err != nil {
        fmt.Println(err) // context deadline exceeded
    }
context.WithTimeout
    ctx, cancel := context.WithTimeout(
context.Background(), 1*time.Second) // タイムアウトを1秒に
    defer cancel()
    f := func(ctx context.Context) (string, error) {
        select {
        case <-ctx.Done():
            return "", ctx.Err() // 3秒より短いのでタイムアウトする
        case <-time.After(3 * time.Second):
            return "(´・ω・`)", nil
        }
    }
    _, err := f(ctx)
    if err != nil {
        fmt.Println(err) // context deadline exceeded
    }
context.WithValue
type key int
const (
    keyPera key = iota
    keyNikov key = iota
)
func main() {
// Contextにkey-valueで値をもたせられる
// キーが衝突しないように独自のキー型を定義し区別することを推奨
    ctx := context.WithValue(context.Background(), keyPera, "pera")
    ctx = context.WithValue(ctx, keyNikov, "nikov")
    fmt.Println(ctx.Value(keyPera)) // pera
    fmt.Println(ctx.Value(keyNikov)) // nikov
}
Contextに何を持たせるべき?
• プロセスやAPIの境界を超えるもの
• 不変なもの
• 単純な型であるもの
• メソッドが無いもの
• それによって挙動が変わらないもの
※本書による経験則によるもの
Contextに何を持たせるべき?
• 以下は一例
• リクエストID
• ユーザーID
• URL
• 認可トークン
• リクエストトークン
※本書による経験則によるもの
まとめ
• Goにおける並行処理を書くための構成要素を
眺めた
• Goでは並行処理が気軽に書け、合流する方法
も様々
• もっと詳しく知りたければ「Go言語による並
行処理」を読もう!

More Related Content

What's hot

そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するshigeki_ohtsu
 
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)Satoshi Yamada
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cythonAtsuo Ishimoto
 
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)Yoshifumi Kawai
 
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールPyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールAtsuo Ishimoto
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGParsfumokmm
 
2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみるairtoxin Ishii
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsYoshifumi Kawai
 
PythonでRakeもどきを作ってみた
PythonでRakeもどきを作ってみたPythonでRakeもどきを作ってみた
PythonでRakeもどきを作ってみたkwatch
 
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsugChef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsugTakeshi Komiya
 
Perlと出会い、Perlを作る
Perlと出会い、Perlを作るPerlと出会い、Perlを作る
Perlと出会い、Perlを作るgoccy
 
PowerShellが苦手だった男がPowerShellを愛するようになるまで
PowerShellが苦手だった男がPowerShellを愛するようになるまでPowerShellが苦手だった男がPowerShellを愛するようになるまで
PowerShellが苦手だった男がPowerShellを愛するようになるまでKazuhiro Matsushima
 
Haskell超初心者勉強会11
Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11Takashi Kawachi
 
Ctb57 with god7
Ctb57 with god7Ctb57 with god7
Ctb57 with god7kingtomo
 
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)Satoshi Yamada
 
Go言語で作る webアプリ@gocon 2013 spring
Go言語で作る webアプリ@gocon 2013 springGo言語で作る webアプリ@gocon 2013 spring
Go言語で作る webアプリ@gocon 2013 springTakuya Ueda
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 

What's hot (20)

そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
 
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
PythonでテキストをJSONにした話(PyCon mini sapporo 2015)
 
Introduction to cython
Introduction to cythonIntroduction to cython
Introduction to cython
 
Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)Deep Dive async/await in Unity with UniTask(UniRx.Async)
Deep Dive async/await in Unity with UniTask(UniRx.Async)
 
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールPyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
 
今日からはじめるGPars
今日からはじめるGPars今日からはじめるGPars
今日からはじめるGPars
 
2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる2日間Fabricを触った俺が
 色々解説してみる
2日間Fabricを触った俺が
 色々解説してみる
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
 
Boost tour 1.60.0 merge
Boost tour 1.60.0 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
 
PythonでRakeもどきを作ってみた
PythonでRakeもどきを作ってみたPythonでRakeもどきを作ってみた
PythonでRakeもどきを作ってみた
 
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsugChef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
Chef の気まぐれ環境構築 〜季節の Capistrano を添えて〜 #jawsug
 
Perlと出会い、Perlを作る
Perlと出会い、Perlを作るPerlと出会い、Perlを作る
Perlと出会い、Perlを作る
 
Boost Tour 1.48.0 diff
Boost Tour 1.48.0 diffBoost Tour 1.48.0 diff
Boost Tour 1.48.0 diff
 
PowerShellが苦手だった男がPowerShellを愛するようになるまで
PowerShellが苦手だった男がPowerShellを愛するようになるまでPowerShellが苦手だった男がPowerShellを愛するようになるまで
PowerShellが苦手だった男がPowerShellを愛するようになるまで
 
Haskell超初心者勉強会11
Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11
 
Ctb57 with god7
Ctb57 with god7Ctb57 with god7
Ctb57 with god7
 
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)PostgreSQL SQLチューニング入門 実践編(pgcon14j)
PostgreSQL SQLチューニング入門 実践編(pgcon14j)
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
Go言語で作る webアプリ@gocon 2013 spring
Go言語で作る webアプリ@gocon 2013 springGo言語で作る webアプリ@gocon 2013 spring
Go言語で作る webアプリ@gocon 2013 spring
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 

Similar to 明日から使える気になるGo言語による並行処理

Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
マスターオブゴールーチンアンドチャネル スタートGo #1
マスターオブゴールーチンアンドチャネル   スタートGo #1マスターオブゴールーチンアンドチャネル   スタートGo #1
マスターオブゴールーチンアンドチャネル スタートGo #1Takuya Ueda
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドToru Tamaki
 
CakePHP - The point of upgrade
CakePHP - The point of upgradeCakePHP - The point of upgrade
CakePHP - The point of upgradeYasuo Harada
 
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoShoot Morii
 
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)Yoshifumi Yamaguchi
 
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)lestrrat
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義JPCERT Coordination Center
 
Python勉強会1-はじめに
Python勉強会1-はじめにPython勉強会1-はじめに
Python勉強会1-はじめに理 小林
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.ContextAkira Takahashi
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
Using context.context in context
Using context.context in contextUsing context.context in context
Using context.context in contextJames Kirk
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Norito Agetsuma
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門Tomoya Kawanishi
 

Similar to 明日から使える気になるGo言語による並行処理 (20)

jenkinsで遊ぶ
jenkinsで遊ぶjenkinsで遊ぶ
jenkinsで遊ぶ
 
JavaScript入門
JavaScript入門JavaScript入門
JavaScript入門
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
マスターオブゴールーチンアンドチャネル スタートGo #1
マスターオブゴールーチンアンドチャネル   スタートGo #1マスターオブゴールーチンアンドチャネル   スタートGo #1
マスターオブゴールーチンアンドチャネル スタートGo #1
 
Improvement future api
Improvement future apiImprovement future api
Improvement future api
 
ソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルドソフトウェア工学2023 14 ビルド
ソフトウェア工学2023 14 ビルド
 
CakePHP - The point of upgrade
CakePHP - The point of upgradeCakePHP - The point of upgrade
CakePHP - The point of upgrade
 
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyotoGo言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
Go言語入門者が Webアプリケーション を作ってみた話 #devfest #gdgkyoto
 
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
 
Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義Javaセキュアコーディングセミナー東京第3回講義
Javaセキュアコーディングセミナー東京第3回講義
 
Python勉強会1-はじめに
Python勉強会1-はじめにPython勉強会1-はじめに
Python勉強会1-はじめに
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
Using context.context in context
Using context.context in contextUsing context.context in context
Using context.context in context
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御Unixカーネルの設計 7 プロセスの制御
Unixカーネルの設計 7 プロセスの制御
 
いまさら聞けないRake入門
いまさら聞けないRake入門いまさら聞けないRake入門
いまさら聞けないRake入門
 

More from Yuto Matsukubo

がんばれテックリード!JIRA芸人篇!!
がんばれテックリード!JIRA芸人篇!!がんばれテックリード!JIRA芸人篇!!
がんばれテックリード!JIRA芸人篇!!Yuto Matsukubo
 
Go/gRPCはじめました
Go/gRPCはじめましたGo/gRPCはじめました
Go/gRPCはじめましたYuto Matsukubo
 
非エンジニア向け技術セミナーをした話
非エンジニア向け技術セミナーをした話非エンジニア向け技術セミナーをした話
非エンジニア向け技術セミナーをした話Yuto Matsukubo
 
GCPでSplatoonの戦績を分析する
GCPでSplatoonの戦績を分析するGCPでSplatoonの戦績を分析する
GCPでSplatoonの戦績を分析するYuto Matsukubo
 
「オブジェクト指向設計実践ガイド」を読んだので誰かに意見聞きたい
「オブジェクト指向設計実践ガイド」を読んだので誰かに意見聞きたい「オブジェクト指向設計実践ガイド」を読んだので誰かに意見聞きたい
「オブジェクト指向設計実践ガイド」を読んだので誰かに意見聞きたいYuto Matsukubo
 
Rubyistを誘うScalaの世界 2.0
Rubyistを誘うScalaの世界 2.0Rubyistを誘うScalaの世界 2.0
Rubyistを誘うScalaの世界 2.0Yuto Matsukubo
 
Rubyistを誘うScalaの世界
Rubyistを誘うScalaの世界Rubyistを誘うScalaの世界
Rubyistを誘うScalaの世界Yuto Matsukubo
 
Intoroduction to React.js
Intoroduction to React.jsIntoroduction to React.js
Intoroduction to React.jsYuto Matsukubo
 
受託開発でAnsibleを導入した話
受託開発でAnsibleを導入した話受託開発でAnsibleを導入した話
受託開発でAnsibleを導入した話Yuto Matsukubo
 

More from Yuto Matsukubo (10)

がんばれテックリード!JIRA芸人篇!!
がんばれテックリード!JIRA芸人篇!!がんばれテックリード!JIRA芸人篇!!
がんばれテックリード!JIRA芸人篇!!
 
Go/gRPCはじめました
Go/gRPCはじめましたGo/gRPCはじめました
Go/gRPCはじめました
 
非エンジニア向け技術セミナーをした話
非エンジニア向け技術セミナーをした話非エンジニア向け技術セミナーをした話
非エンジニア向け技術セミナーをした話
 
GCPでSplatoonの戦績を分析する
GCPでSplatoonの戦績を分析するGCPでSplatoonの戦績を分析する
GCPでSplatoonの戦績を分析する
 
「オブジェクト指向設計実践ガイド」を読んだので誰かに意見聞きたい
「オブジェクト指向設計実践ガイド」を読んだので誰かに意見聞きたい「オブジェクト指向設計実践ガイド」を読んだので誰かに意見聞きたい
「オブジェクト指向設計実践ガイド」を読んだので誰かに意見聞きたい
 
Rubyistを誘うScalaの世界 2.0
Rubyistを誘うScalaの世界 2.0Rubyistを誘うScalaの世界 2.0
Rubyistを誘うScalaの世界 2.0
 
Rubyistを誘うScalaの世界
Rubyistを誘うScalaの世界Rubyistを誘うScalaの世界
Rubyistを誘うScalaの世界
 
はじめてのTDD
はじめてのTDDはじめてのTDD
はじめてのTDD
 
Intoroduction to React.js
Intoroduction to React.jsIntoroduction to React.js
Intoroduction to React.js
 
受託開発でAnsibleを導入した話
受託開発でAnsibleを導入した話受託開発でAnsibleを導入した話
受託開発でAnsibleを導入した話
 

Recently uploaded

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 

Recently uploaded (10)

LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 

明日から使える気になるGo言語による並行処理