独学・未経験PF 子供の遊び場共有サービス「Crayfisher」を開発してみた（再掲）

##はじめに

Rails、AWS、Docker、CircleCI、Herokuで子供の遊び場共有サービスを開発してみましたので紹介させていただきます（再掲）。
以前中途半端な形で投稿してしまったので、皆さんに役立つような情報を提供できるよう少し作り直しました。

この記事でわかること
1. Webアプリケーションの作成手順
2. 作成中苦労したこと、反省点
3. 使用した技術と参考にしたサイト・書籍

なお、実装に伴って苦労した点を後々備忘録として書き出していこうかと思います。他の駆け出しエンジニアの方々の参考になれれば幸いです。

##概要

Crayfisherは子供の遊び場スポットを共有するサービスです。 ザリガニ釣りスポット、クワガタの取れる木、トカゲがいる場所、ネットでは出てこない遊び場スポットを知りたい時、是非Crayfisherをご利用ください。また、子供の頃よく行っていた遊び場があれば全国のお母さん、お父さんたちのために是非共有ください。
![スクリーンショット 2021-02-05 0.08.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059259/e2810216-df84-2f59-fc62-c8bb826cebf4.png)

github: https://github.com/fantagreep/crayfisher
url : https://crayfisher-app.com/

ログイン用
メールアドレス：example@example.com
パスワード：foobar

##インフラ設計
![infrastructure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059259/14095b49-6905-7602-12cf-dcc0294e0f2a.png)

##実装機能

####地名による地図検索機能

![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059259/f45f42e6-a8c9-3608-277d-18136734a9ad.gif)
地名による記事検索機能を追加しました。
これはGooglemapAPIの機能の一つであるGeocodeを使用して作成しました。めちゃくちゃ苦労したので多分備忘録かねてまた別記事を作成すると思います。
また、GooglemapAPIのGeocodeの他に「geocoder」というgemを使っても検索機能を実装できるみたいでしたが、上手く座標を取得できなかった為googlemapAPIの機能で実装しました。Gemを使うと何度やっても渋谷駅の検索結果がゴビ砂漠付近になりました。
参考サイト：
- [Google Maps API の使い方・利用方法](https://www.webdesignleaves.com/pr/plugins/googlemap_01.html)
GoogleMaps APIの導入方法が詳しく記載されております。これがあればとりあえずマップを記事に植え込むことはできると思います。
- [ジオコーディング（マッピイ）](https://www.google-mapi.com/event-data-processing/geocoding/)
ジオコードの方法が説明されたWebサイトです。地図検索から座標の住所、緯度、経度を取得することができるようになります。

####地図クリックによる座標取得
![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059259/3c79f9a4-07f9-bd93-69e3-cd42f6b7a0c1.gif)
地図をクリックすることで座標を取得できる機能を実装しました。これもめちゃくちゃ苦労しました。クリックした場所の地名、緯度、経度を取得し自動的にFormへ自動入力します。（緯度と経度のformはhiddenで設定している為ブラウザ上では表示されません。自動入力された地名は変更可能です)
参考サイト：[Google Maps JavaScript API でクリックした座標の取得](https://qiita.com/SOJO/items/d43a28a6fe27de3cc85c)

####Ransackを利用した検索機能
[Gem"Ransack"](https://github.com/activerecord-hackery/ransack)を利用し投稿検索機能を設定しました。投稿内容、ユーザー名、地名のいずれでも検索ができます。便利なGemですね。
ransackの導入には[こちらのサイト](https://qiita.com/nojinoji/items/e1b174220da8c81a1756)を参考にしました。

![スクリーンショット 2021-02-05 20.52.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059259/9f7a0fe3-ce17-2c25-f795-1da6e68bee4b.png)
![スクリーンショット 2021-02-05 20.53.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059259/bf7f8ad6-169c-5ba7-cd1b-892d791ad1dd.png)
![スクリーンショット 2021-02-05 20.54.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059259/1628b6db-411f-a0b8-fa05-0ed965f3cffb.png)

####JQueryを利用したModal表示機能
JQueryを利用し、Googlemap上の吹き出しをクリックすれば投稿内容がモーダルで表示されるようにしました。
Modal機能はBootstrapを利用すれば簡単に実装できるので、実装する場合は[Bootstrapのサイト](https://getbootstrap.jp/docs/4.2/components/modal/)を参考にしてみてください。
![ezgif.com-gif-maker (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059259/db44c138-018e-b965-a5ec-6f0b94dde25e.gif)

####Deviseを利用したログイン機能
言わずと知れた便利Gem、[devise](https://github.com/heartcombo/devise)を使いサインアップ、ログイン機能を実装しました。導入には[こちらのサイト](https://qiita.com/cigalecigales/items/f4274088f20832252374)などが参考になると思います。
deviseにはいくつか機能があり、そのうちのいくつかを選択し使用することになります。Crayfisherではdatabase_authenticatable、registerable、rememberableなどの機能を使用しました。

####Dockerによる環境構築
Docker、Docker-composeを使用し仮想環境を構築しました。
Dockerとは？仮想化とは？という方は[このサイト](https://knowledge.sakura.ad.jp/13265/)に詳しく記載されておりますので是非ご覧になってください。Dockerを使い開発を進めたものの、Dockerの仕組みを隅々まで理解しているわけではないため、後ほど本を買いしっかりと勉強しようかと思います。何かオススメがあれば教えていただけますと幸いです。
初学者の方がDockerを導入する際には[こちらのサイト](https://qiita.com/kodai_0122/items/795438d738386c2c1966)や[こちらのサイト](https://qiita.com/chisaki0606/items/a4b42af5c4735c94057a)が参考になると思います。


####CircleCIを利用した継続的インテグレーション、デリバリー
継続的インテグレーション、デリバリーとはなんぞや？という方は[こちらのサイト](https://codezine.jp/article/detail/11083)をご覧ください。簡単にいえば、Git commitした後にテストを走らせ本番環境にデプロイするまでの工程を自動化してくれるツールのことです。CIツールにはいろいろありますが、現在主流なのはCircleCIというツールらしいのでそれを導入してみました。
CircleCIをPFに組み込みたい！と考えているRailsエンジニアの方は[こちらのサイト](https://qiita.com/junara/items/a40bb231c405be7983f7)が参考になると思います。

####Webデザイン
Webデザインは全然たいしたことないのですが、作ったものがあまりにもBootstrap初心者感丸出しの無機質なサイトだった為最低限見栄えを良くしようとカラーバリエーションを提案してくれるいくつかのサイトを参考にしました。
[Color Hunt](https://colorhunt.co/)
[Color Drop](https://colordrop.io/)
まあ多少はマシになったかな...?と思いますが、まだまだ垢抜けないUIだと思うので書籍を注文しまたUpdateを重ねていく予定です。書店で見た限り[1冊ですべて身につくHTML ＆ CSSとWebデザイン入門講座](https://www.amazon.co.jp/1%E5%86%8A%E3%81%A7%E3%81%99%E3%81%B9%E3%81%A6%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8FHTML-%EF%BC%86-CSS%E3%81%A8Web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E5%85%A5%E9%96%80%E8%AC%9B%E5%BA%A7-Mana-ebook/dp/B07PS1ZJN6)が良さそうだと思いましたのでネットで購入いたしました。届いたらその本を参考にしつつまたUIを修正してみるつもりです。

####レスポンシブ対応
レスポンシブ対応を取り入れました。[Bootstrap](https://qiita.com/tonkotsuboy_com/items/7c01460b59c3ca5ee047)を利用すれば割と簡単にできますので是非参考にしてみてください。
![ezgif.com-gif-maker (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059259/70c44c36-f982-7bc9-6fad-f5e4e5866cde.gif)
また、[こちらのページ](https://search.google.com/test/mobile-friendly)ではPFが
モバイルフレンドリーかどうか診断することができます。
![スクリーンショット 2021-02-06 15.52.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1059259/594c3cc5-12bb-e53e-3c4c-ccada3e7e9ca.png)

####gem "bullet"を利用したN+1問題の検出・解決
これはRails初学者の方に気をつけて欲しいのですが、Railsには[N+1問題](https://qiita.com/massaaaaan/items/4eb770f20e636f7a1361#:~:text=N%2B1%E5%95%8F%E9%A1%8C%E3%81%A8%E3%81%AF,%E3%81%84%E3%82%8B%E7%8A%B6%E6%85%8B%E3%82%92%E6%8C%87%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)というのがあり、場合によってはデータベースへの問い合わせが非効率的になり、アクセスの時間が異常にかかってしまう可能性があります。
しかしrailsには自動的にN+1問題を検知、解決策を提示してくれる[bulletというgem](https://github.com/flyerhzm/bullet)があり、これを利用すれば容易に解決することができます。

####AWS S3を利用したクラウドストレージ&サーバー構築
言わずと知れた天下のAWSさんを利用しサーバーを構築いたしました。

####Google Analyticsによるアクセス解析
Googleアナリティクスとは？という方は[こちらの記事](https://wacul-ai.com/blog/access-analysis/google-analytics-method/what-is-google-analytics/)をご覧ください。

以下引用
*Googleアナリティクスとは、Googleが提供するアクセス解析ツールです。
基本無料で使えます。後に説明するように有料版もあるのですが、基本的には無料版でOKです。
- 「サイトの訪問者数はどれくらいか」
- 「訪問者はどこから来たのか」
- 「使われたデバイスはスマホかパソコンか」
などのデータを計測することができます。データをチェックすることで、自分のサイトの良い点や悪い点が見えてきます。たとえば、「スマホユーザーが多いからスマホ専用サイトを作ろう」など施策を考えることができます。
また、施策の効果を確認することもできます。たとえば、「Facebook広告を打ったがそこからの訪問はどれくらい増えたのか」といったデータをGoogleアナリティクスでチェックできます。*

導入方法まで詳しく記載されておりますので上記の記事だけで簡単に導入できると思います。


####その他
- Rspecによる自動テスト
<br> Rails Tutorialはminitestでしたが、現場ではRspecが広く使われているとのことでRspecを導入しました。
- rubocopによる静的コード解析
<br>コードのインデントのズレや空白スペース、細かな記法を自動的に直してくれるGemです。便利。
- SassとSlimによる記述
<br>こちらも現場では広くSlimが使われているとのことで導入してみました。慣れるとHTMLよりもだいぶ使いやすいです。
- パスワード変更ページ
<br>現在のパスワード、新しいパスワード、新しいパスワードの確認入力欄があり、現在のパスワードが正しく、新しいパスワードと新しいパスワードの入力欄が一致する場合にパスワードが更新される。
- 投稿機能
<br>投稿、編集、削除、画像投稿機能。投稿時には投稿内容に加えて住所、緯度、経度も投稿可能。
- コメント機能
<br>投稿に対してコメント投稿ができる。本人のコメントは編集、削除可能。
- いいね機能
<br>投稿に対していいねができる。いいねした投稿はユーザーページから確認できる。

##今後やりたいこと
- より効率的なコードに変更し処理を高速化させる。
- 通知機能作成
- インフラ関連、セキュリティー関連の勉強
- Vue.js等モダンなUI設計の技術
- SEOフレンドリーなWEB設計

##まとめ
今回のWebアプリを開発してみて、下記のことを学びました。

- インフラ面はもっと勉強が必要(AWS, CI, Docker, ネットワーク, データベス等)。なんとなくで開発進めてしまった節はあるので、書籍を精読しじっくり勉強します。

- Javascriptに関しても曖昧な理解のまま開発を進めてしまったと感じている為、また再度書籍等で勉強する必要があると感じました。

- 初期の設計は大事、明確にどのようなものを作るかを決めたほうがいいと感じました。他の方の作品を拝見して、どれも初期の段階の設計が非常に細やかで計画的に開発されていたため、行き当たりばったりで開発してしまった自分が恥ずかしくなりました。[kuromitsuさん](https://qiita.com/kuromitsu0104/items/dc0021a20100e11f2f7d)や[shogoさん](https://qiita.com/shogo-1988/items/a96eb63a9b108696d966)のポートフォリオのように初期段階からインフラ設計、DB設計、仕様をきちんと固めた上で開発に取り掛かったほうが絶対に無駄がなく複雑なアプリを開発できるため、次回からはきちんと設計をした上で開発に取り掛かるようにします。

- Outputは非常に大事。たとえ何か素晴らしいものを作ってもそれを知ってもらえなければ意味がないためカッコつけずに定期的にOutputをする必要があると感じました。また、他人に伝えるためにoutputをまとめることは自分の知識を一旦整理することになるため、自分にとっても非常にためになるものだと思います。

- Qiitaなどに記載されているコードをコピペするだけでもなんだかんだ動いたりしますが、基礎を固めるためには体系的にまとまっている書籍を活用したほうが効率がいいと感じました。具体的には書籍を軽く一読→実際に手を動かしながら本やサイトを参照→本を再度精読といったサイクルが最も効率がいいのではないかと感じました。

使っていただいてなにかコメント・アドバイスありましたら厳しいものでもいいので是非お願いします！
Twitterもやってますので是非フォローもよろしくお願いします！

##関連リンク
[twitter](https://twitter.com/AePSRBFf5TyY7cL)
[Github](https://github.com/fantagreep)