Scala入門

入門というか再開

昔仕事でApacheSpark触ってて、そこでScalaを触った。 結構気に入って、マイ言語がJavaからScalaにかわりかけたけど、かわりきる前にJavaに戻ってた。

  • sbtが頻繁にバージョンアップしてた(バージョン1に到達してなかったし)
  • Scalaが頻繁にバージョンアップしてた(2.9,10,11,12とどんどんかわっていってたw)
  • 起動時間が長かった(Javaと比べて圧倒的に遅い)

上記がその理由だが、PCのスペックが上がった(HDD/i3/16GB→NVMe/Ryzen9/64GB)ので、再度入門してみようと思う。 ちょっとツールを書くときに Scala を選べるように。

要約

あまり手順をすべて記事にするつもりはなくて、ひっかかったところだけ書いていく。 基本的に、以下のサイトみながらやったんだけど、途中でとまらなかった。 めっちゃハードル下がったなぁ。

blog.3qe.us

  • Coursierという管理ツールがいて、それを使うようになった感じ。
    • sbt入れ直すときに、sbtを自分で落とさなくてよくなってうれしい
  • 開発はVSCodeらしい
    • EclipseでもIntelliJでもないらしい。よいね。起動待ちが減る。
    • 多分コード補完が弱いと思うので、IntelliJの方がいいかもしれない。

sbt new

上記記事に書いてないので、この辺から書く。

 a) scala/toolkit.local               - Scala Toolkit (beta) by Scala Center and VirtusLab
 b) typelevel/toolkit.local           - Toolkit to start building Typelevel apps
 c) sbt/cross-platform.local          - A cross-JVM/JS/Native project
 d) scala/scala3.g8                   - Scala 3 seed template
 e) scala/scala-seed.g8               - Scala 2 seed template
 f) playframework/play-scala-seed.g8  - A Play project in Scala
 g) playframework/play-java-seed.g8   - A Play project in Java
 i) softwaremill/tapir.g8             - A tapir project using Netty
 m) scala-js/vite.g8                  - A Scala.JS + Vite project
 n) holdenk/sparkProjectTemplate.g8   - A Scala Spark project
 o) spotify/scio.g8                   - A Scio project
 p) disneystreaming/smithy4s.g8       - A Smithy4s project
  • 「.g8」が謎だったけど、ChatGPTが教えてくれた。
  • Scala Toolkit とか初めて見るなぁ。
    • 入門者用っぽい。バージョンが0.2とかなんでまだ作り始めたところって感じか。 scala-lang.org
  • cross-platform は、scala.jsとかscala-nativeとか用のやつっぽい。
    • Kotlin由来っぽい。いいところをマネする感じかな。
  • scala3とscala2を敢えて分けてる。
    • 意識的にバージョンを使い分けないといけないのがよくわかるな。
    • sparkもまだscala3で動いてないようやし。
    • 周りのツール類がまだまだ対応してないイメージ。
  • playframework はscalaのWebアプリケーションフレームワークやね。結構有名。
  • tapir は、HTTPのエンドポイントをビジネスロジックと切り離して、型でがっちり書くためのライブラリのよう。
  • scala.js はAltJS。
    • Scala で開発してて、全部Scalaでやりたいときに使う非常にニッチな感じかな。
  • Spark は、分散処理基盤かな。
    • 最近はLLMとかの生成AI系でも使うのではなかろうか。
    • AI系はPythonだと思うので、敢えてScalaを使う理由はパフォーマンスくらいだろうけど、技術者のハードルが上がるので、それも難しいだろうな。
  • Scioってのは、ApacheBeamのScala版か。
    • ApacheBeamは、バッチとかストリーム処理を統一的に扱えるように抽象化した基盤かな。Sparkとバッチを同等に書ける感じだと思う。
  • Smithyってのは、AWSAPI記述言語らしい。
    • IDLだから、インターフェイスを記述する感じで、中身がなんの言語か意識しなくてよいようなやつか。使ったことない。

scala3を使いたいので、dで。

VSCode

プロジェクトが作成されたら、VSCodeでプロジェクト開いて、metalsを入れるんだけど、プロジェクト開いてから実際に実行できるようになるまで、結構時間かかる。 「.bloop」「.metals」「.vscode」が一通り完成したら、実行できるようになるので、それで完成。

Scalaをいつ使うのか

zenn.dev

個人的な感想を述べると、普通の会社ではScala技術者の確保が難しいので、敢えてScalaを選ぶ理由はないと思います。 分散処理的なことをやりたいなら、パブリッククラウドのサービスを組み合わせてやる方が始めやすいはず。 Sparkとか使う場合はPythonの方がハードルが低いし、技術者を確保しやすいので。 パブリッククラウドで採算が取れなくなって、自前で全部やることになったときに初めて検討すればよい気がします。 金はあるんだ、という状態ですね。 そのときは、どういう人を採用するかから分からないと思うので、アドバイザみたいな人に入ってもらって、何をすればいいのか教えてもらいながらやるのがいいのでは。

なんでお前は Scala やるの

上記にもかかわらず Scala を使うのは、Sparkのソースコードや機能を触って感動したという体験のせいですね。 Scalaはだいぶ型の強い言語なので、Scalaやっておけば、他の型の強い言語を触るときも驚きが減るから、時間の無駄にもならないと思ってます。 IdrisとかF#とかもやりますが、Scalaもやる感じです。 順番は触りやすい or 触りたい順です。

やってみた記録

普通に調べまくったので、記録しとく。

github.com

scalafmt は注意

sbtpluginによる方法とVSCodeによる方法とあるが、それぞれサポートしてるバージョンが違うみたいで、VSCodeでは動くけどsbtpluginでは動かないとかある。 sbtpluginをバージョンがないとダウンロードしてこようとするみたいで、勝手にpowershell.exeをキックしてエラーをはいてた。 なので、VSCodeによる方法を使ったんだけど、初回に.scalaftmt.confがなかったら生成してくれるのはいいとして、記法が間違ってるとフォーマットされない事象としてあらわれる。 気づきにくいな。 とりあえず、あまりこだわりすぎずに先に進もう。

Circe (JSONライブラリ)

cats依存のJSONライブラリ。 catsがそこまでいい感じなら、playframeworkみたいな巨大なフレームワークじゃなくて、もっと薄いフレームワークを使いたくなるな。

Cats Effect (非同期ライブラリ)

cats 関係ないけど、 for yield が分からないな。

logmi.jp

上記サイトで疑問は解消したが、難しい感が消えないのは、非同期ライブラリ自体が難しいということが分かった。 やっとなんとなく理解したけど、ぱっとやりたいことできないの不便やな。 慣れないと。