<?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>API &#8211; HTML5Experts.jp</title>
	<atom:link href="/tag/api/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の最先端では何が起こっているのか？──最新機能目白押し！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>
		<item>
		<title>いつかきっと日の目を見る！？非モテ系マニアックAPIを紹介！「HTML5 Conference 2013」</title>
		<link>/miyuki-baba/3760/</link>
		<pubDate>Mon, 30 Dec 2013 04:00:25 +0000</pubDate>
		<dc:creator><![CDATA[馬場 美由紀]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[HTML5 Conference 2013]]></category>
		<category><![CDATA[WebRTC]]></category>

		<guid isPermaLink="false">/?p=3760</guid>
		<description><![CDATA[連載： HTML5 Conference 2013レポート (14)「今日は面白いのに話題になっていないよね、というHTML5のマニアックなAPIを紹介しようと思う」。冒頭でこう切り出して始まった羽田野太巳氏のセッション...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conference-2013-2/" class="series-160" title="HTML5 Conference 2013レポート" data-wpel-link="internal">HTML5 Conference 2013レポート</a> (14)</div><p>「今日は面白いのに話題になっていないよね、というHTML5のマニアックなAPIを紹介しようと思う」。冒頭でこう切り出して始まった羽田野太巳氏のセッション。テーマは「ようこそ、HTML裏APIの世界へ」。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2013/12/3825f07b8471ce78786fe9fced64deb1.jpg" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2013/12/3825f07b8471ce78786fe9fced64deb1.jpg" alt="羽田野太巳" width="700" height="456" class="alignnone size-full wp-image-3968" srcset="/wp-content/uploads/2013/12/3825f07b8471ce78786fe9fced64deb1.jpg 640w, /wp-content/uploads/2013/12/3825f07b8471ce78786fe9fced64deb1-300x195.jpg 300w, /wp-content/uploads/2013/12/3825f07b8471ce78786fe9fced64deb1-207x134.jpg 207w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>

<h2>HTML5のAPIはモテ系だけじゃない。非モテ系にも注目！</h2>

<p>現在、HTML5の世界で世間の注目を集めているのはCanvasやWebGL、WebRTCなどのモテ系APIである。五感に訴えられる、派手で華やかなデモが作れるので仕事に結びつきやすい技術だ。「仕事に結びつきやすい」ことからモテ系と呼ばれているが、羽田野氏が紹介するのは非モテ系のAPI。</p>

<p>「語れる開発者仲間が少ないし、使ってもすごさがわからない。仕事になるかわからない。未熟なので仕様がなくなるかもしれない。でもいつか報われる日がくるんじゃないかと期待できる。そんな今はAPIを紹介する。ただ、さっきもいったようにハッピーエンドは期待をしないでほしい（笑）」</p>

<h2>マニアレベル1「割とモテ系」の4つのAPI</h2>

<p>羽田野氏は非モテ系APIをそのマニアック度から4つのレベルに分けて紹介。最初に取り上げたのはマニアレベル1（割とモテ系）のWebRTC DTMF(Dual-Tone Multi-Frequency)である。</p>

<p>WebRTC DTMFはいわばSkypeをブラウザで実現するためのAPIで、最大の特徴は映像、音声、データをP2Pで接続できること。IP電話の知識が必要になるため、「マニア心を揺さぶられる」（羽田野氏）という。「ダイヤルトーン音を発生させるできるため、自動音声装置（IVR）への応用が期待できる。</p>

<p>また将来的にはブラウザからコールセンターへ通話ができるようになるかも」と、ビジネス的にも注目されているAPIだという。実際にダイヤルトーン発信のデモを実施し、その実力を披露した。</p>

<p>次に紹介したのは「WebAudio API」。「音源の生成や合成ができるAPI。iOSなどで複数音源の同時再生に重宝する。高精度な再生タイミングが設定できるので、ゲーム系コンテンツにいい」と羽田野氏は説明する。</p>

<p>またこのAPIを使えば楽器のチューナーなど精度が求められるものには向いていないが、各種オーディオエフェクトやアナライザーなども作れるという。ただ「これはまだモテ系の機能。非モテ系の機能もある」と語り、非モテ系の機能の中からPannerNodeを使った立体音響のデモを実施。救急車のピーポー音のドップラー効果の例を再現。「仕事になるかどうかはわからないが」と言うものの、参加者の関心を大いにつかんだようだ。</p>

<p>三番目に紹介したのは「Media Souce Extensions（MSE）」で、「Internet Explorer（IE）11にしか実装されていない」APIです（もしかしたらChromeにも入っているかもしれないが試していないとのこと）。IEではMPEG-DASH（Dynamic Adaptive Streaming over HTTP）という国際標準のメディア・ストリーミングのプロトコルをサポートしている。</p>

<p>同APIの特徴は、HTTPアダプティブストリーミング配信。セグメントに分割されたビデオデータをVideo要素に流し込むだけのAPIで、低ビッドレートのストリーミングに途中で切り替えられるというもの。</p>

<p>「ファイルを取りに行くコードを一つ一つプログラマが書かなければならないなど、気が利かないAPI。プレイヤーを作るのは、プログラマの腕にかかっているので要注意。仕事にはならないAPIだが、チャレンジしたい人はぜひ」と羽田野氏と会場の笑いを誘った。さらにマニアレベル1では「Media Capture and Streams」も紹介。</p>

<p>これはChromeのみに実装されているAPIで、全画面がキャプチャーできるというもの。しかし「Windows上で実行するとOSが引きずられ大変なことになるので、今回はMacで紹介」と、Macでデモを実施。いろんなユースケースが考えられると、羽田野氏がその一例としてあげたのが、デジタルサイネージのリモート監視やヘルプデスク。「ビジネスにも応用できそうな面白いAPI」（羽田野氏）</p>

<h2>縁の下の力持ち系。マニアレベル2のAPI</h2>

<p>マニアレベル2（縁の下の力持ち系。目立たないので話題になっていない）で羽田野氏が取り上げたのは、「Encording」「Web Cryptography API」「DOMMatrix」「Transferable objects」という4つのAPI。「Encording」はブラウザに入っているAPIで、文字コードのデコード、エンコードに使えるAPI。</p>

<p>「Web Cryptography API」はIE11に実装されている、暗号論的擬似乱数列の生成やダイジェストの生成、公開鍵と秘密鍵の生成、デジタル署名の生成と照合、データの暗号化と複合化などの機能を持つAPIである。<br>
「将来、ストレージに溜めたデータを暗号化したいというニーズはきっと出てくる。このAPIは単独で使えるのでそのときの有望株になるのでは」</p>

<p>ただ、暗号化の知識がないと使えないので、ハードルは高いAPIだそう。「DOMMatrix」は行列計算やグラフィックスにおける座標変換のためのAPI。元はCSSMatrixという名称だったとのこと。「Transferable objects」はデータ転送の機能を持つAPI。参加者で知っている人はたった一人というかなりマニアックなAPI。「ファイルサイズの大きい動画のリアルタイム処理などをするときに使うと有効だと思う」</p>

<h2>「使い方がわからない」マニアレベル3のAPI</h2>

<p>マニアレベル3とは、「きっとどこかに必要とする人がいるのだろうでも使い方がわからないというAPI。そこで羽田野氏が紹介したのは、「Clipboard API」と「Base64 utility methods」。</p>

<p>前者の「Clipboard API」はどんなものがペーストされたかが、リアルタイムで情報が取れるAPI。すべてのブラウザで実装していますが、「Web上でやる意味がいまひとつわからない。もちろん使ったこともありません」とのこと。</p>

<p>また「Base64 utility methods」はBase64エンコードとデコードの機能を持つAPI。ただ対応しているのはASCII文字だけで、バイナリーどころか日本語もNGとのこと。「利用シーンはまったく思い浮かばない。マニアの皆さんに考えていただきたい」と羽田野氏は参加者に呼びかけていた。</p>

<h2>「きっといつかはモテ系に…」なマニアレベル4のAPI</h2>

<p>マニアレベル4とは「きっといつかはモテ系APIになるだろう。でも利用できるブラウザが……」というレベルのもの。最初に紹介したのは「Screen Orientation」。これはAndroidやFirefox OSのFirefoxにしか実装されていないAPIで、オリエンテーションを固定できる機能を持っています。ただFullScreen APIを使ってフルスクリーンになっている状態でしか、使えません。「脱アップルストアを目指している人には魅力的なAPIでしょう」</p>

<p>「MediaStream Recoding」はFirefox Aurora（現在は音声のみ）しかサポートしていませんが、録画と録音機能を持つAPI。メディアストリームの記録を開始してから停止するまでの間に蓄積されたメディアデータをBlobオブジェクトとして取り出すことができる。
「Webアプリケーションの可能性を開くことが期待できるAPIだ」</p>

<p>最後に羽田野氏が紹介したのが「Web Animations 1.0」というタイムライン制御フレームワーク。連続処理や並列処理ができ、ビデオ再生のように扱えるというのが特徴だ。ただ「欠点は実装しているブラウザがまだ一つもないこと」と羽田野氏（Githubにて公開されているポリフィルがあるので紹介）。</p>

<p>「Githubではポリフィルが公開されており、私はそれを仕事で使っています。パフォーマンスも悪くない。もっと広まってほしいAPIです」
このようにマニア度の高いAPIを15個ほど駆け足で紹介し、羽田野氏のセッションは終了した。</p>

<p><DIV align=right></p>

<p style="padding-top: 16px; line-height: 1.55; color: #60aa2a;">（レポート：中村仁美／撮影：若狭一正）</p>

<p></div></p>

<p>【講演資料・セッション映像】</p>

<iframe src="http://www.slideshare.net/slideshow/embed_code/28774403" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen> </iframe>

<div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/futomihatano/html5api-28774403" title="ようこそ、HTML5裏APIの世界へ - HTML5 Conference 2013" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ようこそ、HTML5裏APIの世界へ &#8211; HTML5 Conference 2013</a> </strong> from <strong><a href="http://www.slideshare.net/futomihatano" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Futomi Hatano</a></strong> </div>

<iframe width="560" height="315" src="//www.youtube.com/embed/98MKy-0K8bU" frameborder="0" allowfullscreen></iframe>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2013レポート]]></series:name>
	</item>
	</channel>
</rss>
