<?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>I/0 2016 &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/i0-2016/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>Google Assistant、Android N、Daydream、Firebase…Google I/O 基調講演で発表された最新機能を一挙紹介！</title>
		<link>/sakkuru/19832/</link>
		<pubDate>Wed, 06 Jul 2016 02:04:12 +0000</pubDate>
		<dc:creator><![CDATA[本間 咲来]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Firebase]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[I/0 2016]]></category>

		<guid isPermaLink="false">/?p=19832</guid>
		<description><![CDATA[2016年5月18～20日の3日間、Googleの本社ビルのすぐそばにあるショアライン・アンフィシアターでGoogle I/O 2016が開催されました。 例年5千名程の参加者から大幅に増えて、今年は実に約7千人の人々が...]]></description>
				<content:encoded><![CDATA[<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/1706738f-6ac5-6eb3-6ac1-58f6139496ea.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/1706738f-6ac5-6eb3-6ac1-58f6139496ea-640x480.jpeg" alt="1706738f-6ac5-6eb3-6ac1-58f6139496ea" width="640" height="480" class="alignnone size-large wp-image-19883" srcset="/wp-content/uploads/2016/06/1706738f-6ac5-6eb3-6ac1-58f6139496ea.jpeg 640w, /wp-content/uploads/2016/06/1706738f-6ac5-6eb3-6ac1-58f6139496ea-300x225.jpeg 300w, /wp-content/uploads/2016/06/1706738f-6ac5-6eb3-6ac1-58f6139496ea-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>2016年5月18～20日の3日間、Googleの本社ビルのすぐそばにあるショアライン・アンフィシアターでGoogle I/O 2016が開催されました。</p>

<p>例年5千名程の参加者から大幅に増えて、今年は実に約7千人の人々が参加していたようです。屋外イベント施設ということもあり、まるで野外フェスのような雰囲気でした。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/ca24a108-32c6-a0a8-8ada-9b041e73fb51.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/ca24a108-32c6-a0a8-8ada-9b041e73fb51-640x215.jpeg" alt="ca24a108-32c6-a0a8-8ada-9b041e73fb51" width="640" height="215" class="alignnone size-large wp-image-19884" srcset="/wp-content/uploads/2016/06/ca24a108-32c6-a0a8-8ada-9b041e73fb51.jpeg 640w, /wp-content/uploads/2016/06/ca24a108-32c6-a0a8-8ada-9b041e73fb51-300x101.jpeg 300w, /wp-content/uploads/2016/06/ca24a108-32c6-a0a8-8ada-9b041e73fb51-207x70.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>本レポートではGoogle I/O最初のセッションである、基調講演の内容について紹介します。</p>

<h2>Google Assistant</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/4e8f5657-c3d5-2a6f-e88e-4697c0419a44.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/4e8f5657-c3d5-2a6f-e88e-4697c0419a44-640x480.jpeg" alt="4e8f5657-c3d5-2a6f-e88e-4697c0419a44" width="640" height="480" class="alignnone size-large wp-image-19880" srcset="/wp-content/uploads/2016/06/4e8f5657-c3d5-2a6f-e88e-4697c0419a44.jpeg 640w, /wp-content/uploads/2016/06/4e8f5657-c3d5-2a6f-e88e-4697c0419a44-300x225.jpeg 300w, /wp-content/uploads/2016/06/4e8f5657-c3d5-2a6f-e88e-4697c0419a44-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>まず最初にスンダー・ピチャイ氏に紹介されたのが、Google Assistantです。</p>

<p>Google Assistantは新しい対話型のボイスアシスタント機能です。Google製のアシスタント機能といえばGoogle Nowがありますが、これを進化させ、対話型のシステムとしたのがGoogle Assistantのようです。コンテキストを認識し、ユーザーが質問すると現在地や直近のクエリーなどに応じて、適切に答えを返します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/IMG_6458.jpg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/IMG_6458-640x480.jpg" alt="IMG_6458" width="640" height="480" class="alignnone size-large wp-image-19908" srcset="/wp-content/uploads/2016/06/IMG_6458.jpg 640w, /wp-content/uploads/2016/06/IMG_6458-300x225.jpg 300w, /wp-content/uploads/2016/06/IMG_6458-207x155.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>例えば、有名な建築物の前で「これを設計したのは誰？」と質問すると、その場所の情報に応じて回答してくれます。</p>

<p>デモでは、ユーザーが「今夜やってる映画は？」と聞くと、Google Assistantは近くの映画館で上映しているタイトルをいくつか提示し、さらにユーザーが「子どもと一緒に行きたい」と言うと、子どもと一緒に鑑賞するのにふさわしいと思われる映画を提案していました。さらに「4枚チケットが必要ですか？」とGoogle Assistantが尋ねてくるので、ユーザが映画のタイトルや枚数を答えると、自動で予約し、チケットの情報を提示する、というデモが行われました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.07.57.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.07.57-640x437.png" alt="Screen Shot 2016-06-28 at 19.07.57" width="640" height="437" class="alignnone size-large wp-image-19903" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.07.57.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.07.57-300x205.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.07.57-207x141.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>このように、『提案をしてくれる』というのがGoogle Assistantの大きな特徴です。Google Assistantは基調講演の中で発表されたGoogle HomeやGoogle Alloなどの製品にも組み込まれるようです。</p>

<h2>Google Home</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/2e4a891d-0d45-9b7c-447a-7cff49acf55b.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/2e4a891d-0d45-9b7c-447a-7cff49acf55b-640x480.jpeg" alt="2e4a891d-0d45-9b7c-447a-7cff49acf55b" width="640" height="480" class="alignnone size-large wp-image-19879" srcset="/wp-content/uploads/2016/06/2e4a891d-0d45-9b7c-447a-7cff49acf55b.jpeg 640w, /wp-content/uploads/2016/06/2e4a891d-0d45-9b7c-447a-7cff49acf55b-300x225.jpeg 300w, /wp-content/uploads/2016/06/2e4a891d-0d45-9b7c-447a-7cff49acf55b-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>続いてGoogle Assistantの機能を組み込んだGoogle Homeという製品が紹介されました。</p>

<p>Google Assistantのボイスアシスタント機能の他にWifiスピーカーとしての機能もあり、クラウドから音楽のストリーミング再生もできるようです。プレイリストやアルバムへのアクセスもボイスコントロールでき、Google Castを通して、AndroidやiOSのデバイスから音楽を送信することもできるとのことでした。</p>

<p>Amazon Echoと似たような製品のようです。大きさは手のひらに乗るくらいの小さなデバイスでした。今年の後半から使えるようになるとのことです。</p>

<h2>Google Allo</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.44.37.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.44.37-640x364.png" alt="Screen Shot 2016-06-28 at 18.44.37" width="640" height="364" class="alignnone size-large wp-image-19894" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.44.37.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.44.37-300x171.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.44.37-207x118.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>次にAlloというモバイル用のメッセージングアプリが紹介されました。見た目はLineやFacebook messenger等と大差なく見えます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/c6e3abf4-b7ae-efbb-7e80-867811a417c5.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/c6e3abf4-b7ae-efbb-7e80-867811a417c5-640x480.jpeg" alt="c6e3abf4-b7ae-efbb-7e80-867811a417c5" width="640" height="480" class="alignnone size-large wp-image-19878" srcset="/wp-content/uploads/2016/06/c6e3abf4-b7ae-efbb-7e80-867811a417c5.jpeg 640w, /wp-content/uploads/2016/06/c6e3abf4-b7ae-efbb-7e80-867811a417c5-300x225.jpeg 300w, /wp-content/uploads/2016/06/c6e3abf4-b7ae-efbb-7e80-867811a417c5-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>文字や絵文字の大きさを自由に変えることができることが紹介されました。地味だが良い機能、ということで会場が少し盛り上がります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/47f7f868-86d2-5fa4-fb9f-1593fa2db0dd.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/47f7f868-86d2-5fa4-fb9f-1593fa2db0dd-640x480.jpeg" alt="47f7f868-86d2-5fa4-fb9f-1593fa2db0dd" width="640" height="480" class="alignnone size-large wp-image-19872" srcset="/wp-content/uploads/2016/06/47f7f868-86d2-5fa4-fb9f-1593fa2db0dd.jpeg 640w, /wp-content/uploads/2016/06/47f7f868-86d2-5fa4-fb9f-1593fa2db0dd-300x225.jpeg 300w, /wp-content/uploads/2016/06/47f7f868-86d2-5fa4-fb9f-1593fa2db0dd-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>しかし当然のことながら、ただのメッセージングアプリではありません。このAlloにはGoogle Assistantの機能が組み込まれており、なんとチャットのテキストや画像を解析して、返信用のテキストを複数提案してくれます。</p>

<p>例えば「Dinner later?」とチャットの相手が送ると、「I&#8217;m in!」「I&#8217;m busy」という返信用のメッセージが表示されます。ユーザは選んでクリックするだけでメッセージを送信することができます。</p>

<p>またチャット内の画像も解析されるので、誰かが犬の写真をアップロードすると、犬種も識別された上で、「Cude dog!」「Aww!」「Nice bernese mountain dog」といった返信メッセージが提示されます。</p>

<p>またGoogle Asisstantのbotががチャットの中に存在するようなかたちになっており、店のお店のサジェストや予約、検索等も対話形式でチャットの中で行うことができるようです。</p>

<p>さらにChromeのようにIncognito Modeが搭載されており、エンドツーエンドでの暗号化やNotificationの制御、メッセージの期限などを設定できるようになっているとのことです。</p>

<h2>Google Duo</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/3651367c-53da-41c7-08ff-33b848f3657e.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/3651367c-53da-41c7-08ff-33b848f3657e-640x480.jpeg" alt="3651367c-53da-41c7-08ff-33b848f3657e" width="640" height="480" class="alignnone size-large wp-image-19874" srcset="/wp-content/uploads/2016/06/3651367c-53da-41c7-08ff-33b848f3657e.jpeg 640w, /wp-content/uploads/2016/06/3651367c-53da-41c7-08ff-33b848f3657e-300x225.jpeg 300w, /wp-content/uploads/2016/06/3651367c-53da-41c7-08ff-33b848f3657e-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>続いてDuoというビデオチャットアプリの紹介です。</p>

<p>ビデオチャットを実現するアプリは数多く世に出ていますが、このDuoにはビデオコールをかけられた側は、応答する前にそのビデオストリームを見ることができるという特徴があるようです。この機能は『Knock Knock』と呼ばれているそうで、これにより着呼側は誰が、どんな状況でコールしてきたのかを知ることができます。</p>

<p>コール先は電話番号に紐づくとのことで、AppleのFaceTimeの競合として考えられそうです。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/9cf474f9-02e2-7500-3c8d-b5b976175073.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/9cf474f9-02e2-7500-3c8d-b5b976175073-640x480.png" alt="9cf474f9-02e2-7500-3c8d-b5b976175073" width="640" height="480" class="alignnone size-large wp-image-19871" srcset="/wp-content/uploads/2016/06/9cf474f9-02e2-7500-3c8d-b5b976175073.png 640w, /wp-content/uploads/2016/06/9cf474f9-02e2-7500-3c8d-b5b976175073-300x225.png 300w, /wp-content/uploads/2016/06/9cf474f9-02e2-7500-3c8d-b5b976175073-207x155.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>DuoはWebRTCとQUICを使用したWebプロトコルベースのアプリと紹介されました。</p>

<p>AlloとDuoはAndroidとiOSで2016年夏頃リリースされる予定で、Android版では事前登録が開始されています。</p>

<ul>
<li><a href="https://play.google.com/store/apps/details?id=com.google.android.apps.fireball" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google Allo</a></li>
<li><a href="https://play.google.com/store/apps/details?id=com.google.android.apps.tachyon" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google Duo</a></li>
</ul>

<h2>Android N</h2>

<p>続いてAndroid Nについての発表が行われました。</p>

<p>GoogleがAndroidの開発を行うようになってから、10年が経過したようです。今やAndroidはスマートフォンだけではなく、Android Wear、Android TV、Android Autoなど、多くのプラットフォームが登場しています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/a34e8828-9bcd-5887-8f9f-649ee8b38bc2.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/a34e8828-9bcd-5887-8f9f-649ee8b38bc2-640x480.jpeg" alt="a34e8828-9bcd-5887-8f9f-649ee8b38bc2" width="640" height="480" class="alignnone size-large wp-image-19876" srcset="/wp-content/uploads/2016/06/a34e8828-9bcd-5887-8f9f-649ee8b38bc2.jpeg 640w, /wp-content/uploads/2016/06/a34e8828-9bcd-5887-8f9f-649ee8b38bc2-300x225.jpeg 300w, /wp-content/uploads/2016/06/a34e8828-9bcd-5887-8f9f-649ee8b38bc2-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Androidの最新バージョンであるAndroid Nは現在プレビュー版(6/28現在Developer Preview 4)が公開中です。<a href="https://www.android.com/intl/ja_jp/versions/name-n/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちら</a>で名前の募集も行われていましたが、現在は終了し近日中に公開されるようです。</p>

<p>Android Nでは、新しいOSのアップデートがあると、自動的にソフトウェアをバッググラウンドでダウンロードし、次回Androidの電源を入れた際にシームレスで新しいソフトウェアイメージに切り替わるようです。</p>

<p>またマルチウィンドウが正式に採用され、スマートフォンでYoutubeを見ながら他のタスクを行ったり、Android TVでは映像を見ながら検索などの他の作業を行うことができるようになります。</p>

<p>現在はAndroid NのDeveloper Preview 4がリリースされており、Nexus 6やNexus 5X等の一部の対応した機種であれば、Android Nを試用することができます。(<a href="http://android-developers.blogspot.jp/2016/06/android-n-apis-are-now-final.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Android Developers Blog</a>)</p>

<h2>Daydream</h2>

<p>続いてI/O開催前から噂が絶えなかったVRに関する発表です。
<a href="https://html5experts.jp/wp-content/uploads/2016/06/a7ac330c-c1bc-6d81-4051-6125b966045d.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/a7ac330c-c1bc-6d81-4051-6125b966045d-640x480.jpeg" alt="a7ac330c-c1bc-6d81-4051-6125b966045d" width="640" height="480" class="alignnone size-large wp-image-19875" srcset="/wp-content/uploads/2016/06/a7ac330c-c1bc-6d81-4051-6125b966045d.jpeg 640w, /wp-content/uploads/2016/06/a7ac330c-c1bc-6d81-4051-6125b966045d-300x225.jpeg 300w, /wp-content/uploads/2016/06/a7ac330c-c1bc-6d81-4051-6125b966045d-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Androidスマートフォンで高品質なVR体験を提供可能であるDaydreamというプラットフォームが発表されました。</p>

<p>どのようにAndroidスマートフォン上で、高品質なVR体験を可能にするのか、講演では3つの要素が挙げられていました。
まずはスマートフォン本体、次にヘッドセットコントローラのリファレンスデザイン、そしてアプリで、ぞれぞれが協調してエンドツーエンドのユーザ体験を提供するために設計されています。</p>

<p>ハイパフォーマンスセンサーやヘッドトラッキング、表示のレスポンスの速さなど、VR用に作られた仕様を満たしたスマートフォンは、Daydream-readyと呼ばれ、高いクオリティのVR体験を提供することができます。Daydream-readyなスマートフォンは、SamsungやAlcatel、Asusなどの企業から、2016年秋以降リリースされるようです。発表された中に日本の企業はありませんでした。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/334aaad1-e834-a534-12b4-63c89e6ab9f9.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/334aaad1-e834-a534-12b4-63c89e6ab9f9-640x480.jpeg" alt="334aaad1-e834-a534-12b4-63c89e6ab9f9" width="640" height="480" class="alignnone size-large wp-image-19873" srcset="/wp-content/uploads/2016/06/334aaad1-e834-a534-12b4-63c89e6ab9f9.jpeg 640w, /wp-content/uploads/2016/06/334aaad1-e834-a534-12b4-63c89e6ab9f9-300x225.jpeg 300w, /wp-content/uploads/2016/06/334aaad1-e834-a534-12b4-63c89e6ab9f9-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>リファレンスデザインとして紹介されたヘッドセットとコントローラは非常にシンプルなものでした。コントローラはボタンは少なくクリッカブルなタッチパッドがついており、スクロールやスワイプができます。オリエンテーションセンサーも内蔵しており、ユーザがどこをポインティングしているかが分かります。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.49.36.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.49.36-640x360.png" alt="Screen Shot 2016-06-28 at 18.49.36" width="640" height="360" class="alignnone size-large wp-image-19893" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.49.36.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.49.36-300x169.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-18.49.36-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>アプリに関しては、VR用のGoogle Playが開発されており、ユーザーがアプリを探し、購入、インストールがVR上で可能になることが発表されました。またGoogle Play MoviesやGoogle Mapsのストリートビュー、Google Photos、YouTubeもVR上で鑑賞できるようになります。</p>

<p>Daydreamが使えるようになるのは2016年秋になるとのことですが、Android NのDeveloper Previewを使用することでアプリなどの開発は今から行うことができます。</p>

<h2>Android Wear 2.0</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/18168a75-4f59-d2b0-b6fc-9f86caf03b6d.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/18168a75-4f59-d2b0-b6fc-9f86caf03b6d-640x480.jpeg" alt="18168a75-4f59-d2b0-b6fc-9f86caf03b6d" width="640" height="480" class="alignnone size-large wp-image-19890" srcset="/wp-content/uploads/2016/06/18168a75-4f59-d2b0-b6fc-9f86caf03b6d.jpeg 640w, /wp-content/uploads/2016/06/18168a75-4f59-d2b0-b6fc-9f86caf03b6d-300x225.jpeg 300w, /wp-content/uploads/2016/06/18168a75-4f59-d2b0-b6fc-9f86caf03b6d-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Android Wearは2年前のGoogle I/Oで初めて発表されましたが、今回は初めて大幅なアップデートとなるAndroid Wear 2.0が発表されました。</p>

<p>大きな変化としては、今までAndroid Wearのアプリがインターネットにアクセスするためには母艦となるAndroidやiOSスマートフォンが必要であったことに対し、Android Wear 2.0ではスタンドアロンで動作することが可能になることが挙げられます。アプリが直接BluetoothやWi-Fi、LTEなどを通してインターネットにアクセスできるようになり、ペアリングされたスマートフォンが電源を切っている場合でも、アプリは引き続きフル機能を提供できるようになります。</p>

<p>その他にもUIの刷新や、手書き入力の対応等も発表されました。</p>

<p>Android Wear 2.0はプレビュー版が<a href="https://developer.android.com/wear/preview/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">公開</a>されおり、秋には正式リリースとなるようです。</p>

<h2>Progressive Web AppsとAccelerated Mobile Pages</h2>

<p>基調講演も終盤に差しかかり、ここで初めて、わずかですがWebについての発表がありました。
モバイルデバイス上でWebをより快適にするための取り組みとして、Progressive Web AppsとAccelerated Mobile Pagesの2つの紹介です。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.42.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.42-640x351.png" alt="Screen Shot 2016-06-28 at 19.01.42" width="640" height="351" class="alignnone size-large wp-image-19900" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.42.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.42-300x165.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.42-207x114.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Progressive Web Apps、略してPWAppsは、オフライン状態でも動作可能、エンゲージメントを高めるための通知、ホームスクリーンにアイコンを登録、といったネイティブアプリのような振る舞いを実現したWebアプリのことを指します。ChromeにはServiceWorkerをはじめとする、Progressive Web Appsを実現するための仕組みが実装されています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.55.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.55-640x353.png" alt="Screen Shot 2016-06-28 at 19.01.55" width="640" height="353" class="alignnone size-large wp-image-19899" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.55.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.55-300x165.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.01.55-207x114.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Accelerated Mobile Pagesは、既存のWeb標準に基づいた非常に速いモバイルWebサイトを作るための、オープンソースのプロジェクトです。</p>

<p>特に新規発表はなく、基調講演内ではわずか1分程度の紹介でしたが、Google I/O全体では多くのPWAppsやAMPのセッションが行われていました。HTML5 Experts.jpでも<a href="https://html5experts.jp/komasshu/19704/" data-wpel-link="internal">Googleが新たに提唱するProgressive Web Appsの新たな開発パターン「PRPL」とは？</a>という記事を公開していますので、そちらをご覧ください。</p>

<h2>Android Studio</h2>

<p>Android Studio 2.2 Previewが公開されたと発表がありました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.03.28.png" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.03.28-640x358.png" alt="Screen Shot 2016-06-28 at 19.03.28" width="640" height="358" class="alignnone size-large wp-image-19898" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.03.28.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.03.28-300x168.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-28-at-19.03.28-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>Android Studio 2.2では、ビルドが10倍、エミュレータも3倍速くなっているそうです。また、新しいレイアウトデザイナやAPKアナライザーが搭載されるとのことでした。</p>

<h2>Firebase</h2>

<p>続いてFirebaseの新バージョンが発表されました。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/1f7e99f1-eb19-5576-3d64-48edebab815b.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/1f7e99f1-eb19-5576-3d64-48edebab815b-640x480.jpeg" alt="1f7e99f1-eb19-5576-3d64-48edebab815b" width="640" height="480" class="alignnone size-large wp-image-19889" srcset="/wp-content/uploads/2016/06/1f7e99f1-eb19-5576-3d64-48edebab815b.jpeg 640w, /wp-content/uploads/2016/06/1f7e99f1-eb19-5576-3d64-48edebab815b-300x225.jpeg 300w, /wp-content/uploads/2016/06/1f7e99f1-eb19-5576-3d64-48edebab815b-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>FirebaseはGoogleが2014年の10月に買収したBaaSサービスです。モバイルアプリに特化した分析ツールである、Firebase Analyticsが発表されました。ユーザがアプリ内で何をしているか、ユーザがどこからきたのかなど分析することが可能です。Android AnalyticsはAndroidでもiOSも扱うことができ、無制限に無料で使用することができると発表されました。</p>

<h2>Android Instant Apps</h2>

<p><a href="https://html5experts.jp/wp-content/uploads/2016/06/adcac44d-79e3-0921-0316-3e9bf50fc99e.jpeg" data-wpel-link="internal"><img src="/wp-content/uploads/2016/06/adcac44d-79e3-0921-0316-3e9bf50fc99e-640x480.jpeg" alt="adcac44d-79e3-0921-0316-3e9bf50fc99e" width="640" height="480" class="alignnone size-large wp-image-19868" srcset="/wp-content/uploads/2016/06/adcac44d-79e3-0921-0316-3e9bf50fc99e.jpeg 640w, /wp-content/uploads/2016/06/adcac44d-79e3-0921-0316-3e9bf50fc99e-300x225.jpeg 300w, /wp-content/uploads/2016/06/adcac44d-79e3-0921-0316-3e9bf50fc99e-207x155.jpeg 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>今回の基調講演の後半で一際注目を集めたのがこのAndroid Instant Appsではないでしょうか。</p>

<p>Webアプリの場合、ユーザはリンクをクリックするだけでアプリを使用することができますが、Androidアプリはインストールを必要とするため、ユーザがそこで離脱してしまうことが多くあります。その課題を解決する一手となるのが今回発表されたAndroid Instant Appsのようです。</p>

<p>今回発表されたAndroid Instant Appsでは、AndroidアプリがWeb等のリンクからインストールレスで使えるようなるとのことです。</p>

<p>講演中のデモの中では、いくつかのAndroidアプリをURLから起動し、実際にアプリを使用できることが示されていました。
アプリの中の直近で必要になるモジュールだけをフェッチしているらしく、起動も素早く行われ、アプリを使用してからのインストールも非常にスムーズに行えるようです。</p>

<p>これにより、Androidアプリ開発者は、より多くのユーザにリーチできるようになります。AndroidアプリとWebとの親和性が高くなり、Androidアプリのユーザ体験が大きく変わる機能となるのではないでしょうか。</p>

<h2>おわりに</h2>

<p>今年はGoogleのAIの技術力を発揮した製品やサービスが多く発表されました。</p>

<p>基調講演内でWebやChromeに関する発表は非常に少なかったのですが、Google I/O全体では33ものモバイルWebに関するセッションが行われていました。</p>

<p>既に公開されている</p>

<ul>
<li><a href="https://html5experts.jp/ryoyakawai/19335/" data-wpel-link="internal">今、Webの最先端では何が起こっているのか？──最新機能目白押し！Google I/O 2016セッションレポート【前編】</a></li>
<li><a href="https://html5experts.jp/ryoyakawai/19461/" data-wpel-link="internal">Webの最先端では何が起こっているか、今Googleが取り組んでいることは？──Google I/O 2016セッションレポート【後編】</a></li>
<li><a href="https://html5experts.jp/komasshu/19704/" data-wpel-link="internal">Googleが新たに提唱するProgressive Web Appsの新たな開発パターン「PRPL」とは？</a></li>
</ul>

<p>以外にもセッションレポートを公開していく予定です。お楽しみに。</p>
]]></content:encoded>
			</item>
		<item>
		<title>今、Webの最先端では何が起こっているのか？──最新機能目白押し！Google I/O 2016セッションレポート【前編】</title>
		<link>/ryoyakawai/19335/</link>
		<pubDate>Tue, 14 Jun 2016 00:00:22 +0000</pubDate>
		<dc:creator><![CDATA[河合良哉]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[I/0 2016]]></category>
		<category><![CDATA[Stream]]></category>

		<guid isPermaLink="false">/?p=19335</guid>
		<description><![CDATA[2016年5月18日〜20日、Googleさんの本社Googleplexの横にあるShoreline Amphitheatre（ショアライン アンフィシアター）で行われたGoogle I/0 2016のセッション「Wha...]]></description>
				<content:encoded><![CDATA[<p>2016年5月18日〜20日、Googleさんの本社Googleplexの横にあるShoreline Amphitheatre（ショアライン アンフィシアター）で行われたGoogle I/0 2016のセッション「What&#8217;s new for the web?」についてのレポート前編です。前編では、Webの最先端として、既に導入済みの機能やAPI、またこれから導入される機能を怒涛のごとく紹介します！</p>

<p><figure class="aligncenter">
<img src="/wp-content/uploads/2016/06/beforesession.jpg" alt="beforesession" width="640" height="427" class="aligncenter size-full wp-image-19421" srcset="/wp-content/uploads/2016/06/beforesession.jpg 640w, /wp-content/uploads/2016/06/beforesession-300x200.jpg 300w, /wp-content/uploads/2016/06/beforesession-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<figcaption>セッション開始前の会場入口</figcaption>
</figure></p>

<p><figure class="aligncenter">
<img src="/wp-content/uploads/2016/06/IMG_3404.jpg" alt="IMG_3404" width="640" height="213" class="aligncenter size-full wp-image-19422" srcset="/wp-content/uploads/2016/06/IMG_3404.jpg 640w, /wp-content/uploads/2016/06/IMG_3404-300x100.jpg 300w, /wp-content/uploads/2016/06/IMG_3404-207x69.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<figcaption>登壇者：左：Chris Wilson氏、右：François Beaufort氏</figcaption>
</figure></p>

<h1>今現在Webで起こっていること</h1>

<h3>Progressive Web App (<a href="https://html5experts.jp//goo.gl/WR7yJ3" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">goo.gl/WR7yJ3</a>)</h3>

<p>Service Worker、Add to Home Screen、App Manifest、Background Sync等を使い、NativeアプリのようなUXを提供するWebアプリを指す言葉です。
Chris氏いわく、23年間Webをやってきているけど、やっと理想だと思っていた世界、ユーザーとのエンゲージ率が高いUXを持つサイトがWebというPlatformのみで制作することが可能になっている。（作り方等の詳細は<a href="https://www.youtube.com/watch?v=0SSI8liELJU" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">こちら</a>「The Mobile Web: State of the Union」でとのこと）</p>

<p>けど、ここで話すのは既に利用可能なCutting Edgeな話ではなくて、「New Shiny」と呼んでるWeb PlatformのBleeding Edgeな話をします。なので、まだリリースされていない機能だったりCross-Browser、Cross-Deviceで動かない機能、Experimentalフラグの変更を必要とする機能も含まれます。</p>

<p>ただここではカバーしない機能もあり、その代表的なものの一覧はこちらです。</p>

<p><img src="/wp-content/uploads/2016/06/02.png" alt="not coverd" width="640" height="357" class="aligncenter size-full wp-image-19354" srcset="/wp-content/uploads/2016/06/02.png 640w, /wp-content/uploads/2016/06/02-300x167.png 300w, /wp-content/uploads/2016/06/02-207x115.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>New Shiny（Bleeding Edge）</h2>

<h3>開発をより簡単に速くするための機能(導入済み)</h3>

<h4>Promise</h4>

<p>非同期のAPIの記述を一貫性のあるパターンで書く方法です。Callbackのように混乱しやすかったり、散らかりやすくなく、同期APIをブロックすることもなくなります。Web開発はブロッキングをなくすようなデザインをするように考え方を変える必要があります。なのでPromiseは新たなWebのAPIをデザインするときには一般的な方法になっていて、以下はPromiseを使うAPIとしてデザインされている代表的なものです。</p>

<ul>
<li>HTMLMediaElement.play()：Promiseに書き換えられました</li>
<li>Web Bluetooth</li>
<li>Web USB</li>
<li>Web MIDI</li>
</ul>

<p><a href="https://www.chromestatus.com/feature/5681726336532480" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">[実装状況]</a></p>

<h4>Fetch</h4>

<p>FetchもPromiseを使っています。FetchはXMLHTTPRequest(XHR)と似ていてNetworkリクエストを行います。XHRとの違いはPromiseを使って可読性が上がっているところ。Fetchで何をしているか分からなくても、見たら何となく内容を理解できるところです。Callback地獄からの脱却、XHRの複雑な部分から開放してくれる。例えば、直接JSONや他のデータ・タイプを扱うことも可能です。</p>

<p>左がFetch、右がXHR。パッと見、XHRとも悪くないけど、Stateのチェックとかしてないから悪くないのであって、本来はもっと長くゴチャゴチャするのでご注意してください。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-03-at-10.27.41-PM1.png" alt="Screen Shot 2016-06-03 at 10.27.41 PM" width="640" height="222" class="aligncenter size-full wp-image-19362" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-03-at-10.27.41-PM1.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-03-at-10.27.41-PM1-300x104.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-03-at-10.27.41-PM1-207x72.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>そしてES6のアロー・ファンクションを使うと、さらにこんなにもキレイになります。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-03-at-10.45.55-PM.png" alt="Screen Shot 2016-06-03 at 10.45.55 PM" width="640" height="358" class="aligncenter size-full wp-image-19365" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-03-at-10.45.55-PM.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-03-at-10.45.55-PM-300x168.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-03-at-10.45.55-PM-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ただ、さらなるチャレンジ。問題はこのままだとデータを完全に取得してからでないとJSONとしてParseができないところ。つまりAtomicで割り込みができない。そこで実装中なのが、このFetchやその他のAPIの本当の能力を引き出す機能、それがStreamです。
<br>
<a href="https://www.chromestatus.com/feature/4531143755956224" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">[実装状況]</a></p>

<h4>Stream</h4>

<p>Streamは基本的な要素で、その使い道はいろいろあると思います。Jakeはこんなことを言ってます。「Streamは2016年の大きな1つの機能になるだろう」と。なぜならStreamはProgressiveなデータ転送を可能にするからです。全てのデータを受け取っていない状態でも、受け取った順に処理することができる。つまり、Progressiveなレンダリングだったり処理が可能になるのです。App Shellアーキテクチャを使う場合等は1度に複数の場所からデータを取得するので、とても重要な要素になります。</p>

<p>画像は左側の「Fetch」の全てが終わらないと真ん中の「Process」に進めない、それに引きづられて最終的な「Render」も遅くなってしまう、を表した図。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-03-at-10.58.02-PM.png" alt="Screen Shot 2016-06-03 at 10.58.02 PM" width="640" height="358" class="aligncenter size-full wp-image-19367" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-03-at-10.58.02-PM.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-03-at-10.58.02-PM-300x168.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-03-at-10.58.02-PM-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>Jakeが作成したOffline Wikipediaのサイトで、Streamを使うとどれくらい差がでるかを比較したデモ動画です。左からServer Render、Service Worker Client Render、Service Worker Client+Hacks Render、一番右がStreamを使ったService　Worker Client Renerです。（画像が小さくてすみません。セッションでのビデオ再生は<a href="https://youtu.be/bK6Ah68jEX8?t=7m18s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ココ</a>から見られます）</p>

<p><img src="/wp-content/uploads/2016/06/wikipedia_loop.gif" alt="wikipedia_loop" width="420" height="273" class="aligncenter size-full wp-image-19436" /></p>

<p>初期のレンダリングは一番左のServer Renderが他よりも8倍くらい遅い、しかしレンダリング完了までだとnon Streamの真ん中の2つよりも速い。この理由は、真ん中の2つは全てのデータを取得するのを待ち、それから処理を始め、その後最終的にレンダリングされるからです。せっかくのハイパフォーマンスなProgressiveなWebアプリなサイトであるのに、表示が遅くては致命的とも言えるでしょう。実際に、現況ではApp Shellアーキテクチャのがコストが高い（時間がかかる）場合もあります。
<br>
<a href="https://www.chromestatus.com/feature/6605041225957376" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">[実装状況]</a></p>

<p>さらにパフォーマンスをテーマに話を続けます。ハイパフォーマンスなWebサイトを作るために実装しているエキサイティングなその他の機能を紹介します。</p>

<h4>RequestIdleCallback</h4>

<p>多くのWebアプリ、サイト上では多くのスクリプトが動いていることと思います。しかし全てのスクリプトがユーザーが見ている画面に直接関係のあるスクリプトではなかったりしますよね。例えば、Analyticsデータの送信です。スクロール中に動いてしまうとスクロールがロックしたりユーザー体験（UX）の質は下がります。そこで、そういったユーザーが見ている画面に直接影響を及ぼさない処理を空いている時間に走らせよう、という機能がRequestIdleCallbackです。</p>

<p>RequestAnimationFrameはできるだけ60fpsで表示ができるようその処理をスケジュールしています。そして、RequestIdleCallbackはRequestAnimationFrameと一緒に動作しています。レンダリングに関係しない処理を、レンダリング処理が空いているところにスケジュールしてくれる、という動きです。</p>

<p><img src="/wp-content/uploads/2016/06/Screen-Shot-2016-06-04-at-12.03.01-AM.png" alt="Screen Shot 2016-06-04 at 12.03.01 AM" width="640" height="359" class="aligncenter size-full wp-image-19387" srcset="/wp-content/uploads/2016/06/Screen-Shot-2016-06-04-at-12.03.01-AM.png 640w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-04-at-12.03.01-AM-300x168.png 300w, /wp-content/uploads/2016/06/Screen-Shot-2016-06-04-at-12.03.01-AM-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>実装は難しくないけど、ここで動かしたいタスク（処理）の1つ1つはリーズナブルな時間で終わるように分割されている必要があります。時間がかかるタスクは今まで通りWeb Workerで動作させることをおすすめします。ちなみにNetflex、Facebookはこの機能を既に導入しています。
<br>
<a href="https://www.chromestatus.com/feature/5572795866021888" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">[実装状況]</a></p>

<h4>PassiveEventListener</h4>

<p>新しいDOMの機能でChrome 51でShipされます(I/O後の2026年5月下旬にリリースされました)が、ユーザーによりよいスクロール機能を提供するための機能です。導入はすごく簡単。</p>

<p>スムーズなスクロールの機能はWebにとって、特にタッチデバイスでのWebにとってはとても重要です。モダンなブラウザは高コストなJavaScriptがUIスレッドで走っていたとしても、スクロールを別スレッドでハンドリングする機能を持っています。</p>

<p>なのですが、問題はそれがタッチやスクロールeventハンドラを持っていると、最適化で負けてしまうところです。なぜならそれらのハンドラは.preventDefaultをCallすることでスクロールを完全にブロックしてしまうからです。eventハンドリング中に.preventDefaultがCallされるかどうかは分からないので、高コストなJavaScriptの処理が完了するまで待つ必要が出てきてしまうのです。</p>

<p>そこでPassiveEventListenerでは、.preventDefaultをCallしないと宣言し、スクロールがeventによってブロックされないようにするのです。</p>

<p>Chrome for Androidではその80%のTouchEventがブロックされる必要はないのにブロックされている。その10％がスクロール開始までに最低100ms待ち時間が生じた。さらに、その1％は500msの待ち時間がスクロール開始までに生じている。</p>

<p>CNNのサイトで導入したのと、していないのとで比較をしてみます。（ビデオは<a href="https://youtu.be/bK6Ah68jEX8?t=11m26s" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちら</a>から：preventdefaultをcallしてないのに遅くなっているのとPassiveEventListenerを使った場合の比較ビデオ）</p>

<p>この違いを生むための実装は、たったこれだけです。</p>

<p><img src="/wp-content/uploads/2016/06/PassiveEvent.png" alt="PassiveEvent" width="640" height="360" class="aligncenter size-full wp-image-19393" srcset="/wp-content/uploads/2016/06/PassiveEvent.png 640w, /wp-content/uploads/2016/06/PassiveEvent-300x169.png 300w, /wp-content/uploads/2016/06/PassiveEvent-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><a href="https://www.chromestatus.com/feature/5745543795965952" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">[実装状況]</a></p>

<h4>Intersection Observer</h4>

<p>特定のDOM Elementが画面内に入っているかどうかを見る、またその場所も簡単に得ることができるのがこのAPI。今までも実装は可能だったけど、効率的ではなかったし問題もいろいろあった。では、Intersection Observerのコードを見てみましょう。</p>

<p><img src="/wp-content/uploads/2016/06/code_intersectionobserver.png" alt="code_intersectionobserver" width="640" height="363" class="aligncenter size-full wp-image-19403" srcset="/wp-content/uploads/2016/06/code_intersectionobserver.png 640w, /wp-content/uploads/2016/06/code_intersectionobserver-300x170.png 300w, /wp-content/uploads/2016/06/code_intersectionobserver-207x117.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>画面内に入ったかを監視したいターゲットとなるElementを決めましょう。そしてIntersectionObserverのオブジェクトの生成時します。生成時には画面内に入った場合の動作についてのCallbackも渡します。最後に生成したオブジェクトでどのElementを監視するかを指定します。（デモページ：<a href="https://html5experts.jp//goo.gl/mNdYRv" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">goo.gl/mNdYRv</a>、Chrome 51以降で御覧ください）</p>

<p>デモページはとてもスムーズで超速な無限のスクロールを提供しています。コンテンツ表示はネットワークの遅さをシュミレートしているかのように遅れていますが、Service Workerを使ってキャッシュすると解決します。例えば、たくさんの画像を表示するページ等には持ってこいですね。
<br>
<a href="https://www.chromestatus.com/feature/5695342691483648" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">[実装状況]</a></p>

<h4>&lt;link rel=&#8221;preload&#8221;&gt;</h4>

<p>Chrome 50でShip済みで、リソースのPreload（事前読み込み）を行います。遷移先のページを事前取得する&lt;link rel=&#8221;prefetch&#8221;&gt;とは違い、現在のページ内のリソースを読み込む優先順位を指定ができる属性です。
<br>
<a href="https://www.chromestatus.com/feature/5757468554559488" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">[実装状況]</a></p>

<h4>HTTP Clients Hints</h4>

<p>HTTPヘッダにつけることで取得するコンテンツの種類を事前ネゴシエーションすることができる。ネゴシエーションの要求を出すことで、ユーザーのデバイス、環境によってサーバ側が提供されるコンテンツを差替えてServeすることが可能です。サーバ側に実装されるものであって、クライアント側のコードで指定するものではありませんが、以下の様な要求ができるように用意されています。</p>

<ul>
<li>DevicePixelRatio(DPR)</li>
<li>Preferred widt</li>
<li>viewport-width</li>
<li>save-data: サーバにデータ転送を節約していることを知らせることができる</li>
</ul>

<h4>Canvas.toBlob</h4>

<p>Chrome 50でShip済みで、クライアント側でCanvasをそのままBlobにすることができます。一説によるとこの機能が実現するまでに6年かかったそうです。.toDataURL()から得られるBase64の文字列を操作することなく、画像としてそのままサーバにアップロードしたり、IndexDBに保存したりできるので、より簡単に再利用することが可能になります。
<br>
<a href="https://www.chromestatus.com/feature/4562033294966784" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">[実装状況]</a></p>

<h4>ImageBitmap</h4>

<p>Chrome50でShip済みで、ImageBlobを他のCanvasにそのまま描くことも可能になっています。Canvasに描くために画像をデコードするのはとても一般的ですが、画像のデコードにCPUリソースをとても多く使ってしまうという問題点があります。しかし、Base64とデータの間での処理をすることなく扱えるようになったのです。そうすることで、例えば他の画像、エレメント、ビデオ等をCanvasに描くときと同じように扱えるようになりました。
<br>
<a href="https://www.chromestatus.com/feature/5684964708319232" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">[実装状況]</a></p>

<h4>Unified Media Pipeline</h4>

<p>クライアントではなくてChrome自体のコードの話です。デスクトップ版でもモバイル版でも全く同じ処理がされるようなMediaようにPipelineを持つようにしました。Chrome for AndroidにおいてもOSが持つAndroid Media Stackでの処理は行わないようにしました。これによりCross-Platformでも一貫した処理（例えばキャッシュ、エンコード、デコード）を行うようになっています。よって、Cross-Platformでのデバッグをより簡単にしています。</p>

<h4>MediaRecorder</h4>

<p>ビデオ、オーディオをキャプチャするだけでなく、エンコードして保存をすることが可能になりました。例えば、取得したオーディオをMP3にクライアント側で変換してサーバにアップロードすることが可能です。
（デモページ：<a href="https://html5experts.jp//simpl.info/mediarecorder" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">simpl.info/mediarecorder</a>、Chrome 49以降でご覧ください）</p>

<p><img src="/wp-content/uploads/2016/06/mediarecorder.png" alt="mediarecorder" width="640" height="358" class="aligncenter size-full wp-image-19416" srcset="/wp-content/uploads/2016/06/mediarecorder.png 640w, /wp-content/uploads/2016/06/mediarecorder-300x168.png 300w, /wp-content/uploads/2016/06/mediarecorder-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>コードはこんな感じです。MediaRecorderのオブジェクトをOptionを渡して作成して、データを取得したときのCallbackを.ondataavailableに指定します。Callbackにはどう扱うかを書くのだけど、ほとんどの場合取得したデータ（Blob）をくっつけるだけです。そして、最後にどれだけの長さの動画を作るかを指定して完了です。サーバにアップロードする、ローカルに保存する等ができるようになります。Web Audioでの質問として何度か受けていますが、まさにこれがその解です。
<br>
<a href="https://www.chromestatus.com/feature/5929649028726784" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">[実装状況]</a></p>

<h4>Media Session</h4>

<p>Mediaの動作を操作のカスタマイズ、例えばラップトップのオーディオように用意されたキーを特定の機能に割り当てることができたり、モバイルでは通知エリア(Notification Area)、ロック画面にMedia操作用のUIを出すことができるAPI。もしMediaに関するアプリを作っている開発者であれば一度見てもらいたい。
<br>
<a href="https://www.chromestatus.com/feature/5639924124483584" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">[実装状況]</a></p>

<h4>CSS Variables</h4>

<p>正確にはCSS Custom Propertyとも言いますがChrome 49でShipされています。例えば、同じ属性を何度も繰り返し書くことの削減してくれたり、また色・見た目等のテーマの変更にもとても有効です。
<br>
<a href="https://www.chromestatus.com/feature/6401356696911872" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">[実装状況]</a></p>

<h4>CSS Containment</h4>

<p>CSSを隔離してパフォーマンスを最適化してくれる機能です。例えば、3rd Partyのウィジットを使った場合、そのウィジットのCSSを隔離することで自サイトのパフォーマンスに影響が出ないように最適化してくれます。
<br>
<a href="https://www.chromestatus.com/features/6522186978295808" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">[実装状況]</a></p>

<h4>CSS Font Loading API</h4>

<p>最初に実装されたのはChrome 35でそこそこ前なんですが、Font LoadingのInterfaceはChrome 48でShipされたばかりです。1つ1つのFont Faceのチェック、またそれらのダウンロード状況を確認できるようになりました。これによりFontが実際にどれくらいダウンロードされたか、どんなFontであるかを知ることができるようになりました。
<br>
<a href="https://www.chromestatus.com/feature/4594172182921216" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">[実装状況]</a></p>

<p>Progressiveに速いスピードで短い説明で新しい機能を紹介しまくって、後で調べてね、と言っている感があるように聞こえるかもしれないですので、少し休憩というようなお話をしますね。</p>

<p>（後編の予告など）<br>
ということで、この辺りで前編は終了です。後編はWeb Platformをより先に進めるためにここ1～2年Chromeチームが取り組んでいるアプローチ、Chris氏の大好きなアレ、そしてWeb Bluetoothについてお伝えします。</p>

<p><figure class="aligncenter">
<img src="/wp-content/uploads/2016/06/IMG_3473.jpg" alt="pushup" width="640" height="427" class="aligncenter size-full wp-image-19458" srcset="/wp-content/uploads/2016/06/IMG_3473.jpg 640w, /wp-content/uploads/2016/06/IMG_3473-300x200.jpg 300w, /wp-content/uploads/2016/06/IMG_3473-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><figcaption>Bluetoothの説明中の一幕。詳しくは後編で！</figcaption>
</figure></p>
]]></content:encoded>
			</item>
	</channel>
</rss>
