<?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/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>モバイル &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/モバイル/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>モバイルWebのUIを速くする基本テクニックがわかる──Google I/O 2016 High Performance Web UI</title>
		<link>/furoshiki/19276/</link>
		<pubDate>Fri, 08 Jul 2016 00:00:28 +0000</pubDate>
		<dc:creator><![CDATA[川田寛]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[I/0 2016]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[モバイル]]></category>

		<guid isPermaLink="false">/?p=19276</guid>
		<description><![CDATA[こんにちは、ふろしきです！ 私はHTML5 Experts.jpで、過去2年ほどGoogle I/Oの情報を発信し、Web技術の変化についてお伝えしてきました。振り返るとGoogleは、2014年にモバイルWebの提唱と...]]></description>
				<content:encoded><![CDATA[<p>こんにちは、<a href="http://furoshiki.hatenadiary.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ふろしき</a>です！</p>

<p>私はHTML5 Experts.jpで、過去2年ほどGoogle I/Oの情報を発信し、Web技術の変化についてお伝えしてきました。振り返るとGoogleは、2014年に<a href="https://html5experts.jp/furoshiki/8582/" data-wpel-link="internal">モバイルWebの提唱と技術要素の拡大</a>を図り、2015年からは「<a href="http://furoshiki.hatenadiary.jp/entry/2015/06/01/122537" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">RAIL（モバイルWebが目指すべきパフォーマンス指標）</a>」や「<a href="http://myakura.hatenablog.com/entry/2015/11/18/053939" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Progressive Web Apps（アプリのように振る舞うWeb）</a>」といった、モバイルとの親和性が高いWebを作り出すための&#8221;考え方&#8221;を推し進めました。今年2016年は、さらにそれを踏み込んでいったという感じがします。</p>

<p>今回のI/Oで取り上げるのもそのひとつ。毎度お馴染みGoogle Developer Advocateの<a href="https://twitter.com/aerotwist" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Paul Lewis</a>氏による 「<a href="https://events.google.com/io2016/schedule?sid=59ba8126-111e-e611-a517-00155d5066d7#day3/59ba8126-111e-e611-a517-00155d5066d7" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">High performance web user interfaces</a>」です。彼は、モバイルにおいて、時に<strong>アプリのように振る舞うこと</strong>が求められる昨今のWeb、すなわち「Progressive Web Apps」について、UIで起こりがちなパフォーマンス問題と、その改善方法について紹介しています。</p>

<p><img src="/wp-content/uploads/2016/05/31.jpg" alt="31" width="640" height="361" class="alignnone size-full wp-image-19332" srcset="/wp-content/uploads/2016/05/31.jpg 640w, /wp-content/uploads/2016/05/31-300x169.jpg 300w, /wp-content/uploads/2016/05/31-207x117.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>※ この講演、動画無しでは説明が難しかったり、前提知識も多かったりするので、私でかなりアレンジ・要約して紹介しています。より詳細に内容を知りたい場合は、<a href="https://events.google.com/io2016/schedule?sid=59ba8126-111e-e611-a517-00155d5066d7#day3/59ba8126-111e-e611-a517-00155d5066d7" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ソース</a>をみることをオススメします！</p>

<h1>Webは時として、モバイルアプリのような体験が求められる</h1>

<p>モバイルにおいて、ホームスクリーンは重要な場所だ。人々はホームスクリーンから、目的を達成するためのアプリを起動する。Webは、<a href="https://developer.chrome.com/multidevice/android/installtohomescreen" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Add to Homescreen</a>を使うことで、ホームスクリーンからWebサイトへアクセスすることができるようになった。</p>

<p>するとどうなるか。このホームスクリーンをよくみてほしい。どれがWebで、どれがネイティブアプリなのかは見分けがつかないだろう。Google Mapsなんかはネイティブにみえるけれど、他はまったく想像がつかない。しかしこれらが、Google Mapsと同様にネイティブアプリにみえるなら、Webはネイティブアプリのように振る舞うことが求められている。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/eef129cc7f2d6302d8f0c7b0529934c5.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/eef129cc7f2d6302d8f0c7b0529934c5.png" alt="スクリーンショット 2016-06-06 23.14.36" width="640" height="294" class="alignnone size-full wp-image-19582" srcset="/wp-content/uploads/2016/06/eef129cc7f2d6302d8f0c7b0529934c5.png 640w, /wp-content/uploads/2016/06/eef129cc7f2d6302d8f0c7b0529934c5-300x138.png 300w, /wp-content/uploads/2016/06/eef129cc7f2d6302d8f0c7b0529934c5-207x95.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>パフォーマンスモデル、インタラクションモデルの2つによって、Webはモバイルネイティブアプリのような振る舞いをえることができる。Progressive Web Appsを実現することができる。今日はこの2つのモデルのうち、パフォーマンスモデルの話をしたい。</p>

<p>昨年は、<a href="https://twitter.com/paul_irish" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Paul Irish</a>や<a href="https://twitter.com/igrigorik" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ilya Grigorik</a>などの私のチームのメンバーが、「RAIL」というパフォーマンスモデルについて話した。RAILとは、Responseは0.1秒、Animationは16ミリ秒、Idleは50ミリ秒、Loadは1秒で動作すべきというもの。ただ、それを聞いた人々は、たまに勘違いをする。この4つの要素は、どれも全て、最も重要なこととして語ってしまうのだ。それは間違っている。</p>

<p>例えば、Webサイトにおいて、タップした時に求められるのは、4つの要素のうちLoadが重要になる。Idleが重要になることはそこまでない。そして、ホームスクリーンからタップして起動されるProgressive Web Appsでは、ResponseやAnimationが重要になる。Webサイトをつくるのと、Progressive Web Appsをつくるのでは、求められることが違う。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/fa9feaef46461db0ff943d0dcca3099a.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/fa9feaef46461db0ff943d0dcca3099a.jpg" alt="スクリーンショット 2016-06-11 17.19.02" width="640" height="481" class="alignnone size-full wp-image-19663" srcset="/wp-content/uploads/2016/06/fa9feaef46461db0ff943d0dcca3099a.jpg 640w, /wp-content/uploads/2016/06/fa9feaef46461db0ff943d0dcca3099a-300x225.jpg 300w, /wp-content/uploads/2016/06/fa9feaef46461db0ff943d0dcca3099a-207x156.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>さて、このようにパフォーマンス面で求められることが異なるProgressive Web Apps。そこに、3つのコンポーネントがある。Side Navigation、Swipeable Cards、Expand an Collapse。これらを実現するセオリーを紹介しよう。</p>

<h1>1. Side Navigation</h1>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/07/a8b14ec6d320cc19a86bb10650d79c5c.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/07/a8b14ec6d320cc19a86bb10650d79c5c.jpg" alt="スクリーンショット 2016-07-03 22.27.14" width="640" height="385" class="alignnone size-full wp-image-19946" srcset="/wp-content/uploads/2016/07/a8b14ec6d320cc19a86bb10650d79c5c.jpg 640w, /wp-content/uploads/2016/07/a8b14ec6d320cc19a86bb10650d79c5c-300x180.jpg 300w, /wp-content/uploads/2016/07/a8b14ec6d320cc19a86bb10650d79c5c-207x125.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>まずは、このコンポーネント。メニューボタンをタップすると左からスライドインするバー。これは、2つのElementによって構成される。半透明の黒い背景と、サイドメニューを表示する領域だ。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/07/0007f280db2411a1c5629b23c9035c49.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/07/0007f280db2411a1c5629b23c9035c49.jpg" alt="スクリーンショット 2016-07-03 23.18.35" width="640" height="352" class="alignnone size-full wp-image-19959" srcset="/wp-content/uploads/2016/07/0007f280db2411a1c5629b23c9035c49.jpg 640w, /wp-content/uploads/2016/07/0007f280db2411a1c5629b23c9035c49-300x165.jpg 300w, /wp-content/uploads/2016/07/0007f280db2411a1c5629b23c9035c49-207x114.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>このサイドメニューの部分のCSSは非表示の時、CSSに<code>pointer-events: none;</code>を指定する。そして、表示されたタイミングで<code>pointer-events: auto;</code>を指定する。</p>

<p>そしてここからが大事な話。左から右、あるいは右から左に移動させる際に、transformを使う。ブラウザがDOMの位置を変更する際に、CPUを使ったレイアウト変更してはいけない。GPUの力を借りて、描画位置を変更することで、最適なパフォーマンスを得ることができる。</p>

<p>例えば、一昔前。サイドメニューが左に消えている時にCSSは</p>

<p></p><pre class="crayon-plain-tag">.side-nav {
  position:       fixed;
  left:           -102%; /* DOMのレイアウト位置を左にずらしてメニューを隠す */
  top:            0;
  width:          100%;
  height:         100%;
  over-flow:      hidden;
  pointer-events: none;
}</pre><p></p>

<p>と、<code>left: -102%</code>で隠す。これは一般的な方法だった。しかし、描画を高速に処理できるGPUの恩恵を受けたいなら、transformを使って以下のように記述する。</p>

<p></p><pre class="crayon-plain-tag">.side-nav {
  position:       fixed;
  left:           0;                 /* DOMのレイアウト位置は常に0のまま */
  top:            0;
  width:          100%;
  height:         100%;
  over-flow:      hidden;
  pointer-events: none;
  transform:      translateX(-102%); /* 描画の位置を左にずらすことでメニューを隠す */
  will-change:    none;              /* &lt;- これは何！？ */
}</pre><p></p>

<p>サイドメニューのDOMのレイアウト位置としては、x位置の<code>left</code>もy位置の<code>top</code>も、0のまま。横幅<code>width</code>も縦幅<code>height</code>も、100%ということで、全面を覆っているという扱いになる。しかし、<code>transform: translateX(-102%);</code>で描画の位置自体を、左に寄せている。</p>

<p>そして、ここで登場するのが<code>will-chanage: none；</code>だ。</p>

<p>一昔前に<code>transform: translateZ(0);</code>をCSSプロパティに指定して、パフォーマンスを改善するというハックが出回ったのをご存知だろうか。このCSSが指定されると、描画には必然的にGPUの力が必要になるため、強制的にGPUに描画を依頼することになる。GPUの恩恵を受けるために活用されたこのバッドノウハウは、<code>will-chanage: transform；</code>という新しいCSSプロパティをWeb標準として追加することによって、同様のことを実現できるようにした。(※注:実態はブラウザ対応の問題もあり、今も<code>transform: translateZ(0);</code>を使うのが一般的)</p>

<p>ただ、<code>transform: translateZ(0);</code>や<code>will-chanage: transform；</code>といったCSS指定は、常時ビデオカード上のRAMメモリーに描画結果をテクスチャーとして保存することになる。モバイル環境では、バッテリー消費などに悪影響を及ぼすことになる。動作するタイミングだけ<code>will-chanage: transform；</code>を指定し、動作しない時は無効化<code>will-chanage: none；</code>するといい。これが、バッテリー消費パフォーマンスと描画速度パフォーマンスのトレードオフ問題に対する、落とし所だ。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/07/1518b8d765c003f2c4c92df1c282624d.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/07/1518b8d765c003f2c4c92df1c282624d.jpg" alt="スクリーンショット 2016-07-04 0.37.11" width="640" height="479" class="alignnone size-full wp-image-19974" srcset="/wp-content/uploads/2016/07/1518b8d765c003f2c4c92df1c282624d.jpg 640w, /wp-content/uploads/2016/07/1518b8d765c003f2c4c92df1c282624d-300x225.jpg 300w, /wp-content/uploads/2016/07/1518b8d765c003f2c4c92df1c282624d-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>黒背景については、<code>will-change: opacity;</code>というプロパティがあり、transformと同様の方法で、高いパフォーマンスで描画させることができる。(※ JSの実装については、「2. Swipeable Cards」にノウハウが似ているので割愛)</p>

<h1>2. Swipeable Cards</h1>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/07/e80ab460bd4bdf5ce0c4cbeddc8b80d8.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/07/e80ab460bd4bdf5ce0c4cbeddc8b80d8.jpg" alt="スクリーンショット 2016-07-03 22.27.37" width="640" height="386" class="alignnone size-full wp-image-19947" srcset="/wp-content/uploads/2016/07/e80ab460bd4bdf5ce0c4cbeddc8b80d8.jpg 640w, /wp-content/uploads/2016/07/e80ab460bd4bdf5ce0c4cbeddc8b80d8-300x181.jpg 300w, /wp-content/uploads/2016/07/e80ab460bd4bdf5ce0c4cbeddc8b80d8-207x125.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>CSSを使ったパフォーマンス改善のテクニックの他に、注意しなくてはいけないのが、スワイプ操作時のコンポーネントの移動処理。ユーザーからの指の位置状況を入力し、それをスクリーン上に反映しなくてはいけない。この際、有用なのが「ゲームループ」のノウハウだ。</p>

<p>描画のイベントは常に、1/60秒ごとに発生する。対してスワイプのイベントは、常に一定には発生しない。描画のタイミングにはあわせてくれないのだ。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/07/1c83d9b8767367275cca087cc1dd9000.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/07/1c83d9b8767367275cca087cc1dd9000.jpg" alt="スクリーンショット 2016-07-04 1.05.35" width="640" height="364" class="alignnone size-full wp-image-19982" srcset="/wp-content/uploads/2016/07/1c83d9b8767367275cca087cc1dd9000.jpg 640w, /wp-content/uploads/2016/07/1c83d9b8767367275cca087cc1dd9000-300x171.jpg 300w, /wp-content/uploads/2016/07/1c83d9b8767367275cca087cc1dd9000-207x118.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>そこで、スワイプにより発生するイベントについては、変数に位置情報だけを記録する。そして、描画時のイベントでは、記録された位置情報を元に、CSSを通じて描画位置変更をおこなう。</p>

<p>スワイプの開始時・移動時・終了時は以下の通り。<code>this.startX</code>、<code>this.currentX</code>、<code>this.targetX</code>といった変数に、現在の位置や、移動すべき位置を記録している。</p>

<p></p><pre class="crayon-plain-tag">/**
 * スワイプ開始
 */
onStart(evt) {

  // スワイプの開始位置を記録する
  this.startX = evt.pageX || evt.touches[0].pageX;
  this.currentX = this.startX;

  // cardの移動が開始されたことを記録する
  this.draggingCard = true;

  // will-change: transform; を有効にする
  this.target.style.willChange= ‘transform’;

  // カード上の要素にイベントを伝播させないように
  evt.preventDefault();

  // アニメーションを開始する
  requestAnimationFrame(this.update);
}

/**
 * スワイプ移動時
 */
onMove(evt) {

  // スワイプの現在地点を記録する
  this.currentX = evt.pageX || evt.touches[0].pageX;

}

/**
 * スワイプ終了時
 */
onEnd(evt) {

  // cardを削除すべきかどうか判定する
  let translateX = this.currentX - this.startX;
  const threshold = this.cardWidth * 0.35;
  if( Math.abs(translateX) &gt; threshold ) {

    // cardの移動先をスクリーンの外へ(※cardは削除)
    this.targetX = (translateX &gt; 0) ? this.cardWidth : -this.cardWidth;

  } else {

    // cardの移動先を最初の位置へ(※cardは削除されない)
    this.targetX = 0;

  }

  // cardの移動が終了されたことを記録する
  this.draggingCard = false;
}</pre><p></p>

<p>描画のタイミングにrequestAnimationFrameから呼び出されるコールバックで、先ほどの位置情報を元に反映していく。</p>

<p></p><pre class="crayon-plain-tag">/**
 * 描画内容の変更
 */
update(evt) {

  // 次の描画タイミングでも自身を呼び出す
  requestAnimationFrame(this.update);

  // スワイプ中の場合
  if( this.draggingCard ) {

    // 現在の位置を描画させる
    this.translateX = this.currentX - this.startX;

  // スワイプが完了している場合
  } else {

    // カードを削除するかしないかに応じて指定の場所に能動的に移動する
    this.translateX += (this.targetX-this.translateX)/4;

  }

  // CSSプロパティを経由してGPUに変更を伝える
  this.target.style.transform = `translateX(${this.translateX}px)`;
}</pre><p></p>

<p>(※ この後の処理については、「3. Expand and Collapse」にノウハウが似ているので割愛。)</p>

<h1>3. Expand and Collapse</h1>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/07/20934ecb9653e0b4ca6c9b68f442ecef.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/07/20934ecb9653e0b4ca6c9b68f442ecef.jpg" alt="スクリーンショット 2016-07-03 22.27.51" width="640" height="345" class="alignnone size-full wp-image-19948" srcset="/wp-content/uploads/2016/07/20934ecb9653e0b4ca6c9b68f442ecef.jpg 640w, /wp-content/uploads/2016/07/20934ecb9653e0b4ca6c9b68f442ecef-300x162.jpg 300w, /wp-content/uploads/2016/07/20934ecb9653e0b4ca6c9b68f442ecef-207x112.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>タップすると、領域が広がり全体化されるUIコンポーネント。CSSではどうするのか？もちろん、ここまで説明してきた「transform」を活用する！では、JSについてはどうか？実は、「2. Swipeable Cards」とは異なり、スワイプ操作でなくタップによって、自動的にアニメーションする。この点で、より効率的な実装が求められる。</p>

<p>まず、アニメーションについて、動作中の状態はJS上で持たない。動作前後の状態だけを、CSSプロパティを通じてGPUに指示する。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/07/9cac4ec846ad6ecf66df6cfa3fe74323.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/07/9cac4ec846ad6ecf66df6cfa3fe74323.jpg" alt="スクリーンショット 2016-07-04 1.54.47" width="640" height="237" class="alignnone size-full wp-image-19990" srcset="/wp-content/uploads/2016/07/9cac4ec846ad6ecf66df6cfa3fe74323.jpg 640w, /wp-content/uploads/2016/07/9cac4ec846ad6ecf66df6cfa3fe74323-300x111.jpg 300w, /wp-content/uploads/2016/07/9cac4ec846ad6ecf66df6cfa3fe74323-207x77.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p></p><pre class="crayon-plain-tag">// 変化量を計算する
invert.x = first.left - last.left;
invert.y = first.top - last.top;
invert.sx = first.width / last.width;
invert.sy = first.height / last.height;

// 変化後の状態をCSSプロパティを通じてGPUに指示
card.style.transformOrigin = ‘0 0’;
card.style.transform =
    `translate(${invert.x}px, ${invert.y}px)
      scale(${invert.sx}, ${invert.sy})`;</pre><p></p>

<p>そのままでは、タップした要素は一瞬にして全体化されてしまう。どのようにして何ミリ秒もかけて徐々に広げていくか？その方法は、CSSで指定する。JSではない。原理的には、従来よく使われているCSSアニメーションだ。</p>

<p></p><pre class="crayon-plain-tag">.cards {
  transition: transform 0.2s cubic-bezier(0,0,0.3.1); // アニメーションさせる
}</pre><p></p>

<p>ここまで、Progressive Web Applsのパフォーマンス改善の話をしてきたが、「<a href="http://bit.ly/render-perf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google DevelopersのRendering peformance</a>」が役に参考になる。一読するといいだろう。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/07/3969bb8d861ac4399b9de045c3863743.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/07/3969bb8d861ac4399b9de045c3863743.jpg" alt="スクリーンショット 2016-07-04 2.13.00" width="640" height="391" class="alignnone size-full wp-image-19992" srcset="/wp-content/uploads/2016/07/3969bb8d861ac4399b9de045c3863743.jpg 640w, /wp-content/uploads/2016/07/3969bb8d861ac4399b9de045c3863743-300x183.jpg 300w, /wp-content/uploads/2016/07/3969bb8d861ac4399b9de045c3863743-207x126.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h1>Progressive Web Appsのパフォーマンス改善。要はこう言いたかった</h1>

<p>いかがでしたでしょうか？文字数の制限やコンテキストの高さもあり、多くのエンジニアに伝わるようかなりアレンジしてみましたが、ご理解いただけましたでしょうか？</p>

<p><a href="https://twitter.com/aerotwist" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Paul Lewis</a>氏が言いたかったことは単純な話です。先ほどのGoogle Developersの記事にもありますが、Progressive Web AppsにおけるAnimationやReactionの課題は、いかにしてブラウザのレンダリング処理における「レイアウト」を減らすか、という話です。この講演は、そのTIPS集といえます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/07/fc525d40355e9e5ea2564f21ab3a910a.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/07/fc525d40355e9e5ea2564f21ab3a910a.jpg" alt="スクリーンショット 2016-07-04 2.19.41" width="640" height="352" class="alignnone size-full wp-image-20002" srcset="/wp-content/uploads/2016/07/fc525d40355e9e5ea2564f21ab3a910a.jpg 640w, /wp-content/uploads/2016/07/fc525d40355e9e5ea2564f21ab3a910a-300x165.jpg 300w, /wp-content/uploads/2016/07/fc525d40355e9e5ea2564f21ab3a910a-207x114.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>今日のノウハウ、特に新しいというわけでもなく2年前には既に実践されていたことです。実際のところ多くの現場では、OnsenUIやIonicのようなUIライブラリを活用することになり、このあたりの話を意識することはないのでしょう。ただ、Webのサービスを作っているフロントエンドエンジニアにとっては、ライブラリの有無に関係なく知っておくべき知識のように思えます。サイドメニューについては、Webサイトであっても鉄板のUIコンポーネントなので、Progressive Web Appsか否かはもはや関係ないノウハウだったに違いありません。</p>

<p>Webがモバイルに順応していくことは、今後もさらに求められていきます。これは、フレームワークやライブラリに限った話ではなく、トータルにみたWeb、フロントエンドへの要求に変化を与えるに違いません。</p>

<p>今後も、モバイルとWebの関わりに、目が離せませんね。</p>
]]></content:encoded>
			</item>
		<item>
		<title>これからのモバイル向けWeb制作──The Next Generation Mobile Web</title>
		<link>/furoshiki/15144/</link>
		<pubDate>Fri, 26 Jun 2015 01:00:12 +0000</pubDate>
		<dc:creator><![CDATA[川田寛]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google I/O]]></category>
		<category><![CDATA[パフォーマンス]]></category>
		<category><![CDATA[モバイル]]></category>

		<guid isPermaLink="false">/?p=15144</guid>
		<description><![CDATA[連載： Google I/O 2015 特集 (4)最近、モバイルではネイティブ一強という状況にみえます。Webはあまり注目されません。今後も同じ状況が続くのでしょうか？そのことについて、Google I/O 2015の...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/google_io_2015/" class="series-313" title="Google I/O 2015 特集" data-wpel-link="internal">Google I/O 2015 特集</a> (4)</div><p>最近、モバイルではネイティブ一強という状況にみえます。Webはあまり注目されません。今後も同じ状況が続くのでしょうか？そのことについて、Google I/O 2015のセッション「The Next Generation Mobile Web」が参考になります。補足を加えつつ翻訳してみましたので、どうぞご覧ください。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/f29abf68c0f445a56f7dfc2747f2f6d9.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/f29abf68c0f445a56f7dfc2747f2f6d9.jpg" alt="スクリーンショット 2015-06-23 15.13.24" width="640" height="292" class="alignnone size-full wp-image-15669" srcset="/wp-content/uploads/2015/06/f29abf68c0f445a56f7dfc2747f2f6d9.jpg 640w, /wp-content/uploads/2015/06/f29abf68c0f445a56f7dfc2747f2f6d9-300x137.jpg 300w, /wp-content/uploads/2015/06/f29abf68c0f445a56f7dfc2747f2f6d9-207x94.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h1>But What About Mobile</h1>

<p>Webはパワフルな技術だ！これからも、ビジネスをもっと盛り上げていく。2014年、Eコマースは低く見積もっても1.5兆ドルの規模になった。そんな中、モバイルは何を変えたのか？ユーザにどんなインパクトを与えたのか？</p>

<p>モバイルは経済のシフト、デスクトップが担っていた領域の変化だ。パフォーマンスが求められるような動作も、従来のPCとは違い、バッテリーで動いているデバイス上で実現しなくてはいけない。必要とされる機能も完全に変わってしまった。プッシュ通知はモバイルのポテンシャルを高める上で重要なのだが、Webにそれはできなかった。結果、ネイティブの方が当然良く見えるわけだ。</p>

<p><img src="/wp-content/uploads/2015/06/1142563afd4b16f188a4fbcb59137e37.jpg" alt="スクリーンショット 2015-06-23 15.30.34" style="width:320px;float:right;padding-left:10px" class="alignnone wp-image-15673" srcset="/wp-content/uploads/2015/06/1142563afd4b16f188a4fbcb59137e37.jpg 640w, /wp-content/uploads/2015/06/1142563afd4b16f188a4fbcb59137e37-300x185.jpg 300w, /wp-content/uploads/2015/06/1142563afd4b16f188a4fbcb59137e37-207x127.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />しかし、我々は全てをネイティブアプリに置き換えるべきなのだろうか？ネイティブにはいいところがあるけれど、Webもまた負けないいいところがあるはずだ。</p>

<p>みなさんは、Chrome Dev Toolsがどれだけの人に使われているのかご存知だろうか？Androidは400万人/週だが、Dev Toolsは2,500万人/週に使われている。そして、素晴らしいことに、今もなお増加し続けている。全ての人が巨大で複雑なWebサイトを作っているわけじゃないし、中にはあまり上手くWebサイトを作れていない人もいる。けど、少なくともDev Toolsを使っているみなさんは十分にスキルが高い。今からするこの話は、そんなWebを愛する2,500万人のあなたたちに伝えたい。</p>

<h1>Reach</h1>

<p>Webサイトはツリー型だ。例えば以下の図だと、ノードにあたるのが<a href="https://www.pinterest.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Pinterest.com</a>みたいなサイトで、あなたたちのサイトはその葉にあたる。URLからURLへ、ノードから葉へ飛ぶ。異なるサイトであっても、リンクからリンクへ飛ぶことはそんなに難しいことじゃない。サイトの奥地へだって行ける。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/95a6fa84e4c5674d4d394ca513b17a7f.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/95a6fa84e4c5674d4d394ca513b17a7f.jpg" alt="スクリーンショット 2015-06-23 16.59.35" width="640" height="346" class="alignnone size-full wp-image-15677" srcset="/wp-content/uploads/2015/06/95a6fa84e4c5674d4d394ca513b17a7f.jpg 640w, /wp-content/uploads/2015/06/95a6fa84e4c5674d4d394ca513b17a7f-300x162.jpg 300w, /wp-content/uploads/2015/06/95a6fa84e4c5674d4d394ca513b17a7f-207x112.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>人間が使うモバイルアプリは平均12から20と言われている。しかし一方で、アクセスされるWebサイトは、一ヶ月あたり100ドメイン以上だ。それはWebが、リンクを使って簡単にアクセスできるからだ。USにおいて、85%のリテーラーはモバイル上のトラフィックがWeb経由でやってくる。これがWebの持つパワーなのだ。</p>

<h1>Performance</h1>

<p>では、これらのリーチに対して、Webページはどの程度のパフォーマンスが必要なのか？ページの読み込み時間か？いや、それでは十分とは言えない。実際にはもっと様々なメトリクスがある。スクロールだってサクサク動かなくちゃいけないし、アニメーションも60fpsで動かすべきだ。ただ、どんなパフォーマンスをどれぐらい速くすれば十分なのかは、なかなかわからない。</p>

<p>その答えとして「RAIL」というコンセプト挙げている。Reaction、Animation、Idle、Loadの略称だ。RAILでカギとなっている考え方は「When is performance &#8216;Good Enough&#8217;? When the user can&#8217;t perceive it.(十分な速さとは、ユーザがそれを気にしないことだ)」だ。そしてそれを実現するために、60fpsを意味する16.67ミリ秒、100ミリ秒、1秒という時間に注目している。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/4a57d3f075698caef5bacd6807a5b89f.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/4a57d3f075698caef5bacd6807a5b89f.jpg" alt="スクリーンショット 2015-06-23 17.39.31" width="640" height="345" class="alignnone size-full wp-image-15681" srcset="/wp-content/uploads/2015/06/4a57d3f075698caef5bacd6807a5b89f.jpg 640w, /wp-content/uploads/2015/06/4a57d3f075698caef5bacd6807a5b89f-300x162.jpg 300w, /wp-content/uploads/2015/06/4a57d3f075698caef5bacd6807a5b89f-207x112.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>RAILのR、Reaction Timeは、例えば画面にタップするなどのアクションに対して、100ミリ秒未満でリアクションすることを求めている。そうでないと、ユーザはそのアプリが、壊れているだとか遅いだとか感じるだろう。100ミリ秒未満で、ボタンの色を変えたりインジケーターを回したりすれば、フリーズしたようには見えない。</p>

<p>RAILのA、Animation Time。アニメーションは、16.67ミリ秒未満で動作することを求めている。RAILのI、Idle Timeについて。JavaScriptなどでデコードなどの重い処理を行うと、UIが固まってしまう。処理をチャンクを使うなどして分けて、Idleを作り出さなくてはいけない。その期間は50ミリ未満が望ましいだろう。そうすることで、RのReaction Timeの100ミリ秒未満は守られるだろう。</p>

<p>RAILのLは、みなさんもよく知っているLoad Timeだ。これは1秒未満が望ましい。ただ、これに関しては、Service Workerを使えば、読み込み時に動作中であることをユーザに伝えることができる。</p>

<p>Chrome開発チームには現在、約200人程度のエンジニアがいる。そしてその多くは、パフォーマンスを改善するために働いている。モバイルを良くしようと、様々な取り組みを行っている。その全てを深く語るには、時間が足りなさ過ぎている。一つだけ紹介すると、例えば「スケジューラー」。これはパフォーマンスを劇的に変えたと思っている。タスクの優先度が変わったことで、スクロールのパフォーマンスが大きく改善されたのだ。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/2076431dc9f44f8267098fa9046d04a7.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/2076431dc9f44f8267098fa9046d04a7.jpg" alt="スクリーンショット 2015-06-23 18.11.15" width="640" height="338" class="alignnone size-full wp-image-15684" srcset="/wp-content/uploads/2015/06/2076431dc9f44f8267098fa9046d04a7.jpg 640w, /wp-content/uploads/2015/06/2076431dc9f44f8267098fa9046d04a7-300x158.jpg 300w, /wp-content/uploads/2015/06/2076431dc9f44f8267098fa9046d04a7-207x109.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>パフォーマンス改善は、とても難しいことにみえるかもしれない。しかし臆することはない。博士号なんか取得していなくても、ちゃんとできる。Chrome Dev Toolを使って、サードパーティスクリプトであったり、リソースのパフォーマンスを計測して、問題を探るのだ。そして、RAILをゴールとして、パフォーマンス改善を行っていけばよいだろう。</p>

<h1>Engagement</h1>

<p>モバイルWebに欠けていたのは、エンゲージメントだ。しかし今、Webにはエンゲージメントを助けるたくさんの機能がある。ただ同時にそれは、セキュリティ面に大きな課題を抱えている。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/25f283076e8f93dddd3e89c5ee16f730.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/25f283076e8f93dddd3e89c5ee16f730.jpg" alt="スクリーンショット 2015-06-23 19.29.26" width="640" height="344" class="alignnone size-full wp-image-15690" srcset="/wp-content/uploads/2015/06/25f283076e8f93dddd3e89c5ee16f730.jpg 640w, /wp-content/uploads/2015/06/25f283076e8f93dddd3e89c5ee16f730-300x161.jpg 300w, /wp-content/uploads/2015/06/25f283076e8f93dddd3e89c5ee16f730-207x111.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>例えば、background sync(Service Worker)なんかは、Webページを閉じていても簡単にコンテンツの読み込みや送信ができてしまう。あなたが一ヶ月に100のサイトへアクセスするとして、その全てでbackground syncが有効になることは望まないだろう。質の悪いWebページにアクセスしようものなら、Background syncが裏で動き続け、バッテリはどんどん消耗されるなんてこともある。バッテリー効率の悪いネットワーク処理を、ガンガン動かすことが可能だからだ。</p>

<p>誰しも、初対面の相手は簡単には信頼しない。Webサイトオーナーとユーザーとの関係は、ゆっくりと築かれる。ネイティブはアプリのコピーがWebほど簡単ではない。ストアがいて、その開発元も明かされているからだ。しかしWebはオープンだ。パーミッション機能は慎重に作られていなくてはいけない。ユーザに確認して、パーミッションをWebサイト側へ与えることで、初めてリスクの高い機能は使えるようにしている。</p>

<p>さて、これらの機能のうち、有益なものを2つ紹介しよう。</p>

<p>一つ目が「Add to homescreen」だ。例えば興味をもったWebサイトがあったとする。そこに手軽にアクセスしたい。そういう時に、ホームスクリーン上へアイコンを配置しておき、ネイティブアプリのように手軽にアクセスできるようにしておくと、簡単にWebサイトへ飛べる。</p>

<p>実は、古くからそのような機能がブラウザについているのだけれど、設定メニューの中に隠れていたため、手軽では使えなかった。しかし今は、それができるAPIを提供している。これをWebサイト上から呼び出せば、以前より手軽になるだろう。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/a841e301993f92e87426d0e92e435a861.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/a841e301993f92e87426d0e92e435a861.jpg" alt="スクリーンショット 2015-06-23 20.17.32" width="640" height="344" class="alignnone size-full wp-image-15699" srcset="/wp-content/uploads/2015/06/a841e301993f92e87426d0e92e435a861.jpg 640w, /wp-content/uploads/2015/06/a841e301993f92e87426d0e92e435a861-300x161.jpg 300w, /wp-content/uploads/2015/06/a841e301993f92e87426d0e92e435a861-207x111.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>モバイルWebでユーザ体験を高める場合、ネイティブアプリのような、オフライン対応も重要になる。以前は、「App Cache」がその役割を担っていた。しかしそれは、始めること自体は簡単なのだけれど、メンテナンスにやっかいな問題を抱えている。失敗すると、Webサイトは簡単に動かなってしまう。これを改善し、柔軟なコントロールが行えるようにしたのが「Service Worker」だ。</p>

<p>Service Workerはオフラインで動くスクリプトで、Webサイトにアクセスするとまずそこに問い合わせが行われる。Service Workerは何をすべきか判断し、必要であればネットワークを通じてリソースを取得し、キャッシュへ置くことができる。その振る舞いから、クライアントサイドのJavaScriptプロキシなんて呼ばれていたりする。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/369ba25ed1f880652f2c6faf0cfd3efc.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/369ba25ed1f880652f2c6faf0cfd3efc.jpg" alt="スクリーンショット 2015-06-23 20.30.12" width="640" height="343" class="alignnone size-full wp-image-15701" srcset="/wp-content/uploads/2015/06/369ba25ed1f880652f2c6faf0cfd3efc.jpg 640w, /wp-content/uploads/2015/06/369ba25ed1f880652f2c6faf0cfd3efc-300x161.jpg 300w, /wp-content/uploads/2015/06/369ba25ed1f880652f2c6faf0cfd3efc-207x111.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Google I/OのWebサイトなんかが良い例だ。Service Workerを使って、必要な全てのリソースをキャッシュに読み込んでいる。Gulpに「<a href="https://github.com/GoogleChrome/sw-precache" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">sw-precache</a>」というプラグインがある。それを使えば、簡単にService Workerのインテグレーションを、あなたの現場のワークフローへ組み込めるだろう。</p>

<p>Service Workerは、Webページが複数のタブが開かれていても、その全てと通信できる。また逆に、一つも開かれていなくても内部で生存している。それはランダムに起き上がって動くようなことはせず、基本的にはイベント駆動だ。ネットワークなどのイベントを検知して、スクリプトはストレージ内からメモリ上へ移される。だいたい50ミリ秒程度だろうか。その後、Service Workerの処理が実行される。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/07a91e6bb098b31501d1a459fe6f3f2e.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/07a91e6bb098b31501d1a459fe6f3f2e.jpg" alt="スクリーンショット 2015-06-23 20.45.46" width="640" height="345" class="alignnone size-full wp-image-15702" srcset="/wp-content/uploads/2015/06/07a91e6bb098b31501d1a459fe6f3f2e.jpg 640w, /wp-content/uploads/2015/06/07a91e6bb098b31501d1a459fe6f3f2e-300x162.jpg 300w, /wp-content/uploads/2015/06/07a91e6bb098b31501d1a459fe6f3f2e-207x112.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>モバイルであれば、ネイティブアプリのようにプッシュ通知を扱いたい考える事は必然であろう。Anish AcharyaはTechCrunchで「Notification Are The Next Platform(次のプラットフォームは通知だ)」と語っている。通知機能は、エンゲージメントを改革するのだ。</p>

<p>人々がアプリに長く時間を使うのは、人々が通知を受け取るからだ。モバイルの画面を見て、通知を受け取っているのを見て、そこでアプリを使う決断をする。ニュースサイト「<a href="http://www.theguardian.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">The Guardian</a>」はネイティブアプリを提供しているのだが、彼らは事件が起きた時に、そのニュースをプッシュ通知を通じて伝えると、40%のユーザがそこからやってきたそうだ。これはとても多い人数だ。</p>

<p>そんなプッシュ通知だが、今はブラウザから実行できるようになっている。一つの例として、The Guardianのある記事へアクセスした時に、その記事の更新をプッシュ通知を受け取ってみる。</p>

<p>通知の許可を、Webサイト上で行うことができる。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/52aab70da8979c5ed6c1d05556516172.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/52aab70da8979c5ed6c1d05556516172.jpg" alt="スクリーンショット 2015-06-23 20.57.29" width="640" height="342" class="alignnone size-full wp-image-15704" srcset="/wp-content/uploads/2015/06/52aab70da8979c5ed6c1d05556516172.jpg 640w, /wp-content/uploads/2015/06/52aab70da8979c5ed6c1d05556516172-300x160.jpg 300w, /wp-content/uploads/2015/06/52aab70da8979c5ed6c1d05556516172-207x111.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>その後、Chromeを閉じ、ユーザは作業を再開する。そして、記事が更新されると・・・この通り！プッシュ通知が飛んでくる。これは他のネイティブアプリと、同じように扱われている。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/fc0b304a5503fa4bae235cdc919e92e7.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/fc0b304a5503fa4bae235cdc919e92e7.jpg" alt="スクリーンショット 2015-06-23 21.02.02" width="640" height="344" class="alignnone size-full wp-image-15705" srcset="/wp-content/uploads/2015/06/fc0b304a5503fa4bae235cdc919e92e7.jpg 640w, /wp-content/uploads/2015/06/fc0b304a5503fa4bae235cdc919e92e7-300x161.jpg 300w, /wp-content/uploads/2015/06/fc0b304a5503fa4bae235cdc919e92e7-207x111.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>じつは、今サンプルとして紹介したThe Guardianは、今後本当にプッシュ通知を対応させる予定だ。SNSのFacebookや、商品を扱っているebayやticketmasterでも対応する予定だ。今後も増えていくことだろう。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/06/ce366b694a44a99489bf655e5c4cad83.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/06/ce366b694a44a99489bf655e5c4cad83.png" alt="スクリーンショット 2015-06-23 21.18.04" width="640" height="344" class="alignnone size-full wp-image-15708" srcset="/wp-content/uploads/2015/06/ce366b694a44a99489bf655e5c4cad83.png 640w, /wp-content/uploads/2015/06/ce366b694a44a99489bf655e5c4cad83-300x161.png 300w, /wp-content/uploads/2015/06/ce366b694a44a99489bf655e5c4cad83-207x111.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h1>最後に</h1>

<p>いかがでしたか？</p>

<p>Reach、Performance、Engagementは非常に重要であり、これらが効果を上げれば、モバイルWebは上手くいく、というのがGoogleらの答えなようです。</p>

<p>「Web vs ネイティブ」という議論は散々行われてきましたが、彼らはそういう見方をしていないようですね。モバイルの本質を考え、そこからWebの立ち位置を明確化してきたように見えます。</p>

<p>よくよく考えてみたら、モバイルのホームスクリーンはブラウザのブックマーク機能と、そのユースケースに大きな違いはありません。そして、最近のプッシュ通知もまた、アプリの状態を表示するものというよりも、エンゲージメントの高い情報を目立つ所にリスト化しているだけのようにみえます。それはWebのサービスにおいて、メールの通知によって補っていた機能です。いまさら、驚くようなことでもありません。従来デスクトップでもやっていたことを、モバイルのユーザビリティに合わせてきたと捉えられます。</p>

<p>この考え方が、一日でも速く現場にも浸透してほしいですね。そのためにも、「Windows XPの悲劇の再来」にも見えるAndroidのフラグメント化が、一日でもはやく改善してくれることを祈っています。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Google I/O 2015 特集]]></series:name>
	</item>
		<item>
		<title>エンタープライズHTML5とバックエンド─エンタープライズ×モバイルアプリ開発の最新動向(3)</title>
		<link>/masahiro/10518/</link>
		<pubDate>Tue, 09 Sep 2014 00:09:34 +0000</pubDate>
		<dc:creator><![CDATA[田中 正裕]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[MEAP]]></category>
		<category><![CDATA[エンタープライズ]]></category>
		<category><![CDATA[モバイル]]></category>

		<guid isPermaLink="false">/?p=10518</guid>
		<description><![CDATA[連載： エンタープライズ開発特集 (7)前々回、前回と業務アプリのフロントエンドについて主に説明しました。今回は、バックエンドに焦点を当てて説明を行います。 業務アプリの多くは、ブラウザーを通じて利用されるWebアプリ方...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/enterprise/" class="series-197" title="エンタープライズ開発特集" data-wpel-link="internal">エンタープライズ開発特集</a> (7)</div><p><a href="https://html5experts.jp/masahiro/10456/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">前々回</a>、<a href="https://html5experts.jp/masahiro/10470/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">前回</a>と業務アプリのフロントエンドについて主に説明しました。今回は、バックエンドに焦点を当てて説明を行います。</p>

<p>業務アプリの多くは、ブラウザーを通じて利用されるWebアプリ方式で提供されます。この場合、サーバー側でJavaやPHP、Rubyといった言語を用いてサーバーサイドプログラムが実行されます。もちろんHTML5やJavaScriptを用いてリッチなWebアプリを実現することができますが、その場合においてもビジネスロジックのほとんどはバックエンドに記述されてます。</p>

<p>一方、モバイルアプリの世界では、この割合が大きく異なります。たとえば、バックエンドの機能は、フロントエンドと連携するためのAPI機能が中心となります。フロントエンドについては、HTML5で開発しようと、ネイティブで開発しようと、バックエンドから受け取ったデータを表示したり、データを編集してバックエンドに送信するといった機能が必要とされます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/09/backend-diff-e1409629910516.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/09/backend-diff-1024x524.png" alt="Webアプリとモバイルアプリのバックエンドの違い" width="450" class="aligncenter size-large wp-image-10531" /></a></p>

<h2>異なるスキルセットが必要</h2>

<p>処理がバックエンドとフロントエンドに分散する問題点の一つは、アプリ開発のスキルセットが異なることです。フロントエンド開発では、ユーザビリティに関する知識や、HTML5やJavaScriptといった言語の理解が必要となります。一方、バックエンド開発では、ビジネスロジックの理解と、フロントエンド開発とは異なるサーバーサイド言語の知識が必要です。エンジニアが両者を一手に引き受けるのは簡単ではありません。</p>

<p>また、バックエンドにおいても、モバイルアプリに特化した機能を求められるケースがあります。たとえば、任意のタイミングでアプリに情報を送信するプッシュ通知や、App StoreやGoogle Playストアを経由せずにアプリを配信する機能、モバイルアプリからユーザー認証を行う機能などです。これらはネイティブ機能を用いて実現され、フロントエンド側にも対応する機能が実装されている必要があります。</p>

<p>さらに、業務アプリを考える上でバックエンドに求められる最も重要な機能は、既存システムとの接続です。これは、既存の業務システムやイントラネットに配置されたデータベースと連携するために必要です。そのためには、ファイアーウォール内に配置された各種システムにインターネットを経由して接続する仕組みを構築する必要があります。</p>

<p>こういったモバイル特有の課題を実現するために、専用のバックエンドをゼロベースで開発することは非現実的です。そのために、クラウドやパッケージ形式でモバイルバックエンドを提供するソリューションが存在します。これらのソリューションを使うと、フロントエンドの開発者はバックエンドの知識に乏しい場合でも、安全に業務システムに接続したり、モバイルアプリの機能を実現することができます。</p>

<h2>既存システムとの接続</h2>

<p>業務システムの運用では、社内ネットワーク（イントラネット）だけでなく、ハイブリッドクラウドやSaaSといったクラウドサービスを利用しているケース、そして両方を使い分けているような場合も考えられます。まずは、こういった多彩なシステムに対していかに接続するか、という観点が重要になります。</p>

<p>接続先として考えられるのは、ERPやCRMといった基幹系システム、Active DirectoryやLDAPといったユーザー管理システム、グループウェアやメールシステムといった情報系システムが挙げられます。B2Cアプリのバックエンドに求められる、FacebookやTwitterなどのソーシャル連携や、広告配信システムなどとは大きく異なることが分かります。</p>

<div id="attachment_10535" style="width: 864px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/09/cloud.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/09/cloud.png" alt="企業モバイルの典型的な接続先" width="400" class="size-full wp-image-10535" srcset="/wp-content/uploads/2014/09/cloud.png 640w, /wp-content/uploads/2014/09/cloud-300x200.png 300w, /wp-content/uploads/2014/09/cloud-207x138.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a><p class="wp-caption-text">企業モバイルの典型的な接続先</p></div>

<h2>開発後の運用基盤</h2>

<p>また、アプリ運用時の基盤についても考慮する必要があります。具体的には、アプリケーションの配布や更新を管理する機能、ユーザーやデータの権限を管理する機能、そしてエラーログや利用状況などを一元的に把握する機能などが挙げられます。</p>

<p>アプリのインストール数が数万台を超えるB2Cアプリと比べて、B2BやB2Eアプリは数十から数千台が中心となります。端末やアプリ管理を集約することで、運用にかかる工数を抑えることができます。</p>

<h3>MEAPはスモールスタートに向いていない</h3>

<p>モバイルエンタープライズの開発・運用基盤として、これまで中心的な存在であったのはMEAP製品です。MEAPとは、Mobile Enterprise Application Platformの略で、2008年に<a href="http://en.wikipedia.org/wiki/Mobile_enterprise_application_platform" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ガートナー社が提唱した概念</a>です。</p>

<p>MEAPは、エンタープライズ向けモバイルアプリに要求される、長期的な開発～運用を担う総合的なソリューションの総称です。MEAPソリューションの具体的な例としては、IBMの<a href="http://www-06.ibm.com/software/jp/websphere/mobile-solutions/worklight/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Worklight</a>や<a href="http://www.kony.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Kony</a>といった製品が挙げられます。</p>

<p>MEAPの大きな機能の1つに、クロスプラットフォーム開発が挙げられます。実はどの製品も、<a href="https://html5experts.jp/masahiro/10456/" target="_blank" data-wpel-link="internal">第1回で紹介した</a>Cordovaフレームワークをベースにしており、HTML5ハイブリッドアプリとして開発されます。</p>

<p>MEAPにも問題点があります。それは、オールインワンとしての利用が前提となるため、どうしてもソリューションとしての規模が大きくなってしまい、それに伴い、値段も上がってしまうことです。特に、モバイルプロジェクトはスモールスタートすることが多いことから、MEAPは向いていないと判断される例が少なくありません。</p>

<p>また、モバイルアプリの開発では、様々なツールやサービスを組み合わせてアプリを作っていくことがよくあります。たとえば、プッシュ通知やテスト配信、アプリ管理などに特化した専用ツールが提供されています。MEAPを利用した場合に、こういった外部ツールとの連携がとりづらくなり、結果としてオープンな環境で開発できないといった懸念があります。</p>

<h2>エンタープライズ向け次世代モバイル基盤</h2>

<p>その中で、次世代モバイル基盤とも言える、新たなエンタープライズ向けのバックエンド基盤が登場しています。2013年末に発表された<a href="http://www.yankeegroup.com/about_us/press_releases/2013-12-10.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">米Yankeeグループの調査結果</a>によると、サービス形式でバックエンド基盤を提供するMBaaSプロバイダーは既に一般的な存在になっており、より優れた技術を持ち、顧客ベースが確立している成長企業が今後主役になるだろうとしています。</p>

<div id="attachment_10541" style="width: 310px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/09/kidozen.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/09/kidozen-300x287.png" alt="エンタープライズ向けモバイルバックエンド" width="300" height="287" class="size-medium wp-image-10541" srcset="/wp-content/uploads/2014/09/kidozen-300x287.png 300w, /wp-content/uploads/2014/09/kidozen-207x198.png 207w, /wp-content/uploads/2014/09/kidozen.png 516w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">エンタープライズ向けモバイルバックエンド</p></div>

<p>その中の1社である<a href="http://kidozen.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">KidoZen</a>社を紹介したいと思います。KidoZenはエンタープライズに特化したバックエンドを提供しており、クラウドだけでなくオンプレミスでの運用にも対応しています。イントラネット内で稼働する各種ユーザー認証基盤やデータベース製品に接続できるだけでなく、Salesforce.comやOffice 365といったクラウドベースのサービスとも連携できます。データ仮想化によるセキュリティ向上や、バックエンドの利用統計といった機能も搭載されています。</p>

<p>今後は、こういった単体でも利用でき、様々なツールと組み合わせて活用できるバックエンド基盤ソリューションが普及すると考えられます。使い勝手の面や、導入や運用コストが、従来のMEAP製品と比べて優位であるためです。</p>

<p>ただし、こういった製品には開発機能が含まれていません。そのために、HTML5開発プラットフォームである<a href="http://monaca.mobi/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Monaca</a>や<a href="http://http://www.applican.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">アプリカン</a>といったソリューションと組み合わせた開発が広がっています。実際に、ガートナーは2013年、MEAPに代わって<a href="https://www.gartner.com/doc/2570424/magic-quadrant-mobile-application-development" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">MADP（Mobile Application Development Environment）という概念</a>を紹介し、開発機能とバックエンド運用機能を別軸で捉えはじめています。</p>

<p>モバイルソリューション全般に言えることですが、バックエンドもテクノロジーの進化が早く、ともすると大きな投資の結果、半歩遅れのものができあがるということも考えられます。一方で、エンタープライズ向けのモバイルアプリ開発ソリューションの選択肢も広がってきました。ツールやサービスを組み合わせることで、開発と運用効率を高めることが、今後も求められることになるでしょう。</p>
]]></content:encoded>
		
		<series:name><![CDATA[エンタープライズ開発特集]]></series:name>
	</item>
		<item>
		<title>エンタープライズモバイルはカスタムアプリへ─エンタープライズ×モバイルアプリ開発の最新動向(1)</title>
		<link>/masahiro/10456/</link>
		<pubDate>Fri, 05 Sep 2014 00:00:44 +0000</pubDate>
		<dc:creator><![CDATA[田中 正裕]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[エンタープライズ]]></category>
		<category><![CDATA[モバイル]]></category>

		<guid isPermaLink="false">/?p=10456</guid>
		<description><![CDATA[連載： エンタープライズ開発特集 (5)スマートフォンやタブレットが普及する中で、エンタープライズ分野でのモバイル活用が注目を集めています。特にモバイルファーストという掛け声のもと、B2E（Business to Emp...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/enterprise/" class="series-197" title="エンタープライズ開発特集" data-wpel-link="internal">エンタープライズ開発特集</a> (5)</div><p>スマートフォンやタブレットが普及する中で、エンタープライズ分野でのモバイル活用が注目を集めています。特にモバイルファーストという掛け声のもと、B2E（Business to Employee）やB2B（Business to Business）において、スマートデバイスを活用する動きが広まっています。</p>

<p>私としても「多くの企業ではモバイルを活用するのかしないのか」という議論から、「いつモバイルを始めるのか？」「どのように実装するのか？」という内容に論点が移っていることを実感しています。</p>

<p>もう一つの大きな特徴は、事業部門がモバイル化を先導している一方、情報システム部や総務部はセキュリティリスクやBYOD等の対処を迫られていることです。企業モバイル先進国であるアメリカでは、モバイル化を前提として業務の見直しを進めながら、上手くアプリを活用している事例が多く見受けられます。</p>

<h2>企業のモバイル活用はカスタムアプリへ</h2>

<p>モバイル化を進める上で重要なことは、モバイルでの業務範囲を見定め、その範囲に最適化したアプリを設計することです。モバイル活用レベルに応じて課題も変わってきますが、下記の3フェーズに分けて考えるとイメージしやすいと思います。</p>

<div id="attachment_10523" style="width: 460px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/08/enpra11.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/08/enpra11.png" alt="エンタープライズのモバイル化における3フェーズ" width="450" class="size-medium wp-image-10523" srcset="/wp-content/uploads/2014/08/enpra11.png 600w, /wp-content/uploads/2014/08/enpra11-300x253.png 300w, /wp-content/uploads/2014/08/enpra11-207x174.png 207w" sizes="(max-width: 600px) 100vw, 600px" /></a><p class="wp-caption-text">エンタープライズのモバイル化における3フェーズ</p></div>

<p>それぞれの段階によって、必要となる基盤が異なります。フェーズ1や2では、MDMやVPN、セキュアブラウザーといったセキュリティ対策や管理用ツールがその中心的な存在となります。実際に、現状では話題の多くがこの状況を反映しているのではないでしょうか。</p>

<p>今後、モバイル化がさらに推進され、業務をよりモバイルに最適化していく中で、カスタムで開発するアプリの重要性が一層高まっていきます。その中でHTML5が重要な技術として位置づけられ、フロントエンドに採用されていくことでしょう。また、その場合のバックエンド技術についても検討が必要です。</p>

<p>まずは技術的な側面から、エンタープライズモバイルの特徴を紹介したいと思います。</p>

<h2>エンタープライズ分野におけるモバイルアプリの技術要件</h2>

<p>大きくフロントエンドとバックエンドに分けて、エンタープライズモバイルの技術的な課題について紹介します。</p>

<h3>クロスプラットフォーム</h3>

<p>App Store等で配信するアプリでは、通常iOSやAndroidといった特定のプラットフォームに向けて開発されるネイティブアプリが主流です。ユーザーエクスペリエンスを高め、ユーザーから高い評価を得ることが最優先されるためです。</p>

<p>一方で、エンタープライズアプリはクロスプラットフォームが選択の中心となります。その背景として、従業員が自分のプライベート端末を業務でも使用する、BYOD（Bring Your Own Device）が挙げられます。企業がBYODを選択すると、マルチプラットフォームでアプリをサポートすることは必須要件になるためです。</p>

<p>また、業務システムは5年～10年という、一般のコンシューマーアプリと比較しても長いライフスパンで使うことが前提となります。そのため、現時点で採用されたプラットフォームに限定したシステムは、メンテナンスのリスクが伴います。移植性がより重要視されるわけです。</p>

<h3>開発効率</h3>

<p>技術選定の際には、評価軸としてアプリの実行速度よりも開発効率が重要になります。特に、モバイルアプリ開発エンジニアの確保と育成のしやすさ、Webやサーバーサイドといったテクノロジーとの親和性も重要なポイントです。</p>

<h3>UIの作りやすさ</h3>

<p>モバイル開発全般に当てはまりますが、アプリはビジネスロジックが比較的少ない一方で、ユーザーインターフェースの品質が使い心地に直結します。そのため、ワイヤーフレームやモックアップという形でプロトタイプを作りながら、ユーザーの視点で使い勝手を評価していく開発スタイルが好まれます。</p>

<p>業務アプリと言えども、ユーザーはB2Cアプリの使い心地に慣れているため、コンシューマー向けの開発フローを参考にすることが望まれます。ヌルヌル、キビキビ動く必要はありませんが、PC版の画面から表示項目数を落としてモバイルアプリ化するといった配慮が必要です。</p>

<h3>メンテナンスコスト</h3>

<p>端末の性能もさることながら、OSとその周辺環境は驚異的なペースで進化しています。その結果、WebやPC版のアプリと比較しても、TCO（Total Cost of Ownership）の中でメンテナンスの占めるウェイトが高く、リリースしてからの改修、改善をいかにスムーズに行っていくかが重要です。その中で機能改修や新バージョンへの対応のしやすさだけでなく、アプリのアップデートのしやすさも大きなポイントになります。</p>

<h2>フロントエンド技術の本命はHTML5</h2>

<p>さて、コンシューマー向けのアプリとは明らかに性格の異なる要件が連なっていますが、実際の開発技術には変わりがありません。ネイティブアプリやWebアプリなど様々な方式があり、どれも長所と短所を備えています。</p>

<p>その中で、エンタープライズモバイルの要件を満たす最有力候補となるのは、ネイティブアプリにもWebアプリにも対応できるHTML5です。では、なぜエンタープライズ向けフロントエンド技術の本命がHTML5なのか、次回に解説を進めていきたいと思います。</p>
]]></content:encoded>
		
		<series:name><![CDATA[エンタープライズ開発特集]]></series:name>
	</item>
		<item>
		<title>HTML5が変える、エンタープライズITの可能性とこれから</title>
		<link>/furoshiki/9136/</link>
		<pubDate>Tue, 19 Aug 2014 00:00:16 +0000</pubDate>
		<dc:creator><![CDATA[川田寛]]></dc:creator>
				<category><![CDATA[システム開発]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[エンタープライズ]]></category>
		<category><![CDATA[モバイル]]></category>

		<guid isPermaLink="false">/?p=9136</guid>
		<description><![CDATA[連載： エンタープライズ開発特集 (1)こんにちは、川田です。今日からHTML5 Experts.jpでは「エンタープライズ開発特集」を始めます。第一弾の今回は、HTML5とエンタープライズITについてのオーバービューを...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/enterprise/" class="series-197" title="エンタープライズ開発特集" data-wpel-link="internal">エンタープライズ開発特集</a> (1)</div><p>こんにちは、川田です。今日からHTML5 Experts.jpでは「エンタープライズ開発特集」を始めます。第一弾の今回は、HTML5とエンタープライズITについてのオーバービューを語ります。サーバサイドのお話はわりとよく見ますが、フロントエンドにフォーカスしているというのは珍しいようにも思えますね。</p>

<p>IT自体が幅広い分野のビジネスや製品に変わりつつある昨今、「エンタープライズITの話をするぞ！」と言うと、いろんな方面の人からこう問われます。</p>

<h2>「そもそも、エンタープライズって何？」</h2>

<p>エンタープライズ、正式には「エンタープライズシステム」になりますが、直訳すれば「企業向けシステム」。一言で言うなら「企業のビジネスを支えるための仕組み」を意味します。企業の業務の効率化を進めたり、経営戦略や問題解決を進めるためのワークプロセス(仕事の進め方)と道具(アプリやインフラ)のことです。</p>

<p>エンタープライズのエンジニアの仕事は、技術的な観点から、経営を良くする方法を提案したり、業務の進め方を設計したり、そのために必要な道具(アプリやインフラ)も調達したり、なければ自分たちで開発したり。サーバからクライアントまで、必要なら机の配置の一つまでデザインする(ネットワークも！)。ぶっちゃけ、ITじゃない方が合理的なら、IT化しないなんてのも提案する。スーパーのレジだって「効率化とかどうでもいいから最安値で作って」と言われたら、ソロバンを薦めてしまうという。それが私たちの仕事です。「SCM」とか「CRM」というキーワードで検索すると、そのニュアンスが伝わるかもしれません。</p>

<p>さて、ここで定義したエンタープライズ（システム）において常に関心が高いテーマとしては、「1.システムの運用」「2.業務の効率化」「3.アーキテクチャ」が挙げられると思います。これらの観点から、「HTML5」という技術要素が、これから先の企業のITをどのように良くしていけるのかをみてみましょう。</p>

<h2>1. 「システムの運用」はどう変わるのか？</h2>

<p>古今東西、エンタープライズは、システムをできる限りいじらずに、長く運用させることがビジネスとして成立する市場です。欧米においても、古いものは企業と政府に最後まで残り続ける傾向にあるというのが、共通の認識になっています。日本ではInternet Explorer（以下、IE）が高い影響力を持っており、多くの企業がIEの特定のバージョンをサポート期間ギリギリまで使い倒すという方法に走りがちです。しかし、今それが変わることを求められています。</p>

<p>マイクロソフトのサポートは基本は最低10年というルールですが、IEにおいてはもはやそのルールは全く通用しません。昨年、<a href="http://support.microsoft.com/lifecycle/search/?sort=PN&amp;alpha=Windows+8&amp;Filter=FilterNO" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Windows8.1発売時にWindows 8版IE10のサポート期間が短縮化</a>され、そして今年の7月にはとうとう、<a href="http://blogs.msdn.com/b/ie/archive/2014/08/07/stay-up-to-date-with-internet-explorer.aspx" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">2016年1月12日以降、最新のバージョン以外はサポート対象外とするというアナウンス</a>を行いました。これは、Google Chromeと同じアップデートのポリシーで、システムはこれからIEの最新バージョンがリリースされる都度、IEのバージョンを上げ続けることが求められています。現時点では、約1.5年周期ぐらいになりそうです。</p>

<p>マイクロソフトは、エンタープライズもコンシューマーも、どちらであってもIEが常に最新のバージョンで運用されるよう改善を進めてきています。その成果として、現在の最新のIEはHTML5に準拠し、高い相互運用性を確保しました。これはつまり、バージョン間の動作の違いが非常に小さいということを意味します。彼らとしては、<strong>ブラウザの「バージョンアップ」が、従来の「サービスパック適用」や「セキュリティアップデート」程度のものとして扱われれば</strong>という狙いがあるようです。</p>

<p>Windows XPのSP2は、元々Vistaになる予定の全く別ものなOSと言われていたのですが、それが運用の中でうまく適用できたというのであれば、これはほんの些細な問題なのかもしれません。運用の進め方さえうまく定着すれば、<strong>業務システムのクライアント部分は、OSやミドル、ハードウェアのライフサイクルから開放され、セキュリティ・信頼性・パフォーマンスが最適化された状態で、長期に渡り利用することが可能となります。</strong>これはエンタープライズITにとって、HTML5がもたらす大きな価値の一つと言えるでしょう。</p>

<p>最新のIEへの移行、HTML5化を進めるには、以下の機能・ツールが有用です。欧米ではユーザー企業だけで音頭を取って進めていけるため、そのモチベーションは非常にシンプルです。しかし、日本はSIerがシステム開発の中心にいるため、調整にはかなり苦戦するかもしれません。2016年1月までと非常に期間は短いのですが、ユーザー企業・SIerの両方が一丸となりこの取り組みを進め、ユーザー企業のシステム費用の最適化と成長に貢献できればよいですね。</p>

<ul style="border:1px solid silver;background-color:#EEE;padding:5px">
<li><a href="https://html5experts.jp/osamum_ms/4401/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">modern.IE</a>：IEのマルチバージョンテストや、問題点を検出するツール。無償のものが多い。何千台も端末がある場合、段階的に最新バージョンのIEへ移行を進めていくにあたり、このツールが有用になる。</li>
<li><a href="http://msdn.microsoft.com/ja-jp/library/dn640687.aspx" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Enterprise Mode</a>：IE11以上で、暫定的にIE7/8の動作をエミュレートさせる機能。最新のIEに移行した後も、古いIE特化のアプリを動かすことができる。</li>
<li><a href="http://furoshiki.hatenadiary.jp/entry/2014/01/06/030742" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Compat Inspector</a>：IE8以下の依存性の高い作り込みを検出するツール。Enterprise Modeも長くはサポートされる保証がないため、最新のIEへ移行した後、このツールを活用して改修を進め、Enterprise Modeをなくしていくことが求められる。</li>
</ul>

<h2>2. 「業務の効率化」はどう変わるのか？</h2>

<p>近年、デスクトップPC以外のコンピュータのポテンシャルが注目を集めています。ノートPCにタブレット、スマートフォンにウェアラブルと、デスクトップPCにはない機能、ワークフローのモデルを持ったコンピューターを活用することで、従来の業務をより効率的に変えていこうという考え方が、欧米で広がりをみせています。最近のアンケート結果を見ていると、日本でもモバイルの業務活用に抵抗感がなくなりつつあるようですので、恐らくこれから広がっていくことでしょう。</p>

<p>例えば、ホワイトカラーの場合、マネージャーの決裁をリアルタイム化させるという用途が有名です。スマートフォンに決裁イベントの発生を通知させ、内容を表示し、タッチで完了させるというワークフローを実現させるというものです。部下にも使えるものだと、スケジューラとの連携です。これからミーティングが始まるということを、移動時間も含めて計算し、事前に通知するという仕組みです。このような、様々な種類のデバイスを連動させた業務の設計方法を「モビリティ」と呼びます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/08/a.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/08/a.png" alt="モビリティという新たな業務の組み立て方の一例" width="630" height="527" class="alignnone size-full wp-image-9940" style="border:1px solid silver" srcset="/wp-content/uploads/2014/08/a.png 630w, /wp-content/uploads/2014/08/a-300x250.png 300w, /wp-content/uploads/2014/08/a-207x173.png 207w" sizes="(max-width: 630px) 100vw, 630px" /></a></p>

<p>モビリティは、単純にWebアプリをタブレットやスマートフォンで見えるようにするだけでは意味がありません。コンピューターが持つ特性に合わせて、設計することが求められます。例えば、先ほどの決裁のシステムにおいて、「通知」という機能がなかったらどうなるでしょうか？タッチ操作に最適化されていなかったらどうなるでしょうか？</p>

<p>使いにくくて、結局デスクトップ型やノートPC型のコンピュータを使うようになるのがオチです。<strong>UXへの理解がないことには、導入がうまくいかないのがモビリティ</strong>なので、モバイルの活用とUXは、多くの場合セットとして扱われているはずです。業務系のUXは、Webのサービスのようにリピーターを増やすためのものではなく、毎日使う道具を効率化させることに意味があり、このあたりの評価軸の違いにも注目すべきでしょう。</p>

<p>また、スマートフォンやタブレットといった道具側にも工夫が必要です。企業向けとして利用する場合、セキュリティの考え方、開発効率にも意識しなくてはいけません。セキュリティについては「<a href="http://searchconsumerization.techtarget.com/tutorial/Mobile-enterprise-application-platforms-A-primer" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">MEAP(Mobile Enterprise Application Platform)</a>」が、「<a href="http://www-03.ibm.com/software/products/en/worklight-foundation" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">IBM Worklight</a>」「<a href="http://global.sap.com/campaigns/digitalhub-mobile-platform/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SAP Mobile Platform</a>」「<a href="http://www.oracle.com/technetwork/jp/developer-tools/adf-mobile/overview/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Oracle ADF Mobile</a>」などなど、数えきれない程の製品によって、実用化もコモディティ化も進んでいます。一方で開発効率については、HTML5によるハイブリッドアプリケーション開発が注目を集め、これを実装するための「<a href="http://cordova.apache.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Apache Cordova</a>」がMEAP製品の間でも独占的シェアを得ています。HTML5自体、そもそもモバイルから注目を集め出したわけで、そこまで想像に難くないはずです。</p>

<h2>3. 「アーキテクチャ」はどう変わるのか？</h2>

<p>最後に、統合化を目指したアーキテクチャについてです。ここでのアーキテクチャとは、個別のシステムにおけるものではなく、全体最適化の観点におけるアーキテクチャです。一つの業務をこなすのに、いくつものログインを繰り返す煩わしさ、複数のシステムに同じ情報を投入しなくてはいけない状況など、連携できていない状況の改善という意味です。</p>

<p>以下3つのポイントが、これからのアーキテクチャを決定付けているように思えます。</p>

<ul style="border:1px solid silver;background-color:#EEE;padding:5px">
<li><strong>業務ロジックがAPIを持ち始めている：</strong>出足はやや遅れましたが、私の感覚として日本の企業でもパッケージの活用が進んでいるように見えます。パッケージ製品は、<a href="http://scn.sap.com/community/netweaver" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SAP NetWeaver</a>や<a href="https://developer.salesforce.com/page/Salesforce_APIs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Salesforce APIs</a>といったAPIを持つのがもはや当たり前で、標準としては<a href="http://www.odata.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">OData</a>が広がっています。インフラも<a href="http://aws.amazon.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AWS</a>のAPIがデファクト標準化しつつあり、認証基盤ですらも<a href="http://saml.xml.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SAML</a>や<a href="http://openid.net/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">OAuth(OpenID Connect)</a>のような標準のAPIへとシフトしています。<a href="http://www.gsma.com/oneapi/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">OneAPI</a>やBONDIみたいなモバイル向けアプリ開発の世界観も気になるところです。スクラッチ開発においても、ライブラリ/フレームワークも豊富になり、REST(like)を中心としてAPIの実装コストも落ちていくことでしょう。</li>
<li><strong>APIを活用する製品が増えている：</strong><a href="http://www-01.ibm.com/software/analytics/cognos/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">IBM Cognos</a>や<a href="http://www.oracle.com/us/solutions/business-analytics/business-intelligence/overview/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Oracle BI</a>などのBIツールや、<a href="http://camel.apache.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Apache Camel</a>のようなルーティングエンジン、<a href="http://backbonejs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Backbone.js</a>や<a href="https://angularjs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AngularJS</a>といったJavaScriptフレームワークでさえもREST(like)に対応するのが当たり前という状況です。サーバでAPIを繋げる<a href="http://apigee.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Apigee</a>や、クライアントでAPIを繋げる<a href="https://ifttt.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">IFTTT</a>なんかも面白い傾向です。例えスクラッチ開発であっても、アプリは標準的なAPIで繋げた方が、長期的に見てできる事の幅が広がっている時代に突入しています。</li>
<li><strong>開発ツールがモバイルファースト化している：</strong>モバイルはネットワーク環境が不安定であることが前提であり、サーバサイドとは疎結合にしてクライアントで処理をすることが求められています。こうした中、マイクロソフトの「<a href="http://blogs.msdn.com/b/somasegar/archive/2014/05/12/mobile-first-cloud-first-development-visual-studio-apache-cordova-tooling-and-cloud-optimized-net-futures.aspx" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Mobile-first, Cloud-first Development</a>」、IBMの「<a href="https://www.ibm.com/mobilefirst/us/en/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Mobile First</a>」と、各製品ベンダの開発ツールがどんどんモバイルファースト前提に変わっています。個人的には、<a href="http://www.oracle.com/us/solutions/business-analytics/business-intelligence/mobile/overview/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Oracle BI Mobile</a>みたいな、完成された製品でさえもモバイル前提なことに、未来を感じさせられます。</li>
</ul>

<p>このような状況を鑑みると、世の中のアプリケーションはC/Sモデルへと回帰しているように見えます。クライアントは多くの場合、やはりHTML5のエコシステムの恩恵を受けたくなるはずです。本メディアでも過去に取り上げたような、<a href="https://html5experts.jp/albatrosary/3191/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">佐川夫美雄氏の考えるWebベースのリッチアプリケーション開発</a>もその一つと言えます。現在はまだ、APIの集約はBIツールなどを活用してサーバサイドで行うのが一般的なようですが、これから先は、徐々にクライアント側へと移っていくことも想像に難くないはずです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/08/d6940b0c38258d9311986c932cbe9406.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/08/d6940b0c38258d9311986c932cbe9406.png" alt="APIの集約化がクライアントへと進出する" width="631" height="353" class="alignnone size-full wp-image-9919" style="border:1px solid silver" srcset="/wp-content/uploads/2014/08/d6940b0c38258d9311986c932cbe9406.png 631w, /wp-content/uploads/2014/08/d6940b0c38258d9311986c932cbe9406-300x167.png 300w, /wp-content/uploads/2014/08/d6940b0c38258d9311986c932cbe9406-207x115.png 207w" sizes="(max-width: 631px) 100vw, 631px" /></a></p>

<p>「あの企業みたいに、こういう経営情報を可視化したい！」「こういうコスト削減を目指したい！」となった時に、「世の中の道具が全く何も使えない！」なんてことにならないためにも、少しずつでよいので世の中の流れに乗っていけるといいですね。素直に新しいベンダ製品を活用していたら、勝手にこんな作りになるわけですが、いかんせんOSSによるコスト最適化、マルチベンダ化、大量のレガシー資産などの要因が邪魔して、そうも簡単にいかないというのが厄介なところでしょう。</p>

<p>さてさて、今回「UX」に「MEAP/ハイブリッドアプリ開発」に「業界標準フォーマット」に「ツール/フレームワーク」と、フロントエンドに関わるいろんなキーワードが出てきましたが、これらをより深堀りしたものが、本メディアにて「エンタープライズ特集」として取り上げられます。企業のビジネスを技術面から良くする、ヒントを与えてくれるに違いありません。</p>

<p>どうぞ、お楽しみに！</p>
]]></content:encoded>
		
		<series:name><![CDATA[エンタープライズ開発特集]]></series:name>
	</item>
		<item>
		<title>Chrome AppsをモバイルでもーChrome Apps on mobileー</title>
		<link>/yoshikawa_t/9240/</link>
		<pubDate>Fri, 01 Aug 2014 00:00:37 +0000</pubDate>
		<dc:creator><![CDATA[吉川 徹]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Chrome Apps]]></category>
		<category><![CDATA[ハイブリッド]]></category>
		<category><![CDATA[モバイル]]></category>

		<guid isPermaLink="false">/?p=9240</guid>
		<description><![CDATA[連載： ハイブリッドアプリ開発最前線 (8) ハイブリッドアプリ開発の手法のひとつして、Chrome Appsをモバイルアプリに変換するApache CordovaベースのChrome Apps on mobileについ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/hybrid-special/" class="series-181" title="ハイブリッドアプリ開発最前線" data-wpel-link="internal">ハイブリッドアプリ開発最前線</a> (8)</div><p><style>.codecolorer-container.text.default { max-width: 95%; margin-left: 1em; margin-top: -1em; margin-bottom: 2em;}</style>
ハイブリッドアプリ開発の手法のひとつして、Chrome Appsをモバイルアプリに変換するApache CordovaベースのChrome Apps on mobileについて解説します。これによって、Chrome Appsとして作成したWebアプリがAndroidやiOS向けのネイティブアプリとして公開、インストールすることができるようになります。</p>

<!-- more -->

<p><a href="https://github.com/MobileChromeApps/mobile-chrome-apps" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Chrome Apps on mobile</a>は、まだデベロッパープレビュー版で、GitHub上でプロジェクトが公開されています。まだデベロッパープレビュー版ということで、Chrome AppsのすべてのAPIを利用できるわけではありませんが、順次対応される予定です。本記事では、そもそも「Chrome Appsとは何なのか？」というところから、Chrome Apps on mobileの開発環境の構築やビルド、実行までひと通り見ていきます。</p>

<h2>Chrome Appsとは？</h2>

<p>Chrome Appsとは、単にChromeで動作するWebアプリというわけではなく、<a href="https://chrome.google.com/webstore/category/apps?hl=ja" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Chromeウェブストア</a>上で配布・販売できるアプリケーションプラットフォームです。通常のWebアプリをChrome Appsとしてそのまま公開することもできますし（若干のマニフェストファイルを書く必要はあります）、Chromeに実装されている高機能なAPIを利用して、よりリッチなWebアプリを作ることもできます。</p>

<div id="attachment_9249" style="width: 310px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/chromeapps1.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/chromeapps1-300x214.png" alt="Chromeウェブストア" width="300" height="214" class="size-medium wp-image-9249" srcset="/wp-content/uploads/2014/07/chromeapps1-300x214.png 300w, /wp-content/uploads/2014/07/chromeapps1-207x148.png 207w, /wp-content/uploads/2014/07/chromeapps1.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a><p class="wp-caption-text">Chromeウェブストア</p></div>

<p>例えば、通常のWebアプリをChrome Appsとして公開する場合（Chrome独自のAPIを利用しないケース）、次のようにマニフェストファイル「manifest.json」とバックグラウンドで動作するJavaScriptファイル「background.js」を記述し、Webアプリのファイル一式と同梱することによって簡単にChrome Appsとして動作させることができます。</p>

<p>ChromeAppSample （任意のフォルダ）<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── index.html （Webアプリ本体一式を同梱する）<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;├── manifest.json<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└── background.js<br></p>

<p></p><pre class="crayon-plain-tag">{
  "name": "Chrome App Sample",
  "version": "0.1",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  }
}</pre><p></p>

<p></p><pre class="crayon-plain-tag">chrome.app.runtime.onLaunched.addListener(function() {
  chrome.app.window.create('index.html', {
    'bounds': {
      'width': 400, 'height': 500
    }
  });
});</pre><p></p>

<p>また、Chrome Apps上では、独自の<a href="https://developer.chrome.com/apps/api_index" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Chrome API</a>を使って、さらにリッチなWebアプリを作ることも可能になっています。Chrome Appsの作成方法についてのより詳細な情報は、公式ページの「<a href="https://developer.chrome.com/apps/about_apps" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">What Are Chrome Apps?</a>」にまとまっていますので、参考にしてください。簡単に試してみたいという場合は、「<a href="https://developer.chrome.com/apps/first_app" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Create Your First App</a>」を試してください。</p>

<h2>開発環境の構築</h2>

<p>まずは、Chrome Apps on mobileの開発環境を構築します。Chrome Apps on mobileは、iOSのバージョン6以降、Androidのバージョン4.0以降を対象にしています。どちらを対象にするかによって必要なツール・ライブラリが異なりますので、対象に合わせて準備しましょう。いずれの環境でも必要なのは、Node.js (バージョン0.10.0以降)です。既にインストールされている場合は必要ありませんが、まだの場合はWindows、Mac（またはLinux）いずれでも、<a href="http://nodejs.org/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">こちら</a>からダウンロードしてインストールしておきましょう。さらに環境によって次のようなツール・ライブラリが必要になります。</p>

<h3>Androidの場合</h3>

<ul>
<li><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Java JDK7 以降</a></li>
<li><a href="http://developer.android.com/sdk/index.html" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Android SDK 4.4.2 以降</a>（ <code>sdk/tools</code> と <code>sdk/platform-tools</code> をPATHに追加する）</li>
<li><a href="http://ant.apache.org/bindownload.cgi" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Apache Ant</a>（ <code>apache-ant-x.x.x/bin</code> をPATHに追加する）</li>
</ul>

<h3>iOSの場合</h3>

<ul>
<li><a href="https://developer.apple.com/xcode/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Xcode 5 以降</a></li>
<li><a href="https://github.com/phonegap/ios-deploy" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ios-deploy</a>（iOSデバイスにデプロイする際に必要です）<br>
<code>> npm install -g ios-deploy</code></li>
<li><a href="https://github.com/phonegap/ios-sim" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ios-sim</a>（iOSシミュレーターにデプロイする際に必要です）<br>
<code>> npm install -g ios-sim`</code></li>
</ul>

<p>※ Appleストアに公開する場合は、iOSデベロッパー登録が必要です</p>

<h3>ccaコマンドラインツールのインストール</h3>

<p>最後に、Chrome Apps on mobileのツールとしてccaコマンドラインツールをインストールします。</p>

<p><code>> npm install -g cca</code></p>

<p>既に、ccaがインストール済みでアップデートをする場合は、<code>npm update -g cca</code>を実行しましょう。ccaのインストール後に、次のコマンドでAndroidおよびiOSの開発環境が揃っているか確認できます。</p>

<p><code></p>

<blockquote>
  <p>cca checkenv
  cca v0.2.2</p>
</blockquote>

<h2>Checking that tools are installed</h2>

<p>Android SDK detected.
Xcode detected.
</code></p>

<p>「Android SDK detected.」と「Xcode detected.」という結果が表示されればOKです。片方のみの環境であれば、いずれか片方だけが表示されます。例えば、Android環境のみの場合は、「Android SDK detected.」だけが表示されます。</p>

<h2>プロジェクトの作成とビルド、実行</h2>

<p>開発環境の構築が終わったら、実際にプロジェクトを作成してビルド、実行してみましょう。ccaコマンドツールを使って次の手順で行います。</p>

<h3>プロジェクトの作成</h3>

<ul>
<li><p>新規にプロジェクトを作成する場合
<code>> cca create ChromeSampleApp</code>
カレントディレクトに <code>ChromeSmapleApp</code> というフォルダが作成され、プロジェクトが作られます。</p></li>
<li><p>既にあるChrome Appsを元にプロジェクトを作成する場合</p></li>
</ul>

<p>既にChrome Appsを作成済みであれば、オプションでそれを指定します。指定方法には、次の2種類があります。</p>

<p><code>> cca create ChromeSampleApp --link-to=path/to/manifest.json</code></p>

<p>作成済みのChrome Appsのマニフェストファイルの場所を指定します。 <code>path/to/</code>を皆さんの環境に合わせて置き換えてください。<code>--link-to</code>オプションでは、指定したフォルダへのシンボリックリンクでプロジェクトが作成されます。</p>

<p><code>> cca create ChromeSampleApp --copy-from=path/to/manifest.json</code></p>

<p><code>--copy-from</code> オプションでは、指定先のフォルダをコピーしてプロジェクトが作成されます。</p>

<h3>ビルド、実行</h3>

<p>プロジェクトの作成が終わったら、いよいよビルドし、実行してみます。こちらも非常に簡単で、プロジェクトのルートフォルダ上で、次のようにccaコマンドを実行するだけで済みます。</p>

<ul>
<li>Androidのエミュレータで実行</li>
</ul>

<p><code>> cca emulate android </code></p>

<p>※ Androidのエミュレータが設定されていない場合、<code>android avd</code>コマンドでセットアップする必要があります</p>

<ul>
<li>Androidの実機で実行（デバイスをUSBデバッグモードで接続します）</li>
</ul>

<p><code>> cca run android </code></p>

<ul>
<li>iOSのシミュレーターで実行</li>
</ul>

<p><code>> cca emulate ios </code></p>

<ul>
<li>iOSの実機で実行（デバイスをUSBで接続します）
<code>> cca run ios </code></li>
</ul>

<p>それぞれの環境に合わせて、<code>cca emulate</code> または、<code>cca run</code>で簡単にビルド、実行することできます。単純にビルドするだけであれば、 <code>cca build</code>で可能です。是非試してみてください！</p>

<div id="attachment_9403" style="width: 169px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/chromeapps2.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/chromeapps2-159x300.png" alt="iOSシミュレーターで実行" width="159" height="300" class="size-medium wp-image-9403" srcset="/wp-content/uploads/2014/07/chromeapps2-159x300.png 159w, /wp-content/uploads/2014/07/chromeapps2-545x1024.png 545w, /wp-content/uploads/2014/07/chromeapps2-109x207.png 109w, /wp-content/uploads/2014/07/chromeapps2.png 340w" sizes="(max-width: 159px) 100vw, 159px" /></a><p class="wp-caption-text">iOSシミュレーターで実行</p></div>

<h2>Chrome App Developer Tool</h2>

<p>Chrome Apps on mobileには、実際のデバイス上でChrome Appsを動作させつつ、開発（修正）＞ビルド＞実行のイテレートを高速に回すことができる開発ツール「<a href="https://github.com/MobileChromeApps/chrome-app-developer-tool/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Chrome App Developer Tool</a>」が用意されています。</p>

<p>Chrome App Developer Toolは、モバイルアプリですので、実機にインストールする必要があります。Androidの場合は、<a href="https://github.com/MobileChromeApps/chrome-app-developer-tool/releases" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">こちら</a>からapkファイルをインストールして使用することができます。（iOSの場合は、ソースコードからビルドする必要がありますので、公式サイトの「<a href="https://github.com/MobileChromeApps/chrome-app-developer-tool/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Building from Source (iOS or Android)</a>」を参考にインストールしてください）</p>

<p>Androidの場合、Chrome App Developer ToolをインストールしたデバイスをUSBデバッグモードで接続し、次のようにコマンドを実行します。</p>

<p><code>> adb forward tcp:2424 tcp:2424</p>

<blockquote>
  <p>cca push</code></p>
</blockquote>

<p><code>adb forward</code>コマンドは、デバイスを接続後に1回だけ実行します。その後<code>cca push</code>コマンドで、Chrome App Developer Tool上でChrome Appsが動作します。これは、ビルドせずにChrome AppsをそのままChrome App Developer Toolに転送して動作するため非常に高速です。</p>

<div id="attachment_9414" style="width: 178px" class="wp-caption alignleft"><a href="https://html5experts.jp/wp-content/uploads/2014/07/Screenshot_2014-07-30-17-50-35.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/Screenshot_2014-07-30-17-50-35-168x300.png" alt="Chrome App DeveTool 1" width="168" height="300" class="size-medium wp-image-9414" srcset="/wp-content/uploads/2014/07/Screenshot_2014-07-30-17-50-35-168x300.png 168w, /wp-content/uploads/2014/07/Screenshot_2014-07-30-17-50-35-576x1024.png 576w, /wp-content/uploads/2014/07/Screenshot_2014-07-30-17-50-35-116x207.png 116w, /wp-content/uploads/2014/07/Screenshot_2014-07-30-17-50-35.png 360w" sizes="(max-width: 168px) 100vw, 168px" /></a><p class="wp-caption-text">Chrome App DevTool起動</p></div>

<div id="attachment_9415" style="width: 178px" class="wp-caption aligncenter"><a href="https://html5experts.jp/wp-content/uploads/2014/07/Screenshot_2014-07-30-17-51-54.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/Screenshot_2014-07-30-17-51-54-168x300.png" alt="Chrome App DevTool 2" width="168" height="300" class="size-medium wp-image-9415" srcset="/wp-content/uploads/2014/07/Screenshot_2014-07-30-17-51-54-168x300.png 168w, /wp-content/uploads/2014/07/Screenshot_2014-07-30-17-51-54-576x1024.png 576w, /wp-content/uploads/2014/07/Screenshot_2014-07-30-17-51-54-116x207.png 116w, /wp-content/uploads/2014/07/Screenshot_2014-07-30-17-51-54.png 360w" sizes="(max-width: 168px) 100vw, 168px" /></a><p class="wp-caption-text">cca push後</p></div>

<p><br>
Chrome App Developer Toolで動作しているChrome Appsを終了するには、2本指で同時にダブルタップします。</p>

<p>また、<code>cca push --watch</code>コマンドでプロジェクトに変更があれば自動的にpushするということも可能です。ソースコードを修正しながら実機で逐次、動作確認できるのでおすすめです。</p>

<h2>まとめ</h2>

<p>Chrome Apps on mobileは、デベロッパープレビュー版ということで、まだまだこなれていない面もありますが、Chrome Appsがそのままモバイルで動作するということで非常に楽しみなプラットフォームです。単なるWebアプリをモバイルアプリにするのであればPhoneGapなどの方が簡単ですが、Chrome APIを利用したパワフルなChrome Appsを作って、Chrome Apps on mobileにチャレンジしてみてください！</p>

<p>現在対応している・今後対応するChrome APIのステータスは、<a href="https://github.com/MobileChromeApps/mobile-chrome-apps/blob/master/docs/APIStatus.md" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">こちら</a>から確認することができます。高機能なAPIの多くは、これからの対応に期待ですが、ぜひ楽しみにしていただきたいと思います。</p>
]]></content:encoded>
		
		<series:name><![CDATA[ハイブリッドアプリ開発最前線]]></series:name>
	</item>
		<item>
		<title>Web上で一緒に音楽を作ろう！オンラインスタジオ「Soundtrap」で音楽制作</title>
		<link>/ryoyakawai/7736/</link>
		<pubDate>Tue, 29 Jul 2014 00:00:57 +0000</pubDate>
		<dc:creator><![CDATA[河合良哉]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Dart]]></category>
		<category><![CDATA[Google I/O 2014]]></category>
		<category><![CDATA[MIDI]]></category>
		<category><![CDATA[モバイル]]></category>

		<guid isPermaLink="false">/?p=7736</guid>
		<description><![CDATA[連載： Google I/O 2014 特集 (6)概要 Google I/O 2014のセッションの1つ「Making music mobile with the Web」のレポート記事です。Officialに公開され...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/google-io-2014-2/" class="series-191" title="Google I/O 2014 特集" data-wpel-link="internal">Google I/O 2014 特集</a> (6)</div><h2>概要</h2>

<p>Google I/O 2014のセッションの1つ「Making music mobile with the Web」のレポート記事です。Officialに公開されているYouTubeは<a href="https://www.youtube.com/watch?v=PMH1vM-dSc0" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">こちら</a>です。</p>

<p>OpenWeb 技術であるWebRTC、Web Audio APIは一度は耳にしたことのあると思います。この2つの技術、そして標準化が始まったばかりのWeb MIDI API（電子楽器とブラウザを直接接続するAPI）を利用した音楽制作アプリケーション「<a href="https://www.soundtrap.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Soundtrap</a>」。これらを使って、実際にセッションのオーディエンス、遠隔地の人とコラボレーションをして、Google I/Oのテーマ曲を作成するデモンストレーション中心のセッションでした。本レポートと合わせて映像もぜひご覧ください！</p>

<p>このセッションでは、主にモバイル端末（Nexus 7、Nexus 5）を使って進行されました。Webアプリといえば、JavaScriptでの構築を想像される方も少なくないので意外でした。しかしながら、「Soundstrap」は<a href="https://www.dartlang.org/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Dart</a>で開発されていたところでした。(開発言語にDartを選択した理由も、後ほど説明していきます)</p>

<p>それでは内容を見ていきましょう。</p>

<p>※2014/7/4にDartは、ECMA標準仕様として承認されたと<a href="http://news.dartlang.org/2014/07/ecma-approves-1st-edition-of-dart.html" title="Ecma approves the 1st edition of the Dart language specification" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">発表</a>がありました。</p>

<h2>音楽制作</h2>

<p>音楽制作にはいろいろな進め方がありますが、このセッションでは以下の順で録音が進められました。</p>

<ol>
  <li>リズムの選択 (<a href="http://youtu.be/PMH1vM-dSc0?t=1m49s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">1:49-</a>)</li>
  <li>Bass の録音 (<a href="http://youtu.be/PMH1vM-dSc0?t=3m2s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">3:02-</a>)</li>
  <li>Guitar(メロディー)の録音 (<a href="http://youtu.be/PMH1vM-dSc0?t=15m11s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">15:11-</a>)</li>
  <li>Keyboard(伴奏)シーケンスの作成 (<a href="http://youtu.be/PMH1vM-dSc0?t=16m28s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">16:28-</a>)</li>
  <li>Vocal の録音 (<a href="http://youtu.be/PMH1vM-dSc0?t=23m30s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">23:30-</a>)</li>
  <li>Mix Down (<a href="http://youtu.be/PMH1vM-dSc0?t=34m55s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">34:55-</a>)</li>
</ol>

<h3>1. リズムの選択</h3>

<p>曲のベースとなるリズムを決めます。Soundtrapにあらかじめ用意されているLoop素材を追加し、リズムを聴きながら「ん～」とか「もっとRockしてるのがいいな～」とかコメントしながら選択を終えました。</p>

<h3>2. Bassの録音</h3>

<p>Bassの音はあまり耳には聞こえませんが、実は曲の重要な土台となる低音パートです。 Bassの録音をすると、リズムしかなかった曲の輪郭がモヤっと見えてきます。</p>

<div id="attachment_8892" style="width: 710px" class="wp-caption aligncenter">
<a href="http://youtu.be/PMH1vM-dSc0?t=3m2s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">
<img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.59.32-PM.png" alt="RecordingBass" width="540" class="aligncenter size-full wp-image-9157" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.59.32-PM.png 640w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.59.32-PM-300x165.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.59.32-PM-207x113.png 207w" sizes="(max-width: 640px) 100vw, 640px" />
</a>
<p class="wp-caption-text">Bassを録音する様子</p>
</div>

<p>Media Capture APIの1つである、getUserMedia()を使って録音します。</p>

<p><img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-10-at-12.47.22-AM.png" alt="getusermedia01" width="540" height="128" class="aligncenter size-full wp-image-8494" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-10-at-12.47.22-AM.png 540w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-10-at-12.47.22-AM-300x71.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-10-at-12.47.22-AM-207x49.png 207w" sizes="(max-width: 540px) 100vw, 540px" /></p>

<p>getUserMedia()は、マイクからのInput、WebカメラからのビデオStreamを取得する時に使います。マイクからのInputを取得する時は、スピーカーからの出力をマイクが拾わないようにAEC(Acoustic Echo Canceling)、またマイクからのInputのレベルを保つために AGC(Auto Gain Control)を行うことが可能です。マイク以外の入力を取得する場合（Line入力：ギター、シンセサイザー等）は必要ないので、今回もOffにします。コードは以下のように書きます。</p>

<p></p><pre class="crayon-plain-tag">navigator.getUserMedia({audio:{echoCancellation: false}}).then((stream) {
  // 実際の処理をここに書きます
});</pre><p></p>

<p><code>then()</code> が見慣れない書き方かもしれませんが、これはDartに実装されている Futureという並列処理デザインパターンです。streamを得た時にどんな処理をするのかを、<code>then()</code>の中に書きます。</p>

<h3>3. Guitar（メロディー）の録音</h3>

<p>Guitarで主旋律パートを録音します。主旋律ですので向かう方向がハッキリします。</p>

<p><a href="http://youtu.be/PMH1vM-dSc0?t=15m11s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"></p>

<div id="attachment_8892" style="width: 710px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.02.26-PM.png" alt="RecordGuitar" width="540" class="aligncenter size-full wp-image-9158" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.02.26-PM.png 640w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.02.26-PM-300x164.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.02.26-PM-207x113.png 207w" sizes="(max-width: 640px) 100vw, 640px" />
</a>
<p class="wp-caption-text">Guitarの録音をする様子</p>
</div>

<p>Bassの録音と同じく、getUserMedia()を使って録音します。</p>

<p>特にギターの場合、エフェクターという専用の信号処理機械を通して音を作ることが多いです。エフェクトの種類は音を遅らすDelay、音程を微妙にズラすことで複数でコーラスをしているかのようなハーモニーを作るChorus、音を歪ませることで音に角を付け、いわゆるエレキギターと聞いて想像する音を作るFuzz、Distortion、Overdriveがありますが、これらのエフェクトもブラウザで行ってしまいます。（<a href="http://youtu.be/PMH1vM-dSc0?t=8m49s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">セッション内でのデモ</a>）</p>

<p>これらのエフェクトは、以下のように接続します。</p>

<p><img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-10.15.57-AM.png" alt="WebAudio_Pipeline" width="540" class="aligncenter size-full wp-image-8675" style="border:1px solid #dddddd" /></p>

<p>Input(getUserMedia()からのAudioStream)をWebAudioで作成したEffectsを通し、WebAudioでの音声の出力口であるDestinationに接続します。</p>

<p>Delayエフェクトの接続方法を例にとって、実際に説明をします。</p>

<p><img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-10.21.33-AM.png" alt="WebAudio_DelayNode" width="540" class="aligncenter size-full wp-image-8681" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-10.21.33-AM.png 397w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-10.21.33-AM-300x68.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-10.21.33-AM-207x47.png 207w" sizes="(max-width: 397px) 100vw, 397px" /></p>

<p>Guitarの音(Input)を直接Destination、またDelayに接続します。Delayで任意の時間遅らせて発音した音を、Gainに接続して音量を絞ります。最後にDelayで遅らせ、音量を絞った音をDestinationに接続します。結果としてギターで弾いた音は、山に向かって「ヤッホー」と叫びやまびこを楽しんでいる人の隣で聞いているかのような効果、つまりEffectが得られるのです。</p>

<p>この接続をコードにすると、以下のようになります。</p>

<p></p><pre class="crayon-plain-tag">var context = new AudioContext();

// getUserMediaのAudioStreamをWebAudioに接続する
navigator.getUserMedia({audio:true}).then((stream){
  var guitar = context.createMediaStreamSource(stream);
  var speaker = context.destination;
  guitar.connect(speaker);
});

// Delayエフェクトの接続
var delay = context.createDelay();
guitar.connect(delay);

var gain = context.createGain();
delay.connect(gain);

// Delayエフェクトをかけた音を、出力口のSpeaker(Destination)に接続
gain.connect(speaker);</pre><p></p>

<h3>4. Keyboard(伴奏)シーケンスの作成</h3>

<p>そして、Keyboardで伴奏パートのシーケンスの作成を行います。伴奏が入ると曲がハッキリし、各楽器通しでハーモニーが生まれます。</p>

<div id="attachment_8892" style="width: 710px" class="wp-caption aligncenter">
<a href="http://youtu.be/PMH1vM-dSc0?t=16m28s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">
<img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.46.31-PM.png" alt="playKeyboardWithWebRTC" width="540" class="aligncenter size-full wp-image-9154" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.46.31-PM.png 640w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.46.31-PM-300x169.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.46.31-PM-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" />
</a>
<p class="wp-caption-text">左下小窓がMoscone Center West、全体がGoogle San Francisco OfficeからWebRTC でStreamingしている様子</p>
</div>

<p>WebRTCを使って、上の画像のように遠隔地から行います。Google I/Oの会場である<a href="https://www.google.co.jp/maps/place/Moscone+Center+West/@37.783083,-122.404025,17z/data=!3m2!4b1!5s0x808580871e84c835:0x6898ed8f6d5ebf0b!4m2!3m1!1s0x80858087111726eb:0x635ab8069f6523c3?hl=ja" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Moscone West</a>と<a href="https://www.google.co.jp/maps/preview?q=google+san+francisco+office&amp;hl=ja&amp;ie=UTF-8&amp;ei=0Um_U-GyII708QW_noCoDw&amp;ved=0CAgQ_AUoAQ&amp;source=newuser-ws" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">GoogleさんのSan Francisco Office</a>を接続し、シーケンスを直接Soundtrapに作成します。Keyboardの演奏はWeb MIDI APIを使い、Keybord（電子楽器）とブラウザを接続して演奏データはMIDI Messageの形式(音声データではなく、「どの音を、どの強さで鳴らせ/止めろ」というような指示を表現したメッセージ)で時間と一緒に記録（シーケンスの作成）を行い、再生する時には記録された時間通りにMIDI MessageをSoundtrap上にあるSoftwearシンセサイザーに送信して、Softwareシンセサイザーが音を出しています。</p>

<p>セッションの中で説明はありませんでしたが、Web MIDI APIを使って電子楽器とブラウザを接続するコードを以下に紹介させていただきます。</p>

<p></p><pre class="crayon-plain-tag">// 電子楽器と接続
navigator.requestMIDIAccess({sysex:true}).then(successCallback, errorCallback);
function successCallback(access){
　// 入力として利用可能な電子楽器のリストをConsoleに出力
　var inputs=access.inputs()
  console.log(inputs);

　// 入力として利用可能なindex=0の電子楽器から受信したMIDI MessageをConsoleに出力
  inputs[0].onmidimessage=function(event) {
    console.log(event.data);
  }

　// 出力として利用可能な電子楽器リストをConsoleに出力
  var outputs=access.outputs()
  console.log(outputs);

　// 出力として利用可能なindex=0の電子楽器にMIDI Messageを送信
  // A4(ラ：440hz、MIDI Key番号：0x45(69))を最大音量(7F(127)で発音させる例)
  outputs[0].send([0x90, 0x45, 0x7f]);
}
function errorCallback(msg) {
  // 何らかの問題で電子楽器との接続ができなかった場合、Consoleにエラーメッセージを出力
  console.log(msg);
}</pre><p></p>

<p>※JavaScriptでの書式になります。 .then()に関して、書式はDartとJavaScriptで同じですが、Dartでは Futureという並列処理デザインパターン、一方JavaScriptではPromiseという並列処理デザインパターンですので、内容は正確にいうと異なりますのでご注意ください。</p>

<p>次に、WebRTCの接続についてです。WebRTCは、RealtimeにPeer to PeerでAudio、Video、Dataの3種類のStreamを使ったコミュニケションができるAPIです。接続には、PeerConnectionを使います。Soundtrapにてビデオチャットを行いながら音楽制作を行うためには、ビデオチャットを行うWebcam stream、音楽制作用に楽器のステレオ音声を送るStereo music streamが必要になります。</p>

<p><img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-11.06.21-AM.png" alt="WebRTC_connectionExample" width="540" class="aligncenter size-full wp-image-8689" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-11.06.21-AM.png 586w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-11.06.21-AM-300x146.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-11.06.21-AM-207x101.png 207w" sizes="(max-width: 586px) 100vw, 586px" /></p>

<p>ビットレートはそれぞれStereo music Streamが128Kbps、Webcam streamがVP8 HD 2Mbpsで、PeerConnectionを使ってStreamしています。</p>

<h3>5. Vocalの録音</h3>

<p>録音の最後はVocalです。これで曲のメイン素材の録音、作成が完成です。</p>

<div id="attachment_8892" style="width: 710px" class="wp-caption aligncenter">
<a href="http://youtu.be/PMH1vM-dSc0?t=23m30s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">
<img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-6.36.43-PM.png" alt="CaptureVocalByNexus5" width="540" class="aligncenter size-full wp-image-9150" style="border:1px solid #dddddd" />
</a>
<p class="wp-caption-text">Nexus 5を片手に会場で歌声を録音する様子</p>
</div>

<p>Vocalの録音はNexus 5(携帯電話)を使用して、getUserMedia()を使って録音を行います。実際に歌うのはセッションのオーディエンスです！！（私の声も聞こえるかもです）マイクではなく、携帯電話をマイク代わりにして、Soundtrapに直接録音を行います。</p>

<h3>6. Mix Down</h3>

<p>「マスタリング」とも呼ばれ、各パート毎に音量の調節、音程の音量調節(Equalizing)、また残響(Reverb、Echo)の調節を行うことで各パートの音のバランスをとり、ハーモニーを深め、そして際立たせます。</p>

<p>SoundtrapはCloud型の音楽制作Webアプリケーションですので、インターネットに接続できる環境があればどこからでも音楽制作に参加することができます。もちろん、Mix Downをすることも可能です。セッションでは、Keyboard を弾いていた場所(<a href="http://goo.gl/lzrbpf" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">GoogleさんのSan Francisco Office</a>内で、セッションは<a href="http://goo.gl/M8moUo" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Moscone West</a>です)でMix Downが行われました。</p>

<div id="attachment_8892" style="width: 710px" class="wp-caption aligncenter">
<img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-12.17.15-PM.png" alt="WebAudio_mixdown" width="574" height="322" class="aligncenter size-full wp-image-8730" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-12.17.15-PM.png 574w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-12.17.15-PM-300x168.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-11-at-12.17.15-PM-207x116.png 207w" sizes="(max-width: 574px) 100vw, 574px" />
<p class="wp-caption-text">SoundTrap上に各パートが録音された状態</p>
</div>

<p>その結果、Google I/Oのテーマ曲はこのように仕上がりました。（下の画像をクリックすると視聴できます）</p>

<div id="attachment_8892" style="width: 710px" class="wp-caption aligncenter">
<a href="http://youtu.be/PMH1vM-dSc0?t=34m55s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">
<img src="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.07.32-PM.png" alt="PlaySong" width="540" class="aligncenter size-full wp-image-9160" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.07.32-PM.png 640w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.07.32-PM-300x163.png 300w, /wp-content/uploads/2014/07/Screen-Shot-2014-07-25-at-7.07.32-PM-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" />
</a>
<p class="wp-caption-text">波形をWebGL表示した背景と共に再生されました</p>
</div>

<p>こちらは Soundtrap内に保存されている音源をそのまま視聴できます 。<a href="https://www.soundtrap.com/io2014" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">試聴する</a></p>

<h2>開発言語にDartを選択した3つの理由</h2>

<p><img src="/wp-content/uploads/2014/07/dart_logo.png" alt="dart_logo" width="387" height="181" class="aligncenter size-full wp-image-9189" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2014/07/dart_logo.png 387w, /wp-content/uploads/2014/07/dart_logo-300x140.png 300w, /wp-content/uploads/2014/07/dart_logo-207x96.png 207w" sizes="(max-width: 387px) 100vw, 387px" /></p>

<p>冒頭に、Soundtrapの開発にDartが採用されたことに触れました。以下の3点が、Dartを選択した理由だそうです。</p>

<h3>親しみやすさ(Familiarity)</h3>

<p>Dartはとにかく簡単に学べるようにと考えられて作られいて、Class や単一継承にセミコロン、中括弧を使うところがJavaScriptや、Java、C++にとても似ているので開発者にはとても親しみやすい。</p>

<h3>拡張性(Scalability)</h3>

<p>Webアプリの開発はとても小さなスクリプトから開始し、それが成長して大規模で複雑なアプリになっていく。従って大規模になった時のことを考えると、スケールアップができる環境で開発を開始することが望まれる。DartではそれをLibrary、またPackageという形で実現している。</p>

<p>Soundtrapの開発は、これらのDartの拡張性によってアプリが大規模になった時でも、開発のスピード（生産性）を落とすことなく進めることができたそうです。</p>

<h3>生産性(Productivity)</h3>

<p>Dartで開発する時は、Dart Editorを使うことができます。このEditorではコードを静的監視しているので生産性がとても高いです。例えば、静的監視されているので、アプリを動作させなくても、Unitテストを走らせなくても構文エラーをリアルタイムに知ることができるのできます。つまりDart Editorは、世の中にある熟れたIDEと同じような機能が搭載されているツールになっているので、不自由はなく、生産性高く進めることが可能です。</p>

<h2>まとめ</h2>

<p>Soundtrapは、OpenWeb技術であるMedia Capture、Audio Processiong、Real-time CommunicationのAPIの紹介にはとてもよいアプリケーションです。今回はChrome上で動作させて紹介しましたが、これらの技術はOpenWeb技術ですので、デスクトップ、モバイル環境にある別のブラウザでも動作させることが可能です（可能になるでしょう）。また、これらの技術を使うことのできる世の中のデバイス数は、以下の通りです。</p>

<ul>
  <li><B>Web Audio</b> 20億のデバイス（10億がモバイル）</li>
  <li><b>WebRTC</b> 15億のデバイス（3億がモバイル）</li>
</ul>

<p>そして Android LのWebViewではChrome V36相当になりますので、Web Audio、WebRTCがほぼすべてのAPIをサポートされた形で使えるようになります。30日でのアクティブユーザ数が10億のAndroidという環境ですので、ものすごく多くのユーザーに対して、これらを使ったアプリケーションの提供が可能になるため、そのインパクトは絶大です。</p>

<h2>Q&amp;Aで質問が出た項目</h2>

<h3>Q. Android LでのAudioのLatencyについて教えてください。</h3>

<p><b>A.</b> 数値の約束はできないが、改善に向けて真剣に取り組んでいる。ICS、JB、Kitkatで20msまでLatencyを短縮することはできた。しかしながら、我々としてもまだまだ満足はしていないので改善していくだろう。</p>

<h3>Q. MIDIのサポートについてどこまで進んでいるのか教えてください。</h3>

<p><b>A.</b> Web MIDI APIはOpenWebStandardとして標準化が始まったばかりで、Chromeは先行して実装を行った。次期、またはその次のVersionでは全ての機能の実装を行い、さらにFlagの設定なしでの動作させる予定です。セッション内でSoundtrapで利用しましたが、もちろんセッション内だけなく、Soundtrap内ではMIDIの接続も利用することが可能です。<br>Chrome以外のブラウザでのサポートに関しては、現状様子見を行っています</p>

<h3>Q. Mix Downはクライアントサイドで行っているのか、サーバーサイドで行っているのか教えてください。</h3>

<p><b>A.</b> 音源はクラウド上のサーバー側にあって、再生をクライアントで行っています。サーバサイドはJavaとScalaで利用可能なPlay Frameworkを使っています。クライアント側で再生する時は、サーバー側でMix DownしたMP3ファイルを作成し、それをSoundtrapというクライアントアプリ側で再生をするという仕組みになっています。</p>

<h2>セッションを終えて感じたこと</h2>

<p>Before Web Audio/MIDIの時代では、DAW（音楽制作用ソフトウェア）を購入し、Audio I/F、キーボード、マイク等のハードウェアを揃えながら満足できる音楽制作の環境を整えるまでには、いささか道のりが長く時間がかかるのが常識で、またそこを楽しむこともありました。</p>

<p>しかし、Webブラウザで、デスクトップはもちろん、モバイルデバイス上での制作、さらには遠隔地とつないで、誰でも手軽に音楽制作に手を伸ばすことのできる時代（味見も含めて）なのだなと改めて感じました。制作はもちろんですが、ツールの作成、エフェクトの作成等、少し頑張れば、かゆいところに手の届くいわゆるオレシステムを作り上げることもそこまでハードルは高くないと思います。</p>

<p>今やアマチュアバンドとはいってもホームページを持ち、そこには自ら制作した楽曲、さらに自らで制作したであろう、とはいえクロリティの高いプロモーションビデオまでも揃えて公開する時代。昔はインスピレーションを得たらその場でフレーズやパターンの作成ができ、モバイルできる音楽制作専用ハードが流行した時もありました。</p>

<p>これからはインスピレーションを得たらポケットからさっとモバイルな汎用デバイスを取り出し、ブラウザを立上げDAWのURLに接続をし、その場でフレーズのみならず全体の流れを録音し楽曲にまとめることも容易になるでしょう。そして、遠隔にいる友人にバッキング、Mix Downしてもらい、その場でプロモーションビデオまで制作する一連の流れを即興でできてしまう、なんていうアマチュアでもプロ顔負けの音楽制作環境を持てる、素晴らしい時代が確実に来るだろうと感じました。同時に、これらの音楽制作に欠かせない技術と他のOpenWeb技術を連携させることでどのような新しい表現方法、また価値、文化が生まれるのかワクワクを膨らませてきた次第です。</p>

<p>W3Cの一員として標準化を進めているWeb MIDI API。今回は少しだけ登場し、スライドとしての説明はありませんでしたが、音楽を制作をする上ではコアになる技術です。標準化までこぎつけられるように強く推進をしていかねばとも感じました。</p>

<h2>紹介されたURL等</h2>

<ul>
  <li><a href="https://www.soundtrap.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Soundtrap</a>：デモで使われたOpenWeb上に構築された音楽制作環境</li>
  <li><a href="http://www.html5rocks.com/en/tutorials/webrtc/basics/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Getting Started with WebRTC</a>：WebRTCのチュートリアル（英語）</li>
  <li><a href="http://www.html5rocks.com/ja/tutorials/webaudio/intro/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Getting Started with the Web Audio API</a>：Web Audio APIのチュートリアル(日本語)</li>
  <li><a href="https://www.dartlang.org/docs/tutorials/get-started/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Get Started with Dart</a>：Dartのチュートリアル（英語）</li>
</ul>
]]></content:encoded>
		
		<series:name><![CDATA[Google I/O 2014 特集]]></series:name>
	</item>
		<item>
		<title>Googleはなぜモバイルに力を入れるのか？これからのWebパフォーマンスで注力すべきポイント</title>
		<link>/furoshiki/8582/</link>
		<pubDate>Fri, 25 Jul 2014 04:00:17 +0000</pubDate>
		<dc:creator><![CDATA[川田寛]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Google I/O 2014]]></category>
		<category><![CDATA[パフォーマンス]]></category>
		<category><![CDATA[モバイル]]></category>

		<guid isPermaLink="false">/?p=8582</guid>
		<description><![CDATA[連載： Google I/O 2014 特集 (4)こんにちは、川田です。Googleはここ最近、デスクトップ向けWebに対して、ほとんどの関心を失っているように見えます。HTML5ブームも過ぎて、やることがなくなってし...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/google-io-2014-2/" class="series-191" title="Google I/O 2014 特集" data-wpel-link="internal">Google I/O 2014 特集</a> (4)</div><p>こんにちは、川田です。Googleはここ最近、デスクトップ向けWebに対して、ほとんどの関心を失っているように見えます。HTML5ブームも過ぎて、やることがなくなってしまったのでしょうか？……いえいえ、そうでもありません。昨今の待ったなしで進む技術革新の中で、彼らは「ある問題」と戦っているようです。</p>

<h2>Webは「モバイル」中心の時代へ移っていく</h2>

<div style="float:right;margin-left:20px;margin-bottom:20px"><a href="https://html5experts.jp/wp-content/uploads/2014/07/f82880303ce2a094f6748c71ccd9e08c.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/f82880303ce2a094f6748c71ccd9e08c-300x187.png" alt="スクリーンショット 2014-07-10 11.33.15" width="300" height="187" class="alignnone size-medium wp-image-8596" srcset="/wp-content/uploads/2014/07/f82880303ce2a094f6748c71ccd9e08c-300x187.png 300w, /wp-content/uploads/2014/07/f82880303ce2a094f6748c71ccd9e08c-207x129.png 207w, /wp-content/uploads/2014/07/f82880303ce2a094f6748c71ccd9e08c.png 470w" sizes="(max-width: 300px) 100vw, 300px" /></a><br /><a href="http://investor.google.com/pdf/2014Q1_google_earnings_data.pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google Inc. First Quarter 2014 Results</a></div>

<p>すでにご存知の方も多いと思いますが、GoogleのビジネスモデルはWebに強く依存しています。2014年1Qの決算で、Googleは全売上の約68%が自社のWeb系サービスの広告収入であり、約22%はAdsenseなどの他のWebサイト向けの広告であると報告しました。Webに依存したビジネスが実に9割を占め、1日に約120億円の収入をWebから得ています。もっと簡単に言えば、<strong style="font-size:130%">Webだけで、タイの国民全員の給料分ぐらい稼いじゃってます。</strong>当然、Webの進化をやめてしまうなんてことは、考えにくいでしょう。</p>

<p>彼らにとって、利用者がどこからWebにアクセスするのかは、とても重要な情報となります。むしろ、Googleに限らず、Webでサービスを提供している全ての人にとっても重要なことでしょう。人々は普段、どんなコンピュータを使っているのか？どのようなデバイスからインターネットにアクセスするのか？そのことが、私たちのビジネスにとって大きな意味を持ちます。</p>

<p>そしてここ最近、Googlerがいろいろな発表の場でよく口にしているのが「<strong>モバイル</strong>」というキーワードです。これから先、Webの利用者はモバイルからやってくると、Googleは考えているようです。そのことを証明するかのように、現場の開発者からマーケティング・経営者まで一丸となって、これからやって来るモバイルの時代に向けた取り組みをアピールしています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/709f657b9e0fe7c6dc483643a3c959b2.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/709f657b9e0fe7c6dc483643a3c959b2.png" alt="Global Smartphone Shipment" class="alignnone size-medium wp-image-8640" srcset="/wp-content/uploads/2014/07/709f657b9e0fe7c6dc483643a3c959b2.png 640w, /wp-content/uploads/2014/07/709f657b9e0fe7c6dc483643a3c959b2-300x189.png 300w, /wp-content/uploads/2014/07/709f657b9e0fe7c6dc483643a3c959b2-207x130.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><em>&#8220;AndroidとChrome、2つの巨大なオープンプラットフォームについて。スマートフォンは2013年4Qに、3.15億台の出荷があった。Androidは毎年利用者が倍増しており、現在は10億ものアクティブユーザがいる。将来的にはAndroidを、50億人にリーチしたいと考えている。&#8221; &#8212;&#8212; Google 経営者 Sundar Pichai </em>(<a href="https://www.google.com/events/io" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google I/O 2014 &#8211; 2014.06.25</a>)</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/b6a9cba44576ea4e41bc39b49ba81fe01.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/b6a9cba44576ea4e41bc39b49ba81fe01.png" alt="デスクトップよりモバイルの方が売れているし、使われている" class="alignnone size-medium wp-image-8303" srcset="/wp-content/uploads/2014/07/b6a9cba44576ea4e41bc39b49ba81fe01.png 640w, /wp-content/uploads/2014/07/b6a9cba44576ea4e41bc39b49ba81fe01-300x221.png 300w, /wp-content/uploads/2014/07/b6a9cba44576ea4e41bc39b49ba81fe01-207x152.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><em>&#8220;2014年1月に、ChromeのレンダリングエンジンであるBlinkをどう変えていこうかという話し合いをした。結果としては『モバイルが大事』ということになった。デスクトップよりもモバイルの方が売れているし使われる。しかし開発者の立場から見ると、残念ながらWebよりネイティブの方が多いという状況だ。我々はHTML5の問題点をヒアリングし、改善を進めている。&#8221; &#8212;&#8212; Google Chrome開発者 及川卓也 </em>(<a href="http://atnd.org/events/51627" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Night &#8211; 2014.06.14</a>)</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/1186279c58f3a02a633b4f41b3d2b4a81.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img style="border:1px solid gray" src="/wp-content/uploads/2014/07/1186279c58f3a02a633b4f41b3d2b4a81.png" alt="Mobile % of Total Global Internet Traffic(Mobile Web performance auditing - Paul Lewis)" class="alignnone size-medium wp-image-8406" srcset="/wp-content/uploads/2014/07/1186279c58f3a02a633b4f41b3d2b4a81.png 640w, /wp-content/uploads/2014/07/1186279c58f3a02a633b4f41b3d2b4a81-300x168.png 300w, /wp-content/uploads/2014/07/1186279c58f3a02a633b4f41b3d2b4a81-1024x576.png 1024w, /wp-content/uploads/2014/07/1186279c58f3a02a633b4f41b3d2b4a81-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><em>&#8220;アメリカの成人の34%にとって、主要のインターネットアクセスはスマートフォンだ。モバイルのトラフィックは増加しており、来年にも過半数のユーザがモバイルでインターネットを利用することになる。&#8221; &#8212;&#8212; Google Webコンテンツ開発者 Paul Lewis </em>(<a href="https://www.google.com/events/io" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google I/O 2014 &#8211; 2014.06.26</a>)</p>

<h2>モバイルであることが前提の、Webとパフォーマンス</h2>

<div style="float:right;margin-left:20px;margin-bottom:20px"><a href="https://html5experts.jp/wp-content/uploads/2014/07/IMGP0407.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/IMGP0407-300x168.jpg" alt="Device Lab" width="300" height="168" class="alignnone size-medium wp-image-8765" srcset="/wp-content/uploads/2014/07/IMGP0407-300x168.jpg 300w, /wp-content/uploads/2014/07/IMGP0407-207x116.jpg 207w, /wp-content/uploads/2014/07/IMGP0407.jpg 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></div>

<p>モバイルは、Web開発者/制作者にとっては厄介な存在です。動作環境が増えるのですから、デザインにコーディング、動作テストと、やらなくてはいけない作業も増えてしまいます。Googleは、その手間をできる限り省き、コンテンツ制作に専念できるようにしようと考えています。その成果の一つが、「Material Design(マテリアル・デザイン)」です。</p>

<p>UXの向上を図る上で、デザインは重要です。ただ、デザインだけではどうにもなりません。「パフォーマンス」も欠かすことのできない重要な要素なのです。Google I/Oでは、多くのエンジニアが「Polymer」「Material Design」「Android」など、宝物のような名前がついたキーワードに目を奪われました。実際にメディアでも、これらのキーワードが大きく取り上げられています。しかし、冷静に見るとそれなりの数の「パフォーマンス」をテーマとしたセッションが開かれています。パフォーマンス改善はすごく地味だけど、すごく重要な取り組みと彼らは認識しているのです。</p>

<p>Googleでは「<a href="http://developers.google.com/speed/pagespeed/insights/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PageSpeed Insights</a>」と呼ばれるサービスを提供しています。イベントに参加していると、割と頻繁に目に入りました。Paul Lewis氏のセッション「Mobile Web performance auditing」では、その活用方法についてかなり具体的なアイデアと共に紹介しています。その内容を見てみましょう。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/b5fbca375e400b80887bba4bbc6307eb.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img style="border:1px solid gray" src="/wp-content/uploads/2014/07/b5fbca375e400b80887bba4bbc6307eb.png" alt="PageSpeed Insightsサンプル" class="alignnone size-medium wp-image-8441" srcset="/wp-content/uploads/2014/07/b5fbca375e400b80887bba4bbc6307eb.png 640w, /wp-content/uploads/2014/07/b5fbca375e400b80887bba4bbc6307eb-300x195.png 300w, /wp-content/uploads/2014/07/b5fbca375e400b80887bba4bbc6307eb-207x134.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>「<a href="http://developers.google.com/speed/pagespeed/insights/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PageSpeed Insights</a>」とは、Webに公開しているページのURLを与えると、そのページの問題点、改善方法を提案してくれるGoogleのサービスです。競合するものとして、マイクロソフトの「<a href="https://www.modern.ie/ja-jp" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">modern.IE site scan</a>」が挙げられますが、こちらはWebコンテンツのポータビリティを評価する方向に力を入れています。パフォーマンス改善という観点では、Google側の方がより尖っているという印象です。タブが「Mobile」が最初になっている点からも、彼らの作るツールがモバイルファーストの思考で動いているというのを感じとれます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/6098ddfd0579ccd63cf201a9ff334c15.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/6098ddfd0579ccd63cf201a9ff334c15.png" alt="PageSpeed Insights" class="alignnone size-medium wp-image-8763" srcset="/wp-content/uploads/2014/07/6098ddfd0579ccd63cf201a9ff334c15.png 640w, /wp-content/uploads/2014/07/6098ddfd0579ccd63cf201a9ff334c15-300x177.png 300w, /wp-content/uploads/2014/07/6098ddfd0579ccd63cf201a9ff334c15-207x122.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>さっそく、<a href="http://furoshiki.hatenadiary.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">私がはてなで運営しているブログ</a>をPageSpeed Insightsで評価してみたところ、Mobile-60点/Desktop-28点/UX-99点という結果でした。Paul Lewis氏いわく、それでは全然ダメとのこと。PageSpeed Insightsでのスコアは、大体目安として、Mobile-85点以上/Desktop-90点以上/UX-100点が望ましいそうです。いくつか日本のブログサービスでテストしてみたのですが、この条件が満足できているのを見つけることができませんでした。それどころか、Google自身が提供しているサービス「Blog Spot」ですら、この条件を満足できていません。そこまで頑張らなきゃいけないのかと、その必要性に疑いの目を持ってしまいます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/1240ea7bf50ab91bbaae245f2b9422d2.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/1240ea7bf50ab91bbaae245f2b9422d2.png" alt="200ミリ秒の遅延が0.3%の機会損失につながる。" class="alignnone size-medium wp-image-8409" srcset="/wp-content/uploads/2014/07/1240ea7bf50ab91bbaae245f2b9422d2.png 640w, /wp-content/uploads/2014/07/1240ea7bf50ab91bbaae245f2b9422d2-300x168.png 300w, /wp-content/uploads/2014/07/1240ea7bf50ab91bbaae245f2b9422d2-1024x575.png 1024w, /wp-content/uploads/2014/07/1240ea7bf50ab91bbaae245f2b9422d2-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>ところが、Paul Lewis氏いわく、200ミリ秒の遅延が0.3%の機会損失に繋がると。パフォーマンスの改善が、そのまま収益に結びつくのだと強く主張しています。Webは速ければ速いほど、価値を発揮するのです。もちろん、それを実現するにはそれなりにコンピュータ科学の知識を必要とするわけですが、私たちエンジニアによる純粋な技術による改善で、利用者の増加に貢献できることが残されているというのは、大変喜ばしいことでしょう。</p>

<p>パフォーマンスの問題について、Paul Lewis氏は「Page Speed」と「Runtime」の2つの観点から、その対策方法について紹介がありました。この2つを軸に、他のGoogle I/Oのセッションの内容も交えながらその考え方について見つめてみましょう。</p>

<h2>Page Speedはどのように改善するのか？</h2>

<p>Page Speedの改善とは何か？単純に言えば「<strong>Webページの表示を3秒以下に抑えよう</strong>」ということです。そのための方法として、Paul Lewis氏は以下の方法を提案しています。</p>

<p><a style="float:right;width:200px" href="/wp-content/uploads/2014/07/585037d616244be479e892792bc9e4f3.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img style="border:1px solid gray;width:200px" src="/wp-content/uploads/2014/07/585037d616244be479e892792bc9e4f3.png" alt="スクリーンショット 2014-07-11 16.23.05" class="alignnone size-medium wp-image-8802" srcset="/wp-content/uploads/2014/07/585037d616244be479e892792bc9e4f3.png 400w, /wp-content/uploads/2014/07/585037d616244be479e892792bc9e4f3-300x171.png 300w, /wp-content/uploads/2014/07/585037d616244be479e892792bc9e4f3-207x118.png 207w" sizes="(max-width: 400px) 100vw, 400px" /></a></p>

<h3>1. リソースを最適化せよ(Optimize resources.)</h3>

<p>Webページを構成するデータのうち、平均63%が画像ファイルです。最適化が必要となります。画像ファイルの圧縮を改善すると、データ量は大きく削減されます。CSS/JavaScriptについても、不要なスペースなどを削って圧縮(Minify)するとよいでしょう。</p>

<p>(補足：のちに説明がありますが、これらはプリプロセッサーの活用を習慣付けるとよいでしょう。人間の手でやっていてはキリがないので、徹底的に自動化させてしまうことです。)</p>

<p><a style="float:right;width:200px" href="/wp-content/uploads/2014/07/5a025405c534207eb4e5aa1effb4b7bd.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img style="border:1px solid gray;width:200px" src="/wp-content/uploads/2014/07/5a025405c534207eb4e5aa1effb4b7bd.png" alt="スクリーンショット 2014-07-11 16.39.04" width="300" height="156" class="alignnone size-medium wp-image-8816" srcset="/wp-content/uploads/2014/07/5a025405c534207eb4e5aa1effb4b7bd.png 400w, /wp-content/uploads/2014/07/5a025405c534207eb4e5aa1effb4b7bd-300x156.png 300w, /wp-content/uploads/2014/07/5a025405c534207eb4e5aa1effb4b7bd-207x107.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>2. リクエスト数を減らせ(Reduce the number of requests.)</h3>

<p>リクエストはWebページの表示をブロックさせることがあります。リクエスト数が減るとそれだけ表示が速くなことを意味します。</p>

<p>(補足：SPDYやHTTP2.0が関わってくると、リクエスト数だけでなく、コネクション数も重要になってきたりしますね。いずれにせよ、少ないことはよいことです)</p>

<p><a style="float:right;width:200px" href="/wp-content/uploads/2014/07/b464cb3d6f72936e5bab22190a4ba8cd.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img style="border:1px solid gray;width:200px" src="/wp-content/uploads/2014/07/b464cb3d6f72936e5bab22190a4ba8cd-300x168.png" /></a></p>

<h3>3. リダイレクトをやめろ(Avoid redirects.)</h3>

<p>リダイレクトにはDNSの名前解決、TCPコネクションの接続など、Webページの表示までに要する時間が長くなります。パフォーマンスを意識するなら、リダイレクトさせてはいけません。</p>

<p>(補足：モバイルの場合、よくあるのは「m.〜〜」というURLにリダイレクトされるケースです。当然ですが、その処理を行うためにWebページ読み込みのパフォーマンスは劣化することになります。日本の場合は、モバイル網のDNSサーバのパフォーマンスが問題となることも少なくありません)</p>

<p><a style="float:right;width:200px" href="/wp-content/uploads/2014/07/871614cfadc9da747294435964582b2a.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img style="border:1px solid gray;width:200px" src="/wp-content/uploads/2014/07/871614cfadc9da747294435964582b2a-300x167.png" alt="スクリーンショット 2014-07-11 16.34.24" width="300" height="167" class="alignnone size-medium wp-image-8813" srcset="/wp-content/uploads/2014/07/871614cfadc9da747294435964582b2a-300x167.png 300w, /wp-content/uploads/2014/07/871614cfadc9da747294435964582b2a-207x115.png 207w, /wp-content/uploads/2014/07/871614cfadc9da747294435964582b2a.png 400w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>4. レンダリングの順序に優先度をつけろ(Prioritize for the critical rendering path.)</h3>

<p>Webページ全てを読み込んだ時間よりも、見えている領域の読み込み完了(Visually Complete)に、利用者は関心を示します。そこに優先度を高く持っていくべきです。</p>

<p>(※補足：実際に、W3CのWeb-perf WGでも、Resource Prioritiesという仕様の検討が進められていますね。jQueryだと、LazyLoadプラグインがあり、画像ファイルの読み込み順序をコントロールすることができます)</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/66714330ca5b3d556b9626ef265fa9371.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img style="border:1px solid gray" src="/wp-content/uploads/2014/07/66714330ca5b3d556b9626ef265fa9371.png" alt="GruntとGulp" class="alignnone size-medium wp-image-8818" /></a></p>

<p>一連の作業は、GruntやGulpが助けてくれます。利用してみるとよいでしょう。</p>

<h2>Runtimeはどのように改善するのか？</h2>

<p>Runtimeの改善とは何か？単純に言えば「<strong>Webページを60FPSで動かそう</strong>」ということです。一般的なディスプレイ(スクリーン)は約1/60秒周期で内容が更新されるため、アニメーションなどの処理はその特性に合わせていくことで、滑らかな動きを実現することができます。そのための方法として、Paul Lewis氏、Paul Irish氏は以下の方法を提案しています。</p>

<p><a style="float:right;width:200px" href="/wp-content/uploads/2014/07/b9a4c28453333283c8bb8f4e7ebdd9df.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img style="width:200px;border:solid 1px gray" src="/wp-content/uploads/2014/07/b9a4c28453333283c8bb8f4e7ebdd9df-300x129.png" alt="スクリーンショット 2014-07-11 17.59.45" width="300" height="129" class="alignnone size-medium wp-image-8836" srcset="/wp-content/uploads/2014/07/b9a4c28453333283c8bb8f4e7ebdd9df-300x129.png 300w, /wp-content/uploads/2014/07/b9a4c28453333283c8bb8f4e7ebdd9df-207x89.png 207w, /wp-content/uploads/2014/07/b9a4c28453333283c8bb8f4e7ebdd9df.png 400w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>1. 変形や透過によるアニメーションは制限しろ(Restrict animations to transforms and opacity.)</h3>

<p>処理コストの高い描画計算処理は控えるべきです。DOMの形状が変わるとLayout処理のコストは増大するし、透過処理などはPaint処理をコスト増大させます。このような「Expensive Animations」は、約1/60秒以下での処理に収まらないことがあり、注意する必要があります。</p>

<p><a style="float:right;width:200px" href="/wp-content/uploads/2014/07/5a99bab98fe4b6a0118fc89419d18245.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img style="width:200px;border:solid 1px gray" src="/wp-content/uploads/2014/07/5a99bab98fe4b6a0118fc89419d18245-300x118.png" alt="スクリーンショット 2014-07-11 19.14.30" width="300" height="118" class="alignnone size-medium wp-image-8838" srcset="/wp-content/uploads/2014/07/5a99bab98fe4b6a0118fc89419d18245-300x118.png 300w, /wp-content/uploads/2014/07/5a99bab98fe4b6a0118fc89419d18245-207x81.png 207w, /wp-content/uploads/2014/07/5a99bab98fe4b6a0118fc89419d18245.png 600w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>2. requestAnimationFrameを使え(Use requestAnimationFrame.)</h3>

<p>画面のリフレッシュレートに合わせて、アニメーション処理は実行させるようにしましょう。例えば、setIntervalなどを利用し、16ms周期でコールバックさせ擬似的にリフレッシュレートを合わせようとすると、タイミングがズレて無駄が起きます。画面のリフレッシュレートに合わせるには、requestAnimationFrameと呼ばれるAPIを利用する必要があります。</p>

<p><a style="float:right;width:200px" href="/wp-content/uploads/2014/07/0e865121fe9e28053257f81acab3b006.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img style="width:200px;border:solid 1px gray" src="/wp-content/uploads/2014/07/0e865121fe9e28053257f81acab3b006-300x162.png" alt="スクリーンショット 2014-07-11 17.45.05" width="300" height="162" class="alignnone size-medium wp-image-8839" srcset="/wp-content/uploads/2014/07/0e865121fe9e28053257f81acab3b006-300x162.png 300w, /wp-content/uploads/2014/07/0e865121fe9e28053257f81acab3b006-207x111.png 207w, /wp-content/uploads/2014/07/0e865121fe9e28053257f81acab3b006.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>3. レイアウトの値を読み込んでから書き出せ(Read layout values, then write.)</h3>

<p>レイアウト(DOM)の値は変数のように扱ってはいけません。横幅などの取得が必要であれば、最初に取り出してキャッシュしておきましょう。読→書→読→書を繰り返すと、無駄なLayout処理が何度も発生するという「Layout Thrashing」という現象が起きます。読→読→書→書が理想です。</p>

<p><a style="float:right;width:200px" href="/wp-content/uploads/2014/07/afea6f5f4d6d46f7c0c2d6c63cf1eeb6.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img style="width:200px;border:solid 1px gray" src="/wp-content/uploads/2014/07/afea6f5f4d6d46f7c0c2d6c63cf1eeb6-300x133.png" alt="スクリーンショット 2014-07-11 17.53.25" width="300" height="133" class="alignnone size-medium wp-image-8840" srcset="/wp-content/uploads/2014/07/afea6f5f4d6d46f7c0c2d6c63cf1eeb6-300x133.png 300w, /wp-content/uploads/2014/07/afea6f5f4d6d46f7c0c2d6c63cf1eeb6-207x91.png 207w, /wp-content/uploads/2014/07/afea6f5f4d6d46f7c0c2d6c63cf1eeb6.png 600w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>4. メモリ効率の高いJavaScriptを(Write fast, memory-efficiant Javascript.)</h3>

<p>メモリを消費するようなJavaScriptの記述方法は、Garbage Collection処理が発生し、1/60秒以内での処理が完結しなくなることがあります。JavaScriptの書き方に、工夫が必要です。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/0f091ce80cbc1c82251d2239150ba188.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/0f091ce80cbc1c82251d2239150ba188.png" alt="スクリーンショット 2014-07-11 19.40.31" class="alignnone size-medium wp-image-8843" srcset="/wp-content/uploads/2014/07/0f091ce80cbc1c82251d2239150ba188.png 640w, /wp-content/uploads/2014/07/0f091ce80cbc1c82251d2239150ba188-300x169.png 300w, /wp-content/uploads/2014/07/0f091ce80cbc1c82251d2239150ba188-1024x577.png 1024w, /wp-content/uploads/2014/07/0f091ce80cbc1c82251d2239150ba188-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>モバイルChromeの解析は、「chrome://inspect/」でできます。お試し下さい。</p>

<h2>難しくなってきている、なんて思いませんか？</h2>

<p>これまではデスクトップPCが一つあればなんとかなっていたWeb開発も、作るための環境と動かすための環境が分離されて、どんどん複雑になってきているなぁという感触を得ています。プレゼンの時も、わざわざカメラを切り替えてモバイルのスクリーンを表示したりなんかしてて「エレガントさに欠るなぁ」「面倒くさいことやってるなぁ」なんて思ったりもしました。もっと言えば、デモしている姿を見てて<strong style="font-size:130%">「モバイル、めちゃくちゃ使いにくそうに扱ってますよね！」「本当はPCでやりたいとか思っていませんか？」</strong>なんてことも、率直な印象として感じました。</p>

<p>こういう不満を感じられることは、本当の本当に幸せに思えたりもします。Googleが悪いとかAppleが悪いとかMicrosoftが悪いとかじゃなく、IT業界全体として、まだまだ発展途上にいると感じさせられるのです。これからもっとよくしようと、動き出せるきっかけがいくらでもあるように思えるのです。もっともっと、進化しますよ！</p>

<p>みなさんはどう思いますか？私はWebの未来に、夢を見過ぎでしょうか？</p>
]]></content:encoded>
		
		<series:name><![CDATA[Google I/O 2014 特集]]></series:name>
	</item>
		<item>
		<title>PhoneGapとは一味違う！純国産ハイブリッドアプリフレームワーク、「アプリカン」事始め</title>
		<link>/htpboost/8318/</link>
		<pubDate>Fri, 25 Jul 2014 00:00:15 +0000</pubDate>
		<dc:creator><![CDATA[畠田 喜丈]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[PhoneGap]]></category>
		<category><![CDATA[ハイブリッド]]></category>
		<category><![CDATA[モバイル]]></category>

		<guid isPermaLink="false">/?p=8318</guid>
		<description><![CDATA[連載： ハイブリッドアプリ開発最前線 (7)アプリカンは、純国産のハイブリッドアプリフレームワークです。いつも使っているエディタだけでアプリが作れるので、開発環境のOSも選びません。 アプリカンは2013年末に公開され、...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/hybrid-special/" class="series-181" title="ハイブリッドアプリ開発最前線" data-wpel-link="internal">ハイブリッドアプリ開発最前線</a> (7)</div><p>アプリカンは、純国産のハイブリッドアプリフレームワークです。いつも使っているエディタだけでアプリが作れるので、開発環境のOSも選びません。</p>

<p>アプリカンは2013年末に公開され、ハイブリッドアプリフレームワークとしては後発ですが、他のフレームワークとは異なるアプローチとして、様々なパートナー企業のサービスのSDKを組み込み、AR機能や、位置情報連動サービスなど複雑なサービスオプション機能を JavaScriptから簡単に呼び出せるようになっています。</p>

<p>基本は無料で利用できますが、前述の高機能なオプションを使ったり、無料ビルドしたアプリに表示される広告バナーを外す場合には有料となります。</p>

<h2>アプリカンの開発に必要なもの</h2>

<ul>
<li>エディタ</li>
<li>好奇心</li>
</ul>

<p>アプリカンの開発には、IDEを用意する必要はありません。
テンプレートとなる <code>web.zip</code> をアプリカンのサイトからダウンロードして開発マシン上で解凍し、そのフォルダの中に HTML5、JavaScript、CSSを作り込んでいき、できあがったものを zipで圧縮して、サーバーにアップロードするだけです。</p>

<p>デバッグは、iOS、Androidそれぞれのアプリマーケットからダウンロードできる アプリカンシミュレータで行います。</p>

<h2>Hello アプリカン World</h2>

<p>それでは実際にアプリカンでお約束のHello Worldを作ってみましょう。</p>

<p>アプリカンでのアプリ作成は3ステップ</p>

<ol>
<li>アプリカンサイトにユーザ登録</li>
<li>HTML5、CSS、JavaScriptでコンテンツを作成</li>
<li>ZIP圧縮して、アプリカンサイトにアップロード</li>
</ol>

<p>この3ステップで、iOSアプリとAndroidアプリを同時に開発することが可能です。</p>

<h3>1. アプリカンにユーザ登録を行う。</h3>

<p>アプリカンサイトにユーザ登録します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/Capture_1.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/Capture_1-300x178.png" alt="Capture_1" width="300" height="178" class="aligncenter size-medium wp-image-8319" srcset="/wp-content/uploads/2014/07/Capture_1-300x178.png 300w, /wp-content/uploads/2014/07/Capture_1-1024x609.png 1024w, /wp-content/uploads/2014/07/Capture_1-207x122.png 207w, /wp-content/uploads/2014/07/Capture_1.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>ユーザー登録、ログインが完了したら、基本になるテンプレートをダウンロードしましょう。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/capture_2.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/capture_2-300x214.png" alt="capture_2" width="300" height="214" class="aligncenter size-medium wp-image-8320" srcset="/wp-content/uploads/2014/07/capture_2-300x214.png 300w, /wp-content/uploads/2014/07/capture_2-1024x733.png 1024w, /wp-content/uploads/2014/07/capture_2-207x148.png 207w, /wp-content/uploads/2014/07/capture_2.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>ユーザー画面の左サイドバーのメニューから各種ライブラリをクリックし、新しく開いたウィンドウから【シンプル】をダウンロードしましょう。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/capture_3.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/capture_3-300x200.png" alt="capture_3" width="300" height="200" class="aligncenter size-medium wp-image-8321" srcset="/wp-content/uploads/2014/07/capture_3-300x200.png 300w, /wp-content/uploads/2014/07/capture_3-207x137.png 207w, /wp-content/uploads/2014/07/capture_3.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>2.HTML5、CSS、JavaScriptでコンテンツを作成</h3>

<p>ダウンロードした<code>web.zip</code>を解凍すると、<code>index.html</code>、<code>applican-config.xml</code>、jsフォルダの中には <code>applican-1.5.js</code>が出てきます。</p>

<p>今回はHello Worldを表示するだけなので、 <code>index.html</code>を編集します。いつもお使いのエディタで <code>index.html</code>を開き、&#8220;タグの中の&#8221;SAMPLE&#8221;を &#8220;Hello World&#8221;に書き換え保存して終了します。</p>

<h3>3.ZIP圧縮して、アプリカンサイトにアップロード</h3>

<p>webディレクトリごと ZIPファイルに圧縮できたら、それをサイトにアップロードします。先ほどのアプリカンサイトにログインした状態から、プロジェクトを作成します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/capture_4.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/capture_4-300x185.png" alt="capture_4" width="300" height="185" class="aligncenter size-medium wp-image-8322" srcset="/wp-content/uploads/2014/07/capture_4-300x185.png 300w, /wp-content/uploads/2014/07/capture_4-1024x632.png 1024w, /wp-content/uploads/2014/07/capture_4-207x127.png 207w, /wp-content/uploads/2014/07/capture_4.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>[新しいプロジェクトを作成]をクリックし、プロジェクト名、対象デバイス、プロジェクトの説明を入力し、作成ボタンをクリックします。</p>

<p>プロジェクト一覧に先ほど作成したプロジェクトができているので【選択】ボタンをクリックします。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/capture_5.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/capture_5-300x235.png" alt="capture_5" width="300" height="235" class="aligncenter size-medium wp-image-8323" srcset="/wp-content/uploads/2014/07/capture_5-300x235.png 300w, /wp-content/uploads/2014/07/capture_5-1024x802.png 1024w, /wp-content/uploads/2014/07/capture_5-207x162.png 207w, /wp-content/uploads/2014/07/capture_5.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>プロジェクト画面で【アップロードへ】を選択し、画面の指示に従って先ほど作成した ZIPファイルをサーバにアップロードします。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/capture_6.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/capture_6-300x216.png" alt="capture_6" width="300" height="216" class="aligncenter size-medium wp-image-8324" srcset="/wp-content/uploads/2014/07/capture_6-300x216.png 300w, /wp-content/uploads/2014/07/capture_6-1024x738.png 1024w, /wp-content/uploads/2014/07/capture_6-207x149.png 207w, /wp-content/uploads/2014/07/capture_6.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>アプリカンで作成したアプリは、本番ビルドをかける前に、シミュレータ上で動作確認を行うことができます。iOS端末、Android端末でそれぞれのストアを開き、「アプリカンシミュレータ」を検索しインストールしてください。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/capture_sim.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/capture_sim-300x127.png" alt="capture_sim" width="300" height="127" class="aligncenter size-medium wp-image-8325" srcset="/wp-content/uploads/2014/07/capture_sim-300x127.png 300w, /wp-content/uploads/2014/07/capture_sim-207x87.png 207w, /wp-content/uploads/2014/07/capture_sim.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>アプリカンサイトに登録したユーザー名、パスワードを入力すると、先ほど作成したプロジェクト名が表示されるのでそれをタップし、Hello Worldが表示されることを確認してください。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/ss_1.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/ss_1-168x300.png" alt="ss_1" width="168" height="300" class="aligncenter size-medium wp-image-8326" srcset="/wp-content/uploads/2014/07/ss_1-168x300.png 168w, /wp-content/uploads/2014/07/ss_1-576x1024.png 576w, /wp-content/uploads/2014/07/ss_1-116x207.png 116w, /wp-content/uploads/2014/07/ss_1.png 360w" sizes="(max-width: 168px) 100vw, 168px" /></a>
<a href="https://html5experts.jp/wp-content/uploads/2014/07/ss_2.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/ss_2-168x300.png" alt="ss_2" width="168" height="300" class="aligncenter size-medium wp-image-8327" srcset="/wp-content/uploads/2014/07/ss_2-168x300.png 168w, /wp-content/uploads/2014/07/ss_2-576x1024.png 576w, /wp-content/uploads/2014/07/ss_2-116x207.png 116w, /wp-content/uploads/2014/07/ss_2.png 360w" sizes="(max-width: 168px) 100vw, 168px" /></a>
<a href="https://html5experts.jp/wp-content/uploads/2014/07/ss_3.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/ss_3-168x300.png" alt="ss_3" width="168" height="300" class="aligncenter size-medium wp-image-8328" srcset="/wp-content/uploads/2014/07/ss_3-168x300.png 168w, /wp-content/uploads/2014/07/ss_3-576x1024.png 576w, /wp-content/uploads/2014/07/ss_3-116x207.png 116w, /wp-content/uploads/2014/07/ss_3.png 360w" sizes="(max-width: 168px) 100vw, 168px" /></a></p>

<h2>アプリカンならではの魅力</h2>

<p>アプリカンには、オプションサービス（有料）として、パートナー企業の提供するサービスのSDKを組み込んだベースアプリが用意されています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/07/applican_options.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/07/applican_options-300x73.png" alt="applican_options" width="300" height="73" class="alignnone size-medium wp-image-9105" srcset="/wp-content/uploads/2014/07/applican_options-300x73.png 300w, /wp-content/uploads/2014/07/applican_options-207x50.png 207w, /wp-content/uploads/2014/07/applican_options.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>現在用意されているサービスには、
&#8211; Remote TestKit (アプリ検証サービス)
&#8211; app C cloud (CPI広告)
&#8211; ARAPPLI PLUS (ARアプリ開発)
&#8211; popinfo (PUSH通知サービス)
があります。
これ以外にも、高速なデータ転送を実現するプロトコルスタックオプションや、OCR機能を実現するオプションなどが順次リリースされる予定です。</p>
]]></content:encoded>
		
		<series:name><![CDATA[ハイブリッドアプリ開発最前線]]></series:name>
	</item>
		<item>
		<title>ハイブリッドアプリ開発といえばこれ！PhoneGap/Cordova事始め</title>
		<link>/fenomas/7672/</link>
		<pubDate>Thu, 03 Jul 2014 01:00:09 +0000</pubDate>
		<dc:creator><![CDATA[Andy Hall]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Cordova]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PhoneGap]]></category>
		<category><![CDATA[ハイブリッド]]></category>
		<category><![CDATA[モバイル]]></category>

		<guid isPermaLink="false">/?p=7672</guid>
		<description><![CDATA[連載： ハイブリッドアプリ開発最前線 (2) PhoneGapの概要と歴史 PhoneGapとは、ハイブリッドアプリのフレームワークです。つまり、HTML5コンテンツをラッピングして、いろんなデバイスやOSでネイティブア...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/hybrid-special/" class="series-181" title="ハイブリッドアプリ開発最前線" data-wpel-link="internal">ハイブリッドアプリ開発最前線</a> (2)</div><p><img src="/wp-content/uploads/2014/06/phonegap-banner.png" alt="phonegap-banner" width="900" height="206" class="alignnone size-full wp-image-7704" srcset="/wp-content/uploads/2014/06/phonegap-banner.png 640w, /wp-content/uploads/2014/06/phonegap-banner-300x68.png 300w, /wp-content/uploads/2014/06/phonegap-banner-207x47.png 207w" sizes="(max-width: 900px) 100vw, 900px" /></p>

<h2>PhoneGapの概要と歴史</h2>

<p><a href="http://phonegap.com/" title="PhoneGap" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PhoneGap</a>とは、ハイブリッドアプリのフレームワークです。つまり、HTML5コンテンツをラッピングして、いろんなデバイスやOSでネイティブアプリとしてインストール可能なアプリケーションを作成できる技術です。元々は2009年にiPhoneDevCamp（ハッカソンのようなイベント）で生まれ、Nitobiという会社によって開発されました。2011年にアドビがNitobiを買収し、同時にPhoneGapのソースコードをApache Foundationに寄付して、<a href="http://cordova.apache.org/" title="Apache Cordova" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Apache Cordova</a>というオープンソースプロジェクトが作られました。</p>

<p>現在では、Cordovaという下層のフレームワークの上に、アドビのサービスに連携するPhoneGapのレイヤーが乗っています。しかし使い方はほぼ同じであるため、PhoneGapとCordovaは大体同じものという認識で問題ありません。</p>

<h2>ゼロ（環境設定）からHello Worldまで</h2>

<p>PhoneGap/Cordovaは、<a href="http://nodejs.org/download/" title="Node.js" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Node.js</a>で使うコマンドラインアプリケーションです。ゼロから始める手段は下記の通り：</p>

<h5>1. Node.jsを<a href="http://nodejs.org/download/" title="Node.js" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">インストール</a>して、ターミナルで使えることを確認します：</h5>

<p></p><pre class="crayon-plain-tag">&gt; node -v
v0.10.13
&gt;</pre><p></p>

<h5>2. Node.jsのパッケージマネージャー npm（上記ステップでインストールされます）を利用して<pre class="crayon-plain-tag">cordova</pre>をインストールします：</h5>

<p></p><pre class="crayon-plain-tag">&gt; npm install -g cordova
npm http GET https://registry.npmjs.org/cordova
npm http 200 https://registry.npmjs.org/cordova
...
&gt;</pre><p> 
※ Macでは、多くの場合には<pre class="crayon-plain-tag">sudo</pre>が必要です。エラーが出た場合は、次のコマンドを使ってください：
</p><pre class="crayon-plain-tag">&gt; sudo npm install -g cordova
Password: 
npm http GET https://registry.npmjs.org/cordova
npm http 200 https://registry.npmjs.org/cordova
...
&gt;</pre><p></p>

<h5>3. <pre class="crayon-plain-tag">cordova create</pre>のコマンドを使って、新規プロジェクトを作ります。コマンドのパラメータとして、フォルダ名、アプリID、アプリ名を渡します。</h5>

<p></p><pre class="crayon-plain-tag">&gt; cordova create testapp com.example.test "Test App"
Creating a new cordova project with name "Test App" 
and id "com.example.test" at location "~/testapp"
&gt;</pre><p></p>

<h5>4. 新規プロジェクトのフォルダに移動します：</h5>

<p></p><pre class="crayon-plain-tag">&gt; cd testapp/
&gt;</pre><p></p>

<h5>5. <pre class="crayon-plain-tag">cordova platform add</pre>のコマンドで、作りたいアプリのプラットフォームをプロジェクトに追加します。この例ではAndroidを使います：</h5>

<p></p><pre class="crayon-plain-tag">&gt; cordova platform add android
Creating android project...
...</pre><p></p>

<h5>6. デバイスをマシンに接続して、アプリのビルドと動作確認します。</h5>

<p></p><pre class="crayon-plain-tag">&gt; cordova run android
Generating config.xml from defaults for platform "android"
Preparing android project
...</pre><p></p>

<p><pre class="crayon-plain-tag">cordova run ...</pre>を実行するとアプリのビルドの後、接続されたデバイスにアプリがインストールされ、起動されます。デバイスが接続されていない場合、Cordovaがエミュレータを起動しようとします。また、<pre class="crayon-plain-tag">cordova build</pre><pre class="crayon-plain-tag">cordova emulate</pre>などのコマンドで、個別に各ステップを行えます。利用可能コマンドを確認するには、<pre class="crayon-plain-tag">cordova help</pre>を実行してください。</p>

<p><strong>注意：</strong>ビルドを行うためには、各プラットフォームの仕組みが必要となります。例えばAndroidの場合は<a href="http://developer.android.com/sdk/" title="Android SDK" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Android SDK</a>、iOSの場合は<a href="https://developer.apple.com/xcode/" title="Apple Developer Tools" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">XCode</a>のインストールが完了している必要があります。SDK不要のビルド方法については後ほど説明します。</p>

<h2>PhoneGapアプリの構成について</h2>

<p><pre class="crayon-plain-tag">cordova create</pre>コマンドによって作られるフォルダの中身を確認しましょう：
<img src="/wp-content/uploads/2014/06/pg-folder.png" alt="pg-folder" width="201" height="229" class="aligncenter size-full wp-image-7727" srcset="/wp-content/uploads/2014/06/pg-folder.png 201w, /wp-content/uploads/2014/06/pg-folder-181x207.png 181w" sizes="(max-width: 201px) 100vw, 201px" /></p>

<ol>
<li>ルートにある <pre class="crayon-plain-tag">config.xml</pre> は、アプリのメタデータ（アプリ名など）を定義します</li>
<li><pre class="crayon-plain-tag">/www</pre>フォルダはHTMLアプリのソースです。 <pre class="crayon-plain-tag">cordova create</pre> によって参考用のサンプルコードが作成されますが、編集・削除・上書きを自由にします。このフォルダの <pre class="crayon-plain-tag">index.html</pre> がアプリの初期画面になります。</li>
</ol>

<p>上記2点以外のコンテンツは、編集する必要は通常ありません。</p>

<p>ところで、新規プロジェクトに生成される参考用の<pre class="crayon-plain-tag">index.html</pre>を確認してみると、<pre class="crayon-plain-tag">cordova.js</pre>を指している<pre class="crayon-plain-tag">script</pre>タグがあります。<pre class="crayon-plain-tag">cordova.js</pre>は、フレームワークが動的に生成しますので、ソースにそのファイルを置く必要はありません。しかし、既存のHTMLをPhoneGapアプリに使う時は、<pre class="crayon-plain-tag">cordova.js</pre>を指すスクリプトタグを追加しましょう。</p>

<h2>プラグインについて</h2>

<p>標準のHTMLでは、デバイスの機能（カメラロール、ノーティフィケーションなど）にアクセスできない場合があります。その際は、PhoneGapプラグインを使います。基本的な手順は：</p>

<ol>
<li><a href="http://plugins.cordova.io/" title="Plugin レポジトリ" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Pluginレポジトリ</a>でプラグインを探します。この例では<a href="http://plugins.cordova.io/#/package/org.apache.cordova.dialogs" title="ノーティフィケーションのプラグイン" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ノーティフィケーションのプラグイン</a>を使います。</li>
<li>ターミナルで<pre class="crayon-plain-tag">cordova plugin add [ID]</pre>で追加します：
<pre class="crayon-plain-tag">&gt; cordova plugin add org.apache.cordova.dialogs
Fetching plugin "org.apache.cordova.dialogs" via plugin registry
...</pre></li>
<li>アプリソースのJSから、プラグインのAPIを呼びます：
<pre class="crayon-plain-tag">navigator.notification.prompt("hoge");</pre> </li>
</ol>

<p>JavaScriptで定義されたプラグインのAPIが呼ばれると、各OSの対応するネイティブコードが各デバイスの機能を呼び出す仕組みになっています。その際、デバイス機能がAndroid/iOSなどで仕組みが違っていても、プラグインのインターフェイスは共通なのでPhoneGapアプリのソースを別バージョンに分ける必要がありません。しかしデバイス側の機能がプラットフォームによって実装が変わる場合もあります。その場合は、アプリの動作を各OSの挙動に合わせる必要があったりしますので、各プラグインのドキュメンテーションにある「Quirks（方言）」セクションに目を通しましょう。</p>

<h2>クラウドで行うアプリ作成サービス「PhoneGap Build」</h2>

<p>
アプリのビルドを行う際に、各プラットフォームのSDKが必要と説明しましたが、それが難しい場合もあります。例えばiOSのSDKはMacでしか動きませんので、Windowsでは利用不可能です。</p>

<p>この場合、アドビのクラウドビルドサービス<a href="https://build.phonegap.com/" title="PhoneGap Build" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PhoneGap Build</a>の利用をオススメします。Android、iOS、そしてWindows 8アプリをSDKの準備なしでビルドできます。PhoneGap Buildの使い方で前述の解説と異なるところは主に次の２点です。</p>

<ol>
<li><pre class="crayon-plain-tag">cordova</pre>ではなく<pre class="crayon-plain-tag">phonegap</pre>コマンドを使用</li>
<li>クラウド側で実行するコマンドに<pre class="crayon-plain-tag">remote</pre>というキーワードを追加</li>
</ol>

<p>具体的には次のような流れで利用できます：
</p><pre class="crayon-plain-tag">&gt; sudo npm install -g phonegap
...
&gt; phonegap create test com.example.test2 Test
...
&gt; cd test
&gt; phonegap remote build android</pre><p></p>

<p>初回はPhoneGap Buildのユーザ名、パスワードを要求されます。既存のAdobe IDでログインするか、アドビのWebサイトでAdobe IDを<a href="https://www.adobe.com/account.html" title="Adobe アカウント" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">新規作成</a>（無料）してください。その後、アプリがクラウド側でビルドされます。アプリの確認、インストールなどを<a href="https://build.phonegap.com/" title="PhoneGap Build" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PhoneGap Build</a>サイトでできます。</p>

<h2>まとめ</h2>

<p>PhoneGap/Cordovaは非常に軽量なフレームワークです。HTML5コンテンツのアプリ化に特化しており、他フレームワークとの競合も少なく、比較的導入し易いフレームワークだと言えます。HTMLコンテンツからモバイルアプリまでの最短経路だと思いますので、ぜひお試しください！</p>
]]></content:encoded>
		
		<series:name><![CDATA[ハイブリッドアプリ開発最前線]]></series:name>
	</item>
	</channel>
</rss>
