<?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="/tag/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>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>
