私自身は一度もWebのフロントエンジニアとしてはアサインがされたことがないのだが、「PoCではこんな感じのものでOKをもらって、こんなイメージのプロダクトを作りたいです」と言うのにモックアップ的なサイトを作ることもある。
モックのWEBサイトをpythonで作るにはflaskが便利
- モックのレベルなので、MVCとかがわからなくてもなんとかなる
- 本質的にな価値(例えば革新的な機械学習の応用例などを実装、例として示す)
- 可能ならばこのユースケースから使い勝手の要点となる箇所を洗い出す(精度なのか、速度なのか、UI/UXなのか)
問題設定
問題を定義してそのソリューション(ソリューションの精度以外の品質はそんなに問わない)を与える。この基本的なフレームワークが基本的なPoCの基礎となり、実際にプロダクションにしたときの具体的なイメージの示唆を与えることを目的とする
仮設定:例えば、Togetterで投稿記事の日時順にバズったやつを過去に遡る仕組みがない
- 試しに作ってみよう
WorkerとPre-fork
- アクセスが来たらプロセスを増やすか、事前にプロセスを立ち上げているかの違い
- 事前にpandasや機械学習の推論ロジックなどCPU使用率が高い処理をやらせようとすると、pre-forkなどしか実質選択肢がない
gunicorn
- flaskなどをgunicornというものでラップアップするとPre-forkになっていて機械学習や重い処理t相性がよく便利
- APIサーバを作るときの一定のベストプラクティスになっている
- APIサーバとしては単独で提供することがあるが、普通にWebサーバとしてラップするのにも使える
バッチでオンメモリの内容を更新する
- 1日3回、togetterの人気を知るためにDBを更新する
- このときオンメモリでごちゃごちゃやっているので(そうでないと早いパフォーマンスがでない)、 gunicornを非同期に1日に3回再起動する
実際にできたもの

できることと、ユースケースのシェア
- 日付、月、週の粒度で過去の投稿日時順に一年以上、遡れる
- タグを選択するとそのキーワードで人気だった指定された粒度でのTOP10のコンテンツを返す
- (たとえばTwitterアカウントでログインしたら直近のツイートから、相性の良い記事を探すなども原理的にはできる)
実際に触れるサイト(運用が面倒なので止めるかも)
ソースコード
起動法
依存が複雑でdebugがしにくいのでwrapperでまとめまくりました
$ sudo pip3 install -r requirements.txt
$ sudo python3 Wrapper.py
もしくはDockerで固めたものもある(一度停止すると辞書ファイルが消えるのでおすすめしない)
$ docker-compose build && docker-compose up
PoCの判断基準
以上のモックアップをもってして、エンドユーザの定性的、定量的な評価を組み合わて、使い物になりそうか、ならなそうかを判断する。
(余談ではあるが、このモックアップは使っていて楽しいので割と良かったのでは)