SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Downloaden Sie, um offline zu lesen
MONIX TASKが便利だという話
Taisuke Oe ( )@OE_uia
今日話すこと
Monix version 2.3.3
主にMonix Taskの話をします。
Monix Observable, Iterantは出てきません。
MONIXとは
JVM Scala及びScala.js向け並行プログラミング用ライブラリ
当初はScala向けReactiveXの実装からスタートした
現在ではTypelevelプロジェクトとして、関数型プログラミング用ライブラリと深く統合している
Monix2系まではcoreではなくCats及びScalaz向けモジュールをそれぞれ提供していた
Monix3系からCatsに依存している
Monix TaskはScalaz Taskにインスパイアされている
単純なMONIX TASKの使い方
import monix.execution.Scheduler.Implicits.global
import monix.eval.Task
import scala.util.{Success, Failure}
val sumTask = Task{println("side effect!");1+2}
val cancelable = sumTask.runOnComplete {
case Success(value) => println(s"result:$value")
case Failure(ex) => println("Oh-no!")
}
//side effect!
//result:3
//もし気が変わってキャンセルしたければ:
//cancelable.cancel()
cancelableなので:
Task.chooseFirstOfList により、競争状態のTaskのうち最初に完了したもの以外をキャンセル
timeout を設定可能
TASK.APPLYは非同期な遅延評価
Task#apply
val sumTask = Task(1+2)
参考:SCALA標準のFUTURE.APPLYの実装は先行評価
import scala.concurrent._
import ExecutionContext.Implicits.global
Future{println("side effect!") ; 1+2}
//side effect!
Future.foreach(println)
//3
RUNONCOMPLETE / RUNASYNC
val cancelable = sumTask.runOnComplete {
case Success(value) => println(s"result:$value")
case Failure(ex) => println("Oh-no!")
}
//side effect!
//result:3
遅延評価Taskを実行する
引数として、完了時のCallbackを登録できる
戻り値として、Cancelableを返す
TASKインスタンスの評価方法
以下の2軸について変わるので、マトリックスで整理しましょう
実行モデル: 同期 or 非同期
評価戦略: 先行評価 or 遅延評価
TASKインスタンス生成と評価方法の関係
非同期 同期
遅延評価 apply
先行評価
基本は遅延評価。
val task = Task.eval{println("side effect!");1+2}
task.runAsync.foreach(println)
//side effect!
//3
Task.evalのエイリアスとして、(scalaz Taskのメソッド名と同じ)Task.delayも用意されている。
遅延評価した値をメモ化可能
val task = Task.evalOnce{println("side effect!");1+2}
task.runAsync.foreach(println)
//side effect!
//3
task.runAsync.foreach(println)
//3
Task.eval(...).memoizeと等価。
成功値のみメモ化することも可
var effect = 0
val task = Task.eval{
effect += 1
if(effect < 2) throw new RuntimeException("boom!")
effect
}.memoizeOnSuccess
val callback:Try[Int] => Unit = {
case Success(value) => println(value)
case Failure(ex) => println(ex)
}
task.runOnComplete(callback) //java.lang.RuntimeException: boom!
task.runOnComplete(callback) //2
task.runOnComplete(callback) //2
TASKインスタンス生成と評価方法の関係
非同期 同期
遅延評価 apply eval, delay, evalOnce
先行評価
評価済みの値をラップするため、先行評価もできる
val task = Task.now{println("side effect!");1+2}
//side effect!
task.runAsync.foreach(println)
//3
Scala標準のFuture.successful、scalaz TaskのTask.nowと同じ。
TASKインスタンス生成と評価方法の関係
非同期 同期
遅延評価 apply eval, delay, evalOnce
先行評価 now, pure
評価戦略を先行評価から遅延評価へ変更
val task = Task.defer(Task.now{println("side effect!");1+2})
task.runAsync.foreach(println)
//side effect!
//3
Task.deferのエイリアスとして、(Scalaz Taskのメソッド名と同じ)Task.suspendが用意されて
いる
TASKインスタンス生成と評価方法の関係
非同期 同期
遅延評価 apply eval, delay, evalOnce
先行評価 now, pure,failed
遅延
↑ : Task.defer / Task.suspend
先行
SCALA標準FUTUREからTASKインスタンス生成可
import scala.concurrent.Future
import monix.execution.Scheduler.Implicits.global
val task = Task.fromFuture(Future{println("side effect!");1+2})
//side effect!
task.runAsync.foreach(println)
//3
Task.fromFutureだと、(Futureが先行評価なので)先行評価される非同期Taskインスタンス
が生成。
SCALA標準FUTUREからTASKインスタンス生成可(遅延評価したい)
import scala.concurrent.Future
import monix.eval.Task
val task = Task.deferFutureAction{
implicit scheduler =>
Future{println("side effect!");1+2}
}
import monix.execution.Scheduler.Implicits.global
task.runAsync.foreach(println)
//side effect!
//3
Futureを生成する関数をTask.deferFutureActionでラップすると、 遅延評価される非同期
Taskインスタンスが生成可能。
TASKインスタンス生成と評価方法の関係
非同期 同期
遅延評価 apply, deferFutureAction eval, delay, evalOnce
先行評価 fromFuture now, pure,raiseError
遅延
↑ : Task.defer / Task.suspend
先行
コールバック関数からTASKを生成
import monix.eval.{Task, Callback}
import monix.execution.Scheduler
import scala.concurrent.duration._
import scala.util.{Success,Failure}
class HttpClient(handler:HttpHandler){
def get(url:String):Unit = handler.onSuccess(s"body mock from `$url`")
}
class HttpHandler(callback:Callback[String]){
def onSuccess(body:String):Unit = callback(Success(body))
def onFailure(ex:Throwable):Unit = callback(Failure(ex))
}
val task = Task.create[String]{
(scheduler,callback) =>
scheduler.scheduleOnce(1 second){
new HttpClient(new HttpHandler(callback)).get("https://google.com/"
}
}
task.runAsync.foreach(println)
Task.createのエイリアスとして、(scalaz Taskのメソッド名と同じ) Task.asyncも用意されてい
る。
TASKインスタンス生成と評価方法の関係
非同期 同期
遅延評価 apply, create, async, evalOnce, deferFutureAction eval, delay, evalOnce
先行評価 fromFuture now, pure
遅延
↑ : Task.defer / Task.suspend
先行
TASK#EXECUTEWITHFORKによる非同期化
val task = Task.eval{
println(s"side effect at:${Thread.currentThread.getName}")
1+2
}
task.runAsync.foreach(println)
//side effect at:run-main-0
//3
val asyncTask = task.executeWithFork
asyncTask.runAsync.foreach(println)
//side effect at:scala-execution-context-global-59
//3
executeOn で実行するSchedulerを明示的に指定できる
Monix 3系では executeAsync にrenameされた
TASKインスタンス生成と評価方法の関係
非同期 同期
遅延評価 apply, create, async, evalOnce, deferFutureAction eval, delay, evalOnce
先行評価 fromFuture now, pure
遅延
↑ : Task.defer / Task.suspend
先行
非同期 ← 同期 : executeWithFork / executeOn
非同期 → 同期 : coeval
実行モデル
SCALA標準FUTUREの実行モデル
object Future{
def apply[T](t: =>T)(implicit executor:ExecutionContext):Future[T]
}
trait Future[+T] extends Awaitable[T]{
def flatMap[S](f: T => Future[S])(implicit executor:ExecutionContext):Future
}
Future.apply, Future# atMap等の各関数が暗黙の引数としてとる ExecutionContext の実装によって決まる。
すなわち、 atMapによる合成ごとにContext Switchが発生する。
MONIX TASKの実行モデル
Task.runAsync,runOnCompleteが暗黙の引数としてとるmonix.execution.Schedulerの実装によって決まる。
Task# atMapによる合成では Context Switchが起きない
Task#executeOnやTask#asyncBoundaryにより非同期境界を指定し、runAsync するときに実行モデルを決定できる。
MONIX TASKにおけるCONTEXT SWITCH
val start = Task(println(s"start at:${Thread.currentThread.getName}"))
val imHere = Task.eval(println(s"I'm here:${Thread.currentThread.getName}
val composed = for{
_ <- start
_ <- imHere.executeOn(Scheduler.io(name = "io"))
_ <- imHere.asyncBoundary
_ <- imHere
} yield ()
composed.runAsync(Callback.empty)
/*
* start at:scala-execution-context-global-205
* I'm here:io-206
* I'm here:io-206
* I'm here:scala-execution-context-global-205
*/
MONIX TASKのまとめ
デフォルトが遅延評価なので、immutableかつ参照透過で扱いやすい。
TaskのrunAsync/runOnCompleteでThreadPoolを渡す設計となっており、柔軟にContext Switchを制御可能。実効性能上有
利。
cancelableや、Scala標準Futureとのinteropなど、何かと痒いところに手が届く
Monix3系からCatsに依存してしまっている。
失敗型が Throwable であるため、エラーを独自定義型の戻り値で表現したい場合使いにくい。

Weitere ähnliche Inhalte

Was ist angesagt?

std::pin の勘所
std::pin の勘所std::pin の勘所
std::pin の勘所Hiroaki Goto
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredisnasa9084
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことAmazon Web Services Japan
 
"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発
"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発
"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発Yahoo!デベロッパーネットワーク
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本kazuki kumagai
 
爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話Kentaro Yoshida
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)NTT DATA Technology & Innovation
 
PostgreSQL Unconference #5 ICU Collation
PostgreSQL Unconference #5 ICU CollationPostgreSQL Unconference #5 ICU Collation
PostgreSQL Unconference #5 ICU CollationNoriyoshi Shinoda
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーyoku0825
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報Masahiko Sawada
 
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?Masahito Zembutsu
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能Kohei Tokunaga
 

Was ist angesagt? (20)

std::pin の勘所
std::pin の勘所std::pin の勘所
std::pin の勘所
 
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのrediswebエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発
"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発
"Yahoo! JAPAN の Kubernetes-as-a-Service" で加速するアプリケーション開発
 
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajpAt least onceってぶっちゃけ問題の先送りだったよね #kafkajp
At least onceってぶっちゃけ問題の先送りだったよね #kafkajp
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
 
爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話爆速クエリエンジン”Presto”を使いたくなる話
爆速クエリエンジン”Presto”を使いたくなる話
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
PostgreSQL Unconference #5 ICU Collation
PostgreSQL Unconference #5 ICU CollationPostgreSQL Unconference #5 ICU Collation
PostgreSQL Unconference #5 ICU Collation
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報PostgreSQL 15 開発最新情報
PostgreSQL 15 開発最新情報
 
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?忙しい人の5分で分かるMesos入門 - Mesos って何だ?
忙しい人の5分で分かるMesos入門 - Mesos って何だ?
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
KeycloakでAPI認可に入門する
KeycloakでAPI認可に入門するKeycloakでAPI認可に入門する
KeycloakでAPI認可に入門する
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 

Ähnlich wie Monix Taskが便利だという話

C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsYoshifumi Kawai
 
React+redux+saga 03
React+redux+saga 03React+redux+saga 03
React+redux+saga 03TIS Inc
 
Composable Callbacks & Listeners
Composable Callbacks & ListenersComposable Callbacks & Listeners
Composable Callbacks & ListenersTaisuke Oe
 
Rx swift,Repro framewolrk
Rx swift,Repro framewolrkRx swift,Repro framewolrk
Rx swift,Repro framewolrkDaisuke Nagata
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyHiroshi Nakamura
 
2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコムTomoyaTakegoshi
 
JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤Yuichi Sakuraba
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDEdcubeio
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行guest5f4320
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングTanUkkii
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発papamitra
 
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますElixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますfukuoka.ex
 

Ähnlich wie Monix Taskが便利だという話 (20)

C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
 
React+redux+saga 03
React+redux+saga 03React+redux+saga 03
React+redux+saga 03
 
Composable Callbacks & Listeners
Composable Callbacks & ListenersComposable Callbacks & Listeners
Composable Callbacks & Listeners
 
Lt 111217
Lt 111217Lt 111217
Lt 111217
 
Trait in scala
Trait in scalaTrait in scala
Trait in scala
 
Rx swift,Repro framewolrk
Rx swift,Repro framewolrkRx swift,Repro framewolrk
Rx swift,Repro framewolrk
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRuby
 
2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム2019年度 CaaS ワークショップ @ NTTコム
2019年度 CaaS ワークショップ @ NTTコム
 
JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤
 
AWS Lambda Update
AWS Lambda UpdateAWS Lambda Update
AWS Lambda Update
 
Embulk 20150411
Embulk 20150411Embulk 20150411
Embulk 20150411
 
Openresty
OpenrestyOpenresty
Openresty
 
React Native GUIDE
React Native GUIDEReact Native GUIDE
React Native GUIDE
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
CLRH_120414_WFTDD
CLRH_120414_WFTDDCLRH_120414_WFTDD
CLRH_120414_WFTDD
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発
 
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版ありますElixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
Elixir入門「第3回:Phoenix 1.2で高速Webアプリ & REST APIをサクッと書いてみる」【旧版】※新版あります
 

Mehr von Taisuke Oe

プレScalaMatsuri2019「スピーカー入門」
プレScalaMatsuri2019「スピーカー入門」プレScalaMatsuri2019「スピーカー入門」
プレScalaMatsuri2019「スピーカー入門」Taisuke Oe
 
How to start functional programming (in Scala): Day1
How to start functional programming (in Scala): Day1How to start functional programming (in Scala): Day1
How to start functional programming (in Scala): Day1Taisuke Oe
 
How to get along with implicits
How to get along with implicits How to get along with implicits
How to get along with implicits Taisuke Oe
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットTaisuke Oe
 
Real World Android Akka - 日本語版
Real World Android Akka - 日本語版Real World Android Akka - 日本語版
Real World Android Akka - 日本語版Taisuke Oe
 
AuxパターンをDottyで解決する
AuxパターンをDottyで解決するAuxパターンをDottyで解決する
AuxパターンをDottyで解決するTaisuke Oe
 
Real World Android Akka
Real World Android AkkaReal World Android Akka
Real World Android AkkaTaisuke Oe
 
Real world android akka
Real world android akkaReal world android akka
Real world android akkaTaisuke Oe
 
多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターン多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターンTaisuke Oe
 
Android BLEのつらみを予防するTips
Android BLEのつらみを予防するTipsAndroid BLEのつらみを予防するTips
Android BLEのつらみを予防するTipsTaisuke Oe
 
BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~
BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~
BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~Taisuke Oe
 

Mehr von Taisuke Oe (11)

プレScalaMatsuri2019「スピーカー入門」
プレScalaMatsuri2019「スピーカー入門」プレScalaMatsuri2019「スピーカー入門」
プレScalaMatsuri2019「スピーカー入門」
 
How to start functional programming (in Scala): Day1
How to start functional programming (in Scala): Day1How to start functional programming (in Scala): Day1
How to start functional programming (in Scala): Day1
 
How to get along with implicits
How to get along with implicits How to get along with implicits
How to get along with implicits
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミット
 
Real World Android Akka - 日本語版
Real World Android Akka - 日本語版Real World Android Akka - 日本語版
Real World Android Akka - 日本語版
 
AuxパターンをDottyで解決する
AuxパターンをDottyで解決するAuxパターンをDottyで解決する
AuxパターンをDottyで解決する
 
Real World Android Akka
Real World Android AkkaReal World Android Akka
Real World Android Akka
 
Real world android akka
Real world android akkaReal world android akka
Real world android akka
 
多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターン多相な関数の定義から学ぶ、型クラスデザインパターン
多相な関数の定義から学ぶ、型クラスデザインパターン
 
Android BLEのつらみを予防するTips
Android BLEのつらみを予防するTipsAndroid BLEのつらみを予防するTips
Android BLEのつらみを予防するTips
 
BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~
BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~
BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~
 

Monix Taskが便利だという話