2018-05-04 bouzuya/fwt をつくった
bouzuya/fwt をつくった。
fwt はチームメンバーの顔写真を共有するための小さな Web アプリケーション。リモートワーク (テレワーク) におけるチームメンバーの状態を把握することをねらいとしている。いまはなき Sqwiggle や sneek の機能を削ったものと言えば、分かりやすいかもしれない。
実装としては Media Capture and Streams API を使って、リアルタイムに顔写真を撮影し、共有している。プログラミング言語に PureScript を、主なパッケージに purescript-hyper や purescript-halogen を使用している。 Node.js の上で動く。 Dockerfile もあり、 Heroku などへ容易にデプロイできる。 ソースコードは GitHub にリポジトリを公開している。
この blog での初出は 2018-04-12 。過去の記事は↓。
- 2018-04-12 構想
- 2018-04-13 Haskell → PureScript
- 2018-04-14 hyper & routing
- 2018-04-16 refs
- 2018-04-18 argonaut
- 2018-04-19 halogen
- 2018-04-20 halogen-vdom-string-renderer
- 2018-04-21 navigator.mediaDevices.getUserMedia & halogen のドキュメント
- 2018-04-23 navigator.mediaDevices.getUserMedia の PureScript からの利用
- 2018-04-24 hyper の writeString でエラー
- 2018-04-25 routing でクエリ文字列を利用
- 2018-04-26 routing を放棄
- 2018-05-03 halogen の EventSource を利用
長いが、つくることになった経緯・背景について書く。
ぼくのチームは sneek を使っている。ぼくは sneek をリモートワークにおいて失われがちな「雑談」を取り戻すためのツール・サービスだと思っている。
単純に通話するツールの選択肢は山ほどある。 Skype / Hangouts / Appear.in などだ。会議のようなものなら、これらで十分だ。ただ「雑談」は意外と難しい。「隣の席の同僚にちょっと声をかける」ようなことへの障壁がリモートワークにはあると思っている。
↑のツールを常に通話状態にすることで代替はできる。ただ、どれもパソコンやネットワークの負荷がかかってしまうし、ガヤガヤとした雑音を聞かされる (気持ちの上での) 負荷もかかってしまう。
sneek などはそういった問題への解決策だ。定期的に撮影される写真を見ることで、ざっくりとした状態の把握はできる。ここに通話までは要らない。そして、相手への確認なく通話できるようになっているので、声をかけるように使える。つまり「雑談」を取り戻せるだろう。
……と、ここまで書いておいてあれだが、費用の問題もあってぼくはこの機能を使っていない。肝心な機能を使わなくてどうするんだという話ではあるが、ざっくりとした状態の把握でもわりと役に立つし、メンバーの顔を見ているとひとりで作業している「孤独感」もやわらぐ気がする。
ただ sneek を使っていて気になる点はいくつかある。まず時間の表示がおかしい。撮影時刻ではなく現在時刻が表示される。それに関連して、いつのまにか未接続の状態になっていてもエラーが何も表示されない。送信できなくなっており、相手には届いていなくても分からない。
使っている機能の少なさや不満のある挙動を受けて「自分でつくろう」という発想に至る。 2018-04 からはじめた『 Haskell or PureScript or Rust で毎日 1 コミット』という取り組みもあるので、 PureScript で書いてみようという結論に至る。
経緯はここまで。
多くの課題がある。
- 通話機能がない
- SSR がない
- HMR がない
- halogen の component が分割されていない
- データが永続化されていない
- ユーザーの設定が環境変数でしかできない
- ユーザーのパスワードを変更できない (管理者に分かってしまう)
- ビデオの品質を設定できない
- 途中で切断した場合などのエラー処理がない
- パスワードを保持して何度も送信している
- 時刻が UTC で表示される
どこまで対応するかは分からない。どちらかと言えば次の何かをつくっていきたい。もし、きちんと使うことになったら、それに合わせて優先度の高いものに対応していきたい。
今回の収穫は、クソコードで小さくても PureScript で動く何かを書けたこと。上記の課題に対応しつつ、次の何かを考えていくつもりだ。