長距離ドライブをサポートするアプリを作成しました

## はじめに
こんにちは！
[ジョニー](https://x.com/johnny1_ryo) と申します。
未経験からエンジニア転職を目指して、日々学習をしています。

この度、[kodora-co-driver](https://www.kodora-co-driver.com/)  を開発しました。


## サービス名 : kodora-co-driver
<a href="https://gyazo.com/a91e7875b7f0dd239688477f8a063735"><img src="https://i.gyazo.com/a91e7875b7f0dd239688477f8a063735.jpg" alt="Image from Gyazo" width="475"/></a>

▼ サービスURL

https://www.kodora-co-driver.com/

▼ Githubリポジトリ

https://github.com/johnny23ryo/kodora-Co-Driver-

## アプリ名の由来

アプリ名「kodora-co-driver」は、自動車レースのラリー競技にインスピレーションを受けています。自動車競技において、ラリー競技では、助手席に座る「コ・ドライバー」がドライバーをサポートし、ナビゲーションや戦略面で非常に重要な役割を果たしています。このように、ドライバーをサポートする存在として、このアプリがユーザーにとって頼れるコ・ドライバーのような役割を果たしてほしいという願いを込めて「kodora-co-driver（コドラ）」という名前を付けました。

## 開発背景

私は長距離ドライブが趣味で、暇さえあれば毎回500～600kmの距離を半日かけてドライブを楽しんでいました。この経験から「これらの機能により、ドライブがさらに便利で楽しいものになる」と感じた4つの主要機能を実装しました。具体的には、おすすめスポット検索、ルート検索、イベント一覧、道の駅スタンプラリーです。これらの機能により、ユーザーは最適なドライブルートを見つけたり、興味のあるスポットやイベント情報を簡単に取得でき、道の駅を訪れる楽しみも増します。

## こだわった点
### Google認証

新規登録のハードルを下げるためにGoogle認証を導入しました。これにより、ユーザーはメールアドレスやパスワードを手入力する手間を省き、初めてのユーザーも気軽にアプリを利用し始めることができます。また、セキュリティ面でもGoogleの信頼性が加わるため、安心してコドラを利用していただけます。

### Google Maps APIとOpenAI APIを組み合わせ作成したおすすめのスポット一覧機能

Google Maps APIやOpenAI APIを活用し、リアルタイムで正確なルート情報やスポット情報を提供します。これにより、ユーザーは常に最新の情報をもとに、最適なドライブプランを立てることができ、目的地までの道のりや途中の寄り道もスムーズに楽しめます。

### 道の駅スタンプラリー機能

実際に道の駅を訪れることで、スタンプをランダムに獲得でき、単なる情報提供にとどまらず、ドライブの冒険心を掻き立てるゲーム性を盛り込みました。これにより、ドライバーは訪れる喜びを感じながら、他のユーザーとは異なるスタンプをコレクションし、道の駅を巡る楽しみが一層深まります。また、一度獲得したスタンプはリロードしても保持されるため、スタンプ集めを継続的に楽しむことができます
## 機能一覧

|トップ画面| ログイン画面 |
|:-:|:-:|
 [![Image from Gyazo](https://i.gyazo.com/cef96859385f8d50e76e6db1dfc544d0.gif)](https://gyazo.com/cef96859385f8d50e76e6db1dfc544d0) |[![Image from Gyazo](https://i.gyazo.com/b7d7cab3795d8bffc6e41399547205d1.png)](https://gyazo.com/b7d7cab3795d8bffc6e41399547205d1)
|4つのメイン機能が一目でわかるようにし、すぐに機能が使えるような動線にしました。|Google認証を用意しました。できるだけログインしなくとも利用できるようにしており、道の駅スタンプラリー機能、新規投稿機能以外は全てログインせずに使用できます。|

|おすすめのスポット一覧| おすすめのレストラン、休憩所、食事処検索 |
|:-:|:-:|
[![Image from Gyazo](https://i.gyazo.com/90079da977e4266337d4972d8549c242.gif)](https://gyazo.com/90079da977e4266337d4972d8549c242) | [![Image from Gyazo](https://i.gyazo.com/e12cdd86b504e6f7e46bebd83710efdb.gif)](https://gyazo.com/e12cdd86b504e6f7e46bebd83710efdb)
|おすすめのスポット一覧ボタンをhoverすると3つの機能が表示されるようにしました。|検索したい住所を入力して検索ボタンをクリックするとおすすめのスポットとスポットの魅力的な説明文を提示します。|

|ルート検索| 道の駅スタンプラリー機能|
|:-:|:-:|
[![Image from Gyazo](https://i.gyazo.com/e23cdd2f8f83c9edeaae1313da90f908.gif)](https://gyazo.com/e23cdd2f8f83c9edeaae1313da90f908) | [![Image from Gyazo](https://i.gyazo.com/09bfcdbb31a3278f1d6732d53d11a2b5.gif)](https://gyazo.com/09bfcdbb31a3278f1d6732d53d11a2b5)
|目的地を入力すると、現在地から目的地までの所要時間や経路を表示します。|ユーザーが道の駅を訪れたことをアプリに伝えていただくとスタンプを付与します。|

|イベント一覧|イベントピックアップ機能 |
|:-:|:-:|
[![Image from Gyazo](https://i.gyazo.com/012ea88efca9d2caf78f56151bd0b2da.gif)](https://gyazo.com/012ea88efca9d2caf78f56151bd0b2da)| [![Image from Gyazo](https://i.gyazo.com/94f4131c8810ff5cf3cc6713db6f130d.jpg)](https://gyazo.com/94f4131c8810ff5cf3cc6713db6f130d)
|投稿されたイベントがGoogleマップ上にピンで表示されており、一目で自分が行きたいイベントが分かるようになっています。|ランダムで投稿を3つ表示させています。|

|イベント作成|イベント詳細|
|:-:|:-:|
[![Image from Gyazo](https://i.gyazo.com/1bc514eb96aae95f7bbe94beb3b2f56b.png)](https://gyazo.com/1bc514eb96aae95f7bbe94beb3b2f56b)| [![Image from Gyazo](https://i.gyazo.com/dc882377b6d5165c1ae8b3422ff795fb.jpg)](https://gyazo.com/dc882377b6d5165c1ae8b3422ff795fb)
|ローカルやマイナーなイベントの情報を収集するためにユーザー投稿形式にしています。|イベントの開催期間などの詳細情報を掲示しています。|



## 主な使用技術

|カテゴリ|技術|
|:-------------|:------------|
|フロントエンド|JavaScript / Tailwind CSS |
|バックエンド|Ruby 3.2.2 / Rails 7.0.8|
|データベース|PostgreSQL|
|環境構築|Docker|
|インフラ|Render / Amazon S3 |
|Web API| Open AI API(GPT-4o) / Google Maps JavaScript API / Google Places API / Google Geolocation API / Google Sign-In |
	
### 技術選定理由
#### バックエンド：Ruby on Rails
できるだけ早くサービスを提供することを目指しており、バックエンドにはスクールで学んだRuby on Railsを採用しました。

#### フロントエンド：Tailwind CSS,JavaScript
BootstrapやSemantic UIと比較して、Tailwind CSSは、必要なスタイルのみを生成し、最終的なCSSファイルが軽量であることや、デフォルトのスタイルに依存せず、柔軟にカスタマイズできるため採用しました。

また、短期間での開発を目指していたためReactなどのJavaScriptライブラリを使用せずに開発しました。Google Maps APIを使用して地図上にユーザーの現在地や目的地を表示し、ユーザーが訪れた道の駅に基づいて自動的にスタンプを取得する機能や、ユーザーが現在地から目的地までのルートを検索し、リアルタイムで確認できる機能もJavaScriptで提供しています。

#### 開発環境：Docker
開発環境の一貫性を保つために採用しました。

#### インフラ：Render
UI/UXが非常に優れており、デプロイや管理が容易で、今後の運用を考えると、使いやすさとコストのバランスが取れている点が魅力的でしたのでRenderを採用しました。

	
## 画面遷移図
[画面遷移図](https://www.figma.com/design/t6d8lv9hHXj49bZN5oKT8D/runteq%E5%8D%92%E6%A5%AD%E5%88%B6%E4%BD%9C?node-id=0-1&t=0ZLOjcjA4HG9lWPC-0)

## ER図
[![Image from Gyazo](https://i.gyazo.com/6c2cc87673b073e39b4edb190a620a99.png)](https://gyazo.com/6c2cc87673b073e39b4edb190a620a99)


## 今後の開発について

### テスト

開発初期はテストを実装していませんでしたが、今後、テストを追加し、機能の信頼性や安定性を向上させる予定です。

### リファクタリング

コードの可読性と保守性を高めるため、リファクタリングを行っていきたいです。これにより、今後の機能追加や変更がしやすくなり、開発効率の向上を目指します。






## 参考にしたZenn,Qiita記事
### Google認証機能

https://zenn.dev/yoiyoicho/articles/c44a80e4bb4515#google-api%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A1%8C%E3%81%86

https://qiita.com/okada84108983/items/0c84c01b88072c004873

https://qiita.com/rei-dev99/items/42358fe71680c804d19c

### ページネーションを設定した際、tailwindcssを導入しているのでcssあたらなくて困ったとき

https://qiita.com/yocchan_qiita/items/664ff0fbb6e92a2727ee

### Tailwind CSS　を導入後 cssがあたらない時の対処法

https://qiita.com/GandT/items/4b3701a6ca51ff84370c

	
### Maps JavaScript APIを使って投稿を地図上にピンで表示

https://qiita.com/lemonade_37/items/51ca0f18fd9da842bb00

### Googleマップのピンをクリックすると詳細を出す

https://zenn.dev/mimiki/articles/d61495dd657e2e

### Renderデプロイ

https://qiita.com/Naaa0/items/8e2ad76e40e3a638ddfc

### AWS S3　導入

https://qiita.com/joinus_ibuki/items/774a79e9c828ecdc57b3

https://qiita.com/joinus_ibuki/items/050816c83234837167bc

https://qiita.com/iijima-naoya-45b/items/1b966b3152d4b0d73e49

https://qiita.com/daichi3102/items/d316e66c50c660410735


## おわりに
無事にリリースできて、達成感と安堵の思いでいっぱいです。
スクールの同期・先輩・後輩、講師の方々、家族、友人、関わってくれた全ての方のおかげです。本当にありがとうございます。
これから個人開発される方には、この記事が少しでも参考になると嬉しいです！
長くなりましたが、お読みいただきありがとうございました🙇‍♀️

X（旧Twitter）もやってますので、よければフォローしてください♩

https://x.com/johnny1_ryo