##はじめに
- 前回の投稿からかなり時間が経ってしまいました。これからはなるべく更新していきたいと思います。
- このところ案件でGCPを扱ったり本で勉強したりしたので、自分で簡単なシステムを作ってみました。(超適当でシンプルなものですが・・)
- 尚、ここに載せている内容は最低限の動作確認しか検証してしておりません。あらかじめご了承ください。
##システム概要
-
自分が歩いた位置情報を数秒おきにGCP上に登録して、後からマップに表示できるシステム。
-
取得開始~終了までを一つの単位として、履歴管理する。
-
歩いている途中の経路もマップ上に確認可能。
-
位置情報の削除や更新は範囲外とする。
-
使用する技術(★・・感覚的な5段階の難易度)
・Kotlin(★★★★★)
スマホアプリはKotlinで作成。
位置情報(緯度、経度、高度)を取得して数秒毎にGCPのサイトに送信します(POST)。
また、後からどんな経路で歩いたか確認できるように履歴をリスト化します。
対象のリストを選択すると、経路(線)がGoogleMap上に表示されます。
位置情報の登録、地図の表示の際はAppEngineにリクエストし表示します(Post/Get)。
地図はJavaScript版のGoogle Map APIを使います。
楽勝かと思ったら、バックグラウンド処理とかで悩みました。
・AppEngine(★)
スマホアプリからAppEngineに位置情報をPostします。地図表示の際はIDを渡して地図をGetします。
・Flask(★)
Python用の軽量Webフレームワークです。AppEngineにデプロイして使います。
Jinja2というテンプレートエンジンが使えるので、
コードと画面を簡単に分離できたりします。
Pub/Subに受け取った位置情報を送ります(publish)。
・Pub/Sub(★)
受け渡し役。確実にメッセージを処理するために必要。暗躍。
・Dataflow(★★)
オープンソースのApache BeamのGCP版です。
Pipelineを作って複雑な処理を定義できます・・が、今回はいたってシンプルです。
PubSubに入っているメッセージ(位置情報)を加工してBigQueryにINSERTするだけです。
DataFlowにはバッチモードとストリーミングモードがあります。
今回はストリーミングモードを使います。
言語はPythonやJavaが使えますが、今回はJavaを使います。バッチモードは機会があれば今後Pythonで作ってみたいと思います。
・BigQuery(★)
位置情報の保存に使います。入力はDataflowです。地図の表示の際はAppEngineからデータ取得されるので、対象ID(開始~終了を紐づけるキー)を時系列に並び替えてjson形式で返却します。
各機能のソースは下記に記載しました。
-
時間ができたら、一つずつ詳細を記載したいと思います。
-
[画面]
(https://github.com/ozbone/GpsTestKotlin/tree/GpsTest_Ver1/app/src/main/res/layout "画面関連")
説明追加
感想
-
少し単純すぎた感があるので、今後は以下のような機能も追加したいと思います
-
AppEngineのところや、APIを使っているところのセキュリティ対策をもっと詰めたい。
-
何かしゃべると、音声データを文章に変換してGCPに格納。その時刻と位置情報の時刻をマッチングして、「どこで何をつぶやいたか」を登録できるようにする。
-
同様に、写真を撮るとどこで撮ったかが地図上に表示できるようにする。
-
非構造化データを扱うことになるので、単純にBigQueryに登録するだけではなく、GCSに保存する処理も追加になりそうです。
-
機械学習バッチも作りたいです。機会学習やDeeplearningの本を読んで勉強します。
-
単純ではありましたが、色々と勉強になったので良かったと思います。
-
次はGreenplumなどDWHの紹介をしたいと思います。