見出し画像

オモカゲ システム構成振り返り

小さなお店のための顔がポイントカードになるアプリ、オモカゲの開発が完了し、無事にGoogleのPlay Storeの審査も完了しました。

現在ベータ版を公開中です。

今回の記事ではオモカゲのシステム、利用技術について振り返りたいと思います。 

モバイルアプリはFlutterで構築

アプリの機能は全てFlutterを利用して開発しました。

FlutterはAndroidとiOSの両方で動くクロスプラットフォームの開発環境です。今回はまだAndroid版でしかテスト、アプリ申請していませんが、iOS版は殆ど追加開発無しでiOS向けの追加設定さえすれば利用できるようになる見込みです。

Android版の運用が落ち着いたらiOS版のリリースを進めていきたいと考えています。

Flutterの要素技術として、各種ライブラリを活用しました。主要なライブラリを振り返ってみたいと思います。

状態管理

現在Flutterの状態管理としてデファクトスタンダードと思われるProviderのパッケージを利用しました。

状態管理とWidgetへの変更通知を簡単に記載できる優れたパッケージです。Change Notifierを継承したクラスと、WidgetのConsumerで変更通知を受けるぐらいの使い方しかしてませんが、Widget間で情報を共有するのに便利でした。

Stateful Widgetで済ませられるものはStateful Widgetにしていたのですが、原則Stateless Widgetにして状態管理はProviderに寄せた方がソースコードの見通しが良くなったかもしれません。

もう一つ、get_itというパッケージでアプリケーションのmodel部のデータを保持させていました。

Widgetの再描画が必要ないものはget_itで、再描画が必要なものはProvider、と使い分けていましたが、後から再描画が必要になってProviderに変更する必要が生じたりしていました。

これもソースコードの見通しの良さを考えると多少冗長でもProviderに寄せて置いたが方がよかったかな、と思いました。

データの永続化

 メンバー情報や売上履歴データの保存にはSQLiteを利用しました。

JavaScriptのdexie.jsは殆どwhere条件書かなくてもいいぐらいよくできているのですが、sqfliteだとちょっと凝った事をしようと思うと文字列連結でsql文を自分で組み立てる必要がありました。

ただsql文を組み立ててれば間違いなく動作するので、特に困らずにスッと利用できました。

お店の初期設定については単一レコードでよいのでshared_preferenceでkey valueで保存しました。こちらはシンプルに利用できて使いやすいパッケージでした。

ベクトル計算

PythonもNumPyにあたるベクトル計算用のライブラリとして、ml_linalgを利用しました。

オモカゲでは顔認証で高速に128個の数値の配列のユークリッド距離を計算する必要があるのですが、このライブラリで期待通りのパフォーマンスを発揮してくれました。

自分でユークリッド距離計算の数式を書く必要がなくて良かったです。

配列とVecorの変換も容易でした。

カメラ処理部

オモカゲのカメラ部はimage_pickerを利用しました。カメラと画像ピッカーを簡単に切り替えできるのでテストの時に大変助かりました。

カメラの向きやフロント、バックカメラ、カメラの解像度等細かい部分を気にせずに利用できるのが非常に良かったです。

一方で撮影に二回タップが必要なのはUIとして少し面倒です。一度のタップで撮影が完了できるといいですね。

パラメータ等で細かい調整はできなそうでした。

ここは利用にあたっての簡単さとトレードオフになるので致し方ないかと思います。

Firebase

今回はFirebaseのDBは利用していないのですが、一部Firebaseの機能を入れました。

firebase_auth: 匿名ユーザの認証で利用しています。PythonのWEBサービス側でもfirebase authで認証のチェックをしています。

firebase_analytics: 各画面のアクセス解析で入れました。

firebase_crashlytics: アプリのクラッシュが起きた時にクラウド上でクラッシュの状況を確認できるようになります。

Firebaseでユーザ認証したりDBでデータ管理しないとしても、このあたりはモバイルアプリなら入れておいて損はないと思います。

その他

Flutterでメンバーを一意に特定するuuidを発行するために利用しました。

オモカゲでは、メンバーや売上履歴の確認で、日付を範囲で指定しています。日付の範囲指定においてはこのパッケージを利用しました。

オモカゲで、リストを一覧で表示する際にこのパッケージを利用して少し気の利いたアニメーションを実現しています。

ちょっとアニメーションで工夫したい時に便利だと思います。

Flutterでマークダウンのドキュメントを整形して表示するめに利用しました。

利用規約、プライバシーポリシーをマークダウンで用意しましたのでその表示に利用しています。

以上がFlutterで利用した主なパッケージとなります。

WEBサービスはPythonで構築

Flutterから呼び出す顔認証のWEBサービスはPythonで構築し、Herokuにデプロイしました。

Heroku

Pythonの顔認証モデルをデプロイして動かしているクラウドサービスです。dynoと呼ばれる単位で簡単にスケールできるのが良いです。

Pythonでrequierment.txtを用意しておけば必要なライブラリをinstallしてくれます。

Flask

WEBサービスとして顔認識モデルを公開するにあたり、Flaskを利用しました。

初めて利用しましたが、サンプルコード等を見ながらすぐにWEBサービスとして構築、展開できました。

WEBサービスがこんな風に簡単に実装できるのは便利な世の中になりましたね。ApacheとTomcatを用意して、servletとJSPで実現していたころに比べると恐ろしく簡単になっています。

Gunicorn

FlaskだけでもHTTPサーバとして利用できますが、一応Herokuの推奨としてGunicornをかぶせておきました。

これで同時アクセスがあってもある程度さばけるようになるようです。

まとめ

以上利用した主要な技術、パッケージの紹介でした。

アプリ一つ開発するにあたっては、プログラミング言語の選択以外にもさまざまなライブラリから目的にあったものを取捨選択していく必要があります。

様々なパッケージ、ライブラリがある事で個人開発者でもそれらを利用して迅速にアプリを開発する事ができました。

これらのパッケージ、ライブラリを開発メンテナンスしてくれている方々は本当にありがたいですね。