【個人開発】海外旅行になかなか行けないので、コロナ禍の渡航難易度を可視化するサービスを作ってみた。

はじめに
---

![ogp_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044144/0cc08847-00c8-ea67-55f1-9f7a157bfffc.jpeg)

突然ですがみなさん、最後に海外旅行に行ったのはいつですか？
多くの方は1年以上海外旅行に行けていないのではないでしょうか？

申し遅れました、Yunoと申します。
【Twitterアカウント】
https://twitter.com/bosenohito

【今回作ったサービス】
https://www.tripable.jp/

少しだけ私自身の話をすると、2020年11月まではタイに住んでおり、英系金融コンサルティング会社でIFAをしておりました。しかし、コロナの影響で厳しい渡航規制が設けられたことでVISAの更新に問題が生じ、日本に帰国することを余儀なくされました。

私のように、海外で働いていた方の不本意な帰国や、これから海外で働こう、留学しようとしていた方が、渡航不可能になってしまった方は大勢いると思います。

海外旅行に限らず、海外留学や、海外赴任など、コロナの収束がみられない現状（2021年7月時点）では、ほぼ不可能なのが現実です。

そこで、渡航難易度や感染リスクを気軽に確認して、コロナが収束したら皆が行きたいところややりたいことを共有するサービスは作れないかと考えました。

**作りました。**
https://www.tripable.jp/
![スクリーンショット 2021-07-13 15.36.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044144/36fc20c8-c861-cea4-9cea-ea91f99a3d0e.png)

サービス概要
---
####1. 世界２００ヵ国以上から渡航情報を検索

直感的かつ気軽に地図から検索できるようにしました。
[![Image from Gyazo](https://i.gyazo.com/fcf86efe641fcb970675490704e68c22.gif)](https://gyazo.com/fcf86efe641fcb970675490704e68c22)

国名からも検索できます。
![スクリーンショット 2021-07-13 18.19.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044144/cf191580-5526-9cf1-3afc-7afee0cbefee.png)

#### 2.渡航難易度を6段階で表示
外務省が公開している危険度や感染危険度情報を元に、総合的な渡航難易度を算出し、6段階で表示しています。最初はパーセンテージで示そうかとも考えたのですが、確証のない数字を載せるのは無責任だなと思い、6段階のスターで表示することにしました。

![スクリーンショット 2021-07-13 16.35.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044144/adcce745-8f78-9018-cbb4-00ff4099addf.png)


#### 3.現地の最新日本大使館メールを確認可能
これは私自身が海外に住んでいて感じたのですが、現地の日本大使館が発信する情報はとても優秀で、情報の速度と信憑性がとても高いのです。なので、これらの情報を在住者以外の方も気軽に確認できたらいいな、と思って見れるようにしました。一応、最新の５件を取得して表示しています。
[![Image from Gyazo](https://i.gyazo.com/9f56afa87cad94f8cb525729e579cc55.gif)](https://gyazo.com/9f56afa87cad94f8cb525729e579cc55)


#### 4.いきたいところややりたいことをマイリストで管理
マイページでは、コロナ収束後に行きたい場所や、やりたいこと、過去の旅行のエピソードを、管理できます。
![スクリーンショット 2021-07-13 16.47.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044144/0698d88f-f795-144f-177e-0f9cf0c02482.png)


#### 5. 他の方達のいきたいところなどをタイムライン形式で確認
他の方達のいきたいところややりたいことなどをタイムライン形式で確認ができます。いいねやコメントもできるようにしました。
![スクリーンショット 2021-07-13 16.45.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044144/142df38e-abfd-4853-acfa-f25508000107.png)


使用技術
----
- Ruby 2.6.6
- Rails 6.0.3
- JavaScript

#### 主なGem
- sorcery
- nokogiri
- oga
- selenium-webdriver
- meta-tags
- rubocop
- bullet
- better_errors

#### テスト
- RSpec

#### フロントライブラリ
- jQuery
- jqvmap

#### ストレージサービス
- ActiveStorage
- Amazon S3

ER図
---
![ERD_now.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044144/8ebfec03-5f70-09cf-9acf-6e833ab5c424.png)


こだわったポイント
---
#### 説明不要ですぐ使える
これは個人的な意見なのですが、説明しないと使えないようなごちゃごちゃしたサービスが苦手です。多機能なサービスでもUIや導線設計で解決できると思っています。かといってデザインにこだわり説明が不十分なのもユーザーファーストではないので、そのあたりの塩梅は意識しました。
![スクリーンショット 2021-07-13 18.17.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044144/7588582d-caf5-2935-db25-fff0ea98944f.png)


#### UXで離脱させない
いくら多機能でデザインが優れていても、レスポンス速度が極端に遅かったり、やたらモーダルが使われていたり、導線が不自然だったりすると、一般ユーザーはその時点で**サービスを使わなくなる可能性が高い**と思い、開発段階で親しい方から定期的にフィードバックをもらい、独りよがりなUX設計になっていないかを意識しました。開発していると、段々と感覚が麻痺してきて、何が正解かわからなくなるので、周囲の人に確認してもらうのはお勧めです。

今回は

地味ですが、トップページの検索画面がフレームアウトするとヘッダーに固定されるようにしたり、
[![Image from Gyazo](https://i.gyazo.com/4c20ab3f0ea8c0b829a3aae69c818f8a.gif)](https://gyazo.com/4c20ab3f0ea8c0b829a3aae69c818f8a)

スマホ表示の時のヘッダーとフッターボタン
の表示もスマホで使いやすいようにスクロールやページに応じて動的に切り替わるようにしました。
[![Image from Gyazo](https://i.gyazo.com/8fd9afc7742f4e2e4aaeeb07f5f7ab71.gif)](https://gyazo.com/8fd9afc7742f4e2e4aaeeb07f5f7ab71)

#### 地図検索でGoogleMapを使わない
国を世界地図から検索する機能を実装するにあたり、調べると大体GooglMapを用いた実装方法が出てきます。
しかし、今回はできるだけシンプルなデザインかつ使いやすくしたいという思いと、自分の中でのある程度の完成イメージがあり、GoogleMapは選択肢から外しました。結果的に、jqvmapというjQueryのライブラリを用いました。機会があれば、使い方の記事も書こうと思います。

#### 国画像の自動取得と動的OGP出力
![スクリーンショット 2021-07-13 18.31.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1044144/45b970ee-d892-bd6b-7167-d663c29a9d2e.png)

今回は、200ヵ国以上の国情報にActiveStorageで国のイメージ画像を当てているのですが、一件一件最適な画像を探して添付していたら、途方もない時間がかかってしまうので、最適なフリー素材をインターネット上から取得しcountryオブジェクトと紐付ける自動スクリプトを作成しました。
またTwitterのOGPイメージも、200件以上の国の渡航情報ページを一件一件TwitterCardValidatorを通さないと画像が正しくクロールされず、これも果てしない時間がかるため、自動でTwitterにクロールさせるようなスクリプトを組みました。あと、シェアするときのOGPはすべての国の画像に対してタイトルロゴが合成されているのも小さなポイントです。

#### 外務省情報の取得タイミング
外務省は膨大な情報を公開しており、国によっては一回のリクエストで、150,000行以上のデータが返ってきます。
なので、「いつ」「どのように」リクエストを飛ばすか、を意識しました。
（前提として、本サービスは実用的なサービスにしたいという思いがあるので、常に最新の情報を表示させています。）

最新の情報を取得するために国情報を頻繁に取得することのデメリットは大きく２つあります。
一つ目が外務省側の**サーバーに負荷をかけてしまう**こと、二つ目が大量のリクエストを送ることで**悪意のある攻撃**と認識されてしまう可能性があることです。

またユーザーが国情報を取得するときに、欲しい情報をすべて取得し表示させると、レスポンススピードが低下することで、**UXが低下**します。

なので今回は、比較的重い情報（危険度や感染危険度）を取得する作業は、アクセス数が低下すると思われる深夜帯の3時〜4時に1日に一回取得しています。メール情報は国情報とは別れており、比較的軽めの情報が返ってきます。なのでユーザーがページにアクセスした時点で最新の情報を取得するようにしました。

今後実装したいこと
---
- 渡航情報の充実化
- 渡航情報が更新されたら通知される機能
- SNSログイン機能
- 都市検索機能
- より最適な国画像の添付
- Discord連携


終わりに
---
最後まで目を通していただきありがとうございました！
制作過程の苦労話やこれから個人開発をする人に向けたアドバイスなどもできたらなと思うので、また続き的な感じで記事書きたいと思います。

みなさんが早く気軽に海外に行けるようになる日が来るのを願っております！
ではでは！！

【Twitterアカウント】
https://twitter.com/bosenohito

【今回作成したサービス】
https://www.tripable.jp/