the industrial

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

Scala 秋 Matsuri 2019 メモ;レポ #ScalaAkiMatsuri

scala-aki-matsuri.connpass.com

2019年9月16日 セプテーニ・オリジナルさん



ハッシュタグ#scala_aki_matsuri

ScalaMatsuri2019のスポンサー4社(サイバーエージェント/ビズリーチ/チャットワーク/セプテーニ・オリジナル) が集った、Scala秋祭りになります!

基本的に「資料見たほうが早ええわ」な感じのあまり意味が無くなってしまったメモ。

もしご指摘あれば @omiend までおねがいしゃす。



体調悪めだったのだけど(というか頭痛がひどい)、なんとか行ってきた。

秋 Matsuri と銘うっているだけあり、普通に ScalaMatsuri のセッションに採択されそうなセッションばかりでめっちゃ楽しかった。

Scala 熱がまたあっがーる!




Scala における継続モナドの実装と活用」
青山 直紀氏 / セプテーニ・オリジナル

Q.「Cats / ScalaZ で継続モナドを使ったことがある人」

A.「(会場内)結構いる。」

プロダクションで実際に活かす方法を紹介。

継続とは

「その後に実行される計算処理」。

普段意識することなく、暗黙的に使っている。

継続渡しスタイルとは

計算をした結果を次の処理の引数に受け取って、後続の処理を行うようなもの。

...ネスト具合がモナドでは?

継続モナドの実装

  • 2番目の引数を関数にしてあげる。
  • 型パラメータにする
  • Alias を貼る

モナドとは、モナド則を満たすように、pure/flatMap を実装したもの P28

map/flatMap を実装する必要がある。

今回本質的に必要なのは pure/flatMap が必要なので実装する。

pureの実装

flatMapの実装

実装した継続モナドは、モナド則を満たすのか?

ScalaCheck をもちいてテストする => パスした。

結局 for 式で合成することが出来る。

継続モナドの文脈

OptionやListモナドそれぞれ文脈が有る。

じゃあ、継続モナドの文脈とは? => 継続を値として扱える計算。

継続モナドの活用

継続を値として使うことで、いろいろなことが出来る。

※お断り:例に挙げたものは、別に継続モナドを利用しなくても実現出来る

メリットとデメリットをちゃんと理解して、継続モナドを実装する必要があるねというお話。




「From Tagless-Final to Typed-Final: Program Transformations in the Final Style」
鈴木健一氏 / ビズリーチ

speakerdeck.com

tagless-final

tagless-final は死んだ。

型安全な埋め込みDSLを構築する手法。

対象言語とメタ言語がある。

型付け規則とコードのシグネチャーは一致する。( Repr[T]

HOAS でλ抽象を扱う

tagless のシグネチャが型を守ってくれるので、もし間違えてもコンパイルエラーとなってくれる。

抽象型を使い方法( OCaml っぽい)以外に、型パラメータを使う方法( Haskell っぽい)もある。

単位元

n + 0 = n 右単位元

0 + m = m 左単位元

typed-final

omiend: 流石にここらへんから難しくなってきたので、なんとなく単語だけメモっとく汗

tagless-final は 3年前に typed-final という名前に変わった。

関数で言語を構成する。

インターフェースに対して複数のインタプリタを保持する。

Reification and Reflection

乗法単位元規則 / 加法単位元規則

パターンマッチを利用して左単位元、右単位元の変換を行う。

まとめ

  • typed-final は DSL を構築するアプローチ
  • 表現型 repr で対象外の構成子が入り込まないようにする
  • GADT と NbE 的アプローチを併用することで、型を保存しながら final style でプログラム変換
  • tagless-final は typed-final になった




「広告配信システムでのトラフィック計測と実装方法」
黒崎 優太氏 / サイバーエージェント

omiend: メモるより資料読んだほうが早そう。

トラフィック計測などで工夫している点を発表。

ScalaMatsuri で Wi-Fi を担当してくれた方。めっちゃ良い感じの Wi-Fi でした。

アドテク本部 => AI事業本部

Q.広告系のお仕事してる方?

A.(会場内)1/3ほどの方が手をあげた

RTBのしくみについての説明。取引は 100ms 以内でなければならない。

計測サーバーの実装

広告の計測の種類

  • 広告の表示
  • 広告のクリックの計測
  • Dynalyst はリタゲ広告配信
  • ユーザの情報を同期しないといけない

計測サーバーには Akka HTTP を普通に利用している。

もともと Spray を利用していたが、開発が止まったので Akka に。

外部計測ツールとの連携

クリックサーバーと外部計測ツールサーバー間で連携している。

広告主も複数のサーバーを利用しているため、計測ツールサーバーを配置している。

DynamoDB へのアクセスを多重化

AWS SDK for Java 2.0 が公開され、netty ベースの実装が追加

ノンブロッキングでリクエスト処理が出来るので嬉しい。

計測パラメータの引き回し

レポート作成、分析、外部システム連携のためのパラメータ。

4〜50種類ある。

困ったこと

  • パラメータ数が多い
  • 使わなくなったパラメータも後方互換のために残しておいている(ブラウザ開けっ放しとかで、3ヶ月後に計測が飛んでくることがある)
  • 暗号化したパラメータ
  • 改ざんへの耐性

Protocol Buffers

困ったことへの対策として、ScalaPB というのを使う。

URLを短くしたい。Deflate というアルゴリズムを採用。

暗号化したい。

Initialization Vector を利用して、基本的には違うバイナリーが作れるように。

値が入っていない場合、Option でくるむなどした。

ログの計測

fluentd => Kinesis => Firehose(作ったモノ) => S3

Firehose(作ったモノ) はログ取得時間によって書き込まれる S3 のディレクトリを選定する?

Amazon EMR を利用して集計システムを自作

クラスタコンピューティングフレームワーク

Apache Spark

お金を出せばスケールする

テストコードかける(Scala




「サマーインターンシップ2019で学生とDDDなScala開発に取り組んだ」
藤井 善隆氏 / チャットワーク

チャットワークさんで今年初開催のサマーインターンシップをした中でのお話。

Unlearn:学びほぐし。

Scala 関西 Summit 2019年10月26-27日開催!

どんなことしたの?

  • 講義1週間(チャットワークでの開発の全体の流れなど)
  • 業務1週間(とあるWebアプリの開発業務など)

Scala 教育 - 事前

実践Scala入門をプレゼントするなど。

Scala 教育 - 講義

実践Scala入門と業務パートで必要とんある知識の間を埋める。

読みやすさ、保守性、非機能要件とのトレードオフ

DDD と Scala 開発

ドメインモデリングからの Unlearn

実際のユースケースからドメインモデリングしていく。

「Bookmarkを追加する」というユースケースでも、先輩社員たちが色々考えて助言・提案していく。

Scalaに関する指摘事項からの Unlearn

  • 非同期処理しなくてもよいことはある。
  • 正常系をベースに書きましょう。
  • 生成ロジックは暗黙知のせず、ファクトリメソッドにしよう。

などなど。




LT1 「面倒なことはScalaスクリプトにやらせよう」
@blac_k_ey

技術読本で執筆。

Shell でや・・・つらい。

sbt 使おうぜ。 => ちょっとオーバー。

色々 Scala 書きたいよね。

Ammonite を使おう。

Ammonite-REPL

Homebrew で入れられる。

amm コマンドを叩くと REPL 起動。

便利な機能がいっぱい。

Magic Import

Maven Central から Jar を取得してスグにライブラリを使える!

Ammonite Script

Scala コードをコマンドラインから直接コンパイル・実行。

Jsoup : スクレイピングするやーつ

Ammonite にデフォルトで入っている便利なライブラリ

  • ammnoite-ops / os-lib

など

活用例

esa.io => GitLab => DATADOG

gist.github.com




LT2 「Dependency injection at AbemaTV」
@omarun_4263

DIフレームワークの紹介。

DIのおさらい。

Airframe などを利用するさいのDIのやりかたなど。

github.com

Abema TV では Scaladia という DI フレームワークを利用している。(登壇者さん自作フレームワーク!)

Abema TV 以外での利用例が無い...。




LT3 「SaaS企業をスケールするためにScalaを選択した理由と1年間の振り返り(仮)」
@showmant(takeo)

omiend: 下記も併せて掲載しておきます。

note.mu

なぜ Scala

  • 請求・決済領域ゆえの堅牢性
  • 自身の技術スタック・環境

自分がケツを持って書ける言語にしたほうが良い。

  • サービスの特性(横断業務オペ / 請求・決済領域)
  • 仮説検証の重み(SaaSはニーズを捉えやすい・ヒアリングしやすい => 最初からスケールしやすい)

採用大変?人口少なくない?

Scala で作る以外のこともしないといけない。

Scala 以外にもやったことないことたくさん。

マインドが大事。

コミュニティーへの貢献

Scalaでよかったの?

無事リリース!

堅牢!

スケールできそうな気配だからよかったかも。

メンバーの反応

カッコイイとかw

初動だけ大変だったけど概ね良い。

ビルド時間・・・コスト

CircleCI 回すよりはオンプレでぶんぶん丸頑張らせるほうがやすい!!!w




LT4 「もう一つのビルドツール mill で Docker イメージを作る」
@atty303

mill とは

www.lihaoyi.com

ビルドツール

速度

sbt よりもめっちゃ早い。

Jib Core

Docker daemon 不要!!!

みんなも mill 使ってみよう!




LT5 「sbtを開発の中で活用する方法・例について」
@k_bigwheel

docs.google.com

mill の後ではやりづらいw

IntelliJ IDEA

IntelliJ IDEA において、sbt 使いやすくなった。

しかし、まだまだ使いづらいところもある(フリーズしちゃったり)。

依存関係

依存関係の強制を sbt で行ってしまうことで、ヒューマンエラーなどによる誤依存をなくす。

スクランナーとしての sbt の強さ

  • 並行実行
  • ファイル監視・自動タスク実行
  • タスクの引数を型込みで指定
  • Shell コマンドをすべて捨てて、カスタムタスク化している

ほかにもいろいろ活用事例が。




麻植さんから

来年の ScalaMatsuri は5月中旬予定だよ!

懇親会へ