<?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; フロントエンド</title>
	<atom:link href="https://cloudear.jp/blog/?cat=33&#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>レスポンシブデザインを導入するための手順</title>
		<link>https://cloudear.jp/blog/?p=1697</link>
		<comments>https://cloudear.jp/blog/?p=1697#comments</comments>
		<pubDate>Wed, 14 Oct 2015 01:29:56 +0000</pubDate>
		<dc:creator><![CDATA[nakanishi]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[フロントエンド]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=1697</guid>
		<description><![CDATA[レスポンシブウェブデザインの基礎知識と、実際に導入する際の手順をご紹介します。 レスポンシブデザインって？ 現在では、さまざまなデバイスが登場していますよね。例えば、ひとくちにスマホと言ってもディスプレイサイズはさまざま [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>レスポンシブウェブデザインの基礎知識と、実際に導入する際の手順をご紹介します。</p>
<h2>レスポンシブデザインって？</h2>
<p>現在では、さまざまなデバイスが登場していますよね。例えば、ひとくちにスマホと言ってもディスプレイサイズはさまざま。このように多岐に渡るディスプレイサイズに対応するために、レスポンシブウェブデザインを採用しているウェブサイトが増えてきました。</p>
<p><span id="more-1697"></span></p>
<p>レスポンシブウェブデザインとは、さまざまなディスプレイサイズに対応するためのウェブ技術のこと。簡単に言うと、ディスプレイサイズによって適用するCSSを切り替えます。これによって、ユーザーが使っているデバイスごとに、最適なレイアウトでウェブページが表示されるのです。</p>
<div id="attachment_1745" style="width: 1059px" class="wp-caption alignnone"><img class="wp-image-1745" src="https://cloudear.jp/blog/wp-content/uploads/2015/09/135b6cb9783184281c3c474fc0589adb.png" alt="レスポンシブウェブデザインのイメージ図" width="1049" height="699" /><p class="wp-caption-text">デバイスごとに異なるスタイル（CSS）を適用させる</p></div>
<p>レスポンシブウェブデザインのメリット・デメリットをまとめておきましょう。</p>
<h3>メリット</h3>
<ul>
<li>デバイスによらず同一のコンテンツを提供できる</li>
<li>SEOに強い</li>
<li>シェアに強い</li>
<li>保守管理が楽になる</li>
</ul>
<h3>デメリット</h3>
<ul>
<li>ページの表示に時間がかかる（場合がある）</li>
<li>制作工数・コストがかかる（場合がある）</li>
</ul>
<p>レスポンシブウェブデザインの最大のメリットは、全てのユーザーに同一のコンテンツを提供できることですね。また、SEOやシェアに強いことでも知られています。レスポンシブウェブデザインでは各ページのHTMLファイルが一つなので、Googleによるインデックスがばらけないことが理由です。</p>
<p>一方で、つくり方によっては制作コストがかさんだり、ページの表示スピードが遅くなることもあります。メリット・デメリットを把握した上で、うまく活用していきたいものですね。</p>
<h2>レスポンシブデザイン導入の手順</h2>
<p>レスポンシブデザインを導入する方法はいくつかありますが、今回はCSS3のmedia queryを利用した手順をご紹介していきましょう。</p>
<h3>ステップ１．ブレークポイントを指定する</h3>
<p>レスポンシブデザインのポイントは、デバイスのディスプレイサイズによってCSSを切り替えること。CSSファイルを別個に用意してもいいですし、一つのCSSファイル内にまとめてもかまいません。</p>
<p>さて、CSSを切り替える方法ですが、CSS3から追加されたmedia queryを使います。例えば、下記のように記述すれば、iPad（縦、ランドスケープ）に対してのみ適用させるCSSを記述することができます。</p>
<p>&nbsp;</p>
<pre class="lang:css decode:true">@media only screen
    and (min-device-width: 768px)
    and (max-device-width: 1024px)
    and (orientation: portrait) {
    /* CSS */
}</pre>
<p>&nbsp;</p>
<p>レスポンシブデザインを上手く構築するには、ディスプレイサイズごとに的確にCSSを分けることです。適用するCSSを切り替える「ブレークポイント」を、正確に指定することが肝要です。</p>
<h3>ステップ２．CSSスタイルを記述する</h3>
<p>次に、上で設定した各画像サイズごとに、スタイルを記述します。コツとしては、リキッドレイアウトでデザインすることです。各要素の横幅をpx（ピクセル）指定で固定するのではなく、%（パーセント）指定を使って可変レイアウトにしておきましょう。</p>
<p>スタイルの可変指定が漏れてしまっていると、その要素が原因となってレイアウト崩れ（要素がはみ出てしまったり）を起こしてしまうことがあります。画像のサイズ指定については特に注意が必要なので、よく配慮しましょう。</p>
<h3>ステップ３．viewportを指定する</h3>
<p>さて、CSSの準備ができたら、HTMLから読み込みましょう。なおステップ１ではCSS内でスタイルを切り替えましたが、HTMLファイルから読み込むCSSファイルを切り替えることも可能です。デバイスごとにCSSファイルを用意している場合は、この方法でスタイルを適用させましょう。</p>
<pre class="lang:default decode:true ">&lt;link rel="stylesheet" media="screen and (min-device-width: 768px) and (max-device-width: 1024px) and (orientation: portrait)" href="ipad-portrait.css" /&gt;</pre>
<p>&nbsp;</p>
<p>最後に、viewportで表示領域を指定して完了です。</p>
<pre class="lang:default decode:true">&lt;meta name="viewport" content="width=device-width; initial-scale=1.0" /&gt;</pre>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=1697</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thymeleafの「xml.sax.SAXException」を回避する方法</title>
		<link>https://cloudear.jp/blog/?p=1719</link>
		<comments>https://cloudear.jp/blog/?p=1719#comments</comments>
		<pubDate>Wed, 30 Sep 2015 01:05:59 +0000</pubDate>
		<dc:creator><![CDATA[masa]]></dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[フレームワーク]]></category>
		<category><![CDATA[フロントエンド]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=1719</guid>
		<description><![CDATA[みなさんこんにちは masa です。Java のフレームワークは何かと Spring ばかり触っていますが、久しぶりにプロジェクトをやってみると忘れてしまってる事ばかり（汗 Spring をやっている方ならテンプレートエ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>みなさんこんにちは masa です。Java のフレームワークは何かと Spring ばかり触っていますが、久しぶりにプロジェクトをやってみると忘れてしまってる事ばかり（汗</p>
<p>Spring をやっている方ならテンプレートエンジンは Thymeleaf をお使いだと思いますが、以前ハマったポイントを記事に書き忘れていたので今回備忘録として残しておきます。</p>
<p><span id="more-1719"></span></p>
<p><span style="font-size: 12pt;"><strong>HTML を書き終わり、プロジェクトをビルドして画面を開こうとすると・・・エラーが発生</strong></span></p>
<pre class="theme:dark-terminal lang:default decode:true ">2015-09-29 22:47:58.030 ERROR 3372 --- [tp2117193231-14] o.thymeleaf.templateparser.ErrorHandler  : [THYMELEAF][qtp2117193231-14] Fatal error during parsing

org.xml.sax.SAXParseException: The element type "link" must be terminated by the matching end-tag "&lt;/link&gt;".
	at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
	at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
（以下スタックトレース）
</pre>
<p>&nbsp;</p>
<p><span style="font-size: 14pt; color: #ff0000;"><strong>Thymeleaf の HTML 解析は XMLチェックが走るため、閉じタグを省略したような書き方だと弾かれます。</strong></span></p>
<p>これをどうにかしないといつまでたっても画面自体が表示されません。今さら HTML を書き直すのはさすがに厳しいので以下の手順で回避しましょう。</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt;"><strong>1．Thymeleaf のパース（構文解析）設定をゆるく変える</strong></span></p>
<p>Thymeleafの設定をクラスを使って変えることもできますが、今回は application.properties ファイルを作って設定を入れてみます。<br />
以下のように src/main/resources 直下に、空の application.properties ファイルを作ってください。</p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/09/thl1.png"><img class="alignnone size-full wp-image-1721" src="https://cloudear.jp/blog/wp-content/uploads/2015/09/thl1.png" alt="thl1" width="406" height="526" /></a></p>
<p>&nbsp;</p>
<p>その中に以下の設定を書いて保存します。</p>
<pre class="theme:dark-terminal lang:default decode:true ">spring.thymeleaf.mode=LEGACYHTML5
spring.thymeleaf.cache=false
spring.thymeleaf.encoding=UTF-8</pre>
<p><strong>テンプレートモードを「LEGACYHTML5」へ変更してやることで HTML 解析がゆるくなります。<br />
ひきつづき次の手順2．に進んでください。</strong></p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt;"><strong>2．NekoHTML ライブラリを入れる</strong></span></p>
<p>今回 Maven から NekoHTML を入れる方法をご紹介します。ちなみに NekoHTML は HTMLパーサーです。<br />
ネコというネーミングが気になりますが・・・。</p>
<p>Maven の pom.xml に以下を追記</p>
<pre class="lang:default decode:true ">&lt;dependency&gt;
  &lt;groupId&gt;net.sourceforge.nekohtml&lt;/groupId&gt;
  &lt;artifactId&gt;nekohtml&lt;/artifactId&gt;
  &lt;version&gt;1.9.22&lt;/version&gt;
&lt;/dependency&gt;</pre>
<p>ライブラリを入れるために一度プロジェクトをビルドしてください。</p>
<p>&nbsp;</p>
<p>これで Thymeleaf のパーサーがゆるい設定に変わりますので、あとはいつもどおりプロジェクトを実行してください。パーサーチェックが通って画面が無事表示されるはずです。</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt;"><strong>おまけ</strong></span></p>
<p>そういえば前にクラスから Thymeleaf の設定をしようとして書いたコードが残っていました。<br />
実行しても設定が変わらなかったのでどなたか解決策をご存知でしたら教えてくださいｗ</p>
<pre class="lang:default decode:true">@Configuration
public class ThymeleafConfig {
    @Bean
    public ThymeleafViewResolver thymeleafViewResolver() {
        ServletContextTemplateResolver servletContextTemplateResolver = new ServletContextTemplateResolver();
//        servletContextTemplateResolver.setPrefix("/webapp/templates/");
        servletContextTemplateResolver.setSuffix(".html");
        servletContextTemplateResolver.setTemplateMode("LEGACYHTML5");
        servletContextTemplateResolver.setCharacterEncoding("UTF-8");
        servletContextTemplateResolver.setCacheable(false);
 
        SpringTemplateEngine springTemplateEngine = new SpringTemplateEngine();
        springTemplateEngine.setTemplateResolver(servletContextTemplateResolver);
 
        ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();
        thymeleafViewResolver.setCharacterEncoding("utf-8");
        thymeleafViewResolver.setTemplateEngine(springTemplateEngine);
 
        return thymeleafViewResolver;
    }
}</pre>
<p>&nbsp;</p>
<p>それでは今日はここまで。Thymeleaf使いの方の一助になれば幸いです。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=1719</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>便利なCSSジェネレーターまとめ</title>
		<link>https://cloudear.jp/blog/?p=1313</link>
		<comments>https://cloudear.jp/blog/?p=1313#comments</comments>
		<pubDate>Sun, 05 Jul 2015 13:50:18 +0000</pubDate>
		<dc:creator><![CDATA[masa]]></dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[デザイン]]></category>
		<category><![CDATA[フロントエンド]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=1313</guid>
		<description><![CDATA[みなさんこんにちは、masa です。今日は CSS を使って装飾する際に便利なジェネレーターをいくつかまとめてみました。 角丸やボタン作成などありますので、お役に立ててください。 　メニューボタンを作りたい CSS Me [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>みなさんこんにちは、masa です。今日は CSS を使って装飾する際に便利なジェネレーターをいくつかまとめてみました。<br />
角丸やボタン作成などありますので、お役に立ててください。</p>
<p><span id="more-1313"></span></p>
<p><span class="hcss1" style="font-size: 14pt;"><strong>　メニューボタンを作りたい</strong></span></p>
<p><a href="http://www.cssportal.com/css-menu-generator/" target="_blank"><span style="text-decoration: underline;">CSS Menu Generetor</span></a><a href="https://cloudear.jp/blog/wp-content/uploads/2015/07/cssg1.png"><br />
</a><img class="alignnone size-full wp-image-1314" src="https://cloudear.jp/blog/wp-content/uploads/2015/07/cssg1.png" alt="cssg1" width="787" height="412" /></p>
<p>&nbsp;</p>
<p><a href="http://www.cssmenubuilder.com/home" target="_blank"><span style="text-decoration: underline;">CSS Menu Builder</span></a><br />
<img class="alignnone size-full wp-image-1315" src="https://cloudear.jp/blog/wp-content/uploads/2015/07/cssg2.png" alt="cssg2" width="637" height="529" /></p>
<p><a href="http://css3button.net/" target="_blank"><span style="text-decoration: underline;">CSS3 Button Generator</span></a><br />
<img class="alignnone size-full wp-image-1319" src="https://cloudear.jp/blog/wp-content/uploads/2015/07/cssg6.png" alt="cssg6" width="649" height="454" /></p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"><strong>　グラデーションを作りたい</strong></span></p>
<p><a href="http://www.css3factory.com/linear-gradients/#remove" target="_blank"><span style="text-decoration: underline;">CSS Gradient Generator</span></a></p>
<p><img class="alignnone size-full wp-image-1316" src="https://cloudear.jp/blog/wp-content/uploads/2015/07/cssg3.png" alt="cssg3" width="670" height="541" /></p>
<p><a href="http://www.colorzilla.com/gradient-editor/" target="_blank"><span style="text-decoration: underline;">Ultimate CSS Gradient Generator</span></a></p>
<p><img class="alignnone size-full wp-image-1317" src="https://cloudear.jp/blog/wp-content/uploads/2015/07/cssg4.png" alt="cssg4" width="916" height="418" /></p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"><strong>　吹き出しボックスを作りたい</strong></span></p>
<p><a href="http://cssarrowplease.com/" target="_blank"><span style="text-decoration: underline;">CSS ARROW PLEASE</span></a></p>
<p><img class="alignnone size-full wp-image-1318" src="https://cloudear.jp/blog/wp-content/uploads/2015/07/cssg5.png" alt="cssg5" width="865" height="442" /></p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"><strong>　角丸を作りたい</strong></span></p>
<p><a href="http://border-radius.com/" target="_blank"><span style="text-decoration: underline;">CSS Border Radius Generator<br />
</span></a><br />
<img class="alignnone size-full wp-image-1320" src="https://cloudear.jp/blog/wp-content/uploads/2015/07/cssg7.png" alt="cssg7" width="784" height="550" /></p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"><strong>　フォームデザインを作りたい</strong></span></p>
<p><a href="http://livetools.uiparade.com/form-builder.html#" target="_blank"><span style="text-decoration: underline;">Live Tools &#8211; Form Builder<br />
</span></a><br />
<img class="alignnone size-full wp-image-1321" src="https://cloudear.jp/blog/wp-content/uploads/2015/07/cssg8.png" alt="cssg8" width="1042" height="721" /></p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"><strong>　いろいろまとめてやりたい</strong></span></p>
<p><a href="http://www.css3maker.com/" target="_blank"><span style="text-decoration: underline;">CSS3.0 Maker<br />
</span></a><br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/07/cssg9.png"><img class="alignnone size-full wp-image-1322" src="https://cloudear.jp/blog/wp-content/uploads/2015/07/cssg9.png" alt="cssg9" width="1021" height="565" /></a></p>
<p>&nbsp;</p>
<p>いかがでしたか？今日は CSS デザイン時に使えるジェネレーターを独断と偏見で選んでみました。みなさんのデザイン制作の一助にしていただければ幸いです。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=1313</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.htaccess でよくやる処理まとめ</title>
		<link>https://cloudear.jp/blog/?p=1304</link>
		<comments>https://cloudear.jp/blog/?p=1304#comments</comments>
		<pubDate>Sun, 28 Jun 2015 12:37:27 +0000</pubDate>
		<dc:creator><![CDATA[masa]]></dc:creator>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[サーバー]]></category>
		<category><![CDATA[フロントエンド]]></category>
		<category><![CDATA[プログラム]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=1304</guid>
		<description><![CDATA[みなさんこんにちは masa です。今日はサーバー側の話です。よく .htaccess でリダイレクトしたり、wwwあり・なし統一などやりますが、よくやり方を忘れて都度調べ直してしまうことがあります。 今日はよく使う . [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>みなさんこんにちは masa です。今日はサーバー側の話です。よく .htaccess でリダイレクトしたり、wwwあり・なし統一などやりますが、よくやり方を忘れて都度調べ直してしまうことがあります。</p>
<p><span id="more-1304"></span></p>
<p>今日はよく使う .htaccess の処理をまとめてみます。</p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"><strong> URLをwwwありに統一</strong></span></p>
<pre class="theme:dark-terminal lang:default decode:true">RewriteEngine on
RewriteCond %{HTTP_HOST} ^hoge\.jp
RewriteRule (.*) http://www.hoge.jp/$1 [R=301,L]</pre>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"><strong> URLをwwwなしに統一</strong></span></p>
<pre class="theme:dark-terminal lang:default decode:true">RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.hoge\.jp
RewriteRule (.*) http://hoge.jp/$1 [R=301,L]</pre>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"><strong> http → httpsリダイレクト(301)</strong></span></p>
<pre class="theme:dark-terminal lang:default decode:true">RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://hoge.jp/$1 [R=301,L]</pre>
<p>&nbsp;</p>
<p><strong><span class="hcss1" style="font-size: 14pt;"> co.jp → jpリダイレクト(301)</span></strong></p>
<pre class="theme:dark-terminal lang:default decode:true ">RewriteEngine On
RewriteCond %{HTTP_HOST} ^hoge.co.jp
RewriteRule ^(.*) http://hoge.jp/$1 [R=301,L]</pre>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"><strong> Basic認証</strong></span></p>
<pre class="theme:dark-terminal lang:default decode:true ">#vim .htaccess
--------------------------
AuthUserFile     /var/www/html/.htpasswd   //絶対パス
AuthName     "IDとパスを入れてね"  //メッセージ表示
AuthType     Basic
require     valid-user
--------------------------

#htpasswd -c /var/www/html/.htpasswd hogeuser  //ユーザー名を末尾に入れる
任意のパスワードを2回入力</pre>
<p>&nbsp;</p>
<p><strong><span class="hcss1" style="font-size: 14pt;">UserAgentにより振り分け </span></strong></p>
<pre class="theme:dark-terminal lang:default decode:true ">RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} (iPhone|Android)  //iPhoneとAndroidからのアクセスを振り分け
RewriteRule ^$ /iphone/ [R]   //上記のユーザーは /iphone/ のコンテンツを見せる</pre>
<p>&nbsp;</p>
<p><strong><span class="hcss1" style="font-size: 14pt;"> CGI実行許可</span></strong></p>
<pre class="theme:dark-terminal lang:default decode:true ">RewriteEngine on
Options +ExecCGI
AddType text/html cgi
AddHandler cgi-script cgi</pre>
<p>&nbsp;</p>
<p>いかがでしたか？簡単ではありますが、よく使う .htaccess の処理をまとめてみました。ちょっと備忘録的になりましたが、みなさんの一助になれば幸いです。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=1304</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WP Social Bookmarking Light のいいね！を FaceBook ページにする</title>
		<link>https://cloudear.jp/blog/?p=1293</link>
		<comments>https://cloudear.jp/blog/?p=1293#comments</comments>
		<pubDate>Sun, 21 Jun 2015 14:08:52 +0000</pubDate>
		<dc:creator><![CDATA[masa]]></dc:creator>
				<category><![CDATA[フロントエンド]]></category>
		<category><![CDATA[プログラム]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=1293</guid>
		<description><![CDATA[みなさんこんにちは、masa です。今日は WordPress のソーシャルボタンでもっとも人気のあるプラグイン『wp-social-bookmarking-light』でいいね！を FaceBook ページにする方法を [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>みなさんこんにちは、masa です。今日は WordPress のソーシャルボタンでもっとも人気のあるプラグイン『<strong>wp-social-bookmarking-light</strong>』でいいね！を FaceBook ページにする方法をご紹介します。</p>
<p><span id="more-1293"></span></p>
<p>やり方は簡単です。まずはプラグイン設定画面から facebook_like を有効にします。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/06/wpsb1.png"><img class="alignnone size-full wp-image-1294" src="https://cloudear.jp/blog/wp-content/uploads/2015/06/wpsb1.png" alt="wpsb1" width="931" height="611" /></a></p>
<p>&nbsp;</p>
<p>次に以下のファイルを開きます。</p>
<pre class="lang:default decode:true ">wp-content/plugins/wp-social-bookmarking-light/modules/services.php</pre>
<p>&nbsp;</p>
<p>facebook_like 関数の中の <strong>data-href= </strong>に任意のフェイスブックページ URL を入れます（15行目、16行目）</p>
<pre class="lang:default decode:true">    function facebook_like()
    {
        $options = wp_social_bookmarking_light_options();
        $layout = $options['facebook_like']['layout'];
        $action = $options['facebook_like']['action'];
        $share = $options['facebook_like']['share'] ? 'true' : 'false';
        $width = $options['facebook_like']['width'];
        $locale = $options['facebook']['locale'];
        $version = $options['facebook']['version'];
        $fb_root = $options['facebook']['fb_root'] ? '&lt;div id="fb-root"&gt;&lt;/div&gt;' : '';
       
        if($version == "html5"){
            return $this-&gt;link_raw( $fb_root
                                    .'&lt;div class="fb-like" '
                                    //.'data-href="'.$this-&gt;url.'" '  コメントアウトして下記入力                               
                                      .'data-href="https://www.facebook.com/pages/%E6%R3/3501101347" '
                                    .'data-layout="'.$layout.'" '
                                    .'data-action="'.$action.'" '
                                    .($width != "" ? 'data-width="'.$width.'" ' : '')
                                    .'data-share="'.$share.'" '
                                    .'data-show_faces="false" &gt;'
                                    .'&lt;/div&gt;');
        }</pre>
<p>&nbsp;</p>
<p>すると、いいね！の対象が、指定したフェイスブックページに変更されます↓<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/06/wpsb2.png"><img class="alignnone size-full wp-image-1298" src="https://cloudear.jp/blog/wp-content/uploads/2015/06/wpsb2.png" alt="wpsb2" width="764" height="211" /></a></p>
<p>&nbsp;</p>
<p>いかがでしたか？今日はソーシャルボタンプラグインのいいね！の対象をフェイスブックページへ変更する方法をご案内しました。WP Social Bookmarking Light はもっともメジャーなプラグインだと思いますので、プラグインをお使いの方に今回の記事が参考になれば幸いです。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=1293</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Font Awesome で簡単にアイコンを導入する</title>
		<link>https://cloudear.jp/blog/?p=1270</link>
		<comments>https://cloudear.jp/blog/?p=1270#comments</comments>
		<pubDate>Sun, 14 Jun 2015 12:10:53 +0000</pubDate>
		<dc:creator><![CDATA[masa]]></dc:creator>
				<category><![CDATA[デザイン]]></category>
		<category><![CDATA[フォント]]></category>
		<category><![CDATA[フロントエンド]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=1270</guid>
		<description><![CDATA[みなさんこんにちは、masa です。今日は CSS でアイコンを表現する Font Awesome (フォントオーサム) の使い方を紹介したいと思います。画像を使わないので、スマートフォン向けにも導入しやすいと思います。 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>みなさんこんにちは、masa です。今日は CSS でアイコンを表現する Font Awesome (フォントオーサム) の使い方を紹介したいと思います。画像を使わないので、スマートフォン向けにも導入しやすいと思います。<br />
<span id="more-1270"></span></p>
<p><a href="http://fortawesome.github.io/Font-Awesome/" target="_blank"><img class="alignnone size-full wp-image-1273" src="https://cloudear.jp/blog/wp-content/uploads/2015/06/fontawesome1.png" alt="fontawesome1" width="1186" height="487" /></p>
<p></a><a href="http://fortawesome.github.io/Font-Awesome/" target="_blank"><img class="alignnone size-full wp-image-1283" src="https://cloudear.jp/blog/wp-content/uploads/2015/06/fontawesome4.png" alt="fontawesome4" width="1078" height="405" /></a></p>
<p>&nbsp;</p>
<p>ローカルで使う場合は上記公式サイトの Download から落として解凍してください。</p>
<p>サーバー上ですぐに使う場合は以下コマンドを実行して /css などお使いのディレクトリにファイルを入れてください。バージョンは新しくなっているかもしれないので、適宜バージョンの番号は変えてください。</p>
<pre class="theme:dark-terminal lang:default decode:true "># wget http://fortawesome.github.io/Font-Awesome/assets/font-awesome-4.3.0.zip
# unzip font-awesome-4.3.0.zip
</pre>
<p>&nbsp;</p>
<p>fonts ディレクトリと css ファイルだけをドキュメントルートにコピーしてください。以下のような構成になっていれば問題ありません。</p>
<pre class="lang:default decode:true ">/var/www/html/fonts
/var/www/html/css/font-awesome.css
/var/www/html/css/font-awesome.min.css   //minファイルが不要であれば消してください</pre>
<p>&nbsp;</p>
<p>次は html ファイルの head タグで以下のようにしてください。</p>
<pre class="lang:default decode:true ">&lt;head&gt;
  &lt;link rel="stylesheet" type="text/css" href="css/font-awesome.css"&gt;
  &lt;link rel="stylesheet" type="text/css" href="css/font-awesome.min.css"&gt; //不要なら消し(ry
&lt;/head&gt;</pre>
<p>&nbsp;</p>
<p>これでアイコンフォントを使えるようになりました。早速使ってみましょう。基本的な使い方は <i> タグの中の class に使いたいアイコンを書きます。</i></p>
<pre class="theme:dark-terminal lang:default decode:true ">&lt;i class="fa fa-twitter fa-lg"&gt;&lt;/i&gt;&lt;/a&gt;

// fa は fontawesome のクラスを表す必須記述
// fa-twitter はアイコン名　ここに使いたいアイコン名を入れて使う
// fa-lg はアイコンのサイズ指定　サイズは以下の中から指定可能

なし  ：100%
fa-lg : 133%
fa-2x : 200%
fa-3x : 300%
fa-4x : 400%
fa-5x : 500%</pre>
<p>&nbsp;</p>
<p>上記サンプルだとこのようにツイッターのアイコンが出ました。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/06/fontawesome3.png"><img class="alignnone size-full wp-image-1281" src="https://cloudear.jp/blog/wp-content/uploads/2015/06/fontawesome3.png" alt="fontawesome3" width="973" height="46" /></a></p>
<p>その他のアイコンについては公式サイトの<a href="http://fortawesome.github.io/Font-Awesome/icons/" target="_blank"><strong>アイコン一覧</strong></a>を見て、指定してくださいね。</p>
<p>&nbsp;</p>
<p>いかがでしたか？今日は画像を使わずにアイコンを導入できる Font Awesome の使い方をご紹介しました。2015年6月現在で <strong>519個 </strong>のアイコンが使えます。アイコンフォントを提供しているサービスは他にもあるのですが、今のところ一番数が多いのはこの Font Awesome だと思います。みなさんも簡単に使えるアイコンフォントでサイトを飾ってみてくださいね。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=1270</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jenkinsでレポート出力　Cobertura &amp; Findbugs &amp; CheckStyle</title>
		<link>https://cloudear.jp/blog/?p=1171</link>
		<comments>https://cloudear.jp/blog/?p=1171#comments</comments>
		<pubDate>Sun, 31 May 2015 11:45:50 +0000</pubDate>
		<dc:creator><![CDATA[masa]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[インフラ]]></category>
		<category><![CDATA[フロントエンド]]></category>
		<category><![CDATA[プログラム]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=1171</guid>
		<description><![CDATA[みなさんこんにちは、masa です。今回は Jenkins でカバレッジレポートと静的解析レポートを出力する方法を取り上げてみたいと思います。まだ Jenkins が入っていないよという方は以前の記事を参照に入れてみてく [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>みなさんこんにちは、masa です。今回は Jenkins でカバレッジレポートと静的解析レポートを出力する方法を取り上げてみたいと思います。まだ Jenkins が入っていないよという方は<a title="Jenkins のインストール方法" href="https://cloudear.jp/blog/?p=765" target="_blank">以前の記事</a>を参照に入れてみてくださいね。</p>
<p><span id="more-1171"></span></p>
<p>みなさんは Jenkins を使う目的は何ですか？おそらく大多数の方は <strong>git pull → ビルド→ サーバーへデプロイ</strong>  というサイクルで使用されているのではないでしょうか。</p>
<p>Jenkins にはプラグインが数百とあるので他にもできることはたくさんあるのですが、<strong>レポートを出す機能を使うことでプロダクトコードの品質を高める一助になります。</strong></p>
<p>&nbsp;</p>
<p><strong><span class="hcss1" style="font-size: 14pt;"> そもそもカバレッジとか静的解析レポートってなに？</span></strong></p>
<p>カバレッジレポートというのは全体のコードに対してテストがどれくらい完了したか、テスト進捗を表すものです。<br />
静的解析というのはソース中にバグを発生させるようなコードや、非効率な書き方がないかなどを調べて、コードを強化するためのものです。</p>
<ul>
<li><strong>Cobertura</strong> (<span style="font-size: 8pt;">コベルトゥーラ)     </span>：　カバレッジレポート</li>
<li><strong>FindBugs              　        </strong>：　静的解析レポート（バグチェック中心）</li>
<li><strong>CheckStyle                      </strong>：　静的解析レポート（コーディング規約チェック中心）</li>
</ul>
<p>&nbsp;</p>
<p><span style="font-size: 14pt;"><strong>Cobertura 画面</strong></span><a href="https://cloudear.jp/blog/wp-content/uploads/2015/05/jenkins-3.png"><img class="alignnone size-full wp-image-1184" src="https://cloudear.jp/blog/wp-content/uploads/2015/05/jenkins-3.png" alt="jenkins-3" width="1363" height="685" /></a></p>
<p><strong><span style="font-size: 14pt;">FindBugs 画面</span></strong><br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/05/jenkins-5.png"><img class="alignnone size-full wp-image-1185" src="https://cloudear.jp/blog/wp-content/uploads/2015/05/jenkins-5.png" alt="jenkins-5" width="1363" height="681" /></a></p>
<p><strong><span style="font-size: 14pt;">ChechkStyle 画面</span></strong><br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/05/jenkins-4.png"><img class="alignnone size-full wp-image-1186" src="https://cloudear.jp/blog/wp-content/uploads/2015/05/jenkins-4.png" alt="jenkins-4" width="1363" height="679" /></a></p>
<p>&nbsp;</p>
<p><strong><span class="hcss1" style="font-size: 14pt;"> 早速 Jenkins のレポート機能を追加する</span></strong></p>
<p>3つのレポートですが、<span style="text-decoration: underline;">Jenkins からプラグインを入れればすぐに使えるというわけではありません</span>。まずは Mavenプロジェクトの pom.xml に以下を追記して各プラグインをインストールします。</p>
<p><strong><span style="font-size: 14pt;"><span style="font-size: 12pt;">pom.xml</span>  </span></strong>※各プラグインのバージョンは適宜変えてください</p>
<pre class="lang:default decode:true">    &lt;build&gt;
        &lt;plugins&gt;
            &lt;plugin&gt;
                &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
                &lt;artifactId&gt;cobertura-maven-plugin&lt;/artifactId&gt;
                &lt;configuration&gt;
                    &lt;formats&gt;
                        &lt;format&gt;html&lt;/format&gt;
                        &lt;format&gt;xml&lt;/format&gt;
                    &lt;/formats&gt;
                    &lt;instrumentation&gt;
                    &lt;/instrumentation&gt;
                &lt;/configuration&gt;
            &lt;/plugin&gt;
        &lt;/plugins&gt;
        &lt;pluginManagement&gt;
            &lt;plugins&gt;
                &lt;plugin&gt;
                    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
                    &lt;artifactId&gt;cobertura-maven-plugin&lt;/artifactId&gt;
                    &lt;version&gt;2.6&lt;/version&gt;
                    &lt;configuration&gt;
                        &lt;executions&gt;
                            &lt;execution&gt;
                                &lt;phase&gt;package&lt;/phase&gt;
                                &lt;goals&gt;
                                    &lt;goal&gt;cobertura&lt;/goal&gt;
                                &lt;/goals&gt;
                            &lt;/execution&gt;
                        &lt;/executions&gt;
                    &lt;/configuration&gt;
                &lt;/plugin&gt;
                &lt;plugin&gt;
                    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
                    &lt;artifactId&gt;maven-checkstyle-plugin&lt;/artifactId&gt;
                    &lt;version&gt;2.14&lt;/version&gt;
                &lt;/plugin&gt;
                &lt;plugin&gt;
                    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
                    &lt;artifactId&gt;findbugs-maven-plugin&lt;/artifactId&gt;
                    &lt;version&gt;3.0.0&lt;/version&gt;
                    &lt;executions&gt;
                        &lt;execution&gt;
                            &lt;phase&gt;compile&lt;/phase&gt;
                            &lt;goals&gt;
                                &lt;goal&gt;findbugs&lt;/goal&gt;
                            &lt;/goals&gt;
                        &lt;/execution&gt;
                    &lt;/executions&gt;
                &lt;/plugin&gt;
            &lt;/plugins&gt;
        &lt;/pluginManagement&gt;
    &lt;/build&gt;
    &lt;reporting&gt;
        &lt;plugins&gt;
            &lt;plugin&gt;
                &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
                &lt;artifactId&gt;findbugs-maven-plugin&lt;/artifactId&gt;
                &lt;configuration&gt;
                    &lt;effort&gt;Max&lt;/effort&gt;
                    &lt;xmlOutput&gt;true&lt;/xmlOutput&gt;
                &lt;/configuration&gt;
            &lt;/plugin&gt;
            &lt;plugin&gt;
              &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
              &lt;artifactId&gt;maven-checkstyle-plugin&lt;/artifactId&gt;
              &lt;version&gt;2.14&lt;/version&gt;
              &lt;reportSets&gt;
                &lt;reportSet&gt;
                  &lt;reports&gt;
                    &lt;report&gt;checkstyle&lt;/report&gt;
                  &lt;/reports&gt;
                &lt;/reportSet&gt;
              &lt;/reportSets&gt;
            &lt;/plugin&gt;
        &lt;/plugins&gt;
    &lt;/reporting&gt;</pre>
<p>&nbsp;</p>
<p>次に Jenkins の管理画面から各プラグインをインストールします。</p>
<p><strong>Jenkinsトップ＞Jenkinsの管理＞プラグインの管理＞利用可能タブ＞フィルター</strong></p>
<p>以下を検索してインストール</p>
<ul>
<li>cobertura</li>
<li>findbugs</li>
<li>checkstyle</li>
</ul>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/05/jenkins-6.png"><img class="alignnone size-full wp-image-1189" src="https://cloudear.jp/blog/wp-content/uploads/2015/05/jenkins-6.png" alt="jenkins-6" width="1363" height="685" /></a></p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"><strong> 各レポート機能を有効にする</strong></span></p>
<p><strong>1．プロジェクトの中の「設定」からビルド方法を指定する</strong></p>
<ul>
<li>ビルド＞ゴールとオプションに以下を入力<br />
clean cobertura:cobertura</li>
</ul>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/05/goal_option.png"><img class="alignnone size-full wp-image-1235" src="https://cloudear.jp/blog/wp-content/uploads/2015/05/goal_option.png" alt="goal_option" width="910" height="334" /></a></p>
<p>&nbsp;</p>
<p><strong>2．プロジェクトの中の「設定」から以下を変更する</strong></p>
<ul>
<li>Checkstyle警告の集計にチェック入れる</li>
<li>FindBugs警告の集計にチェックを入れる</li>
<li>ビルド後の処理&gt;Cobertura カバレッジ・レポートの集計&gt;Cobertura XMLレポート パターンに以下を入力<br />
**/target/site/cobertura/coverage.xml</li>
</ul>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/05/jenkins-7.png"><img class="alignnone size-full wp-image-1190" src="https://cloudear.jp/blog/wp-content/uploads/2015/05/jenkins-7.png" alt="jenkins-7" width="979" height="673" /></a></p>
<p>&nbsp;</p>
<p>以上でプロジェクトがビルドされるとレポートを見るリンクが現れて、ビルドに対する各レポート結果が見れるようになります。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/05/jenkins-2.png"><img class="alignnone size-full wp-image-1191" src="https://cloudear.jp/blog/wp-content/uploads/2015/05/jenkins-2.png" alt="jenkins-2" width="1363" height="681" /></a></p>
<p>&nbsp;</p>
<p>いかがでしたか？今日は Jenkins の便利なレポート機能について導入方法をご紹介しました。個人的にオススメは FindBugs です。日本語で自分のコードの欠点がすぐに確認できるのは楽しいです。みなさんもプロダクト品質向上の一助にレポート機能を追加してみてください。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=1171</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selenium WebDriver で UIテストをプログラム化</title>
		<link>https://cloudear.jp/blog/?p=1066</link>
		<comments>https://cloudear.jp/blog/?p=1066#comments</comments>
		<pubDate>Sun, 03 May 2015 06:45:58 +0000</pubDate>
		<dc:creator><![CDATA[masa]]></dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[フロントエンド]]></category>
		<category><![CDATA[プログラム]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=1066</guid>
		<description><![CDATA[みなさんこんにちは、masa です。前回は GUI 画面からブラウザ操作を記録して再生できる Selenium Builder をご紹介しましたが、今回はプログラムからブラウザ操作する Selenium WebDrive [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>みなさんこんにちは、masa です。前回は GUI 画面からブラウザ操作を記録して再生できる Selenium Builder をご紹介しましたが、今回はプログラムからブラウザ操作する <strong>Selenium WebDriver（セレニウムウェブドライバー）</strong> を使って UIテストします。<br />
<span id="more-1066"></span></p>
<p>Selenium WebDriver が対応している言語は<strong> Java, C#, Ruby, Python, Node.js</strong> ですが、php-webdriver-bindings といったサードパーティのライブラリを使えば <strong>PHP</strong> でも書けるようになります。</p>
<p>今回は Java からブラウザテストを実行していきます。</p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"><strong> Java 用ライブラリをダウンロード</strong></span></p>
<p><strong><a href="http://www.seleniumhq.org/download/" target="_blank">Seleniumダウンロードサイト</a></strong>の赤丸で囲ったところをクリックするとライブラリの詰まった zip ファイルがダウンロードできます。<a href="https://cloudear.jp/blog/wp-content/uploads/2015/05/swd1.png"><img class="alignnone size-full wp-image-1070" src="https://cloudear.jp/blog/wp-content/uploads/2015/05/swd1.png" alt="swd1" width="1315" height="843" /></a></p>
<p>&nbsp;</p>
<p>デスクトップにダウンロードしたら、zip ファイルを解凍しましょう。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/05/swd2.png"><img class="alignnone size-full wp-image-1071" src="https://cloudear.jp/blog/wp-content/uploads/2015/05/swd2.png" alt="swd2" width="851" height="516" /></a></p>
<p>解凍が終わったら、お使いの Java IDE から一般的な Java プロジェクトを作成して、<strong>selenium-java-2.45.0.jar</strong> と libsフォルダの中の<strong> jar ファイル</strong>をすべてライブラリとして読み込みます。（画面は NetBeans）<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/05/swd3.png"><img class="alignnone size-full wp-image-1072" src="https://cloudear.jp/blog/wp-content/uploads/2015/05/swd3.png" alt="swd3" width="330" height="742" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 14pt;"><strong>さっそくブラウザを開いて特定のサイトにアクセスしてみる</strong></span></p>
<p>おもむろに以下のコードを書いて実行してみてください。</p>
<pre class="lang:default decode:true">package seleniumwebdrivertest;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

/**
 *
 * @author masa
 */
public class SeleniumWebDriverTest {

    public static void main(String[] args) {
        WebDriver driver = new FirefoxDriver();
        driver.get("https://cloudear.jp");
    }
    
}</pre>
<p>FireFox が起動して弊社のサイトが表示されます（宣伝？ｗ）</p>
<p>ここから作りこんでファイルをダウンロードしたりフォームを埋めて送信したり、テストを書いていくわけです。一から書き込んでいくのは大変なので、前回取り上げた Selenium Builder で操作を記録して、エクスポートしたファイルを調整していくのが良いかと思います。（参照： <a title="Selenium Builder で UIテストを高速化" href="https://cloudear.jp/blog/?p=1042">Selenium Builder で UIテストを高速化</a>）</p>
<p>いかがでしたか？今日はプログラムから UIテストを自動実行する Selenium WebDriver というライブラリをご紹介しました。日々、フロントエンドのテストに追われているエンジニアの方の一助になれば幸いです。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=1066</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selenium Builder で UIテストを高速化</title>
		<link>https://cloudear.jp/blog/?p=1042</link>
		<comments>https://cloudear.jp/blog/?p=1042#comments</comments>
		<pubDate>Sun, 26 Apr 2015 14:29:35 +0000</pubDate>
		<dc:creator><![CDATA[masa]]></dc:creator>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[フロントエンド]]></category>
		<category><![CDATA[プログラム]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=1042</guid>
		<description><![CDATA[みなさんこんにちは、masa です。今日は UIテストツール Selenium Builder（セレニウムビルダー） の使い方をご紹介します。Web アプリケーションの会員ログインのテストやお問い合わせフォームの入力・送 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>みなさんこんにちは、masa です。今日は UIテストツール <strong>Selenium Builder（セレニウムビルダー）</strong> の使い方をご紹介します。Web アプリケーションの会員ログインのテストやお問い合わせフォームの入力・送信テストなどを毎回手動で行うのは大変ですよね。<br />
<span id="more-1042"></span></p>
<p><span style="color: #ff0000;"><strong>※2015年5月現在の最新版「Firefox 38.0.1」だと Selenium のエクスポートができないようです。もしお使いの FireFox が最新版である場合は、「<a href="http://osdn.jp/projects/sfnet_portableapps/downloads/Mozilla%20Firefox,%20Portable%20Ed./Mozilla%20Firefox,%20Portable%20Edition%2037.0.2/FirefoxPortable_37.0.2_Japanese.paf.exe/" target="_blank">FireFox Portable版37.02</a>」で Selenium Builder をお試しください。</strong></span></p>
<p>Selenium Builder とは 以前の Selenium IDE の後継にあたる FireFox 用プラグインソフトです。例えばお問い合わせフォームの機能をテストしたいとします。</p>
<ol>
<li>名前を入力</li>
<li>メールアドレスを入力</li>
<li>電話番号を入力</li>
<li>都道府県を選択</li>
<li>住所を入力</li>
<li>送信ボタンをクリック</li>
</ol>
<p>これだけでも何回も手で操作するのはキツイです。Selenium Builder を使えば、手動でやった操作を REC で記録し、何度でも同じ操作を再生することができるのです。</p>
<p>また、記録した操作は Java, PHP, Ruby, Python, C# などのスクリプトに書き出し、Selenium Webdriver を使ってプログラムからテスト実行することもできます。<br />
逆に言えば本来スクリプトで操作内容を書いて SeleniumDriver から実行するのですが、それが大変なので GUI 画面から簡単に出来るようにしたのが、この Selenium Builder なわけです。</p>
<p><strong><span class="hcss1" style="font-size: 14pt;">　Selenium Builder をインストールする</span></strong></p>
<p>まずは FireFox を起動して、<strong><a href="https://saucelabs.com/builder" target="_blank">公式サイト</a>　</strong>からプラグインをダウンロードします。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb1.png"><img class="alignnone size-full wp-image-1048" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb1.png" alt="sb1" width="1398" height="868" /></a></p>
<p>FireFox のプラグインとしてインストールするダイアログが画面がでたらそのままインストール続行してください。インストールが終わるとブラウザの再起動を求められます。</p>
<p>ブラウザ再起動が終わったら FireFox のメニューから「開発ツール」を選択→「Launch Selenium Builder」を選択します<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb2.png"><img class="alignnone size-full wp-image-1049" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb2.png" alt="sb2" width="1398" height="868" /></a></p>
<p>&nbsp;</p>
<p><strong><span class="hcss1" style="font-size: 14pt;">　まずは簡単な操作を記録して再生してみる</span></strong></p>
<p>Selenium Builder が起動したら、Selenium2 のボタンをクリックすると記録がスタートします。<br />
<span style="font-size: 8pt;">※Selenium1 だと旧 SeleniumRC でのスクリプト作成になりますので非推奨</span><br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb3.png"><img class="alignnone size-full wp-image-1050" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb3.png" alt="sb3" width="568" height="640" /></a></p>
<p>ちなみに Slenium 対象のタブはふちが緑色になります。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb4.png"><img class="alignnone size-full wp-image-1051" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb4.png" alt="sb4" width="259" height="91" /></a></p>
<p>&nbsp;</p>
<p>では以下の操作をしてみます。</p>
<p><span style="font-size: 12pt;"><strong>1. Google を開く</strong></span></p>
<p><span style="font-size: 12pt;"><strong>2. 検索バーに「ボラボラ島」と入力</strong></span></p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb5.png"><img class="alignnone size-full wp-image-1053" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb5.png" alt="sb5" width="1593" height="857" /></a></p>
<p>&nbsp;</p>
<p><span style="font-size: 12pt;"><strong>3. 画像検索結果で一番目の写真をクリック</strong></span></p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb6.png"><img class="alignnone size-full wp-image-1054" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb6.png" alt="sb6" width="1593" height="854" /></a></p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 12pt;">4. 操作が終わったら Selenium の画面で「Stop recording」をクリックして記録を止めます。<br />
</span></strong><br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb7.png"><img class="alignnone size-full wp-image-1055" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb7.png" alt="sb7" width="568" height="640" /></a></p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 12pt;">5. 記録した操作を再生します。</span></strong><strong><span style="font-size: 12pt;">Runメニューから「Run test locally」をクリックすると再生が開始されます。</span></strong></p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb8.png"><img class="alignnone size-full wp-image-1056" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb8.png" alt="sb8" width="568" height="640" /></a></p>
<p>自動的に操作されましたか？ちょっと感動しますね。もっと複雑な操作の場合はスクリプトで調整する必要がありますが、ざっくりと雛形を作るにはとても便利なツールだと思います。</p>
<p>最後にこの記録をスクリプトに書き出してみましょう。今回はネイティブな Java にエクスポートしてみます。<br />
Fileメニューから「Export」をクリックします。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb9.png"><img class="alignnone size-full wp-image-1057" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb9.png" alt="sb9" width="568" height="640" /></a></p>
<p>お好きな言語を選択してください。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb101.png"><img class="alignnone size-full wp-image-1061" src="https://cloudear.jp/blog/wp-content/uploads/2015/04/sb101.png" alt="sb10" width="568" height="640" /></a></p>
<p>ちなみにこれが Java で書き出したソースコードです。</p>
<pre class="lang:default decode:true ">import java.util.concurrent.TimeUnit;
import java.util.Date;
import java.io.File;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.*;
import static org.openqa.selenium.OutputType.*;

public class sb {
    public static void main(String[] args) throws Exception {
        FirefoxDriver wd;
        wd = new FirefoxDriver();
        wd.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
        wd.get("https://www.google.co.jp/?gws_rd=ssl");
        wd.findElement(By.id("lst-ib")).click();
        wd.findElement(By.id("lst-ib")).clear();
        wd.findElement(By.id("lst-ib")).sendKeys();
        wd.findElement(By.id("lst-ib")).click();
        wd.findElement(By.id("lst-ib")).sendKeys("\n");
        wd.findElement(By.id("lst-ib")).click();
        wd.findElement(By.id("lst-ib")).clear();
        wd.findElement(By.id("lst-ib")).sendKeys("ボラボラ島");
        wd.findElement(By.id("lst-ib")).click();
        wd.findElement(By.id("lst-ib")).sendKeys("\n");
        wd.findElement(By.name("imgthumb1")).click();
        wd.quit();
    }
    
    public static boolean isAlertPresent(FirefoxDriver wd) {
        try {
            wd.switchTo().alert();
            return true;
        } catch (NoAlertPresentException e) {
            return false;
        }
    }
}</pre>
<p>このスクリプトをいじって Selenium Webdriver でプログラムから実行することも可能です。</p>
<p>いかがでしたか？今日は UIテストツールである Selenium Builder を取り上げてみました。もしこの記事に反響があれば Selenium Webdriver についても書いてみたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=1042</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
