scala-aki-matsuri.connpass.com
2019年9月16日 セプテーニ・オリジナルさん
ScalaMatsuri2019のスポンサー4社(サイバーエージェント/ビズリーチ/チャットワーク/セプテーニ・オリジナル) が集った、Scala秋祭りになります!
基本的に「資料見たほうが早ええわ」な感じのあまり意味が無くなってしまったメモ。
もしご指摘あれば @omiend までおねがいしゃす。
体調悪めだったのだけど(というか頭痛がひどい)、なんとか行ってきた。
秋 Matsuri と銘うっているだけあり、普通に ScalaMatsuri のセッションに採択されそうなセッションばかりでめっちゃ楽しかった。
Scala 熱がまたあっがーる!
「Scala における継続モナドの実装と活用」
青山 直紀氏 / セプテーニ・オリジナル
本日の登壇資料です https://t.co/TnyWKAIWQq
— Naoki Aoyama (@AoiroAoino) September 16, 2019
#ScalaAkiMatsuri
Q.「Cats / ScalaZ で継続モナドを使ったことがある人」
A.「(会場内)結構いる。」
プロダクションで実際に活かす方法を紹介。
継続とは
「その後に実行される計算処理」。
普段意識することなく、暗黙的に使っている。
継続渡しスタイルとは
計算をした結果を次の処理の引数に受け取って、後続の処理を行うようなもの。
...ネスト具合がモナドでは?
継続モナドの実装
- 2番目の引数を関数にしてあげる。
- 型パラメータにする
- Alias を貼る
モナドとは、モナド則を満たすように、pure/flatMap を実装したもの P28
map/flatMap を実装する必要がある。
今回本質的に必要なのは pure/flatMap が必要なので実装する。
実装した継続モナドは、モナド則を満たすのか?
ScalaCheck をもちいてテストする => パスした。
結局 for 式で合成することが出来る。
継続モナドの文脈
OptionやListモナドそれぞれ文脈が有る。
じゃあ、継続モナドの文脈とは? => 継続を値として扱える計算。
継続モナドの活用
継続を値として使うことで、いろいろなことが出来る。
※お断り:例に挙げたものは、別に継続モナドを利用しなくても実現出来る
メリットとデメリットをちゃんと理解して、継続モナドを実装する必要があるねというお話。
「From Tagless-Final to Typed-Final: Program Transformations in the Final Style」
鈴木健一氏 / ビズリーチ
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 になった
「広告配信システムでのトラフィック計測と実装方法」
黒崎 優太氏 / サイバーエージェント
本日の発表資料です | 広告配信システムでのトラフィック計測と実装方法 #ScalaAkiMatsuri https://t.co/jCFA6Nb7I0
— くろさん (@kuro_m88) September 16, 2019
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開発に取り組んだ」
藤井 善隆氏 / チャットワーク
遅くなりましたが、昨日、登壇させていただきました資料です🙆♂️
— Yoshitaka Fujii (@yoshiyoshifujii) September 17, 2019
「サマーインターンシップ2019で学生とDDDなScala開発に取り組んだ」https://t.co/YHmswaOn6f#ScalaAkiMatsuri
チャットワークさんで今年初開催のサマーインターンシップをした中でのお話。
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
本日の発表資料です。
— blac_k_ey (@blac_k_ey) September 16, 2019
「面倒なことはScalaスクリプトにやらせよう」#ScalaAkiMatsurihttps://t.co/5rYBaq2r5j
技術読本で執筆。
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
LT2 「Dependency injection at AbemaTV」
@omarun_4263
DIフレームワークの紹介。
DIのおさらい。
Airframe などを利用するさいのDIのやりかたなど。
Abema TV では Scaladia という DI フレームワークを利用している。(登壇者さん自作フレームワーク!)
Abema TV 以外での利用例が無い...。
LT3 「SaaS企業をスケールするためにScalaを選択した理由と1年間の振り返り(仮)」
@showmant(takeo)
遅れてしまいましたが昨日 #ScalaAkiMatsuri にてLTさせていただきました。技術的な内容ではないですが一応資料アップしました!| SaaS企業をスケールさせるためにScalaを選択した理由と1年間の振り返り https://t.co/NrZWUg5XJI
— showmant / Alp (@showmant_) September 17, 2019
omiend: 下記も併せて掲載しておきます。
なぜ Scala?
- 請求・決済領域ゆえの堅牢性
- 自身の技術スタック・環境
自分がケツを持って書ける言語にしたほうが良い。
採用大変?人口少なくない?
Scala で作る以外のこともしないといけない。
Scala 以外にもやったことないことたくさん。
マインドが大事。
コミュニティーへの貢献
Scalaでよかったの?
無事リリース!
堅牢!
スケールできそうな気配だからよかったかも。
メンバーの反応
カッコイイとかw
初動だけ大変だったけど概ね良い。
ビルド時間・・・コスト
CircleCI 回すよりはオンプレでぶんぶん丸頑張らせるほうがやすい!!!w
LT4 「もう一つのビルドツール mill で Docker イメージを作る」
@atty303
「もう一つのビルドツール mill で作る Docker イメージ」の発表資料です。 https://t.co/9lUyiIOTad #scalaakimatsuri
— atty303 (@atty303) September 16, 2019
mill とは
ビルドツール
速度
sbt よりもめっちゃ早い。
Jib Core
Docker daemon 不要!!!
みんなも mill 使ってみよう!
LT5 「sbtを開発の中で活用する方法・例について」
@k_bigwheel
mill の後ではやりづらいw
IntelliJ IDEA
IntelliJ IDEA において、sbt 使いやすくなった。
しかし、まだまだ使いづらいところもある(フリーズしちゃったり)。
依存関係
依存関係の強制を sbt で行ってしまうことで、ヒューマンエラーなどによる誤依存をなくす。
タスクランナーとしての sbt の強さ
- 並行実行
- ファイル監視・自動タスク実行
- タスクの引数を型込みで指定
- Shell コマンドをすべて捨てて、カスタムタスク化している
ほかにもいろいろ活用事例が。
麻植さんから
来年の ScalaMatsuri は5月中旬予定だよ!