タイピングゲームを支えきれない技術

はじめに

typingame.netlify.com

数ヶ月前にタイピングゲームを作った。とりあえず動かすぜーなテンションで作りきってそのままだったので、供養代わりに振り返る。 全体的にやったことの雑多なメモでビルド/デプロイあたりはまた別途まとめたい感じの気位

動機

vimで記号の打つのが前々から辛かったので、いい感じに練習できるサムシングを欲してた。 で、特にそれっぽいのが無かったので何かの勉強がてら作ることにした。 ついでに記号苦手なvimmerも練習してくれるといいなって思ってた。 あと作ってる途中で、なんとなく対戦みたいなことしたいと思い始めたのでwebsocketで実装を試みた。

やったこと

  • フロントはelmで実装した。興味本位
  • サーバーはhaskellで実装した。趣味本位
    • 自分が作ったやつで見知らぬ誰かとマッチングしたかった

反省点など

  • 一応、やりたかったことは一通り作り終えられた
  • elmなんとなく雰囲気つかめたぞ!
  • 自分がタイピング練習できる場ができたんだと思うことにしてる

  • haskell力上がった気がしない
  • 誰も使わない
    • vimmerは触ってないし
    • 僕はマッチングしていない
  • もう少しなんのための何なのかってことを明記しておけばよかった気がする

やったことなど

フロント

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行も書いてないです。