Nuxt.js使って個人開発やってみた　〜時間割を円グラフで表示するサービスをリリースした話〜

## TL;DR(要約)
- nuxtを使って時間割を作成できるサービスを作りました
- 時間割メーカーは[こちら](https://mitsudaman.github.io/TSMaker/)
- ソースコードは[Git Hub](https://github.com/mitsudaman/TSMaker/tree/master)にあげてます


## あいさつ
こんにちわ。ミツダマ([@mitudama](https://twitter.com/mitudama))です。昨今の流れに乗り、個人開発を始めてみました。

本当はRTA(リアルタイムアタック)に挑戦して時間を攻めようと思ったんですけど、あまりに時間かかってしまったので最初から無かったことにしました。守りに入りました。

開発は趣味なんだから自分のペースでやればいいよね！


## 作ったサービス
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">1日の予定から簡単に時間割を作れるサービスを開発しました！<br><br>・ふとん大好きダラダラ症候群の方<br>・夕方になって「今日何もしてない…」と焦りがちの方<br>・スケジュールマニアの方<br><br>時間割メーカーを使って有意義な日を過ごしてみませんか？<a href="https://t.co/4c9DLcdHML">https://t.co/4c9DLcdHML</a></p>&mdash; ミツダマ@副業&amp;個人開発プログラマー (@mitudama) <a href="https://twitter.com/mitudama/status/1080113462334828544?ref_src=twsrc%5Etfw">2019年1月1日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>  



▼サンプル(ある少年の1日)
![TSMaker_gif.gif](https://qiita-image-store.s3.amazonaws.com/0/314105/06e92525-30db-27f4-9fec-1ffce7076334.gif)



## なんで作ったか
- 時間割って作るの楽しい＆モチベーション上がるよね(無駄に)
- 「今日のスケジュール」をツイートして自分にブーストかけたい
- 曜日のスケジュールも決めて習慣を作りたい
- 円グラフで表現したら分かりやすいのでは？
- 作っちゃえ　
- 作った ←イマココ


## 使った技術と参考サイト
- [docker](https://www.docker.com/)
  - 開発環境を楽に構築してくれる便利なやつ ちょっとすき

- [Vue.js](https://jp.vuejs.org/index.html) 
  - フロントで採用
  - 感覚的にプログラムが組める
  - vue.js触り始めて開発の楽しさがさらに深まった気がする めっちゃすき
  
- [Nuxt.js](https://ja.nuxtjs.org/) 
    - Vue.js のフレームワーク
    - SPA・SSR・静的化の３つがある

    ▼ [Nuxt.jsを使うときに、SPA・SSR・静的化のどれがいいか迷ったら](https://qiita.com/noplan1989/items/f42e2f03663b00b5886d)

- [canvas](http://www.html5.jp/canvas/)
  - javascriptで図を描画してくれる

- [chart.js](https://www.chartjs.org/)
  - canvasを使ってグラフを作成してくれる
  - グラフの種類も多数ある ※今回はPie(円グラフ)タイプを採用
   ![screenshot-2019-01-02-121557.png](https://qiita-image-store.s3.amazonaws.com/0/314105/843ced0e-ef90-e670-2184-08e97eff4dca.png)


- [vue-chart.js](https://vue-chartjs.org/guide/#introduction)
  - chart.jsをvueで使えるようにしてくれる

- [chartjs-plugin-labels](https://github.com/emn178/chartjs-plugin-labels)
    - 円グラフのラベル用に使ったプラグイン
    - これによって時刻を円グラフの外側に表示できるようになる
    ![screenshot-2019-01-02-122006.png](https://qiita-image-store.s3.amazonaws.com/0/314105/1a1253aa-e837-07ac-9914-160ebc960a2e.png)



- [FontAwesome](https://fontawesome.com/how-to-use/on-the-web/setup/using-package-managers)
    - アイコンを表示してくれるやつ
    - twitterのマークとタイトルの時計マークで使用
    - 参考([FontAwesomeをNuxt.jsで使う (npm経由)](https://yinm.info/20181008/))

- [bootstrap](https://getbootstrap.com/)
  - CSSフレームワーク
  - ドキュメントに沿ってクラスを指定すれば簡単にレスポンシブなサイトが作れる

- [bootstrap-vue](https://bootstrap-vue.js.org/)
  - bootstrapとvueを組み合わせたもの
  - 別にbootstrapだけでいい気がするけど勉強のため採用
  ![screenshot-2019-01-02-123300.png](https://qiita-image-store.s3.amazonaws.com/0/314105/559cd0fe-2767-9960-9fab-b3a5e75ff788.png)


- [@nuxtjs/google-analytics](https://github.com/nuxt-community/analytics-module)
  - Nuxt.js 用の 公式 Google アナリティクスモジュール
  - めっちゃ簡単にアナリティクスを設定できた すき
  
- favicon&OGP設定
  - nuxtなら簡単に設定できちゃうんです
  
    ▼[ファビコンを設定してみた。10分ほどで出来て超カンタン。](
https://sayakablog.com/blog/favicon/)

    ▼[ファビコン favicon.icoを作ろう!](
https://ao-system.net/favicon/)

    ▼[Facebook・TwitterのOGP設定方法まとめ](https://ferret-plus.com/610)


```Javascript:nuxt.config.js
module.exports = {
  // 省略
  head: {
    title: '〇〇〇〇',
    meta: [
      { charset: 'utf-8' },
      { name: 'viewport', content: 'width=device-width, initial-scale=1' },
      { hid: 'description', name: 'description', content: 'Nuxt.js project' },
      { property: 'og:title', content: '〇〇〇〇' },
      { property: 'og:type', content: 'website' },
      { property: 'og:description', content: '〇〇〇〇' },
      { property: 'og:url', content: '〇〇〇〇' },
      { property: 'og:site_name', content: '〇〇〇〇' },
      { property: 'og:image', content: '〇〇〇〇' },
      { name: 'twitter:site', content: '〇〇〇〇' },
      { name: 'twitter:card', content: 'summary_large_image' },
    ],
    htmlAttrs: {
      prefix: 'og: http://ogp.me/ns#'
    },
    link: [
      { rel: 'icon', type: 'image/x-icon', href: '〇〇〇〇' }
    ]
  },
}
```

  
- [GitHub Pages](https://pages.github.com/)
  - 静的サイトの公開に使える
  - npm run generate で静的サービスを作成してアップ([公式リンク](https://ja.nuxtjs.org/faq/github-pages/))
  - gh-pagesブランチを作成し、サブツリーだけpushしてる
  
        `git subtree push --prefix front/dist/ origin gh-pages`
  
     ▼[Nuxt.jsで作ったWebサイトをささっとGithub Pagesに公開する](https://qiita.com/SugarShootingStar/items/73da90103a995a614ec3)
  

## 断念したこと
- 円グラフなので必ず0度(時計でいうと0時)から始まるしかない
    - 例えば夜の23~6時まで(-15°~90°)っていう表現ができない
    - 代替案として色を変えられるようにした
    - 23~24と0~6を同じ色にして表現してもらうことにした

- ツイートした時にユーザー個別で時間割の画像(OGP)が表示されるようにしたい
    - 画像をおく場所とかバックエンドが必要そうなので断念（次回チャレンジ！）

- スマホ版ダウンロードできない
    - ios safariでは仕様のため断念(タップすれば画像ダウンロードできるからOKと判断)

## 感想
趣味でプログラムを書くことってほとんどなかったのですが、久々に書いてみてすっごく楽しかったです。
もう完全に個人開発の虜です。

おかげで普段の業務のやる気がなくなってきましたw


## 終わりに
時間割メーカーを作ってみて、まだまだ発展させたい部分やそのために養うべき知識が多くあると痛感しましたので今度はよりレベルの高い開発をしていきたいです！

こんな風にしたらいいよとかこれはダメというアドバイスありましたらコメントいただければ幸いです！

最後まで読んでいただきありがとうございました。

ぜひ時間割メーカー使ってみてくださいー！