the industrial

ブログと言うより自分のためのメモ以外の何モノでもないです。でも読んでくださってありがとうございます。

Scala関西Summit 2019 に参加しましてきました!Day-1 #scala_ks

2019.scala-kansai.org

ハッシュタグ: #scala_ks

昨年

omiend.hatenablog.jp

行ってきました

やっぱり公開されたスライドを観るのが一番かなと思うけど、それでもメモw

なのだけど、Macの充電器を忘れてしまって懇親会の LT まで電池を温存したかったので、あまりメモれなかった...。

あとでちゃんと書き直すかも。

懇親会で LT

懇親会で ScalaMatsuri 2020 の開催決定アナウンスを LT させていただきました!

docs.google.com

みなさんぜひぜひお願いしますー!




オープニング

@yoshiyoshifujii さん

開催までの歩み

これまではトップダウンでやっていたが、チーム制を導入した。

続ける、続けないの話まで...。

身の丈にあった開催をしよう。

結構バタバタした?のか、開催してくれてありがたや〜。

協賛




Dependent method types を利用した軽量Clean Architecture の紹介

gakuzzzz.github.io

中村 学(がくぞ) さん : @gakuzzzz

ドメインを表現するコードから、技術詳細を分離したい

Scala の高度な抽象化能力を使った方法が提案されている。

などで可能。

しかし、高度な抽象概念を利用するので、コードが複雑化してしまい、過剰になってしまうケースがある。

いろんなユーザが使うようなコアな機能であれば利用の幅が広がるのでいいが、アプリケーションのドメインとくっつけてしまうと活かしづらくなってしまう。

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 などがよりよい何かが出た場合、移行が大変?

  1. 実際はどうなるかわからないけど、抽象化されたものの移行は大変かも。

Q. Context など、数が多いとボイラーテンプレートになってしまう?どのくらいの粒度で定義すれば

  1. 指標などのはっきりとしったものはないが、ユースケース単位で必要な粒度が変わるのでは。







Java 5.0時代の非同期処理技術から学び直すScala/Java非同期処理

speakerdeck.com

リチャード 伊真岡 さん : @RichardImaokaJP

ビルコンと9割同じ内容だけど、洗練されたよ!

リチャードさんの動画スライド、いつもさすがすぎる。

抽象度の低いものから高いものへと少しづつ。

Java 1.4 => 5.0。Runnable => ExecutionService の非同期処理をアニメーションでわかりやすく表現。

Atomic な処理ではない場合の不具合と、 Syncronized をメソッドにつければただし動きになる。

・・・ここからはMacの電池温存・・・

質問

Fork Join Pool を Blocking I/O で利用してはいけないのはなぜ?




Scala.jsでGoogle Cloud Functionsを利用する前に知りたかったこと

docs.google.com

よしだ さん : @grimrose

なぜ GCP を選んだのか?

安い、マルチクラウド時代(両方知っていると潰しが効くよね)、Stateless(Stateが必要になった場合は Cloud SQL, Cloud Firestore)




Scala圏論チョット学ぶ

speakerdeck.com

谷口 慶一郎 さん : @ravineport

4年くらい前に少し勉強したのだけど、例にもれず俺も挫折w

だけど、谷口さんのこのセッションで圏論に対する理解が少しすすんだ気がする!!!

あとで復習するべし。




Scala における Monad って何だろう?

speakerdeck.com

Naoki Aoyama (aoiroaoino) さん : @AoiroAoino

あおやまさんとは ScalaMatsuri で知り合ったナカ。

最近 Forkwell さんにインタビューされた! :ta-da:

pr.forkwell.com

 


クロージング

みんなで写真を撮って Day1 クローズ!

素敵なカンファレンスでした!




懇親会

へ。

懇親会が開始されるまでちょっと待機(の時間にコレを書いている)。

懇親会LTで、 ScalaMatsuri 2020 のアナウンスをさせていただきますー!

docs.google.com