React, Redux, Material UI, Babel, Webpackの環境構築
■ 各種install
$ npm install --save-dev babel-core babel-loader babel-preset-env babel-preset-react
$ npm install --save-dev webpack webpack-dev-server
$ npm install --save-dev html-webpack-plugin
$ npm install --save-dev style-loader css-loader
$ npm install --save react react-dom
$ npm install --save redux react-redux
$ npm install --save material-ui@next
やっぱり環境構築がメンドウ。。。
Node.js, ExpressでWebApplication
Node.jsを使って、Webアプリを作ってみようと思います。
使いたい技術、要件としては、以下の通り。一般的なWebアプリで使われる要素+IoTの要素を取り入れておきたいと思います。
・フレームワークは王道のExpressを使う
・MQTTを使ってメッセージを受信する
・Databaseに保存する
・UIはcssフレームワークのbootstrapを使ってみる
まずは、環境構築から。
AWSのアカウント作ったので、無料枠範囲内で実施してみます。
※ -----
この無料枠、よく調べておかないとすぐ超えてしまうかもしれません。
EC2インスタンスは750時間で、1か月連続稼働がOKという文言が目に入りますが、これは1台の場合であることに注意!つまり、インスタンス時間です。2台であれば375時間になります。EC2インスタンスは、何台でも簡単に作れてしまうので、ついつい作ってしまいがちなので注意です。
※ -----
AWSのEC2のインスタンスタイプ(スペック)は、無料のt2.microを作成しました。
vCPU : 1core, Strage : 8G, Memory : 1Gと、無料だけあってやや非力ですね。。。
OSは、Amazon Linuxで作成しました。Amazon LinuxはRedHat系ですね。(個人的には、Ubuntu/Debian系のお手軽さが好みですが。)
|||■||| Node.jsセットアップ |||■|||
Node.jsのセットアップ方法はいろいろありますが、nvmからインストールします。
Gitリポジトリが以下にあります。
Installationに書かれている通りcurlでインストール。
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.5/install.sh | bash
~/.nvmにインストールされて、~/.bashrcにコマンドが追加されます。
初回はコマンドを使えるようにsourceします。
$ source ~/.bashrc $ nvm --version 0.33.5
Node.jsはnvmで好きなVersionをインストールできます。ls-remoteでNode.jsのVersionを確認できます。
$ nvm ls-remote
2017.10.22時点最新のv.8.7.0をインストール。同時にNode.jsのPackageManagerのnpmもインストールされます。
npmについてはこちらが参考になります。
$ nvm install v8.7.0 $ node -v v8.7.0 $ npm -v 5.4.2
完了です。Node.js自体はとても簡単にインストールできます。
|||■||| Expressのインストール |||■|||
Node.jsのWebアプリケーションフレームワークのExpressをインストールします。
Express - Node.js web application framework
まずは、npmのベースとなるpackage.jsonを作成。
$ npm init
対話形式で質問に答えていくと、package.jsonができます。
{ "name": "my-web-app", "version": "0.0.1", "description": "sample web application", "main": "app.js", "scripts": { "test": "test" }, "author": "Tuna", "license": "MIT", }
Expressのインストールは、以下の通り。
$ npm install express --save
npm5からpackage.jsonとpackage-lock.jsonが生成されるようになったようです。
package-lock.jsonは、環境の違い、Versionの違いによるエラーを回避するために作成されるようです。詳しくはこちら。
yosuke-furukawa.hatenablog.com
|||■||| お試しアプリ作成 |||■|||
Expressのお試しアプリを作ってみます。
$ vi app.jp /*! * My Web Application Sample */ // requires let express = require('express'); // express instance let app = express(); // start web server let server = app.listen(3000, () => { console.log('web server start'); }); // responce greating page app.get("/", (req, res, next) => { res.end("Hello Web Server"); });
EC2インスタンスのセキュリティグループで3000番ポートを開放し、
http://EC2-IP-address:3000/
にアクセスすると、Hello Web Serverが表示されました。
次回は、express-generatorを使って、フレームワークを生成し、Web Applicationを作りこんでいきたいと思います。
■ その他参考
Google Web Starter Kit
ES6
関数型プログラミング
関数型プログラミングに関してよさげな記事を見つけたので、ちょっとメモっておきます。
FlinkとKafkaを結合しようと思って、FlinkのDataStreamを調べてたところ、JavaのStremaはモナドらしく、じゃあ、モナドって何?ってところからたどり着いたページ。
いろいろ知識が不足しているものを調査していると、いろいろ脱線してしまい、生産性があがらない。。。
Lambda/Kappa Architecture
BigData関連の仕事をしていることもあり、Lambda/Kappa Architectureをちょっと調べ始めてます。
Web系、BigData系はあまり知識がないのでつらいところですが、従来システムの問題点、Lambda/Kappa Architectureでも問題解決に関しては、こちらのサイトがイメージしやすかったです。
("PHPで支える"とか、やや偏っているのかもしれませんが。)
自分なりの現在の解釈としては、こんな感じです。
従来システムのように、Webアプリケーションでデータを収集して、データベースに突っ込んで、必要なデータを抜き出すというのは、データが増えれば増えるほど遅くなってしまう問題がある。
アプリケーション側で検索の工夫やらできるが、そうすることでアプリケーションが複雑になってしまう。
その解決方法として、アプリケーションはシンプルに、データ処理部分をひと工夫しましょうということで、Lambda/Kappa Architectureが登場する。
Lambda Architectureは、Speed Layer, Batch Layer, Serving Layerの3Layerで構成され、リアルタイム処理(Speed)、バッチ処理(Batch)を分けて、閲覧者に提供(Serve)するというアーキテクチャ。
大量のデータをさばくために、ある程度完全さを捨ててリアルタイムに処理する部分と、完全なデータをバッチで処理する部分を分けてバランスとりましょう、という発想でしょうか。
しかし、これに疑問を呈したのが、LinkedIn社のJay Kreps氏。
SpeedとBatchを分けると同じような処理を2回行うことになり、複雑でメンテナンスも大変だ、ということで、Kappa Architectureが登場。
SpeedとBatchをそもそもわけることなく、データ処理部分を並列においてやればできる、という思想。
う~ん、まだまださっぱりわかりません。
また、BigData Processing周りの製品が、Storm、Spark、Kafkaやら、いろいろあって何がどう違うのかがいまいちわからない。
まだまだ、勉強中です。
Expressプロジェクト構成
Node.jsのWeb Application Frameworkと言えば、Expressが使いやすい。
Expressのディレクトリ構成をどうするのが、ベストかと悩んでいたが、参考になるページがあった。
特にrouterとcontrollerの区別に悩んでいたのだが、REST APIなんかと使う場合は、URLでAPI Versionを分けて、同じcontorollerを使うケースもあるだろうから、分けておいてもいいかな、と思った。
あとは、MiddleWareをがんがん入れていく場合は、routerが複雑になりそうなので、controllerと分けておくのもいいかな。
小規模であれば、routerもcontrollerも同じでいいと思うけど。
また、サンプル作ってみて試してみよう。
KeystoneJS
Node.js好きな私ですが、Node.jsベースのCMSがあるらしい。
ExpressとMongoDBというところも最近っぽくていい感じ。
CMSといえば、WordPressが最も有名どころだが、PHPがいまいち好きになれない・・・。
WordPressはちょっとしかさわったことないので、食わず嫌いなところもあります。
CMSと言えば、Concrete5もページをVisualにデザインできていい感じ(ブロックをおいていくようにWebページをデザインできる)なのですが、やはりPHPなのが・・・。
Webページ作成において、やはりPHPは強力なのでしょうか。
でもECMS2015でJavascriptもかなり書きやすくなったし、Server側もFront側も同じ言語で書けるNode.jsベースのWebシステムがどんどん普及すればいいなと思うこの頃です。