【個人開発】300円以内でおやつを選ぶアプリを作りました【えんそくのおやつは300えんまで！】

# はじめに
はじめまして。
山田貴俊と申します。
先日「えんそくのおやつは300えんまで！」というアプリケーションをリリースしました。
内容は単純、300円以内でおやつを選ぶアプリです。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「えんそくのおやつは300円まで！」というWebサービス開発しました！<br><br>300円以内でおやつを選んで、結果をアプリ内もしくはTwitterで共有するアプリです。気軽に遊べるのでよろしくお願いします。<a href="https://t.co/19mcGxs2ma">https://t.co/19mcGxs2ma</a></p>&mdash; Takatoshi Yamada (@moyazine) <a href="https://twitter.com/moyazine/status/1584525055353970688?ref_src=twsrc%5Etfw">October 24, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
本記事はその解説と振り返りになります。

# サービス概要
300円以内でおやつを選択し、結果をTwitterや本サービス内ページ「みんなのおやつ」で共有するというシンプルな内容になっています。
![トップ画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2194216/6d6e544e-ba67-ebf7-c137-1739eca9c740.png)

## 本アプリケーションのURLとGitHub
https://oyatsu300.com/

https://github.com/TakatoshiYamada/oyatsu300

## なぜこのサービスを作ったか
友達との飲み会のつまみに駄菓子を持っていったら思ったより盛り上がったので「そのネタを元にアプリ作るの面白そうじゃない？」となって軽い気持ちで作り始めたのがきっかけです。
~~軽い気持ちで始めた割にはすごく大変だった。~~

## 遊び方
- 「あたらしくえらぶ」から好きなお菓子をクリック
- 決まったら「おかいけい」ボタンを押下して決定
- 結果を表示。任意でtwitter共有ができます。
- ログインするとアプリ内機能「みんなのおやつ」で他の人に自分が選んだおやつをみせびらかすことができます！
[![Image from Gyazo](https://i.gyazo.com/631389cee5bd0336c02239f422f5359d.gif)](https://gyazo.com/631389cee5bd0336c02239f422f5359d)

# 使用技術
## 画面遷移図(初期案)
気がついたらすごく遠くまで来ていた初期案(しみじみ)。
細かい動作に関しては違うけれども、挙動に関しては初めのプランからは外れていないです。
拡張機能に関してはまだ未実装。
~~バナナはおやつに入りません。~~
![画面遷移図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2194216/23720cd5-ee79-8456-44b1-3869bcf1bf41.png)

## ER図
特に難しいことはしていないER図。
basketsは中間テーブルとして動作。AuthenticationsはTwitterログイン用のテーブルになります。
今後はレビュー機能などガンガンテーブルを追加したい(左下の空白は開発が間に合わなかった名残)。
![ER図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2194216/c4d9b45c-7a48-4963-3efe-7350f0242f81.png)

## インフラ構成図
バックエンドはAWSを使いました。
MVPはHerokuでしたが有料化の話もあり、AWSに乗り換えました。
インフラ周りは本当に苦戦しました。特にセキュリティグループあたり。
もっとスマートなやり方があったはず。
![インフラ構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2194216/16b360dd-84cb-3be2-592d-bf398dc283dd.png)

ちなみにフロントエンドはBootstrapです。

## 環境
- ruby: v3.1.2
- rails: v6.1.6.1
- node.js: v18.7.0
- postgres: v14.3
- redis: v6.2.7

rubyは3系列の安定版。Railsは安定版の状況とドキュメントの豊富さから6系を選択。
他は最新版を利用しました。

## 利用したGemのうち補足したいもの

### メイン機能
- sorcery
ログイン機能に利用。
Twitterログインにも利用。

- config
定数管理に利用。

- nogogiri
スクレイピングに利用。
おやつデータは主にスクレイピングを用いて取得しています。

- kaminari
ページ遷移に利用。
おやつ選択画面は無限スクロールになってます。

- ransack
検索機能に利用。

### 管理画面

- carrierwave
- mini_magick
管理画面にて手動でおやつ画像を追加するために利用。

- gretel
管理画面のパンくずリストに利用。

### テストとエラー解析
- rubocop
- rubocop-rails
コードの静的チェックに利用。

- better_errors
railsのエラー画面整形に利用。

- binding_of_caller' 
ブラウザ上でirbを用いるために利用。

- factory_bot_rails
- capybara
- webdrivers
- mock_redis
RSpecを用いた自動テストにて利用。

- coverage
カバレージ計測に利用。。

### その他
- sd_notify
production環境にてsystemdを用いたプロセス管理に利用。

- sitemap_generator
SEO用にサイトマップを作成するの利用。

## 苦労した機能

- Redisを用いたセッション管理(ログイン不要で遊べる機能)
元々CookieStoreでセッションを利用していたが、セキュリティ面とハッシュでデータを扱いたいためにRedisに移行。
Cookieだと一旦Stringに変換されて扱われることを初めて知った。

- Twitterログイン/OGP
callback等々。
当然のことだけれども、Twitterに限らず外部のアプリケーション連携は仕様変更があるので最新の情報を取得するように。
もちろんタイポにも気をつけよう。

- HerokuからAWSへの移行
Heroku有料化の煽りを受けてAWSに移行したのだけど、インフラへの理解が圧倒的に足りない事を痛感した。
AWSも無料枠を超えたら料金が発生するのでそのままHerokuに課金して利用を続けてもよかったかも。
ただすごく勉強にはなった。

# UU/PV
10日でUU数は148人。
PV数は869でした。
~~この記事を公開することで少し増えたらいいなあ。~~
![アナリティクス___レポートのスナップショット_🔊.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2194216/cd0e150f-c40d-a0de-47e4-d87f58568140.png)
![アナリティクス___エンゲージメントの概要_🔊.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2194216/38485879-58ab-0c4d-6804-60d8d5a9099b.png)

# Notionのバグレポート
原因と対処がはっきりとわかったバグに関してはNotionにまとめておきました。
この何倍もバグに対応した気がするので今後はもっとこまめに纏めておきたい。

https://handy-lentil-478.notion.site/8041a45aaf8249b8afae060c7528e4be?v=81de34dff29042f39aafb33c0f3d1c2b

# 終わりに
  
今回のアプリは構想からリリースまでおよそ4ヶ月かかりました。
現在働いている倉庫の仕事、実家の米農家の仕事、アプリ開発の3つのタスクを回していたという理由はあるものの、やはり開発期間が長引いた印象を受けますね...。
今後の展望としては機能拡張をメインとしつつ、デプロイの自動化など開発面での強化も行いたいと思ってます。
拡張する機能に関しては下記の機能を追加する予定。
- おやつのレビュー機能
- 選んだおやつを本サイトから買いに行けるような機能(楽天APIを想定)
- おやつのバリエーション追加

以上、何か改善点やご意見等ございましたらコメント・SNSでご連絡をお願い致します。