SlideShare una empresa de Scribd logo
1 de 56
Descargar para leer sin conexión
いまさら聞けない
select あれこれ
Go Allstars 2 (Oct 2, 2016)
牧大輔 / Daisuke Maki (lestrrat)
HDE株式会社
• 牧大輔 (lestrrat)
• 株式会社 HDE
• Perl/Go/C 等
• builderscon 12月3日 開催!

https://builderscon.io/
builderscon
• 12月3日開催!
• Web系エンジニア達に楽しんでもらいつつ、これまでの枠にとらわれない
様々な分野の技術者達が終結!
• 是非「知らなかった、を知る」ためにご来場ください。
• トーク募集中!

https://builderscon.io/builderscon/tokyo/2016/cfp
=
Web+DB Press 10/22
channel++
• 端的に言ってチャンネルは最高
• 排他処理を意識しないデータの移動
• でもチャンネル単体ではできない操作が
結構ある。
func WriteCh(ch chan int) {
ch <- 1 // Could block, bah
}
channels block
• バッファ付きチャンネルでもブロックする可能性
func ReadCh(ch chan int) {
<-ch // Could block, bah
}
channels block
• 読み込みでも書き込みがあるまでブロック
• 戻り値二つの<-chはチャンネルが閉じてあるかどうか
の確認にしか使えないので、やっぱりブロックする
つまり
• 複数のチャンネルを同時に同じgoroutineで
扱いたい場合はどうする?
go func() {
<-ch1
…
}()
go func() {
<-ch2
…
}()
チョットチガウ…
select
• Cのselect使った事ある人: アレです
• 複数のchannelの読み書きを制御してくれる
• Go中級者なら確実にマスターしてるべき
select {
case チャンネル操作:
…
case チャンネル操作:
…
default:

…
}
基本形
func CanWeRead(ch <-chan int) {
select {
case <-ch:
… // yes, we can read
}
}
読み込み
func CanWeRead(ch <-chan int) {
select {
case <-ch:
… // yes, we can read
}
}
読み込み
ポイント:defaultがないとブ
ロックするよ!
func CanWeRead(ch <-chan int) {
select {
case <-ch:
… // yes, we can read
default:
… // no, we could not read
}
}
読み込み
func CanWeRead(ch <-chan int) {
select {
case <-ch:
… // yes, we can read
default:
… // no, we could not read
}
}
読み込み
ポイント:読み込みが即時でき
ない場合はデフォルトが実行さ
れるので、実質的なノンブロッ
キングI/O
func CanWeRead(ch <-chan int) {
select {
case v, ok := <-ch:
if !ok { // channel is closed
…
}
fmt.Println(v)
}
}
値を使う
func CanWeRead(ch <-chan int) {
select {
case v, ok := <-ch:
if !ok { // channel is closed
…
}
fmt.Println(v)
}
}
値を使う
ポイント:代入もできるよ!
func CanWeWrite(ch chan int) {
select {
case ch<-1:
… // yes, we can write
default:
… // no, we could not write
}
}
書き込み
func CanWeWrite(ch chan int) {
select {
case ch<-1:
… // yes, we can write
default:
… // no, we could not write
}
}
書き込み
ポイント:書き込みが即時でき
ない場合はデフォルトが実行さ
れるので、実質的なノンブロッ
キングI/O
ところで
• nilなチャンネルに対する書き込み・読み込み
の操作ってどうなるか知ってますか?
var ch chan int
<-ch // 初期化してないのでch = nil
• panic?
• ブロック?
• その他?
nil channel
• 読み込み=ブロック
• 書き込み=ブロック
var ch chan int
select {
case <-ch:
…
}
…ということは
var ch chan int
select {
case <-ch:
…
}
…ということは
ポイント:この読み込みが成功するこ
とはない!
select {
case <-ch1:
…
case <-ch2:
ch1 = nil // Disable previous case
}
特定のケースを無効にする
select {
case <-ch1:
…
case <-ch2:
ch1 = nil // Disable previous case
}
特定のケースを無効にする
ポイント:最初は普通にch1から読み
込み可能
select {
case <-ch1:
…
case <-ch2:
ch1 = nil // Disable previous case
}
特定のケースを無効にする
ポイント:ch2から読み込みができた
らch1を無効にしてる。これ以降ch1の
caseは実行されることがない
ch1 = nil
select {
case <-ch1:
…
case <-ch2:
ch1 = … // Enable previous case
}
逆バージョン
ch1 = nil
select {
case <-ch1:
…
case <-ch2:
ch1 = … // Enable previous case
}
逆バージョン
ポイント:最初はch1 = nilなので絶
対にこのcaseは実行されない。有効な
チャンネルを代入すれば動く。
ch1 = nil
select {
case <-ch1:
…
case <-ch2:
ch1 = … // Enable previous case
}
逆バージョン
ポイント:ch1 に有効なチャンネルを
代入すればch1のcaseも有効になる
パターン
• selectを使ったよくつかうパターン集
t := time.NewTimer(30*time.Second)
defer t.Stop()
select {
case <-t.C:
return errors.New(“timeout”)
case ch <- 1:

return nil
}
書き込みタイムアウト
t := time.NewTimer(30*time.Second)
defer t.Stop()
select {
case <-t.C:
return errors.New(“timeout”)
case ch <- 1:

return nil
}
書き込みタイムアウト
ポイント: 書き込みが成功したらエ
ラー無しで脱出
t := time.NewTimer(30*time.Second)
defer t.Stop()
select {
case <-t.C:
return errors.New(“timeout”)
case ch <- 1:

return nil
}
書き込みタイムアウト
ポイント: 書き込むより先にタイム
アウトになったらエラーを返す
t := time.NewTimer(30*time.Second)
defer t.Stop()
for {
select {
case <-t.C: // 30秒後にここにくる
return
default:

// タイムアウトするまで行う操作
}
}
タイムアウトまでループ
t := time.NewTimer(30*time.Second)
defer t.Stop()
for {
select {
case <-t.C: // 30秒後にここにくる
return
default:

// タイムアウトするまで行う操作
}
}
タイムアウトまでループ
ポイント:for で囲まないと一回
defaultの操作をしたら終わっちゃう
ので、無限ループにする
t := time.NewTimer(30*time.Second)
defer t.Stop()
for {
select {
case <-t.C: // 30秒後にここにくる
return
default:

// タイムアウトするまで行う操作
}
}
タイムアウトまでループ
ポイント: タイマーからお知らせが
来たらこのループから脱出
t := time.NewTicker(time.Second)
defer t.Stop()
for {
select {
case <-t.C: // 1秒ごとにここにくる
// 定期的な処理内容
}
}
定期的に実行
t := time.NewTicker(time.Second)
defer t.Stop()
for {
select {
case <-t.C: // 1秒ごとにここにくる
// 定期的な処理内容
}
}
定期的に実行
ポイント:TimerではなくTicker
ところで
• closeされたチャンネルから読み込むとどうなる?
time.AfterFunc(5*time.Second, func() {
close(done)
})
for {
select {
case <-done:

return
default:
// 定期的な処理内容
}
}
“done”チャンネル
time.AfterFunc(5*time.Second, func() {
close(done)
})
for {
select {
case <-done:

return
default:
// 定期的な処理内容
}
}
“done”チャンネル
ポイント: チャンネルをcloseすると
読み込みブロックが解除される
time.AfterFunc(5*time.Second, func() {
close(done)
})
for {
select {
case <-done:

return
default:
// 定期的な処理内容
}
}
“done”チャンネル
ポイント:戻り値は無効だが、ブロッ
クは解けるのでループを脱出できる
for {
select {
case <-ctx.Done():

return
default:
// 定期的な処理内容
}
}
Go 1.7からはContext
Context
• context.Contextができてからselectを使う事
がより多くなった
Context
• I/Oとか関係なくても、「途中で処理を止め
る」系のコードでものすごく良く使う
例:「リストを処理」
for _, data := range list {
select {
case <-ctx.Done():

return
default:
process(data)
}
}
例:「リストを処理」
for _, data := range list {
select {
case <-ctx.Done():

return
default:
process(data)
}
}
ポイント:リスト要素を処理する毎に
Doneをチェックし、必要であれば終了
外道
• いよいよselectの変態的な使いかたを必要とする時
reflect.Select
• 動的にselect文を構築
• プログラム実行中にcaseの数や内容を変更できる
reflect.Select([]reflect.SelectCase{
reflect.SelectCase{Chan: ch1},
reflect.SelectCase{Chan: ch2},
reflect.SelectCase{Chan: ch3},
})
Web+DB Press 10/22
=
まとめ
• チャンネルとselectの複合技で表現の幅が
広がる
• 初級→中級になるには押さえておきたい。
builderscon
• 12月3日開催!
• トーク募集中!

https://builderscon.io/builderscon/tokyo/2016/cfp
Questions?

Más contenido relacionado

La actualidad más candente

例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようShinsuke Sugaya
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春VerMasahito Zembutsu
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?Takuya Ueda
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Kohei Tokunaga
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
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
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)NTT DATA Technology & Innovation
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ増田 亨
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)NTT DATA Technology & Innovation
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
 
分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方Recruit Lifestyle Co., Ltd.
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -onozaty
 

La actualidad más candente (20)

例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
SolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみようSolrとElasticsearchを比べてみよう
SolrとElasticsearchを比べてみよう
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
GoらしいAPIを求める旅路 (Go Conference 2018 Spring)
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 

Destacado

条件式評価器の実装による管理ツールの抽象化
条件式評価器の実装による管理ツールの抽象化条件式評価器の実装による管理ツールの抽象化
条件式評価器の実装による管理ツールの抽象化Takuya Ueda
 
とあるBtoB企業でGoを使ってみた話
とあるBtoB企業でGoを使ってみた話とあるBtoB企業でGoを使ってみた話
とあるBtoB企業でGoを使ってみた話Aiga Matsuo
 
Coding in the context era
Coding in the context eraCoding in the context era
Coding in the context eralestrrat
 
Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)lestrrat
 
My client wanted their apps synced, and I made it with Go
My client wanted their apps synced, and I made it with GoMy client wanted their apps synced, and I made it with Go
My client wanted their apps synced, and I made it with GoToru Furukawa
 
Goをカンストさせる話
Goをカンストさせる話Goをカンストさせる話
Goをカンストさせる話Moriyoshi Koizumi
 
Si案件でGo言語を使ってみた!
Si案件でGo言語を使ってみた!Si案件でGo言語を使ってみた!
Si案件でGo言語を使ってみた!Koichiro Nishijima
 
Python&機械学習にHelloWorldして旦那候補を探す
Python&機械学習にHelloWorldして旦那候補を探すPython&機械学習にHelloWorldして旦那候補を探す
Python&機械学習にHelloWorldして旦那候補を探すKiriko Yano
 
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 SpringGoでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 SpringYahoo!デベロッパーネットワーク
 
Go conference 2017 Lightning talk
Go conference 2017 Lightning talkGo conference 2017 Lightning talk
Go conference 2017 Lightning talkmokelab
 
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidevSwift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidevTomohiro Kumagai
 
逆説のカスタマーサクセス
逆説のカスタマーサクセス逆説のカスタマーサクセス
逆説のカスタマーサクセスTakaaki Umada
 
HoloLens x Graphics 入門
HoloLens x Graphics 入門HoloLens x Graphics 入門
HoloLens x Graphics 入門hecomi
 
UnityとTVMLはじめました。
UnityとTVMLはじめました。UnityとTVMLはじめました。
UnityとTVMLはじめました。Michiyo Chuman
 
実装だって楽したい!〜リアルタイム通信はじめの一歩〜
実装だって楽したい!〜リアルタイム通信はじめの一歩〜実装だって楽したい!〜リアルタイム通信はじめの一歩〜
実装だって楽したい!〜リアルタイム通信はじめの一歩〜Yuka Tokuyama
 
小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016lestrrat
 
フォントの選び方・使い方
フォントの選び方・使い方フォントの選び方・使い方
フォントの選び方・使い方k maztani
 
goimagick-syokai-II
goimagick-syokai-IIgoimagick-syokai-II
goimagick-syokai-IIYo Ya
 
リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介Recruit Technologies
 
How To Think In Go
How To Think In GoHow To Think In Go
How To Think In Golestrrat
 

Destacado (20)

条件式評価器の実装による管理ツールの抽象化
条件式評価器の実装による管理ツールの抽象化条件式評価器の実装による管理ツールの抽象化
条件式評価器の実装による管理ツールの抽象化
 
とあるBtoB企業でGoを使ってみた話
とあるBtoB企業でGoを使ってみた話とあるBtoB企業でGoを使ってみた話
とあるBtoB企業でGoを使ってみた話
 
Coding in the context era
Coding in the context eraCoding in the context era
Coding in the context era
 
Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)
 
My client wanted their apps synced, and I made it with Go
My client wanted their apps synced, and I made it with GoMy client wanted their apps synced, and I made it with Go
My client wanted their apps synced, and I made it with Go
 
Goをカンストさせる話
Goをカンストさせる話Goをカンストさせる話
Goをカンストさせる話
 
Si案件でGo言語を使ってみた!
Si案件でGo言語を使ってみた!Si案件でGo言語を使ってみた!
Si案件でGo言語を使ってみた!
 
Python&機械学習にHelloWorldして旦那候補を探す
Python&機械学習にHelloWorldして旦那候補を探すPython&機械学習にHelloWorldして旦那候補を探す
Python&機械学習にHelloWorldして旦那候補を探す
 
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 SpringGoでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
Goでヤフーの分散オブジェクトストレージを作った話 Go Conference 2017 Spring
 
Go conference 2017 Lightning talk
Go conference 2017 Lightning talkGo conference 2017 Lightning talk
Go conference 2017 Lightning talk
 
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidevSwift : クラス継承とプロトコル拡張を比べてみる #yidev
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
 
逆説のカスタマーサクセス
逆説のカスタマーサクセス逆説のカスタマーサクセス
逆説のカスタマーサクセス
 
HoloLens x Graphics 入門
HoloLens x Graphics 入門HoloLens x Graphics 入門
HoloLens x Graphics 入門
 
UnityとTVMLはじめました。
UnityとTVMLはじめました。UnityとTVMLはじめました。
UnityとTVMLはじめました。
 
実装だって楽したい!〜リアルタイム通信はじめの一歩〜
実装だって楽したい!〜リアルタイム通信はじめの一歩〜実装だって楽したい!〜リアルタイム通信はじめの一歩〜
実装だって楽したい!〜リアルタイム通信はじめの一歩〜
 
小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016小規模でもGKE - DevFest Tokyo 2016
小規模でもGKE - DevFest Tokyo 2016
 
フォントの選び方・使い方
フォントの選び方・使い方フォントの選び方・使い方
フォントの選び方・使い方
 
goimagick-syokai-II
goimagick-syokai-IIgoimagick-syokai-II
goimagick-syokai-II
 
リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介
 
How To Think In Go
How To Think In GoHow To Think In Go
How To Think In Go
 

Más de lestrrat

Future of Tech "Conferences"
Future of Tech "Conferences"Future of Tech "Conferences"
Future of Tech "Conferences"lestrrat
 
ONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 WinterONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 Winterlestrrat
 
Slicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPISlicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPIlestrrat
 
Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由lestrrat
 
Rejectcon 2018
Rejectcon 2018Rejectcon 2018
Rejectcon 2018lestrrat
 
Builderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinnerBuilderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinnerlestrrat
 
Google container builderと友だちになるまで
Google container builderと友だちになるまでGoogle container builderと友だちになるまで
Google container builderと友だちになるまでlestrrat
 
筋肉によるGoコードジェネレーション
筋肉によるGoコードジェネレーション筋肉によるGoコードジェネレーション
筋肉によるGoコードジェネレーションlestrrat
 
iosdc 2017
iosdc 2017iosdc 2017
iosdc 2017lestrrat
 
シュラスコの食べ方 超入門
シュラスコの食べ方 超入門シュラスコの食べ方 超入門
シュラスコの食べ方 超入門lestrrat
 
OSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃないOSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃないlestrrat
 
Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016lestrrat
 
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24lestrrat
 
Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016lestrrat
 
On internationalcommunityrelations
On internationalcommunityrelationsOn internationalcommunityrelations
On internationalcommunityrelationslestrrat
 
Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)
Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)
Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)lestrrat
 
YAPC::Asia Tokyo 2012 Closing
YAPC::Asia Tokyo 2012 ClosingYAPC::Asia Tokyo 2012 Closing
YAPC::Asia Tokyo 2012 Closinglestrrat
 
YAPC::Asia Tokyo 2011 Closing
YAPC::Asia Tokyo 2011 ClosingYAPC::Asia Tokyo 2011 Closing
YAPC::Asia Tokyo 2011 Closinglestrrat
 
Running JPA (YAPC::NA 2011)
Running JPA (YAPC::NA 2011)Running JPA (YAPC::NA 2011)
Running JPA (YAPC::NA 2011)lestrrat
 
CPAN Gems From The Far East
CPAN Gems From The Far EastCPAN Gems From The Far East
CPAN Gems From The Far Eastlestrrat
 

Más de lestrrat (20)

Future of Tech "Conferences"
Future of Tech "Conferences"Future of Tech "Conferences"
Future of Tech "Conferences"
 
ONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 WinterONIの世界 - ONIcon 2019 Winter
ONIの世界 - ONIcon 2019 Winter
 
Slicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPISlicing, Dicing, And Linting OpenAPI
Slicing, Dicing, And Linting OpenAPI
 
Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由Oxygen Not Includedをやるべき4つの理由
Oxygen Not Includedをやるべき4つの理由
 
Rejectcon 2018
Rejectcon 2018Rejectcon 2018
Rejectcon 2018
 
Builderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinnerBuilderscon tokyo 2018 speaker dinner
Builderscon tokyo 2018 speaker dinner
 
Google container builderと友だちになるまで
Google container builderと友だちになるまでGoogle container builderと友だちになるまで
Google container builderと友だちになるまで
 
筋肉によるGoコードジェネレーション
筋肉によるGoコードジェネレーション筋肉によるGoコードジェネレーション
筋肉によるGoコードジェネレーション
 
iosdc 2017
iosdc 2017iosdc 2017
iosdc 2017
 
シュラスコの食べ方 超入門
シュラスコの食べ方 超入門シュラスコの食べ方 超入門
シュラスコの食べ方 超入門
 
OSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃないOSSの敵になるのもいいじゃない
OSSの敵になるのもいいじゃない
 
Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016Opening: builderscon tokyo 2016
Opening: builderscon tokyo 2016
 
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24Kubernetes in 20 minutes - HDE Monthly Technical Session 24
Kubernetes in 20 minutes - HDE Monthly Technical Session 24
 
Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016Don't Use Reflect - Go 1.7 release party 2016
Don't Use Reflect - Go 1.7 release party 2016
 
On internationalcommunityrelations
On internationalcommunityrelationsOn internationalcommunityrelations
On internationalcommunityrelations
 
Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)
Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)
Yapceu 2015 yapc asia tokyo behind the scenes (w/o notes)
 
YAPC::Asia Tokyo 2012 Closing
YAPC::Asia Tokyo 2012 ClosingYAPC::Asia Tokyo 2012 Closing
YAPC::Asia Tokyo 2012 Closing
 
YAPC::Asia Tokyo 2011 Closing
YAPC::Asia Tokyo 2011 ClosingYAPC::Asia Tokyo 2011 Closing
YAPC::Asia Tokyo 2011 Closing
 
Running JPA (YAPC::NA 2011)
Running JPA (YAPC::NA 2011)Running JPA (YAPC::NA 2011)
Running JPA (YAPC::NA 2011)
 
CPAN Gems From The Far East
CPAN Gems From The Far EastCPAN Gems From The Far East
CPAN Gems From The Far East
 

いまさら聞けないselectあれこれ