スピノカップ

あつ寿ぎ打

https://github.com/yu256/SpinoCup

GitHub

Scala

TailwindCSS

形態素解析とマルコフ連鎖を使用したタイピングゲーム

ゆー

推しアイデア

完全無料、静的サイトホスティングでホストできる問題文を自動生成するタイピングゲーム 全てをフロントエンドで行っているため、学習データと生成する文字数を実行時に指定することができる

作った背景

久しぶりにゲームを作りたいと思い、いろいろ考えていたところ某タイピングゲームの文字列の一文字を置換すると「あつすぎだ」の部分文字列になるなと思ったため

推し技術

Scala3 Scala.js

プロジェクト詳細

使用技術

Scala3

言語機能がとにかく強力で、全部盛り。 オブジェクト指向的機能, 第一級関数, 式指向はもちろん、do構文的機能(for式),パターンマッチ,高階多相(型レベルの高階関数のようなもの), ランクN多相, 暗黙的引数,マクロまでなんでもそろっている。 Scala3でインデント記法も使えるようになった。 JVMで動作するのはもちろん、Scala.jsでjs、Scala Nativeでネイティブバイナリにコンパイルすることができる。

Scala.js

AltJSの一つ。Scala.js対応ライブラリとJavaScriptのライブラリを使用することができる。ScalableTypedを使いTypeScriptのライブラリを型定義を自動変換してそのまま使用することもできる。 Scala(JVM)の最大の欠点である起動の遅さを克服することができる。

Laminar (UIライブラリ)

Reactのようなライブラリとされているが、触ってみた感じどちらかといえばVue3っぽかった。

TailwindCSS

おなじみ(?)CSSフレームワーク。

GitHub Pages

GitHub Actionsでデプロイ

Gooのひらがな化Web API

プロジェクトのこだわりポイント

  • お金をかけたくないため完全無料で文を生成したい
  • 面白い、使用したことのない技術を使用したい(あと単にScalaを書きたい

おもしろポイント

変な文章、変なひらがな化のトラップがある

感想

技術面

Scala.jsが思ったよりも良かった。小さなプログラムなのであまりScalaの機能は生かせていない(技術の無駄遣いポイント)が、それでも代数的データ型とパターンマッチが第一級なのとコレクションメソッドがやたらと強力なのはとても良いと思う。ほかの欠点(情報量など)はあまり使われていないのが原因だと思うのでみんな使って。

LaminarはほぼVueのように使用できたが、React.Suspenseのようなものがないのがややつらかった。とはいえLaminarのドキュメントをすべて読んだわけではないので別のベストプラクティスがあるのかもしれない。 scalajs-reactを使用するという手もあったが関数コンポーネントのuseEffectOnMountedByメソッドの挙動がドキュメントと違ったため見送った。あとで調査してバグならissueを立てる予定。

その他

とにかくお金をかけないということにこだわった結果、文を生成する部分に時間をかけすぎた。形態素解析の部分はJavaScriptの標準APIで楽できたが、マルコフ連鎖の実装の部分とひらがな化APIの使用による非同期オブジェクトの良い扱い方について考えるのに時間がかかった。 時間をかけすぎてUIを整えるのとほかのあつい要素を含める時間を確保できなかったのが惜しい。

あと技術の無駄遣い枠なので後悔はしていないが、初めて使用する技術ばかりだったので学習コストがそれなりにあった。どうjsにトランスパイルされるかを意識してAPIを使用しないと詰まる。

ゆー

@943f07b02ca579a4