Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scalaでいろんなことやってみよう!

63c01564f6afe7af88d5d6981790457d?s=47 shoma
April 25, 2021

 Scalaでいろんなことやってみよう!

FUKUOKA Engineers Day 2021 online

63c01564f6afe7af88d5d6981790457d?s=128

shoma

April 25, 2021
Tweet

Transcript

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

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

  3. - 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 今日の内容
  4. 西立野 翔磨 株式会社ヌーラボ サービス開発部 Typetalk課 - ドラム - ドローン -

    キャンプ - 電動キックボード ← New!! @shomatan @shoma416
  5. 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/
  6. Scalaはいいぞ https://www.scala-lang.org/ - オブジェクト指向言語と関数型言語の特徴を融合したマルチパラダイム言語 - Java仮想マシン上で動作 - Javaの豊富なライブラリを利用できる - 簡潔に表記できる

    - 小さなスクリプトから大規模アプリケーションまで作れる
  7. ScalaでGraalVM Native Imageを作ってAWS Lambdaで動かそう

  8. - Golangみたいにシングルバイナリで配りたい - Fat JARではなく - Java Runtimeなしに - 慣れた言語でCLIツールを作りたい

    - Java Runtimeなしに - Lambdaでもサクッと動かしてみたい - 使いどころを増やしたい モチベーション
  9. - JVM Runtime Mode - GraalVMをJITコンパイラとして使う - Java on Truffle

    - 実験的な技術らしい - Native Image ← 今日はこれ! - Javaコードをスタンドアロンのバイナリファイルにする GraalVMについて https://www.graalvm.org/docs/introduction/
  10. 完成品 https://github.com/ignission/aws-lambda-graal-native-scala-example

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

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

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

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

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

    2.4 GHz 8-Core Intel Core i9 Memory: 32 GB 2667 MHz DDR4
  16. AWS Lambdaのカスタムランタイム

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

  18. - 起動が早くて実行時間が短いプログラムにはメリットが多いと思う - ビルドはFat JARを作るより時間がかかる - 実行にはJava Runtimeが不要なので使ってもらいやすくなったかも? - AWS

    SDK for Javaも使えるようにしたい(ビルドエラー多くて断念した) まとめと今後の課題
  19. Scalaでゲームを作ってみよう

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

  21. - AltJSのひとつ(TypeScriptみたいな) - サーバーとクライアントでコードを共有できる - とにかく型安全がすごい! - 対応しているJavaScriptライブラリがまだまだ少ない - 型定義ファイル(.d.tsみたいなやつ)

    - 自作もできる - おすすめWebサイト Scala.js | 天下一AltJS武闘会 Scala.jsとは
  22. 完成品 https://github.com/ignission/scalajs-amplify-tetris

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

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

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

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

  27. - 通常のJavaScriptプロジェクトと同じようにwebpackの設定をすればOK - Amplify の CI/CD 機能を使うときはビルドイメージに sbt が入ってないと失敗 する

    - Build settings > Build image settings AWS Amplifyでホスティング 実際にホスティングしているライブデモ: https://tetris.ignission.tech/
  28. - Scalaでもゲーム作れた! - バンドルサイズは51.7KBだった - いろいろやろうとするとフロントまわりの知識がいる - webpack勉強しよ... - ビルドに数秒かかる

    - 型に厳しいので長期的なメンテコスト削減に期待 感想と今後の課題
  29. ScalaでGoogle Apps Scriptを 書いてみよう

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

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

    Google Apps Scriptとは
  32. 完成品 https://github.com/ignission/scalajs-google-apps-script-facade/tree/master/example

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

    ぶつかった壁
  34. - scala-js-ts-importerというScala製のツールがある - .d.tsをScalaのコードに自動変換してくれる - sbt 'run somelib.d.ts SomeLib.scala' TypeScriptの型定義を変換する

    https://github.com/sjrd/scala-js-ts-importer
  35. 型変換後のイメージ TypeScript Scala

  36. - 手作業で生成されたコードをスクリプトエディタにコピペするの大変 - 自動化したい - Googleが提供しているclaspというコマンドラインツールでできそう - clasp create --type

    sheets --rootDir ./dist - こんな感じでスプレッドシートまで自動で作ってくれる claspについて https://github.com/google/clasp
  37. - Postデータ(json)をそのまま返す例 簡単なコードを書いてみる

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

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

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

  41. おわりに

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

  43. - Scala3がもうすぐリリースされます!🎉 - 登壇時点ではScala 3.0.0-RC3 - Scala.jsがもっと書きやすくなりそう - あんまり試せてない -

    今度のネタにします 今日お話できなかったこと...
  44. Enjoy Scala! Fukuoka Engineers Day 2021 online