<?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>Google I/O 2017特集 &#8211; HTML5Experts.jp</title>
	<atom:link href="/series/google-io-2017/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>JSエンジン「V8」はバージョン6で世代移行を終える ── Google I/O 2017レポート</title>
		<link>/furoshiki/23289/</link>
		<pubDate>Tue, 12 Sep 2017 01:00:47 +0000</pubDate>
		<dc:creator><![CDATA[川田寛]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Google I/O 2017]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[V8]]></category>

		<guid isPermaLink="false">/?p=23289</guid>
		<description><![CDATA[連載： Google I/O 2017特集 (3)ChromeやNode.jsで利用されているJavaScriptエンジン「V8」に、8年の歴史の中でも大きな変化が訪れました。8月3日にリリースされたバージョン6.1で、...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/google-io-2017/" class="series-450" title="Google I/O 2017特集" data-wpel-link="internal">Google I/O 2017特集</a> (3)</div><p>ChromeやNode.jsで利用されているJavaScriptエンジン「V8」に、8年の歴史の中でも大きな変化が訪れました。8月3日にリリースされたバージョン6.1で、数年かけて進めてきたJavaScriptコンパイラーが世代交代を終えました。詳しい話は、<a href="https://v8project.blogspot.jp/2017/08/v8-release-61.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">V8のブログでも語られていますが</a>、ここでは大きなトピックであるコンパイラーの世代交代についてお話します。</p>

<p>なお、この動きについては、<a href="https://www.youtube.com/watch?v=r5OWCtuKiAk" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">昨年に開かれたカンファレンス「BlinkOn 6」でも語られており</a>、Google I/O 2017でも、Seth Thompsonによるセッション「<a href="https://events.google.com/io/schedule/?section=may-18&amp;sid=06ad955b-2387-45b8-9a5b-9ebd00a6f952&amp;gclid=CKuXh-a6g9QCFVR9vQodz50B6g" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">V8, Advanced JavaScript, &amp; the next performance frontier</a>」によって紹介されています。本記事では、これらの発表内容を補足してご紹介します。</p>

<p><img src="/wp-content/uploads/2017/05/top.png" alt="" width="640" height="439" class="alignnone size-full wp-image-23339" srcset="/wp-content/uploads/2017/05/top.png 640w, /wp-content/uploads/2017/05/top-300x206.png 300w, /wp-content/uploads/2017/05/top-207x142.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h1>V8のミッションとは？</h1>

<p>Chromeで使われているJavaScriptエンジン「V8」ですが、そのミッションはとてもシンプルです。</p>

<p>「Speed up real-world performance for modern JavaScript, and enable developers to build a faster future web.(実世界での要求にあわせてモダンなJavaScriptのパフォーマンスを向上させること。そして、今後の変化していくWebに早く追従し、開発者がそれらをビルドできるようにすること)」</p>

<h1>V8のパフォーマンス改善につきまとう2つのトレードオフ</h1>

<p>V8とはなんでしょう？JIT(just-in-time compile)で動作させることができるJavaScriptのエンジンです。ブラウザがJavaScriptを受け取ると、ブラウザはそのコードをトランスレートして実行したり。また、コードを翻訳してコンピューターが理解できるネイティブコードにコンパイルしてから実行します。</p>

<p>ただ、そこにはいくつかのトレードオフが存在します。</p>

<ol>
<li>コンパイルして生成されたネイティブコードは、実行されるピーク時の速度が早い一方で、コードの量が多いほど、最初に実行されるまでに遅延が発生する。一方で、トランスレーターを使った場合は、実行されるまでの遅延は小さいけど、実行時の速度が遅い。</li>
<li>JavaScriptエンジンは、パフォーマンスを良くしようとするとメモリの消費量が多くなる。一方で、省メモリを進めようとするとパフォーマンスは悪化する。</li>
</ol>

<p>例えば、以下のような一行のfunctionを呼び出すコードについて考えてみましょう。</p>

<p><img src="/wp-content/uploads/2017/05/02-1.png" alt="" width="640" height="330" class="alignnone size-full wp-image-23350" srcset="/wp-content/uploads/2017/05/02-1.png 640w, /wp-content/uploads/2017/05/02-1-300x155.png 300w, /wp-content/uploads/2017/05/02-1-207x107.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>このコードでは、 <code>function foo()</code> は一度しか呼び出されていませんよね。このケースでは、実行されるまでの速さ（Fast Startup）を重視し、実行時のパフォーマンス（Peak Perf）は重要視しません。</p>

<p>しかし、以下のケース。</p>

<p><img src="/wp-content/uploads/2017/05/03-1.png" alt="" width="640" height="350" class="alignnone size-full wp-image-23352" srcset="/wp-content/uploads/2017/05/03-1.png 640w, /wp-content/uploads/2017/05/03-1-300x164.png 300w, /wp-content/uploads/2017/05/03-1-207x113.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>1万回も <code>function foo()</code> を呼び出しています。このケースでは、Fast Startupが遅れてでも、Peak Perfを重視する必要がでてきます。 <code>foo()</code> はネイティブコードにコンパイルされていなくてはいけません。そしてそれがデスクトップ型のコンピューターであれば、メモリも潤沢なので、大量のメモリ消費を犠牲にネイティブコードをさらに幾度に渡り最適化させます。</p>

<p>ただ、これはあくまでデスクトップ型コンピューターの場合。同じ1万回 <code>foo()</code> を呼び出すコードであっても、モバイルの場合は同じアプローチにはなりません。Androidデバイスはモバイルなので、デスクトップと同じようにメモリを扱うことはできません。</p>

<p><img src="/wp-content/uploads/2017/05/04.png" alt="" width="640" height="428" class="alignnone size-full wp-image-23356" srcset="/wp-content/uploads/2017/05/04.png 640w, /wp-content/uploads/2017/05/04-300x201.png 300w, /wp-content/uploads/2017/05/04-207x138.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ネイティブのコードへコンパイルはされますが、メモリの消費量は抑えられるよう最適化は制限されます。</p>

<p>別のパターンについても考えてみましょう。それが以下のコード。</p>

<p><img src="/wp-content/uploads/2017/05/05.png" alt="" width="640" height="399" class="alignnone size-full wp-image-23358" srcset="/wp-content/uploads/2017/05/05.png 640w, /wp-content/uploads/2017/05/05-300x187.png 300w, /wp-content/uploads/2017/05/05-207x129.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>これはNode上で実行されているコードです。一度起動されたら、ずっと利用されるわけですから、当然、Fast Startupを犠牲にしてPeak Perfを改善しようとしますね。しかし…</p>

<p><img src="/wp-content/uploads/2017/05/06.png" alt="" width="640" height="397" class="alignnone size-full wp-image-23360" srcset="/wp-content/uploads/2017/05/06.png 640w, /wp-content/uploads/2017/05/06-300x186.png 300w, /wp-content/uploads/2017/05/06-207x128.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>IoTデバイス上で動作するとなると、同じ状況とは言えません。サーバー用マシンとは異なり、メモリ消費は抑えなくてはいけません。Peak Perfを上げるようにはしますが、それはメモリ消費が少なくて済むようなアプローチで進めます。</p>

<p>同じ一行のfunction呼び出しであっても、その最適化方法は無数にあり、コンテキストやデバイスの状況に強く依存するのです。そしてそれは、Fast Startupなのか、あるいはPeak Perfに最適化していくのか、メモリを富豪的に扱うのか、それとも小さくなるよう努力するのか、解決しなくてはいけません。</p>

<h1>8年前のリリース時点から全てが変わろうとしているV8</h1>

<p>V8エンジンは、ここまでに説明したあらゆる状況で最適化できるようにしたり、また新しいパターンのJavaScript（asm.js, WebAssembly等）に対応できるよう、2〜3年かけて実行パイプラインを作り変えました。</p>

<p>過去の変遷を見てみると。</p>

<p>2008年のリリース時点の段階では、シンプルなコードジェネレーターがあって、そこからやや最適化を行ったマシンコードが生成されるだけでした。あらゆるJavaScriptのコードは、この仕組を使って実行されます。</p>

<p>ただ、最適化には計算が必要なため、コードを実行できる状態にするまでに多くの時間を要します。大量のJavaScriptコードを扱う場合は、Startup Time短縮するために最適化の処理をスキップすることが求められます。</p>

<p><img src="/wp-content/uploads/2017/06/c01.png" alt="" width="640" height="295" class="alignnone size-full wp-image-23697" srcset="/wp-content/uploads/2017/06/c01.png 640w, /wp-content/uploads/2017/06/c01-300x138.png 300w, /wp-content/uploads/2017/06/c01-207x95.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>2010年にコンパイラ「Crankshaft」が追加されます。計算コストの高い最適化処理を分離し、Crankshaftにその責務が委譲されました。コードの生成だけであれば、Full-codegenは最小のコストでマシンコードを吐き出すため高速なため、Startup Timeが最適化されます。そして、CrankShaftを使ってコンパイルすれば、計算コストを犠牲にPeak Perfにとって最適なマシンコードが生成されます。</p>

<p>実行時に、CrankShaftが吐き出したコードを、Full-codegenが吐き出したコードへ置き換えることで最適化を図ります。</p>

<p><img src="/wp-content/uploads/2017/06/c03.png" alt="" width="640" height="328" class="alignnone size-full wp-image-23698" srcset="/wp-content/uploads/2017/06/c03.png 640w, /wp-content/uploads/2017/06/c03-300x154.png 300w, /wp-content/uploads/2017/06/c03-207x106.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>2015年。Crankshaftには限界が来ます。JavaScriptの仕様そのものが大きく変化する時代になりましたが、Crankshaftはその設計上、JavaScriptの機能をサポートしきれず、また新しいパターンのJavaScript（asm.js, WebAssembly等）にも十分に対応できませんでした。当時のフロントエンドエンジニアなら、V8のECMAScript標準への対応の遅れに苛立ちを感じたはずです。</p>

<p>V8開発チームは、それを改善しようと新たなコンパイラ「TurboFan」を追加します。</p>

<p><img src="/wp-content/uploads/2017/06/c04.png" alt="" width="640" height="326" class="alignnone size-full wp-image-23699" srcset="/wp-content/uploads/2017/06/c04.png 640w, /wp-content/uploads/2017/06/c04-300x153.png 300w, /wp-content/uploads/2017/06/c04-207x105.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>2016年。「Ignition」と呼ばれる仕組みを追加しました。Ignitionには、ソースコードをいきなりマシンコードにするのではなく、バイトコード(マシンコードほどハードウェアに依存しない「中間コード」と呼ばれるもの)を生成するコンパイラーと、それを実行するインタプリターが内包されています。</p>

<p>そして、TurboFanはバイトコードを扱う形へと作り変えられました。そして現在、最新のVersionである5.9では、この2つの仕組みは既に使われていません。内部にコードこそ存在していますが、バイトコードの生成と解釈するインタープリターIgnitionと、PeakPerfを改善するための処理をするコンパイラーTurboFanだけで動作しているという状況です。</p>

<p><img src="/wp-content/uploads/2017/06/c05.png" alt="" width="640" height="325" class="alignnone size-full wp-image-23701" srcset="/wp-content/uploads/2017/06/c05.png 640w, /wp-content/uploads/2017/06/c05-300x152.png 300w, /wp-content/uploads/2017/06/c05-207x105.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>そして、これからまもなくリリースされる6.0では、コードとして完全にV8から削除されます。</p>

<p><img src="/wp-content/uploads/2017/06/c06.png" alt="" width="640" height="312" class="alignnone size-full wp-image-23702" srcset="/wp-content/uploads/2017/06/c06.png 640w, /wp-content/uploads/2017/06/c06-300x146.png 300w, /wp-content/uploads/2017/06/c06-207x101.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h3>「Ignition Interpreter」とは？</h3>

<p>中間コードを生成して実行するインタプリター。メモリ消費が小さく動く、Fast Startupも最適という特徴があります。</p>

<ul>
<li>モバイルなどのメモリの小さな環境で動かすのに最適。</li>
<li>Startup Timeに最適化すべきコードの実行に向いている。</li>
<li>TurboFanと組み合わせることで、実行速度を最適化できる。</li>
</ul>

<h3>「TurboFan」とは？</h3>

<p>主として、最適化を行うことを目的としたコンパイラー。</p>

<ul>
<li>使われ方としては、拡張的な感じ。ただ、あらゆる新しいJavaScript機能に対応していき、その場合も活用される。</li>
<li>WebAssemblyのバックエンドでもある。</li>
<li>最近はtry/catch/finallyとか、ES2015+の最適化が可能になった。</li>
</ul>

<h1>まとめ</h1>

<p>V8について、メモリ管理向けガーベジコレクター「Orinoco」など、さまざまな技術要素が進化し、語り尽くせないほどのトピックがあるのですが、それはまた別の機会にお話しましょう。TurboFanへの完全移行、実態としてすでにほとんど終わった状況といっても過言ではありませんが、8年前とは全く異なる、Web・JavaScriptの変化に追従する大きな変化です。今後も楽しみですね。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Google I/O 2017特集]]></series:name>
	</item>
		<item>
		<title>進化を続けるChrome DevToolsの最新情報 2017 ──Google I/O 2017 セッションレポート</title>
		<link>/ryoyakawai/23548/</link>
		<pubDate>Fri, 09 Jun 2017 01:01:10 +0000</pubDate>
		<dc:creator><![CDATA[河合良哉]]></dc:creator>
				<category><![CDATA[最新動向]]></category>

		<guid isPermaLink="false">/?p=23548</guid>
		<description><![CDATA[連載： Google I/O 2017特集 (2)この記事は2017年5月17、18、19日に米国カリフォルニア州マウンテンビューにあるAmphitheatreで行われたGoogleの開発者向けカンファレンスGoogle...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/google-io-2017/" class="series-450" title="Google I/O 2017特集" data-wpel-link="internal">Google I/O 2017特集</a> (2)</div><p>この記事は2017年5月17、18、19日に米国カリフォルニア州マウンテンビューにあるAmphitheatreで行われたGoogleの開発者向けカンファレンスGoogle I/Oの3日目に「DevTools: State of the Union 2017」というタイトルで行われたセッションの内容です。</p>

<h1>はじめに</h1>

<p>Google I/O、Chrome Dev Summitと日に日に進化をし続けているChromeのDevTools。Google I/O 2017でも多くの進化が報告されました。</p>

<p>登壇者はwebっ子ならば泣く子も黙るDeveloper AdvocateのPaul Irish。軽快なトークで淡々と新機能が話された40分をまとめてみました。</p>

<p><img src="/wp-content/uploads/2017/05/PaulIrish.png" alt="" width="400" class="aligncenter size-full wp-image-23550" srcset="/wp-content/uploads/2017/05/PaulIrish.png 640w, /wp-content/uploads/2017/05/PaulIrish-300x210.png 300w, /wp-content/uploads/2017/05/PaulIrish-207x145.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h1>ConsoleでのDebug</h1>

<p>ConsoleはDebugには欠かせない機能。なので、我々はConsoleの進化に対して投資を惜しまず、かつ、楽しんで行っています。</p>

<h3>Object Preview</h3>

<p>今までも、ConosleでObjectの値の閲覧は可能でしたが、要素要素でクリックしないと内容の閲覧はできませんでした。それを解消しました。</p>

<p><img src="/wp-content/uploads/2017/05/ObjectPreview00.png" alt="" width="640" class="aligncenter size-full wp-image-23561" srcset="/wp-content/uploads/2017/05/ObjectPreview00.png 640w, /wp-content/uploads/2017/05/ObjectPreview00-300x178.png 300w, /wp-content/uploads/2017/05/ObjectPreview00-207x123.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>旧表示が左側、現在Canaryでの表示は右側のような表示になっています。</p>

<h3>Autocomplete</h3>

<p>開発者の皆さんにはConsoleでの作業はできるだけ素早く、ストレスなく行ってもらいたいと思っています。ですので、Consoleでは常にAutocompleteがされるようになっています。</p>

<p><img src="/wp-content/uploads/2017/05/Autocmplete-1.png" alt="" width="640" class="aligncenter size-full wp-image-23564" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/Autocmplete-1.png 640w, /wp-content/uploads/2017/05/Autocmplete-1-300x194.png 300w, /wp-content/uploads/2017/05/Autocmplete-1-207x134.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>例えば、<code>document.head.childNodes</code>の内容を参照したい場合、<code>document.head</code>の要素が何であるかをDevToolsは知っているので<code>childNodes</code>など要素名をサジェストをすることもできましたし、続けて例えば0番目の要素にアクセスをするために<code>document.head.childNodes[0]</code>と入力して内容を参照することも可能でした。</p>

<p>しかし、その先はどうでしょう。今までですと、続けて<code>.</code>を入力して<code>document.head.childNodes[0].</code>とし、その要素を参照しようとしても表示されずにエラーとなっていました。しかし、現在では要素へのアクセスも可能で、もちろん要素名もサジェストしてくれます。</p>

<p>そして、例えば要素名に「-(ダッシュ)」が入っているObject。今までであれば<code>classes[</code>まで入力してもサジェストは表示されなかったのですが、現在ではサジェストされるようになっています。</p>

<p><img src="/wp-content/uploads/2017/05/classes.png" alt="" width="640" class="aligncenter size-full wp-image-23582" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/classes.png 640w, /wp-content/uploads/2017/05/classes-300x132.png 300w, /wp-content/uploads/2017/05/classes-207x91.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h3>Consoleへ直接コードを入力する場合の便利機能</h3>

<p>ObjectをMapに変換する場合、Consoleへキーボードから入力するだけで変換可能になりました。</p>

<p><img src="/wp-content/uploads/2017/05/Screen-Shot-2017-05-29-at-9.21.32-PM.png" alt="" width="600" class="aligncenter size-full wp-image-23577" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/Screen-Shot-2017-05-29-at-9.21.32-PM.png 640w, /wp-content/uploads/2017/05/Screen-Shot-2017-05-29-at-9.21.32-PM-300x73.png 300w, /wp-content/uploads/2017/05/Screen-Shot-2017-05-29-at-9.21.32-PM-207x50.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>また、コードを直接Consoleへ入力する場合、今までは1行で入力する必要がありましたが現在では改行もコードの一部として受け付けるようになりました。インテント、さらには、Syntaxのハイライトもつくようになりました。この機能は去年まではありませんでした。</p>

<p><img src="/wp-content/uploads/2017/05/Console_Indent.png" alt="" width="400" class="aligncenter size-full wp-image-23575" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/Console_Indent.png 640w, /wp-content/uploads/2017/05/Console_Indent-300x154.png 300w, /wp-content/uploads/2017/05/Console_Indent-207x106.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>また<code>⌘</code>キー（<code>Ctrl</code>キー） + <code>D</code>キー で同一の引数を一挙に変更可能です。</p>

<p><img src="/wp-content/uploads/2017/05/command_d.png" alt="" width="600" class="aligncenter size-full wp-image-23585" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/command_d.png 640w, /wp-content/uploads/2017/05/command_d-300x92.png 300w, /wp-content/uploads/2017/05/command_d-207x64.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h3>非同期（Asynchronous）なJavaScriptのDebugに対応した新機能</h3>

<p>例えば、非同期処理のPromisesのDebugはとても難しかった。しかし現在では下の図のように、例えばCallStackには4つのCo-Frameがありそのうち2つは非同期の処理がある、ということを容易に把握することが可能です。ここで重要なのは、どのように動作したかを目で確認できることです。</p>

<p><img src="/wp-content/uploads/2017/05/promises.png" alt="" width="600" class="aligncenter size-full wp-image-23587" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/promises.png 640w, /wp-content/uploads/2017/05/promises-300x167.png 300w, /wp-content/uploads/2017/05/promises-207x115.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ここでの例は非常に短いサンプルの紹介ですのでシンプルですが、実際のアプリではもっと複雑です。例えば下の図のような形です。</p>

<p><img src="/wp-content/uploads/2017/05/LongCallStack.png" alt="" width="550" class="aligncenter size-full wp-image-23589" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/LongCallStack.png 640w, /wp-content/uploads/2017/05/LongCallStack-300x219.png 300w, /wp-content/uploads/2017/05/LongCallStack-207x151.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>先程も述べた通りでここで重要なのは「どのように動作したかを目で確認できること」で、このように長いStackにおいても、どのように処理が流れになっていることがパッと見で分かります。</p>

<p>ブラウザのアプリの処理は<code>setTimeout()</code>、<code>requestAnimationFrame()</code>、<code>Promises</code>などの非同期処理が連なっている同期処理の塊によって成り立っている。例えば、つい最近新たに発表されたReact Fiberのアルゴリズムは大きな処理の塊を小さな塊に分割するように設計されています。</p>

<p>これがあるスクリプトの非同期処理の0.25秒間をどう動作したか表している図です。矢印が非同期処理の流れを示しています。非常に忙しいスクリプトです。</p>

<p><img src="/wp-content/uploads/2017/05/asyncdiagram_busy.png" alt="" width="550" class="aligncenter size-full wp-image-23591" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/asyncdiagram_busy.png 640w, /wp-content/uploads/2017/05/asyncdiagram_busy-300x191.png 300w, /wp-content/uploads/2017/05/asyncdiagram_busy-207x132.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>見ての通りDevToolsでは非同期処理から次に何が起こっているかを表示することも可能です。特定の呼び出しから、次はどこの処理に遷移したのかを知ることはとても重要です。</p>

<p>これを手動で調査するとなると、とても時間がかかりますが、DevToolsを使えば、この図を見るだけで把握が可能です。DevToolsでは全ての非同期の処理を記録しているので、ページロード時からの全ての非同期処理を追うことができています。</p>

<p>これによって、プログラムのどこのポイントにおいても非同期処理の履歴を完全に追うことが可能になり、どのように到達したのか、またなぜ到達したのかを知ることが可能になっています。</p>

<h3>AsyncのDebug</h3>

<p>BreakPointを1つ1つ使って進むDebugもよく行いますが、あまり効率的ではないです。これがリアルタイムにできるようになっています。</p>

<p>例えば、<code>console.log('Processing')</code>にBreakPointを置き、<code>⌘</code>キー（または<code>Ctrl</code>キー）を押すと次にジャンプできる箇所を青色でハイライトします（下図：左）。そしてそれらの1つをクリックすることでそこまで進めることができ、さらにそこでプログラムの動作は停止します。</p>

<p>もちろん、直前の<code>result</code>の内容も見ることができる（下図：右）。</p>

<p><img src="/wp-content/uploads/2017/05/awaitDebug-1.png" alt="" width="640" class="aligncenter size-full wp-image-23601" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/awaitDebug-1.png 640w, /wp-content/uploads/2017/05/awaitDebug-1-300x183.png 300w, /wp-content/uploads/2017/05/awaitDebug-1-207x126.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h3>PromisesのDebug</h3>

<p>Promiseの処理の中にインラインでBreakPointを置くことが可能になりました。<br />
14行目にBreakPointを置くと、<code>result</code>の値が何であったかの確認もすぐにできるようになっています。</p>

<p><img src="/wp-content/uploads/2017/05/Promise_breakpoint.png" alt="" width="640" class="aligncenter size-full wp-image-23603" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/Promise_breakpoint.png 640w, /wp-content/uploads/2017/05/Promise_breakpoint-300x195.png 300w, /wp-content/uploads/2017/05/Promise_breakpoint-207x135.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>さらに、これをもっと簡単に実現しています。<br />
先ほどと同じく<code>⌘</code>キー（または<code>Ctrl</code>キー）を押すと青いハイライトと緑色のハイライトが出てきました。「その行にジャンプできる」という意味では同じですが非同期処理であることを示しています。これをクリックすることで非同期処理の内側で処理を停止することが可能です。</p>

<p><img src="/wp-content/uploads/2017/05/BlueGreen.png" alt="" width="600" class="aligncenter size-full wp-image-23605" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/BlueGreen.png 640w, /wp-content/uploads/2017/05/BlueGreen-300x196.png 300w, /wp-content/uploads/2017/05/BlueGreen-207x135.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h3>Performance Panel</h3>

<p>パフォーマンスを測定するときは、Profiles Panel、Timeline Panel、Network Panelの3つもしくは組み合わせで使っていると思います。このように、ツールが分散しているのが現状ですが、実際のところはJavaScriptのダウンロードが終ってからいつメインスレッドでの動作につながるか、</p>

<p>つまりブラウザのパフォーマンスを見たいはずです。動作と動作の接続されている箇所、例えばJavaScriptの実行完了後、ブラウザはレイアウトを計算し表示するのがいつなのか見られるのがとても重要。ですので、これらを1つのタイムラインで並列に並べて1度に見られるPerformance Panelを作りました。</p>

<p><img src="/wp-content/uploads/2017/05/PerformancePanel.png" alt="" width="640" class="aligncenter size-full wp-image-23608" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/PerformancePanel.png 640w, /wp-content/uploads/2017/05/PerformancePanel-300x167.png 300w, /wp-content/uploads/2017/05/PerformancePanel-207x115.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>Profile Panelを使ってJavaScriptの開発をしていた方は、Mainスレッドを広げることでどの時間に何が処理されているのか見ることが可能です。下のペインの&#8221;Bottom-Up&#8221;のタブが全ての処理でどれだけ時間がかかったかを表す&#8221;Self Time&#8221;の列でソートされて表示されます。</p>

<p><img src="/wp-content/uploads/2017/05/Profile_Pane.png" alt="" width="640" class="aligncenter size-full wp-image-23612" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/Profile_Pane.png 640w, /wp-content/uploads/2017/05/Profile_Pane-300x158.png 300w, /wp-content/uploads/2017/05/Profile_Pane-207x109.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>セッションではこの機能を実際にNestのホームページを使って紹介していますのでぜひご覧になってください。（<a href="https://youtu.be/PjjlwAvV8Jg?t=19m46s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Nestのホームページを使ったPerformance Panelの解説</a>）</p>

<p><a href="https://youtu.be/PjjlwAvV8Jg?t=19m46s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2017/05/YouTubeNest.png" alt="" width="640" class="aligncenter size-full wp-image-23609" style="border:1px solid #dddddd" /></a></p>

<h3>Coverage Profiler</h3>

<p>最も速いコードは実は動いていないコード、またそれより速いのはダウンロードすらされていないコード。そこで、何が実際に操作しているのかを何とかして提供することはできないかと考えた。そして実装したのがCoverage Profilerです。</p>

<p><img src="/wp-content/uploads/2017/05/CoverageProfiler00.png" alt="" width="640" class="aligncenter size-full wp-image-23615" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/CoverageProfiler00.png 640w, /wp-content/uploads/2017/05/CoverageProfiler00-300x174.png 300w, /wp-content/uploads/2017/05/CoverageProfiler00-207x120.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>Coverage Panelはここから開きます（下図：左）。</p>

<p><img src="/wp-content/uploads/2017/05/CoveragePanel.png" alt="" width="640" class="aligncenter size-full wp-image-23616" style="border:1px solid #dddddd" /></p>

<p>CSSを見てみます（上図：右）。サイトで使われている部分は緑、使われていない部分は赤で表示される。赤はCSSもJavaScriptでも現在のページで使われていない部分なので、動作させることで青に、つまり動作した部分はリアルタイムに反映される。</p>

<p>ユーザにとっては赤色になるByteは不要なのでを送らないようにしましょうね。</p>

<h3>3rd Party Attribution</h3>

<p>Consoleで<code>⌘</code>キー（または<code>Ctrl</code>キー）+<code>Shift</code>キー+<code>p</code>キーを押し、<code>Show third party badges</code>と入力して、一度Enterをします（下図：右）。その後にNetwork Panel等を開くと、Networkリクエスト左側にバッジが表示されます。（下図：左）このバッジが 3rd Party Attribution です。このバッジ内の文字列は3rd Partyの名称のイニシャルです。例えば「GA」ならGoogle Analytics。</p>

<p><img src="/wp-content/uploads/2017/05/CommandShiftP.png" alt="" width="640" class="aligncenter size-full wp-image-23626" style="border:1px solid #dddddd" /></p>

<p>Consoleのエラー等の表示にもバッジが表示されるようになっているので、エラー、警告等のConsole出力がどこの誰のスクリプトに由来しているかをひと目で確認できるようになりました（下図：下）。また、Performance Panelのタイムラインでは3rd Partyはグループとしてまとめて表示されるようになっています（下図：上）。</p>

<p><img src="/wp-content/uploads/2017/05/3rdParty.png" alt="" width="600" class="aligncenter size-full wp-image-23632" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/3rdParty.png 559w, /wp-content/uploads/2017/05/3rdParty-262x300.png 262w, /wp-content/uploads/2017/05/3rdParty-181x207.png 181w" sizes="(max-width: 559px) 100vw, 559px" /></p>

<h3>Authoring</h3>

<h4>Cookie Edithing</h4>

<p>Cookieの編集がDevToolsで可能になりました。</p>

<p><img src="/wp-content/uploads/2017/05/CookieEditing.png" alt="" width="640" class="aligncenter size-full wp-image-23637" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/CookieEditing.png 640w, /wp-content/uploads/2017/05/CookieEditing-300x169.png 300w, /wp-content/uploads/2017/05/CookieEditing-207x117.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>Change Tracking</h4>

<p>DevTools上で変更した箇所をファイルごとにdiff（差分ファイル）として全ての変更を提供することが可能になりました。まだExperimentalです。（セッションでは月曜日、そらく5月22日の月曜日、って言ってるけどまだ使えないっぽい？）</p>

<p><img src="/wp-content/uploads/2017/05/ChangeTracking.png" alt="" width="640" class="aligncenter size-full wp-image-23638" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/ChangeTracking.png 640w, /wp-content/uploads/2017/05/ChangeTracking-300x167.png 300w, /wp-content/uploads/2017/05/ChangeTracking-207x115.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>Screenshot</h4>

<p>モバイルデバイスのフレームも入れたスクリーンショットも撮れるようになりました。</p>

<p><img src="/wp-content/uploads/2017/05/ScreenShot01.png" alt="" width="640" class="aligncenter size-full wp-image-23642" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/ScreenShot01.png 640w, /wp-content/uploads/2017/05/ScreenShot01-300x156.png 300w, /wp-content/uploads/2017/05/ScreenShot01-207x107.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>さらにフルサイズのスクリーンショットも撮れるようになりました。撮り方は<code>⌘</code>キー+<code>Shift</code>キー+<code>p</code>キーを入力し&#8221;Capture full size screenshot&#8221;と入力し<code>Enter</code>。（&#8221;Capture Screen Shot&#8221;はブラウザウインドウサイズの画像）</p>

<p><img src="/wp-content/uploads/2017/05/ScreenShot.png" alt="" width="640" class="aligncenter size-full wp-image-23640" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/ScreenShot.png 640w, /wp-content/uploads/2017/05/ScreenShot-300x66.png 300w, /wp-content/uploads/2017/05/ScreenShot-207x46.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>Breakpoint Resolving</h4>

<p>Breakpointを置いて、例えばそれより若い行に変更を加えた場合、Breakpointは消えてしまっていましたが、DevToolsではBreakpointを置いた行番号が動く変更がされたとしても、出来る限り追従することが可能になりました。</p>

<p>大きな変更が入った場合は恐らく追従できません。Best Effortでの追従ですのでご了承ください。</p>

<h4>Auditing</h4>

<p>LightHouseはChrome Extention、コマンドライン、Node.jsのモジュールで提供されているwebページの質の向上を上げる、サイトのインサイトを見るためのツールです。私はこのプロジェクトにいます。
多くの形式で提供されていますが、DevToolsから実行はできませんでした。これがDevToolsに組み込まれたらとてもよいです。ということで実装しました。</p>

<p>DevToolsを開き、Audiotsのタブを表示します。すると、ここでLighthouseが実行できるようになっています。Nexus5Xをエミュレートして、ネットワークの速度、CPUの速度の調節して計測しています。ページのロードのパフォーマンス、その他にも多くの計測を行ったり、PWAのアプリとしてどうかという計測等を行って結果を出します。</p>

<p>DevToolsですので、Lighthouseで表示結果の中で、指摘された場所をダイレクトに示すことができる。LightHouseとDevToolsの連携したことでwebサイトのインサイトを見る強力なツールになっています。</p>

<p><img src="/wp-content/uploads/2017/05/LightHouseTool.png" alt="" width="600" class="aligncenter size-full wp-image-23646" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/LightHouseTool.png 640w, /wp-content/uploads/2017/05/LightHouseTool-300x210.png 300w, /wp-content/uploads/2017/05/LightHouseTool-207x145.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>セッションでは実際に<a href="https://www.chromeexperiments.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Chrome Experiments</a>を使ってデモをしていますのでぜひ御覧になってください。
（<a href="https://youtu.be/PjjlwAvV8Jg?t=33m" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Chrome Experimentsのページを使ったDevToolsに統合されたLightHouseのデモ</a>）</p>

<p><a href="https://youtu.be/PjjlwAvV8Jg?t=33m" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2017/05/LightHouseIntegration.png" alt="" width="640" class="aligncenter size-full wp-image-23644" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/LightHouseIntegration.png 640w, /wp-content/uploads/2017/05/LightHouseIntegration-300x170.png 300w, /wp-content/uploads/2017/05/LightHouseIntegration-207x117.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<h3>Headless Chrome</h3>

<p>画面を表示しない（Headless）C
hromeを使うことで、異なった複数のセッティングでの自動検査を行うツール等を作ることができる。例えば、テキスト抽出、スクリーンショット、PDF生成、リグレッションテスト、ユニットテスト、インテグレーションテスト、セキュリティテスト、サーバサイドでのレンダリングなどの検査です。</p>

<p>Chromeチームではそういったシナリオを実現させたかったので現在使えるようになっています。Linux、macOS、Windows（60で対応）で動作可能です。Seleniumへも対応中です。<br />
現状は低レイヤーのAPIしかありませんが、今後高レイヤーのAPIも実装されます。</p>

<p><a href="https://developers.google.com/web/updates/2017/04/headless-chrome" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Eric BidelmanがHeadless Chromeについて書いたブログポスト</a>（<a href="https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">日本語版</a>）がありますのでそちらもご確認ください。</p>

<p><img src="/wp-content/uploads/2017/05/headless_Chrome.png" alt="" width="640" class="aligncenter size-full wp-image-23654" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/headless_Chrome.png 640w, /wp-content/uploads/2017/05/headless_Chrome-300x131.png 300w, /wp-content/uploads/2017/05/headless_Chrome-207x90.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>Node.js</h4>

<p>去年Node.jsもDevToolsでDebug、Profileを出来るようになりました。ブラウザとNode.jsに多くの時間を使うのでとてもよいことです。ここ2年で進化したNode.jsを、私がLightHouseのプロジェクトで行っているDebug方法で実際にお見せします。</p>

<p>セッションでの実際のデモへのリンクです。併せてご覧になると分かりやすいと思います。</p>

<p><a href="https://youtu.be/PjjlwAvV8Jg?t=37m27s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">デモ動画</a>
<a href="https://youtu.be/PjjlwAvV8Jg?t=37m27s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2017/05/NodeYouTube.png" alt="" width="640" class="aligncenter size-full wp-image-23658" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/NodeYouTube.png 640w, /wp-content/uploads/2017/05/NodeYouTube-300x203.png 300w, /wp-content/uploads/2017/05/NodeYouTube-207x140.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>以下のコマンドをTerminalから入力して始めますが重要なのは<code>--inspect-brk</code>の部分です。次に出力されるURLをコピーして表示することも可能ですが、よりよい方法があります。</p>

<p><code>
$ node --inspect-brk lighthouse-cli --pref http://example.com;/
</code></p>

<p>Chromeのアドレスバーに<code>about:inspect</code>と入力して &#8220;Open decicated DevTols for Node&#8221; のリンクをクリックします。するとNode.jsにのみ接続されている専用のDevToolsのウィンドウが表示されます。もちろんこのウィンドウ内でもDevToolsの全ての機能が利用可能です。</p>

<p>このNode.js専用DevToolsを開くもう1つのよりよい方法です。<br />
DevToolsを開いておき先ほどと同じコマンドを入力します。</p>

<p>そして、DevToolsを見るとInspect ElementのアイコンのとなりにNode.jsのアイコンが現れます。このアイコンをクリックすることで先ほどと同じNode.js専用DevToolsを表示することが可能です。このNode.js専用DevToolsの良いところは、Debugをして再起動したとしても、Node.js専用DevToolsを再起動する必要がないところ。</p>

<p><img src="/wp-content/uploads/2017/05/node_debug.png" alt="" width="640" height="304" class="aligncenter size-full wp-image-23657" style="border:1px solid #dddddd" srcset="/wp-content/uploads/2017/05/node_debug.png 640w, /wp-content/uploads/2017/05/node_debug-300x143.png 300w, /wp-content/uploads/2017/05/node_debug-207x98.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h1>まとめ</h1>

<p>たくさんの新しい機能を説明してきました。<br />
Twitter、定期的に更新しているドキュメント、バグの報告＆フィードバック＆機能追加のリクエストを行うリンクは以下になります。</p>

<ul>
<li>Twitter: <a href="https://twitter.com/ChromeDevTools" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@ChromeDevTools</a></li>
<li>Docs: <a href="https://devtools.chrome.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">devtools.chrome.com</a></li>
<li>File bugs &amp; give feedback: <a href="https://new.crbug.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">new.crbug.com</a></li>
</ul>

<p>ありがとうございました！</p>

<h1>おわりに</h1>

<p>今回も開発者視点で欲しい機能がたくさん追加されました。ブラウザであるはずのChromeですが、DevToolsだけに注目すると「ブラウザっていうか、どちらかというと開発ツールだよね？」と思う（もちろん良い意味で）ことも少なくありません。今までに磨きをかけて更にwebの開発をまたスピードアップできるのではないでしょうか？</p>

<p>セッションの中でPaul Irishは「ユーザからの声が多かった◯◯の機能」「◯◯の開発の手順（ワークフロー）を考えるとこの機能は重要で…」というように常に開発者視点に立った上で機能の追加を行ってくださっていますので、</p>

<ul>
<li>こんなツールがDevToolsに欲しい</li>
<li>こういった開発の手順を考えるとこの機能はDevToolsに欲しい</li>
</ul>

<p>などをフィードバックすることで、もしかしたらその機能が本当に実装されるかもしれませんので、要望のある方はぜひ上記のURLよりフィードバック、バグ報告等を行ってください!</p>
]]></content:encoded>
		
		<series:name><![CDATA[Google I/O 2017特集]]></series:name>
	</item>
		<item>
		<title>Progressive Web Appで実現する動画アプリの最新テクニック ──Google I/O 2017 セッションレポート</title>
		<link>/ryoyakawai/23440/</link>
		<pubDate>Wed, 31 May 2017 01:00:16 +0000</pubDate>
		<dc:creator><![CDATA[河合良哉]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Google I/O 2017]]></category>
		<category><![CDATA[Progressive Web Apps]]></category>

		<guid isPermaLink="false">/?p=23440</guid>
		<description><![CDATA[連載： Google I/O 2017特集 (1)この記事は2017年5月17、18、19日に米国カリフォルニア州マウンテンビューにあるAmphitheatreで行われたGoogleの開発者向けカンファレンスGoogle...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/google-io-2017/" class="series-450" title="Google I/O 2017特集" data-wpel-link="internal">Google I/O 2017特集</a> (1)</div><p>この記事は2017年5月17、18、19日に米国カリフォルニア州マウンテンビューにあるAmphitheatreで行われたGoogleの開発者向けカンファレンスGoogle I/Oの3日目に「The Future of Audio and Video on the Web」というタイトルのセッションの内容です。</p>

<h1>はじめに</h1>

<p>タイトルをパッと見て、例えばWeb Audioの話も絡むのか！？と思いきや、内容はビデオでしたが、2000年からwebのみならずリビングにあるテレビ（動画）から、YouTube、SNSでの動画も含めて歴史を追った説明、デモをまじえ動画を中心としたwebサイトの現在できる最高のExperience、そして見えかけている未来のwebでの動画の拡がり、とwebで動画という切り口から幅広く説明をした中身の濃いセッションでした。</p>

<p>登壇したのはこのお二方。Product ManagerのJohn Pallettと、Developer Programs EngineerのFrancois Beaufortです。</p>

<p><img src="/wp-content/uploads/2017/05/John_Francois.png" alt="" width="640" height="230" class="aligncenter size-full wp-image-23451" srcset="/wp-content/uploads/2017/05/John_Francois.png 640w, /wp-content/uploads/2017/05/John_Francois-300x108.png 300w, /wp-content/uploads/2017/05/John_Francois-207x74.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

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

<h1>動画が机、リビングから手の上に乗り外に向けて歩き出す</h1>

<p>2000年から10年はほとんど変わらなかった。
2000年は私(John Pallett)がHDのテレビを買った最初の年。この当時はHD動画を録画する機器すらなかったが、直後にHD録画機器も出始めSkypeも同じ頃に登場。2005年にYouTube、2007年にはAmazonのPrimeビデオ、Netflixがストリーミングサービスを開始。しかし、この頃は机、リビングで見るのが主でした。
<img src="/wp-content/uploads/2017/05/tv_living.png" alt="" width="640" height="364" class="aligncenter size-full wp-image-23453" srcset="/wp-content/uploads/2017/05/tv_living.png 640w, /wp-content/uploads/2017/05/tv_living-300x171.png 300w, /wp-content/uploads/2017/05/tv_living-207x118.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>2010年からは私の娘を軸に見ていきます。
2010年はタブレットが出始めた年。娘はこの頃から場所を選ばず受動的に動画、音楽を聞いたり、一方で能動的に録画、録音するようになっていました。</p>

<p>ちょうどその頃にはFaceTimeが登場し、ビデオチャットが気軽にできるようになり、2011年にはTwitchでゲーム動画の配信、2013年にはSnapchat、2014年にmusical.lyで若者が音楽ビデオを録り、さらにそれを友達同士で配信するようになった。さらに過去数年では、VR、AR、360度動画が出てきたりと、イノベーションがここ数年の動画の進化を加速。</p>

<p><img src="/wp-content/uploads/2017/05/tv_mobile.png" alt="" width="640" height="384" class="aligncenter size-full wp-image-23456" srcset="/wp-content/uploads/2017/05/tv_mobile.png 640w, /wp-content/uploads/2017/05/tv_mobile-300x180.png 300w, /wp-content/uploads/2017/05/tv_mobile-207x124.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>この進化を裏付けるように、現在のインターネットのトラフィックの70%が映像（ビデオ）で、Cisco社は2020年までにこれが80%まで伸びるだろうと予測しています。</p>

<p><img src="/wp-content/uploads/2017/05/badMovie4.png" alt="" width="640" height="107" class="aligncenter size-full wp-image-23461" srcset="/wp-content/uploads/2017/05/badMovie4.png 640w, /wp-content/uploads/2017/05/badMovie4-300x50.png 300w, /wp-content/uploads/2017/05/badMovie4-207x35.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h1>モバイルwebでの動画の過去と未来</h1>

<p>先程挙げた、Twitch、Snapchat、musical.ly、これらのサイトに行くと実はアプリ（Android, iOS）のインストールを求められます。</p>

<p>しかし、モバイルwebでこれらのアプリを作ればアプリのインストールは不要、そしてすぐにやりたいことができるはずなのに、なぜそうなっていないのでしょう？少し奇妙です。</p>

<p>理由を考えると実はそれにはいくつかの問題、課題がありました。一言でいうと、モバイルwebは動画が得意ではなかったのです。その問題点を見ていきます。</p>

<h3>Buffering</h3>

<p>動画の提供側はFlashを第一に、第二にHTML5に向けて公開するという時代が続いていて、モバイルwebは眼中の外でした。なぜならモバイルwebで動画にアクセスすると動画のダウンロードに時間がかかり、再生までにかなりの時間がかかっていたからです。</p>

<h3>映像のクオリティの低さ</h3>

<p>「ダウンロードに時間がかかるのなら、映像のクオリティを落とし、ファイルサイズを小さくしよう！」となりますが、小さくすればするほど映像のクオリティは低下します。</p>

<h3>いけてないレイアウト</h3>

<p>動画の提供側はモバイルwebは眼中の外だったので、サイト全体のデザイン、レイアウトはデスクトップに最適化されていて、モバイルwebでは動画の一部しか表示されていなかったりした。しかし、この現象は防ぐためのAPIがなかったことが大きい要因で、対策はできなかったかもしれないというのも事実。</p>

<h3>オフラインでは利用不可</h3>

<p>オフラインでの利用はできなかった。もちろんChromeではOffline時には恐竜ゲームはできて楽しいけど、動画を観たいのに恐竜ゲームを例えば飛行機に乗って数時間するのは現実的ではありません。</p>

<p>では現在のモバイルwebでどうなっているかを紹介します。</p>

<p>デモアプリとしてDeveloper Relations TeamのPaul Lewisが書いたアプリを例に紹介します。アプリの名前は「<strong>Biograf</strong>」で、アプリとソースコードは以下のURLにあります。</p>

<ul>
<li><strong>アプリ</strong> <a href="http://bit.ly/pwa-media" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">bit.ly/pwa-media</a></li></li>
<li><strong>ソースコード</strong> <a href="http://bit.ly/pwa-media-code" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">bit.ly/pwa-media-code-media</a></li>
</ul>

<p><img src="/wp-content/uploads/2017/05/biograf.png" alt="" width="640" height="386" class="aligncenter size-full wp-image-23472" srcset="/wp-content/uploads/2017/05/biograf.png 640w, /wp-content/uploads/2017/05/biograf-300x181.png 300w, /wp-content/uploads/2017/05/biograf-207x125.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>（セッションではここで実際にデモを行います。併せてご覧になると分かりやすいと思います。<a href="https://youtu.be/z9unKFzAj1w?t=4m51s" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">デモの動画</a>）</p>

<p><a href="https://youtu.be/z9unKFzAj1w?t=4m51s" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2017/05/demo1.png" alt="" width="640" height="470" class="aligncenter size-full wp-image-23471" srcset="/wp-content/uploads/2017/05/demo1.png 640w, /wp-content/uploads/2017/05/demo1-300x220.png 300w, /wp-content/uploads/2017/05/demo1-207x152.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a>
（クリックでデモ部分の動画が再生可能です）</p>

<p>特徴は以下です。これはwebアプリですよ！</p>

<ul>
<li>Progressive Web App</li>
<li>Nativeアプリのようにホーム画面からアイコンをタップして起動可能</li>
<li>起動アニメーション（Splash）が表示できる</li>
<li>Chrome（ブラウザ）の枠はなく、全画面でアプリ全体を表示</li>
<li>スクロールも非常にスムース</li>
<li>動画は再生をタップしてから一瞬で開始</li>
<li>デバイスを横にするとフルスクリーンでも動画の表示が可能</li>
<li>タイムラインをスクロールすると、サムネイルも表示可能</li>
<li>フルスクリーン中にタップすると、「再生、停止、コマ送り・戻し」のコントロール画面が表示可能</li>
<li>通知エリアにもコントロールを表示することが可能</li>
<li>動画のダウンロード機能もあり、ダウンロードした動画はプラウザを閉じても、機内モードでも再生可能（Background Fetch）</li>
<li>ロック画面からのコントロールも可能</li>
<li>ロック画面で動画のサムネイルを背景としても表示可能</li>
<li>制限付き動画でもライセンスをハンドルして再生可能</li>
</ul>

<p>これらのExperienceは動画の再生時「ページのロードが遅いとユーザはサイトから離脱してしまう」事実を元に考えると非常に重要な機能でもあります。Akamai社の調査では2秒で表示されないとサイトからの離脱が始まり、また動画の再生に関しては6秒以内に再生されないとユーザは再生開始を待たず離脱してしまうという調査結果を出しています。</p>

<p>では、このアプリを例にExperienceを1つ1つ見ていきましょう。</p>

<p><img src="/wp-content/uploads/2017/05/experience.png" alt="" width="640" height="362" class="aligncenter size-full wp-image-23476" srcset="/wp-content/uploads/2017/05/experience.png 640w, /wp-content/uploads/2017/05/experience-300x170.png 300w, /wp-content/uploads/2017/05/experience-207x117.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h3>反応の速い再生(Fast Playback)</h3>

<p>これはAdaptive Bitrate Streamingで実現しています。動画を再生するには動画のダウンロードは必須だが、モバイル環境下ではダウンロードするデバイスがトンネルを通ったり、帯域を失ったりする。Adaptive Bitrate Streamingがこれらのネットワークがコンスタントでない部分を解決します。</p>

<p>再生するビデオは複数のBitrateでエンコードして、それらがさらにある時間間隔で断片化して保存する。断片化されたファイルをダウンロードするアプリ側で低域等の状況に合わせてBitrateと断片の組み合わせの最適化を施すことで、反応の速い再生を可能にします。</p>

<p>これを実装したのがOpen Sourceの<a href="http://github.com/google/shaka-player" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Shaka Player</a>です。</p>

<p>また、再生ボタンをクリック/タップしてからの再生の反応に関しては、Service Workersで動画をPre-Cacheすることで速くしている。これが実装されているのが<a href="https://www.theoplayer.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">THEOPlayer</a>です。Biografにも実装されているが、動画の説明等も一緒に、事前にキャッシュ（Pre-Cache）することで再生までの時間を短縮している。またService Workersを使うとサイト自体のスピードもアップすることが可能です。</p>

<p>VIACOM18の<a href="https://www.voot.com/public_html/index.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Voot</a>という動画サイト（5月25日現在、インドでの提供のみ）ではページロード時間が5倍速くなり、これによってユーザがが77%増加、日々に動画を再生するユーザは15％増加したという結果もあります。</p>

<h3>Offline</h3>

<p>Offlilneは例えば飛行機に乗っている時など、インターネットアクセスがない場所では非常に重要な機能。BiografではService Workersを使って、ページに表示する動画の説明、また動画に関してはリーズナブルなBitrateで事前にダウンロードしキャッシュとしてブラウザ側に保存することでどこでも再生できるようにしています。このBitrateは開発者側からService Workersのロジックの中で、またはユーザ側が例えばダウンロード開始時に選択することが可能。</p>

<p><img src="/wp-content/uploads/2017/05/Offline.png" alt="" width="640" height="358" class="aligncenter size-full wp-image-23479" srcset="/wp-content/uploads/2017/05/Offline.png 640w, /wp-content/uploads/2017/05/Offline-300x168.png 300w, /wp-content/uploads/2017/05/Offline-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" />
Offlineはオーディオにも適応可能です。例えばオーディオブックを考えると、Service Workersを使って事前にブック内のプレイリストのオーディオを事前にキャッシュしておくことで、Offlineでも再生が可能になる。</p>

<p>Biografでは動画をキャッシュするためにBackground FetchというAPIを使っていますが、この機能は現在開発中でExperimental Web Platform features（Chromeのアドレスバーに<code>chrome://flags/#enable-experimental-web-platform-features</code>を入力すると変更可能です）をEnableにすることで利用が可能になります。このAPIに関するフィードバックをお待ちしています。</p>

<h3>VP9</h3>

<p>コーデックに関してです。クオリティを落とさずに2倍のコンテンツを保存できたらよいですよね。VP9は一般的なコーデックに比べると50％程圧縮率が高いので、質を落とさずにファイルサイズを50％減らすことができます。既に20億のデバイスがサポートされている状態なのでとてもよい選択肢。例えばYouTubeではVP9を使うことで他のコーデックで配信したときよりも再生までの時間を15〜80％縮めることができています。</p>

<h3>User Experience</h3>

<h4>Media Session API</h4>

<p>ロック画面、通知エリアでサムネイルをバックグラウンドに表示していたのと、コントロールボタンを表示していたのがこのAPI。ウェアラブル側にも表示されます。</p>

<p><img src="/wp-content/uploads/2017/05/SessionOrientationAPI.png" alt="" width="640" height="375" class="aligncenter size-full wp-image-23483" srcset="/wp-content/uploads/2017/05/SessionOrientationAPI.png 640w, /wp-content/uploads/2017/05/SessionOrientationAPI-300x176.png 300w, /wp-content/uploads/2017/05/SessionOrientationAPI-207x121.png 207w" sizes="(max-width: 640px) 100vw, 640px" />
実装は簡単でMetadataとしてタイトル、アーティスト、アルバム名、表示する画像を指定をし、コントロール（再生、ストップ等）のボタンが押された時のHandlerをそれぞれ書くことで実装が可能です。</p>

<h4>Session Orientation API</h4>

<p>デバイスを回転させたときの動作を指定できるAPI。Biografでは横にした場合に全画面表示にしている。縦、横になった場合のHandlerを書くことで実装が可能。
<img src="/wp-content/uploads/2017/05/MediaSessionAPI.png" alt="" width="640" height="376" class="aligncenter size-full wp-image-23482" srcset="/wp-content/uploads/2017/05/MediaSessionAPI.png 640w, /wp-content/uploads/2017/05/MediaSessionAPI-300x176.png 300w, /wp-content/uploads/2017/05/MediaSessionAPI-207x122.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>webでの動画の未来</h2>

<p>タイトル通りの未来のお話をします。映像周辺の仕様の進化はディスプレイをよりリアルな表現の表示に近づけてくれます。</p>

<h4>Wide Color Gamut</h4>

<p>まずは色からお話します。現在のテレビ（4Kや8K）で実現されている色がモバイル、デスクトップのwebで表現できるようになります。</p>

<p>現在のディスプレイで表現できている色は目で見えているよりも色の表現は乏しい。その色は存在する色が外側の枠だとすると、最も内側にある三角枠が現在のディスプレイ（SRGB）の守備範囲。これがBT2020になると真ん中の三角枠まで表現できるようになります。</p>

<p><img src="/wp-content/uploads/2017/05/WideColorGamut.png" alt="" width="300" class="aligncenter size-full wp-image-23484" srcset="/wp-content/uploads/2017/05/WideColorGamut.png 598w, /wp-content/uploads/2017/05/WideColorGamut-280x300.png 280w, /wp-content/uploads/2017/05/WideColorGamut-193x207.png 193w" sizes="(max-width: 598px) 100vw, 598px" /></p>

<p>僕の履いている靴、実はこのディスプレイ（登壇者の背面にある）では正しい色で表示されていない。けども4K、8Kではより近い色が出てるはず。<br />
（独り言：もしや登壇者のJohn Pallettさん、このために靴を新調したのかな？）
<img src="/wp-content/uploads/2017/05/Screen-Shot-2017-05-25-at-9.52.00-PM.png" alt="" width="640" height="364" class="aligncenter size-full wp-image-23486" srcset="/wp-content/uploads/2017/05/Screen-Shot-2017-05-25-at-9.52.00-PM.png 640w, /wp-content/uploads/2017/05/Screen-Shot-2017-05-25-at-9.52.00-PM-300x171.png 300w, /wp-content/uploads/2017/05/Screen-Shot-2017-05-25-at-9.52.00-PM-207x118.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>High Dynamic Range (Brightness)</h4>

<p>いままでよりも明るいものは明るく、暗いものは暗く表示できるようになる仕様です。現在の一般的なディスプレイではSDR（Standard Dynamic Range）しか表現できません。これは現実の世界の明るさからするとかなりの差があります。</p>

<p>HDR(High Dynamic Range)をサポートしたディスプレイがこれから市場に出てきます。これはOTF（electric Optical Function、またはガンマFunctionともいう）を変えます。デジタルの数字からディスプレイでどれだけの明るさで表示するかのFunctionのことで、それが変更されるので映像・画像を扱う方はどのディスプレイが何をサポートしているか、またそのディスプレイの特性を知った上で選択する必要が出てくるということです。
<img src="/wp-content/uploads/2017/05/sdr-hdr.png" alt="" width="640" height="350" class="aligncenter size-full wp-image-23487" srcset="/wp-content/uploads/2017/05/sdr-hdr.png 640w, /wp-content/uploads/2017/05/sdr-hdr-300x164.png 300w, /wp-content/uploads/2017/05/sdr-hdr-207x113.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>Wide Color GamutとHigh Dynamic Rangeのコードは以下です。上部についてです。CSS Media Query Level4で可能になります。現在のChromeではcolor-gamutがサポートされていますが、デバイスでどの色が使えるかをクエリすることが可能で、それによって決定することが可能です。</p>

<p>また下部のコードではVP9がHDRとOTFでどの色で表示できるかをクエリによって決定することができます。</p>

<p><img src="/wp-content/uploads/2017/05/CSSL4.png" alt="" width="640" height="348" class="aligncenter size-full wp-image-23490" srcset="/wp-content/uploads/2017/05/CSSL4.png 640w, /wp-content/uploads/2017/05/CSSL4-300x163.png 300w, /wp-content/uploads/2017/05/CSSL4-207x113.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>Alliance for Open Media(AOM)</h4>

<p>アライアンスです。このアライアンスはYouTube、Google、Amazon、Twitch、Netflix、Microsoft、Mozilla、Hulu、BBCが参加していて、Open SourceでRoyalty-Freeの新しいCodecを作ろうとしています。</p>

<p>HDRだけでなく、Wide Color Gamut、また8K、4K、360どビデオも低いBitrateでも届けることができるようなCodecを考えています。なぜなら世界で皆が同じレベルのネットワークを使えるわけではないから。</p>

<p>このアライアンスではAV1という名前のCodecを開発している。数週間前はまだ開発も終えていないし、使えるフォーマットではなかったが、NetflixがVP9よりも20％高い圧縮率のフォーマットを実現することができたとの報告を受けている。</p>

<p>恐らく疑問に思うのは「AV1がどれだけのデバイスでサポートされているのか？」というところだと思います。ここがwebのユニークで面白いところ。1GHzと3GHzのデバイスでは再生のされ方が違う。ではそこをどうするか、VP9を例にコードを見てみます。Media Capabilities APIを使うことで以下のようにいろいろな値を指定することが可能です。</p>

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

<p>APIにResolution、Bitrate、再生したいCodecを渡すと、指定した形式をサポートしているか、指定した形式でスムースにつまらずに再生できるか、バッテリパワー的に効率的かを返してくれるので、この情報をどのタイプで再生するかのみならず、どのResolutionで再生するか等、ユーザに最適なExperienceを提供することができるようになる。</p>

<h2>録音・録画とシェアとSNS</h2>

<p>ここ数年、映像とオーディオに関してここ数年で飛躍的に前進している。私の娘がモバイルで音楽の制作、映像の撮影をしている。顔に飾り物をディスプレイ上でつけたりカスタマイズして、そのまま友達とSNSでシェアしてる。これは5、6年前では考えられなかったことです。SNSでは即座に撮影してシェアすることがキーになります。これはwebにはとても得意ところ。なので、ここでSNSやコミィニケーションについて話をします。</p>

<p>WebRTCはあたらしい技術ではないが、ここ数年で急速にブラウザベンダとアプリケーションプラットフォームとしての両方に適応されてきました。そしてWebRTCを使えばLiveStreamingもすることが可能です。</p>

<p>そしてユーザがシェアする動画・音楽の制作に関して、簡単に探せて、簡単に見ることができ、さらにそれを見た友達が動画・音楽の制作ができ…となれば、とてもよいサイクルが生まれます。
<img src="/wp-content/uploads/2017/05/Creation.png" alt="" width="640" height="369" class="aligncenter size-full wp-image-23494" srcset="/wp-content/uploads/2017/05/Creation.png 640w, /wp-content/uploads/2017/05/Creation-300x173.png 300w, /wp-content/uploads/2017/05/Creation-207x119.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>このサイクルの実現はwebでなら難しくはありません。それではこのサイクルがwebで実現できるかどうかを、デモを交えてフランソワから紹介してもらいます。</p>

<h1>Mustache（髭）</h1>

<p>映像とシェアに関わる部分で現在のwebでできることを盛り込んだデモをご紹介します。アプリは「Mustache」という名前です。</p>

<p><img src="/wp-content/uploads/2017/05/Mustache01-1.png" alt="" width="640" height="548" class="aligncenter size-full wp-image-23504" srcset="/wp-content/uploads/2017/05/Mustache01-1.png 640w, /wp-content/uploads/2017/05/Mustache01-1-300x257.png 300w, /wp-content/uploads/2017/05/Mustache01-1-207x177.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>Progressive Web Appになっています。ホーム画面のアイコンから起動すると、起動アニメーション（Splash）が表示されます。このExperienceですと、既にwebアプリだと認識するのが難しいと思います。顔には髭、頭には帽子をかぶっています。動かしても映像はとてもスムーズです。動画の撮影も可能で、それをシェアすることももちろん可能です（上の画像の右側）。</p>

<h3>Mustacheが利用しているAPI</h3>

<h4>映像を扱う(getUserMedia())</h4>

<p>カメラを扱い、画面に表示するコードが以下になります。
<img src="/wp-content/uploads/2017/05/getusermedia-2.png" alt="" width="640" height="354" class="aligncenter size-full wp-image-23505" srcset="/wp-content/uploads/2017/05/getusermedia-2.png 640w, /wp-content/uploads/2017/05/getusermedia-2-300x166.png 300w, /wp-content/uploads/2017/05/getusermedia-2-207x114.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><code>getUserMeida()</code>でカメラの映像と音声を取得します。Mustacheの場合は映像のみを利用します。その他の条件として利用するカメラ（前面、背面）、Framerate、サイズをしています。そして下部のコードで取得した映像を画面に表示しています。</p>

<h4>形状の検知（Shape Detection API）</h4>

<p>現在、実験中のAPIであるShape Detection APIを使っています。動いている顔へ髭、そして頭に帽子をと、このAPIが重ねる正しい場所を検知することを可能にしています。つい先週完成したばかりのAPIです。</p>

<p>コードは以下のようになります。とてもシンプルです。<code>FaceDetector()</code>に顔を取得するか、また、顔を最大いくつ検知するかの数を指定するだけです。ブラウザ側のAPIなのでインターネットへの接続は不要です。</p>

<p>このShape Detection APIはBarcode、QR Codeを検知するAPIと同時に9月にはChrome安定版でテスト利用という目的で利用可能になります。また、現在でも「Experimental Web Platform features」をEnableにすることで利用可能です。もし要望、バグがあったら知らせてください。</p>

<p><img src="/wp-content/uploads/2017/05/shapedetectionapi.png" alt="" width="640" height="354" class="aligncenter size-full wp-image-23507" srcset="/wp-content/uploads/2017/05/shapedetectionapi.png 640w, /wp-content/uploads/2017/05/shapedetectionapi-300x166.png 300w, /wp-content/uploads/2017/05/shapedetectionapi-207x114.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>映像の録画（Media Recording API）</h4>

<p>Mustacheでは、以下のようにMedia Recording APIを使っています。<code>MediaRecorder()</code>へCodecをVP9と指定して、映像を受け取ったら処理をするHandler、また録画を停止した時のHandlerを書いている。Chromeに公開されて1年になるのでAPIは安定しています。</p>

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

<h4>シェア機能（Web Share API）</h4>

<p>シェアボタンを押したときにAndroidのNativeのシェア選択画面が出てきていましたよね。自然過ぎてわからなかったかもしれませんが…。これはWeb Share APIを使っています。<br />
コードは以下です。<code>share()</code>にタイトル、テキストと映像のURLを指定します。このAPIは今年末には利用できるようになるでしょう。
<img src="/wp-content/uploads/2017/05/webshare.png" alt="" width="640" height="347" class="aligncenter size-full wp-image-23510" srcset="/wp-content/uploads/2017/05/webshare.png 640w, /wp-content/uploads/2017/05/webshare-300x163.png 300w, /wp-content/uploads/2017/05/webshare-207x112.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>Mustacheは以下のURLで公開しています。<br />
Chrome for AndroidのCanaryを使い、Experimental Web Platform featuresのEnableにして利用してください。</p>

<ul>
<li><a href="bit.ly/mustaches-io" data-wpel-link="internal">Mustache</a></li>
</ul>

<p><img src="/wp-content/uploads/2017/05/MustacheURL.png" alt="" width="640" height="356" class="aligncenter size-full wp-image-23512" srcset="/wp-content/uploads/2017/05/MustacheURL.png 640w, /wp-content/uploads/2017/05/MustacheURL-300x167.png 300w, /wp-content/uploads/2017/05/MustacheURL-207x115.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>全てのAPIを1つのノードとしてみるとwebではPlug-inなしでこれらノード同士を無限につなげることができます。例えば、Media Streamを使えばカメラからCanvasに描画、アップロード、またマイクからWeb Audioそして、WebRTCのRTCPeerConnectionへと、たくさんのAPIと接続して利用することが可能です。</p>

<h1>まとめ</h1>

<p>デモに交えてたくさんのAPIを話しました。多くが現在でも利用可能なAPIです。</p>

<p>Biografでは、Service Workers、Media Session API、Full Screen API、Screen Orientation APIなどを使っています。フランソワが<a href="bit.ly/mobile-web-video-playback" data-wpel-link="internal">こちらに記事として</a>まとめてくれていますので詳しくはそちらを参照してください。</p>

<p>映像の再生等に関わるProgressive Web Appを書く場合は<a href="bit.ly/pwa-media-code" data-wpel-link="internal">Biografのコード</a>を参考にするとよりよいExperienceを提供できるでしょう。<br />
そしてMustacheで使っているMediaStream Recording API、Media Capture API、Media Streams APIは現在でも利用可能です。</p>

<p>最後に、以下の3つは特にFeedbackをお待ちしています。</p>

<ul>
<li><a href="http://wicg.github.io/background-fetch" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Background Fetch</a></li>
<li><a href="http://wicg.github.io/shape-detection-api" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Shape Detection API</a></li>
<li><a href="http://wicg.github.io/web-share" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Web Share API</a></li>
</ul>

<p>ありがとうございました！</p>

<h1>おわりに</h1>

<p>個人的に数年前から年に数回はFacebookをモバイルwebから使う儀式をしています。写真や動画を撮ってシェアしたりするのが特にですが不自由な点がありました。</p>

<p>また、QRコードの読み取りも必ずモバイルのNativeアプリ、またはインターネットへの接続が必須とされていました。それを元に考えると近年のWebブラウザの進化には目を見張るところがあり、また同時にその進化を肌で実感できるエキサイティングなプラットフォームの1つだと思います。</p>

<p>今後も映像のみならず、他の分野でのWebブラウザの発展、拡張も期待できそうですし、その進化から目が離せないですね。</p>
]]></content:encoded>
		
		<series:name><![CDATA[Google I/O 2017特集]]></series:name>
	</item>
	</channel>
</rss>
