Slide 1

Slide 1 text

Scalaでいろんなことやって みよう! Scala Fukuoka 西立野 翔磨 Fukuoka Engineers Day 2021 online

Slide 2

Slide 2 text

最近考えていること - Scalaで他言語だとやりやすいことをやってみたい - 各言語の得意分野を活かしてプロダクト作るのも楽しいけど - Scalaでできることを増やしたい - Scalaに興味を持ってもらえるといいなぁ

Slide 3

Slide 3 text

- ScalaでGraalVM Native Imageを作ってAWS Lambdaで動かそう - https://zenn.dev/ignission/articles/scala-graalvm-native-image-lambda - Scalaでゲームを作ってみよう - https://zenn.dev/ignission/articles/scala-js-tetris-amplify - ScalaでGoogle Apps Scriptを書いてみよう - https://zenn.dev/ignission/articles/scala-js-google-apps-script 今日の内容

Slide 4

Slide 4 text

西立野 翔磨 株式会社ヌーラボ サービス開発部 Typetalk課 - ドラム - ドローン - キャンプ - 電動キックボード ← New!! @shomatan @shoma416

Slide 5

Slide 5 text

Scala Fukuoka - オンラインもくもく会 - 毎週火曜日19:00〜21:00 - Scala Fukuoka 2019 @LINE Fukuoka - Scala Fukuoka 2017 @Nulab - Scala Fukuoka 2016 @Nulab - サルでもわかるScala 72回 https://scala-fukuoka.org/ https://scala.connpass.com/

Slide 6

Slide 6 text

Scalaはいいぞ https://www.scala-lang.org/ - オブジェクト指向言語と関数型言語の特徴を融合したマルチパラダイム言語 - Java仮想マシン上で動作 - Javaの豊富なライブラリを利用できる - 簡潔に表記できる - 小さなスクリプトから大規模アプリケーションまで作れる

Slide 7

Slide 7 text

ScalaでGraalVM Native Imageを作ってAWS Lambdaで動かそう

Slide 8

Slide 8 text

- Golangみたいにシングルバイナリで配りたい - Fat JARではなく - Java Runtimeなしに - 慣れた言語でCLIツールを作りたい - Java Runtimeなしに - Lambdaでもサクッと動かしてみたい - 使いどころを増やしたい モチベーション

Slide 9

Slide 9 text

- JVM Runtime Mode - GraalVMをJITコンパイラとして使う - Java on Truffle - 実験的な技術らしい - Native Image ← 今日はこれ! - Javaコードをスタンドアロンのバイナリファイルにする GraalVMについて https://www.graalvm.org/docs/introduction/

Slide 10

Slide 10 text

完成品 https://github.com/ignission/aws-lambda-graal-native-scala-example

Slide 11

Slide 11 text

- とにかくリフレクション設定が命 - コンパイル時に全てのクラスが特定できないといけない - ライブラリ依存を最小に - リフレクション使っているライブラリだと設定が大変 ポイント

Slide 12

Slide 12 text

- 通常はGraalVMとnative-imageコマンドをインストールする - sbt-native-imageというsbtプラグインを使うとセットアップを自動で行ってくれ てすごく便利 セットアップ https://github.com/scalameta/sbt-native-image

Slide 13

Slide 13 text

- こんなのをひたすら書く.... - ロギングは必須だったのでがんばる リフレクション設定

Slide 14

Slide 14 text

ビルド設定 # ビルド実行コマンド エラーになったら雑にどんどん追加していく ...

Slide 15

Slide 15 text

ビルドしてみる スピーカーをオンにしておくと勝手にしゃべるので注意! メモリーをあるだけ使ってそうだけど、 GitHub Actionsでもビルドできた GraalVMとnative-imageコマンドを自動でインストールしている 83sくらいビルドにかかった。バイナリのサイズは 45M MacBookPro CPU: 2.4 GHz 8-Core Intel Core i9 Memory: 32 GB 2667 MHz DDR4

Slide 16

Slide 16 text

AWS Lambdaのカスタムランタイム

Slide 17

Slide 17 text

AWS Lambdaのカスタムランタイム

Slide 18

Slide 18 text

- 起動が早くて実行時間が短いプログラムにはメリットが多いと思う - ビルドはFat JARを作るより時間がかかる - 実行にはJava Runtimeが不要なので使ってもらいやすくなったかも? - AWS SDK for Javaも使えるようにしたい(ビルドエラー多くて断念した) まとめと今後の課題

Slide 19

Slide 19 text

Scalaでゲームを作ってみよう

Slide 20

Slide 20 text

- 慣れた言語でゲームを作ってみたい - 関数型言語でのゲーム作りに興味があった - ブラウザ上で動くゲームを作ろう - テトリスにしよう モチベーション

Slide 21

Slide 21 text

- AltJSのひとつ(TypeScriptみたいな) - サーバーとクライアントでコードを共有できる - とにかく型安全がすごい! - 対応しているJavaScriptライブラリがまだまだ少ない - 型定義ファイル(.d.tsみたいなやつ) - 自作もできる - おすすめWebサイト Scala.js | 天下一AltJS武闘会 Scala.jsとは

Slide 22

Slide 22 text

完成品 https://github.com/ignission/scalajs-amplify-tetris

Slide 23

Slide 23 text

- sbt-scalajsプラグインをインストール - Canvas APIを呼びたいのでscalajs-domを依存関係に追加 Scala.jsのセットアップ https://github.com/scala-js/scala-js

Slide 24

Slide 24 text

- npm packageをバンドルできるsbtプラグイン - 裏でnpmとwebpackを動かしている(webpack4系までサポート) - webpackと同じことができる scalajs-bundlerのセットアップ https://github.com/scalacenter/scalajs-bundler

Slide 25

Slide 25 text

- webpack全然わからないので雰囲気で設定している - scalajs-bundlerの設定自体はbuild.sbt - webpackの設定は設定ファイルのパスを指定する webpackの設定

Slide 26

Slide 26 text

- @JSExportTopLevelアノテーションで関数のexport Entrypointの設定

Slide 27

Slide 27 text

- 通常のJavaScriptプロジェクトと同じようにwebpackの設定をすればOK - Amplify の CI/CD 機能を使うときはビルドイメージに sbt が入ってないと失敗 する - Build settings > Build image settings AWS Amplifyでホスティング 実際にホスティングしているライブデモ: https://tetris.ignission.tech/

Slide 28

Slide 28 text

- Scalaでもゲーム作れた! - バンドルサイズは51.7KBだった - いろいろやろうとするとフロントまわりの知識がいる - webpack勉強しよ... - ビルドに数秒かかる - 型に厳しいので長期的なメンテコスト削減に期待 感想と今後の課題

Slide 29

Slide 29 text

ScalaでGoogle Apps Scriptを 書いてみよう

Slide 30

Slide 30 text

- ちょっとしたAPIサーバーをGoogle Apps Scriptで作りたい - データストアにGoogle Sheetsを活用してみる - くだらないBot量産したい モチベーション

Slide 31

Slide 31 text

- G SuiteサービスをJavaScript(ベース)で拡張できる - Google DocsやSpreadsheetsなど - ウェブアプリを公開できる - アドオンとして公開もできる Google Apps Scriptとは

Slide 32

Slide 32 text

完成品 https://github.com/ignission/scalajs-google-apps-script-facade/tree/master/example

Slide 33

Slide 33 text

- Scala.jsからGoogle Apps Scriptの関数どうやって呼べばいいんや... - Scala.jsとしてのライブラリもないし... - それっぽいのあったけどメンテされてなさそう - なければ作るか... ぶつかった壁

Slide 34

Slide 34 text

- scala-js-ts-importerというScala製のツールがある - .d.tsをScalaのコードに自動変換してくれる - sbt 'run somelib.d.ts SomeLib.scala' TypeScriptの型定義を変換する https://github.com/sjrd/scala-js-ts-importer

Slide 35

Slide 35 text

型変換後のイメージ TypeScript Scala

Slide 36

Slide 36 text

- 手作業で生成されたコードをスクリプトエディタにコピペするの大変 - 自動化したい - Googleが提供しているclaspというコマンドラインツールでできそう - clasp create --type sheets --rootDir ./dist - こんな感じでスプレッドシートまで自動で作ってくれる claspについて https://github.com/google/clasp

Slide 37

Slide 37 text

- Postデータ(json)をそのまま返す例 簡単なコードを書いてみる

Slide 38

Slide 38 text

- 書き味はJavaScriptのときと似ていて違和感ない(?) - このコード↓はシートを探してなかったら作る処理 Google スプレッドシートとの連携

Slide 39

Slide 39 text

- Botにメンションすると、内容をスプレッドシート記録 - 今まで記録された内容を返す - 誰得bot 動作例

Slide 40

Slide 40 text

- 慣れた言語でbotが作れた - デプロイをsbtのタスクにすることで楽チン - 記述量が多くなるので簡単なスクリプトなら素直にJavaScriptでやったほうが いいかも - クソbot量産したい 感想と今後の課題

Slide 41

Slide 41 text

おわりに

Slide 42

Slide 42 text

- Scalaでいろんなことできた - フロントエンドまで全部Scalaでできるぞ - Reactも書ける - オンラインもくもく会も是非遊びに来てください まとめ

Slide 43

Slide 43 text

- Scala3がもうすぐリリースされます!🎉 - 登壇時点ではScala 3.0.0-RC3 - Scala.jsがもっと書きやすくなりそう - あんまり試せてない - 今度のネタにします 今日お話できなかったこと...

Slide 44

Slide 44 text

Enjoy Scala! Fukuoka Engineers Day 2021 online