<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>技術ブログ &#124; 株式会社クラウディア &#187; JavaScript</title>
	<atom:link href="https://cloudear.jp/blog/?cat=16&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>https://cloudear.jp/blog</link>
	<description>クラウド専門の業務システム・社内ツール開発</description>
	<lastBuildDate>Fri, 12 Nov 2021 05:00:35 +0000</lastBuildDate>
	<language>ja</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.0.1</generator>
	<item>
		<title>Facebookが作ったJavaScriptライブラリ、Reactの威力を体感する</title>
		<link>https://cloudear.jp/blog/?p=1545</link>
		<comments>https://cloudear.jp/blog/?p=1545#comments</comments>
		<pubDate>Thu, 24 Sep 2015 01:03:20 +0000</pubDate>
		<dc:creator><![CDATA[tomo]]></dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[フレームワーク]]></category>
		<category><![CDATA[フロントエンド]]></category>
		<category><![CDATA[プログラム]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=1545</guid>
		<description><![CDATA[今回のエントリでは、最近注目を浴びているJavaScriptライブラリ「React」を取り上げます。 Reactとは Reactはブラウザで動作するWebアプリケーションのUI（ユーザインターフェイス）を担当するJava [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>今回のエントリでは、最近注目を浴びているJavaScriptライブラリ「React」を取り上げます。</p>
<h2>Reactとは</h2>
<p>Reactはブラウザで動作するWebアプリケーションのUI（ユーザインターフェイス）を担当するJavaScriptライブラリです。DOM操作を通して画面の見た目を変えることに特化しています。</p>
<p>Reactの重要な特徴は３つあります。</p>
<p><span id="more-1545"></span></p>
<h3>JSXによるDOM操作の隠蔽</h3>
<p>本来DOM操作は面倒で誤りやすいプログラムを書く必要があのですが、Reactは、JSXというJavaScriptを拡張した言語を提供することで、面倒なDOM操作をプログラマから隠してくれます。</p>
<p>その代わりJSXをJavaScriptに変換するという開発上の手間が必要ですが、JSXはこの手間を上回る利便性を提供してくれます。</p>
<h3>一方向データバインディング</h3>
<p>Reactでは「データ」→「画面（HTML）」という方向でしかデータが流れません。AngularJSなどは画面でユーザの入力を検出したらデータに反映してくれるようですが、Reactはあくまでデータを画面に反映するのみです。</p>
<p>これはプログラムの見通しが良くなる効果がありますし、またReactを使うために覚えることが少なくなるという利点もあります。</p>
<h3>コンポーネント指向</h3>
<p>Reactは画面の部品化を促進します。HTMLの一部をコンポーネントとして切り出し、プロパティやイベントハンドラをコンポーネントの中にまとめて記述出来ます。</p>
<p>これにより、プログラムの記述方法が統一されるという効果や、いわゆるカプセル化による保守性向上が望めます。</p>
<h2>Reactを使ったプログラム</h2>
<p>さてこれ以降は、実際にReactを使ったプログラムを見て行きましょう。今回はHTMLファイルの中にスクリプトを書く方法を使います。</p>
<h3>最小のサンプル</h3>
<p>まずはReactを使ってHello Worldを書いてみます。</p>
<pre class="lang:js decode:true" title="hello_react.html">&lt;!DOCTYPE html&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8" /&gt;
  &lt;title&gt;Hello, React!&lt;/title&gt;
  &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/react.js"&gt;&lt;/script&gt;
  &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/JSXTransformer.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div id="content"&gt;&lt;/div&gt;
  &lt;script type="text/jsx"&gt;

// コンポーネントを定義
var Hello = React.createClass({
    render: function() {
        return (
            &lt;h1&gt;Hello, React!&lt;/h1&gt;
        );
    },
});
// コンポーネントを描画
React.render(&lt;Hello /&gt;, document.getElementById('content'));

  &lt;/script&gt;
&lt;/body&gt;
</pre>
<p>scriptタグのtype属性値が&#8221;text/jsx&#8221;となっていることに注意して下さい。</p>
<p>このサンプルでは、Reactプログラミングで欠かすことの出来ない２つの操作を行っています。</p>
<ul>
<li>コンポーネントを作る：React.createClass関数（&#8221;createClass&#8221;なのに&#8221;コンポーネントを作る&#8221;と表現しているのは大目に見て下さい）</li>
<li>画面に描画する：React.render関数</li>
</ul>
<p>また、Helloコンポーネントのrender関数に注目して下さい。HTMLタグを直接returnしていますね。この書き方を実現しているのが、JSXというJavaScript拡張言語です。</p>
<h2>重要な３つの機能</h2>
<p>驚くべきことに、ReactでWebアプリケーションを作る上で必須なのはたった３つの機能です。</p>
<h3>１．子コンポーネントに属性を指定する</h3>
<p>コンポーネントは入れ子に出来ます。１つのコンポーネントで事が済むことはほとんど無く、いくつかのコンポーネントを組み合わせて画面を作って行くのが通常です。</p>
<p>なおここからのサンプルコードは、HTMLの部分が最小のサンプルと変わりません。ですのでscriptタグの中だけを記載することにします。</p>
<pre class="lang:js decode:true" title="inner.html">// 子コンポーネント
var Child = React.createClass({
    render: function() {
        return (
            &lt;h2&gt;{this.props.text}&lt;/h2&gt;
        );
    }
});
// 親コンポーネント
var Parent = React.createClass({
    render: function() {
        return (
            &lt;div&gt;
                &lt;h1&gt;ここは親です&lt;/h1&gt;
                &lt;Child text="ここは子1です" /&gt;
                &lt;Child text="ここは子2です" /&gt;
            &lt;/div&gt;
        );
    },
});
// 親コンポーネントを描画
React.render(&lt;Parent /&gt;, document.getElementById('content'));
</pre>
<p>ChildとParentという２つのコンポーネントを定義しています。そして親コンポーネントParentのrender関数の中でChildコンポーネントを使っています。render関数の中にはHTMLタグだけでなくコンポーネントを書くことも出来るのです。</p>
<p>重要な機能として、親から子に属性を通して値を渡すことが出来ます。以下の部分です。</p>
<pre class="lang:js decode:true">&lt;Child text="ここは子1です" /&gt;</pre>
<p>Childコンポーネントにtext属性を付けています。一方、Childコンポーネントの中では次のようにしてtext属性値を使っています。</p>
<pre class="lang:js decode:true">return (
    &lt;h2&gt;{this.props.text}&lt;/h2&gt;
);
</pre>
<p>this.propsというオブジェクトを使うことで属性値にアクセス出来ます。</p>
<h3>２．イベントハンドリング</h3>
<p>コンポーネントの属性には関数を渡すことが出来ます。これを利用し、子コンポーネントのイベントを親コンポーネントでハンドリングすることが出来ます。</p>
<pre class="lang:js decode:true" title="event.html">// 子コンポーネント
var Child = React.createClass({
    onClick: function() {
        this.props.onNowButtonClick(new Date());
    },
    render: function() {
        return (
            &lt;div&gt;
                &lt;h2&gt;{this.props.text}&lt;/h2&gt;
                &lt;button onClick={this.onClick}&gt;現在時刻を通知&lt;/button&gt;
            &lt;/div&gt;
        );
    }
});
// 親コンポーネント
var Parent = React.createClass({
    handleNowButtonClick: function(pNow) {
        alert(pNow);
    },
    render: function() {
        return (
            &lt;div&gt;
                &lt;h1&gt;ここは親です&lt;/h1&gt;
                &lt;Child onNowButtonClick={this.handleNowButtonClick} text="ここは子です" /&gt;
            &lt;/div&gt;
        );
    },
});
// 親コンポーネントを描画
React.render(&lt;Parent /&gt;, document.getElementById('content'));
</pre>
<p>親コンポーネントにはイベントをハンドリングする関数handleNowButtonClickが増えました。またChildコンポーネントの属性にイベントハンドリング関数を渡しています。</p>
<p>子コンポーネントは少し複雑です。まずrender関数にbuttonタグを増やしonClick属性に自身のイベントハンドラ関数onClickを渡しています。</p>
<pre class="lang:default decode:true ">&lt;button onClick={this.onClick}&gt;現在時刻を通知&lt;/button&gt;</pre>
<p>そして自身のイベントハンドラ関数の中で、属性に指定された関数onNowButtonClickを実行しています。</p>
<pre class="lang:js decode:true">onClick: function() {
    this.props.onNowButtonClick(new Date());
}</pre>
<h3>３．状態を扱う</h3>
<p>最後の機能は状態を扱うためのものです。次のサンプルではボタンを押す度に画面の時刻表示が変わります。</p>
<pre class="lang:js decode:true" title="state.html">// 子コンポーネント
var Child = React.createClass({
    onClick: function() {
        this.props.onNowButtonClick(new Date());
    },
    render: function() {
        return (
            &lt;div&gt;
                &lt;h2&gt;{this.props.time.toString()}&lt;/h2&gt;
                &lt;button onClick={this.onClick}&gt;現在時刻を通知&lt;/button&gt;
            &lt;/div&gt;
        );
    }
});
// 親コンポーネント
var Parent = React.createClass({
    getInitialState: function() {
        return {
            now: new Date()
        };
    },
    handleNowButtonClick: function(pNow) {
        this.setState({ now: pNow }); // ←ここが重要！状態を更新します
        alert(pNow);
    },
    render: function() {
        return (
            &lt;div&gt;
                &lt;h1&gt;ここは親です&lt;/h1&gt;
                &lt;Child onNowButtonClick={this.handleNowButtonClick} time={this.state.now} /&gt;
            &lt;/div&gt;
        );
    },
});
// 親コンポーネントを描画
React.render(&lt;Parent /&gt;, document.getElementById('content'));
</pre>
<p>親コンポーネントにgetInitialState関数が増えています。この関数はコンポーネントの初期状態を返します。</p>
<pre class="lang:js decode:true">getInitialState: function() {
    return {
        now: new Date()
    };
}</pre>
<p>更にsetState関数を呼び出すことで状態を変更しています。</p>
<pre class="lang:js decode:true ">handleNowButtonClick: function(pNow) {
    this.setState({ now: pNow }); // ←ここが重要！
    alert(pNow);
}</pre>
<p>もう１つ重要な箇所があります。子コンポーネントの属性に親コンポーネントの状態を渡しています。</p>
<pre class="lang:js decode:true">&lt;Child onNowButtonClick={this.handleNowButtonClick} time={this.state.now} /&gt;
</pre>
<p>ReactのすごいところはsetState関数を呼び出すと関連する箇所が自動で書き換わることです。プログラマはコンポーネントを定義し、render関数を書き、setState関数を呼ぶだけ。たったこれだけでWebアプリケーションがきれいに動きます。</p>
<h2>データの更新を伴うサンプル</h2>
<p>最後のサンプルとして、データの更新を伴う画面のコードを載せておきます。画面イメージは次のようになります。</p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/09/3c793e68ff516233740231bf93e5436d.png"><img class="alignnone size-full wp-image-1582" src="https://cloudear.jp/blog/wp-content/uploads/2015/09/3c793e68ff516233740231bf93e5436d.png" alt="スクリーンショット 2015-09-08 18.41.25" width="767" height="556" /></a></p>
<p>このサンプルはHTMLも変わっていますので全文を載せます。手軽に見栄えを良くするためにBootstrapを使っています。</p>
<pre class="lang:js decode:true" title="input.html">&lt;!DOCTYPE html&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8" /&gt;
  &lt;title&gt;ReactによるCRUDアプリ&lt;/title&gt;
  &lt;link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"&gt;
  &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/react.js"&gt;&lt;/script&gt;
  &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.3/JSXTransformer.js"&gt;&lt;/script&gt;
  &lt;style&gt;
    body {
        padding-top: 20px;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div id="content"&gt;&lt;/div&gt;
  &lt;script type="text/jsx"&gt;
// テーブルの各行となるコンポーネント
var Rows = React.createClass({
    onDataRemove: function(pIndex) {
        this.props.onDataRemove({ index: pIndex });
    },
    render: function() {
        // 各行のタグを連結
        var rows = this.props.data.map(function(e, idx) {
            return (
                &lt;tr key={e.id}&gt;
                    &lt;td&gt;{e.title}&lt;/td&gt;
                    &lt;td&gt;{e.content}&lt;/td&gt;
                    &lt;td&gt;
                        &lt;button onClick={this.onDataRemove.bind(this, idx)} className="btn btn-danger"&gt;
                            &lt;i className="glyphicon glyphicon-trash" /&gt;
                        &lt;/button&gt;
                    &lt;/td&gt;
                &lt;/tr&gt;
            );
        }.bind(this));
        // tableタグを作成
        return (
            &lt;table className="table table-striped"&gt;
                &lt;thead&gt;
                    &lt;th&gt;タイトル&lt;/th&gt;
                    &lt;th&gt;内容&lt;/th&gt;
                    &lt;th&gt; &lt;/th&gt;
                &lt;/thead&gt;
                &lt;tbody&gt;
                    {rows}
                &lt;/tbody&gt;
            &lt;/table&gt;
        );
    }
});
// 入力フォームコンポーネント
var Form = React.createClass({
    onAddButtonClick: function(e) {
        // React.findDOMNode関数で入力項目を得ることが出来る
        var title = React.findDOMNode(this.refs.title).value;
        var content = React.findDOMNode(this.refs.content).value;

        // データ追加をイベント通知
        this.props.onDataAdd({ id: (new Date()).getTime(), title: title, content: content });

        e.preventDefault(); // デフォルトの動作をキャンセル
    },
    render: function() {
        return (
            &lt;form&gt;
                &lt;div className="form-group"&gt;
                    &lt;label htmlFor="title"&gt;タイトル&lt;/label&gt;
                    &lt;input ref="title" type="text" className="form-control" id="title" /&gt;
                &lt;/div&gt;
                &lt;div className="form-group"&gt;
                    &lt;label htmlFor="content"&gt;内容&lt;/label&gt;
                    &lt;textarea ref="content" className="form-control" id="content" /&gt;
                &lt;/div&gt;
                &lt;button onClick={this.onAddButtonClick} className="btn btn-primary"&gt;追加&lt;/button&gt;
            &lt;/form&gt;
        );
    }
});
// ルートコンポーネント
var Root = React.createClass({
    getInitialState: function() {
        return {
            data: []
        };
    },
    handleDataAdd: function(e) {
        var data = this.state.data;
        data.push(e);
        this.setState({ data: data });
    },
    handleDataRemove: function(e) {
        var data = this.state.data;
        data.splice(e.index, 1);
        this.setState({ data: data });
    },
    render: function() {
        return (
            &lt;div className="container"&gt;
                &lt;Form onDataAdd={this.handleDataAdd} /&gt;
                &lt;hr/&gt;
                &lt;Rows data={this.state.data} onDataRemove={this.handleDataRemove} /&gt;
            &lt;/div&gt;
        );
    }
});
// ルートコンポーネントを画面に描画
React.render(&lt;Root /&gt;, document.getElementById('content'));
  &lt;/script&gt;
&lt;/body&gt;
</pre>
<p>少し長くなりましたが、各コンポーネントの役割分担がはっきりしている上にHTMLとJavaScriptが１つのコンポーネントの中にまとまっているため、コードの見通しが良く読みやすいと思います。</p>
<p>またJSXのおかげでDOM操作のコードが一切現れていない点に注目して下さい。render関数にテンプレートを書いておけば、DOMを意識する必要がなくなります。</p>
<p>画面は常にデータに対して描画されます。ずれることはありません。またユーザの入力はsetState関数でデータに反映させることで、Reactが文字通りreact（反応）して必要な部分だけが再描画されます。</p>
<p>つまりReactを手にしたプログラマは<span style="color: #ff0000;"><strong>データ操作だけに集中</strong></span>してプログラムすれば良い、ということになります。Reactの真髄はここにあります。</p>
<h2>実戦投入するときには</h2>
<p>本エントリのコードはあくまでサンプルですので、実際にReactを実戦投入するときに、考慮すべきことがあります。</p>
<h3>JSXの事前コンパイル</h3>
<p>本エントリのコードはポータビリティを重視したため、JSXをブラウザでコンパイルしています。しかし実戦では事前にJSXをコンパイルし出力されたJavaScriptをHTMLから参照するようにするべきです。</p>
<p>事前コンパイルにはいくつかの方法がありますが、この解説はまたの機会に譲ることにします。</p>
<h3>サーバサイドレンダリング</h3>
<p>素直にReactを使っていると、HTMLの多くがJavaScriptが実行されるまで描画されないため、体感的にページの描画が遅くなります。そこでReactでは初期画面をサーバサイドでもレンダリング出来る仕組みが備わっています。</p>
<p>サーバサイドレンダリングの詳しい解説もまたの機会に譲ることにします。</p>
<h2>Reactの注意点</h2>
<h3>Reactを通さずDOMを操作するのは厳禁！</h3>
<p>これは、例えばjQueryを使ってDOMを追加／削除／変更することは厳禁！ということです。また、jQueryを通してイベントハンドラを設定することも厳禁です。これはReactが採用している「バーチャルDOM」という仕組みへの配慮です。</p>
<p>DOM操作というのは低速な処理です。そこでReactは、DOMを更新しなければならないときに、バーチャルDOMを使って差分を算出し、実際のDOMは最低限必要な箇所のみ更新する、ということをやっているのです。</p>
<p>ですので、Reactを通さずにDOMを更新してしまうと、バーチャルDOMと実際のDOMに齟齬が出来てしまい、Reactが正しくDOMを更新出来なくなってしまいます。</p>
<p>jQueryに慣れていればいるほど、この制限は辛いものになるでしょう。しかし一度Reactに慣れてしまうと、jQueryの手続き的なDOM操作がとても面倒かつ危険なものに思えてきます。ぜひReactを使ってみてパラダイムシフトを体感していただきたいと思います。</p>
<h2>まとめ</h2>
<p>覚えることが少なくとっつきやすいReact。実績も充分（何せFacebookで使われている！）です。JavaScriptにHTMLを埋め込むのが気持ち悪いと感じる方もいると思いますが、そこを乗り越えればものすごく便利に使えるライブラリです。</p>
<p>SPA（Single Page Application）タイプのWebアプリケーションを作るときは、ぜひ採用を検討してみて下さい。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=1545</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe Edge Animate でアニメーションする</title>
		<link>https://cloudear.jp/blog/?p=967</link>
		<comments>https://cloudear.jp/blog/?p=967#comments</comments>
		<pubDate>Sun, 05 Apr 2015 14:13:31 +0000</pubDate>
		<dc:creator><![CDATA[masa]]></dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[デザイン]]></category>
		<category><![CDATA[フロントエンド]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=967</guid>
		<description><![CDATA[みなさんこんにちは masa です。今日は HTML5 + JavaScript でアニメーションを作れる Adobe 『Edge Animate（エッヂアニメート）』を使って実際アニメーションするところまで取り上げてみ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>みなさんこんにちは masa です。今日は HTML5 + JavaScript でアニメーションを作れる Adobe 『Edge Animate（エッヂアニメート）』を使って実際アニメーションするところまで取り上げてみたいと思います。</p>
<p><span id="more-967"></span></p>
<p><a href="https://cloudear.jp" target="_blank"><strong>まずはこちらのデモをご覧ください。</strong></a></p>
<p>トップ画面においてネットワークに白い光を走らせるアニメーションを作っています。<br />
白い丸を動かすだけなので作業は簡単です！</p>
<p>さて、アドビソフトの購入を CreativeCloud に切り替えて久しいですが、アニメーションオーサリングソフトである『Edge Animate』は現在無料で利用できます。</p>
<p>Flash ほど高機能ではないものの、Illustrator でオブジェクトを作って、それらを組み合わせてアニメーションを組むには良いソフトだと思います。</p>
<p>普段から Adobe系ソフトを使っている人ならすぐにアニメーションは作れると思いますが、意外とその出来上がったアニメーションを貼り付けるのが簡単ではないので、その点も取り上げてみたいと思います。</p>
<p>&nbsp;</p>
<p>まずは CreativeCloud から『Edge Animate （以下、EA）』をインストールします。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/1.png"><img class="alignnone size-full wp-image-969" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/1.png" alt="1" width="490" height="423" /></a></p>
<p>インストールが終わったらソフトを起動しましょう。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/2.png"><img class="alignnone size-full wp-image-970" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/2.png" alt="2" width="1578" height="851" /></a></p>
<p>意外とメニューや画面が少ないと感じるでしょう。EA 内でオブジェクトを作り込む機能はあまりなく、既存の画像を読み込んでそれらを時間軸で配置して動かすというのがメイン作業になります。</p>
<p>今回は既存のトップ画面を読み込んで、その上に白い丸が移動するアニメーションを作成していきます。</p>
<p>ファイル＞新規作成</p>
<p>赤い線で囲った部分で、自由にキャンバスサイズを変更できます。すぐ右は背景なので、クリックして透明にしておくと良いです。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/3.png"><img class="alignnone size-full wp-image-975" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/3.png" alt="3" width="1248" height="564" /></a></p>
<p>&nbsp;</p>
<p>今回はサイズを 1600px × 500px にして背景画像を読み込みました。画像のインポートは「ファイル＞読み込み」からできます。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/4.png"><img class="alignnone size-full wp-image-976" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/4.png" alt="4" width="1401" height="549" /></a></p>
<p>&nbsp;</p>
<p>楕円形ツールで白い小さい丸を画面外に描きました。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/5.png"><img class="alignnone size-full wp-image-977" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/5.png" alt="5" width="554" height="324" /><br />
</a><br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/6.png"><img class="alignnone size-full wp-image-978" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/6.png" alt="6" width="1004" height="488" /></a></p>
<p>&nbsp;</p>
<p>次に赤い線で囲まれたボタンを押して、黄色のゲージを１秒先に進めます。そして、白い丸を動かしたい場所へ移動させます。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/7.png"><img class="alignnone size-full wp-image-980" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/7.png" alt="7" width="649" height="356" /></a></p>
<p>ここまでできたら、Ctrl + Enter を押してみてください。ブラウザが起動してアニメーションが開始します。<br />
確認しながらアニメーションを作りこんでいきます。</p>
<p>最終的には冒頭でご紹介したように白い線が様々にほとばしります。→<a href="https://cloudear.jp" target="_blank">DEMO</a></p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"><strong>  出来上がったアニメーションを自分のページに貼り付ける</strong></span></p>
<p>アニメーションが出来上がったら「ファイル＞名前を付けて保存」で任意の場所に保存します。すると、以下のように複数のファイルが書き出されました。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/8.png"><img class="alignnone size-full wp-image-981" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/8.png" alt="8" width="678" height="277" /></a></p>
<p>上から</p>
<p>・インクルード用 js ファイルが入ったフォルダ<br />
・元画像<br />
・Edge Animation ファイル<br />
・出力用 HTML<br />
・実処理 js<br />
・関数 js</p>
<p>となっていて、なんだかめんどくさい印象・・・</p>
<p>しかし！出力用の HTML を開けばどのようにファイルをインクルードして動かしているかなんとなくつかめるかと思います。</p>
<p>1.　サーバーのドキュメントルートに .an ファイル以外をすべてアップロードします<br />
2.　出力用 HTML にある meta と同じように head 内に meta を書き写す<br />
3.　出力用 HTML にある style を 自分の css ファイルに書き写す<br />
4.　出力用 HTML にある script を自分の HTML ファイルに書き写す<br />
5.　アニメーションを表示したい場所にを書き写す</p>
<p>&nbsp;</p>
<p>これで自分の HTML を開けば、各 js ファイルやイメージをインクルードして、アニメーションが開始されるはずです。</p>
<p>いかでしたか？今日は画面から作ったアニメーションを HTML + JavaScript に書き出してくれる便利なツールをご紹介しました。JavaScript でコードから書くとかなりの労力になりますので、簡単なアニメーションぐらいなら EA を使うのも手だと思います。<br />
みなさんもオリジナルのアニメーションでページを飾ってみてください。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=967</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>『AngularJS』のフィルター機能は使わないほうがいい？</title>
		<link>https://cloudear.jp/blog/?p=672</link>
		<comments>https://cloudear.jp/blog/?p=672#comments</comments>
		<pubDate>Sun, 15 Feb 2015 10:43:24 +0000</pubDate>
		<dc:creator><![CDATA[masa]]></dc:creator>
				<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[フレームワーク]]></category>
		<category><![CDATA[フロントエンド]]></category>
		<category><![CDATA[プログラム]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=672</guid>
		<description><![CDATA[みなさんこんにちは、masa です。前回に続いて AngularJS を取り上げます。いやー AngularJS は奥が深いです。使いこなそうとすればするほどその引き出しの多さに驚かされます。 さて、今日はそんな Ang [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>みなさんこんにちは、masa です。前回に続いて AngularJS を取り上げます。いやー AngularJS は奥が深いです。使いこなそうとすればするほどその引き出しの多さに驚かされます。<br />
<span id="more-672"></span>さて、今日はそんな AngularJS の<strong>フィルター機能</strong>について解説してみたいと思います。</p>
<p>旧来のようにサーバー側でデータを整形してから渡すのではなく、フロントエンド側でデータを受け取ってから整形する方法が AngularJS でいうフィルター機能です。</p>
<p>通常、シングルページアプリケーションを作る際、サーバーサイドの仕事はデータベースを操作してフロントに JSON 形式などでデータを渡すことがメインとなりますが、データの整形はどちらでやるのがいいのか？ということ。</p>
<p>結論から言ってしまうと</p>
<p>&nbsp;</p>
<p><span style="color: #ff99cc; font-size: 14pt;"><strong>配列に対するフィルターは AngularJS でやらないほうがいい</strong></span></p>
<p>&nbsp;</p>
<p>たしかにサーバーサイドは常に生データをフロントに渡すだけにして、HTML 側のタグでちょちょいと整形するのが楽なことは楽です。整形し直したいときにあとでビジネスロジックをいじらなくて済みますし。</p>
<p>しかし、例として以下のロジックを見てください。</p>
<pre class="lang:default decode:true">&lt;div ng-controller="hogeController"&gt;

  &lt;input type="text" ng-model="name"&gt;&lt;br/&gt;
  &lt;button ng-click="memberAdd(name)"&gt;追加します&lt;/button&gt;
  
  &lt;div ng-repeat="member in members"&gt;
    {{member | hogeFilter}}&lt;br/&gt;
  &lt;/div&gt;

&lt;/div&gt;</pre>
<p>ユーザーがテキストボックスに名前を入れて「追加します」ボタンを押すと、members に追加して表示します。そして members すべてに対して hogeFilter というカスタムフィルターを掛けています。</p>
<p>現在、members 配列の要素数が 50 だったとします。（つまりメンバーが50人いる）<br />
この状態で Michael （マイケル氏）をメンバーに追加しようとすると、</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt; color: #ff99cc;"><strong>１文字入力する度に50要素に対してフィルターが発動します</strong></span></p>
<p>&nbsp;</p>
<p>つまり、Michael 7文字すべてを入力した時点で 350 回フィルターが実行されることになります。これは AngularJS が1文字入力される度に、フィルター後のデータを監視しているためです。</p>
<p>これがもっと大きい配列になったりするとブラウザ側の処理がめちゃくちゃ重くなりますので、注意が必要です。もちろん、limitTo や orderBy のようなデータ表示数を絞ったり、ソートするようなものならいいかもしれませんが、普通は SQL でやってしまうと思います・・。</p>
<p>いかがでしたか？個人的にはフィルターはすべてサーバーサイドでやろうかなと思案しています。今後もちょいちょい AngularJS ネタを書いていきたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=672</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「Handsontable」で Web上にテーブルを作成</title>
		<link>https://cloudear.jp/blog/?p=483</link>
		<comments>https://cloudear.jp/blog/?p=483#comments</comments>
		<pubDate>Sun, 25 Jan 2015 05:31:21 +0000</pubDate>
		<dc:creator><![CDATA[masa]]></dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[フロントエンド]]></category>
		<category><![CDATA[プログラム]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=483</guid>
		<description><![CDATA[みなさんは Webアプリケーション上のエディタって使っていますか？今日は Excel ライクなエディタ『Handsontable （ハンズオンテーブル）』をご紹介します。jQuery プラグインなので導入も簡単ですよ！  [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>みなさんは Webアプリケーション上のエディタって使っていますか？今日は Excel ライクなエディタ『Handsontable （ハンズオンテーブル）』をご紹介します。jQuery プラグインなので導入も簡単ですよ！<br />
<span id="more-483"></span><a href="http://handsontable.com/index.html"><br />
</a><img class="alignnone wp-image-539 size-full" src="https://cloudear.jp/blog/wp-content/uploads/2015/01/example_hot.png" alt="example_hot" width="376" height="201" /><a href="http://handsontable.com/index.html" target="_blank"><br />
</a>まずは Handsontable <a title="Handsontable demo page" href="http://handsontable.com/examples.html#fndtn-basic" target="_blank">公式デモ</a>を 開いてみてください。エクセルのような表がありますので、セルをクリックするとリアルタイムに編集できます。例えばこれでエクセルを読み込み、Ajax で通信すれば、Webアプリケーション内でユーザーにリアルタイム編集させることも出来ちゃうわけです。すごい！</p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"> <strong>jQuery プラグイン Handsontable の導入方法</strong></span></p>
<p>まずは <a href="https://github.com/handsontable/handsontable/tree/master/dist" target="_blank">GitHub</a> から 『handsontable.full.js』と『handsontable.full.css』をダウンロードします。次に、使いたい html ファイルのヘッダで上記二つのファイルを読み込みます。</p>
<pre class="lang:default decode:true">&lt;!DOCTYPE html&gt;
&lt;html&gt;

&lt;head&gt;
  &lt;meta charset="utf-8"&gt;
  &lt;title&gt;handsontable_test&lt;/title&gt;
  &lt;link rel="stylesheet" type="text/css" href='css/handsontable.full.css'&gt;
  &lt;script src='js/jquery-1.11.1.min.js'&gt;&lt;/script&gt;   //jQueryもお忘れなく
  &lt;script src='js/handsontable.full.js'&gt;&lt;/script&gt;
&lt;/head&gt;</pre>
<p>&nbsp;</p>
<p>続いて handsontable のスクリプトをヘッダ内に書きます。ちなみに今回はデモのソースを解説します。</p>
<pre class="lang:default decode:true ">&lt;script&gt;
$(document).ready(function () {

  var data = [     //表に流し込むデータを定義します。サーバーからJSONなどで持ってきてもOK
      ['', 'Maserati', 'Mazda', 'Mercedes', 'Mini', 'Mitsubishi'],
      ['2009', 0, 2941, 4303, 354, 5814],
      ['2010', 3, 2905, 2867, 412, 5284],
      ['2011', 4, 2517, 4822, 552, 6127],
      ['2012', 2, 2422, 5399, 776, 4151]
    ],
    container = document.getElementById('example'),  //後ほど表を展開する要素を指定
    hot;
  
  hot = new Handsontable(container, {      //以下はデータ指定と表示オプション
    data: data,            //さっき作ったdataを指定
    minSpareRows: 1,       //表の一番下にいくつ空行を表示するか
    colHeaders: true,      //カラムの名前を表示するかどうか
    contextMenu: true      //セルを右クリックしたときのメニューをすべて表示
  });
  
  
  function bindDumpButton() {    //以下は基本的にいじりません
  
      Handsontable.Dom.addEvent(document.body, 'click', function (e) {
  
        var element = e.target || e.srcElement;
  
        if (element.nodeName == "BUTTON" &amp;&amp; element.name == 'dump') {
          var name = element.getAttribute('data-dump');
          var instance = element.getAttribute('data-instance');
          var hot = window[instance];
          console.log('data of ' + name, hot.getData());
        }
      });
    }
  bindDumpButton();    //関数実行

});
&lt;/script&gt;</pre>
<p>&nbsp;</p>
<p>次は同じ HTML 内に表を展開する要素を書きます</p>
<pre class="lang:default decode:true">&lt;div id="example" class="handsontable"&gt;&lt;/div&gt;</pre>
<p>これで HTML を表示すると公式デモと同じ表が出て、操作可能となるはずです ヾ(´ω｀)ﾉ</p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"> <strong>Ajax を使った応用編</strong></span></p>
<p>最近作ったアプリケーションではサーバーから txt ファイルを読み込み、ユーザーに編集させてまたサーバーへ Ajax で投げ返すということをしました。使った表示オプションやバリデーションもそのまま記載します。</p>
<pre class="lang:default decode:true ">&lt;script&gt;
$(document).ready(function () {
    var data = [
        &lt;c:forEach var="i" items="${ip_list}"&gt; //springフレームワークから配列を読み込み
           {"ipname": "${i}"},                 //jspタグで配列を展開
        &lt;/c:forEach&gt;
           {"": ""}
    ];

    //セルのデータにバリデーションをかけたい場合、正規表現を指定↓
    var ip_regexp = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;

    var msg = document.getElementById("msg");
    var container = document.getElementById('iptext');
    var hot = new Handsontable(container, {
        data: data,
        colWidths: 400,          //カラム幅をピクセル指定
        currentRowClassName: 'currentRow',   //セルフォーカスを使いたい場合指定　後述
        currentColClassName: 'currentCol',   //セルフォーカスを使いたい場合指定　後述
        minSpareRows: 1,         //表の一番下にいくつ空行を表示するか
        contextMenu: true,　     //セルを右クリックしたときのメニューをすべて表示
        rowHeaders: true,        //行の名前を表示
        colHeaders: true,        //カラムの名前を表示
        colHeaders: ['ipname'],  //カラムの名前を指定
        columns: [
            {data: 'ipname', validator: ip_regexp, allowInvalid: false} //バリデ指定
        ],
        afterChange: function (change, source) {   //以下セル編集後の処理
            $.ajax({
                url: "http://192.168.2.1/rest",  //postするエンドポイントを指定
                dataType: "text",   //textデータをpostする(jsonでもOK)
                type: "POST",       //メソッドをPOSTに指定
                data: {data: change[0][2] + "," + change[0][3]}, //変更前&amp;変更後データ
                success: function () {   //以下編集が成功した後の処理
                    msg.innerText = "設定を保存しました。";
                    $(this).delay(1500).queue(function() {
                       msg.innerText = "変更したいIPをダブルクリックして書き変えてください。";
                       $(this).dequeue();
                    });
                }
            });
         }
    });

    function bindDumpButton() {   //以下は基本的にいじりません
        Handsontable.Dom.addEvent(document.body, 'click', function (e) {
          var element = e.target || e.srcElement;
          if (element.nodeName == "BUTTON" &amp;&amp; element.name == 'dump') {
            var name = element.getAttribute('data-dump');
            var instance = element.getAttribute('data-instance');
            var hot = window[instance];
            console.log('data of ' + name, hot.getData());
          }
       });
    }

    bindDumpButton();
});

&lt;/script&gt;</pre>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"> <strong>クリックしたセルを色フォーカスする</strong></span></p>
<p>セルをクリックした時にそのセルをフォーカスさせたい場合は CSS に以下を追記します</p>
<p><strong> (handsontable.full.css)</strong></p>
<pre class="lang:default decode:true">.handsontable .currentRow {
  background-color: #F9F9FB;  //色はご自由に～
}

.handsontable .currentCol {
  background-color: #E7E8EF;  //色はご自由に～
}</pre>
<p>&nbsp;</p>
<p>すると、こんな感じでクリックしたセルがフォーカスされます<br />
<a href="http://handsontable.com/demo/current.html"><br />
</a><a href="http://handsontable.com/demo/current.html" target="_blank"><img class="alignnone wp-image-571 size-full" src="https://cloudear.jp/blog/wp-content/uploads/2015/01/hot2.png" alt="hot2" width="376" height="163" /></a></p>
<p>いかがでしたか？今回は Web 上でエクセルのように表データを編集できる『Handsontable』をご紹介しました。このプラグインにはまだまだオプションがありますので、興味がある方は<a title="Handsontable options" href="https://github.com/handsontable/handsontable/wiki/Options" target="_blank">公式のオプションページ</a>を参考にしてみてください。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=483</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
