接触確認アプリへのコントリビュートに挑戦する（まだできていない）

先日ストアに公開された接触確認アプリが何かと話題ですが、 __OSS なんだし Twitter でわいわい口だけ出すくらいなら自分でコード見て直してプルリクの1つでも送った方が建設的でしょう__ 、ということで少し挑戦してみました。

結論から言うといろいろあってまだ何も貢献できてはいないのですが、ひとまず挑戦しようとしてみた状況を備忘録的にまとめてみます。

# リポジトリ

[Covid-19Radar/Covid19Radar | GitHub](https://github.com/Covid-19Radar/Covid19Radar)

こちらです。

開発に参加したい人のために [CONTRIBUTING.md](https://github.com/Covid-19Radar/Covid19Radar/blob/master/CONTRIBUTING.md) もここに置いてあり、中を読むと簡潔にですがコミットのルール等が日英で書かれています。

特に何か特別な手順を踏む必要はなく、個々人の判断で Issue を見たり作ったりしてからブランチ作成、修正、プルリクの一般的な流れで手を出せば良さそうです。

# 環境構築

[issue 495](https://github.com/Covid-19Radar/Covid19Radar/issues/495#issuecomment-646970311) をみると環境構築手順はまだ手が回っていないらしく、とくに文書化された何かはありません。なので、一般的な手順で動くことを信じて環境構築してみます。

このアプリは Xamarin Forms で作られています。私は Xamarin Forms は何年か前に一度触ってみた程度で、その時の環境も PC を買い換えてなくなってしまっていたため、 Visual Studio for Mac のインストールからスタートです。

## Visual Studio for Mac のインストール

普通に公式サイトからダウンロード＆インストールします。

- Windows版
    - https://visualstudio.microsoft.com/ja/vs/
- Mac版
    - https://visualstudio.microsoft.com/ja/vs/mac/

インストールする際に、インストール対象として .NET や Xamarin などが表示されますので、 Xamarin 関係のものにすべてチェックを入れます。（このあたりは詳しくないのでとりあえず関連してそうなものは全て入れるようにしました）

## Android SDK と Xcode のインストール

Android 用にビルドするためには Android SDK、 iOS 用にビルドするためには Xcode が必要です。私は Flutter アプリ開発でどちらも入っていたためここはスキップしましたが、そうでない方は要インストールです。

## ソリューションを開く

Android SDK、Xcode がインストールできたら、あとはプロジェクトを fork, clone して Visual Studio で開くだけです。 `Covid19Radar.sln` のファイルを選択してソリューションを開きます。

## Nuget パッケージの更新

ソリューションを開いたら実行ボタンで実行、とは（自分の場合）いかず、まずは依存関係を解決する必要がありました。たしか Xamarin Forms のライブラリは `Nuget` で管理だったな、と思い出しつつ、それらしいメニューを探したところ "Nuget パッケージの更新" を見つけたので、これを実行したら OK でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134943/9aad8f5c-658c-2044-1d9e-9ede29ee0a7e.png)

このあたりの一般的な構築手順は詳しい方に補足していただけると嬉しいです。

## 実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134943/f4b83ac6-0700-20e2-03f6-d55e31fb4421.png)

Xamarin Forms ですので、 Android で実行するか iOS で実行するかを選択し、（おそらく） "Debug | iPhoneSimulator" を選択し、実行する端末を選択して実行ボタンをポチッと押します。

iOS 実機での実行は署名ファイルの関係で「実行ボタンぽちっと押せば動く」とはいかなそうです。一方で Android エミュレーター、 iOS シミュレーターでの実行は特に問題なくいけました。

iOS の方は、署名の設定が中の人でコミットされているため、ソリューションの `Covid19Radar.iOS` で表示されるダイアログで __署名IDを「開発者(自動)」に、プロビジョニング プロファイルを「自動」に__ 設定する必要がありそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134943/91bc1250-20ee-d552-7f62-e36175586810.png)


## 問題

現状、アプリの動作に必要な通信の接続先や API_SECRET 等は `settings.json` ファイルにまとまっているようですが、（当然といえば当然ですが）GitHub にはダミーの文字列が設定されているだけです。そのため、実行すると何かしらの通信が発生するタイミングでアプリがクラッシュします。

このあたりは [issue 539](https://github.com/Covid-19Radar/Covid19Radar/issues/539) で検討されているようですので、対応を待つ（もしくは誰かが対応する）必要があります。私は手が出せないのでソースコードを読みながら様子見です。

（2020.6.22 追記）
Mock を使わない場合、環境構築として Functions や CosmosDB をローカルで立ち上げる必要があります。ということでやってみました。

[connection error on submitting to accept the Terms of Use #543 | Covid-19Radar/Covid19Radar](https://github.com/Covid-19Radar/Covid19Radar/issues/543)

このうち Functions は Visual Studio で `Covid19Radar.Functions.sln` を開くだけでソリューションが立ち上がり、あとは実行するだけのようなのですが、 CosmosDB の方はローカルにエミュレーターを立ち上げる必要があり、さらにエミュレーターは __Windows のみ__ 対応されています。Mac の場合はまず VM で Windows を立ち上げ、その上で CosmosDB のエミュレーターを立ち上げる、とのことです。

[ローカルでの開発とテストに Azure Cosmos Emulator を使用する | Azure](https://docs.microsoft.com/ja-jp/azure/cosmos-db/local-emulator)

うまくいったらまた追記します。
（/追記）

（2020.6.22 追記その2）
[PR #553](https://github.com/Covid-19Radar/Covid19Radar/pull/553) がマージされ、デバッグ起動時は通信部分は Mock になりました。

これにより、「とりあえず触ってみたい」人は `git clone` してソリューションを開くだけですぐに実行できるようになりました！実行時は Debug_Mock を選択してください。
（/追記その2）
# 感想

Twitter を見ていると「Xamarin だから手を出せない」というツイートが散見されますが、アプリ開発の経験がある開発者なら割と雰囲気でソースコードを読んで軽微な不具合修正程度なら手を出せるんじゃないか、という感触です（自分はまだなにもできていませんが）。 

[Issues](https://github.com/Covid-19Radar/Covid19Radar/issues) を見てみると、接触確認ロジックに使用する userUuid や secret の扱い方といった込み入ったものからレイアウトや文言の修正などの手を出しやすいものまで様々で、単純に人手が足りなくて修正できていない問題も多いんだろうな、という印象を受けましたので、「Xamarin だから」で issue も見ずに口だけ出すのはもったいないと思っています。

とは言え中の人の話を聞いたワケではないため、もしかしたら「雰囲気だけでいろいろプルリク送られるとレビューが大変になって本来の開発が圧迫される」可能性もあり得ますので、このあたりのスタンスは引き続きチェックしていこうと思っています。

とにかく、開発者なら口だけじゃなくてプルリクも出してみようと思ってこの記事を書いてみました。以上です。