プログラムを書く時に、どのような目的でそのアプリあるいはシステムが使われるのか?を定義しないとあらぬところに労力を掛け過ぎてしまいがちです。労力も時間も有限なのだから(時には無限の場合もあるけど)、注力するべきところに注力して仕上げをしたいところです。
規模の大きいITプロジェクトの場合、なかなか全容を把握するのは難しく、新人の頃は各工程(要件定義や設計工程)の全容が見ないままプロジェクトが終わることも度々あります。
今回の「接触確認アプリ」ですが、実はひと通りITプロジェクトの工程が見えてくる「好例」です。
- 要件定義&概要設計
- 必要な API
- クライアント(Android, iOSアプリ)
- サーバーサイド
という組み合わせでがあり、しかも各国のソースコードが github に公開されています。実装の違いも含めて、比較できることは珍しいことなので、ざっとでも情報を見ておくと今後に役立つでしょう。という訳で、いくつか見た範囲内での実例をリンクを記述しておきましょう。
接触確認アプリの目的
「接書確認アプリ」の目的は中国などを含めると様々な理由が含められますが、日本版のものは、5/9の有志気概者会議で明確に定義されています。
第1回 接触確認アプリに関する有識者検討会合 開催 | 政府CIOポータル
スマートフォンを活用して、
- 自らの行動変容を確認できる、
- 自分が感染者と分かったときに、プライバシー保護と本人同意を前提に、濃厚接触者に通知し、濃厚接触者自ら国の新型コロナウイルス感染者等把握・管理支援システム(仮称)に登録できるようにすることで、健康観察への円滑な移行等も期待できる。
これは「定義」なので、これ以上でもこれ以下でもありません。実際にはこの目的から提案依頼書(RFP)や要件定義書に落として「契約」を結ぶわけですが、今回は政府筋なので必要はないでしょう。発注先とは結ばれているとは思うのですが、ここでは問いません。
接触確認(暴露通知)の仕様
接触確認アプリの仕様は有識者会議と厚生労働省が作っています。
第1回 接触確認アプリに関する有識者検討会合 開催 | 政府CIOポータル
第2回 接触確認アプリに関する有識者検討会合 開催 | 政府CIOポータル
接触確認アプリに関する仕様書等の公表 | 政府CIOポータル
「接触確認アプリ及び関連システム仕様書」を見ると、詳細設計まで書いてあるのはさておき、官庁系のものとしては丁寧に書かれているので、これをもとに接触確認アプリとサーバーサイドを作ります。
このシーケンスと内部構造は、Google/Apple の仕様書にも書かれているものなので、そこは一致してますね。陽性患者の登録部分は日本独自なので、ここが作成時の肝となるところです。設計書や実装サイドとしては、この「仕様書」に従ってシステムを構築します。
いくつか興味深い「非機能要件」が定義されてます。
運用に関しては72時間以内(3日間)の復旧程度なので、即時復旧は意味しませんが、それなりに運用体制が必要です。あと、データは「クラウドを利用」しリージョンが「日本国内あること」の記述があります。この辺りも踏まえて受注と運用を検討します。
接触確認アプリの仕様
接触確認アプリは当初は GPS を利用した行動追跡が必須になっていたのですが、Google と Apple が共同で仕様を合わせた Exposure Notification(暴露通知)を使うことで、Bluetooth/BLE を利用したものに置き得られています。
アップルとグーグルが新型コロナ暴露通知アプリのサンプルコードやUI、詳細ポリシーを公開 | TechCrunch Japan
仕様の詳細は、Google/Apple の各サイトを見て貰うことにして、いくつか限定条件があります。
- 暴露通知アプリは1国1アプリとする
- 暴露通知とGPSを共有してはいけない
- 暴露通知を他のアプリにバンドルしてはいけない
1国1アプリの理由は提供元が各国の保険省となるためです。複数出したり、保険省(日本では厚生労働省)以外が出すと審査で落ちるでしょう。
暴露通知とGPSとを共有しないのは、もともとGPSを使わないためなので、それが理由です。逆に言えば、組み合わせて詳細な行動追跡アプリを作ることも可能(昔の彼ログのような)なのですが、これに関しては駄目ですね。
暴露通知は、主に単機能で扱います。おそらくできるだけ許可を少なくする目的と、変な形で企業がバンドルできないようにするためでしょう。実質、厚生労働省以外は出せないので、ここは厚生労働省の要件定義次第になります。1国1アプリとのことなので、自治体が独自に使うことできません。大阪で予定してクーポン付きとかも駄目ですね。
Exposure Notifications: Helping fight COVID-19 – Google
ExposureNotification | Apple Developer Documentation
Googleのほうには、Android アプリの(Kotlin)とサーバーサイド(Java)の例があります。Apple のほうは API リファレンスだけなのですが、各国それなりに Swift で作ったコードがあるので参考にしやすいでしょう。
google/exposure-notifications-android: Exposure Notifications Android Reference Design
試してみるならば、Android のコードを使うのが便利です。Android Studio を使うと簡単にビルドができます。
サーバーサイドは試してはいませんが docker で動くようです。多分、ローカル環境で Android アプリとサーバーの動作環境を作れると思います。
ドイツの場合
ドイツの接触確認アプリが GitHub で公開されています。
いくつかのプロジェクトがありますが、Android, iOS, Server を見ておけばよいでしょう。
- corona-warn-app/cwa-app-android: Native Android app using the Apple/Google exposure notification API.
- corona-warn-app/cwa-app-ios: Native iOS app using the exposure notification framework from Apple.
- corona-warn-app/cwa-server: Backend implementation for the Apple/Google exposure notification API.
ドイツの corona-warn-app はドキュメントが綺麗に整備されていて、こんな風にシーケンス図やユースケースが残されています。
cwa-documentation/solution_architecture.md at master · corona-warn-app/cwa-documentation
この手のものが残されていると、ソースコードを修正するときに何が目的なのかが分かりやすいですね。
ちなみに、サーバーサイドは Java + PostgreSQL なので、日本の要件定義に合致しません。
フランスの場合
フランス版は GitLib で公開されています。
- StopCovid sources / StopCovid android · GitLab
- StopCovid sources / StopCovid iOS · GitLab
- StopCovid sources / Submission code server · GitLab
ちょっと、興味深いのは「ROBERT」の文字が入っているところです。
これ、ロベルト・コッホの「ROBERT」なんですね。
ロベルト・コッホ研究所 – Wikipedia
RKI – Startseite
シンガポールの場合
シンガポールですが、コードは公開されてません(多分)。
シンガポール版は、実はハードウェアで実装されていて、不必要になったら捨てることができます。
なぜ新型コロナの追跡はアプリではなくハードウェアで行うべきなのか? – GIGAZINE
子供や高齢者にも利用してもらうことを考えると、こんな形でハードを配布するのがいいんですけどね。今回は、要件定義的に「スマホアプリ」となっているので割愛します。
日本の場合(Covid19Radar)
日本版のベースは Github で公開されています。
基本は Xamrin.Forms(C#) を利用していて、サーバーでは Azure Functions+CosomsDB になります。
settings.json でアップロード先のURL(API_URL_BASE)やAPI_SECRETが書き替えになっているので、これをローカル環境で動かすようにすれば、ローカルでの実験が可能です。
{
"appVersion": "APP_VERSION",
"apiSecret": "API_SECRET",
"apiUrlBase": "https://API_URL_BASE/api",
"supportedRegions": "440",
"blobStorageContainerName": "c19r",
"androidSafetyNetApiKey": "ANDROID_SAFETYNETKEY",
"cdnUrlBase": "https://CDN_URL_BASE/",
"licenseUrl": "https://covid19radarjpnprod.z11.web.core.windows.net/license.html",
"appStoreUrl": "https://itunes.apple.com/jp/app/id1516764458?mt=8",
"googlePlayUrl": "https://play.google.com/store/apps/details?id=jp.go.mhlw.covid19radar",
"supportEmail": "SUPPORT_EMAIL"
}
サーバーサイドの Azure Functions と CosmosDB はローカル版もあるので、ローカル環境を構築して運用試験をすることも可能です。
実際には陽性者番号との突き合わせがサーバーサイドで発生するので、そこは自前で補ってやらないといけないのですが、複数の Android 機を使って一律通知のテスト位はできるかなと思います。
あと電力消費の問題も、複数台の Android に入れて1週間位実験すれば実情がわかるんじゃないでしょうか。
日本の場合(まもりあいJapan)
1国1アプリということで、開発は止まってしまったのですが、まもりあいJapan版も GitHub で公開されています。
- mamori-i-japan/mamori-i-japan-android: Android App for Japanese Exposure Notification App to fight against COVID-19 a.k.a. "まもりあいJAPAN".
- mamori-i-japan/mamori-i-japan-ios: iOS App for Japanese Exposure Notification App to fight against COVID-19 a.k.a. "まもりあいJAPAN".
- mamori-i-japan/mamori-i-japan-api: REST API Server for Japanese Exposure Notification App to fight against COVID-19 a.k.a. "まもりあいJAPAN".
もともと Google/Appleの暴露通知ができる前からスタートしているのでGPS利用だった訳ですが、Exposure Notifications版に直して、通知先を Azure Functions に直せばローカルでは動かせるようになるかなと思っています。ちょっと試してみたいところですね。
サーバーサイドは nodejs + Firebase が使われています。
おまけ
接触確認アプリは BLE の近接距離を測っている(実際は電波強度)だけなので、もともと BLE を使うと実装できる話なのです。
だから、本当はアップロードはフリーWiFiなどを利用すれば、ハードウェアでもいいはずなんですよね。とりあえず、皆様がBTを常時有効にし始めるので、データ調査が捗ってしまうという面もあったりなかったり。
すれちがいフレームワークのためのBLEを用いた近接検知機構の実装と評価
BLEはその名の通り低電力で動くのでボタン電池で1年間とか動いたりします。それを利用した近接検知はBLEが出た当初から研究されているので、色々調べると面白いですよ。