今回も引き続き業務デモアプリ開発を通じてhifiveを紹介します。今回は表示のアップデートについてです。
hifiveでは主に2パターンの表示更新が利用できます。一つは直接のDOM書き換え、もう一つはEJSを使った方法です。
DOMの書き換え
まずDOMを書き換える方法です。hifiveではjQueryを読み込んでいるので、これは使い慣れた方法でアップデートできるかと思います。
例えばリストの件数をアップデートする場合です。 js/GridViewerController.js の中で次のようなコードがあります。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| '{rootElement} changeGridDataLengthChange': function(ctx) { | |
| var length = ctx.evArg; | |
| this.$find('.gridDataLength').text(length); | |
| }, |
この this.$findでjQueryが呼び出せます。ちょっとした文字の変更であればこれで対応できます。
EJSを使った方法
hifiveではテンプレートエンジンとしてEJSを採用しています。これを使う場合、まずコントローラでテンプレートを定義します。js/DetailController.jsを参考にすると、詳細画面を表示する際に、
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| this.view.update('{rootElement}', 'purchaseDetail', { | |
| details: details | |
| }); |
と指定します。これはコントローラのルートエレメントに対して、purchaseDetailというテンプレートを適用するという意味になります。テンプレートは template/sample-template.ejs になります。これは js/PageController.js にて定義されています。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| var pageController = { | |
| __name: 'sample.PageController', | |
| __templates: 'template/sample-template.ejs', |
そして、このファイルの中で、id=purchaseDetail で定義されている部分がテンプレートになります。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <script type="text/ejs" id="purchaseDetail"> | |
| <div class="detailScroll"> | |
| [% | |
| var notApprovedIds = []; | |
| for(var i = 0, l = details.length; i < l; i++){ | |
| var detail = details[i]; | |
| if(detail.status !== 'approved') { notApprovedIds.push(detail.id);} | |
| %] | |
| : | |
| </div> | |
| </script> |
view.updateを呼び出すことによって表示を更新できるようになっています。大きな画面の変更であればEJSを使うことで状態の管理などから解放され、HTMLとロジックの分離によるメンテナンス性の維持が臨めるようになるはずです。
hifiveではテンプレートの実装を補助するテンプレートエディタを提供しています。実装しながら、テンプレートの適用結果をすぐに確認することができ、実装の効率化が期待できますので、ぜひ使ってみてください。
画面の表示更新は何かと面倒な処理です。ロジックから分離し、追加開発によっても複雑にならないよう注意しましょう。
今回のコードはGitHubにアップロード されています。また、デモはこちらにて試せます。
hifive 1.2の新機能、FormControllerの使い方を紹介します。
まずデモとして次のようなフォームがあります。このフォームには様々なバリデーション条件がセットしてあります。
https://www.htmlhifive.com/ja/tutorial/validation/
そして画面下部の送信ボタンを押すと、検証結果が表示されます。幾つもエラーが出ていて、そのエラー内容や理由が表示されます。
では実際に検証の方法なのですが、HTMLのdata要素を使って設定できます。
例えば必須指定は以下になります。
<input name="name" type="text" class="form-control" placeholder="名前" data-required />
入力パターン(メールアドレスなど)は次のようになります。
<input name="email" type="text" placeholder="example@example.com" class="form-control" data-required data-pattern=".+@.+" />
数字の入力範囲も指定できます。
<input class="form-controls" type="text" form="form1" name="num0to10" value="0" data-min="[0,true]" data-max="10">
文字数指定は次のように行います。
<input name="pass" type="password" class="form-control" placeholder="Password" data-required data-size="[8,16]" />
そして、実際の入力チェックはJavaScriptを使って次のように行います。機能はもう少しありますが、最低限にしてあります。
var pageController = {
__name: 'sample.PageController',
_formController: h5.ui.FormController,
__meta: {
_formController: {
rootElement: '#form1'
}
}
};
_formControllerにh5.ui.FormControllerを指定するのが重要です。そして、__metaにて_formControllerで用いるルートエレメントを指定します。#form1と指定していますので、HTML側でも次のように記述します。
form内にtype=”submit”のボタンがある場合、ボタンをクリックすると、自動で前述のdata要素で指定した条件に従って入力値チェックを行ってくれます。
他にも、プラグインを指定してエラーの表示方法を変えたり、メッセージを指定したりすることができます。
入力値はサーバ側でも必須ですが、まずJavaScript側でチェックしてしまえば重たいファイルアップロード処理が省けたり、UXも向上します。ぜひ使いこなしてください。
業務システム開発においてCI(継続的インテグレーション)サーバは欠かせなくなっています。自動テストを行ったり、開発用サーバにデプロイするなどといった手順が自動化できるのが魅力です。
今回はそんなCIサーバの中でもオープンソース・ソフトウェアのものをまとめて紹介します。オープンソース・ソフトウェアの場合、特定のプログラミング言語についてサポートされているものが多いので、自分たちのプロジェクトで使っている言語に合わせて選択するのが良さそうです。
Jenkins CI

最も有名なCIサーバです。Javaで作られていますが任意のプログラミング言語に対して自動テストが可能となっています。
Welcome to Jenkins CI! | Jenkins CI
Integrity

Ruby製のCIサーバです。バージョン管理はGitのみサポートしています。
Integrity | Continuous Integration server
strider
node.js/MongoDBによるCIサーバです。Heroku上にもデプロイして使えるのが魅力となっています。
PHPCI

PHP用のCIサーバです。PHP特化型とあって、セットアップの手間なくPHPプロジェクトを自動テストできるようになります。
PHPCI – Continuous Integration for PHP Projects
Concrete

node.jsで書かれたCIサーバです。現在開発を引き継いでくれるメンバーを募集しています。
StyleCI

テストではなくPHPのコーディングスタイルをチェックしてくれるCIサーバです。
CruiseControl.NET

.NET特化型のCIサーバです。意外とクラウド系サービスでは.NET対応は多くありませんので重宝するのではないでしょうか。
Buildbot

Pythonで作られたCIサーバで、WebKitの開発にも使われているそうです。
Go CD

Go向けのCIサーバですが、サーバはJavaで書かれているようです。
Continuous Delivery Software | Continuous Integration | Go CD
いかがでしょうか。CIサーバはクラウドサービスでも数多く出ていますが、Web業務システムとなると外に出しづらいかと思います。そうした場合はCIサーバを内部で立ててテストを行うのが良いでしょう。
Bootstrap
オープンソース・ソフトウェア(MIT)。BootstrapはWebサイト、Webアプリケーションを開発する際のベースデザインとして使えるデザインフレームワークです。プログラマでも手軽に使える反面、カスタマイズの自由度があまり高くないのでデザイナーには嫌がられます。管理画面などに使うのが最適です。以下はボタンなどの画面パーツです。

サポートされているUIパーツが非常に多く、
- グリッド
- 引用(コード)
- テーブル
- メニューバー
- フォーム
- ボタン
- 角丸、丸形などの画像表示
- ボタングループ
- パンくず
- ページネーション
- バッジ
- プログレスバー
- アラート
などが提供されています。また、JavaScriptと組み合わせることで、
- カルーセル
- ドロップダウン
- モーダル
- タブ
- ツールチップ
なども標準で提供されています。カラーテーマやカスタマイズを行うサイトもあり、情報も充実しています。以下の画像はBootstrapで作られたダッシュボード風画面です。

Wijmo 5
商用。業務システムでよく使われる多彩なコントロールを提供しています。グリッド、リストボックスやカラーピッカーなどの各種インプット、チャートやグラフなどがあります。TypeScriptベースで作られており、AngularJSもサポートしています。特に業務システム用に開発されているので、柔軟なカスタマイズと保守性の高さを売りとしています。jQueryなどへの依存性もありません。
以下はグリッドのサンプルです。

他にも細かいUIコンポーネントとして、
- リストボックス
- 入力補完
- メニュー
- カレンダー
- 入力マスク
- カラーピッカー
などが提供されています。データのビジュアライズとして、
- パイチャート
- ゲージ
- 棒グラフ
などに対応しています。
Wijmo 5はモバイルブラウザーをサポートしており、タッチ操作やレスポンシブデザインにも対応しています。

Infagistics
商用。jQuery/HTML5、ASP.NET MVC/WebForms、Windows Forms、WPF、Silverlight、iOS、Android、Xamarin.Formsなど多くのプラットフォームに対応した開発が行えます。UIプロトタイピングツールを使って画面設計を素早く行えるのも特徴です。

SharePoint ServerやOffice 365へのアクセスがサポートされているということもあり、Windows系プラットフォームを厚めにサポートしているようです。
HTML5/JavaScript向けにはAngularJS、KnockoutJS、 Microsoft MVC、Boostrap、Ionic、Onsenといった有名なフレームワークを完全にサポートしており、高度なUIが実現できます。タッチ操作やレスポンシブデザインもサポートされています。UIコントロールについては75種類以上のコンポーネントが提供されています。
データの可視化では、
- データ チャート
- 円チャート
- ドーナツ型チャート
- ファンネル チャート
- ラジアル ゲージ
- スパークライン
- ブレット グラフ
- リニア ゲージ
- マップ
など、数多くのチャートをサポートしています。他にもExcel風のUIも提供されています。デザイナーツールも提供されているので、UIをWebブラウザベースで手軽にデザインできるようになっています(画像は公式サイトより)。

d3.js
オープンソース・ソフトウェア(BSD)。データの可視化ライブラリです。HTML/SVG/CSSを使ってアニメーションもサポートしたグラフ/チャートを表示します。jQueryと同じような使い勝手で高度なチャートを描けるのが特徴です。

以下はサンプルのコードで、指定されたSVGタグの色を変更します。
d3.selectAll("p").style("color", function(d, i) {
return i % 2 ? "#fff" : "#eee";
});
SVGによる表現は多彩なので、単純なグラフやチャートと言った枠を越えた表現が実現できます。

使いこなすのはそうそう簡単ではありませんが、SVGを素のまま使うのに比べると大幅に手間は軽減されるでしょう。その上でjQueryライクにプログラマブルにSVGを扱うと言った目的に最適な選択になるはずです。
three.js
オープンソース・ソフトウェア(MIT)。WebGLを使って3Dオブジェクトを描くのに使われるライブラリです。一般的にWebGLはコードが難解で分かりづらいのですが、JavaScriptで短いコード量で3D描画が実現できます。

WebGLだけでなく、WebVRであったり、CSS3D、レイトレーシングにも対応しています。ごく基本的なコードは次のようになります。
var scene = new THREE.Scene();
var camera = new THREE.PerspectiveCamera( 75, window.innerWidth /
window.innerHeight, 0.1, 1000 );
var renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
var geometry = new THREE.BoxGeometry( 1, 1, 1 );
var material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
var cube = new THREE.Mesh( geometry, material );
scene.add( cube );
camera.position.z = 5;
THREEというグローバルオブジェクトを使って操作していくのが基本になります。以下は別なデモですが、詳細な描画、アニメーションも実現できています。
three.jsもd3.js同様に、HTML5上で提供はされているものの、素のままでは扱いづらいWebGLをJavaScriptから使いやすくしてくれる存在です。ただしWebGLのほぼ全機能を使えるようにしているため、コード量が多くなったり、three.jsの学習コストが大きいのが欠点です。また、WebGLならではのカメラであったり、シェード、3Dといった知識も必要になります。

three.jsはWebGLを扱う上でほぼデファクトとなってきていますので、情報は数多く存在します。関連書籍も多数ありますので、three.jsからWebGLの学習をはじめるという人も多くなっています。
HighCharts
非商用に限り無料。CanvasまたはSVGを使ってグラフ/チャートを描画します。プラグイン機能があり、データエクスポートやポイントをドラッグするような拡張が提供されています。以下の画像は一例です。

主なチャートとしては、
- ラインチャート
- エリアチャート
- 棒チャート
- パイチャート
- バブルチャート
- それらの複合
となっています。また、3Dチャートであったり、ゲージチャートや地図上へのマッピング、ツリーマップ、ヒートマップもできるようになっています。チャートの種類が豊富なので、大抵の要望には適うのではないでしょうか。

使い方としてはjQueryなどと組み合わせて、
$(‘#container’).highcharts({
/* オプション */
});
という形で渡します。オプションは多彩で、細かなカスタマイズを行えるようになっています。
3月10日、hifiveのソースコードリーディングを開催しました。hifive本体のソースコードをはじめ、JavaScriptの周辺テクニックも紹介しました。
今回、特に重視したのは変数のスコープです。JavaScriptでは変数を定義した際のスコープが動作に大きな影響を及ぼします。

hifiveでは、グローバルな変数定義をなるべく避け、h5というオブジェクトだけが定義されています。後はcomposeメソッドを使って開発者が好きな形でコントローラなどを好きな名前でグローバルに定義できるようになっています。
さらに細かなJavaScript開発における注意点であったり、hifiveの中で使われているテクニックを紹介しました。大量のデータをスクロールする場合や、hifive 1.2で実装されたシーン機能なども紹介しました。
後半として、hifiveチームが開発しているSeleniumライブラリであるPitaliumについても紹介しました。Pitaliumは標準のSeleniumで提供されているスクリーンショット撮影機能を拡張し、表示領域全体を撮影できるようにしています。

先日リリースされたPitalium 1.1では横方向のスクロールや、画面の一部が縦スクロールする場合のスクリーンショット撮影もサポートされました。また、今後一部分だけの横スクロールもサポートする予定です。
座学の後は懇親会を開催しました。今回はソースコードリーディングということもあり、ごく限られた方々向けに行われましたが、多くの方に懇親会に参加いただきました。

hifiveでは今後もJavaScriptを使った大型システム開発に対するノウハウを発信していきますので、ぜひご参加ください!
hifiveはオープンソースとして公開されています。コンパイル済みのファイルをダウンロードしてはじめることもできますが、今回は自分でコンパイルしつつ、リポジトリ中にあるデモコードを試す方法を紹介します。
ビルドする
まずはリポジトリをcloneします。
次に関連ライブラリのダウンロードとJavaScriptファイルのビルドを行います。
これでhifiveのJavaScriptファイルなどが生成された状態になります。
外部ライブラリをダウンロードする
次にjQueryをダウンロードします。一緒にデモで必要になるBootstrapをダウンロードします。
続いてBootstrapです。デモは3.3.4となっています(執筆時点での最新版は3.3.6です)。
これで準備が完了しました。
Webサーバを立ち上げる
今回はRubyのワンライナーで確認したいと思います。次のコマンドで8000番ポートのWebサーバが立ち上がります。

いかがでしょうか。自分でビルドするようにすると、より細かく分かれたhifiveのファイル構成や仕組みが掴みやすくなるかと思います。カスタマイズもしやすくなるでしょう。
ぜひお試しください。
Bootstap単体でも開発を行うことは十分にできますが、ユーザインタフェースを考慮すると、予め用意された機能だけでは実装できない場合もあります。
そこで、使ってみたいのが今回紹介するプラグインです。これらのプラグインを使うことで、よりカスタマイズされた画面表示、操作を実現できます。さらに開発工数自体を減らし、優れたユーザーインタフェースをもたらすことでしょう。
ブラウザ内で表を編集できるプラグイン
jQuery-Tabledit
テーブルの内容をその場で編集、削除できます。バリデーション機能もあります。
コードも
$('#example1').Tabledit({
url: 'example.php',
columns: {
identifier: [0, 'id'],
editable: [[1, 'nickname'], [2, 'firstname'], [3, 'lastname']]
}
});
と、これだけで動かせます。このプラグインが同種のものと比較して優れている点は、ボタン押下時の処理が追加しやすいことです。
ライセンスはMIT Licenseです。
editableTableWidget
こちらも同様にテーブルのデータが編集できるようになります。他に比べて優れているのは計算処理も可能ということです。
ライセンスはMIT Licenseです。
フィルタ機能を追加できるプラグイン
Filterable
名前の通り、表にフィルタを挿入できます。
たとえば下図のように

普段は隠れた状態でボタン押下時に入力ボックスが出てきたり、下図の左手ヘッダー「color」のように

フィルタ化したものだけ色が変わるなどの機能があります。ことフィルタについてのUIは他のプラグインより優れたものになっています。
ライセンスはMIT Licenseです。
表の見た目に関するプラグイン
FooTable
画面の大きさに対して臨機応変に表示を変えたいならFooTableを使いましょう。こちらのサンプルにあるように画面サイズ次第で、レスポンシブルに表示を変えてくれます。加えてテーブルへソート、フィルタ、ページネーションを加えることができます。Bootstrapに限らず、通常のテーブルタグにも活用できます。Bootstrap版はこちらからダウンロードしてください。
こちらライセンスはGPL v3です。
tablecloth
Bootstrapで作った表の見た目をより見やすくしたいなら、tableclothが使えます。たった2行のコードだけでホバー時に縦列、横列のハイライト表示をすることができます。
ライセンスはMIT Licenseです。
操作を追加できるプラグイン
navigable-table
テーブルに限らず、グリッドで配置された入力項目をショートカットで簡単に移動できるようにできたり、簡単にセルを挿入できるプラグインがnavigable-tableです。
具体的には、
jump(次の項目にジャンプ)
alt + arrow keys
move(移動)
alt + shift + up/down
insert(行の挿入)
alt + enter (+ shift)
duplicate(行の複製)
alt + d (+ shift)
delete(行の削除)
alt + shift + backspace
といったショートカットでテーブル操作をより快適にします。
ライセンスはMIT Licenseです。
総合的なプラグイン
Table plug-in forjQuery
DataTablesを使うとデータの絞込、ソート、ページングができるようになります。
ライセンスはMIT Licenseです。
有償ライセンスの購入をすればサポートを受けることができます。作成元はSpryMedia 社です。どういったパラメータがあるかはDataTables – Usageが参考になります。
bootstrap-data-table
フィルタ、ページネーション、1ページあたりの表示件数の変更、検索、データの並べ替えなどテーブルに対して多くの機能を追加できます。ページネーションを日本語化する際には多機能テーブルDataTablesを使う | HOS Co.,Ltd.が参考になります。
ライセンスはMIT Licenseです。
まとめ
今回はBootstrapのjQueryプラグイン、特に業務系システムに使えそうなテーブルに関するものを紹介しました。ぜひこれらを皆さんの開発で役立ててください!
HTML5-Webプラットフォーム部の勉強会第11回勉強会 jsアプリ怪獣エレクトロンの育て方と倒し方に参加したので、そちらの内容をレポートします。
実際にElectronで開発を行うにはどのように開発を行うべきかという内容の古川陽介さんによる「Electron アプリの作り方」、古川さんの講演を受けて便利なのはわかったけれど、セキュリティーリスクはどの程度あるかについての内容のはせがわようすけさんによる「Electron の倒し方」、そしてそれらの内容を踏まえた上で実務にElectronを用いた例を示す酒巻瑞穂さんによる「エレクトロン 対 エンタープライズ光線」の3セッションになります。
以下ではこれらについて詳しく内容を紹介します。
Electron アプリの作り方
登壇者:古川陽介さん(Node.js 日本ユーザーグループ代表)
ElectronのできあがるまでのElectronの概要、すごさ、そして今後学習するにあたり参考にすべき資料について説明がありました。
Electronの概要ですが、
- Electronとはクロスプラットフォームアプリ
- もともとはatom用に作られたもの
- 似たようなプロジェクト(NW.js)があったが、限界を感じて新たに作られたのが始まり
- 中身はnode.jsとRenderer processとChromiumを利用
Electronのすごさについては
- 直接ライブラリーを読み込める
- クロスプラットフォームで読み込める
- 見た目もクロスプラットフォーム化できる(たとえば、photonkitで使えば、Mac OSX風にできる。
- 事例が豊富
参考にすべき資料
また、登壇者の古川さんがelectronicaという簡易ブラウザができるチュートリアルを作成しており、これを通じて一通り学ぶことができます。
質疑応答
Q:セキュリティーはどこで担保されてる?
A:まだ担保されてないので、みんな気を付けよう。細かなことは次の登壇者はせがわようすけさんのブログが詳しい
Q:デバッグのやり方は?
A:devetoolsというのが使えるのでそれを活用するのがいい
Electron の倒し方
はせがわようすけさん(セキュアスカイ・テクノロジー)
当日発表資料:PDF
発表内容
Electronのセキュリティについての話。
セキュリティ面は従来のブラウザに比べてだいぶ危ういので、もしも開発したいならば気合を入れろとのことです。脆弱性が入らないように注意して欲しいとのこと。
HTML5では iframe sandbox というタグができたのでこれを活用することで多少セキュリティーの問題は緩和されるとのこと。
質疑応答
Q:なんとかなりそうですか?
A: 今は真剣にみんな取り組んでいるように思えない
Q:この脆弱性から考えて、Atomなどの脆弱性をつくことは可能?
A:それは答えられない
Q:開発時のセキュリティー面の注意は?
A:気合でつくってください。私は社内アプリでしか使いたくない
Q:はせがわさんならどこから攻める?
A:ソース以外からの被害が最近増えている。データの入力源を攻める
エレクトロン 対 エンタープライズ
酒巻 瑞穂さん (グロースエクスパートナーズ株式会社)
実際に業務に用いられた経験をもとにエレクトロンの魅力および注意点についての発表。導入編、開発編、検証編、運用編、最後に感想という構成でした。
導入するなら、
- 最後まで責任を持てるか
- 手離れしやすいか
- キャッチアップをしっかりできるか
という視点が必要とのこと。
開発については、Node.jsなど今までの技術を流用できることが魅力。
ただし、
- クロスオリジン問題
- DOMを維持するライブラリの場合、特殊なエスケープが必要
- Mainとrenderの2つの処理が動いているので混乱する
- npm -g electronという全く別のツールがある
- Windowsのサポートは7から
などの注意が必要とのことです。
検証については「省力化」を目指した結果、導入コストは「Web Driverのテストに比べたら安く済んだ」とのこと。運用については、更新頻度が2週間に一回行われるのでその点注意が必要。
結論として、同様のインフラができているなら、無理にElectronを利用する必要はない。配信インフラが整ってないなら、Electronにこだわる必要はないが、取り入れる価値はある。
具体的に導入効果がありそうなところとして
- 常駐アプリケーション
- 既存ウェブシステムの延長
が有効だと思われるとのこと。逆に既存資産を置き換えるのは現実的じゃないとのこと。
まとめとしては開発は良いけれど運用は怖い、自動化構築は割と大変、ある程度重要な機能と自動化投資のバランスが大事と語られていました。
そして、前の「Electron の倒し方」の発表を受けて、内製なら有効とのことでした。
感想
やはり「Electron の倒し方」の発表の内容が強烈すぎて、外向きのシステムを作るには開発者全員が怖がるという状態になってしまいました。
ただ、内部システムで使うにはNode.jsなどの技術を転用できることから外に繋がないシステムならば可能性はあるという印象です。
Google ChromeのDevToolsは拡張機能を作るのに重宝しますが、標準で提供されているもの以外にも機能拡張によってより便利なツールになります。
今回は特に各種JavaScriptフレームワーク向けに提供されている機能拡張を紹介します。これらを使うことで開発がよりスピードアップするはずです。
ビルド
フレームワーク用
AngularJS
Backbone.js
jQuery
Three.js
言語拡張
有名なフレームワークやライブラリであれば大抵拡張機能が存在するようです。これらを使うことでインスペクタが深く追えるようになったり、専用のタブを使って処理を解析できるようになります。Three.jsのようにグラフィックスが高度なライブラリに対しても有効と言えるでしょう。
JavaScriptを使った開発の際にはぜひこれらの機能拡張を組み合わせて生産性を高めてください!









