独学・実務未経験からモダンな技術でポートフォリオを作成するまでの道のり【Rails6/Nuxt(SPA)/Docker/CircleCI/Terraform】

#目次
[技術](#技術)
[アプリの詳細](#アプリの詳細)
[使用方法](#使用方法)
[参考書籍や記事](#参考書籍や記事)
[今後は](#今後は)

https://github.com/RkAirforce/code-craft/blob/38ca9377944e6588c376288748191ed4a0db27c6/terraform/ecr.tf#L3

#自己紹介
27歳
プログラミングの実務経験なし。在学中に行ってたインターンのECサイトを用いた事業立案コンテストで、「自身にプログラミングスキルがあればビジネスを作ることができる」という考えが思い浮かんだのをきっかけにWeb技術に興味を持ちました。
以前独学でRubyOnRailsを用いてオリジナルアプリを作成して転職活動を行い、PHPで開発をしている自社・受託開発会社から内定を頂いたものの、入社してみると開発案件自体が存在せず社内業務も既存社員で全て回っている状態で止むを得なく退職する経験をしました。その悔しさもあり、開発業務に従事したいという気持ちがより一層強まりました。

#####関連リンク
- [Twitter](https://twitter.com/bitFieldE)
- [GitHub](https://github.com/RkAirforce/code-craft/tree/master)

今回のアプリで2作品目となります。
[前作リポジトリ](https://github.com/RkAirforce/aic_tech)

#技術
#### フロントエンド

|使用技術|詳細|
|-|-|
|Nuxt.js 2.15.3(SPA mode)|フロントエンドフレームワーク|
|Vuetify|UIコンポーネント|
|Jest|テスト(Vuexに値が保存されているかを確認するテスト)|

#### バックエンド

|使用技術|詳細|
|-|-|
|Rails6.1.3(API)|APIサーバーとして利用。フロントエンド側からのリクエストに対してJSONで返す。|
|PostgreSQL13.3|データベースとして利用し、本番環境ではRDSに保存。画像データはActiveStorageでURLを生成して、S3バケットに保存する。|
|Rspec|request/modelの部分をテスト|
|Rubocop|コードを解析して、必要に応じて自動でリファクタリングする。|

#### インフラ周り

|使用技術|詳細|
|-|-|
|ECS(Fargate)|Dockerコンテナ環境を構築|
|RDS|本番環境（PostgreSQL13.3）/画像以外のデータを保存|
|S3|ActiveStorageを用いて画像データをS3バケットに保存|
|Route53|オリジナルドメインを登録する目的|
|ACM(AWS Certificate Manager)|お名前.comからドメインを取得して、Route53で作成されたNSレコードをお名前.comのDNSサーバーに登録|
|CloudWatch|フロントエンドとバックエンドのログを確認|
|SSM(AWS System Manager)|本番環境の環境変数を管理|
|Docker/docker-compose|docker-composeではローカルの開発環境を構築して、DockerはDockerfileを開発/本番環境それぞれ分けて作成|
|CircleCI|自動テスト・デプロイ|
|Terraform|インフラ環境をコードで管理|

#### 全体設計
![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/3d25239a-2e25-e2b2-0c81-d70cbd1945bc.png)


#### ER図
![erd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/2061b851-441f-24ea-105a-45e8dcd71e0f.png)

#アプリの詳細
最新の技術や開発ツールをレビューし関連する勉強会やイベントを催すことで、同じような技術を用いるエンジニア同士の交流を行うことを目的としたメディアアプリです。

https://codecraftapp.com/

####開発背景
- リモートワークが増えて外出する機会が減った分、対面でのエンジニア同士での交流の機会が減った
- [compass](https://itmokumoku.connpass.com/)や[techplay](https://techplay.jp/)で勉強会やカンファレンス等のイベントが日々催されているが、200人〜300人規模と人数規模が大きすぎるがあまり、本質的な"交流"という目的を果たせない。
- 初学者や駆け出しエンジニアの参加障壁が高い
- 記事の内容とイベントを紐づけることで、どのような勉強会・交流会なのかがイメージしやすい
- 記事を書くことで技術力証明にもなり、採用活動を行なっている方々が求めている人材とイベントを通じて知り合える

####作成期間
**3〜4月**
・ポートフォリオのテーマの考察、nuxt.jsのVuexやVuetifyの使い方を学習

**5月**
・ユーザー認証機能、詳細ページ

**6月**
・記事投稿機能、いいね・コメント機能
・イベント・勉強会作成機能
・管理者ページ

**7月**
・イベント詳細/チャット機能
・タグのフォロー機能
・検索機能

**〜8月中旬**
・terraformでのインフラの構築
・CircleCIでの自動テスト/デプロイ

#使用方法
####機能一覧
|機能|説明|
|-|-|
|ユーザー周り|新規会員登録・ログイン・ゲストログイン(ゲストログインのボタンを押すだけでログインできます。)、タグのフォロー機能|
|記事投稿機能|レビュー記事の投稿・編集・削除|
|いいね機能|レビュー記事へのいいね機能|
|記事へのコメント機能|レビュー記事へのコメント機能|
|イベント開催機能|レビュー記事に関する勉強会・イベント開催機能|
|イベントへの参加機能|イベントへの参加機能|
|イベント内のコメント機能|参加しているイベント内でのコメント機能|
|タグ機能|ユーザー・レビュー記事・イベントに対するタグの紐付け|
|タグのフォロー機能|フォローしたタグをユーザーの詳細ページ内に表示する|
|検索機能|ユーザー・レビュー記事・イベント・タグの検索機能|
|管理者機能|ユーザー・レビュー記事・記事へのコメント・イベント・イベントへのコメント・タグの編集・削除機能|


#### ログイン・会員登録
右上の[ログイン]を押して、[ゲストユーザーでログイン]を押すと、ログインが完了して右上にプロフィールアイコンが表示されます。

![login.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/3542f91a-208b-0d78-bcbe-ab5556496ab7.gif)

会員登録では、VeeValidateを用いて、必要事項を満たした入力がされた場合のみユーザーが登録できるようになっています。

![画面収録 2021-07-25 15.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/d9574010-4fa6-e6aa-8ec6-b7d6a850d070.gif)
#### 検索
メニューの[検索]を押してください。ユーザー・レビュー記事・イベント・タグの検索ができます。

![画面収録 2021-07-23 12.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/ec0bf6c4-3918-e3f7-16b9-9ceb94403a33.gif)
#### プロフィール編集
メニューの[プロフィール編集]を押してください。プロフィールの編集では、ユーザー情報の編集、パスワードの変更ができます。

![画面収録 2021-07-23 11 (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/ae86e2dd-d438-b527-adee-c0f64ff9bc8f.gif)
#### プロフィール詳細
プロフィールアイコンを押してメニューの[プロフィール詳細]を押してください。プロフィールの詳細、レビュー投稿記事、主催イベント、参加イベントを閲覧することができます。

![画面収録 2021-07-23 11.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/99ed557d-2b27-4405-5658-89e5934339bd.gif)

1.円グラフでは、投稿記事・お気に入り記事・イベント・参加イベントにあるタグの数を集計して、ユーザーの技術傾向を表示しています。

2.プロフィール詳細内にあるタグを押してみましょう。タグの詳細が表示されて、タグに紐づけられた記事やイベントが表示されます。また、タグのフォローをすることができます。

![画面収録 2021-07-23 11 (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/36952e7f-d1c5-b5c5-5ba1-36c3dbecaac8.gif)

投稿レビューを押すと、ユーザーが作成した投稿一覧を確認することができます。構成は以下の通りです。

![スクリーンショット 2021-07-21 21.26.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/9ab16647-14fc-d923-0f16-27f4130e70e8.png)
お気に入りレビューを押すと、ユーザーがいいねした投稿一覧を確認することができます。

![スクリーンショット 2021-07-25 15.44.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/3ff4297d-a646-6fde-cad0-f0f2efb0cfe3.png)

投稿詳細ではマークダウンを用いて記事を書いたり、記事へのコメントの投稿もできます。

**(1)**
![スクリーンショット 2021-07-25 15.25.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/a68c2722-4657-f970-b9b9-648d90e99fb4.png)

**(2)**
![スクリーンショット 2021-07-25 15.28.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/7cdc3879-1379-a857-757b-56742c063444.png)

#### イベントの閲覧・編集
イベント一覧では、主催イベントの詳細の閲覧・編集を行うことができます。
![画面収録 2021-07-22 22.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/6359fb21-d2d0-2c70-2ffc-f8b0d6786e88.gif)

イベントの詳細では、参加者の確認・掲示板でのメッセージのやりとり・イベントのキャンセル(主催者以外)ができます。
![画面収録 2021-07-25 15 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/f48b8331-9644-aa6b-cfbe-e5a7212d5751.gif)

参加イベント一覧では、他ユーザーが主催しているイベントの参加リストを確認することができます。
![スクリーンショット 2021-07-25 16.01.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/979ea2ab-96a0-16c7-ad6a-d2698a080b19.png)

#### 検索機能
ユーザー・レビュー記事・イベント・タグを検索することができます。
![画面収録 2021-08-27 15.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321060/796bdde8-a484-5bb8-31a6-3163aa808d53.gif)

#参考書籍や記事

|書籍・Web記事|コメント|
|-|-|
|[ポテパンキャンプ](https://camp.potepan.com/)|わからないエラーを解決するというよりは、実務ベースでのコードの作法を学ぶために利用させて頂きました。深夜1時半辺り(土日は深夜2時まで)コードレビューしていただいた際は感動で涙が出そうでした。|
|[Nuxt.jsビギナーズガイド―Vue.js ベースのフレームワークによるシングルページアプリケーション開発 単行本（ソフトカバー）](https://www.amazon.co.jp/Nuxt-js%E3%83%93%E3%82%AE%E3%83%8A%E3%83%BC%E3%82%BA%E3%82%AC%E3%82%A4%E3%83%89%E2%80%95Vue-js-%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AB%E3%82%88%E3%82%8B%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E8%8A%B1%E8%B0%B7-%E6%8B%93%E7%A3%A8/dp/4863542569)|Vuexの概念を理解するために使いました。|
|[Vuetify公式サイト](https://vuetifyjs.com/ja/)|デザイン面が一番苦戦しましたが、Vuetifyのおかげである程度形を整えることができました。|
|[独学プログラマ](https://blog.cloud-acct.com/posts/u-rails-user-validates)|Rails × Nuxt.js × Dockerの環境構築とログイン機能の実装で参考にさせて頂きました。|
|[Nuxt.js + Ruby on Rails + AWS Fargate の開発・デプロイチュートリアル](https://zenn.dev/hibriiiiidge/books/49ee4063b10cec1df1a2/viewer/2ac314f5633e674d4b0c)|初めてフロントエンドとバックエンドをECR(Fargate)で構成することになったので、全体外観の理解のために参考にさせて頂きました。|
|[Ruby on Rails 6 実践ガイド](https://book.impress.co.jp/books/1118101134)|メソッドの書き方、モデル設計、Rspecのテストコードの書き方で参考にさせて頂きました。|
|[実践Terraform　AWSにおけるシステム設計とベストプラクティス (技術の泉シリーズ（NextPublishing）) オンデマンド (ペーパーバック) – 2019/9/20](https://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Terraform-AWS%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E8%A8%AD%E8%A8%88%E3%81%A8%E3%83%99%E3%82%B9%E3%83%88%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-%E6%8A%80%E8%A1%93%E3%81%AE%E6%B3%89%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E9%87%8E%E6%9D%91-%E5%8F%8B%E8%A6%8F/dp/4844378139/ref=pd_bxgy_img_2/355-1685118-8850434?pd_rd_w=GejFv&pf_rd_p=d8f6e0ab-48ef-4eca-99d5-60d97e927468&pf_rd_r=JYR9CJCXJJA38K9PAGXZ&pd_rd_r=6ba75dae-f019-4b38-9c8d-2bf613859b2c&pd_rd_wg=T81Pm&pd_rd_i=4844378139&psc=1)|Terraformのコードレシピ集です。ECS(Fargate)でインフラを構築する上で助けとなりました。|
|[terraform公式サイト](https://learn.hashicorp.com/tutorials/terraform/aws-build?in=terraform/aws-get-started)|書き方と実際の動きが動画で確認できるので、要所を掴みやすいと思います。|
|[Ruby on Rails × Terraform × ECS × GitHub Actionsで快適なデプロイ環境（CI/CD）を構築する](https://qiita.com/kazama1209/items/8e8f4d83a90e782abe5e?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items)|ファイル群のディレクトリ構成で参考にさせて頂きました。|
|[JavaScript コードレシピ集 単行本（ソフトカバー） – 2019/1/25](https://www.amazon.co.jp/JavaScript-%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%82%B7%E3%83%94%E9%9B%86-%E6%B1%A0%E7%94%B0-%E6%B3%B0%E5%BB%B6/dp/4297103680/ref=sr_1_2_sspa?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2FSFLW36PTZAJ&dchild=1&keywords=javascript%E9%80%86%E5%BC%95%E3%81%8D%E3%83%AC%E3%82%B7%E3%83%94&qid=1630308377&s=books&sprefix=javascript%E9%80%86%E5%BC%95%E3%81%8D%2Cstripbooks%2C256&sr=1-2-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUEzNk5KWlU1UDlJVVdEJmVuY3J5cHRlZElkPUEwMjE2NzMzM0RLNERHUzdXQzI0USZlbmNyeXB0ZWRBZElkPUEyUEpTU0szQVNGRzBIJndpZGdldE5hbWU9c3BfYXRmJmFjdGlvbj1jbGlja1JlZGlyZWN0JmRvTm90TG9nQ2xpY2s9dHJ1ZQ==)|JavaScriptの文法でわからない箇所は、Qiitaとこの書籍で9割方解決します。|
|[CircleCI実践入門──CI/CDがもたらす開発速度と品質の両立 WEB+DB PRESS](https://www.amazon.co.jp/CircleCI%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80%E2%94%80%E2%94%80CI-CD%E3%81%8C%E3%82%82%E3%81%9F%E3%82%89%E3%81%99%E9%96%8B%E7%99%BA%E9%80%9F%E5%BA%A6%E3%81%A8%E5%93%81%E8%B3%AA%E3%81%AE%E4%B8%A1%E7%AB%8B-WEB-PRESS-plus-ebook/dp/B08H51JHS1/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=circleci&qid=1611986093&s=digital-text&sr=1-1)|Qiitaの記事等と併用して理解を深めました。|
|[Docker/Kubernetes 実践コンテナ開発入門](https://www.amazon.co.jp/Docker-Kubernetes-%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E5%B1%B1%E7%94%B0-%E6%98%8E%E6%86%B2-ebook/dp/B07GP1Q3VT/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=docker&qid=1611986284&s=digital-text&sr=1-2)|詳細な解説で、今回のポートフォリオの作成では、3~4書ほど読む程度で十分でしたが、EKS(kube8s)の開発をする際には全て読み切ります。|

#今後は
ポートフォリオの作成は一段落ついたので、転職活動に重点を置きたいと思います。時間に余裕ができたら既存のポートフォリオにTypeScriptを加えたり、Reactの作品も作る予定です。
最後まで閲覧していただきまして有難うございます。

**記事執筆にあたって参考にさせていただいた投稿記事**

- [ほぼ独学・未経験者がモダンな技術でポートフォリオを作ってみた【Rails / Nuxt.js / Docker / AWS / Terraform / CircleCI】](https://qiita.com/aki0151/items/f39ef43c9d9fc1b87d9a)
- [【独学・未経験】Nuxt.js, Rails, Docker, AWS ECS(Fargate), TerraformなSPAポートフォリオを作成しました。](https://qiita.com/kuromitsu0104/items/dc0021a20100e11f2f7d)
- [高卒フリーターから、Web系自社開発企業のエンジニアになるまで](https://qiita.com/halhal23/items/073913754cd7f7d9352d)