革命のブログ

フレボワークスの社員がブログを通じて情報発信します。

Nuxt.jsでPWA対応のOnsenUIアプリを作ってみる

どうも、最近はNuxtにハマっている小野です。

業務でモバイルアプリを開発することになったので、
NuxtでPWAを使う方法について調べたので共有します。

ついでに画面にグラフ表示ライブラリchart.jsのVue用ラッパーでもあるvue-chartjsも使ってみます。

前提

  • npm、vue-cliが利用できること。
  • Githubアカウントを持っていること。

Nuxtのプロジェクト作成

まず、Nuxtのコミュニティで公開されているテンプレートを使って、プロジェクトを作成します。

# Nuxt.jsのテンプレート作成
vue init nuxt-community/starter-template nuxt-onsen

cd nuxt-onsen/

# 依存モジュールインストール
npm install

NuxtはデフォルトでユニバーサルアプリケーションなのでSSRも対応していますが、今回はSPAのみで行うため以下の設定が必要です。 nuxt.config.jsに以下の内容を追記します。

module.exports = {
  ・・・
  mode: 'spa'
}

OnsenUIを導入する

今回はモバイルアプリということで、モバイルに最適化されたUIであるOnsenUIを使います。

ja.onsen.io

# OnsenUI関連モジュールインストール
npm install onsenui vue-onsenui --save

Nuxtプロジェクト内のpluginsフォルダにonsenui.jsを作成してください。

plugins/onsenui.js

import 'onsenui/css/onsenui.css';
import 'onsenui/css/onsen-css-components.css';
 
import Vue from 'vue';
import VueOnsen from 'vue-onsenui';
 
Vue.use(VueOnsen);

nuxt.config.jsファイルに以下の内容を追記してください。

module.exports = {
  ・・・
  plugins: ['~/plugins/onsenui']
}

これでVueでOnsenUIが利用できるようになりました。

PWAモジュールをインストール

NuxtにはPWA用のモジュールが用意されているので、今回はこれを使います。

# PWAモジュールインストール
npm install @nuxtjs/pwa --save

nuxt.config.jsに以下の内容を追記します。

module.exports = {
  ・・・
  manifest: {
    name: "Nuxt.js OnsenUI",
    lang: 'ja'
  }
  modules: [
    '@nuxtjs/pwa' // PWAのモジュールを読み込む
  ],
  workbox: {
    dev: true // 開発モードでも利用できるようにする場合に必要
  }
}

上記で出てきたmanifestですが、PWAはネイティブアプリの様にホーム画面に追加することができます。 その際、ホーム画面に追加する際のアイコンや名称などを設定します。

動かしてみる

OnsenUIとPWAの準備が整いました。index.vueを編集して実際に動かしてみます。

vue-chartjsのセットアップ

vue-chartjsをインストールします。

npm install vue-chartjs chart.js --save

componentsフォルダにLineChart.jsを作成します。

import { Line } from 'vue-chartjs'

export default {
  extends: Line,
  props: ['data', 'options'],
  mounted () {
    this.renderChart(this.data, this.options)
  }
}

index.vueでグラフが表示されるように編集します。

<template>
  <v-ons-page>
    <v-ons-toolbar>
      <div class="center">Hello,Nuxt-OnsenUI!</div>
    </v-ons-toolbar>
    <line-chart :data="chartData" :options="chartOptions"></line-chart>
  </v-ons-page>
</template>

<script>
import LineChart from "../components/LineChart.js";
export default {
  components: {
    LineChart
  },
  data() {
    return {
      chartData: {
        labels: [
          "1月",
          "2月",
          "3月",
          "4月",
          "5月",
          "6月",
          "7月",
          "8月",
          "9月",
          "10月",
          "11月",
          "12月"
        ],
        datasets: [
          {
            label: "2018年",
            data: [8, 7, 7, 6, 5, 8, 9, 6, 7, 4, 8, 7],
            fill: false
          }
        ]
      },
      chartOptions: {
        title: {
          display: true,
          text: "平均睡眠時間"
        },
        responsive: true,
        maintainAspectRatio: false
      }
    };
  }
};
</script>

ここまでできたら、実行します。

npm run dev

ブラウザでhttp://localhost:3000を開きます。

表示されましたね。

Github Pagesで公開してみる

とりあえず、無料枠で公開したいので、Github Pagesを利用します。

以下のサイトを参考にリポジトリを作成します。

www.tam-tam.co.jp

公開用のファイルをビルドする

リポジトリ名がコンテキストパスとして付与されるので、nuxt.config.jsを修正する必要があります。

module.exports = {
  ・・・
  manifest: {
    name: "Nuxt.js OnsenUI",
    lang: 'ja',
    start_url:'/<repository>/'
  },
  ・・・
  router: {
    base: "/<repository>/"
  }
}

公開用リポジトリにプッシュする

上記で作成されたdistフォルダを別の場所に移動させ、以下のコマンドを実行します。

git init
git add -A
git commit -m "InitialCommit"
git remote add origin https://github.com/<username>/<repository>.git
git push -u origin master 

Githubへのプッシュが完了したら、スマホで確認してみます。 https://.github.io/にアクセスします。

f:id:frevo-works:20180927143336p:plain

上記のような画面が表示されましたか?これはホーム画面に追加されたあとの画面です。 そのため、アドレスバーが表示されていません。

おわりに

Nuxt.jsを利用すればこんなに簡単に導入できるんですね。
設定系がnuxt.config.jsに集約されているので、管理も楽です。

PWAに関してはプッシュ通知もNuxtのモジュールとして用意されているので、簡単に実装できると思います。 気が向いたら試してみます。

STS4(Spring Tool Suite 4)が出たので環境構築してみた

どうも、フレボワークスの小野です。
2018年9月25日に待望のSpring Tool Suiteのバージョン4がリリースされました。

spring.io

対応のIDEはEclipse、Visual Studio Code、Atomみたいです。
最近だとVisual Studio Codeの利用者が増えてきていますが、やはりJavaの開発はEclipseの方が便利ですね。
今回はEclipse版の開発環境を構築していきます。

動作環境

カテゴリ バージョン等
OS Mac OS X El Capitan
Java 1.8

※STS4の動作にはJDK 1.8.0_060以上が必要です。

インストール

以下のサイトからダウンロードしてください。 spring.io f:id:frevo-works:20180926104438p:plain

ダウンロード後、dmgファイルを実行し、アプリケーションフォルダにコピーしてください。

日本語化

Eclipseはデフォルトで英語表記なので、おなじみのPleiadesの力を借ります。
以下のサイトからプラグインをダウンロードしてください。 Eclipse 日本語化 | MergeDoc Project

f:id:frevo-works:20180926104816p:plain

ダウンロードし、解凍したらpleiades-mac->setup.dmgを実行してください。

f:id:frevo-works:20180926105338p:plain

これで、日本語化は完了です。STSを起動して確認してみましょう。 f:id:frevo-works:20180926105523p:plain

余談ですが、Pleiadesのプラグインをインストールすると、スプラッシュも変わってしまうんですね。。。
STS4のままがよかった。。。
スプラッシュを変更する方法はあるみたいなので、自分で調べてみてください。
今回は割愛します。もし、変更できたら追記します。

実行してみる

ワークスペースを指定し、STSを起動する。 起動後、ファイル->新規->Spring スターター・プロジェクトを開く。

f:id:frevo-works:20180926114601p:plain

f:id:frevo-works:20180926120940p:plain

プロジェクトが作成されたら、実行(右クリック->実行->Spring Bootアプリケーション)する。

Started DemoApplication in 3.522 seconds (JVM running for 5.659)

コンソール上に上記のログが表示されたら、ブラウザからhttp://localhost:8080を表示する。
以下のような画面が表示されたら成功です。(index.htmlファイルがないため404が表示されます。) f:id:frevo-works:20180926115821p:plain

lombokを導入

通常であれば、lombokインストーラから導入ができるのですが、
STS4のアプリケーション名が変更されているため、インストーラから設定ができません。
そのため、iniファイルに手動でlombok.jarのパスを設定する必要があります。

以下のサイトからlombok.jar(バージョン1.18.2)をダウンロードする。(9/26時点)

Download

ダウンロードしたjarファイルを/Applications/SpringToolSuite4.app/Contents/Eclipse/にコピーしてください。

アプリケーション->SprintToolSuite4.app->Contents->Eclipse->SprintToolSuite4.iniをテキストエディタで開き、以下のように変更します。

-startup
../Eclipse/plugins/org.eclipse.equinox.launcher_1.5.100.v20180827-1352.jar
--launcher.library
../Eclipse/plugins/org.eclipse.equinox.launcher.cocoa.macosx.x86_64_1.1.800.v20180827-1352
-product
org.springframework.boot.ide.branding.sts4
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.8
--add-modules=ALL-SYSTEM
-Xms40m
-XstartOnFirstThread
-Dorg.eclipse.swt.internal.carbon.smallFonts
-Xdock:icon=../Resources/sts4.icns
-Xmx1200m
-Xverify:none
-javaagent:../Eclipse/dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
-javaagent:/Applications/SpringToolSuite4.app/Contents/Eclipse/lombok.jar ←追記

保存したら、STS4を再起動してください。

動作確認

com.example.demoにTodo.javaを作成してください。

package com.example.demo;

import lombok.Data;

@Data
public class Todo {
    private String title;
    private String content;
}

f:id:frevo-works:20180926130414p:plain

候補にgetterメソッドが表示されていれば、lombokは正しく動作しています。

おわりに

lombokの手動設定は多少手間でしたが、問題なく構築ができました。
VisualStudioCodeでもSpringBootの開発はできますが、本格的に開発するとなるとやはりEclipseに軍配が上がります。
個人的にはVisualStudioCodeがさらに充実し、開発が容易になることを期待しています。

今は、フロントエンドはVSCodeで、バックエンドはSTSで開発しています。
Eclipseはフロントエンドの開発には弱い気がします。。。

早くIDEを統一したい。あ、IntelliJ IDEAがあった。

チリも積もれば山となる通勤時間

突然ですが、あなたは通勤時間にどれだけの時間をかけているでしょうか。

私はドアToドアで片道1時間20分。朝はよく電車が遅延するのでおよそ1日に3時間を移動時間として使っています。

 この時間がとても無駄だなあと思うので、最初は読書やスマホで勉強をするようにしていたのですが通勤時間のギッチギチの満員電車なので全く捗りません。

 

何もできないくらいの混み具合であれば諦めもつくのですが、ギリギリ読書できそうなくらいの混み具合のため努力してみます。

…しかし揺れのたび誰かがぶつかってきて気が散ったり、臭い人がいると気が散ってしまい勉強したつもりの無駄な達成感とストレスだけが残ります。(私の集中力がないだけかもしれないですが)

 

さて、1日は24時間なので1/8の時間を毎日混んでいる通勤電車での移動に費やしている事になります。

 1ヶ月の営業日は約20日なので1ヶ月のうち60時間を移動していることになります。

そして1年では720時間となるので1年間のうち30日をただただ移動しているだけに人生を費やしています。

rocketnews24.com

 

こんな結果もでているくらいなので通勤時間をずらす働き方改革よりも通勤をなくす・通勤のストレスを感じずに済むところに住む必要があるのではないでしょうか。

 

【祝】2周年記念

当社はお陰様で、設立2周年を無事迎えられました。 せっかくの設立記念なので、お客様もご招待して、東京ドームのメモリアル巨人観戦に行ってきました! バックスクリーンに映して頂いたり、当社用のジャイアンツユニホームも東京ドーム様より、プレゼント され、楽しい時間を過ごす事が出来ました。 来年も更に盛大なイベントが出来るよう、社員一同頑張って、世の中に必要な会社を目指します! f:id:frevo-works:20180910172552j:plain

マイクロサービスの実装で疑問に思うこと

初ブログです。

マイクロサービスについて以下の書籍を読んでみたんだけど、いくつか疑問に思うことがあるので そのことについて話したいと思う。

www.oreilly.co.jp

マイクロサービスが生まれた経緯、思想、メリットも大体分かった。 だが、以下の3点については実際の実装イメージがつかなかった。

  • UI合成
  • DB分割
  • 認証

UI合成

UI合成とは、1つの画面に各マイクロサービス側で用意されたUIを提供すること。

疑問

  • javascriptやcssの競合はないのか?
  • 実際に合成はどうやるのか?iframeを使うのか?
  • 各サービスでUIは必要なのか?

javascriptやcssの競合はないのか?

各マイクロサービスでUIを用意するということは、javascriptもcssも用意するという認識でいるが、 例えば、バージョン違いのプラグインを利用していたらどうなるのか。 表示が崩れたり、動作しなかったりしない? そもそも、iframeで表示するから関係ない?

実際に合成はどうやるのか?iframeを使うのか?

UI合成の概念は分かったが、実際どうやって組み込むのか。 地道に、各サービスからhtmlを取得して、DOM操作による表示?

各サービスでUIは必要なのか?

折角、各サービスで独立しているのにUIのデザインなどを合わせないといけなくなる。 最近だとSPAが流行っているので、サービス側はデータのみ返却するだけでいいのでは?

実際はどうなの?

DB分割

マイクロサービスの設計思想だと、データベースは各サービスで分けることになっている。 つまり、1サービス=1データベース。 別のサービスからは別サービスのデータベースを直接見ずに、WebAPI経由で取得することになる。

疑問

  • データベースのインスタンスはどこに作るの?

データベースのインスタンスはどこに作るの?

業務でAWSを利用しており、DBはRDS(Aurora)を使っている。 マネージドサービスを利用することで、運用コストを抑えられる。

この状況で、サービスごとにDBインスタンスを作成するとコストが膨大になる気がする。 少なくともRDSは他のサービスと比べて、比較的高価。

自前でEC2等でサーバを立ち上げて、DBサーバをインストールして運用してる?

本当はデータベース自体は分けない?

実際はどうなの?

認証

スケールアウトを想定し、セッション情報はサーバに持つことは避けたい。 memcachedやRedisのようなキャッシュサーバに保存するシーンも増えてきた。 最近では、jwt(ジョット)というトークンの仕組みが出ててきた。

これは、セッション情報をBase64エンコードやハッシュなどを組み合わせて1つのトークンを生成し、認証に利用する。 これを使うと、アプリサーバにもキャッシュサーバにも情報は保存する必要がない。 セッション情報は、生成したトークンに含まれることになる。

これらはログイン認証後に発行され、以降のリクエストで必要になる。(リクエストヘッダなどに設定)

疑問

  • ログイン不要のサービスからの認証はどうする?

ログイン不要のサービスからの認証はどうする?

バッチから各サービスのWebAPIを叩く場合の認証はどうする? もちろん、バッチなのでログイン情報とかはないので、トークンもない。

あくまでも想定ですが、 バッチからのリクエスト専用のトークンを予め生成し、アプリケーションで持っておく。 ログイン認証後とバッチの認証トークンを以下のように区別する。

  • ログイン認証後のリクエスト時 Authorization: Bearer ABCD1234

  • バッチ Authorization: Bearer Batch-EFGH5678←「EFGH5678」は予め生成したトークン。リクエスト時に「Batch-」を付与。

認証チェック時にトークンを「-」でsplitし、配列の1番目が「Batch」の場合はバッチからのリクエストとして扱う。

なので、ログイン不要なリクエストが発生する機能ごとに、トークンを発行しておくことになる?

実際はどうなの?

 終わりに

積極的にマイクロサービスを推進している立場として、ぜひとも理解しておきたい内容ですので、 実際に経験されている方からのアドバイスをいただけたら幸いです。