【個人開発】全ての食べ物を0kcalにするカロリー管理アプリ「Zerorie」をリリースしました

## はじめに
こんにちは。

個人開発の醍醐味とは「技術の無駄遣い」だと私は思います。

そんな私も個人開発で~~クソ~~アプリを作成しましたので、以下に色々記録しておこうと思います。


## サービス概要
今回私は、 **「ゼロカロリー理論」** を使って、 **全ての食べ物を0kcalにしてくれる** カロリー管理アプリ **「Zerorie」** （“ゼロリー”）を作りました。
![iOS の画像 (9).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576318/e3070a41-39e8-57f2-df83-691e7a07e7b3.jpeg)

**「ゼロカロリー理論」** とは、サンドウィッチマンの伊達さんが考案したネタで、「寿司は握ることでカロリーが潰されるから0kcal」みたいな、 **食べ物のカロリーを0kcalにしてくれるトンデモ理論** のことです。

つまりこのアプリを使えば、食事した食べ物をすべてゼロカロリーにしてくれるため、 **「カロリーを気にして食事を我慢する」「高カロリーの食べ物を食べたことで罪悪感を覚える」** といったカロリーに関わる悩みを一切気にすること無く、食事を楽しむことができるという訳です。

- **アプリのURL：** （現在、当サービスは公開しておりません。）

- **Githubのリポジトリ：**　https://github.com/ryota1116/zero_calorie

## アプリの使い方

トップページです。
~~まるでクソアプリとは思えないような~~ 綺麗なデザインに仕上がっていますね。
![スクリーンショット 2020-10-13 22.02.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576318/be9c14af-6164-b2b5-1778-f0625e06cd0f.png)

このアプリは食事した食べ物を検索するところから始まります。
食事した食べ物を、食べ物の「名前」や「画像」で検索することができます。
![スクリーンショット 2020-10-16 15.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576318/50ba804a-783f-7710-91b7-c124280b309a.png)

検索結果として「食べ物のデータ」「食べ物が0kcalである理由」が表示されます。
![スクリーンショット 2020-10-16 15.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576318/b5c909b3-f47a-48e8-342b-fcdec353aceb.png)

検索結果から食べ物を選択すると、「食事記録登録ページ」が表示されます。
画像検索を行った場合は、検索に使用した画像がプレビューで表示され、画像も一緒に登録できます。
![スクリーンショット 2020-10-16 15.30.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576318/319ab92b-c2d6-c2d7-7684-1c62152b520a.png)

食べ物の検索時に、該当する検索結果を得られなかった場合は、 **「ちょっと何言ってるか分かりません」** と怒られます。
その場合は、「検索条件を変更する」か、「新しく食べ物の登録」をしてみましょう。
![スクリーンショット 2020-10-16 15.54.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576318/b7797bf8-d523-b033-5575-0d53ced0311e.png)

食べ物の登録ページでは、画像検索で使用した画像も表示されます。
![スクリーンショット 2020-10-16 15.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576318/b6c9b836-a4bc-8b04-9f9d-032e6e810369.png)

もし、食べ物の登録ページで、カロリーを0以外で入力するとバリデーションエラーが発生し、 **「この食べ物のカロリーは0kcalです。0と入力してください。」** と怒られます。ちゃんと0と入力しましょう。
![スクリーンショット 2020-10-16 16.03.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576318/802a298a-5bbc-b109-4a26-b1d0a3fcdbca.png)

ざっとメイン機能はこんなところです。

## 個人的に好きなカロリー理論トップ3

僕の好きなカロリー理論トップ３を勝手ながら発表します。
他にもいっぱいカロリー理論があるので、正直トップ３を決めるのは心苦しい決断でした。

#### 1位： 「なんくるないさ」＝「カロリーゼロさ」（沖縄料理のカロリー理論）
沖縄に行くと街中で「なんくるないさ」の文字をよく見かけますが、そういう意味だったんですね。ますます沖縄のことが好きになりました。

#### 2位： 野菜がカロリーを無効化してくれる。常連が野菜増し増しを注文する訳はコレである。（二郎のカロリー理論）
二郎も0kcalだったとは思わぬ発見ですね。これで安心して二郎ダイエットの日々を送れそうです。

#### 3位： 和菓子はわびさびを体現した食べ物。わびさびの心にカロリーの話を持ち出すのは言語道断である。（和菓子のカロリー理論）
シンプルに意味がわからない。

## なぜ作った
お笑いと食が好きだったからです。
「食」とか「笑える」に関わる面白いアプリを開発できないかと色々考えてたら、ふと思い付きました。

## Zerorieを使った先に見える未来
#### 何を食べてもゼロカロリーなので、日々のカロリー管理が楽ちん。
いくら食べても摂取カロリーの合計はゼロだから計算が楽チンですね。

#### 好きなモノを好きに食べる自分を、正当化できる。
カロリーが無くなれば自分を責める理由なんて無くなりますよね？

#### 笑える。ネタにできる。
「あはは！深夜にラーメン食べたけど0kcalだ！」って笑って誤魔化せます。
また、周りに「食べ過ぎだよ」と小言を言われても、Zerorieに責任転嫁すればいいし、「〇〇だから0kcal」って言えば場の空気が和むはずです。

## 使用技術
- Semantic UI
- Rails
- AWS
- Circle CIとCodeCov
- Google Cloud Vision API(画像検索機能に使用)<br>
など

## ER図
満たしたい要件やアプリの拡張性を考慮した結果、以下のようになりました。
テーブル設計は面白いけど、苦労しますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576318/110d5cfe-3f2d-79de-5a25-feb5c0d7313d.png)

## インフラ構成図
インフラにはAWSを使用しました。

また、Githubへpushする度に、[CircleCi](https://circleci.com/)による自動テスト、[Codecov](https://codecov.io/)によるテストカバレッジの計測、[GitGuardian](https://www.gitguardian.com/)によるリポジトリー上の機密情報や脆弱性の検知を行うようにしています。

あとは、[Capistrano](https://capistranorb.com/)でデプロイを自動化しています。

このように、存分なまでに~~クソアプリを~~クソ真面目に作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576318/af1b76fd-badb-ee11-3fc6-f77112afda6e.png)

## 開発期間
デプロイまで2ヶ月かかりました。所要時間は約300〜350時間。

## 苦労した点
#### Active StorageとGoogle Cloud Vision APIによる画像検索能
メイン機能の1つ「画像検索機能」の実装は苦労しました。
Active Storageを使ってVision APIを叩く、画像検索に使用したデータをsessionで保持する、そもそも食べ物の画像検索機能をどうやって自前で用意するのか等、色々苦労した反面、非常に勉強になりました。


#### Rails6系をAWSでデプロイ(Capistrano使用)
これも苦しかったです。
Rails6系はwebpackerが標準搭載となるため、yarnのインストールが必要でしたがその辺を忘れていたり、あとはnginxの設定ファイルの記述で苦労したり。
そして何より、エラー文を読みにいっても何もヒントが書かれていなかった時が最も絶望しました。インフラムズカシイ。

## 今後Zerorieに実装したい機能

#### 食べ物のカロリー理論を返してくれるLineBot
コレは開発当初から考えていた機能の１つです。
Lineで簡単に食べ物を検索できれば、もっと手軽にゼロカロリーの世界を楽しめると思うので、是非作り上げたいです。

#### 自分の好きなカロリー理論に草スタンプを押せる
「Zerorieを見てて草 （いいね）が押したくなった」という意見があったので、是非実装したいと思いました。
また、ユーザーも食べ物のデータを登録する時にカロリー理論を作るケースがあるので、おもしろカロリー理論のランキングみたいなのがあると良いなと思いました。

## おわりに
やっぱりプログラミングの楽しさは、自分の考えやアイデアを形にできることだと、改めて実感しました。
そして特に個人開発はその人の色・考え・個性が出てこそ、良さが現れるんじゃないかと思います。

他にも幾つかアイデアは考えているのでまた開発してみたいですが、次は笑えるよりもビジネス寄りなものを作りたいです。

以上、ご覧頂きありがとうございました！