春から大学院生が3日間で「Nuxt.js + Vuetify + CircleCI」を使ってポートフォリオを作った話

## はじめに
初投稿です。春から 大学院生の「zu」と言います。学部ではアルゴリズムやデータ構造、機械語などを学んできました。プライベートではPythonやGo言語等を触れてきましたがめぼしい成果物はありません💦フロントエンドについてもあまり経験がありません。卒論が書き終わり、春休みということである程度の時間が確保できたため、フロントエンドにも手を出してみました。また、モダンなIT企業ではCI/CDツールが使用されていると聞いていたため、色々な記事を見て判断した結果、CircleCIを使ってみることにしました。実際に作成してみた結果、Nuxt.jsとVuetifyが非常に強力なおかげで3日間で(一応)完成することができました！

ポートフォリオを作成した理由ですが、自分の技術や興味のあることを簡易的にまとめることができ、他との差別化が図れると考えたからです。今年は各企業のインターンにも参加する予定なので、その時に活用できたら嬉しいです。

## 制作物

サイト：https://zsp2088dev.netlify.com/
ソース：https://github.com/zsp2088dev/portfolio/

プロフィール
![profile.png](https://qiita-image-store.s3.amazonaws.com/0/241805/e4463a4c-dfca-c72a-6d88-3b42ebd1d264.png)

技術一覧
![skills.png](https://qiita-image-store.s3.amazonaws.com/0/241805/01a37c6a-21d8-4089-fd4f-272102b8eee7.png)

成果物一覧については今後何か作り次第、追加していく予定です🙆‍♂️

## ポートフォリオ作成前のスキル
技術一覧にまとめた中で必要なことをピックアップしてみました。
https://zsp2088dev.github.io/portfolio/skills

- Java：学部の講義で1年程触った後、演習科目でAndroidアプリを作成
- Python：2年程使用しており、一番得意な言語
- Go：一通り基礎がわかる程度
- Vue.js：以前にWebアプリを作成しようと思った時に使用(結局できなかった💧)

HTMLとCSSに関してはVue.jsを触った時に少し勉強した程度でほぼ未経験で、jQueryに関しては使用したことすらありません笑
ポートフォリオ作成時は「わからないことがあったらその場で調べて解決！」スタイルを取っていたので体系的な知識が身についていないのが現状です。

## 使用技術
- Nuxt.js
- CircleCI
- GitHub Pages

Nuxt.jsを選んだ理由ですが、Vue.jsを以前にほんの少しだけ触ったことがあったからです。
Nuxt.jsはpagesディレクトリにvueファイルを配置するだけで自動的にvue-routerを設定してくれたり、
layout/default.vueに共通のレイアウトを設定できたりと、個人的にはかなりわかりやすかったです🌟
Vue.jsは使ったことがあるけれどNuxt.jsは使ったことがない！って方は是非Nuxt.jsを使ってみてください。

Nuxt.jsのインストールはこちら↓
https://ja.nuxtjs.org/guide/installation

CircleCIも初めてでしたが、YAMLの書き方で少し手間取った程度で簡単に扱うことができました。
下記記事がかなり参考になりました。

[CircleCIで出来るコト](https://qiita.com/noboru_i/items/7d300eb63ae667bf8dc2)
[CircleCIを導入した話](https://qiita.com/uramotot/items/5f1a9f03b5df308822f8)
[いまさらだけどCircleCIに入門したので分かりやすくまとめてみた](https://qiita.com/gold-kou/items/4c7e62434af455e977c2)

CircleCIを選んだのは、「JenkinsからCircleCIへ移行してよかった」という記事をいくつか見てきたからです。
逆に、「CircleCIからJenkinsに移行しました！」みたいな記事は見たことがありません。
使用したこともないJenkinsを否定しているわけではありませんが、より優れたツールがあるのであれば、そちらを使うべきだと考えています。

## 開発環境
CircleCIを使用してNuxt.jsをGitHub Pagesにデプロイできるようにしました。
CircleCIでは下記2つのジョブを実行しています。

1. pushされたNuxt.jsをESLintを使用して構文チェック
2. masterブランチにpushされた場合、GitHub Pagesへデプロイ

また、CircleCIでの実行結果をSlackへと送るように設定してみました。
構文チェックしかしていないため、当然ほぼ全てが成功します。(モクローかわいい！)

![slack.png](https://qiita-image-store.s3.amazonaws.com/0/241805/7b2bbfd2-4473-df5f-3b2c-b27669c48cba.png)

本来であればテストの実行等、色々できるようですが、特に思いつかなかったので簡素な構成です。
全体の構成図は下記図のようになっています。

![flow.png](https://qiita-image-store.s3.amazonaws.com/0/241805/68ec0534-72ca-13f6-918c-d785a4f68565.png)

(ほぼコピペですが)下記ページを参考に開発環境を整えました。
内容がよくまとまっており非常に読みやすかったです。

[CircleCIを使ってNuxt.jsをGitHub Pagesへデプロイする](https://qiita.com/yagi_suke/items/03a2411fdc3137ce657a)
[CircleCIの結果をSlackに通知する](https://qiita.com/su-kun1899/items/640f6fa8b48749396c16)

## 開発の流れ

[コミット履歴](https://github.com/zsp2088dev/portfolio/commits/master) を参考にその日何をしていたのかをまとめてみました。
3日間のほとんどをポートフォリオ制作に費やしています！(1日の睡眠時間は10時間くらいあるけど...)

3月2日：Webサイトのデザインを大まかに設計、CircleCIのテスト
3月3日：CircleCIの設定、各ページの作成、共通ヘッダーの作成等
3月4日：カードの作成、全体的な調整

2日目, 3日目に関しては1日の中でどこまで進めるかを決めておらず、疲れたら終わるといった感じでコーディングしていました笑

## 実装

### 意識したこと
ポートフォリオを作りにあたって、意識した3つのことをまとめてみました。

- 完璧より完成を目指すこと
- 新しい技術に慣れること
- 下手でもそれっぽく見せること

初めてWebサイト制作し公開したので、下手なのは重々承知です。

「完璧を追い求めて結局完成しなかった！」ということが何回かあったので、今回は完成させることを強く意識しました。また、自分の使い慣れてる技術ばかり使用して、それに満足したくはないなと思ったので、使ったことない技術を取り入れてみたました。これを繰り返すことで自分の使える技術の範囲が増えていくと思っています。そして、いくら下手とはいえ、十年前のWebサイトみたいな見た目は嫌なので、既存のフレームワークを取り入れて少しはまともにすることを意識していました。

### レイアウト
基本的なタグや書き方については知っていましたが、HTMLやCSS、デザインについてはあまり知識がなかったため、自分で新しく作るくらいなら既存のフレームワークを使おうと考えてVuetifyを選択しました。BootstrapやElementUIといった各フレームワークの中からVuetifyを選んだのはなんとなくです笑

初日に色々なサイト見たりしながら作成したいポートフォリオのイメージを膨らませていました。。
その後、ノートに具体的にどんな感じにしたいのかをまとめました。
その時に書いたノートの一部が下記画像です。雑ですがこれのほとんどがポートフォリオに反映されています🌟
コーディングしながら考えるよりも、先に設計した方が全体でかかる時間は短縮されますね。

![layout.jpg](https://qiita-image-store.s3.amazonaws.com/0/241805/cfb3ed2f-8443-82f6-0bac-758600c440d9.jpeg)

### グラデーション
単一色の背景だと一昔前のwebサイトのようになるような気がしたので、モダン感を出すために作成したポートフォリオには背景にグラデーションが適用されています。グラデーションにはuiGradientsというサイトを使用しましたが、コードをコピペするだけで簡単にグラデーションを実装できます。

結果として「なんか微妙だな...」と言った感じですが本人にデザインセンスがないので諦めました🤣
デザインセンスがある人がグラデーションを使用すると一気にオシャレになると思います！

[uiGradients](https://uigradients.com/#Amin)
![uigradients.png](https://qiita-image-store.s3.amazonaws.com/0/241805/2d54716d-205e-d376-6454-984de6998270.png)

### Vuetify
ポートフォリオでは、Vuetifyを活用して、ヘッダーとカードを作成しました。
カードは画像とタイトル、テキストを渡すだけで使用できるようにコンポーネントの設計を行いました。
ドキュメントを見てわかるとおり、必要箇所を記述するだけで使用可能なので、デザインセンスのない自分にはピッタリでした！

[Vuetify Toolbar](https://vuetifyjs.com/ja/components/toolbars)
![toolbar.png](https://qiita-image-store.s3.amazonaws.com/0/241805/b5203af2-c9e3-e742-4c60-a59ca81ed2af.png)

[Vuetify Cards](https://vuetifyjs.com/ja/components/cards)
![cards.png](https://qiita-image-store.s3.amazonaws.com/0/241805/20a66c79-ec37-d849-c7b7-1f61bb297fe7.png)

Vuetifyのカードを作成時に画像が読み込まれないということで下記記事を参考にコンポーネントを作成しました。
[Nuxt.jsで src="~assets/hoge.jpg" が変換されなくて困った](https://qiita.com/xsota/items/a575642f4451e50ab599)

下記コードのように値を渡すことで簡単に同じカードを生成することができます！

```
{
  src: require('~/static/skills-nuxt.png'),
  title: 'Nuxt.js',
  text: '本ポートフォリオを作成時に初めて使用したフレームワークです。'
}
```

## 反省点
完成を重視した結果、微妙なWebサイトになってしまったと思っています。テストを実行したり, Storybookを活用してソフトウェア品質を高めると良いのはもちろんですが、学習コストや実装時間を考えた結果、今回は諦めました。Pythonでunittestやpytestを使用した経験はありますが、Web系のテストに関しては勉強したことがないので何をしたら良いのかわかりません。今後はテスト重視の開発を意識していきたいと感じました。

## さいごに
Nuxt.js, CirlceCIを初めて使用しましたが、特に戸惑うこともなく3日間でポートフォリオを作成することができました。
作成したコンポーネントを組み合わせるだけで簡単にWebサイトができたのでとても楽しかったです。

[@plus_kyoto](https://qiita.com/plus_kyoto)さんが2019年2月に投稿した[フロント未学習の大学生が1週間でVue.jsを使ったポートフォリオを作った話](https://qiita.com/plus_kyoto/items/a01578b782f17f573510) に影響されて自分もポートフォリオを作りたいなと思ったのが一番のきっかけでした。使用技術は異なるものの、似通ったポートフォリオになってしまったので、今後デザインの勉強もしたいと思っています。

今後はGo言語 + Nuxt.js でそれっぽいことしてみたり、Kotlinを使用してAndroidアプリを開発してみたりしたいな〜と思っています。

お付き合いいただきありがとうございました。