日報11日目
アプリを実地でテストしてきた。2回しか試せなかったけど、期待した挙動になった。精度的には問題なさそう。もう少し長い距離で確認する必要もあるが。。。まあテスト初回としては大成功だし、MVPとして有効なアプリだと確認できたと考えている。
wrapじゃなくてlapだ。。。修正済み。
当然、課題もある。課題管理が必要になってきた。
- pixel3の画面サイズだと、明るさ最大にしてもさすがに泳ぎながらの視認性が厳しい。7インチくらいあれば良さそう。7インチタブレットあるけど、古いのでアプリをインストールできるか要確認
- ターンのしぶきで意図しないタッチが起きてしまい、設定メニューが開いてしまった。キオスクアプリ化する手もあるようだが、ケースに入れるのが現実的な対応だろうなぁ
- スタート時はカウントダウンしてほしい。スタートをタップしてすぐ泳ぎだすのは慌ただしい。
- 自分にしか使い方は分からないので、UIの改善。ラベルつけるとか。泳ぎながら見える必要があるので、必要な情報は大きく表示してそれ以外は表示したくないんだけど。。。
- リファクタリング
- 最後の停止時の考慮がまったくなく、stopをタップするしかないのがいまいち。あらかじめ泳ぐ距離を登録しておいて、その距離に達したらストップウォッチを止めるとかしたい。
- 静かな場所でやるなら現状方法の、音が最大になる瞬間をピークとすることで良いが、多くの人に使ってもらうには雑音があっても使えたほうが良い。となるともっと高級な音声認識が必要になるが。。。機械学習を適用したとして、学習モデルをdartから使うことってできるんだろうか。
- 有料で売るとなると、ターンの認識精度を確かめるための簡易アプリが必要になるのかも。。。
- ワークアウト管理サービス(stravaとか?)に投稿する機能がほしい
現状でも自分のニーズには合致するアプリになった。とても嬉しい。どうにかplayストアで公開するまでもっていきたい。
午後は実家の引っ越しを手伝う予定。
日報10日目
雪が降ったけどこの時期なのですぐに融けた。保育園に送ったあとにプールで練習。その後は終日自宅にてアプリ開発。途中、引越し業者に見積もり依頼をした。自己都合の引っ越しなのにこの時期に重なってしまった。。。
録音開始タイミングの調整、レイアウトの調整などをしてアプリはアルファ版としていったん完成した。
これでいったん現場で使ってみる。知らない人のために解説すると、クイックターン音を検知してラップを取ってくれるアプリである。水泳以外にも使えなくはないかも。
公開するには、以下の調整が必要と考えている。
- 自分にしか使い方は分からないので、UIの改善。ラベルつけるとか。泳ぎながら見える必要があるので、必要な情報は大きく表示してそれ以外は表示したくないんだけど。。。
- 停止時の挙動がイマイチ。録音を即時停止すべき。
- リファクタリング...
所感
- flutterのレイアウトシステムがまだよく分からない。Containerで適宜ラップしないと、widthやheightがinifinityだと怒られることがある
- setStateの無名関数内でmutationする。無名関数はasyncであってはならない。この辺はvueのmutationと同じだな
日報9日目
アパートの水回りのトラブルで朝イチに業者に来訪いただいたため、立会をした。24時間常駐のためいつでも対応可能である。
その後はアプリの開発。タイマーへの組み込み中。ラップタイムデータをクラスに切り出したので多少ロジックはスッキリした。 しかしうまく動かない。。。何かがおかしい。
午後は腰を痛めないよう気を付けつつ、物置から実家への引っ越し作業をした。あとは本棚1個と寝具類だけになった。パソコンを運ぶときになって雪が舞ってきてあせった。
所感
- 3月も半ばにさしかかってしまった。一応進捗は出ているが。。。
- kotlinらしいコードになっていないのはオブジェクト指向プログラミングができていないからと、ツイッタでいただいたメンションで気づく。確かに全部入りクラスにはなっていた。。。つらい。
オブジェクトをnullableにしないためには、メンバー変数は使わずに必要になった時点で変数を宣言してオブジェクトを作ればいいんかな。
— Kouichi Nishizawa(19) (@koty) 2019年3月13日
日報7日目
午前中は自宅で作業。アプリの開発の続き。
- ピークを求めるロジックは完成。いろいろやった結果、平滑化せずに生データのまま最大値を探索すると精度が良かった。音声データを平滑化するとどんな影響があるのかよく分かっていない。この辺は大学のときに習ったはずなんだけど。。。今はパチンと手を叩いてピーク音を作っている。実際のターン音でどうなるかはまた別の話。
- ストップウォッチに組込中。ターン音がしたときからのタイマーを作る必要がある。すこし煩雑。
明日は別件で作業できないが、金曜あたりに現場で試用できるところまでもっていきたい。
午後は実家で打ち合わせと荷物を運び込むスペースの掃除。晴れていれば荷物を運び込みたかったが終日降ったり止んだりだった☔。今後は引っ越し作業とアプリの開発を並行する感じになりそう。
偶然なんだけど、無職期間と引っ越し(あと奥さんの繁忙期)が重なったのはラッキーではある。
日報6日目
朝水泳練習。その後はアプリの開発。迷ったが結局自宅で作業した。
音声データの取得方法について。
ネイティブからキューにpushしてdart側でpopするんか?とか、dart側でコールバックを定期的に受け取るんか?とかいろいろ考えたけど、 それらはどれもオーバースペックで、10秒録音した後にMethodChannelの戻り値としてbyte配列を返せば良いという結論に達した。
一応そこまでは実装できた。
今後のTODO
- ピークの検出ロジック
- タイマーへの組み込み
所感
- あまり連日ギーラボ通いするのも住人感が増してよろしくない。。。ほかのコワーキングスペースにもまた行ってみたい。
- エンジンがかかるのが遅い
- kotlinらしいコードを書きたい
日報5日目
自宅の片付け&掃除の後、弁当を持ってギーラボで作業。
終日水泳練習アプリの開発をしていた。
MediaRecorderで作成したwavファイルがうまく再生できないことが分かったので、以下のサイトを参考にAudioRecordで作り直した。
- Androidアプリ開発(10) --- wavファイルを扱うクラスを作成 --- : 工作と競馬
- Androidアプリ開発(11) --- 録音してwavファイルに記録するアプリ --- : 工作と競馬
ソースはこちら。
作成したwavファイルをscipy読むことができた。
今後のTODOとしては大きく2点ある。
- ストリーミング処理の模索
- おそらく、キューしてflutter側で頂点検出をすることになる
- 頂点検出方法の模索
どっちからすすめるか考えあぐねる。flutter+kotlinではなくJavaで作るのが最速な気もする。どうせiOSでは作らんし。
所感
- kotlinで
!!
を使いまくって申し訳ない気持ちになる。 - 完成するんだろうか