昨年
行ってきました
やっぱり公開されたスライドを観るのが一番かなと思うけど、それでもメモw
なのだけど、Macの充電器を忘れてしまって懇親会の LT まで電池を温存したかったので、あまりメモれなかった...。
あとでちゃんと書き直すかも。
懇親会で LT
懇親会で ScalaMatsuri 2020 の開催決定アナウンスを LT させていただきました!
みなさんぜひぜひお願いしますー!
オープニング
開催までの歩み
これまではトップダウンでやっていたが、チーム制を導入した。
続ける、続けないの話まで...。
身の丈にあった開催をしよう。
結構バタバタした?のか、開催してくれてありがたや〜。
協賛
- Yahoo! JAPAN
- SAKURA Internet
- Chatwork
Dependent method types を利用した軽量Clean Architecture の紹介
中村 学(がくぞ) さん : @gakuzzzz
ドメインを表現するコードから、技術詳細を分離したい
Scala の高度な抽象化能力を使った方法が提案されている。
- Free Monad
- typed-final
などで可能。
しかし、高度な抽象概念を利用するので、コードが複雑化してしまい、過剰になってしまうケースがある。
いろんなユーザが使うようなコアな機能であれば利用の幅が広がるのでいいが、アプリケーションのドメインとくっつけてしまうと活かしづらくなってしまう。
Dependent method types
そういった場合、 Dependent method types を利用する。
引数の値に応じて、他の引数や戻り値の方が変わるメソッドを定義することができる仕組み。
trait { type Result def value: Result } def bar(foo: Foo): foo.Result = foo.value object StringFoo extends Foo { type Result = String val value = "piyopiyo" } object IntFoo extends Foo { type Result = Int val value = 10 } bar(StringFoo) // piyopiyo bar(IntFoo) // 10
実際ありがちなケース
ドメイン上の表現に実装詳細がべったりというところから考えてみる。
typed-final を使った例と、Dependent method types を使った例の紹介。
仕様と実装の分離。
名前とインターフェイスと実装クラスに分離するということを Java などでよくやっていたが、それを習ってやってみる。
ドメイン固有の名前をつけた trait でMyCoolAppContext, MyCoolAppResult[+E, +A]を定義定義し、実装を隠蔽。
しかし、 Context と Result の実装食らうが密接に関係を持つことを表現できない問題。
そこで Dependent method types を利用して、この2つを結びつける。
infra では自由に実装クラスを定義することができる。
ドメイン上のユースケースで利用しやすく、 MyCoolAppResult のインスタンスを作れるように、 MyCoolAppConext に諸々のメソッドを足す。
Repository の引数は Context の型で定義しておくことで、ドメイン上の表現だけでコードを書くことができる。
ScalaZ や Cats mp Monad などの型クラスが出てこない。
MyCoolAppConextImpl さえ実装すれば、後はfor式を使えれば採用しやすいアプローチとなる。
まとめ
高度な抽象化機構を利用しなくても、Scala そのものの言語機能でドメインと実装詳細を分離できるのはつよい。
古典的なアプローチだけど、理解もしやすいように思う。
質問タイム
ボケーッとしてて、ほとんど聞き逃してたw
Q. がくぞさんが ContextImpl を書いたことありますか?
Q. 今後 typed-final などがよりよい何かが出た場合、移行が大変?
- 実際はどうなるかわからないけど、抽象化されたものの移行は大変かも。
Q. Context など、数が多いとボイラーテンプレートになってしまう?どのくらいの粒度で定義すれば
- 指標などのはっきりとしったものはないが、ユースケース単位で必要な粒度が変わるのでは。
Java 5.0時代の非同期処理技術から学び直すScala/Java非同期処理
リチャード 伊真岡 さん : @RichardImaokaJP
ビルコンと9割同じ内容だけど、洗練されたよ!
リチャードさんの動画スライド、いつもさすがすぎる。
抽象度の低いものから高いものへと少しづつ。
Java 1.4 => 5.0。Runnable => ExecutionService の非同期処理をアニメーションでわかりやすく表現。
Atomic な処理ではない場合の不具合と、 Syncronized をメソッドにつければただし動きになる。
・・・ここからはMacの電池温存・・・
質問
Fork Join Pool を Blocking I/O で利用してはいけないのはなぜ?
細かいところまで実験してないけど、ForkJoinのwork-stealingアルゴリズムで、タスクを分割するタスクがブロックしてしまうと、下位層で発生するタスクのスループットが低下してしまう。運が悪いと上位のほうで影響を受ける範囲がでかくなるという感じかな。#scala_ks
— かとじゅん@冰気錬成 (@j5ik2o) October 26, 2019
Scala.jsでGoogle Cloud Functionsを利用する前に知りたかったこと
よしだ さん : @grimrose
なぜ GCP を選んだのか?
安い、マルチクラウド時代(両方知っていると潰しが効くよね)、Stateless(Stateが必要になった場合は Cloud SQL, Cloud Firestore)
Scalaで圏論チョット学ぶ
谷口 慶一郎 さん : @ravineport
4年くらい前に少し勉強したのだけど、例にもれず俺も挫折w
だけど、谷口さんのこのセッションで圏論に対する理解が少しすすんだ気がする!!!
あとで復習するべし。
Scala における Monad って何だろう?
Naoki Aoyama (aoiroaoino) さん : @AoiroAoino
あおやまさんとは ScalaMatsuri で知り合ったナカ。
最近 Forkwell さんにインタビューされた! :ta-da:
クロージング
みんなで写真を撮って Day1 クローズ!
素敵なカンファレンスでした!
懇親会
へ。
懇親会が開始されるまでちょっと待機(の時間にコレを書いている)。
懇親会LTで、 ScalaMatsuri 2020 のアナウンスをさせていただきますー!