タイピングゲームを支えきれない技術
はじめに
elmで数字と記号しか出ないタイピングゲームを作りました
— kyusuke (@8140i2865_3) 2019年8月24日
数字と記号の入力が苦手なvimmerはぜひ遊んでね
見知らぬ誰かと入力速度でマウントを取り合えるようになっているのでマルチモードも遊んでみてね
僕が見知らぬ誰かとマッチングしたいのでぜひ遊んでねhttps://t.co/OVzDYPB4Z8
数ヶ月前にタイピングゲームを作った。とりあえず動かすぜーなテンションで作りきってそのままだったので、供養代わりに振り返る。 全体的にやったことの雑多なメモでビルド/デプロイあたりはまた別途まとめたい感じの気位
動機
vimで記号の打つのが前々から辛かったので、いい感じに練習できるサムシングを欲してた。 で、特にそれっぽいのが無かったので何かの勉強がてら作ることにした。 ついでに記号苦手なvimmerも練習してくれるといいなって思ってた。 あと作ってる途中で、なんとなく対戦みたいなことしたいと思い始めたのでwebsocketで実装を試みた。
やったこと
- フロントはelmで実装した。興味本位
- サーバーはhaskellで実装した。趣味本位
- 自分が作ったやつで見知らぬ誰かとマッチングしたかった
反省点など
◎
- 一応、やりたかったことは一通り作り終えられた
- elmなんとなく雰囲気つかめたぞ!
- 自分がタイピング練習できる場ができたんだと思うことにしてる
✗
やったことなど
フロント
elm
全体的に良かった。なれてくるとhaskellチックな書き心地だった。 初期に下記のページの存在を知ってたらだいぶ理解が進んでた気がする。 elm-lang.org
意図した動きを実装できるというだけでそれがスマートなのか、elmらしい実装なのか、あたりは終始わからなかった。 引きこもってる限り一生わからない気がする。
サーバー
haskell
qiita.com いつもお世話になっております。
今回は1:1の組み合わせを複数個持つので型は違うけど大体これのコピペ。 読むのも勉強なので読むのも勉強なので
stack
以下の手順でサーバーに置くイメージを作っている
- stackでイメージを作成
- 上記イメージでstack build
マルチステージでデプロイ用のイメージを作成
- 速度はだいぶ改善した気がする
課題
- イメージが重い
- ビルドが遅い
- なにか変更があるたびに一からビルドしてる気がする
- 気のせいかもしれない
- なにか変更があるたびに一からビルドしてる気がする
このあたりはもう少し改善できると思うのでまた改めて qiita.com
ホスティングらへん
netlify
www.netlify.com フロント安定。elmをビルドしたjsを上げてる。特に問題無い。
zeit now
https://zeit.co PaaS?フロントも任せられるっぽいけど今回はサーバー側での利用を検討した。 shinjukuLT でも使ってる。 サーバー動くしdocker使えばhaskellも動かせるんじゃない?的な目論見。 qiita.com
nowでhaskell動かすっぽいDockerfileもあった now-examples/Dockerfile at 3a578a130926f30d5e7eb61575a5f9360ee713a0 · zeit/now-examples · GitHub
実際、以下の条件なら、 now で docker を動かすことは可能っぽい。
- v1
- 100MBまで
v1
now1.0なら利用可能なようです。 ちなみにnow2.0だとサーバープロセスを走らせること自体が無理なってるみたいです。
100MBまで
dockerのイメージサイズは100MBまでっぽい。 あえてv1使うのもあれだし、イメージサイズが圧倒的に100MB超えちゃうのでnow dockerは断念した。
その他
docker
めちゃくちゃビルドが遅かったので、予めstack installまで済ませたイメージを用意してそこからfromするようにした。 速度はだいぶ改善したものの、パッケージ増やすたびにもとのイメージをビルドし直すし、そのたびに莫大な時間がかかるので非常に辛い気がしてる。 今の所ビルド用イメージのlatestの中に入ってstack insatllしたやつをcommitしてlatestにしてるけどクソめんどいしcommitしたらイメージサイズが云々カンヌンって聞いたことあるからあれだけど、まあ4GBが5GBになったとこで誤差だろって感じはある。 そもそものイメージサイズを軽くしたい。 あとイメージビルドの時に stack install 早くする方法見つけたい
ssl
now使えなかった弊害 自前でサーバー用意したためにssl対応が必要だったので、Let's Encryptで対応。 ここらへんが邪魔してお気軽にインターネッツで試すのがめんどい気がする昨今。
EC2
無料枠が良かったのでt2.micro 容量がなさすぎて中でstack buildが出来なかった スケールはしないしする必要もないだろ 今はdocker pull してrunしてる。めんどい。
デプロイ大変
とりあえずデプロイが大変。デプロイ(フロー)が大変だから修正とかなんとか色々やる気がなくなる このあたりどうするべきなのか知識がnull
感想
elmに慣れられたのは良かった。 今のやり方では、ビルド遅い、デプロイ困難という壁があるのでもっとカジュアルにデプロイできるようにしたい。 ビルドに関してはstackとdocker buildのキャッシュらへんをうまいことすればいい感じになる気がするのでまた調べる。また今度調べる。 ビルド早くなってイメージサイズがもう少し軽くなれば割とカジュアルにしょぼいサーバーにデプロイできるんじゃないかなと思う。 というかnowみたいにコマンド一発でデプロイしたい。 ssl周りがめんどくて気軽にインターネッツ経由で遊ぶぜーが出来ない昨今が辛いなーと思いました。仕方ないです。 レポジトリ作って半年くらいかかった割に、特に達成もなく、当分触ることもないだろうと思うけど、それでもまあ楽しかった。 一人でより良いコードを書いていくのってなかなか難しいなあって思いました。 あとCI/CDが難しいなって思ったしテストは1行も書いてないです。