30代SEの自由帳

最初のタイトルは頓挫した

COVID19Radarのソースを追ってみる-1日目

COCOA(接触確認アプリ)のベースとして使用されているOSS(オープンソースソフトウェア)である、COVID19Radarについて、処理を追って日本語のコメントを付けてみた。

ただ、C#の経験もFultter以外のAndroid開発の経験もなく、苦戦した挙句ざっくり理解で止めた1ので、参考程度で。

なので、同じようなことしている人がいれば即やめ。
ソースべた貼りには少し抵抗があるので、コメント付近だけ抜粋。

はじめに

TwitterとかでCOCOAは信用出来ない的なコメントを見かけた2ので、 プログラマじゃない人でも中で何やってるかがざっくり分かるようにってのがコンセプトです。

先に結論になりますが、OSSを使用している部分に関しては信用して問題ないです。 私では到底及ばないレベルの人たちが日々OSSに対してissues(問題提起)を挙げているので、変なことやっていれば即バレです。3

ただ、残念なことにCOCOA ≠ COVID19Radarですので、OSSを使用していない箇所に対しては不透明なので、 COCOAに対する信頼性という意味ではあまり意味をなさない行為になってしまっていますが、 もとになっているOSSは信用しても良いよってが伝われば。

調査対象

COVID19RadarはXamarinっていうAndroid,iOS両方のアプリを一発で作れる環境で作られてるみたい。

なので、理屈的にはAndroid/iOSで大枠の処理4に差分はないはずなので、Androidベースでスタートします。

接触確認API

そもそもの根幹にあるAPI(今回はGoogle/Appleが用意した接触を管理する仕組み)については、正直よくわかってないです。

動作イメージ見た感じでのざっくり理解だと、
ユーザに鍵を配って、鍵同士の接触Google/Appleのサーバで管理してる感じ?
で、鍵は定期的に配り直されて、接触通知用に最大14日分しか追えないような管理にしてる?
でここで追うのも、あくまでも端末を追うわけじゃなくて、鍵に対して追ってるだけだから、個人を追うことはしてないよ的な。

MainActivity

AndroidはMainActivity()から始まるってことみたいなので、MainActivity()からスタート

  • ファイルパス:Covid19Radar\Covid19Radar\Covid19Radar.Android\MainActivity.cs
  • 要約:Appって名前のアプリを起動
  • 遷移先:App
  • COCOAとの挙動差:なさそう
  • 詳細:
    • Resource=画面パーツとかのリソースファイル
    • SetTheme=テーマの設定
    • Xamarin=開発環境が用意している何か。Init=初期化
    • FFImageLoading=Xamarinが提供する画像表示用のライブラリ(=命令的なの)
    • UserDialogs=Xamarin用のダイアグとかを表示する用のライブラリ(=命令的なの)
    • NotificationCenter=通知するところ。create=作成

⇒なので、この処理で行っていることは基本的にアプリ起動の準備。

// ここでアプリを起動してるっぽい。
// Appって名前のアプリを起動する形になっているので、
// 次はAppの方に移動。(Covid19Radar\Covid19Radar\Covid19Radar\App.xaml.cs)
LoadApplication(new App(new AndroidInitializer()));

App

ここも起動のための準備をちょろっとして、プライバシーポリシーまでの同意状況に合わせて次の画面を表示

  • ファイルパス:Covid19Radar\Covid19Radar\Covid19Radar\App.xaml.cs
  • 要約:プライバシーポリシーまでの同意状況に合わせて次の画面を表示
  • 遷移先:HomePage,TutorialPage1
  • COCOAとの挙動差:なさそう
  • 詳細:
    • InitializeComponent()これも初期化処理。画面表示の準備的なもの
    • LogUnobservedTaskExceptions()は中身がない気がする。。よくわからない。
    • 分岐系は以下
    • NavigationService.NavigateAsync()はそれぞれのページ(xamlで定義)に飛ぶってことらしい
// プライバシーポリシーまでの同意状況に合わせて表示画面を切り替え
// 同意済み :ホーム画面(HomePage)
// 未同意   :各種同意画面(TutorialPage1)
if (userDataService.IsExistUserData)
{
    // ユーザデータ登録済みの場合
}
else
{
    // ユーザデータ未登録の場合(プライバシーポリシー同意前扱い)
}
// IsOptined=ユーザデータ登録有無。IsPolicyAccepted=プライバシーポリシーの同意有無
// IsOptinedはプライバシーポリシーの同意前に実施しているので、実質的にプライバシーポリシーの同意まで終わってるかのチェック
// さらにいうとプライバシーポリシーの同意は一番最後に同意を求められる項目なので、利用に際する同意が終わっているかのチェック
if (userData.IsOptined && userData.IsPolicyAccepted)
{
    // プライバシーポリシーまでの同意済み
}
else{
    // プライバシーポリシーまでの同意出来ていない
}

今日のまとめ

C#未経験だけど読む分には問題ないだろ~的に考えてたけど甘かった。。 自分の力不足でざっくり理解で止めちゃったから当初コンセプトの半分も満たせてない感じ。。
そもそもブログに起こす段階で、ソース貼るの踏みとどまったから、今のまとめかたでプログラマじゃない人に理解できるか?ってのも疑問。

ただ、折角やったので参考程度って感じでアウトプット。

まだ最初の画面にすら行ってないじゃんってところで終わってるけど、追う分にはもう少し追ってる。 ただ、ブログまとめが時間切れ。 まだ追えてないところも合わせて引き続き継続。

続きはこちら


  1. 開発環境でもインストールしてデバッグしながら、とかならもう少し理解できたんだと思うけど、開発環境入れるだけで力尽きそうだったので諦めた。。

  2. 正直、私もOSSがベースって知るまでは信用してなかった。

  3. そもそものOSSでの開発理由自体が、「透明性の担保」にあるので、そういう考えを持てる人がここをわざわざ汚すようなことをするわけもないです。

  4. 実際には環境依存処理も存在する気はするけど、そういうのは基本Xamarin側が吸収するはず。。。