<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>白石 俊平 &#8211; HTML5Experts.jp</title>
	<atom:link href="/shumpei-shiraishi/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 Paymentsについて、グーグルのえーじさんに聞いてきた！</title>
		<link>/shumpei-shiraishi/24835/</link>
		<pubDate>Thu, 11 Jan 2018 01:00:21 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Payment Request API]]></category>
		<category><![CDATA[Web Payments]]></category>

		<guid isPermaLink="false">/?p=24835</guid>
		<description><![CDATA[連載： HTML5 Conference 2017特集 (16) こんにちは、編集長の白石です。 この記事は、9月24日に開催されたHTML5 Conference 2017に登壇したエキスパートに、お話されたセッション...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2017/" class="series-457" title="HTML5 Conference 2017特集" data-wpel-link="internal">HTML5 Conference 2017特集</a> (16)</div><p><style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style></p>

<p>こんにちは、編集長の白石です。</p>

<p>この記事は、9月24日に開催された<a href="http://events.html5j.org/conference/2017/9/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference 2017</a>に登壇したエキスパートに、お話されたセッションのトピックを中心に、様々なお話を伺おうというものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。</p>

<p>今回お話を伺ったのは、Googleのえーじさんです。</p>

<p><img src="/wp-content/uploads/2017/12/DSC06964.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24920" srcset="/wp-content/uploads/2017/12/DSC06964.jpg 640w, /wp-content/uploads/2017/12/DSC06964-300x200.jpg 300w, /wp-content/uploads/2017/12/DSC06964-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>えーじさんのセッションは「<a href="http://events.html5j.org/conference/2017/9/session/#b5" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ウェブのための次世代決済法</a>」でした。</p>

<p>スライド資料は<a href="https://docs.google.com/presentation/d/e/2PACX-1vS6TvUO3iMcepLt4EtvaQhwhqzWrlvghHiTpUvzbgM-T4pd4oYCJ3c1FSAe9MPN1EgmoiMpPthJqghQ/pub" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちら</a>で公開されています。</p>

<div class='embed-container embed-responsive embed-responsive-4by3'>
<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vS6TvUO3iMcepLt4EtvaQhwhqzWrlvghHiTpUvzbgM-T4pd4oYCJ3c1FSAe9MPN1EgmoiMpPthJqghQ/embed" frameborder="0" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
</div>

<p><br></p>

<h2>Web Paymentsは（モバイル）Webの決済体験を変える</h2>

<p><b class="speaker siraisi">白石:</b> 本日は、Web Paymentsについてお聞かせください。
Web Paymentsというのは、その名の通りWeb上での支払い体験を改善するものだと思いますが、そもそもなぜWeb Paymentsが重要なのでしょうか？</p>

<p><b class="speaker kitamura">えーじ:</b> それについては面白いデータがあります。</p>

<p>モバイルデバイス上で買い物が行われるのはもう一般的ですが、<strong>その3分の2はアプリじゃなくて（モバイル）Webサイトで行われている</strong>んですよ。</p>

<p><b class="speaker siraisi">白石:</b> へえ！スマートフォンだと、Webよりもアプリのほうが長い時間使われていそうですが、意外です。</p>

<p><b class="speaker kitamura">えーじ:</b> それだけじゃありません。今度はデスクトップWebとモバイルWebで支払いのコンバージョン率を比較すると、デスクトップのほうが2倍も高いんです。</p>

<p>これはつまり、<strong>モバイルWebサイトにユーザーはたくさんアクセスしているけど、買い物はデスクトップのほうがしやすい</strong>ということです。</p>

<p><img src="/wp-content/uploads/2017/12/DSC06975.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24923" srcset="/wp-content/uploads/2017/12/DSC06975.jpg 640w, /wp-content/uploads/2017/12/DSC06975-300x200.jpg 300w, /wp-content/uploads/2017/12/DSC06975-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> 逆に言えば、モバイルWebサイトだと決済がしにくいってことですね。</p>

<p><b class="speaker kitamura">えーじ:</b> そうです。Amazonとか日頃から自分が使っているサイトであれば、クレジットカードの決済情報をあらかじめサービスが記憶しているので、決済はしやすい。</p>

<p>しかし、初めて訪れるサイトで買い物するとなると大変です。
クレジットカード番号や期限、3桁のセキュリティコードまで入力しなくてはならない。さらに、配送が必要な商品となると住所まで入力する必要が出てくる。</p>

<p>これだとめんどくさくて、途中で諦めてしまいますよね。個人的にも、モバイルで見つけた商品はとりあえずブックマークしておいて、デスクトップで決済するようなこともよくあります。</p>

<p><b class="speaker siraisi">白石:</b> 確かに。ではWeb Paymentsは、そういう決済に関する体験を改善するものだということですね。</p>

<p><b class="speaker kitamura">えーじ:</b> とりあえずはそうです。ただ、Web Paymentsが目指す世界はさらに先なんですよ。</p>

<h2>クレジットカードは近い将来使われなくなるかもしれない</h2>

<p><b class="speaker siraisi">白石:</b> というのは？</p>

<p><b class="speaker kitamura">えーじ:</b> そもそも、<strong>クレジットカードっていうシステムそのものが非常に脆弱</strong>なんですよね。プラスチックのカードそのものに、すべての情報が記載されているわけですよ。情報を盗むのも簡単だし、紛失したらおおごとです。</p>

<p><b class="speaker siraisi">白石:</b> 確かに…。</p>

<p><b class="speaker kitamura">えーじ:</b> そこで最近は、Apple PayやAndroid Payなど、スマートフォンにクレジットカード情報を搭載しようという動きが出てきました。</p>

<p>スマートフォンの端末には、指紋認証や顔認証を含めた認証機能があり、情報は端末内で安全に格納されるので、コピーができません。決済を行うには、端末が物理的に手元にある必要がある。しかも保存される番号も、クレジットカード番号そのものではなく、トークンと呼ばれる仮の番号です。仮に盗まれたとしてもリモートで無効化できるし、再発行の必要もないわけです。</p>

<p>このように、クレジットカードに比べてメリットが非常に大きいんです。<strong>近い将来物理的なクレジットカードは使われなくなる</strong>と予想している人もいます。</p>

<p><img src="/wp-content/uploads/2017/12/DSC07003.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24924" srcset="/wp-content/uploads/2017/12/DSC07003.jpg 640w, /wp-content/uploads/2017/12/DSC07003-300x200.jpg 300w, /wp-content/uploads/2017/12/DSC07003-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> なるほど、ぼくはまだApple Payなどを使ったことがないんですが、そんなにメリットのある仕組みだったんですね。知りませんでした。</p>

<p><b class="speaker kitamura">えーじ:</b> 決済方法の進化は、これだけにとどまりません。仮想通貨や銀行間送金など、新しい支払い方法も次々に登場していて、「お金を右から左に移動する」ような取引のすべてで革新が起きようとしています。</p>

<p>Web Paymentsはこうした状況において、様々なプレイヤーをつなぐ「接着剤」のような働きになりつつある仕様なんです。</p>

<p>言ってみれば、<strong>新しいペイメントエコシステムを構築する上で欠かせないピースになる</strong>と考えています。</p>

<p><b class="speaker siraisi">白石:</b> 現在の決済システムが抱える問題点を解決しようとする、壮大な話なわけですね。聞いていてワクワクします。</p>

<p><b class="speaker kitamura">えーじ:</b> なので、Web Paymentsはすごくたくさんの仕様から成り立っています。そのうち、現在でも実装が広く進んでいて、Web技術者が簡単に試せるのは<a href="https://www.w3.org/TR/payment-request/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Payment Request API</a>です。</p>

<p><img src="/wp-content/uploads/2018/01/payments-specs-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-25131" srcset="/wp-content/uploads/2018/01/payments-specs.png 640w, /wp-content/uploads/2018/01/payments-specs-300x169.png 300w, /wp-content/uploads/2018/01/payments-specs-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>Payment Request APIとは</h2>

<p><b class="speaker siraisi">白石:</b> Payment Request APIとはなんですか？</p>

<p><b class="speaker kitamura">えーじ:</b> これが、最初に申し上げたWeb上の決済を手軽に行えるようにする仕組みです。</p>

<p>単純に言えば、クレジットカードや住所など、決済に必要な情報の入力をユーザーが簡単に行えるようになります。<strong>決済情報はブラウザが記憶してくれていて、ユーザーは事前に入力してある値から選ぶだけで、Webサイトに情報を渡すことができます</strong>。</p>

<p>基本的なコードは簡単で、以下のように<code>PaymentRequest</code>のインスタンスを作って<code>show()</code>メソッドを呼び出すだけで、支払い情報を選択できるUIをブラウザが表示します。</p>

<p></p><pre class="crayon-plain-tag">var request = new PaymentRequest(methods, details, options);

request.show().then(response =&gt; {
  // 支払い処理を行う
  // PSP（決済代行業者）に送るなどして決済を完了
  response.complete('success');
});</pre><p></p>

<p><img src="/wp-content/uploads/2018/01/payment-dialog-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-25127" srcset="/wp-content/uploads/2018/01/payment-dialog.png 640w, /wp-content/uploads/2018/01/payment-dialog-300x169.png 300w, /wp-content/uploads/2018/01/payment-dialog-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>ここで、ダイアログの中ほどに「Android Pay」や「Visa」など、支払い方法を選択できる項目があります。これは、<code>PaymentRequest</code>のコンストラクタの第一引数として、支払方法の情報を渡すことで指定できます。</p>

<p><img src="/wp-content/uploads/2018/01/payment-methods-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-25128" srcset="/wp-content/uploads/2018/01/payment-methods.png 640w, /wp-content/uploads/2018/01/payment-methods-300x169.png 300w, /wp-content/uploads/2018/01/payment-methods-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>また、ダイアログに表示される情報は、<code>PaymentRequest</code>のコンストラクタの第二引数で指定することができます。購入商品の情報を渡すだけでなく、配送オプションを指定することも可能です。</p>

<p><img src="/wp-content/uploads/2018/01/payment-details-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-25126" srcset="/wp-content/uploads/2018/01/payment-details.png 640w, /wp-content/uploads/2018/01/payment-details-300x169.png 300w, /wp-content/uploads/2018/01/payment-details-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>コンストラクタの最後の引数は支払いに関するオプションです。配送先住所を必要とするかや名前、メールアドレス、電話番号の情報を要求するかどうかなどを指定できます。</p>

<p><img src="/wp-content/uploads/2018/01/payment-options-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-25129" srcset="/wp-content/uploads/2018/01/payment-options.png 640w, /wp-content/uploads/2018/01/payment-options-300x169.png 300w, /wp-content/uploads/2018/01/payment-options-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>これらを指定して表示されたダイアログ上でユーザーが入力を終えると、プログラムにユーザーが入力した情報が渡ってきます。
プログラムはこれらの情報をサーバーに送信するなどして、決済を完了するわけですね。</p>

<p><img src="/wp-content/uploads/2018/01/payment-response-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-25130" srcset="/wp-content/uploads/2018/01/payment-response.png 640w, /wp-content/uploads/2018/01/payment-response-300x169.png 300w, /wp-content/uploads/2018/01/payment-response-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> なるほど、Payment Request APIそのものは、使うのは全然難しくなさそうですね。先ほど、実装が進んでいると仰ってましたが、現在どのブラウザで利用できるんでしょうか？</p>

<p><b class="speaker kitamura">えーじ:</b> Chromeは、iOSを含む全プラットフォームで利用できます。他にもChromiumをベースに開発されているSamsung Internet BrowserやMicrosoft Edgeでも利用できます。Firefoxでは開発中ですね。あと、Safari上では<a href="https://developer.apple.com/documentation/applepayjs" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Apple Pay JS</a>という、Apple Payを利用するためのAPIが存在するのですが、<a href="https://github.com/GoogleChromeLabs/appr-wrapper" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">それをPayment Request APIでラップしたライブラリ</a>も存在します。嬉しいニュースとしては、<strong>Safariも現在Payment Request APIを実装中</strong>ということです。</p>

<p><b class="speaker siraisi">白石:</b> おお、もうかなりのブラウザ上で動作するんですね。</p>

<p><b class="speaker kitamura">えーじ:</b> あと、Payment Request APIがどういう動作をするかを試してみたかったら、<a href="https://polykart.store/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">polykart.store</a>というデモサイトがあるのでアクセスしてみてください。商品を選んで「BUY NOW」を選択すれば、Payment Request APIを使用した支払い用ダイアログが表示されます。もちろん、実際に決済が行われるわけではありませんのでご安心ください。</p>

<p><img src="/wp-content/uploads/2017/12/polycart-640x490.png" alt="" width="640" height="490" class="aligncenter size-large wp-image-24844" srcset="/wp-content/uploads/2017/12/polycart.png 640w, /wp-content/uploads/2017/12/polycart-300x230.png 300w, /wp-content/uploads/2017/12/polycart-207x158.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>Web Paymentsが目指す世界——新しいペイメントエコシステム</h2>

<p><b class="speaker siraisi">白石:</b> しかし先ほどのコードでちょっと気になったのは、結局クレジットカード番号とかをプログラムが直接受け取るという点です。
セキュリティコードも含め、決済に必要な情報を全部Webサイトに渡してしまうのは何か怖いというか。まあ、現在でも一般的に行われていることではあるんですが。</p>

<p><b class="speaker kitamura">えーじ:</b> <code>PaymentRequest</code>に渡すペイメントメソッドに&#8217;basic-card&#8217;を指定した場合、クレジットカードの情報を生で受け取るように動作するんですよね。</p>

<p>&#8216;basic-card&#8217;の仕組みはわかりやすく、どんな決済代行業者でも扱えるという点ではいいのですが、おっしゃるとおりセキュリティ面での懸念があります。<strong>ペイメントの未来はそこにはありません</strong>。</p>

<p>そこで登場するのが、生のクレジットカード情報ではなく、使い捨てのトークンを利用するという方法、つまり先程お話したApple PayやAndroid Payで利用できるトークンのことです。こちらの方法なら安全性も高まりますし、ECサイト側も、クレジットカード情報に触れる必要がないので助かるんです（※）。</p>

<p><img src="/wp-content/uploads/2018/01/tokenization-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-25132" srcset="/wp-content/uploads/2018/01/tokenization.png 640w, /wp-content/uploads/2018/01/tokenization-300x169.png 300w, /wp-content/uploads/2018/01/tokenization-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>※ ECサイト側も助かる…経済産業省が取りまとめた<a href="http://www.meti.go.jp/press/2016/03/20170308003/20170308003.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">クレジットカード取引におけるセキュリティ対策の強化に向けた実行計画2017</a>により、ECサイトはクレジットカード情報の非保持化、もしくはカード情報を扱う場合はPCI DSS（※）に対応しなくてはならない。</p>

<p>※ PCI DSS（Payment Card Industry Data Security Standard）…カード会員情報の保護を目的として、国際ペイメントブランド5社（アメリカンエキスプレス、Discover、JCB、マスターカード、VISA）が共同で策定したカード情報セキュリティの国際統一基準</p>

<p><b class="speaker siraisi">白石:</b> これは素晴らしい。ぼくらWeb技術者がこの仕組みを利用するとしたら、どうしたらいいんですか？</p>

<p><b class="speaker kitamura">えーじ:</b> <code>PaymentRequest</code>に渡すペイメントメソッドには、URLを渡すというもう一つの方法があるんです。こちらの方法を用いると、支払いを行うにあたって、外部のペイメントアプリケーションを呼び出すことができます。</p>

<p><img src="/wp-content/uploads/2017/12/DSC07043.jpg" alt="" width="640" height="414" class="alignnone size-full wp-image-24925" srcset="/wp-content/uploads/2017/12/DSC07043.jpg 640w, /wp-content/uploads/2017/12/DSC07043-300x194.jpg 300w, /wp-content/uploads/2017/12/DSC07043-207x134.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> 先ほどのコード例でも、<code>https://android.com/pay</code>というURLを渡して、Android Payが表示されていましたね。</p>

<p><img src="/wp-content/uploads/2017/12/payment-methods-640x361.png" alt="" width="640" height="361" class="aligncenter size-large wp-image-24839" srcset="/wp-content/uploads/2017/12/payment-methods.png 640w, /wp-content/uploads/2017/12/payment-methods-300x169.png 300w, /wp-content/uploads/2017/12/payment-methods-207x117.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker kitamura">えーじ:</b> こちらの方法を用いると、トークン化の処理を含め、複雑な処理は全て裏で行われ、Webアプリは戻ってきたトークンを使って決済処理を完了させるだけで済みます。</p>

<p><b class="speaker siraisi">白石:</b> セッションスライドの、ペイメントアプリを通じてトークンをやり取りする図を見て、複雑なので怖気づいてたところでした(笑)。</p>

<p><img src="/wp-content/uploads/2018/01/payment-association-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-25125" srcset="/wp-content/uploads/2018/01/payment-association.png 640w, /wp-content/uploads/2018/01/payment-association-300x169.png 300w, /wp-content/uploads/2018/01/payment-association-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker kitamura">えーじ:</b> この図の、企業間の提携などについては企業間で行われることですし、Web技術者の手をわずらわせることはありませんのでご安心ください。</p>

<p>ちなみに、ペイメントアプリケーションは技術的には誰でも作ることができます。なので、クレジットカードに限らない支払い方法、例えば仮想通貨やキャリア決済なども将来的にはPayment Request APIから扱えるようになるというわけです。</p>

<p>ペイメントアプリケーションを指定するのには、先ほども申し上げたようにURLを使用するので、基本的にはWebアプリです。ですが、Web Manifestの仕組みに対応していれば、ネイティブのAndroidアプリを呼び出すことも可能です。</p>

<p><a href="https://bobpay.xyz/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">BobPay</a>という、ネイティブ、Webどちらにも対応したペイメントアプリのサンプルがありますので、よければ試してみてください。Web版はAndroid版Chrome Dev、ネイティブ版はChrome 60以降がインストールされたAndroidであれば試すことができます。</p>

<p><img src="https://bobpay.xyz/img/bobpay_android.png" alt="" /></p>

<p><b class="speaker siraisi">白石:</b> 支払い方法はよりセキュアに、多様化するということですね。そのために、業界全体が変化しようとしている。まさに新しいペイメントエコシステムですね。</p>

<p>本日は、大変勉強になるお話をありがとうございました！</p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2017特集]]></series:name>
	</item>
		<item>
		<title>AMPの気になること全部、Googleの山口さんに聞いてきました！</title>
		<link>/shumpei-shiraishi/24795/</link>
		<pubDate>Wed, 10 Jan 2018 01:00:36 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[AMP]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">/?p=24795</guid>
		<description><![CDATA[連載： HTML5 Conference 2017特集 (15)こんにちは、編集長の白石です。 この記事は、9月24日に開催されたHTML5 Conference 2017に登壇したエキスパートに、お話されたセッションの...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2017/" class="series-457" title="HTML5 Conference 2017特集" data-wpel-link="internal">HTML5 Conference 2017特集</a> (15)</div><p>こんにちは、編集長の白石です。</p>

<p>この記事は、9月24日に開催された<a href="http://events.html5j.org/conference/2017/9/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference 2017</a>に登壇したエキスパートに、お話されたセッションのトピックを中心に、様々なお話を伺おうというものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。</p>

<p>今回お話を伺ったのは、Googleの山口能迪（やまぐち・よしふみ）さんです。</p>

<p><img src="/wp-content/uploads/2017/12/42A4653.jpg" alt="" width="640" height="403" class="alignnone size-full wp-image-24929" srcset="/wp-content/uploads/2017/12/42A4653.jpg 640w, /wp-content/uploads/2017/12/42A4653-300x189.jpg 300w, /wp-content/uploads/2017/12/42A4653-207x130.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>山口さんのセッションは「<a href="http://events.html5j.org/conference/2017/9/session/#c3" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AMPで加速するモバイルウェブアプリケーション</a>」でした。</p>

<p>スライド資料はこちらで公開されています。</p>

<p><a href="https://docs.google.com/presentation/d/1ZYyHFRMZnD6bfi6fl9yh9G_TIs3roSxvp-Goa1JZv_c/htmlpresent" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">https://docs.google.com/presentation/d/1ZYyHFRMZnD6bfi6fl9yh9G_TIs3roSxvp-Goa1JZv_c/htmlpresent</a></p>

<h2>AMPとは何か？なぜ必要とされたか？</h2>

<p><b class="speaker siraisi">白石:</b> 今日はよろしくお願いします。まずは簡単に自己紹介をお願いできますか？</p>

<p><b class="speaker yamaguchi">山口:</b> Googleでパートナー・デベロッパー・リレーションを担当している山口です。私の役目は特定の技術にとらわれず、最新の技術を広めていき、採用事例を増やすことです。</p>

<p><b class="speaker siraisi">白石:</b> 最新技術って、Googleさんすごい数出すから大変ですね(笑)。</p>

<p><b class="speaker yamaguchi">山口:</b> そうなんですよ(笑)。</p>

<p><b class="speaker siraisi">白石:</b> では、早速本題に入っていきたいと思います。AMPについてご存じない方のために、軽く説明をお願いできますでしょうか？</p>

<p><b class="speaker yamaguchi">山口:</b> AMPとはAccelerated Mobile Pagesの略で、高速にWebページを表示するための技術です（参考: <a href="https://www.ampproject.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AMPの公式サイト</a>）。</p>

<p>現在のWebは、低速なインターネット上で、モバイルデバイスを用いた利用が非常に多くなっています。特に東南アジア、インドやアフリカ、中国、南米などでその傾向は顕著です。</p>

<p>そういう環境でもWebページをストレスなく閲覧できるよう、Web標準に則った形で、出来る限り高速にWebページを表示できるようにするための技術がAMPです。</p>

<p><b class="speaker siraisi">白石:</b> なぜAMPは速いのですか？</p>

<p><b class="speaker yamaguchi">山口:</b> AMPは速いというよりも、「遅くなる要素を排除している」と言ったほうが正しいと思います。AMPは主に静的で文字中心のコンテンツを配信することを主眼に、HTML5でできることを相当絞り込んだ仕様です。その仕様に則ったHTMLページだけが、妥当なAMP対応ページとして扱われます。</p>

<p>そうした制限のおかげでページサイズも小さくなり、ブラウザによるレンダリングも高速に行われるというわけです。</p>

<p><b class="speaker siraisi">白石:</b> 具体的には、どのような制限がかけられているのでしょうか？</p>

<p><b class="speaker yamaguchi">山口:</b> 例えば、標準のimg要素やvideo要素は使用できず、すべて<code>&lt;amp-img&gt;</code>や<code>&lt;amp-video&gt;</code>と言ったカスタムタグに置き換える必要があります。こうした要素を使うことで、全ての画像や動画が遅延表示され、また、画面に表示されない間はダウンロードされなくなります。</p>

<p>CSSは外部CSSもstyle属性も使用することができません。全てHTML内に<code>&lt;style&gt;</code>を用いてインラインで記述しなくてはなりませんし、そのサイズも50kbに制限されています。</p>

<p>JavaScriptに至っては、独自のコードを記述することはできません。AMPページでは、動的な振る舞いはすべてカスタムタグを使用して実現することになります。</p>

<p></p><pre class="crayon-plain-tag">&lt;!-- AMPページの例 --&gt;
&lt;!doctype html&gt;
&lt;!-- html要素に⚡を付けるとAMP HTMLとして扱われる --&gt;
&lt;html ⚡&gt;
  &lt;head&gt;
    &lt;meta charset="utf-8"&gt;
    &lt;!-- AMP用JSの読み込み --&gt;
    &lt;script async src="https://cdn.ampproject.org/v0.js"&gt;&lt;/script&gt;
    &lt;title&gt;Hello AMP world&lt;/title&gt;
    &lt;!--
      このAMPページの元となる、通常のHTMLページがある場合はcanonicalで指定
      そういうページがない場合はこのページ自体のURLをcanonicalで指定
    --&gt;
    &lt;link rel="canonical" href="hello-world.html"&gt;
    &lt;!-- viewport指定は必須 --&gt;
    &lt;meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"&gt;
    &lt;!-- 以下のCSSは必須 --&gt;
    &lt;style amp-boilerplate&gt;body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}&lt;/style&gt;&lt;noscript&gt;&lt;style amp-boilerplate&gt;body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}&lt;/style&gt;&lt;/noscript&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;Hello AMP World!&lt;/h1&gt;
    &lt;!-- imgの代わりにamp-imgを使用 --&gt;
    &lt;amp-img src=sample.jpg width=300 height=300&gt;&lt;/amp-img&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p><b class="speaker siraisi">白石:</b> カスタムタグにはどのようなものがあるんでしょう？</p>

<p><b class="speaker yamaguchi">山口:</b> 利用できるタグはすべてドキュメントに記載されていますので、そちらをご覧いただくのが一番です（参考: <a href="https://www.ampproject.org/docs/reference/components" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AMPで利用できるコンポーネント/タグ</a>）。</p>

<p>AMPのタグにはビルトイン（組み込み）とエクステンション（拡張）がありまして、エクステンションのタグを利用するには別途JavaScriptの読み込みが必要です。</p>

<p>ビルトインのタグの代表的なものは、先ほど取り上げた、<code>&lt;img&gt;</code>の代わりとなる<code>&lt;amp-img&gt;</code>です。エクステンションは現時点でもかなりの数が用意されていて、Google Analyticsを使用したり、YouTubeやTwitterの埋め込みを行えるタグもあります。</p>

<p><b class="speaker siraisi">白石:</b> そうしたエクステンションは、サードパーティの開発者やベンダーでも開発できるんですか？</p>

<p><b class="speaker yamaguchi">山口:</b> はい、可能です。ただ、AMPで利用できるタグは、AMP本体のリポジトリに取り込まれているものだけなんです。なので、開発したとしてもそれをリポジトリに取り込んでもらう努力が必要になります（参考: <a href="https://github.com/ampproject/amphtml/blob/master/spec/amp-html-components.md#extended-components" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">コンポーネントの開発・拡張についてのドキュメント</a>）。</p>

<p><b class="speaker siraisi">白石:</b> なるほど、そういうプロセスを経なければならないようにすることで、カスタムタグのクオリティを担保しているということですね。そういうレビューはGoogleが行っているんでしょうか？</p>

<p><b class="speaker yamaguchi">山口:</b> AMP自体はオープンソースですし、Google一社のものではありません。リリース前からTwitterやPinterestもコミットしていましたし、オープンソースにしたおかげで、プロセスも透過的です。Google以外のコントリビューターも数多くいますし、そこは一般的な企業発のオープンソースプロダクトとあまり変わりはないと思いますね。</p>

<p><img src="/wp-content/uploads/2017/12/42A4648.jpg" alt="" width="640" height="405" class="alignnone size-full wp-image-24960" srcset="/wp-content/uploads/2017/12/42A4648.jpg 640w, /wp-content/uploads/2017/12/42A4648-300x190.jpg 300w, /wp-content/uploads/2017/12/42A4648-207x131.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>AMPページのアクセス解析は？広告は？</h2>

<p><b class="speaker siraisi">白石:</b> AMPはWeb全体に大きな影響を与えている技術だと思いますので、ビジネス面も含めた、もう少し俯瞰的な部分からもお話をお聞きしたいと思います。</p>

<p>まず、AMPに対応すると、Google Analyticsなどの計測を正しく行えなくなるというのを聞いたことがあるのですが、これはどういうことですか？</p>

<p><b class="speaker yamaguchi">山口:</b> まず、<code>&lt;amp-analytics&gt;</code>タグを入れているAMPページは、Google Analyticsをはじめとしたツールで、統一的に計測を行うことができます。</p>

<p>ただそれでも、AMPキャッシュの仕組みの都合上、様々な不都合が生じていたのは事実です。</p>

<p><b class="speaker siraisi">白石:</b> AMPキャッシュというのはなんですか？</p>

<p><b class="speaker yamaguchi">山口:</b> GoogleのbotはAMPページを見つけると、専用のキャッシュサーバー（Google AMP Cache）にページをキャッシュします。
 Googleは世界中にデータセンターやISP各社に協力していただいているエッジサーバーを持っており、ユーザーにとって物理的に最も近い位置のサーバーからページを読み込みますので、AMPページがより高速に表示されるというわけです。</p>

<p>（筆者注: <a href="https://developers.google.com/amp/cache/reference/acceleratedmobilepageurl/rest/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google AMP CacheはAPIを用いて明示的なキャッシュを行わせることもできる</a>）</p>

<p><b class="speaker siraisi">白石:</b> Googleの検索結果から辿れるページとかは、AMPキャッシュからの応答ですね。</p>

<p><b class="speaker yamaguchi">山口:</b> ただ、AMPキャッシュの問題は、元サイトとは異なるドメインからページが読み込まれるということです。そうなるとCookieが異なるので、Google Analyticsなどで正しく計測が行えないのです。</p>

<p>（筆者注: 例えば 当サイト（）のAMPページは「.cdn.ampproject.org」から読み込まれました）</p>

<p>ただこの問題は、今ではほぼ解決されています。具体的には、Cookieの欠点を補うためのクライアントIDという値を用いることで、AMPキャッシュから配信されたページへのアクセスと、オリジナルサイトへのアクセスを統一して扱えるようになっています。</p>

<p><small>
筆者注: こうした問題とそのソリューションについては、以下のページに詳しい。</p>

<ul>
<li><a href="https://www.suzukikenichi.com/blog/amp-analytics-is-unreliable/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AMPページの直帰率の高さやユニークユーザー数は全部ウソ!? AMPアクセス解析には潜在的な問題あり &#8211; 海外SEO情報ブログ</a><br></li>
<li><a href="https://www.suzukikenichi.com/blog/google-analytics-fixes-inaccurate-amp-report/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">⚡AMPの不正確なアクセス解析をGoogleアナリティクスが解消 &#8211; 海外SEO情報ブログ</a><br></li>
<li><a href="https://www.suzukikenichi.com/blog/google-analytics-lets-you-opt-in-amp-client-id-api/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Google アナリティクス、AMPキャッシュ計測の問題を解決。AMP Client ID APIのオプトインで正確なアクセス解析が可能に &#8211; 海外SEO情報ブログ</a></li>
<li><a href="https://developers.google.com/analytics/devguides/collection/amp-analytics/client-id?hl=en" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Client IDs in AMP pages &#8211; Googleアナリティクスヘルプ</a>（<a href="https://developers.google.com/analytics/devguides/collection/amp-analytics/client-id?hl=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">日本語ページ</a>もあるのですが内容が古く、「Using a single Client ID across AMP and non-AMP pages」（AMPと非AMPページで同一のクライアントIDを使用する）という重要な節が抜けているようです）
</small></li>
</ul>

<p><b class="speaker siraisi">白石:</b> なるほど、アクセス解析の問題については、ほぼ解決済みなのですね。知りませんでした。</p>

<p>ほかには、AMPに対応することでパブリッシャーの広告収益に影響が出るのではないかという話を聞きましたが、これについてはいかがでしょうか？特に、AMPページに比べて広告の表示速度が遅いことで、広告が表示される前にユーザーが離脱してしまうのではないかと聞いています。</p>

<p><b class="speaker yamaguchi">山口:</b> 実はAMPは、広告の高速化についても「<a href="https://www.ampproject.org/learn/who-uses-amp/amp-ads/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AMP Ads</a>」（筆者注: 「AMP for Ads (A4A)」とも呼ばれる）という取り組みを既に進めているんです。</p>

<p>これは、広告コンテンツについてもAMPフォーマットで記述するというもので、従来よりも素早く表示されるだけでなく、AMPページ以外でも利用できますし、様々な広告ネットワーク上でも利用できる柔軟性があります。</p>

<p><small>
参考:
<a href="https://developers-jp.googleblog.com/2017/09/even-faster-loading-ads-in-amp.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AMP Ads の読み込みがさらに高速化 &#8211; Google Developers Japan Blog</a>
<a href="https://github.com/ampproject/amphtml/blob/master/ads/google/a4a/docs/a4a-readme.md" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AMP Ads &#8211; GitHub (英語)</a>
</small></p>

<p><b class="speaker siraisi">白石:</b> そんな取り組みがされてたんですねー、全然知りませんでした。</p>

<p><img src="/wp-content/uploads/2017/12/42A4640.jpg" alt="" width="640" height="413" class="alignnone size-full wp-image-24961" srcset="/wp-content/uploads/2017/12/42A4640.jpg 640w, /wp-content/uploads/2017/12/42A4640-300x194.jpg 300w, /wp-content/uploads/2017/12/42A4640-207x134.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>AMPとPWAを組み合わせる</h2>

<p><b class="speaker siraisi">白石:</b> 最後に、技術者向けに深いトピックをいろいろお聞かせください。</p>

<p>AMPとPWA (Progressive Web Apps)を共存させる、という話を聞きます（※）が、具体的にはどのように組み合わせることができるのでしょうか？</p>

<p><small>
※ <a href="https://www.ampproject.org/docs/guides/pwa-amp" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Combine AMP with Progressive Web Apps</a>
</small></p>

<p><b class="speaker yamaguchi">山口:</b> AMPは、言ってみればWebプラットフォーム上のフレームワークの1つに過ぎません。なので、例えば<a href="https://developers.google.com/web/fundamentals/web-app-manifest/?hl=ja" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Webアプリマニフェスト</a>を書いておいて、AMPページからリンクすれば、モバイルアプリにWebアプリをインストールさせることも可能です。AMPだからと言って、特別なことは何もありません。</p>

<p><b class="speaker siraisi">白石:</b> なるほど。</p>

<p><b class="speaker yamaguchi">山口:</b> PWAと言うのはマーケティングワードという側面も強いので、「何を持ってPWAと呼ぶか」も難しいところではありますけどね。</p>

<p>AMPには<code>&lt;amp-serviceworker&gt;</code>というタグもあって、AMPページを起点にして<code>ServiceWorker</code>をインストールさせることもできます。</p>

<p>これを応用すれば、まずはAMPページを高速に表示させておいて、裏でPWAに必要なアセットをServiceWorkerを利用してキャッシュしておき、リンクをクリックしたらPWAが高速に起動する…というアプローチも取ることができます。</p>

<p><b class="speaker siraisi">白石:</b> AMPとPWAのいいところ取りができるというわけですね。面白い。</p>

<p>あと、「PWAの中でAMPを使う」というアプローチも聞きました。外部のページをAMPで読み込むと言ったような。</p>

<p><b class="speaker yamaguchi">山口:</b> それも可能ですね。AMPをiframeで開くというのが一つのパターンですが、更にもう一歩進んだアプローチとしては、外部のAMPページを読み込んで、Shadow DOMに突っ込んじゃうっていうパターンもあります。</p>

<p><b class="speaker siraisi">白石:</b> それってどういうメリットがあるんですか？</p>

<p><b class="speaker yamaguchi">山口:</b> これも高速化のテクニックの一つですね。iframeだと、AMP JSの読み込みがiframeごとに走るので無駄が多いんです。Shadow DOMに埋め込むのであれば、既に元ページでAMP JSが読み込まれていればいいので、それぞれのページで読み込む必要がありません。</p>

<p><b class="speaker siraisi">白石:</b> なるほど、面白い！</p>

<p><b class="speaker yamaguchi">山口:</b> これはAMPに限った話ではないのですが、従来iframeを使って読み込んでいたコンテンツを、Shadow DOMに埋め込むというテクニックは、広告とかにも応用可能です。広告が元ページに悪影響を及ぼさないようにカプセル化する役割を、Shadow DOMに任せるわけですね。</p>

<p><b class="speaker siraisi">白石:</b> いやあ、最新のWeb技術てんこ盛りで、Webエンジニアとして大変興味深いお話です。AMPそのものも、そしてAMPを支える技術も、最新技術の塊ですね。本日は大変勉強になりました、ありがとうございました！</p>

<p><DIV align=right>（撮影：刑部友康 写真提供：html5j HTML5 Conference 2017事務局）</div></p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2017特集]]></series:name>
	</item>
		<item>
		<title>Web標準化という仕事、そしてWebの今後について、W3Cの中の人に聞いてきた</title>
		<link>/shumpei-shiraishi/24736/</link>
		<pubDate>Fri, 22 Dec 2017 05:59:01 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[Web標準化]]></category>

		<guid isPermaLink="false">/?p=24736</guid>
		<description><![CDATA[Webの現状をどう見る？ 白石: 今日は取材お受けいただきありがとうございます。簡単に自己紹介からお願いします。 芦村: W3C/Keioで働いている芦村です。Webの標準化を仕事にしていまして、アクセシビリティやコンピ...]]></description>
				<content:encoded><![CDATA[<h2>Webの現状をどう見る？</h2>

<p><b class="speaker siraisi"><b class="speaker siraisi">白石:</b></b> 今日は取材お受けいただきありがとうございます。簡単に自己紹介からお願いします。</p>

<p><b class="speaker asimura">芦村:</b> W3C/Keioで働いている芦村です。Webの標準化を仕事にしていまして、アクセシビリティやコンピューターを使いやすくすることに興味を持って取り組んでいます。</p>

<p><b class="speaker siraisi">白石:</b> W3Cの方に直接お話を伺う機会なんてそうはないので楽しみにしてきました。芦村さんから見て、今のWebの現状はいかがですか？</p>

<p><b class="speaker asimura">芦村:</b> HTML5のムーブメントを経て、<strong>アプリケーションやシステム構築のための共通プラットフォームになってきました</strong>。
WebDINO Japan（元Mozilla Japan）の浅井智也さんが作った「Web曼荼羅」という図ですが、凄まじい数の仕様が、様々な団体をまたがって策定されているのがおわかりかと思います。</p>

<p><img src="/wp-content/uploads/2017/11/mandara-640x360.jpg" alt="" width="640" height="360" class="aligncenter size-large wp-image-24738" srcset="/wp-content/uploads/2017/11/mandara.jpg 640w, /wp-content/uploads/2017/11/mandara-300x169.jpg 300w, /wp-content/uploads/2017/11/mandara-207x116.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>とはいえ、まだまだ道半ばではあります。プラットフォームであるからには、便利で安定していなくてはなりません。
そのためにはプラットフォームとしての機能をより高めていくだけでなく、既存の仕様に対するテストももっと充実させていかなくてはなりません。</p>

<p><b class="speaker siraisi">白石:</b> まだ成長中のプラットフォームであると。</p>

<p><b class="speaker asimura">芦村:</b> はい、そして更に、<strong>人にフォーカスしなくてはなりません</strong>。</p>

<p>開発者にとって、開発が楽なプラットフォームかどうか？Google ChromeやFirefoxには開発者ツールが付属していますが、ああいったツールを含め、開発全体の環境を良くしていく必要があります。</p>

<p>また、開発者の教育も重要です。特に若い人に対して、Webの知識を広めていかなくてはなりません。
そういう意味では、W3Cの日本における事務局が慶応大学にあるのはいいことだと思います。学生との接点を持ちやすいですし。</p>

<p><b class="speaker siraisi">白石:</b> Webのユニークなところは、数多くの企業が協同で標準化に努めているアプリケーションプラットフォームだと言うところだと思います。
しかもその企業の中には、グーグル、アップル、マイクロソフトと言った巨大なベンダーが含まれている。</p>

<p><b class="speaker asimura">芦村:</b> 現在、400社くらいの企業がW3Cに協賛してくださっています。標準化における主役はそうした会員企業の皆様で、私たちはそのサポート役です。
私は時々「ホテルのコンシェルジュみたいな仕事だ」と言ったりしますけどね(笑)。</p>

<p><b class="speaker siraisi">白石:</b> そうした企業を繋いでいく標準化のお仕事というのは、具体的にはどのようなものなのでしょうか？</p>

<p><b class="speaker asimura">芦村:</b> 標準化の作業は、結局のところ「仕様書をみんなで作っていく」ということに尽きます。</p>

<p>仕様書は<a href="https://www.w3.org/2017/Process-20170301/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">W3C Process Document</a>という文書に書かれたルールに則り、ワーキングドラフトという状態から始まって、最終的な「勧告」という状態を目指して作業が行われます。</p>

<p>仕様書を策定するのはワーキンググループの役割で、その間のコミュニケーションを円滑にするのが私たちの重要な仕事の一つです。
電話会議を実施して議事録を取ったり、メーリングリストやGitHubで行われる議論をウォッチしたり。ちなみに私の電話会議のスケジュールはこんな感じです。</p>

<p><img src="/wp-content/uploads/2017/11/sched-640x360.jpg" alt="" width="640" height="360" class="aligncenter size-large wp-image-24740" srcset="/wp-content/uploads/2017/11/sched.jpg 640w, /wp-content/uploads/2017/11/sched-300x169.jpg 300w, /wp-content/uploads/2017/11/sched-207x116.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> うわぁ…夜8時以降がギッシリ。海外との電話会議だから時差があって大変ですね。</p>

<p><b class="speaker asimura">芦村:</b> そうなんです(笑)。</p>

<p><b class="speaker siraisi">白石:</b> 様々な仕様が同時並行で標準化されていくのを、横断してサポートする感じなんですね。お仕事の雰囲気がなんとなくつかめました。</p>

<h2>Webとテレビ…メディアプラットフォームとしてのHTML5の現状</h2>

<p><b class="speaker siraisi">白石:</b> 今は、どういった分野の標準化を強く推進しているのでしょうか？</p>

<p><b class="speaker asimura">芦村:</b> テレビ、IoT、自動車と言った産業分野での応用に力を入れています。</p>

<p>まずテレビの分野では、今までの一方向のブロードキャストを超えて、インタラクティブなテレビ放送の実現が望まれています。
日本では、NHKさんが主導してハイブリッドキャストの標準化などを進めていらっしゃいますね。</p>

<p>HTML5を（動画の）メディアプラットフォームとして使って頂くためには、標準の<code>video</code>要素に不足している機能がいくつかあります。例えばストリーミング配信だったり、コンテンツ保護の機能だったりですね。</p>

<p>それらを補うために、<a href="https://www.w3.org/TR/media-source/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Media Source Extensions</a> (MSE)や<a href="https://www.w3.org/TR/encrypted-media/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Encrypted Media Extensions</a> (EME) といった仕様も既にありますし、字幕などを実現するためのフォーマットである<a href="https://www.w3.org/TR/ttml1/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TTML</a>や<a href="https://www.w3.org/TR/webvtt1/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebVTT</a>、セカンドスクリーン制御用の<a href="https://www.w3.org/TR/presentation-api/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Presentation API</a>などもあります。</p>

<p><img src="/wp-content/uploads/2017/11/media-specs-640x360.jpg" alt="" width="640" height="360" class="aligncenter size-large wp-image-24739" srcset="/wp-content/uploads/2017/11/media-specs.jpg 640w, /wp-content/uploads/2017/11/media-specs-300x169.jpg 300w, /wp-content/uploads/2017/11/media-specs-207x116.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> メディア配信のための機能はかなり充実していると言えそうですね。</p>

<h2>今後のクルマはWebSocketサーバーに？</h2>

<p><b class="speaker asimura">芦村:</b> Webとクルマについても、最近活発に議論されています。</p>

<p>近年「コネクテッド・カー」というコンセプトで、インターネットに常時接続する自動車が開発されています。そうした中、Webの自動車における利用も具体的に検討されています。</p>

<p><b class="speaker siraisi">白石:</b> カーナビとかで使われる、センタースクリーンのUIがWebブラウザになる、って感じでしょうか？</p>

<p><b class="speaker asimura">芦村:</b> それは一つのユースケースですね。ほかにも、クラウドにデータをアップロードする「Webクライアント」としての利用や、自動車固有のデータを扱うためのJavaScript APIなども整備されています。</p>

<p><img src="/wp-content/uploads/2017/11/connected-car-640x360.jpg" alt="" width="640" height="360" class="aligncenter size-large wp-image-24737" srcset="/wp-content/uploads/2017/11/connected-car.jpg 640w, /wp-content/uploads/2017/11/connected-car-300x169.jpg 300w, /wp-content/uploads/2017/11/connected-car-207x116.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker asimura">芦村:</b> で、実際の車載システムとのコミュニケーションは、WebSocketを利用する仕様が提案されています。Vehicle Signal Architectureの図を見ると全体像が把握できるかと思います。</p>

<p><img src="/wp-content/uploads/2017/11/vehicle-signal-architecture-640x360.jpg" alt="" width="640" height="360" class="aligncenter size-large wp-image-24742" srcset="/wp-content/uploads/2017/11/vehicle-signal-architecture.jpg 640w, /wp-content/uploads/2017/11/vehicle-signal-architecture-300x169.jpg 300w, /wp-content/uploads/2017/11/vehicle-signal-architecture-207x116.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> WebSocketで車とコミュニケートできるんですか、なんか胸熱ですね…！</p>

<p><b class="speaker asimura">芦村:</b> 自動車技術とWeb技術の融合に関心のある方は、<a href="https://rp.kddi-research.jp/hackathon" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Webとクルマのハッカソン</a>というイベントもあるので、申し込んでいただくといいかと思います。</p>

<h2>「つながなきゃもったいない」…Web of Things (WoT)の狙い</h2>

<p><b class="speaker asimura">芦村:</b> IoT分野に対しては、Web of Things (WoT) という取り組みを通じて、IoT機器やプラットフォーム間の相互接続を促進しようとしています。</p>

<p><b class="speaker siraisi">白石:</b> しかし、IoTデバイスって、Webブラウザを搭載するには非力なものも多そうだし、そもそもスクリーンを持たないデバイスも沢山ありますよね。そこでWebが果たせる役割とは何なのでしょうか？</p>

<p><b class="speaker asimura">芦村:</b> 確かに「Webブラウザ」という観点からでは、仰る通りです。ただ、ここで言っているWebとはもっと広い意味、「インターネット上の情報空間」という性格のWebを差しています。</p>

<p><img src="/wp-content/uploads/2017/11/web-and-internet-640x360.jpg" alt="" width="640" height="360" class="aligncenter size-large wp-image-24743" srcset="/wp-content/uploads/2017/11/web-and-internet.jpg 640w, /wp-content/uploads/2017/11/web-and-internet-300x169.jpg 300w, /wp-content/uploads/2017/11/web-and-internet-207x116.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker asimura">芦村:</b> いろんなものがインターネットに繋がって、集められたデータが、既にWeb上に蓄積していますし、その蓄積する速度はこれからも増すばかりでしょう。
だから、率直に言ってそれらのデータを連携させないのはもったいないぞ、<strong>もったいないおばけが出るぞ</strong>、なんて思っているんです(笑)。</p>

<p>IoTデバイスは、既にWebに接続しています。しかし今はそれらの実装がバラバラ。
ただ実際に、それらを連携させたいというニーズは、ユーザーからも企業側からも出てきています。</p>

<p><b class="speaker siraisi">白石:</b> 錚々たる企業が参加してますね。</p>

<p><b class="speaker asimura">芦村:</b> そこでW3Cには業界における<strong>ユニバーサル・ジョイント・アダプター的な役割が求められている</strong>んです。</p>

<p><img src="/wp-content/uploads/2017/12/0102562b58277cf46fa1af23c664ffc5-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-25041" srcset="/wp-content/uploads/2017/12/0102562b58277cf46fa1af23c664ffc5.png 640w, /wp-content/uploads/2017/12/0102562b58277cf46fa1af23c664ffc5-300x169.png 300w, /wp-content/uploads/2017/12/0102562b58277cf46fa1af23c664ffc5-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> WoTとは具体的にどのような技術セットなのですか？</p>

<p><b class="speaker asimura">芦村:</b> 全体像としては「W3C WoT Framework」というものになります。そのフレームワークでは、WebサーバーとWebクライアントのどちらも備えた「Servient (Server + Client)」と呼ばれるデバイス同士が相互接続するというのが基本的なモデルです。</p>

<p><img src="/wp-content/uploads/2017/11/wot-framework-640x360.jpg" alt="" width="640" height="360" class="aligncenter size-large wp-image-24744" srcset="/wp-content/uploads/2017/11/wot-framework.jpg 640w, /wp-content/uploads/2017/11/wot-framework-300x169.jpg 300w, /wp-content/uploads/2017/11/wot-framework-207x116.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>そして、機器を公開したり発見したりアクセスしたり…という事を行うためのJavaScript APIも規定されています。</p>

<p><img src="/wp-content/uploads/2017/11/wot-script1-640x360.jpg" alt="" width="640" height="360" class="aligncenter size-large wp-image-24746" srcset="/wp-content/uploads/2017/11/wot-script1.jpg 640w, /wp-content/uploads/2017/11/wot-script1-300x169.jpg 300w, /wp-content/uploads/2017/11/wot-script1-207x116.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><img src="/wp-content/uploads/2017/11/wot-script2-640x360.jpg" alt="" width="640" height="360" class="aligncenter size-large wp-image-24747" srcset="/wp-content/uploads/2017/11/wot-script2.jpg 640w, /wp-content/uploads/2017/11/wot-script2-300x169.jpg 300w, /wp-content/uploads/2017/11/wot-script2-207x116.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> Servientですか、デバイスにサーバーもクライアントも突っ込むとは。大胆で面白いアイデアですね〜。</p>

<h2>Webを継続的に発展させていくために</h2>

<p><b class="speaker siraisi">白石:</b> では、最後にWebの今後とW3Cが果たす役割についてお話いただけますでしょうか？</p>

<p><b class="speaker asimura">芦村:</b> Webの本質は、<strong>自律分散協調システムである</strong>というところにあると思うんです。あらゆる主体が自律的に、分散して活動するのですが、更にそれらが協調することでより大きな価値を生んでいく。</p>

<p><strong>W3Cが注力しているのは、こうした自律分散協調システムが、より活性化するように後押ししていくこと</strong>です。</p>

<p>自律と分散により、それぞれの主体が競争しながら個別の実装を行っていく。しかしそれらの実装は、「Webと繋がっている」という点では共通です。Webはインターネット上のグローバルな情報プラットフォームですから。
そうしてWebに繋がっている個々の主体を、今度は相互接続して協調できるように働きかけていく。</p>

<p><img src="/wp-content/uploads/2017/12/6b5b50b8b2579613da43109baead0b18-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-25042" srcset="/wp-content/uploads/2017/12/6b5b50b8b2579613da43109baead0b18.png 640w, /wp-content/uploads/2017/12/6b5b50b8b2579613da43109baead0b18-300x169.png 300w, /wp-content/uploads/2017/12/6b5b50b8b2579613da43109baead0b18-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> なるほど、そういう観点から見ると、Webブラウザも「Webと繋がっている」アプリケーションですし、HTMLやCSSの標準化とかもまた違った捉えかたができそうですね。</p>

<p>しかし個人的には、HTMLやCSSの標準化を見ても、活発に進めているのはごく少数の企業のみ…というふうにも思えます。
これは、標準化から利益を得られる企業が限られているからとも思えるのですが、そこはどうお考えですか？</p>

<p><b class="speaker asimura">芦村:</b> 確かにそういう見方は否定できません。Webは基本的にオープンであることを指向しますから、既存の企業も、<strong>オープンウェブの上にビジネスを再構築する必要が生じるという面もある</strong>ためです。</p>

<p>そしてやはり、標準化が企業の利益に貢献するというモデルを後押しする必要はあると思っています。そうでない企業にとっては、標準化って「趣味」みたいなものになってしまいますから。</p>

<p>そういう意味では、WoTは良いテストケースだと思っています。たくさんのモノを、そして企業をつなぎ、さらにそれら企業の利益に貢献する。そして、Webがオープンな場所として健全に発展していくことを、継続的に後押しするのがW3Cの役割だと思います。</p>

<p><b class="speaker siraisi">白石:</b> 本日は、W3Cという立ち位置からの貴重なお話、大変面白かったです。どうもありがとうございました！</p>
]]></content:encoded>
			</item>
		<item>
		<title>WebRTC開発者にはたまらない！徹頭徹尾、デベロッパーファーストだった「SkyWay Developer Meetup#1」</title>
		<link>/shumpei-shiraishi/24700/</link>
		<pubDate>Mon, 13 Nov 2017 01:00:57 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[SkyWay]]></category>
		<category><![CDATA[WebRTC]]></category>

		<guid isPermaLink="false">/?p=24700</guid>
		<description><![CDATA[9月29日に開催された、SkyWay初の開発者向けミートアップ「SkyWay Developer Meetup#1」。 2013年12月からトライアルサービスとして提供されてきたWebRTC Platform SkyWa...]]></description>
				<content:encoded><![CDATA[<p>9月29日に開催された、SkyWay初の開発者向けミートアップ「SkyWay Developer Meetup#1」。</p>

<p>2013年12月からトライアルサービスとして提供されてきたWebRTC Platform SkyWayのビジョンとミッション、基本的な使い方からハックな使い方などが紹介された同イベントの模様を紹介する。</p>

<p><img src="/wp-content/uploads/2017/11/42A7958.jpg" alt="" width="640" height="392" class="alignnone size-full wp-image-24774" srcset="/wp-content/uploads/2017/11/42A7958.jpg 640w, /wp-content/uploads/2017/11/42A7958-300x184.jpg 300w, /wp-content/uploads/2017/11/42A7958-207x127.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>SkyWayのビジョン＆ミッション</h2>

<p>2013年12月から、無償のトライアルサービスとして提供されてきた<a href="https://webrtc.ecl.ntt.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebRTC Platform SkyWay</a>（以下、SkyWay）。</p>

<p>一部では「WebRTCでサービス開発を行うならSkyWayが必須」と認識されつつある昨今、ついに2017年9月7日、商用サービスとして新たなスタートを切った。</p>

<p>本記事では、SkyWay初の開発者向けミートアップ「<a href="https://skyway.connpass.com/event/65697/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkyWay Developer Meetup#1</a>」の模様をお伝えする。</p>

<p>まず最初に登壇したのは、SkyWayプロダクトマネージャーの水嶋彬貴氏。</p>

<p><img src="/wp-content/uploads/2017/11/42A7924.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24770" srcset="/wp-content/uploads/2017/11/42A7924.jpg 640w, /wp-content/uploads/2017/11/42A7924-300x200.jpg 300w, /wp-content/uploads/2017/11/42A7924-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><span style="font-size: 80%;">▲<strong>SkyWayプロダクトマネージャー 水嶋 彬貴氏</strong></span></p>

<p>6,000人以上の開発者、10,000近くのサービス、300近くの企業に既に利用されているSkyWayは、現在なんと1日あたり50万近くのWebRTC接続を捌いているという。</p>

<p>こうした実績は、「WebRTCを使うとこんなにもたくさんのことができる、と開発者の皆さんに証明していただいた」ことの現れであると水嶋氏は強調。</p>

<p><img src="https://codeiq.jp/magazine/wp-content/uploads/2017/10/numbers.jpg" alt="" width="640" height="360" class="alignnone size-full wp-image-54752" /></p>

<p>その上で、新たなスタートを切ったSkyWayのビジョンとミッションを以下のように定義した。</p>

<p><strong>「リアルタイムコミュニケーションを身近な技術に変え、世界中のソフトウェアエンジニアと共に世の中に革新を起こす」</strong></p>

<p><img src="https://codeiq.jp/magazine/wp-content/uploads/2017/10/mission.jpg" alt="" width="640" height="360" class="alignnone size-full wp-image-54753" /></p>

<h2>リアルタイムコミュニケーションを身近な技術に変える</h2>

<p>ミッションの前半「身近な技術に変える」という部分においてはまず、SkyWayの様々なAPIやSDK、日本語を含めたドキュメントが、WebRTCの難しさを中和してエンジニアの負担を減らすことができるとする。</p>

<p>それによりエンジニアは「WebRTCをどう使うか」ではなく、WebRTCを使ったイノベーションやアイデアに集中することができるようになる。</p>

<p><img src="https://codeiq.jp/magazine/wp-content/uploads/2017/10/sdks.jpg" alt="" width="640" height="360" class="alignnone size-full wp-image-54754" /></p>

<p>もうひとつ、身近な技術に変えるというミッションに基づいて提供されているのが、無償の「コミュニティエディション」だ。</p>

<p>無償で利用できる月に500ギガバイトという帯域量は、ボイスチャットであれば5,787日分、ビデオチャットであっても462日分に相当する。</p>

<p><img src="https://codeiq.jp/magazine/wp-content/uploads/2017/10/numbers2.jpg" alt="" width="640" height="360" class="alignnone size-full wp-image-54755" /></p>

<p>これだけの無料枠を手軽に試せるならば、スタートアップや新規事業に採用するのにためらう必要はない。まさに「リアルタイムコミュニケーションを身近にする」を体現した形だといえる。</p>

<h2>──そしてイノベーションを世界に広げる</h2>

<p>しかし、と水嶋氏は言う。SkyWayがいくらWebRTCを身近にしたところで、それだけでは世界中に広がるものではない。</p>

<p>ミッションステートメントの後半部分「世界中のソフトウェアエンジニアと共に世の中に革新を起こす」を達成するには、SkyWayを利用する開発者の助けが必要なのだと。</p>

<p>そこで水嶋氏は「（開発者への）お願い」と題して、以下の4つを挙げていた。</p>

<ul>
<li>横のつながり</li>
<li>イノベーションのアイデア共有</li>
<li>ノウハウの共有や相互支援</li>
<li>事業の成功と後続の支援</li>
</ul>

<p>水嶋氏のプレゼン資料はこちらから参照できる。</p>

<iframe src="//www.slideshare.net/slideshow/embed_code/key/1Sh8n8LrED5AGx" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>

<div style="margin-bottom:5px"> <strong> <a href="https://html5experts.jp//www.slideshare.net/mizuman1/skyway-vision-mission" title="SkyWay Vision &amp; Mission" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">SkyWay Vision &amp; Mission</a> </strong> from <strong><a href="https://www.slideshare.net/mizuman1" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Yoshiki Mizushima</a></strong> </div>

<h2>WebRTC開発者にはたまらない！基本からハック、生Q/A大会まで！</h2>

<p>その後は開発者向けにたっぷりと時間が割かれ、SkyWay / WebRTCに関する熱い議論が繰り広げられた。</p>

<p>SkyWayテックリードの岩瀬 義昌氏による「SkyWayを使いこなすために」というセッションは、SkyWayに関する基本から応用、ハックから内部関係者しか知らない情報まで盛りだくさんの内容だった。</p>

<p><img src="/wp-content/uploads/2017/11/42A8039.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24772" srcset="/wp-content/uploads/2017/11/42A8039.jpg 640w, /wp-content/uploads/2017/11/42A8039-300x200.jpg 300w, /wp-content/uploads/2017/11/42A8039-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><span style="font-size: 80%;">▲<strong>SkyWayテックリード 岩瀬 義昌氏</strong></span></p>

<p>あまりの情報量に、とてもではないがここでは内容を紹介しきれないため、詳しくは<a href="https://www.slideshare.net/iwashi86/skyway-how-to-use-skyway-webrtc" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">岩瀬氏のスライド</a>をご覧いただきたい。</p>

<iframe src="//www.slideshare.net/slideshow/embed_code/key/xuUXu3NGqjETbc" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>

<div style="margin-bottom:5px"> <strong> <a href="https://html5experts.jp//www.slideshare.net/iwashi86/skyway-how-to-use-skyway-webrtc" title="SkyWayを使いこなすために - How to use SkyWay (WebRTC)" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">SkyWayを使いこなすために &#8211; How to use SkyWay (WebRTC)</a> </strong> from <strong><a href="https://www.slideshare.net/iwashi86" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Yoshimasa Iwase</a></strong> </div>

<p>以下に、筆者として気になったポイントをいくつか書き記しておく。</p>

<p>*SkyWayは、現在開発が停止した<a href="http://peerjs.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PeerJS</a>をベースに開発されていたが、内部はフルスクラッチで書き直しており、継続的なメンテナンスや機能追加を行っている。<strong>「古いのではないか」という心配はあたらない</strong></p>

<p>*SkyWayでは、通常のP2P接続に加え<strong>SFU（Selective Forwarding Unit）もサポートしており、しかも無償から利用できる</strong>。</p>

<p>SFUとは複数のメディアストリームをサーバ側で一本にまとめてクライアントに配信する仕組みであり、多人数のビデオチャットを行う場合などに、P2Pのフルメッシュ型に比べてネットワーク全体の負荷を大きく低減することができる。</p>

<p>SkyWayが提供するRoom APIでは、フルメッシュとSFUを簡単に切り替えることができる。（SFUについては<a href="https://webrtc.ecl.ntt.com/sfu.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">SkyWayのドキュメントにある説明</a>がわかりやすい）</p>

<p>*<strong>APIドキュメントに書かれていない機能もいくつかあり</strong>、統計情報の取得なども行える。気になる方は岩瀬さんのスライドを参照のこと。</p>

<p>*安定性やスケーラビリティについては万全の体制を敷いている。
（後のQ/Aセッションによると、開発チームの人員が5人以上の体制で監視しているほか、運営企業であるNTTコミュニケーションズの監視部隊とも連携しており、24時間365日稼働を保証しているとのこと）</p>

<h2>SkyWay開発者によるライトニングトーク大会</h2>

<p>以降も、ミートアップはまだまだ続く。</p>

<p>ライトニングトーク大会では4人の登壇者がSkyWay開発に関する実際から「やってみた」まで幅広いトピックでプレゼンテーションを行った。</p>

<h3><a href="https://twitter.com/jumboOrNot" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@jumboOrNot</a><strong>氏による「iOSでのSkyWay開発の勘所とTips」</strong></h3>

<p>レアジョブ英会話というサービスで、SkyWayを利用したiOSアプリを開発した際の生々しい話。</p>

<p>Skypeで行っていたサービスをWebRTC化することで開けた展望、そしてiOSアプリ開発で直面した問題に対してGoogle Firebaseを用いて対処したことを紹介していた。</p>

<p><img src="/wp-content/uploads/2017/11/42A8096.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24773" srcset="/wp-content/uploads/2017/11/42A8096.jpg 640w, /wp-content/uploads/2017/11/42A8096-300x200.jpg 300w, /wp-content/uploads/2017/11/42A8096-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>▼講演資料はこちら</h4>

<script async class="speakerdeck-embed" data-id="b8286e3ed57649968393a440a8569226" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"></script>

<p><br></p>

<h3><a href="https://twitter.com/massie_g" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@massie_g</a><strong>氏による「SkyWayのビデオチャットを録画しよう。そう、ブラウザでね」</strong></h3>

<p>現在のWebブラウザが備えるAPIのみを用いて、ビデオチャットの録画を行う方法を紹介。</p>

<p><img src="/wp-content/uploads/2017/11/42A8139.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24771" srcset="/wp-content/uploads/2017/11/42A8139.jpg 640w, /wp-content/uploads/2017/11/42A8139-300x200.jpg 300w, /wp-content/uploads/2017/11/42A8139-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>▼講演資料はこちら</h4>

<iframe src="//www.slideshare.net/slideshow/embed_code/key/1yWoyuzHlI499u" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>

<div style="margin-bottom:5px"> <strong> <a href="https://html5experts.jp//www.slideshare.net/mganeko/skyway-mix-recording" title="Skywayのビデオチャットを録画しよう。そう、ブラウザでね" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Skywayのビデオチャットを録画しよう。そう、ブラウザでね</a> </strong> from <strong><a href="https://www.slideshare.net/mganeko" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">mganeko</a></strong> </div>

<p><br></p>

<h3><a href="https://twitter.com/leader22" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@leader22</a><strong>氏による「SkyWay JS SDKの歩き方」</strong></h3>

<p>SkyWayのJavaScript SDK開発をサポートしたPixelGridの杉浦氏による、JavaScript SDKの読み解きガイド。</p>

<p><img src="/wp-content/uploads/2017/11/42A8161.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24777" srcset="/wp-content/uploads/2017/11/42A8161.jpg 640w, /wp-content/uploads/2017/11/42A8161-300x200.jpg 300w, /wp-content/uploads/2017/11/42A8161-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>講演資料: <a href="https://leader22.github.io/slides/skyway_dev_meetup-1/" rel="noopener follow external noreferrer" target="_blank" data-wpel-link="external">SkyWay JS SDKの歩き方</a></h4>

<p><br></p>

<h3><a href="https://twitter.com/lz650sss" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">@lz650sss</a><strong>氏による「SkyWay×Cognitive Service」</strong></h3>

<p>SkyWayで受信したビデオチャットの画像をMicrosoft Azureの<a href="https://azure.microsoft.com/ja-jp/services/cognitive-services/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Cognitive Service</a>に送信し、表情を読み取るデモ</p>

<p><img src="/wp-content/uploads/2017/11/42A8205.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24778" srcset="/wp-content/uploads/2017/11/42A8205.jpg 640w, /wp-content/uploads/2017/11/42A8205-300x200.jpg 300w, /wp-content/uploads/2017/11/42A8205-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h4>講演資料: <a href="https://qiita.com/sublimer/items/9207b7e6aeaf75717d43" rel="noopener follow external noreferrer" target="_blank" data-wpel-link="external">SkyWay × Cognitive Service</a></h4>

<p><br></p>

<h2>フランクなQ/Aセッション、そして開発者だらけの懇親会。これぞデベロッパーファーストなミートアップだ</h2>

<p>アジェンダの最後はQ/Aセッション。事前アンケートで集めた質問に対して、開発チームが自らフランクに答えるセッションで、非常に和気あいあいとした雰囲気の中盛り上がった。</p>

<p><img src="/wp-content/uploads/2017/11/42A8363.jpg" alt="" width="640" height="418" class="alignnone size-full wp-image-24779" srcset="/wp-content/uploads/2017/11/42A8363.jpg 640w, /wp-content/uploads/2017/11/42A8363-300x196.jpg 300w, /wp-content/uploads/2017/11/42A8363-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<img src="https://codeiq.jp/magazine/wp-content/uploads/2017/10/qa.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-54761" /></p>

<p>そして（無料の）懇親会。会場の至る所で、Web(RTC)開発者同士のハイコンテクストな会話が繰り広げられていた。</p>

<p><img src="/wp-content/uploads/2017/11/42A8376.jpg" alt="" width="640" height="401" class="alignnone size-full wp-image-24780" srcset="/wp-content/uploads/2017/11/42A8376.jpg 640w, /wp-content/uploads/2017/11/42A8376-300x188.jpg 300w, /wp-content/uploads/2017/11/42A8376-207x130.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" />
<img src="https://codeiq.jp/magazine/wp-content/uploads/2017/10/social3.jpg" alt="" width="640" height="215" class="alignnone size-full wp-image-54786" /></p>

<p>最後に、イベントを通じて筆者が感じたことを述べておく。</p>

<p>SkyWayはもちろんプラットフォームであるが、このイベントを通じてSkyWayチームが実現したかったことは、<strong>「開発者コミュニティ」というプラットフォームづくり</strong>なのだろうと思う。</p>

<p>SkyWayというプラットフォームを提供してリアルタイムコミュニケーション開発の敷居を下げるだけが彼らの役割ではない。</p>

<p>同時に、開発者基盤としてのコミュニティ構築も図ることで、WebRTCを活用したイノベーションが生まれやすくすることも、また彼らの役割なのだと。</p>

<p>SkyWay開発チームのこうした挑戦が実を結び、日本発のプラットフォームが世界を席巻する日を、筆者は見たい。</p>

<p><span style="font-size: 90%;">※本記事はITエンジニアのためのキャリア応援サイト「<a href="https://codeiq.jp/magazine/" rel="noopener follow external noreferrer" target="_blank" data-wpel-link="external">CodeIQ MAGAZINE</a>」（※2017年11月18日掲載）からの提供記事です。</span></p>
]]></content:encoded>
			</item>
		<item>
		<title>「テクニックは語りません」竹洞先生に聞く、本気のWebパフォーマンス道</title>
		<link>/shumpei-shiraishi/24420/</link>
		<pubDate>Thu, 09 Nov 2017 01:00:54 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[Webパフォーマンス]]></category>

		<guid isPermaLink="false">/?p=24420</guid>
		<description><![CDATA[連載： HTML5 Conference 2017特集 (14)こんにちは、編集長の白石です。 この記事は、9月24日に開催されたHTML5 Conference 2017に登壇したエキスパートに、お話されたセッションの...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2017/" class="series-457" title="HTML5 Conference 2017特集" data-wpel-link="internal">HTML5 Conference 2017特集</a> (14)</div><p>こんにちは、編集長の白石です。</p>

<p>この記事は、9月24日に開催された<a href="http://events.html5j.org/conference/2017/9/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference 2017</a>に登壇したエキスパートに、お話されたセッションのトピックを中心に語っていただこうとういものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。</p>

<p>今回お話を伺ったのは、html5j パフォーマンス部を運営していらっしゃる竹洞 陽一郎さんです。</p>

<p><img src="/wp-content/uploads/2017/10/42A5419.jpg" alt="" width="640" height="415" class="alignnone size-full wp-image-24619" srcset="/wp-content/uploads/2017/10/42A5419.jpg 640w, /wp-content/uploads/2017/10/42A5419-300x195.jpg 300w, /wp-content/uploads/2017/10/42A5419-207x134.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><span style="font-size: 80%;"><strong>▲HTML5 Conference 2017セッション風景 （写真提供：html5j　撮影：刑部友康）</strong></span></p>

<p>竹洞さんのセッション「テクニックではなく、今、本気で取り組むべきWebパフォーマンス」に関するスライド資料は、<a href="https://speakerdeck.com/takehora/tekunitukudehanaku-jin-ben-qi-dequ-rizu-mubekiwebpahuomansu" rel="noopener follow external noreferrer" target="_blank" data-wpel-link="external">こちら</a>で公開されています。</p>

<h2>民法（債権法）が改正されて、何が変わる？</h2>

<p><b class="speaker siraisi">白石:</b> 民法（債権法）が改正された、ということに注目なさってるそうですね。</p>

<p><b class="speaker takehora">竹洞:</b> はい、民法の大規模な改正法案が今年5月に成立しました。3年以内に施行されることになっており、備えが必要です。様々な改正項目がありますが、中でも品質の担保を行う義務が明文化されたことで、ソフトウェア業界にも大きな影響が及ぶものと考えています。</p>

<p><b class="speaker siraisi">白石:</b> 具体的にはどういうことなのでしょうか？</p>

<p><b class="speaker takehora">竹洞:</b> <strong>「瑕疵担保」っていう概念がなくなる</strong>んです（参考: <a href="http://itpro.nikkeibp.co.jp/atcl/news/17/052601508/?rt=nocnt" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">改正民法が成立、「瑕疵担保責任」などシステム開発契約に影響大 (ITpro)</a>。</p>

<p>今までは「瑕疵担保」という概念があったおかげで、とりあえずは品質を担保しない状態で納品を行い、その後の瑕疵期間で問題を修正していく…というのが一般的に行われていました。ですが今後は、納品時に一定の品質を保証することが開発側に求められるようになります。</p>

<p><b class="speaker siraisi">白石:</b> そのことが、どういう影響をおよぼすと考えられますか？</p>

<p><b class="speaker takehora">竹洞:</b> 私としては、ソフトウェア品質が全般的に向上することで、市場が健全化すると考えています。</p>

<p><strong>品質への理解が低い市場は、必ずと言っていいほど衰退する</strong>んです。
消費者が品質の善し悪しが判断できない状態だと、価格が一番の判断材料になります。
そうなると結局、品質を犠牲にした価格競争にならざるを得ない。</p>

<p><b class="speaker siraisi">白石:</b> 「安かろう悪かろう」が当たり前になってしまうわけですね。</p>

<p><b class="speaker takehora">竹洞:</b> そう。そういうスパイラルに陥らないためには、品質への意識を高く保つ必要があるんです。</p>

<p>例として適切かはわかりませんが、たとえば<strong>麻薬の売人って、品質にものすごく気を使う</strong>んです。 質の悪い麻薬が出回るようになると、価格に対する期待と同程度の「ハイ」の状態を得られず、その結果、価格の下落を招き、結局市場が衰退してしまうからです。こうした現象を、アメリカの中古車市場の分析から「情報の非対称性」として研究したジョージ・アカロフ博士は、2001年にノーベル経済学賞を受賞しています。</p>

<p><img src="/wp-content/uploads/2017/10/DSC05329.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24621" srcset="/wp-content/uploads/2017/10/DSC05329.jpg 640w, /wp-content/uploads/2017/10/DSC05329-300x200.jpg 300w, /wp-content/uploads/2017/10/DSC05329-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>「品質保証」がウェブ業界を変える</h2>

<p><b class="speaker siraisi">白石:</b> しかし、品質保証が義務付けられるとなると、開発のコストが上がるということになりませんか？</p>

<p><b class="speaker takehora">竹洞:</b> それはあり得ます。そのことが、受託開発のビジネスなどをより難しくしてしまうことも考えられます。</p>

<p>例えばウェブ制作会社は、一般的には納品後に入金が入るという仕組みになっていますよね。
だから、まずは品質がそこそこの状態で納品してしまう…ということも起きるわけです。 パフォーマンスはその悪い例で、まずはチューニングしていない状態で納品する。すると、後でパフォーマンス・チューニングの依頼が来てまた売上につながる…なんて事情も実際にはあるわけです。</p>

<p>こうしたこれまでの商慣行が崩れてしまう可能性はありますね。 品質保証が義務付けられるせいで、納品までにより時間がかかるようになるとすると、入金が遅くなるということに繋がる。しかし、民法債権法改正では、部分単位やステージ毎の請負金額の要求ができるようになっています。</p>

<p><b class="speaker siraisi">白石:</b> それだけ聞くと、受託開発や制作を行っている企業にとっては、ただただ厳しくなるようにも聞こえますね。 そもそも、「品質を保証して納品」ってどういうことなんでしょう？ 完璧なソフトウェアを作らねばならない…なんてそもそも無理だとも思うのですが。</p>

<p><b class="speaker takehora">竹洞:</b> その点については安心していいと思います。 「品質を保証する」というのは、「完璧な製品」を意味しているわけじゃないんです。 テスト項目について顧客と合意し、その結果を提出すればいい。実は、ソフトウェア品質には、<a href="http://www.itmedia.co.jp/im/articles/1111/07/news153.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">V&amp;V</a>といって、Verification(検証)とValidation(妥当性確認)という二つの概念があります。</p>

<p>検証(Verification)とは、仕様・設計・計画などの要求事項を満たしているかどうかの確認です。妥当性確認(Validation)とは、機能や性能が本来意図された用途や目的に適っているか、実用上の有効性があるかの確認です。Webパフォーマンスは、品質においては、妥当性確認にあたります。</p>

<p>従来、ソフトウェア開発における「品質」、特に受託開発においては、検証確認が主体でした。もちろん、応答速度の遅延などで使いものにならないという妥当性確認もあったものの、それはハードウェア性能であったり、データベース設計の問題であったりと、「表示」そのもののロジックに原因はあまりなかったのです。</p>

<p>要求仕様の実現という意味での検証については、仰るとおり「完璧な製品」というのは、ほぼ存在し得ない。それは、ソフトウェアが、論理記述であって、物理法則の縛りがなく、かつ、連続性の保証がないためです。</p>

<p>連続性の保証とは、物理法則であれば、100Kgの重さまで耐えられるテーブルであれば、当然ながら、80Kgや10Kgなど、100Kg以下の重量に耐えられることです。しかし、ソフトウェアは二値論理がベースであるために、100という値で大丈夫であっても、80や10という値で大丈夫であるという保証がない世界です。</p>

<p>2002年に亡くなられた、オランダの著名な計算機科学者で、構造化プログラミングの提唱者でチューリング賞を受賞しているエドガー・ダイクストラ博士が「テストは誤謬を見つけることはできるが、それがないことを証明することはできない」と指摘しています。</p>

<p>ですから、バグや欠陥がないことを保証するというのは無理なんです。</p>

<p><b class="speaker siraisi">白石:</b> なるほど、それなら少し安心です。バグや欠陥のないソフトウェアなんて不可能ですし。</p>

<p><b class="speaker takehora">竹洞:</b> 品質についても顧客との合意内容に盛り込む必要が生じる、ってことですよね。 そうした合意があるのとないのとでは、品質に対する意識が全然違ってきます。品質については、検証として従来もやってきたことです。ところが、WebがソフトウェアのUIの主体となることによって、今まで問題にならなかった「表示」に関するロジックが突如、問題となり始めた。突如といっても、もう20年ぐらいになるわけですが…</p>

<p>その部分は、検証ではなくて、妥当性確認なんですが、妥当性確認のテストのノウハウが日本では普及していなかった。今、そこが問われているわけです。</p>

<p><img src="/wp-content/uploads/2017/10/DSC05348.jpg" alt="" width="640" height="411" class="alignnone size-full wp-image-24622" srcset="/wp-content/uploads/2017/10/DSC05348.jpg 640w, /wp-content/uploads/2017/10/DSC05348-300x193.jpg 300w, /wp-content/uploads/2017/10/DSC05348-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> なるほど。「完璧な製品を作る」ことが品質保証なのではなく、「妥当性品質に対してどこまで保証するかを明確にする」ということなんですね。</p>

<p><b class="speaker takehora">竹洞:</b> そうです。そうして、妥当性品質についての期待値を高く保つことは、Webに関する業界として必要なことだと思いますよ。</p>

<p>例えば日本の住宅市場は、品質保証がうまくいっていない例だと思うんです。 日本の住宅って、非常に寿命が短いじゃないですか。その理由は様々ですが、一つに中古住宅に対する品質の期待値が低いことがあると思っています。 品質保証がない空き家を買うくらいなら、新築のほうがいいって心理です。</p>

<p><b class="speaker siraisi">白石:</b> 確かにそういう一面はある気がしますね。ぼくは安さに釣られて中古住宅を買ったクチですが(笑)、一生住めるなんて少しも期待してませんし。</p>

<p><b class="speaker takehora">竹洞:</b> それって、結局その家はいつか捨てることになるってことで、財の蓄積が進んでいないとも言えると思うんです。 社会的に見ると、将来世代に引き継ぐ財が形成されていないとも言える。財の蓄積が期待できないと、そこの投資は進まない。お金が集まってこないのです。</p>

<p>ウェブのように技術がどんどん進歩していく世界に財の蓄積は有り得るのか？システム構築費用は5年で償却されるのであれば、5年持てばいいじゃないか？という考えられるのは、仰るとおりです。</p>

<p>しかし、プレゼンテーションとしてのUIデザインと、データとしてのコンテンツやユーザのデータは分けて考えるべきで、だからこそ、HTMLとCSS、JavaScriptで役割分担をしているわけじゃないですか。システムの永続性というものを考慮してWebサイトの設計を行うことは非常に重要なのです。</p>

<p>減価償却期間の5年も持たない、3年程度で捨てざるを得ないとなれば、企業財務的にはそこはできるだけ安く済ませるべきなのです。しかし、品質が保証されて、減価償却の5年を超えて使えるとなると、将来価値が上がる。企業財務的にはおいしいお話なのです。そこに気付いてほしい。メンテナンス費用は当然発生するでしょうけど、新規で作るより安いですし、何より「継承」できることが大きなメリットなんです。</p>

<p>UIデザインや技術力だけで勝負しているWeb制作会社さんは、その点に、早く気づかれた方が良いと思います。お金を握っている経営者や財務担当者は、別のロジックで判断しているわけですから。</p>

<p>ですから、ウェブサイトも、いつか捨てるものとなれば、そこに予算を掛けようとは思わない。品質が保証されないのであれば、なおさらのことです。</p>

<p>「お客様からあまり予算をいただけない」と嘆くことがあるかと思いますが、その背景には、品質が保証されていないので修正するより作り直した方がいいと考えられていること、いつかWebサイトは捨てて新しく作るものと考えられている背景は認識しておくべきだと思います。</p>

<h2>ウェブサイトの品質を決める3つの要素</h2>

<p><b class="speaker siraisi">白石:</b> では具体的に、ウェブサイトにおける品質を保証するというのは、何をすればいいんでしょうか？</p>

<p><b class="speaker takehora">竹洞:</b> ウェブサイトの品質は主に3つの要素から成っていると言っていいでしょう。</p>

<p>一つは<strong>アクセシビリティ</strong>。
一つは<strong>セキュリティ</strong>。
最後が<strong>パフォーマンス</strong>です。</p>

<div id="attachment_24422" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/10/ab193805fd71ab248f659082cef24bb5-640x480.png" alt="Webサイトの三大品質" width="640" height="480" class="size-large wp-image-24422" srcset="/wp-content/uploads/2017/10/ab193805fd71ab248f659082cef24bb5-640x480.png 640w, /wp-content/uploads/2017/10/ab193805fd71ab248f659082cef24bb5-300x225.png 300w, /wp-content/uploads/2017/10/ab193805fd71ab248f659082cef24bb5-768x576.png 768w, /wp-content/uploads/2017/10/ab193805fd71ab248f659082cef24bb5-207x155.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Webサイトの三大品質</p></div>

<p>これらはそれぞれJISで規定されてもいる重要な指標です。これらをしっかり担保していく体制づくり、それがウェブサイトの品質保証に繋がります。</p>

<p><b class="speaker siraisi">白石:</b> ウェブサイト制作にも、これらを担保するワークフローを確立していくべきということですね。</p>

<p><b class="speaker takehora">竹洞:</b> そうです。そしてこれらは、運用と一体になって改善していくべきものでもありますので、DevOpsの観点から考えるのも重要です。</p>

<p>ただ一つ不思議なのが、日本でDevOpsに関して述べている文献や書籍って、ほとんどの場合品質保証のことが抜けてしまっているんですよね。
品質に対する意識が高まらない原因は、こういうところにもあると思います。</p>

<div id="attachment_24423" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/10/depops-640x480.png" alt="DevOps" width="640" height="480" class="size-large wp-image-24423" srcset="/wp-content/uploads/2017/10/depops-640x480.png 640w, /wp-content/uploads/2017/10/depops-300x225.png 300w, /wp-content/uploads/2017/10/depops-207x155.png 207w, /wp-content/uploads/2017/10/depops.png 720w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">DevOps</p></div>

<h2>ウェブサイトの品質を高めるための心構え</h2>

<p><b class="speaker siraisi">白石:</b> 品質を向上させるためのコストが低く見積もられがちというところもあるんでしょうか。</p>

<p><b class="speaker takehora">竹洞:</b> というよりは、そのコストが認識されていないというのが正しい気がします。 「品質、費用、期間の3要素を同時に満たすことはできず、トレードオフの関係にある」といった、プロジェクトマネジメントやソフトウェア開発見積りの基本もあまり浸透していない感覚がある。</p>

<p><b class="speaker siraisi">白石:</b> なるほど。当たり前の話ですが、品質を高めようとすれば、時間的、金銭的なコストを支払う必要があるということですね。</p>

<p><b class="speaker takehora">竹洞:</b> はい。そして品質保証が当たり前になれば、品質保証のためのコストがかかるのも当たり前になる。今は、その当たり前のコストを払っていないだけとも言えるのです。</p>

<p><b class="speaker siraisi">白石:</b> では、そうした品質保証、特にパフォーマンスについて、状況を改善していくにはどんな知識が必要になるんでしょう？</p>

<p><b class="speaker takehora">竹洞:</b> そうですね、小手先のテクニックはたくさんありますし、いろんなところで語られてもいますので、もう少し根源的なところから考えると、結局「基礎」と「長期的な視野」が重要になると思うんです。</p>

<p>基礎というのは、コンピューターやネットワークに関する基本的な知識。 長期的な視野と言うのは、数年後にインターネットがどうなっているか、といった話です。</p>

<p><b class="speaker siraisi">白石:</b> なるほど。</p>

<p><b class="speaker takehora">竹洞:</b> 例えば、パフォーマンスに関する話を突き詰めていくと、意外なほどハードウェアに関する知識って大事なんです。 パフォーマンスって、最終的には絶対にハードウェアに依存するわけですからね。</p>

<p>例えば、とある大規模サイトで遅延が発生していたんですが、その原因を追求するのすごく大変だったんです。 アプリケーションをいくら調べても、データベースのクエリをいくら見直しても、ネットワークの状態を見ても、原因がわからなかった。</p>

<p><b class="speaker siraisi">白石:</b> 結局、どんな原因だったんですか？</p>

<p><b class="speaker takehora">竹洞:</b> そのサーバはVMWareで仮想化されていて、サーバ負荷に応じてCPUリソースが動的に割り当てられるようになっていました。ただ、あらかじめ割り当てられているCPUリソースが足りなかったせいで、CPUの動的割り当てが頻繁に発生してしまっていたんです。 その割り当てが行われる際に、サーバの処理が遅延してしまっていたんですね。</p>

<p><b class="speaker siraisi">白石:</b> それは深い原因ですね…</p>

<p><b class="speaker takehora">竹洞:</b> ここまで奥深くに原因がある場合って、ハードウェアを含めたアーキテクチャ全般の知識が必要になります。 だから結局、コンピューター全般の知識って必要だなと。だから私の会社では、入社したら最初の一歩として、まずPCを自作してもらうようにしています(笑)。</p>

<h2>全てを変える、5Gネットワーク</h2>

<p><b class="speaker siraisi">白石:</b> 数年後にインターネットがどうなっているか、というお話も聞かせていただけますか？</p>

<p><b class="speaker takehora">竹洞:</b> はい、具体的には5Gネットワークの話になりますね。5Gはアプリケーションの作り方を含め、全てを変える可能性がある技術だと思っています。</p>

<p><b class="speaker siraisi">白石:</b> 5Gネットワークって全然知らないのですが、どんな感じなんでしょう？</p>

<p><b class="speaker takehora">竹洞:</b> 大きく3つのトピックがあると考えています。</p>

<p>一つは<strong>ネットワークスライス</strong>。インターネットを「輪切り」にするイメージで、用途に応じて別々のネットワークを提供していくようになります。</p>

<p>電波には周波数によって特性があり、サービスの特性に応じて周波数を割り当てて異なるネットワークを構成できるので、ネットワーク全体の利用効率が大きく向上すると考えられています。</p>

<div id="attachment_24424" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/10/a2394912a431f48b924b7fd9decf0e62-640x480.png" alt="ネットワークスライス" width="640" height="480" class="size-large wp-image-24424" srcset="/wp-content/uploads/2017/10/a2394912a431f48b924b7fd9decf0e62.png 640w, /wp-content/uploads/2017/10/a2394912a431f48b924b7fd9decf0e62-300x225.png 300w, /wp-content/uploads/2017/10/a2394912a431f48b924b7fd9decf0e62-207x155.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">ネットワークスライス</p></div>

<p>次に<strong>指向性アンテナ</strong>です。今までは、基地局といういわば「傘」を中心として、そこから広がるように無線ネットワークが構築されていました。</p>

<p>しかしこれからは、パネル型のアンテナがビルの壁面に貼られるようになり、そこから端末と直接「ビーム」をやり取りするように通信を行います。通信の受信強度が高まるだけでなく、他の電波との干渉も減らせます。</p>

<div id="attachment_24426" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/10/dfdead9390dbb2a8a72a6eba14a82677-640x480.png" alt="指向性アンテナ" width="640" height="480" class="size-large wp-image-24426" srcset="/wp-content/uploads/2017/10/dfdead9390dbb2a8a72a6eba14a82677.png 640w, /wp-content/uploads/2017/10/dfdead9390dbb2a8a72a6eba14a82677-300x225.png 300w, /wp-content/uploads/2017/10/dfdead9390dbb2a8a72a6eba14a82677-207x155.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">指向性アンテナ</p></div>

<p>最後に<strong>モバイル・エッジ・コンピューティング</strong>です。これは、4Gですと、地域の基地局をまとめているRNC(Radio Network Controller)配下に、仮想サーバー（エッジサーバー）を設置できるようになるのです。 今まで携帯の会社はコアネットワークを公開していなかったので、これは大きな変化です。</p>

<div id="attachment_24425" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/10/8b6b5080377333396bc358c212e7653e-640x480.png" alt="モバイルエッジコンピューティング" width="640" height="480" class="size-large wp-image-24425" srcset="/wp-content/uploads/2017/10/8b6b5080377333396bc358c212e7653e.png 640w, /wp-content/uploads/2017/10/8b6b5080377333396bc358c212e7653e-300x225.png 300w, /wp-content/uploads/2017/10/8b6b5080377333396bc358c212e7653e-207x155.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">モバイルエッジコンピューティング</p></div>

<p>これは分散コンピューティングの新たな可能性を示しているといえます。インターネットより手前でトラフィックを捌けるわけですから、サーバーの応答性も大きく向上します。</p>

<p><b class="speaker siraisi">白石:</b> へえ、知りませんでした！世界中のエッジサーバー上に、静的リソースのキャッシュを置けたりしたら、すごく速くなりそうですね。</p>

<p><b class="speaker takehora">竹洞:</b> それだけではありません。エッジサーバーで可能な限り処理を行い、必要な処理だけインターネット上のサーバーに送るようにすることもできます。アプリケーションの処理を、エッジサーバーとインターネット上のサーバーで分担するというわけです。</p>

<p>もしくは、全てエッジサーバー上で処理を行うような、非インターネットのローカルなサービスを行うことも可能です。</p>

<p><b class="speaker siraisi">白石:</b> そうなると、アプリケーションの作り方も大きく変わってきそうですね。夢が拡がりますね…。5Gネットワークって、具体的にはいつ頃普及が見込まれているのでしょうか？</p>

<p><b class="speaker takehora">竹洞:</b> 2020年の東京オリンピックまでには使えるようになるだろうと言われています。</p>

<p>10月12日に、NTTドコモ、富士通、富士通研究所がモバイル・エッジ・コンピューティングを使った高画質動画配信や映像解析を活用した人物検知システムの実証実験を行って成功した旨の<a href="http://pr.fujitsu.com/jp/news/2017/10/12-1.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">プレスリリース</a>を発表してています。</p>

<p>また10月13日には三菱商事が、この分野のリーディングカンパニーである<a href="https://www.jig-saw.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">JIG-SAW</a>と、モバイル・エッジ・コンピューティングの実証実験成功の<a href="https://news.biglobe.ne.jp/economy/1013/dre_171013_4304155723.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">プレスリリース</a>を発表しています。</p>

<p><b class="speaker siraisi">白石:</b> ワクワクしますね。本日は民法から5Gネットワークまで、幅広いお話を聞かせていただき、ありがとうございました！</p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2017特集]]></series:name>
	</item>
		<item>
		<title>テレビも車もゲーム機も！組み込みブラウザ開発ってどんな世界か聞いてみた</title>
		<link>/shumpei-shiraishi/24637/</link>
		<pubDate>Wed, 08 Nov 2017 02:06:37 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[ゲーム]]></category>
		<category><![CDATA[ハイブリッドキャスト]]></category>
		<category><![CDATA[組み込みブラウザ]]></category>
		<category><![CDATA[自動車]]></category>

		<guid isPermaLink="false">/?p=24637</guid>
		<description><![CDATA[連載： HTML5 Conference 2017特集 (2) こんにちは、編集長の白石です。 この記事は、9月24日に開催されたHTML5 Conference 2017に登壇したエキスパートに、お話されたセッションの...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2017/" class="series-457" title="HTML5 Conference 2017特集" data-wpel-link="internal">HTML5 Conference 2017特集</a> (2)</div><p><style>
b.speaker {
  margin-right: 1em;
}
</style>
こんにちは、編集長の白石です。</p>

<p>この記事は、9月24日に開催された<a href="http://events.html5j.org/conference/2017/9/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference 2017</a>に登壇したエキスパートに、お話されたセッションのトピックを中心に語っていただこうとういものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。</p>

<p>今回お話を伺ったのは、株式会社ACCESSの梅田雅士さんです。</p>

<p><img src="/wp-content/uploads/2017/10/DSC05579.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24649" srcset="/wp-content/uploads/2017/10/DSC05579.jpg 640w, /wp-content/uploads/2017/10/DSC05579-300x200.jpg 300w, /wp-content/uploads/2017/10/DSC05579-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>梅田さんのセッション「TV・車・ゲームに搭載されているブラウザってどうなってるの？」に関するスライド資料は、こちらで公開されています。</p>

<iframe class="embedly-embed" src="//cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.slideshare.net%2Fslideshow%2Fembed_code%2Fkey%2F94O53WFZyAkiCq&#038;url=https%3A%2F%2Fwww.slideshare.net%2FMasashiUmeda%2Ftv-81364792&#038;image=https%3A%2F%2Fcdn.slidesharecdn.com%2Fss_thumbnails%2Fhtml5conference2017-171030095111-thumbnail-4.jpg%3Fcb%3D1509357173&#038;key=internal&#038;type=text%2Fhtml&#038;schema=slideshare" width="500" height="417" scrolling="no" frameborder="0" allowfullscreen></iframe>

<p><br></p>

<h2>組み込みブラウザって…なに？</h2>

<p><b class="speaker siraisi">白石:</b>では、まずは簡単に自己紹介をお願いできますか？</p>

<p><b class="speaker umeda">梅田:</b>株式会社ACCESS IoT事業本部課長の梅田 雅士です。
もともとはエンジニアでして、ブラウザ開発からWebサービスまで、組み込みからフロントエンドまで開発していました。</p>

<p><b class="speaker siraisi">白石:</b>すごく幅広い経歴をお持ちですね！今回はPCやスマートフォン「以外」の環境におけるブラウザのお話を伺えると聞いています。</p>

<p><b class="speaker umeda">梅田:</b>はい、今やブラウザはテレビにも、自動車にも、ゲームにも搭載されています。それらを総じて「組み込みブラウザ」と呼んでいます。</p>

<p><b class="speaker siraisi">白石:</b>組み込みブラウザと言うのは、PCやスマートフォンのブラウザとどう違うんでしょうか？</p>

<p><b class="speaker umeda">梅田:</b>Webを閲覧できると言うのは、ブラウザの基本的な機能ですので、組み込みブラウザであっても変わりません。違うのはまず動作環境ですね。例えばOSも、LinuxからiTronまで、様々な環境があります。中にはタッチ操作やマウス操作が存在しない環境でも動作することが求められることもあります。</p>

<p><b class="speaker siraisi">白石:</b>ACCESSさんの組み込みブラウザは、今は主にChromiumやWebKitをベースにして開発してらっしゃるんですよね。組み込み向けに機能を追加したり、ということもあるんでしょうか？</p>

<p><b class="speaker umeda">梅田:</b>はい、例えばテレビのリモコンとか、ゲームのコントローラーとかでブラウジングを可能にすると言った機能の追加は一般的にありますね。ブラウザの操作に関しては、「組み込みならでは」という部分は多いです。</p>

<h2>テレビとブラウザ</h2>

<p><b class="speaker siraisi">白石:</b>では、テレビ、クルマ、ゲームに搭載されているブラウザの状況について、詳しく教えてください。</p>

<p><b class="speaker umeda">梅田:</b>ではテレビからいきましょう。実はテレビには昔から身近にありまして、<strong>テレビのdボタンを押して立ち上がる画面は、実はブラウザ</strong>なんです。</p>

<p><b class="speaker siraisi">白石:</b>dボタンはブラウザ起動ボタンでもあったわけですね。</p>

<p><b class="speaker umeda">梅田:</b>はい、それにテレビのメニュー選択を行うアプリもHTMLで書かれていたりしますね。</p>

<p><b class="speaker siraisi">白石:</b> <strong>ハイブリッドキャスト</strong>と言うのは何でしょうか？</p>

<p><b class="speaker umeda">梅田:</b>テレビ向けのブラウザでは、以前はBML (<a href="https://ja.wikipedia.org/wiki/Broadcast_Markup_Language" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Bloadcast Markup Language</a>)という、XHTMLベースの独自言語が利用されていました。ですが現在では、HTML5をベースとしたテレビ用の規格がありまして、それが「ハイブリッドキャスト」です。</p>

<p>ハイブリッドキャストは「放送と通信の連携」を目的として、NHKさんを中心とした標準化が行われています。単にHTML5が使えると言うだけではなく、スマートフォンとの連携（セカンドスクリーン）機能なども備えています。</p>

<p><b class="speaker siraisi">白石:</b>民放局の、ハイブリッドキャストへの対応度合いとかはいかがですか？</p>

<p><b class="speaker umeda">梅田:</b>各社とも、現在対応を拡充している段階ですね。2020年の東京オリンピックで、テレビ放送をより楽しく観せるのが、各社共通の目標になっています。</p>

<p><b class="speaker siraisi">白石:</b>ちなみに昔聞いた話なのですが、<strong>テレビって意外にも低スペック</strong>で、重たいWebページを表示させるのは難しいと聞いたことがあります。その状況は現在では変わりましたか？</p>

<p><b class="speaker umeda">梅田:</b>いえ、あまり変わりないです。テレビの中で一番高価な部品はやはりパネル。その他の部品、例えばCPUなどは、やはり廉価なものが使われることが多いんですね。なのでテレビ向けのWebページは、軽量であることが望まれます。</p>

<p><img src="/wp-content/uploads/2017/10/DSC05566.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24650" srcset="/wp-content/uploads/2017/10/DSC05566.jpg 640w, /wp-content/uploads/2017/10/DSC05566-300x200.jpg 300w, /wp-content/uploads/2017/10/DSC05566-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>車とブラウザ</h2>

<p><b class="speaker siraisi">白石:</b>では次は車とブラウザの関係について教えてください。</p>

<p><b class="speaker umeda">梅田:</b>自動車業界では、カーナビを中心とした、操作可能な中央のスクリーンを「<strong>HMI (Human Machine Interface)</strong>」と呼びます。HMIでブラウザを利用できると、例えば自動車のマニュアルをHTMLで書いたりできます。HTMLは多言語化しやすいのでメリットは大きいですね。</p>

<p>あとは車載システムにアプリを追加することができるものもあります。インターネットと繋がって、例えば天気を表示したり、運転を楽しくするようなアプリがインストールできたりします。車載システムは「情報（インフォメーション）」と「娯楽（エンターテインメント）」を提供するという概念から、「<strong>インフォテインメント</strong>」とか、「<strong>IVI</strong>（In-Vehicle Infotainment：車載インフォテインメント）」と呼ばれたりします。HMIでブラウザが利用できるなら、そうしたアプリもWeb技術で開発できるようになります。</p>

<p><b class="speaker siraisi">白石:</b>車載システムにブラウザを搭載するという動きは、どれくらい進んでいるものなんでしょうか？</p>

<p><b class="speaker umeda">梅田:</b>海外では結構進んでいます。車載システムのOSは共通化が進みつつあって、主要なものとしては<a href="https://www.automotivelinux.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AGL (Automotive Grade Linux)</a>や<a href="https://www.genivi.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">GENIVI</a>がありますが、これらには今後ブラウザが搭載される予定があります。</p>

<p>ちなみに<strong>AGLって、Tizen IVIが元になっている</strong>んですよ。Tizenは一時期HTML5にも注力していましたので、白石さんはご存知じゃないかと思いますが。</p>

<p><b class="speaker siraisi">白石:</b>ええっ！Tizenって久しぶりに聞いた名前です。そうだったのか…そういう風に受け継がれていたんですね。IT業界って、思わぬところが繋がってたりするので面白い(笑)</p>

<p>ところでそういう車載システムとかだと、テスラの車とかは進んでるイメージありますけど、実際のところどうなんでしょう？</p>

<p><b class="speaker umeda">梅田:</b>確かにテスラは進んでいて、WebKitを搭載した車載システムを既に積んでいますね。ただ、古いバージョンのWebKitを搭載していたため、そのセキュリティホールを突かれてハッキングが可能な状態になっていたことがあったりします。車載システムの高度化に伴って、セキュリティリスクも高まりつつあるというのが実情です。</p>

<h2>ゲームとブラウザ</h2>

<p><b class="speaker siraisi">白石:</b>ゲーム機にブラウザが搭載されているという点についてはいかがでしょう？</p>

<p><b class="speaker umeda">梅田:</b>実は、<strong>ゲーム機にブラウザが搭載されているのは結構昔から</strong>なんです。2003年に発売されたPlayStation 2や、2004年に発売されたPlayStation Portableには、もう入っていましたからね。</p>

<p><b class="speaker siraisi">白石:</b>そんなに昔から入っていたんですね。そう言えば、ガラケーとかにもブラウザ積まれてたし、そう言えば組み込みブラウザって結構昔からあったんですよね。</p>

<p><b class="speaker umeda">梅田:</b>そうですね。それに、<strong>ゲームソフト自体にブラウザが積まれていたこともありました</strong>よ。</p>

<p><b class="speaker siraisi">白石:</b>ええっ！ゲームソフトがブラウザを内蔵していたんですか？</p>

<p><b class="speaker umeda">梅田:</b>そうです。例えばモンスターハンター3には、弊社のNetFrontというブラウザが内蔵されていました。</p>

<p><b class="speaker siraisi">白石:</b>ゲームソフトにブラウザが入ってるなんて、考えたこともありませんでした。すごい世界だ。</p>

<h2>ブラウザ開発ってどんな仕事？</h2>

<p><b class="speaker siraisi">白石:</b>そもそもブラウザ作ってる会社ってあまりないですよね。そこら辺の実際をお聞きしてみたいです。ブラウザ開発って、どのように進めるものなんですか？</p>

<p><b class="speaker umeda">梅田:</b>基本的には、W3Cの仕様を満たすように実装するというのがブラウザ開発の中心になります。ただ、今はオープンソースのブラウザをベースに開発していますので、少し仕事の範囲が変わりましたね。W3Cの仕様を満たすために開発するのは、主にChromiumやWebKitのコアチームに任せて、私たちはその移植が中心になりました。</p>

<p><b class="speaker siraisi">白石:</b>なるほど、今はブラウザエンジンそのものの開発に深く食い込んでいるわけではないと。</p>

<p><b class="speaker umeda">梅田:</b>ただ、弊社ではEPUBのエンジンも作っていまして、そのために独自開発した部分とかは結構ありますね。例えば縦書きレイアウトとかは、W3Cに提案されている仕様を元に弊社で開発したコードを、ブラウザエンジン側にコントリビュートしたりもしています。</p>

<p><b class="speaker siraisi">白石:</b>ちなみにブラウザ開発って、どんな言語を使って行うんですか？</p>

<p><b class="speaker umeda">梅田:</b>WebKitやChromiumはC++で書かれているので、C++ですね。C++ってメモリマネジメントが重要な言語ですが、WebKitとかってそこら辺が少しいいかげんだったりするんです(笑)。</p>

<p><b class="speaker siraisi">白石:</b>え、そうなんですか？メモリリークしたり、とかですか？</p>

<p><b class="speaker umeda">梅田:</b>さすがに派手なメモリリークとかはめったにありませんが、メモリ確保に失敗した時の処理が甘かったり、とかですね。で、車載システムとかで利用する場合って、「動かない」って状況になるのはすごくまずいわけです。運転中は安全がなにより最優先ですから。そういう穴を潰して本家にコントリビュートする…というのもたまにありますね。</p>

<p><img src="/wp-content/uploads/2017/10/DSC05567.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24651" srcset="/wp-content/uploads/2017/10/DSC05567.jpg 640w, /wp-content/uploads/2017/10/DSC05567-300x200.jpg 300w, /wp-content/uploads/2017/10/DSC05567-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>組み込みブラウザベンダーはつらいよ</h2>

<p><b class="speaker siraisi">白石:</b>ACCESSさんはブラウザと言っても、更に「組み込みブラウザ」を作っているという数少ない存在。そういう、数少ない組み込みブラウザベンダーならではの苦労などをお聞きしたいです。</p>

<p><b class="speaker umeda">梅田:</b>そうですね、まず先ほども申し上げたように、現在はChromiumやWebKitをベースに開発しています。以前は独自のブラウザエンジンでしたが、数年前にWebKitに切り替えたんです。ただ、WebKitはそもそも組み込み用途が主ではありませんでしたから、当初はハードのスペック的な制約との折り合いを付けるのが大変でしたね。（Webページが）メモリに乗り切らないので、数キロバイト単位に分割してメモリに載せるようにしたり…</p>

<p><b class="speaker siraisi">白石:</b>うわー、それは大変そう…。</p>

<p><b class="speaker umeda">梅田:</b>最近はハードのスペックが向上したので、そういう苦労をすることも少なくはなってきましたけどね。あとは、レンダリングのパフォーマンスを改善するのも大変ですね。車載システムだと、最低でも60fpsは要求されるので、動画のデコードをハードウェアに行わせるようにするとか、CanvasをGPUレンダリングするとか。スクロールが滑らかになるようチューニングするのも大変でした。</p>

<p><b class="speaker siraisi">白石:</b>WebKitとChromiumは使い分けてるんですか？</p>

<p><b class="speaker umeda">梅田:</b>お客様からのご要望や、用途に応じて使い分けています。WebKitはリリースサイクルがだいたい年一回で安定していますが、Chromiumのリリースサイクルはもっと速くて、コードもどんどん変化していきます。どちらがいいということでもなくて、それぞれにメリットがありますね。</p>

<p><b class="speaker siraisi">白石:</b>大変興味深いお話です。組み込む製品ごとに異なる苦労とかはあったりするんですか？</p>

<p><b class="speaker umeda">梅田:</b> <strong>車の場合とかは、製品の開発サイクルが長い</strong>のが特徴です。一つの車を作るのに5年とかかかったりすることもあるので、何回もつなぎ込みが発生するわけです。</p>

<p><b class="speaker siraisi">白石:</b>5年！Webの世界で5年と言ったら、状況はかなり変わってしまいますよね。</p>

<p><b class="speaker umeda">梅田:</b>そうですね。ベースになっているブラウザもどんどん進化していくので、つなぎ込みを行うたびに、できるだけ最新に近づけていくようにするんです。その際に、ブラウザエンジンが持つAPIが変わってしまうことも珍しくありません。そういう事態に対応しやすいように、APIを抽象化したレイヤーを持っていたりします。</p>

<p><b class="speaker siraisi">白石:</b>いやー、ぼくみたいなフロントエンドエンジニアが全然体験したことのない苦労だ(笑)</p>

<p><b class="speaker umeda">梅田:</b>他には、ブラウザの機能を拡張しなくてはならないこともよくあります。組み込みの場合って、HTML5が元々持っている機能だけじゃ足りないことが多いんですよ。</p>

<p>ゲームの場合は、ゲーム機というハードに閉じているからか、独自に拡張することが多いのが特徴です。</p>

<p>車載の場合は、<a href="https://www.w3.org/TR/vehicle-information-api/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Vehicle API</a>っていうAPIがW3Cで標準化されていますので、その実装を行うのも仕事の一つです。このAPIを使うと、例えばキーロックの情報を取れたりと、車載システムならではの機能を利用することができます。</p>

<p><img src="/wp-content/uploads/2017/10/DSC05564.jpg" alt="" width="640" height="427" class="alignnone size-full wp-image-24653" srcset="/wp-content/uploads/2017/10/DSC05564.jpg 640w, /wp-content/uploads/2017/10/DSC05564-300x200.jpg 300w, /wp-content/uploads/2017/10/DSC05564-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>PCやスマホ「じゃない」Webアプリ開発とは</h2>

<p><b class="speaker siraisi">白石:</b>では最後に、PCやスマホじゃない世界でのWebアプリ開発について、どのようなものかお聞かせください。</p>

<p><b class="speaker umeda">梅田:</b>基本的には、それほど変わるところはありません。組み込みブラウザと言っても結局WebKitやChromiumをベースとしていますし、HTML5以降はブラウザ間の互換性も高くなっていますし。</p>

<p>ただ、市場によって制約はありますね。例えば車載システムで動作する場合は、運転手の気を逸らさないようUIガイドラインがあったりします。</p>

<p>一方で、市場ごとに特有の拡張機能を使うことも求められます。</p>

<p><b class="speaker siraisi">白石:</b>先ほどおっしゃっていた、車載システム上で使えるVehicle APIなどですね。</p>

<p><b class="speaker umeda">梅田:</b>そうです。そして、そうした標準化されたAPIと言うのは、組み込みの世界で特に重要なんです。</p>

<p>基本的にオープンなPC/スマホに比べて、組み込みは市場に特化しがちな世界でもあります。クローズドな世界で、クローズドな技術を使っているのでは、スキル的にもビジネス的にも拡がりにくい。</p>

<p>オープンで標準化されたAPIを使うことで、そうした事態を避けることができる。Web技術者も、活躍できる場がどんどん広がっていきます。</p>

<p><b class="speaker siraisi">白石:</b>なるほど。ちなみに、車載の世界とかでは、App Storeのようなアプリプラットフォームが出てくる可能性はあるのでしょうか？そして、Webで作ったアプリであればそれらのプラットフォームにどこでもデプロイできるというような可能性はありますか？</p>

<p><b class="speaker umeda">梅田:</b>はい、そういう可能性はもちろんあります。アプリプラットフォームみたいな構想は各社持っていて、今後登場してくるのは間違いありません。
その時に、Web技術を使ってアプリを開発できる可能性も、それが複数のプラットフォームで展開できる可能性も、大いにあると思います。</p>

<p>そうした世界を見据えて、総務省さんと一緒に「<a href="https://rp.kddi-research.jp/hackathon" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Webとクルマのハッカソン</a>」というイベントをここ数年開催しています。10月下旬から申し込み開始ですので、興味のある方にはどんどん参加してほしいですね。</p>

<p><b class="speaker siraisi">白石:</b>あ、そのイベント去年ぼくが審査員やったやつだ(笑)。去年もすごく盛り上がりましたよね。本日は組み込みブラウザ開発の話、そしてPC/スマホ以外のWeb開発の話など、普段あまり聞けないお話をお聞かせいただき、ありがとうございました！</p>

<p><img src="/wp-content/uploads/2017/10/DSC05548.jpg" alt="" width="640" height="416" class="alignnone size-full wp-image-24652" srcset="/wp-content/uploads/2017/10/DSC05548.jpg 640w, /wp-content/uploads/2017/10/DSC05548-300x195.jpg 300w, /wp-content/uploads/2017/10/DSC05548-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2017特集]]></series:name>
	</item>
		<item>
		<title>あなたはどこまで潜れるか？TypeScriptの世界にディープ・ダイブ！</title>
		<link>/shumpei-shiraishi/24660/</link>
		<pubDate>Tue, 07 Nov 2017 01:45:03 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[TypeScript]]></category>

		<guid isPermaLink="false">/?p=24660</guid>
		<description><![CDATA[連載： HTML5 Conference 2017特集 (13)こんにちは、編集長の白石です。 この記事は、9月24日に開催されたHTML5 Conference 2017に登壇したエキスパートに、お話されたセッションの...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2017/" class="series-457" title="HTML5 Conference 2017特集" data-wpel-link="internal">HTML5 Conference 2017特集</a> (13)</div><p>こんにちは、編集長の白石です。</p>

<p>この記事は、9月24日に開催された<a href="http://events.html5j.org/conference/2017/9/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference 2017</a>に登壇したエキスパートに、お話されたセッションのトピックを中心に語っていただこうとういものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。</p>

<p>今回お話を伺ったのは、株式会社サイバーエージェントの青野健利さんです。</p>

<p><img src="/wp-content/uploads/2017/11/aono_42A3712.jpg" alt="" width="640" height="413" class="alignnone size-full wp-image-24759" srcset="/wp-content/uploads/2017/11/aono_42A3712.jpg 640w, /wp-content/uploads/2017/11/aono_42A3712-300x194.jpg 300w, /wp-content/uploads/2017/11/aono_42A3712-207x134.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>青野さんのセッション「Deep dive into TypeScript」に関するスライド資料は、こちらで公開されています。</p>

<iframe class="embedly-embed" src="//cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fspeakerdeck.com%2Fplayer%2Fb93e09294cc14d749da9393bf2f03fd7&#038;url=https%3A%2F%2Fspeakerdeck.com%2Fbrn%2Fdeep-dive-into-typescript&#038;image=https%3A%2F%2Fspeakerd.s3.amazonaws.com%2Fpresentations%2Fb93e09294cc14d749da9393bf2f03fd7%2Fslide_0.jpg&#038;key=internal&#038;type=text%2Fhtml&#038;schema=speakerdeck" width="500" height="416" scrolling="no" frameborder="0" allowfullscreen></iframe>

<p>なお本稿のサンプルコードは、ほとんどが上記スライドから引用したものになります（一部説明を簡略化するため、青野さんの許可を得て筆者が書き換えた部分もあります）。</p>

<p><strong>
筆者からのお詫び: 今回のインタビュー、および対象セッションは大変内容が濃く、記事にすると長大になりすぎる＆スライド資料が大変参考になるため、<strong>「型」の話に絞った記事として再構成させていただきました</strong>。ご容赦ください。
</strong></p>

<h2>TypeScript、基本の基本</h2>

<p><b class="speaker siraisi">白石:</b> 青野さん、今日は取材をお受けいただきありがとうございます。まずは簡単に自己紹介をお願いします。</p>

<p><b class="speaker aono">青野:</b> はい、私は2010年ごろからWeb系の仕事に従事していまして、2011年からサイバーエージェントに所属しています。普段は広告系の部署で、チャットボットのツールを作ったりしています。</p>

<p><b class="speaker siraisi">白石:</b> 今回はTypeScriptについてお聞きできるということですが、仕事でもTypeScriptを使ってらっしゃるのですか？</p>

<p><b class="speaker aono">青野:</b> はい。というか、TypeScriptしか使っていません(笑)。</p>

<p><b class="speaker siraisi">白石:</b> なるほど(笑)。ではまずはTypeScriptについて、簡単に概要を教えていただけますか？</p>

<p><b class="speaker aono">青野:</b> TypeScriptとは、Microsoftが作ったJavaScriptのスーパーセットですね。特徴は静的型付けの言語だということ、あとはECMAScriptの新しい仕様を先取りしているというところですね。AltJSと呼ばれる言語の中では、頭一つ抜きん出て利用されている言語じゃないかと思います。</p>

<p><b class="speaker siraisi">白石:</b> 今回は「Deep Dive」というセッションタイトルでもあったとおり、かなり深いところまでお話されてそうですよね。私も普段TypeScriptは使っていますが、どこまで一緒に潜れるか、不安です(笑)。まずは簡単なところから教えてください。</p>

<p><b class="speaker aono">青野:</b> はい、まずは型についてお話しましょう。TypeScriptにおける型の最も大きな特徴は、コンパイル時にのみ評価されるということですね。コンパイルされた結果のJavaScriptは型を持たない言語ですから、当然型の情報は含まれていません。</p>

<p>また、TypeScriptは型を書かなくてもよい言語です。型推論があるので、変数の型が代入文から自動的に推論されます。また、<code>any</code>という型があって、この型の変数に対しては、どんなプロパティアクセスやメソッド呼び出しを行ってもコンパイルエラーになりません。</p>

<p>これらの特徴は、<strong>すべてJavaScriptとの統合を真面目に考えているからこそ</strong>です。既存のJavaScript資産を活かせるよう、そしてJavaScriptコードとの相互運用性を高く保てるよう、よく考えられています。</p>

<p><b class="speaker siraisi">白石:</b> 既存のJavaScript資産をTypeScriptでも使えるよう、型定義ファイルがコミュニティの手で作られていますよね。</p>

<p><b class="speaker aono">青野:</b> <a href="http://definitelytyped.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Definitely Typed</a>ですね。品質に多少の問題があるので賛否両論ではありますが、コミュニティの力が発揮された素晴らしい成果だと思います。</p>

<h2>Structual Subtyping</h2>

<p><b class="speaker siraisi">白石:</b> では、だんだん詳しい話題に踏み込みましょうか。</p>

<p><b class="speaker aono">青野:</b> はい、まず、TypeScriptの型システムは、<strong>Structual Subtyping</strong>を採用しているのが特徴です。これは、型の同一性を型の名前ではなく、型の構造だけで判断するというものです。</p>

<p>例えば、<code>x</code>と<code>y</code>というメンバーを持つ<code>Point2D</code>というインターフェースと、それを引数として受け取るメソッドがあったとします。</p>

<p>そのメソッドに渡すオブジェクトは、<code>x</code>と<code>y</code>というメンバーを持ってさえいれば、<code>Point2D</code>インターフェースを実装している必要はありません。</p>

<p></p><pre class="crayon-plain-tag">interface Point2D {
 x: number;
 y: number;
}
const point = {
 x: 0,
 y: 0
};
function acceptPoint2D(point: Point2D) {}
acceptPoint2D(point);</pre><p></p>

<p><b class="speaker siraisi">白石:</b> <strong><a href="https://ja.wikipedia.org/wiki/%E3%83%80%E3%83%83%E3%82%AF%E3%83%BB%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ダック・タイピング</a>の静的型付け版</strong>、みたいな感じですよね。</p>

<p>今、インターフェースの話が出ましたが、TypeScriptにおけるユーザー定義型についても教えてください。</p>

<p><b class="speaker aono">青野:</b> TypeScriptでは、型を定義するのにクラス、インターフェース、Enum（列挙型）のような機能があります。</p>

<p>ECMAScriptでも、6からはクラスを作れるようになりましたが、<strong>TypeScriptではより多くの機能を持ったクラスを使うことができます</strong>。例えばアクセス修飾子を付けて、プロパティやメソッドの公開範囲を限定することができたり、<code>readonly</code>キーワードを用いてイミュータブルなプロパティを作ることもできます。</p>

<p><strong>インターフェース</strong>はクラスが実装すべき規約を表すための機能です。<code>implements</code>というキーワードでクラスに付与すると、インターフェースが持つメソッドやプロパティを実装しないとコンパイルできなくなります。</p>

<p>TypeScriptのインターフェースはコンパイル時にのみ用いられます。出力されるJavaScriptコードには、インターフェースの情報は残りません。</p>

<p></p><pre class="crayon-plain-tag">// クラスの例。OtherClassを継承し、OtherInterfaceを実装している
// アクセス修飾子、staticプロパティ、readonlyプロパティなど、TypeScript固有の機能が多数ある
class MyClass extends OtherClass implements OtherInterface {
  public constructor() { super(); }
  protected methodFoo() { }
  private property: number = 1;
  public static methodFoo() { }
  private static property = 1;
  public get getter() {}
  public set setter(value: any) {}
  public get set prop() {}
  private readonly immutableProp: string = 'a';
}</pre><p></p>

<p><b class="speaker siraisi">白石:</b> <strong><code>type</code>というキーワードで型が作れます</strong>よね。インターフェースとの使い分けがいまいちよくわからないんですが。</p>

<p></p><pre class="crayon-plain-tag">// 以下のように型を作ることもできる
type MyType = {
  a: number;
};</pre><p></p>

<p><b class="speaker aono">青野:</b> <code>type</code>キーワードは、基本的には他の型のエイリアスを作るだけなんです。同様のことをインターフェースで実現できる場合は、インターフェースの利用が推奨されています。例えばtslintで、<code>type</code>の代わりにインターフェースを使うように強制することもできますね。</p>

<h2>ちょっと変わった型…文字列リテラル型、Index Type</h2>

<p><b class="speaker aono">青野:</b> ただ、<strong>文字列リテラル型</strong>（String Literal Type）を定義する場合は<code>type</code>キーワードを使う必要があります。</p>

<p><b class="speaker siraisi">白石:</b> だんだん深い話になってきましたね。文字列リテラル型というのは、型に文字列リテラルを指定できるっていうTypeScript独自の機能ですね。</p>

<p></p><pre class="crayon-plain-tag">// 'hello'か'world'しか代入できないHelloWorld型を定義
type HelloWorld = 'hello' | 'world';

// 以下の文はコンパイルエラー
const s: HelloWorld = 'good morning';</pre><p></p>

<p>他にも、<strong>Index Type</strong>というのもあります。この機能を使うと、プロパティが動的に変化するオブジェクトの場合も、コンパイラで可能な限り型チェックできるようになります。以下の例では、キーは文字列、その値も文字列となる動的な型を定義しています。</p>

<p></p><pre class="crayon-plain-tag">// Index Type
type StringMap = { [key: string]: string };</pre><p></p>

<p><b class="speaker siraisi">白石:</b> プロパティ名のところに<code>[name: type]</code>のように書くのがポイントですね。</p>

<h2>型の合成（Intersection Type）と型の結合（Union Type）</h2>

<p><b class="speaker aono">青野:</b> ほかに<code>type</code>を使用する必要があるのは、<strong>型の合成</strong>を行う場合です。</p>

<p><b class="speaker siraisi">白石:</b> 型の合成？</p>

<p><b class="speaker aono">青野:</b> はい、<code>Intersection Type</code>と言って、型の積集合を作る機能です。もっと簡単に言えば、二つの型を混ぜ合わせる機能ですね。使用方法は簡単で、二つ以上の型を&#8217;&amp;&#8217;でつなぐだけです。</p>

<p></p><pre class="crayon-plain-tag">// Insersection Type
type A = { x: number };
type B = { y: number };
// Point2Dはxとyをメンバーに持つ
type Point2D = A &amp; B;</pre><p></p>

<p>クラス、インターフェース、type宣言で作成した型など、様々な型を混ぜ合わせて新しい型を作ることが可能です。</p>

<p><b class="speaker siraisi">白石:</b> こんな機能あったんですね、知りませんでした。</p>

<p><b class="speaker aono">青野:</b> 他には<strong>Union Type</strong>といって、どちらかの型を排他的に持つ型を作ることもできます。こちらは、二つ以上の型を&#8217;|&#8217;でつなぐことで作ることができます。</p>

<p></p><pre class="crayon-plain-tag">// Union Type
type UnionType = string | number;</pre><p></p>

<p><b class="speaker siraisi">白石:</b> Union Typeは使ったことあります。いろんな型を受け取る関数を作るときとかに便利ですよね。</p>

<h2>総称型（ジェネリクス）</h2>

<p><b class="speaker aono">青野:</b> ジェネリクスは「総称型」とも呼ばれ、型をパラメータ化できるというものです。</p>

<p>総称型は、パラメータ化された型を外から与えられて、初めて実際の型が決まります。</p>

<p></p><pre class="crayon-plain-tag">// &lt;T&gt;が型パラメータを表す
class MyArray&lt;T&gt; {
  private arr: T[];
  public push(value: T) { this.arr.push(value); }
}
const numArr = new MyArray&lt;number&gt;();</pre><p></p>

<p>上の例で言うと「T」がパラメータ化された型ですね。<code>T</code>は、<code>MyArray</code>型を実際に使っている <code>new MyArray&lt;number&gt;()</code>のところで、<code>number</code>型を与えられています。</p>

<p>また、パラメータ化される型に「ある型を親として持っていなくてはならない」などの制約を設けることもできます。その場合は<code>extends</code>キーワードを用いて、以下のように型パラメータを記述します。</p>

<p></p><pre class="crayon-plain-tag">function fn&lt;T extends {x: number}&gt;(value: T) {
  // valueはプロパティxを確実に持っている
  return value.x + 1;
}</pre><p></p>

<p><b class="speaker siraisi">白石:</b> ジェネリクスはTypeScript固有の機能というわけではないですよね。C++やJava、C#など、静的型付けの言語はジェネリクスを備えるものも多い。</p>

<h2>Type Guard</h2>

<p><b class="speaker aono">青野:</b> Type Guardは、型をインテリジェントに絞り込む機能です。例えば以下のようなコードでは、<code>instanceof</code>や<code>typeof</code>で判定しているif文のブロック内では、変数をその型だと見なして、キャストせずに利用することができます。</p>

<p></p><pre class="crayon-plain-tag">function fn(
  x: Element | number | boolean
) {
  if (x instanceof Element) {
    // console.log((&lt;Element&gt;x).tagName);
    console.log(x.tagName);
  } else if (typeof x === 'boolean') {
    console.log(x);
  } else {
    // console.log((&lt;number&gt;x).toFixed(0));
    console.log(x.toFixed(0));
  }
}</pre><p></p>

<p><b class="speaker siraisi">白石:</b> あ、これは知ってますし、よく使いますね。最初この機能を知った時、最近のコンパイラは頭がいいなあ、と感動しました。</p>

<p><b class="speaker aono">青野:</b> さらにType Guardは、開発者が拡張することもできるんですよ。以下のような関数を用意しておくと、if文の条件式でこの関数を用いた時、そのブロック内では変数が<code>string</code>型として扱われます。</p>

<p></p><pre class="crayon-plain-tag">function isString(x: any): x is string {
  return typeof x === 'string';
}
let n = 'a';
if (isString(n)) {
  // キャストせずにstring型として扱える
  console.log(n.toUpperCase());
}</pre><p></p>

<p><b class="speaker siraisi">白石:</b> 戻り値の型に<code>&lt;仮引数名&gt; is &lt;型名&gt;</code>と指定するんですね。Type Guardを自作できるとは知りませんでした。</p>

<h2>never型</h2>

<p><b class="speaker aono">青野:</b> <strong>neverという型</strong>もあります。neverは決して到達できない、何も代入することのできない型を表します。例えば、必ずエラーをthrowする関数の戻り値型をnever型にしたり、到達することのないコードブロックの変数型がneverになったりします。</p>

<p></p><pre class="crayon-plain-tag">// 必ずエラーをthrowする関数
function test1(): never {
  throw new Error('error');
}
function test2(value: string | number) {
  if (typeof value === 'string') {
  } else if (typeof value === 'number') {
  } else {
    // 到達しないブロック
    // ここではvalueはnever型として扱われる
    value
  }
}</pre><p></p>

<p><b class="speaker siraisi">白石:</b> なんとなく分かる気はしますが、何の役に立つんですか？これ。</p>

<p><b class="speaker aono">青野:</b> 確かにわかりづらいですよね。<code>void</code>との違いがわからないという話もよく出ます。</p>

<p>ただ、以下の例を見るとわかりやすいんじゃないかと思います。例えば後者の特徴（到達することのないコードブロック内での変数型がneverになる）をうまく使うと、より型安全なコードを書くのに役立ったりします。</p>

<p></p><pre class="crayon-plain-tag">enum Test { KEY_1 = 1, KEY_2, KEY_3 }
function test(m: Test) {
  switch (m) {
    case Test.KEY_1:
      return 'key1';
    case Test.KEY_2:
      return 'key2';
    default;
      // Test.KEY_3のケースが存在するので、mはnever型ではない
      const check: never = m;
  }
}</pre><p></p>

<p><b class="speaker siraisi">白石:</b> なるほど、到達しないはずのコード位置で変数をneverとして扱うコードを書いておけば、コンパイラがコードの到達可能性をチェックしてくれるということですね。</p>

<h2>Mapped Type</h2>

<p><b class="speaker aono">青野:</b> Mapped Typeは、TypeScript 2.1から入った、比較的新しくてなかなか面白い機能です。この機能を使うと、<strong>他の型を元にして、型を動的に定義する</strong>ことができるんです。</p>

<p><b class="speaker siraisi">白石:</b> だいぶ深い話になってきたな…。型を動的に定義、とはどういうことですか？</p>

<p><b class="speaker aono">青野:</b> 例えば、「あるインターフェースがあって、そのプロパティすべてを<code>readonly</code>にした新しい型を作りたい」といった場合を考えてください。</p>

<p><b class="speaker siraisi">白石:</b> ああ、そういうのはありそうですね。でも、元のインターフェースを継承してもできないし、どうすればいいんですか？</p>

<p><b class="speaker aono">青野:</b> そういう場合TypeScriptでどうやるかというと、まず元のインターフェースのプロパティ名を全て含む型を作るんです。</p>

<p><code>keyof</code>というキーワードを使うと、型のプロパティ名を全て含む文字列リテラル型を取得できます。</p>

<p></p><pre class="crayon-plain-tag">interface MyInterface {
 a: string;
 b: number;
 c: boolean;
}
type AKeys = keyof MyInterface;
// AKeys = 'a' | 'b' | 'c'</pre><p></p>

<p><b class="speaker aono">青野:</b> そして、以下のように書くことで、全てのプロパティを<code>readonly</code>にした型を作ることができます。</p>

<p>・プロパティ名に<code>[P in AKeys]</code>と指定していること
・プロパティの型指定を行うところに<code>MyInterface[P]</code>を指定していること
・全てのプロパティの先頭に<code>readonly</code>が付与されること</p>

<p>がポイントになります。</p>

<p></p><pre class="crayon-plain-tag">type MyInterfaceClone = {
  readonly [P in AKeys]: MyInterface[P]
};
// MyInterfaceClone = {
//  readonly a: string;
//  readonly b: number;
//  readonly c: boolean;
// }</pre><p></p>

<p><b class="speaker siraisi">白石:</b> 元の型のプロパティをループしながら、新しい型を作るような感覚ですね。コンパイル時に、動的な処理を行って型を作っていっているような感覚ですね。</p>

<p><b class="speaker aono">青野:</b> こうしたテクニックを使うと、全部のプロパティを<code>Promise</code>でラップしたり、null許容型にしたりした新しい型を作るのも容易に行なえます。</p>

<p><b class="speaker siraisi">白石:</b> いやー、TypeScriptは型の定義方法がとても柔軟ですね…。しかし、だいぶ深いところまできた気がしますね。ぼく普段TypeScript使ってるのに、知らないこともたくさんありました。</p>

<p><b class="speaker aono">青野:</b> いや、実はこのスライドで紹介してるのは、私が重要だと判断したところだけで、TypeScriptにはまだまだ機能があります(笑)。</p>

<p><b class="speaker siraisi">白石:</b> ええっ、もう頭がいっぱいいっぱいなんですが…。</p>

<h2>Variance</h2>

<p><b class="speaker siraisi">白石:</b> もうちょっと頑張ります。ここからは、TypeScriptに今後搭載される予定の機能とかロードマップ、議論されている話について伺っていきたいと思います。</p>

<p><b class="speaker aono">青野:</b> はい、では一つ目の話題は「Variance」です。これは、「ある型と別の型が相互代入可能か」っていう関係性についてのお話です。</p>

<p>例えば、<code>Base</code>というクラスと、それを継承しているクラスがあったとして、それらの配列と、それらを仮引数にとる関数について、それぞれ相互代入可能かを考えてみましょう。</p>

<p></p><pre class="crayon-plain-tag">class Base {
 value = 1;
}
class Derived extends Base {
 otherValue = 2;
}
class Another extends Base {
 anotherValue = 3;
}</pre><p></p>

<p>以下は配列の場合です。親クラス型の配列（<code>baseAttr</code>）に、子クラス型の配列（<code>derivedArr</code>）は代入できます。これを共変の関係といいます。</p>

<p>親クラス型の配列変数に、子クラスの配列を代入するというのはよくあるシチュエーションです。配列が共変であるというのは、実用上の利便性が高いんです。</p>

<p>（筆者注: <a href="https://ja.wikipedia.org/wiki/%E5%85%B1%E5%A4%89%E6%80%A7%E3%81%A8%E5%8F%8D%E5%A4%89%E6%80%A7_(%E8%A8%88%E7%AE%97%E6%A9%9F%E7%A7%91%E5%AD%A6)" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Wikipediaの「共変性と反変性」の項目</a>も参照のこと）</p>

<p></p><pre class="crayon-plain-tag">declare let baseArr: Base[];
declare let derivedArr: Derived[];
// Covariant 共変
baseArr = derivedArr;
// Contravariant 反変 Error
// TypeScriptでは認められていない
derivedArr = baseArr;</pre><p></p>

<p>しかし、これらの型を仮引数に取る関数について考えてみましょう。この場合、どちらの方向の代入も成り立ってしまうのです。これを双変の関係といいます。</p>

<p></p><pre class="crayon-plain-tag">declare let processDerived: (derived: Derived) =&gt; void;
declare let processBase: (base: Base) =&gt; void;

// Bivariant 双変
processDerived = processBase;
processBase = processDerived;

// Runtime Error.
processBase(new Another())</pre><p></p>

<p>つまりTypeScriptは、配列については共変、関数については双変としているわけですが、これは実は型システムに矛盾を生じます（※）。
こうした矛盾はあえて受け入れたものであり、その理由は「配列の共変性」による利便性、実用性を重んじてのことでした（※）。</p>

<p>しかし実は、関数についての双変性をやめ、<a href="https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/in-generic-modifier" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">C#のように共変／反変をin/outパラメータで指定できる</a>ようにしてはどうか…という<a href="https://github.com/Microsoft/TypeScript/issues/10717" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">議論が持ち上がっています</a>。</p>

<p><b class="speaker siraisi">白石:</b> …む、むずかしい…</p>

<p><small>
※ここは、議論が詳細過ぎるため編集上割愛しました。詳しくは青野さんのスライドをご覧いただくくか、<a href="https://qiita.com/na-o-ys/items/aa56d678cdf0de2bdd79" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">なぜ TypeScript の型システムが健全性を諦めているか</a>というna-o-ysさんの記事が参考になると思います。
</small></p>

<h2>Unique Symbol型</h2>

<p>これからの展望としては、<strong>Unique Symbol型</strong>ですね。これは<code>const</code>な変数や<code>readonly</code>なプロパティを、クラスやインターフェース、typeのプロパティ名に使うことができます。</p>

<p></p><pre class="crayon-plain-tag">const x = "literal name";
const y = 1;
export interface A {
  [x]: string;
  [y]: string;
}</pre><p></p>

<p><b class="speaker siraisi">白石:</b> <a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Object_initializer" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Computed property names</a>を型宣言時に使えるような感じですね。</p>

<p><b class="speaker aono">青野:</b> ちなみに、ECMAScriptに<code>protocol</code>という機能を追加するって提案があります。Unique Symbol型とはあまり関連はありませんが、プロパティ名にシンボルを指定するというところから思い出しました。</p>

<p><b class="speaker siraisi">白石:</b> それはどういうものですか？</p>

<p><b class="speaker aono">青野:</b> インターフェースに近くて、<code>implements</code>するクラスに実装を強要するものです。複数のプロトコルを<code>implements</code>することもできます。</p>

<p><b class="speaker siraisi">白石:</b> 型の概念が薄いJavaScriptにも、ついにインターフェース相当のものが！でも、それなら<code>interface</code>ってキーワード使えばいいのに…。</p>

<p><b class="speaker aono">青野:</b> そうですねー。ただ、目的は似通っていますが、プロトコルは「シンボルの集合」という形で表現されたり、デフォルト実装を提供できたりと、結構違いはあります。</p>

<p><small>
※<a href="http://abcdef.gets.b6n.ch/entry/2017/10/12/142157" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">青野さんがその後書いてらっしゃったブログ記事</a>からの引用ですが、プロトコルは以下のように宣言／実装するそうです。
</small></p>

<p></p><pre class="crayon-plain-tag">protocol ProtocolName {
  // 実装が必要なシンボルを宣言
  thisMustBeImplemented;
}
  
class ClassName implements ProtocolName {
  [ProtocolName.thisMustBeImplemented]() {
    ...
  }
}</pre><p></p>

<h2>可変長型</h2>

<p><b class="speaker aono">青野:</b> ほかには、可変長型をサポートすることも予定されています。可変長型というのは、言ってみれば配列要素の型をまとめて保持する型です。</p>

<p><code>...T</code>のように記述することで可変長型を表すことができます。</p>

<p></p><pre class="crayon-plain-tag">function makeTuple&lt;...T&gt;(...ts: ...T): ...T {
  return ts;
}
const ts = makeTuple('a', 1, {x: 1});
// ...T = [string, number, {x: number}]</pre><p></p>

<p>可変長型のサポートにより、可変長引数を取る関数で引数の型を利用できたり、可変長の型パラメータを実装できます。</p>

<p>また、可変長型は<a href="https://www.typescriptlang.org/docs/handbook/basic-types.html#tuple" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">タプル</a>とも互換性があります。</p>

<p><b class="speaker siraisi">白石:</b> こんなアイデアまであるんですね…ぼくなんか、TypeScriptでタプル使えるの今まで知りませんでした(笑)。セッション内容の、型に関するお話だけでも、すごいボリュームになりました。。だいたいこんなところでしょうか…？</p>

<p><b class="speaker aono">青野:</b> そうですね、他には<strong>Structual Subtyping</strong>以外の型システム、例えば<a href="https://en.wikipedia.org/wiki/Nominal_type_system" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Nominal Typing</a>などを許容しよう（※）という<a href="https://github.com/Microsoft/TypeScript/issues/202" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">話もあります</a>が…まだ実装の同意は取れてない状態ですね。</p>

<p><b class="speaker siraisi">白石:</b> もうお腹いっぱいです(笑)。大変詳しい話を聞かせていただき、今日はありがとうございました！</p>

<p><DIV align=right>（撮影：刑部友康 写真提供：html5j HTML5 Conference 2017事務局）</div></p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2017特集]]></series:name>
	</item>
		<item>
		<title>Nintendo Switchの中ではReactが動いてる！Nintendo eShop開発秘話を聞いてきた</title>
		<link>/shumpei-shiraishi/24538/</link>
		<pubDate>Mon, 06 Nov 2017 01:03:30 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[Nintendo Switch]]></category>
		<category><![CDATA[Nintendo eShop]]></category>
		<category><![CDATA[ゲーム]]></category>
		<category><![CDATA[任天堂]]></category>

		<guid isPermaLink="false">/?p=24538</guid>
		<description><![CDATA[連載： HTML5 Conference 2017特集 (11) こんにちは、編集長の白石です。 この記事は、9月24日に開催されたHTML5 Conference 2017に登壇したエキスパートに、お話されたセッション...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2017/" class="series-457" title="HTML5 Conference 2017特集" data-wpel-link="internal">HTML5 Conference 2017特集</a> (11)</div><p><style>
.siraisi {
  background: url(/wp-content/uploads/2017/10/siraisi.png) no-repeat;
}
.horikawa {
  background: url(/wp-content/uploads/2017/10/horikawa.png) no-repeat;
}
.tsuda {
  background: url(/wp-content/uploads/2017/10/tsuda.png) no-repeat;
}
.post-detail-contents p {
    text-indent: 0;
    clear: left;
    margin-bottom: 2em;
    overflow: hidden;
}
b.speaker {
    background-size: 48px;
    display: inline-block;
    width: 48px;
    height: 18px;
    float: left;
    padding-right: 8px;
    padding-top: 48px;
    text-align: center;
    font-size: 12px;
    margin-bottom: 4px;
    font-weight: normal;
    clear: left;
}
</style>
こんにちは、編集長の白石です。</p>

<p>この記事は、9月24日に開催された<a href="http://events.html5j.org/conference/2017/9/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference 2017</a>に登壇したエキスパートに、お話されたセッションのトピックを中心に語っていただこうとういものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。</p>

<p>今回は、「Nintendo SwitchとWeb」という講演をされていた任天堂さんに、Switch開発におけるWeb技術の活用方法や、開発秘話を伺ってきました。任天堂のお二人は京都から、リモートでの取材に応じていただきました。</p>

<div id="attachment_24569" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/10/title-640x427.jpg" alt="HTML5 Conferenceのセッション会場は超満員（写真提供: html5j）" width="640" height="427" class="size-large wp-image-24569" srcset="/wp-content/uploads/2017/10/title.jpg 640w, /wp-content/uploads/2017/10/title-300x200.jpg 300w, /wp-content/uploads/2017/10/title-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">HTML5 Conferenceのセッション会場は超満員（写真提供: html5j）</p></div>

<div id="attachment_24565" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/10/speakers-640x427.jpg" alt="任天堂株式会社 企画制作部 フロントエンドエンジニア 堀川雄司氏（左） 企画制作部 ディレクター 津田 宗孝氏（右）  （写真提供: html5j）" width="640" height="427" class="size-large wp-image-24565" srcset="/wp-content/uploads/2017/10/speakers.jpg 640w, /wp-content/uploads/2017/10/speakers-300x200.jpg 300w, /wp-content/uploads/2017/10/speakers-207x138.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">任天堂株式会社 企画制作部 フロントエンドエンジニア 堀川雄司氏（左）<br />企画制作部 ディレクター 津田 宗孝氏（右）<br />（写真提供: html5j）<br /></p></div>

<h2>Nintendo SwitchではWeb技術が大活躍！</h2>

<p><b class="speaker siraisi">白石</b> 簡単に自己紹介をお願いできますか？</p>

<p><b class="speaker tsuda">津田</b> 企画制作部ディレクターの津田です。2011年に入社し、Switchでは、各種ネットワークサービス、コンポーネントブラウザーや本体内蔵ソフトのディレクション関係に携わってきました。</p>

<p><b class="speaker horikawa">堀川</b> 同じく企画制作部で、フロントエンドエンジニアの堀川です。私は2013年に入社し、ゲームソフトのダウンロード販売を行う、Nintendo eShopやゲーム連動サービスなどのWebサービスの開発を行っています。</p>

<p><b class="speaker siraisi">白石</b> ぼく全然ゲームをやらないもので、ゲーム機の中身がどうなっているのか全然知らないんです。<strong>Nintendo SwitchではWeb技術がかなり使われている</strong>、というだけでも驚きでした。</p>

<p><b class="speaker tsuda">津田</b> <strong>Nintendo Switchには、WebKitをベースとしたブラウザーコンポーネントが搭載されている</strong>んですよ。それを、スマートフォンで言うところの「WebView」のように、ゲームや本体内蔵ソフトからブラウザコンポーネントとして使うことができます。</p>

<p><b class="speaker siraisi">白石</b> そうなんですか！そのブラウザって、どのように活用されているんですか？</p>

<p><b class="speaker tsuda">津田</b> 活用の方法としては、まずは<strong>スマートフォンとの連携</strong>ですね。</p>

<p>例えばいろんな情報を入力する場合など、普段使い慣れているスマートフォンで入力していただくほうがスムーズに進めていただけます。ユーザーも慣れていますし。
なので、例えば「ニンテンドーアカウント」（※）を作成するときとかは、ゲーム機で行うのはメールアドレスを入れるところまでです。
以降の入力の大半はスマホで行えるようになっています。</p>

<p><small>
※ニンテンドーアカウント…任天堂が提供する各種サービスを利用するためのアカウント。インターネット対戦を行う際などに必要とされる
</small></p>

<p><img src="/wp-content/uploads/2017/10/nintendo-account-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24560" srcset="/wp-content/uploads/2017/10/nintendo-account.png 640w, /wp-content/uploads/2017/10/nintendo-account-300x169.png 300w, /wp-content/uploads/2017/10/nintendo-account-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b> スマホとSwitchで、得意分野を補い合っているんですね。</p>

<p><b class="speaker horikawa">堀川</b> ほかには、Switchにはゲームの画面を撮影する機能があるのですが、撮影した画面写真と動画をSNSに投稿する場合などにも、Webの仕組みを使っています。具体的には、クラウド上の中間サーバーにテキストや画像のデータを送信するのに、ブラウザをクライアントとして用いています。</p>

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

<p><b class="speaker siraisi">白石</b> なるほど、そういうクラウドのクライアントとしての処理も確かにWebのほうがやりやすそうですね。</p>

<p><b class="speaker tsuda">津田</b> それだけじゃありません。<strong>ゲーム内のコンテンツにも、HTMLやCSSなどのWebコンテンツは入っています</strong>よ。
まず気付くことはないと思いますが、普段のゲーム画面でも、Webブラウザで作った画面がさり気なく使われていたりします。</p>

<p><img src="/wp-content/uploads/2017/10/01-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24642" srcset="/wp-content/uploads/2017/10/01.png 640w, /wp-content/uploads/2017/10/01-300x169.png 300w, /wp-content/uploads/2017/10/01-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b> おお、これ途中からWebに切り替わってるんですよね？すごくシームレスで、ネイティブで作られた画面とほとんど区別がつかないですね。
でも、なんでここだけWeb技術を使っているんですか？</p>

<p><b class="speaker tsuda">津田</b> いわゆるゲームの画面と異なり、こういった文字の多いドキュメント画面で、特に多言語展開するケースにおいては、ゲームのNativeプログラムで作るより非常に早く開発することができるんですよね。</p>

<p><b class="speaker siraisi">白石</b> なるほど、スマホとの連携、クラウドへのデータ送信、多言語コンテンツなど、Webが得意な部分についてはWebを積極的に使ってらっしゃるということですね。</p>

<p><b class="speaker tsuda">津田</b> はい。私たちのチームでは「<strong>世界中のユーザーとゲームを繋げる</strong>」というビジョンがあるんです。その「繋げる」をこれまで以上に大きく広げるために、Webを積極的に使っているという流れです。当日のセッションではこれ以外にも、スマートフォンアプリの「Nintendo みまもりSwitch」や「Nintendo Switch Online」といったアプリでも、Webを様々な形で活用している例をご紹介しました。</p>

<p><img src="/wp-content/uploads/2017/10/mission-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24554" srcset="/wp-content/uploads/2017/10/mission.png 640w, /wp-content/uploads/2017/10/mission-300x169.png 300w, /wp-content/uploads/2017/10/mission-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>Nintendo eShopはReactで作られている！</h2>

<p><b class="speaker siraisi">白石</b> 今回のセッションでは、Nintendo eShopというサービスの構築に関するお話が中心だったそうですね。</p>

<p><b class="speaker tsuda">津田</b> はい、Nintendo eShopというのは、Nintendo Switch上でゲームソフトを購入するためのオンラインショップです。Switchを持っていないときにでも、スマホなどからゲームソフトを購入できるようなサービスも提供しています。両者ともWebで作られています。</p>

<p><img src="/wp-content/uploads/2017/10/shop-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24656" srcset="/wp-content/uploads/2017/10/shop.png 640w, /wp-content/uploads/2017/10/shop-300x169.png 300w, /wp-content/uploads/2017/10/shop-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b> そういうマルチプラットフォーム的な展開は、Webの最も得意とするところですよね。</p>

<p><b class="speaker horikawa">堀川</b> そうです。スマートフォンやPCから見えるところはレスポンシブに作っていて、コードもかなりの部分が共有できています。ゲーム機で操作する場合はボタンでの操作になるので、多少は異なるコードが使われていますけどね。</p>

<p>eShopは、Webアプリとしてはかなり大規模と言って差し支えないレベルだと思いますが、アーキテクチャとしては全体的に統一されています。<strong>アーキテクチャの基盤としてはReactを使っています</strong>。</p>

<p><b class="speaker siraisi">白石</b> おお、Reactが使われてるんですか！Nintendo Switchの中でReactが動いているって、Web技術者としてはちょっと胸が熱くなりますね。
eShopは、どういう流れで作られたんでしょうか？</p>

<p><b class="speaker horikawa">堀川</b> プロジェクトの発足は2015年末です。Switchが発売されたのが2017年3月ですから、その1年ちょっと前からプロジェクトが始まったということになりますね。
eShopを作るにあたって私たちがよりどころにしたのは、<strong>「すぐに」というキーワード</strong>です。</p>

<h2>Nintendo eShopを支える、3つの「すぐに」</h2>

<p><b class="speaker siraisi">白石</b> 「すぐに」ですか？</p>

<p><b class="speaker horikawa">堀川</b> はい。具体的には「<strong>すぐに出会える</strong>」「<strong>すぐに買える</strong>」「<strong>すぐに改善</strong>」の3つを満たすショップであるべき、と考えて開発に臨みました。</p>

<p><img src="/wp-content/uploads/2017/10/suguni-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24568" srcset="/wp-content/uploads/2017/10/suguni.png 640w, /wp-content/uploads/2017/10/suguni-300x169.png 300w, /wp-content/uploads/2017/10/suguni-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>まず「<strong>すぐに出会える</strong>」というのは、「購入したい商品にすぐに出会える」ということです。
ゲームの魅力を少しでも正確に、多くの方に伝えて、「購入したい」と思っていただきたいということですね。</p>

<p>そのため、以前はショップ内に閉じていたゲームのプロモーションを、Switchの待ち受け画面で表示される「ゲームニュース」に任せることにしました。</p>

<p><img src="/wp-content/uploads/2017/10/game-news-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24552" srcset="/wp-content/uploads/2017/10/game-news.png 640w, /wp-content/uploads/2017/10/game-news-300x169.png 300w, /wp-content/uploads/2017/10/game-news-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>UIに関しても全面的に見直し、欲しいゲームにすぐに出会えるようにUIポリシーを再構築しました。</p>

<p><img src="/wp-content/uploads/2017/10/new-ui-policy-640x362.png" alt="" width="640" height="362" class="aligncenter size-large wp-image-24559" srcset="/wp-content/uploads/2017/10/new-ui-policy.png 640w, /wp-content/uploads/2017/10/new-ui-policy-300x170.png 300w, /wp-content/uploads/2017/10/new-ui-policy-207x117.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>「<strong>すぐに買える</strong>」というのは、「買いたい」と思ったらすぐに買えるような場所でありたいと思いました。そこで、Switch上の様々な場所からeShopに行くことができるように導線をはりめぐらしました。</p>

<p><img src="/wp-content/uploads/2017/10/conductor-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24544" srcset="/wp-content/uploads/2017/10/conductor.png 640w, /wp-content/uploads/2017/10/conductor-300x169.png 300w, /wp-content/uploads/2017/10/conductor-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker horikawa">堀川</b> また、ゲームを買おうかなと思って購入画面にいくと、全く別の印象をもった「システム画面」っぽかったりすると、ゲームを買いたいという熱が冷めてしまいます。<strong>そこでゲーム画面と購入画面をできるだけシームレスに見えるようなデザインを目指しました</strong>。</p>

<p><img src="/wp-content/uploads/2017/10/netsu-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24558" srcset="/wp-content/uploads/2017/10/netsu.png 640w, /wp-content/uploads/2017/10/netsu-300x169.png 300w, /wp-content/uploads/2017/10/netsu-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>しかしゲームの数は非常に多いので、そのそれぞれに手作業で背景色を指定したりするのは、非常に骨が折れます。</p>

<p>なので私たちは独自のアルゴリズムで、ゲームの画面イメージから色を自動で抽出し、背景色に指定するという処理を行っています。
私たちはこの処理で抽出したカラーパレットを自動的に生成できるように開発し、ゲームの魅力や個性を尊重しつつ、開発の効率を向上させることに成功しました。</p>

<p><img src="/wp-content/uploads/2017/10/dominant-color-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24549" srcset="/wp-content/uploads/2017/10/dominant-color.png 640w, /wp-content/uploads/2017/10/dominant-color-300x169.png 300w, /wp-content/uploads/2017/10/dominant-color-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b> これ、画像の中で一番使われている色を選んでいるというわけでもなさそうですね。ちゃんとゲームの特徴を捉えた色が選ばれている。どうやってるんですか…？</p>

<p><b class="speaker horikawa">堀川</b> そこは企業秘密です(笑)。</p>

<h2>そしてWebとReactが選ばれた</h2>

<p><b class="speaker horikawa">堀川</b> 最後は「<strong>すぐに改善</strong>」です。eShopは長期に渡って運営し、成長させていくプロジェクト。</p>

<p>eShopは、数多くの言語や国と地域に対応させていく必要がありますので、言語だけでなく、税率や通貨などの国際化も必要です。
それらの地域で例えば税率が変更されたりしたら、すぐに修正していけるような開発環境を構築していく必要がありました。</p>

<p>そういう改善のしやすさと、長期的な成長の土台を作るために開発環境の選定を行いまして、2015年末に「Webしかない」という決定を下したんです。</p>

<p><b class="speaker siraisi">白石</b> 確かに、そういう変更と反映のしやすさはWebの利点ですね。</p>

<p><b class="speaker horikawa">堀川</b> Webで行くと決まってからは、改善しやすい設計とパフォーマンスを両立させるために、ライブラリの選定を行いました。</p>

<p>使い勝手の面を考えるとシングル・ページ・アプリケーションが望ましかった。
また、Nintendo Switchは「サクサク動く」ことも大事にしていますので、パフォーマンスが良いことも重要です。
そうして、<strong>結局私たちが選んだのはReactとReduxの組み合わせ</strong>でした。</p>

<p><img src="/wp-content/uploads/2017/10/reactredux-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24562" srcset="/wp-content/uploads/2017/10/reactredux.png 640w, /wp-content/uploads/2017/10/reactredux-300x169.png 300w, /wp-content/uploads/2017/10/reactredux-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b> 2015年末くらいにそれを選ばれたというのは、かなり新しめの取り組みでしたよね、きっと。</p>

<p><b class="speaker horikawa">堀川</b> はい、私たちはその時点で最善と思われる手法を、積極的に採用しています。
Reactを使う場合は、いろんなライブラリを組み合わせて使うのが普通です。以下が、私たちが使っているライブラリの一例です。</p>

<p><img src="/wp-content/uploads/2017/10/react-libs-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24561" srcset="/wp-content/uploads/2017/10/react-libs.png 640w, /wp-content/uploads/2017/10/react-libs-300x169.png 300w, /wp-content/uploads/2017/10/react-libs-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b> Reactを徹底して使われたということがわかります。大規模なWebアプリを作るのに、Reactを使ってみていかがでしたか？</p>

<p><b class="speaker horikawa">堀川</b> やはり、コンポーネント指向での開発は、様々な利点があると感じました。コンポーネント単位でのテストは容易ですし、再利用性も向上します。
CSS Modulesを使ったおかげで、大規模サイトにもかかわらずCSS設計が破綻しなかったのも良かったですね。</p>

<p><img src="/wp-content/uploads/2017/10/component-oriented-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24543" srcset="/wp-content/uploads/2017/10/component-oriented.png 640w, /wp-content/uploads/2017/10/component-oriented-300x169.png 300w, /wp-content/uploads/2017/10/component-oriented-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>Nintendo eShop開発秘話（1）: デザイナーとエンジニアの間に溝が！</h2>

<p><b class="speaker siraisi">白石</b> eShopの開発を行うにあたって、いろんな課題にぶつかったんじゃないかと思うのですが、実際にはいかがでしたか？</p>

<p><b class="speaker horikawa">堀川</b> まず開発初期の段階で、<strong>コンポーネント指向を巡って、デザイナーとエンジニアの間で溝ができてしまった</strong>のは頭を悩ませました。</p>

<p><b class="speaker siraisi">白石</b> コンポーネント指向で溝、ですか。</p>

<p><b class="speaker horikawa">堀川</b> はい。コンポーネント開発を進める上で何を共通化するのかで、デザイナーとエンジニアの間で感覚が全然違ったんですね。ぼくらは最初、それに気づいていませんでした。</p>

<p>デザイナーはコンポーネントに分割することで、「見た目」「体験」を共通化できるものと考えます。だから、見た目が異なる場合は違うコンポーネントになると考える。</p>

<p>一方エンジニアは、「内部」「機能」を共通化するものだと考えがちです。なので、「価格を表示する」というコンポーネントがあるとすると、それをできるだけ再利用しようとする。</p>

<p>だから例えば、デザイナーが「画面によっては価格を目立たせたいから、違うデザインにしたい」と伝えても、エンジニアは「価格を表示するという機能が共通なのだから、同じコンポーネントで」と考えてしまい、コミュニケーションに溝ができてしまうんです。</p>

<p><img src="/wp-content/uploads/2017/10/conv1-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24546" srcset="/wp-content/uploads/2017/10/conv1.png 640w, /wp-content/uploads/2017/10/conv1-300x169.png 300w, /wp-content/uploads/2017/10/conv1-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><img src="/wp-content/uploads/2017/10/conv2-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24547" srcset="/wp-content/uploads/2017/10/conv2.png 640w, /wp-content/uploads/2017/10/conv2-300x169.png 300w, /wp-content/uploads/2017/10/conv2-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b> 「共通化」と言っても、それぞれの立場で重視するものが違うから、「何を共通化するか」の感覚も違ったと。</p>

<p><b class="speaker horikawa">堀川</b> そうしたコミュニケーションの溝を埋めるために試行錯誤した結果、結局、全体のモックアップを先に開発することにしました。
このときはReactも使わずに、デザイナーが作ったデザインカンプを元に、プレーンなHTMLとCSSを使って作りました。</p>

<p><img src="/wp-content/uploads/2017/10/mockup-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24557" srcset="/wp-content/uploads/2017/10/mockup.png 640w, /wp-content/uploads/2017/10/mockup-300x169.png 300w, /wp-content/uploads/2017/10/mockup-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>こうして、開発するもののイメージを先に合わせておくことで、デザイナーとエンジニアの認識のズレを抑えることができました。</p>

<p><b class="speaker siraisi">白石</b> なるほど、ゴールイメージの共有を行うことで、認識のズレが解消されたわけだ。</p>

<p><b class="speaker horikawa">堀川</b> そうです。特にeShopは、既存のサービスも既にありましたので、ゴールイメージは共有できているものと何となく思っていたんですよね。問題の原因にはそうした思い込みもあったと思います。</p>

<p>ほかにチーム内の意識を共有するためにやったこととしては、コンポーネントのカタログを作ることですね。<a href="https://github.com/storybooks/storybook" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Storybook</a>を使用すると、アプリケーション外で動作するReactコンポーネントのカタログを作れます。コンポーネントの動作を簡単に確認できるので、非常に便利でした。</p>

<p><img src="/wp-content/uploads/2017/10/storybook-1-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24657" srcset="/wp-content/uploads/2017/10/storybook-1.png 640w, /wp-content/uploads/2017/10/storybook-1-300x169.png 300w, /wp-content/uploads/2017/10/storybook-1-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b> Storybookって初めて知りました。便利そうですねーこれ。</p>

<h2>Nintendo eShop開発秘話（2）: 仕様が複雑すぎる！</h2>

<p><b class="speaker horikawa">堀川</b> 次に、eShopを設計するにあたっては、<strong>ユーザーストーリー（※）を中心としました</strong>。例えばこういうユーザーストーリーです。</p>

<p><img src="/wp-content/uploads/2017/10/user-story-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24572" srcset="/wp-content/uploads/2017/10/user-story.png 640w, /wp-content/uploads/2017/10/user-story-300x169.png 300w, /wp-content/uploads/2017/10/user-story-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>※ユーザーストーリー…ユーザーがシステムを通じて達成できることを書き下した文章</p>

<p><b class="speaker siraisi">白石</b> なるほど、結構粒度細かいですね。この粒度だと、ユーザーストーリーの数がかなり多くなったのではないでしょうか？</p>

<p><b class="speaker horikawa">堀川</b> はい、かなりの数です。ユーザーストーリーはスプレッドシートで一覧にして管理していたのですが、実際にはこんな感じです。</p>

<p><img src="/wp-content/uploads/2017/10/user-stories-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24571" srcset="/wp-content/uploads/2017/10/user-stories.png 640w, /wp-content/uploads/2017/10/user-stories-300x169.png 300w, /wp-content/uploads/2017/10/user-stories-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b> おー、すごい！実際の開発に使われていたスプレッドシートとか見ると、テンション上がりますね(笑) ストーリー以外にも、いろんな情報が書き込まれていますね。</p>

<p><b class="speaker horikawa">堀川</b> はい、テストケースや品質目標も、全部ユーザーストーリーを中心に組み立てていったので。</p>

<p>品質目標というのは、「Never（あってはならない）」「Must（できなければいけない）」「Want（あったらいいな）」という項目をストーリーに付与できるようにしたものです。これで、ストーリーに基づくユーザー体験を一定品質で保証できるようにしました。</p>

<p><b class="speaker siraisi">白石</b> モックも作って、設計も入念に…って、設計段階で品質を上げようとする努力がすごいですね。</p>

<p><b class="speaker horikawa">堀川</b> いえ、まだあります。テスターに早くから協力してもらったのも、eShopの品質の上では重要でした。</p>

<p>eShopは先ほども申し上げた通り、数多くの国と言語を扱わなければなりません。実際にはそれに加えて法律や通貨、決済方法なども考慮に入れて仕様を作っていく必要があります。だから仕様がどうしても複雑になってしまうんですよね。</p>

<p><img src="/wp-content/uploads/2017/10/complex-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24542" srcset="/wp-content/uploads/2017/10/complex.png 640w, /wp-content/uploads/2017/10/complex-300x169.png 300w, /wp-content/uploads/2017/10/complex-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>なので、テストのプロが仕様を決める段階でチェックをするようにして、早い段階で重大な考慮漏れに気付けるようにしたわけです。</p>

<p><img src="/wp-content/uploads/2017/10/conv3-640x368.png" alt="" width="640" height="368" class="aligncenter size-large wp-image-24548" srcset="/wp-content/uploads/2017/10/conv3.png 640w, /wp-content/uploads/2017/10/conv3-300x173.png 300w, /wp-content/uploads/2017/10/conv3-207x119.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石</b> このスライドにあるような事柄を、全部エンジニアが一人で考えて仕様に落とすのはさすがに難しいですもんね。</p>

<h2>Nintendo eShop開発秘話（3）: 最後は「お祭り」！そして任天堂がWebに期待すること</h2>

<p><b class="speaker horikawa">堀川</b> リリースまであと半年っていう段階で、大変なことが判明しまして。<strong>Switch上で、OSからWebまで統合して動かしてみたら、全然期待するパフォーマンスが出ないし、尋常なく不安定で遅かった</strong>んですよ。起動も遅いし、不安定だし。</p>

<p><b class="speaker siraisi">白石</b> えー！それはゾッとする話ですね…</p>

<p><b class="speaker horikawa">堀川</b> 大問題だったので、全チームに呼びかけて助けを求めました。SDK/OSプログラマ、本体アプリプログラマ、ブラウザーエンジニア、サーバエンジニア、デザイナー…。弊社は、多くの関係者が一つの建物にいるので課題の共有が早くできるため、結果的に改善も早くできるのがすごくいいところです。</p>

<p><img src="/wp-content/uploads/2017/10/festa-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24551" srcset="/wp-content/uploads/2017/10/festa.png 640w, /wp-content/uploads/2017/10/festa-300x169.png 300w, /wp-content/uploads/2017/10/festa-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>全員が1つの目標に向かってアイデアを出し合いました。エンジニアは最適化のアイデアを。デザイナーは起動アニメを工夫して、起動待ちのストレスを軽減しました。
<strong>まさにこれは「お祭り」</strong>という感じでしたね。誤解のないようにお伝えしておくと、お祭りとは「炎上」ではありません。力の結集なんです。</p>

<p>我々はWebサービスを作る上で、フロントエンド、バックエンドだけではなく、ブラウザー、OS、そしてゲームソフトやハードまであらゆる関係者全員の力を結集してプラットフォーム、そしてプロダクト、サービス、コンテンツを生み出しています。非常にダイナミックな体験ができます。</p>

<p>無事、2017年3月、Nintendo Switchの発売にこぎつけることができたのは、こうした全員参加の「お祭り」あってこそだったんです。</p>

<p><b class="speaker siraisi">白石</b> Nintendo Switch発売の裏側で、そんなことが起きていたとは、聞いていてちょっと感動的でもありました。もっといろいろお話を聞きたいところですが、残念ながらそろそろお時間になってしまいました。最後の質問です。HTML5Experts.jpはWeb技術者向けの媒体ですので、任天堂さんがWebに期待していることを教えていただけますか？</p>

<p><b class="speaker tsuda">津田</b> それはやはり、最初に申し上げた「世界中のユーザーとゲームをつなげる」というビジョンに尽きます。あらゆる人々やあらゆるコンテンツを、デバイスを超えてつなぐことができるのは、Webは最適だと思っています。</p>

<p><img src="/wp-content/uploads/2017/10/mission2-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24555" srcset="/wp-content/uploads/2017/10/mission2.png 640w, /wp-content/uploads/2017/10/mission2-300x169.png 300w, /wp-content/uploads/2017/10/mission2-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker horikawa">堀川</b> そして、Webの世界は進化が速いですが、ビジョンをより高いレベルで達成するためにも、私たちも常に最善の手法を採用して、より優れたWebサービスを開発していきたいと思います。弊社ではフロントエンジニアを募集しておりますので、一緒に開発してくれる方をお待ちしてます。</p>

<p><b class="speaker siraisi">白石</b> 本日は、大変興味深いお話をどうもありがとうございました！</p>

<p><b>堀川/津田:</b> こちらこそ取材いただきまして、ありがとうございました。</p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2017特集]]></series:name>
	</item>
		<item>
		<title>Webアプリのアクセシビリティを追求せよ！「インクルーシブ」なマークアップを議論しながら学んでみた</title>
		<link>/shumpei-shiraishi/24671/</link>
		<pubDate>Thu, 02 Nov 2017 09:07:28 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[デザイン]]></category>
		<category><![CDATA[サイト制作]]></category>
		<category><![CDATA[アクセシビリティ]]></category>
		<category><![CDATA[マークアップ]]></category>

		<guid isPermaLink="false">/?p=24671</guid>
		<description><![CDATA[連載： HTML5 Conference 2017特集 (10) こんにちは、編集長の白石です。 この記事は、9月24日に開催されたHTML5 Conference 2017に登壇したエキスパートに、お話されたセッション...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2017/" class="series-457" title="HTML5 Conference 2017特集" data-wpel-link="internal">HTML5 Conference 2017特集</a> (10)</div><p><style>
iframe.slide {
  width: 320px;
  height: 189px;
}
@media (min-width: 768px) {
  iframe.slide {
    width: 600px;
    height: 355px;
  }
}
</style></p>

<p>こんにちは、編集長の白石です。</p>

<p>この記事は、9月24日に開催された<a href="http://events.html5j.org/conference/2017/9/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference 2017</a>に登壇したエキスパートに、お話されたセッションのトピックを中心に語っていただこうとういものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。</p>

<p>今回お話を伺ったのは、freeeの伊原力也さんと、ビジネス・アーキテクツの太田良典さんです。</p>

<p><img src="/wp-content/uploads/2017/11/42A4910.jpg" alt="" width="640" height="401" class="alignnone size-full wp-image-24714" srcset="/wp-content/uploads/2017/11/42A4910.jpg 640w, /wp-content/uploads/2017/11/42A4910-300x188.jpg 300w, /wp-content/uploads/2017/11/42A4910-207x130.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>お二人のセッション「多様なユーザーニーズに応えるフロントエンドデザインパターン〜書籍「インクルーシブ HTML + CSS &amp; JavaScript」より」に関するスライド資料は、こちらで公開されています。</p>

<iframe class="slide" src="https://docs.google.com/presentation/d/e/2PACX-1vTovsRiX8lB4Fb5J6PJIZAEE4suzO9PMzWOvdqxHbhrfmrvFn97arnD-ZCBifgm3z0a-rzLyZEo5jCj/embed?start=false&#038;loop=false&#038;delayms=3000" frameborder="0" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>

<h2>「インクルーシブ」に込められた意味とは？</h2>

<p><b class="speaker siraisi">白石:</b> 今回は取材をお受けいただきありがとうございました！簡単に自己紹介をお願いします。</p>

<p><b class="speaker ota">太田:</b> ビジネス・アーキテクツに所属している太田です。大規模企業サイトの構築、ガイドライン策定などを行ってきました。</p>

<p>Webアクセシビリティ関連に昔から取り組んでいまして、「<a href="http://waic.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Webアクセシビリティ基盤委員会</a>」の翻訳作業部会主査を担当しています。</p>

<p><img src="/wp-content/uploads/2017/11/42A4913.jpg" alt="" width="640" height="397" class="alignnone size-full wp-image-24709" srcset="/wp-content/uploads/2017/11/42A4913.jpg 640w, /wp-content/uploads/2017/11/42A4913-300x186.jpg 300w, /wp-content/uploads/2017/11/42A4913-207x128.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><br><strong>▲株式会社ビジネス・アーキテクツ 太田良典さん</strong><span style="font-size: 80%;">　　※写真提供：html5j [HTML5 Conference 2017事務局</span></p>

<p><b class="speaker ihara">伊原:</b> freee株式会社の伊原です。Webサイトやアプリケーションの情報設計を行っています。私も<a href="http://waic.jp/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Webアクセシビリティ基盤委員会</a>に所属しており、「理解と普及作業部会」にて活動しています。</p>

<p>他には、<a href="https://www.hcdnet.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HCD-Net</a>という人間中心設計を推進する団体でも活動しており、UXデザインの普及に務めています。</p>

<p><img src="/wp-content/uploads/2017/11/42A5098.jpg" alt="" width="640" height="408" class="alignnone size-full wp-image-24710" srcset="/wp-content/uploads/2017/11/42A5098.jpg 640w, /wp-content/uploads/2017/11/42A5098-300x191.jpg 300w, /wp-content/uploads/2017/11/42A5098-207x132.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /><br><strong>▲freee株式会社 伊原力也さん</strong><span style="font-size: 80%;">　※写真提供：html5j [HTML5 Conference 2017事務局</span></p>

<p><b class="speaker siraisi">白石:</b> 本日は、HTML5 Conferenceでお話された内容を主にお聞きしたいのですが、このセッションは、今度出版される書籍を元にしてらっしゃるんですよね。</p>

<p><b class="speaker ihara">伊原:</b> はい、11月4日に出版される「<a href="https://www.amazon.co.jp/dp/4862463878" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">インクルーシブ HTML + CSS &amp; JavaScript</a>」という書籍の内容をベースにしています。</p>

<p>私たちは2年ほど前に<a href="https://www.amazon.co.jp/dp/4862462650/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">デザイニングWebアクセシビリティ</a>という書籍を、その半年ほど前には<a href="https://www.amazon.co.jp/dp/4862462669/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">コーディングWebアクセシビリティ</a>という書籍を上梓しました。</p>

<p>今回のセッションの元になった書籍は、いわばそうした流れを組んだ最新のものだといっていいと思います。特にコーディングWebアクセシビリティとは、著者も同じヘイドン・ピカリング氏ですし、続編といって差し支えないかと思います。</p>

<p><b class="speaker siraisi">白石:</b> では、今回もWebアクセシビリティに関する書籍なんですね。</p>

<p><b class="speaker ihara">太田:</b> そうです。「コーディングWebアクセシビリティ」では特に、WAI-ARIAの使い方について詳しく論じられていました。WAI-ARIAの基本的な知識はあっても、「なぜそう書くのか」「いつどう使うのか」を知らない方に向けて、具体的な例を挙げつつ語った本です。</p>

<p><b class="speaker siraisi">白石:</b> では、今回の書籍は「インクルーシブ HTML + CSS &amp; JavaScript」となっているわけですが、これはどういう内容の本なのでしょうか？</p>

<p><b class="speaker ihara">伊原:</b> 原著のタイトルは「<a href="https://www.amazon.co.jp/dp/B01MAXK8XR/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Inclusive Design Patterns</a>」と言うのですが、サブタイトルは「Coding Accessibility Into Web Design」（Webデザインの中にアクセシビリティをコーディングする）となっていて、こちらの方がわかりやすい(笑)。</p>

<p>ぶっちゃけて言えば、アクセシビリティに配慮したコーディング例を具体的に挙げていっているという本です。</p>

<p>原著者がなんで「インクルーシブ」という単語を用いたかというと、「アクセシビリティ」というと、「アクセシビリティガイドラインを満たしていくこと」とか、「特定の障害を持つ人に向けた配慮」というニュアンスが強く根付いてしまっているからだと言っています。</p>

<p>また、「アクセシビリティ」という言葉自体には、デザインや設計という意味は含まれていない。アクセシビリティとは単に「アクセスできる可能性の度合い」のことですから。</p>

<p>一方でインクルーシブというのは「包括的」とか「全てを包む」といったニュアンスを含む英単語で、「できるだけ受け入れる」とか「できるだけ含める」という意味合いがあります。原著者が「インクルーシブ」という単語を用いたのは、「できるだけ多くの人に使ってもらえる」「できるだけ多くの状況で使える」ものをデザインしていこう、という意図なんです。</p>

<p><b class="speaker ihara">太田:</b> ただ、日本語版では元のタイトルにある「デザインパターン」という言葉は使いませんでした。Web制作の世界では、「デザインパターン」と言う単語からはWebデザインを想起してしまいがちなので…。</p>

<p>アクセシビリティにおいては、そういう（UI）デザインのニュアンスだけが強いわけではありませんからね。</p>

<p><b class="speaker siraisi">白石:</b> 「デザインパターン」という単語は、エンジニアの方であれば逆に馴染みはあるかもしれませんね。</p>

<p>しかし、「コーディングWebアクセシビリティ」や「デザイニングWebアクセシビリティ」という書籍がありながら、今回新しい書籍を出版されたのはどういう背景があるのでしょうか？</p>

<p><b class="speaker ihara">太田:</b> ここ10年くらいで、JavaScriptを用いた動的なUIがすごく普及しました。Ajaxがその立役者で、JavaScriptを利用して非同期にUIを書き換えるような作り方が一般的になってきました。</p>

<p>おかげで、WebサイトのUXは全般的に向上しましたが、一方で、アクセシビリティ的には新たな課題を抱えることにもなったわけです。<strong>元々、HTMLはアクセシブルに設計されているのに、JSがそれを損なってしまうケースが散見されるようになった</strong>のです。</p>

<p>例えばフォーム送信などは良い例です。昔ながらのフォームで、「送信」ボタンを押したら次のページ…という流れであれば、アクセシビリティに問題はあまりありません。ただこれを、JavaScriptを用いてAjaxでデータ送信するようにした途端、アクセシビリティが低下してしまうことが多い。</p>

<p><b class="speaker ihara">伊原:</b> そもそも、JSで「アプリ」を作ろうとすると、アクセシビリティへの配慮がされにくくなりがちです。ほとんど<code>div</code>や<code>span</code>でマークアップして、見た目上動けばOK…という場合が少なくありません。</p>

<p>それを、<strong>セマンティックなHTML要素とWAI-ARIAを活用して、アクセシブルでUXにも優れたWebアプリを作ろう</strong>というのが、この「インクルーシブ HTML + CSS &amp; JavaScript」で述べていることです。</p>

<h2>実践！アクセシブルな商品リストを作ってみる</h2>

<p><b class="speaker siraisi">白石:</b> では、アクセシブルなマークアップの具体的なパターンを幾つかお話いただきたいと思います。</p>

<p>ただ、セッションの内容全体については<a href="https://docs.google.com/presentation/d/1jaf-x24jZtVbQDzniovnxhk7gzZ8rkNNaznRM030wSo/edit#slide=id.p" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">スライド資料</a>をご覧になってもらえればいいと思うので、ここでは、私が個人的に疑問に思ったことなどを遠慮なくツッコませていただきつつ、ポイントとなる部分をおさらいしていっていただけると嬉しいです。</p>

<p><b class="speaker ihara">伊原:</b> わかりました。では一つ目の例として、<strong>商品リスト</strong>を見ていきます。</p>

<p>このサイトは画像アセットを購入できるサービスという想定ですが、UIデザインについては、Amazonの検索結果のようなものを想像して頂ければいいと思います。</p>

<p>リストの項目それぞれは商品名やレビュー結果、そして「すぐに購入」ボタンなどがあります。</p>

<p><img src="/wp-content/uploads/2017/11/bf80f697d8a772bac6b2c6a0c57c3905-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24676" srcset="/wp-content/uploads/2017/11/bf80f697d8a772bac6b2c6a0c57c3905.png 640w, /wp-content/uploads/2017/11/bf80f697d8a772bac6b2c6a0c57c3905-300x169.png 300w, /wp-content/uploads/2017/11/bf80f697d8a772bac6b2c6a0c57c3905-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>これが複数縦に並んでいるリストをイメージしてください。</p>

<p><b class="speaker siraisi">白石:</b> こういう一覧の実装方法っていろいろですよね。個人的には、単に<code>div</code>を並べるときもあれば、表っぽければ<code>table</code>を使うときもあります。</p>

<p><b class="speaker ihara">伊原:</b> まず、<strong>リストそのものはリスト要素（<code>ul</code>や<code>ol</code>）を使ってマークアップした方がいい</strong>かなと思います。</p>

<p>ここでリスト要素をお薦めするのは、要素の意味合いがわかりやすいのと、スクリーンリーダーがリストを読み上げるのに特別な機能を持つからですね。</p>

<p><b class="speaker ota">太田:</b> 例えばスクリーンリーダーは、リストの項目数を先に読み上げたり、前後のリスト項目にジャンプしたりできるんです。項目数って結構大事で、項目数が多い場合と少ない場合では、ユーザーの行動も変わってきますからね。</p>

<p><b class="speaker siraisi">白石:</b> なるほど。</p>

<p><b class="speaker ihara">伊原:</b> また商品名ですが、見出し要素を使用するのが最適です。スクリーンリーダーは見出しに直接飛んだり、直前の見出しを読みあげたりすることもできる。
リストと見出しを組み合わせることで、一覧の見出しを飛ばし読みしていくようなことが可能になるんです。</p>

<p>まとめると、以下のようなマークアップがおすすめですね。</p>

<p></p><pre class="crayon-plain-tag">&lt;li&gt;
  &lt;h3&gt;
  ガソリンスタンドにたたずむ裸の男 &lt;a href="/artist/kenny-mulbarton"&gt;by &lt;cite&gt;ケニー・マルバートン&lt;/cite&gt;&lt;/a&gt;
  &lt;/h3&gt;
&lt;/li&gt;</pre><p></p>

<p><b class="speaker siraisi">白石:</b> <code>li</code>の中に見出し要素を置くと、リスト項目が全て個別のセクションということになりますが、それは問題ないんでしょうか。HTML5からは、見出し要素は暗黙的にセクションを構成するようになりましたよね。</p>

<p><b class="speaker ota">太田:</b> はい、確かにセクショニングアルゴリズムの観点から、<code>li</code>の中に<code>h3</code>を入れることを望ましくないと考える人もいるかもしれません。ここは意見が分かれるところでしょうね。
ただ、アクセシビリティの観点からは支援技術で実際に使えるかどうかが重要で、その意味では十分に実用的だと言えると思います。</p>

<h2>「今すぐ購入」ボタンはボタンにする？それともリンクにする？</h2>

<p><b class="speaker ihara">伊原:</b> 次は、「今すぐ購入」ボタンをどうマークアップするかを検討してみましょうか。</p>

<p><b class="speaker siraisi">白石:</b> うーん、これは<code>button</code>一択じゃないですか？</p>

<p><b class="speaker ihara">伊原:</b> それもアリです。<code>button</code>を使うケースとしては、JavaScriptと組み合わせて、購入処理をその場で行えるようにするような場合ですね。</p>

<p>でもこの例のサイトは一般的なプリント写真購入サイトをイメージしているものなので、「今すぐ購入」ボタンを押したら、写真の購入確認画面に飛ぶことになります。</p>

<p><b class="speaker siraisi">白石:</b> そうなると、写真の購入確認画面へのリンクとして実装したほうが良さそうですね。</p>

<p><b class="speaker ihara">伊原:</b> はい、そのほうがJavaScriptがなくても動きますし、要素の意味合いも明確になります。ここでは<code>a</code>要素を使いましょう。</p>

<p>以下のようなマークアップがまずは望ましいですね。</p>

<p></p><pre class="crayon-plain-tag">&lt;a href="/product/naked-man-in-garage" class="button"&gt;今すぐ購入&lt;/a&gt;</pre><p></p>

<p><b class="speaker siraisi">白石:</b> このマークアップだと、<code>class="button"</code>となっていますし、CSSで見た目をボタンっぽくするイメージですね。例えばWAI-ARIAを使って、このリンクのロールをボタンにするというのはいかがでしょうか？</p>

<p></p><pre class="crayon-plain-tag">&lt;!-- role要素でbuttonを指定 --&gt;
&lt;a href="/product/naked-man-in-garage" role="button"&gt;今すぐ購入&lt;/a&gt;</pre><p></p>

<p><b class="speaker ihara">伊原:</b> あ、それはやめてください。これでは、元のHTML要素が持つセマンティクスが変わってしまい、この要素はリンクではなくボタンであるという意味合いになってしまいます。</p>

<p><b class="speaker siraisi">白石:</b> なるほど、ここでは見た目だけボタンにしておいて、セマンティクスは変えないのが望ましいと。</p>

<p><b class="speaker ota">太田:</b> そうなんです。WAI-ARIAって覚えると濫用されがちな技術でもありますが、<strong>基本的には「WAI-ARIAは使わない」のが正しい</strong>。</p>

<p>W3Cの「<a href="https://www.w3.org/TR/using-aria/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Using WAI-ARIA</a>」という文書の先頭に書いてあるのは、「（HTMLでまかなえる場合は）WAI-ARIAは使うな」なんですよ(笑)。</p>

<p>例えばボタンや見出しがあったとしたら、素直に<code>&lt;button&gt;</code>や<code>&lt;h1&gt;</code>を使えば良い。WAI-ARIAを使う必要は必ずしもないんです。基本的にはHTML5の語彙を用いて、足りないところをWAI-ARIAで補う、という形が望ましい。</p>

<h2>リンクテキストにも配慮しよう！</h2>

<p><b class="speaker ihara">伊原:</b> あともう一つ考えてみたいのは、リンクテキストです。このままだと全てのリンクが「今すぐ購入」になってしまいますが、それってアクセシビリティに優れていると言えるでしょうか？</p>

<p><b class="speaker siraisi">白石:</b> うーん…見出しに商品名はあるので、全くアクセシブルじゃないとは思いませんが。リンクテキストも読み上げられるんですよね？全部が「今すぐ購入」じゃ不親切かも？</p>

<p><b class="speaker ihara">伊原:</b> そうです。「何を購入できるか」が、リンクテキストから分かると、よりアクセシブルですよね。</p>

<p>なので、非表示のテキストでリンクテキストをより詳細化すれば、UIデザインも損なわれません。</p>

<p></p><pre class="crayon-plain-tag">&lt;a href="/product/naked-man-in-garage" class="call-to-action"&gt;
  &lt;span class="visually-hidden"&gt;ガソリンスタンドにたたずむ裸の男を&lt;/span&gt;今すぐ購入
&lt;/a&gt;</pre><p></p>

<p><b class="speaker siraisi">白石:</b> なるほど、不可視のテキストも利用してより説明的にするとは…！アクセシビリティへの配慮を真面目に考えてないと、まず出てこない発想ですね。</p>

<p><b class="speaker ihara">伊原:</b>ちなみに他にもやり方はいくつかありますが、この本ではSEOにおける内部対策的な意味合いも込めて、このやり方が推奨されています。</p>

<h2>検索結果ページ（SERP）にも配慮する</h2>

<p><b class="speaker ihara">伊原:</b> 最後に、検索エンジンの結果ページで商品（Search Engine Result Pages）がどう見えるか、についても配慮した方がいいでしょう。</p>

<p><b class="speaker siraisi">白石:</b> 検索結果ページですか？なんでですか？</p>

<p><b class="speaker ihara">伊原:</b> 支援技術ユーザーの中には、目的のページに辿り着くために、検索エンジンのインターフェースを利用する人も多くいるんです。Google検索って、<code>site:</code>を前につけるとサイト内検索を行えるじゃないですか。</p>

<p><b class="speaker siraisi">白石:</b> ああなるほど。言われてみれば、ぼくもAmazonの中検索するのに、Google検索をよく使います(笑)。</p>

<p><b class="speaker ihara">伊原:</b> 例えばマイクロデータと<code>schema.org</code>を使えば、検索結果の表示をより充実させることが可能です。以下に、商品のレビュー結果を表すマークアップの例を示します。</p>

<p></p><pre class="crayon-plain-tag">&lt;span itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating"&gt;
&lt;span itemprop="ratingValue"&gt;4&lt;/span&gt;つ星、
レビュー数&lt;span itemprop="reviewCount"&gt;13&lt;/span&gt;
&lt;/span&gt;</pre><p></p>

<p><img src="/wp-content/uploads/2017/11/371b7ba51cb7da942f5931bbc98c4242-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24675" srcset="/wp-content/uploads/2017/11/371b7ba51cb7da942f5931bbc98c4242.png 640w, /wp-content/uploads/2017/11/371b7ba51cb7da942f5931bbc98c4242-300x169.png 300w, /wp-content/uploads/2017/11/371b7ba51cb7da942f5931bbc98c4242-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> そうか、今までぼく、「マイクロデータ使っとけば検索結果ページで目立てるかな」くらいしか考えたことなかったんですが、アクセシビリティの点から考えても重要なんですね。あんまりちゃんと意識したことなかったです。</p>

<h2>見た目ではなく機能でマークアップせよ！</h2>

<p><b class="speaker ihara">伊原:</b> では次の例に移らせてください。表示結果を絞り込んだり並び順を変えたりするUIを実装してみたいと思います。</p>

<p><img src="/wp-content/uploads/2017/11/2e7eae09dfbb3af35018e4d4f874a5bf-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24673" srcset="/wp-content/uploads/2017/11/2e7eae09dfbb3af35018e4d4f874a5bf.png 640w, /wp-content/uploads/2017/11/2e7eae09dfbb3af35018e4d4f874a5bf-300x169.png 300w, /wp-content/uploads/2017/11/2e7eae09dfbb3af35018e4d4f874a5bf-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> うーん、こういうの実装するんだったら、ぼくだったらどうするかなあ。ナビゲーションメニューみたいなものと捉えて、リストと<code>a</code>要素とかでやるかもしれません。</p>

<p><b class="speaker ihara">伊原:</b> それも悪くないのですが、このメニューって、どれかが選択中の場合は他のメニューを選択できませんよね。それってどうします？</p>

<p><b class="speaker siraisi">白石:</b> …JavaScriptのお世話にならざるを得ないかもしれません。</p>

<p><b class="speaker ihara">伊原:</b> そう、でも、標準のHTMLには、そういう「排他的」な選択を行うためのフォーム要素があります。</p>

<p><b class="speaker siraisi">白石:</b> …ラジオボタン、ですか？</p>

<p><b class="speaker ihara">伊原:</b> そのとおりです！</p>

<p>このデザインだけからだと、見た目はラジオボタンとは似ても似つきませんが、ここではラジオボタンを使うことにします。マークアップの段階では、<strong>見た目ではなく機能に沿ってマークアップ</strong>するのが重要ですから。</p>

<h2>ラジオボタンのスタイリング…やりにくい！どうする？</h2>

<p><b class="speaker siraisi">白石:</b> でも、ラジオボタンは「◎」みたいな余計なUIがくっついてきちゃいますよね？しかもあれがブラウザごとに異なる上、どのブラウザのデザインもあんまりカッコよくない(笑)。</p>

<p><b class="speaker ihara">伊原:</b> そうなんです。ラジオボタンってスタイリングしにくいので評判が良くないですよね(笑)。だから、結局他の要素を使っちゃう…なんてことも起きちゃうんですが、そこは工夫次第です。</p>

<p>ここでは<code>label</code>要素をうまく使って、目標とするデザインを実現しましょう。<code>label</code>要素は、それ自身をクリックすることで、対象となるラジオボタンやチェックボックスの状態を変更できますよね。</p>

<p><b class="speaker siraisi">白石:</b> ああ、なるほど！<strong><code>label</code>はクリッカブルな状態で表示しておいて、ラジオボタン本体は隠しちゃえばいい</strong>んだ。</p>

<p><b class="speaker ihara">伊原:</b> そうです。<code>label</code>さえあればラジオボタンのクリックは可能ですので、実際のラジオボタンは隠しちゃってもいいんですよね。ラジオボタンのフォーカス状態やチェック状態はCSSの擬似クラスで指定できますので、CSSだけで表示の切り替えが可能です。</p>

<p>例えばこんな感じになります。</p>

<p></p><pre class="crayon-plain-tag">&lt;input type="radio" name="sort-method" id="most-recent" checked /&gt;
&lt;label for="most-recent"&gt;新着順&lt;/label&gt;

&lt;input type="radio" name="sort-method" id="most-popular" checked /&gt;
&lt;label for="most-popular"&gt;人気順&lt;/label&gt;
...(略)...</pre><p></p>

<p></p><pre class="crayon-plain-tag">[type="radio"] + label {
  cursor: pointer;
  /* その他、基本のスタイル */
}
[type="radio"]:focus + label {
  /* フォーカス時のスタイル */
}
[type="radio"]:checked + label {
  /* 選択時のスタイル */
}
/* ラジオボタンを見えなくする */
.sorter [type="radio"] {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  padding:0 !important;
  border:0 !important;
  overflow: hidden !important;
  clip: rect(1px, 1px, 1px, 1px);
}</pre><p></p>

<p><b class="speaker siraisi">白石:</b> なるほど、これならHTMLのセマンティクスもわかりやすいし、JavaScriptもいらない。素晴らしい。</p>

<p><b class="speaker ihara">伊原:</b> ちなみに、<strong>このCSSの!important連打は「とにかく扱いづらいラジオボタンを消し去ってやりたい」という原著者のジョークなので、真似しないでください(笑)</strong>。</p>

<h2>無限スクロールはやっぱり×？「もっと読む」はどう実装するか</h2>

<p><b class="speaker ihara">伊原:</b> 最後に、検索結果が複数ページに渡る場合、どういう風なUXが望ましいかを考えてみたいと思います。昔よく使われていたのはページングですが、今は無限スクロールを採用するサイトも多いですね。</p>

<p><b class="speaker siraisi">白石:</b> はい、ぼくも自社で運営している<a href="http://techfeed.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">TechFeed</a>というアプリで無限スクロールを採用しています。</p>

<p><b class="speaker ihara">伊原:</b> ただ、<strong>アクセシビリティ的には無限スクロールは使わないほうが無難です</strong>。</p>

<p><b class="speaker siraisi">白石:</b> えっ！いろんなサイトが採用しているし、使いやすいとも思うんですが…</p>

<p><b class="speaker ihara">伊原:</b> 理由はいくつかあります。</p>

<p>まず、スクロールという操作が読み込みを誘発することが、ユーザーにとって望ましいことなのかどうか。ユーザーは次のページ読み込みを望んでいないかもしれないですよね。</p>

<p>あと、スクロールバーを使っているユーザーは、新たなページが読み込まれた瞬間スクロールバーが勝手に上下するので、混乱します。</p>

<p>最後に、ページのフッターにたどり着けないことがあります。フッターに要素を置いているにもかかわらず、無限スクロールがあるものだから、フッターに触りたくとも触れない…という事態が起こりうるのです。</p>

<p><b class="speaker siraisi">白石:</b> ふむ、理由はわかります。では、代わりにどうデザインすべきだと思いますか？</p>

<p><b class="speaker ihara">伊原:</b> ページ読み込みをユーザーが制御できればいいので、「もっと読む」ボタンを明示的に設置するというのは一つの解決策ですね。</p>

<p><img src="/wp-content/uploads/2017/11/453e359d88233dbe55ab3a7573aa8d47-640x360.png" alt="" width="640" height="360" class="aligncenter size-large wp-image-24674" srcset="/wp-content/uploads/2017/11/453e359d88233dbe55ab3a7573aa8d47-640x360.png 640w, /wp-content/uploads/2017/11/453e359d88233dbe55ab3a7573aa8d47-300x169.png 300w, /wp-content/uploads/2017/11/453e359d88233dbe55ab3a7573aa8d47-768x432.png 768w, /wp-content/uploads/2017/11/453e359d88233dbe55ab3a7573aa8d47-207x116.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> でも、いちいちそのボタンを押さなくちゃならないというのも結構面倒な気がします…。あと、サービス事業者側としては、無限スクロールでどんどん下に読んでいってもらうことで、ユーザーの滞留時間を伸ばしたいという気持ちもあると思うんですよね。</p>

<p><b class="speaker ihara">伊原:</b> この本では、ユーザーが「もっと読む」ボタンをよくクリックするようなら、その時に改めて「続きを自動的に読み込むか」を尋ねるようにするというやり方が紹介されています。その質問に「YES」と答えるのなら、そのユーザーにとっては、先ほど挙げられていた無限スクロールのデメリットが気にならないという証拠でもあると。</p>

<p><b class="speaker siraisi">白石:</b> なるほど。確かにそのほうがユーザー本位でもありますね。</p>

<p><b class="speaker ota">太田:</b> あとこういう動的にリストを追加する場合、アクセシビリティの観点から一点注意点があります。</p>

<p>読み込みが完了したら、<strong>新しく読み込んだデータの先頭にフォーカスを移す</strong>ことです。そうしないと、スクリーンリーダーのユーザーが、次にどこに行けばいいかわからなくなってしまいますから。</p>

<p>そのために、新たに読み込んだデータの先頭に<code>tabindex="-1"</code>を指定しつつ、JavaScriptでフォーカスを与えます。</p>

<p></p><pre class="crayon-plain-tag">...
&lt;li&gt;
  &lt;!-- tabindexを指定して、タイトルをフォーカス可能にする --&gt;
  &lt;h3 tabindex="-1"&gt;
    ガソリンスタンドにたたずむ裸の男&lt;a href="/artist/kenny-mulbarton"&gt;by &lt;cite&gt;ケニー・マルバートン&lt;/cite&gt;&lt;/a&gt;
  &lt;/h3&gt;
  ...
&lt;/li&gt;
&lt;li&gt;&lt;!-- 新たに表示された商品の2番目 --&gt;&lt;/li&gt;
...</pre><p></p>

<p><b class="speaker siraisi">白石:</b> おお、こういう配慮は全く考えていませんでした。勉強になります。ちなみに、<code>tabindex</code>にマイナス値を指定することなんてできるんですね…知りませんでした。</p>

<p><b class="speaker ota">太田:</b> <code>tabindex</code>にマイナスを指定すると、ユーザーはそこにフォーカスを当てられないのですが、スクリプトでなら当てられるようになります。</p>

<h2>「アクセシビリティは0点か100点っていう話じゃない」</h2>

<p><b class="speaker siraisi">白石:</b> 本日は、いろんな例についてマークアップを考えられて面白かったです。</p>

<p>ただ最後に質問があります。</p>

<p>最近のWebアプリはどんどん動的になっていて、「UIのほとんどをJavaScriptで構築する」という場合も少なくありません。Single Page Applicationなんかはその最たるものだと思います。</p>

<p>こうしたサイトでも、アクセシビリティを担保することは可能なんでしょうか？相当の工数をかけないと難しいんじゃないかという気がしているのですが。</p>

<p><b class="speaker ihara">伊原:</b> 確かに、<strong>SPAのアクセシビリティ</strong>は面白いテーマです。ただ、SPAだからアクセシビリティの担保が難しいということはないと思います。</p>

<p>というのも、<strong>Google DocsやGoogle SlidesはWAI-ARIAにかなり対応していて、コンテンツの読み上げに対応している</strong>んですよ。</p>

<p><img src="/wp-content/uploads/2017/11/Google-Slides-640x377.png" alt="" width="640" height="377" class="aligncenter size-large wp-image-24672" srcset="/wp-content/uploads/2017/11/Google-Slides-640x377.png 640w, /wp-content/uploads/2017/11/Google-Slides-300x177.png 300w, /wp-content/uploads/2017/11/Google-Slides-207x122.png 207w, /wp-content/uploads/2017/11/Google-Slides.png 724w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> え、そうなんですか！それらのアプリ、SPAの代表格みたいなもんだと思ってました…。<strong>「SPAはスクリーンリーダーになじまないんじゃないか」なんて思ってましたが、それは単なる思い込み</strong>ですね。</p>

<p><b class="speaker ihara">伊原:</b> <strong>どんなサイトでもまずは一回、スクリーンリーダーで読み上げを行ってみる</strong>ことをお勧めします。SPAであっても、意外なほどスクリーンリーダーが綺麗に読み上げてくれることもありますので。</p>

<p><b class="speaker ota">太田:</b> 私はいつも言っているのですが、<strong>アクセシビリティって0点か100点かだけではない</strong>んです。全くアクセスできないサイトもなければ、全世界のすべての人がパーフェクトにアクセスできるサイトもありません。全てのサイトがその中間のどこかに位置していて、少しでもよくしていこうという考え方が大事だと思います。</p>

<p><b class="speaker ihara">伊原:</b> 「アクセシブルかどうか」はちょっとした改善で大きく変わったりもするものです。</p>

<p>例えば先日、とあるサイトをスクリーンリーダーで読み上げてみたのですが、ほとんど問題なく使える。ただ一点、そのページで一番重要なラベルだけ読み上げてもらえないんです。こういう点を改善するだけで、アクセシビリティはぐっと向上する。</p>

<p>なので、まずはアクセシビリティ上の問題を特定し、問題の重要度を判断して、重要なところから対応していく…という現実的なアプローチが、アクセシビリティを向上させていく上では大事だと思っています。</p>

<p><b class="speaker siraisi">白石:</b> 本日は、いろんなお話を聞かせていただき、ありがとうございました。</p>

<p><DIV align=right>（写真提供：html5j [HTML5 Conference 2017事務局　写真撮影：刑部友康）</div></p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2017特集]]></series:name>
	</item>
		<item>
		<title>WebGLの現状と未来を、Grimoire.jsを生んだスーパークリエータに聞いてきた！</title>
		<link>/shumpei-shiraishi/24589/</link>
		<pubDate>Thu, 02 Nov 2017 01:00:22 +0000</pubDate>
		<dc:creator><![CDATA[白石 俊平]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[デザイン]]></category>
		<category><![CDATA[Grimoire.js]]></category>
		<category><![CDATA[WebGL]]></category>

		<guid isPermaLink="false">/?p=24589</guid>
		<description><![CDATA[連載： HTML5 Conference 2017特集 (12)こんにちは、編集長の白石です。 この記事は、9月24日に開催されたHTML5 Conference 2017に登壇したエキスパートに、お話されたセッションの...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/html5-conf2017/" class="series-457" title="HTML5 Conference 2017特集" data-wpel-link="internal">HTML5 Conference 2017特集</a> (12)</div><p>こんにちは、編集長の白石です。</p>

<p>この記事は、9月24日に開催された<a href="http://events.html5j.org/conference/2017/9/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">HTML5 Conference 2017</a>に登壇したエキスパートに、お話されたセッションのトピックを中心に語っていただこうとういものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。</p>

<p>今回お話を伺ったのは、東京理科大学4年の石井翔さんです。</p>

<p><img src="/wp-content/uploads/2017/10/42A5128.jpg" alt="" width="640" height="412" class="alignnone size-full wp-image-24605" srcset="/wp-content/uploads/2017/10/42A5128.jpg 640w, /wp-content/uploads/2017/10/42A5128-300x193.jpg 300w, /wp-content/uploads/2017/10/42A5128-207x133.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p>石井さんのセッション「WebGLの今とこれから ~今のWeb開発で使うからこそ知っておきたい周辺技術~」に関するスライド資料は、こちらで公開されています。</p>

<p><a href="http://html5.grimoire.gl/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">スライド資料</a>
（注: 重いのとモバイルから見えないのはご容赦ください by 石井翔さん）</p>

<h2>WebGLの現状</h2>

<p><b class="speaker siraisi">白石:</b> 本日は取材をお受けいただいてありがとうございます！簡単に自己紹介をお願いします。</p>

<p><b class="speaker isii">石井:</b> 東京理科大学4年生の石井 翔です。昨年、私が進めている<a href="https://grimoire.gl/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Grimoire.js</a>（注: モバイルからだと多少レイアウトが崩れます by 石井翔さん）というプロジェクトが<a href="https://www.ipa.go.jp/jinzai/mitou/2016/20170530.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">未踏IT人材発掘・育成事業に採択され</a>、スーパークリエータに認定されました。</p>

<p><b class="speaker siraisi">白石:</b> Grimoire.jsはWebGLのライブラリですね。Grimoire.jsについてもあとでお聞かせ願いたいのですが、まずはWebGLの概要や現状についてお話いただけますか？</p>

<p><b class="speaker isii">石井:</b> WebGLは、一言で言えばWeb上で3Dコンテンツを扱うための技術です。2010年に仕様が策定されており、既に多くのブラウザで実装されている技術です。ブラウザ上でどの技術が使えるかを測定する<a href="https://caniuse.com/#feat=webgl" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Can I Use</a>での結果を見ても、92%以上のブラウザがサポートしていて、広く使える状態にあると言っていいでしょう。</p>

<p>ただこれは、WebGL 1.0の話です。<a href="https://caniuse.com/#feat=webgl2" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebGL 2.0はまだまだ</a>ですね。ChromeとFirefoxだけが対応しているという状態で、特にiOSで使えないのが厳しいです。「ブラウザを限定すれば使える」という状態です。</p>

<p><b class="speaker siraisi">白石:</b> WebGL 1.0と2.0って何が違うんですか？…ぼく、3Dプログラミングが全然わかってないので、理解できるか自信がないのですが(笑)</p>

<p><b class="speaker isii">石井:</b> 浮動小数点テクスチャなどがWebGL 2.0の主な機能ですが、3Dプログラミングの知識がない人に向けて話すのはちょっと難しいですね(笑)
とりあえず、ライブラリ作者なら知っておくべきですが、ライブラリのユーザーはそれほど気にする必要はないかと思います。
ライブラリ作者も、WebGL 2.0が使えない環境では1.0にフォールバックするように実装していることが多いでしょうし。</p>

<p><small>
（筆者注: WebGL 2.0の強化点については<a href="https://qiita.com/emadurandal/items/4c7bd2a26ef2d732d734" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Qiitaで良い記事を見つけました</a>。ぼくにはちんぷんかんぷんですが…）
</small></p>

<p><b class="speaker siraisi">白石:</b> なるほど、あまり気にしなくていいと(笑) 安心しました。</p>

<p><b class="speaker isii">石井:</b> 3Dをご存じない方にとって大事なのは、<strong>そもそもWebGLとはGPUを扱うための技術だ</strong>ということをしっかり理解しておくことです。</p>

<p>CPUは、CPUは複雑な処理を逐次的に処理することを得意としています。CPUの場合はコアの数が4とか8とかに限られていることが普通です。</p>

<p>一方GPUの場合は、「異なるデータに対して同じ処理を施す」のを並列で実行するのに特化しています。なのでGPUは、コアの数が1,000を超えることも普通です。
こうした特徴を持つGPUだからこそ、大量の頂点を移動する処理など、3Dプログラミングに必要とされる「単純な処理の並列実行」に向いているんです。</p>

<p><b class="speaker siraisi">白石:</b> こうした特徴は、最近だと機械学習の分野とかにも活かされているんですよね。単純なベクトル計算とかが多いから。</p>

<p><b class="speaker isii">石井:</b> そうです。で、WebGLってそもそもOpenGL（※）と同じなので、CGの取り扱いに関しては共通している部分がほとんどです。<strong>ただ、置かれている環境は、OpenGLネイティブのゲームやアプリとは随分違う</strong>。</p>

<p>一番違う点は、WebGLは必要とされるリソースが全部Web上にあって、ダウンロードが必要という点です。モデルデータの読み込みに時間がかかるんですよね。</p>

<p>だから今まではゲームなど、「読み込みに時間がかかりそうだ」とユーザーも了解しているコンテンツが多かったんです。でも、本来使うデータをしっかり選べば短いロード時間で使えるものも多いんですよ。シェーダーアートとか。</p>

<p><small>
※OpenGL（オープンジーエル、Open Graphics Library）は、クロノス・グループ (英: Khronos Group) が策定している、グラフィックスハードウェア向けの2次元/3次元コンピュータグラフィックスAPIである（<a href="https://ja.wikipedia.org/wiki/OpenGL" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Wikipediaより引用</a>）
</small></p>

<p><b class="speaker siraisi">白石:</b> 確かに、WebGLでできたゲームとか、読み込みに数分待たされるものもありましたね。</p>

<p><b class="speaker isii">石井:</b> はい。モデルデータが大きいと、それだけダウンロードやデータ読み込みに時間がかかってしまう。なので、<strong>そうしたWebGLの問題を解決すべく、CGの世界にも進化が起きようとしている</strong>んです。</p>

<p><img src="/wp-content/uploads/2017/10/42A5125.jpg" alt="" width="640" height="417" class="alignnone size-full wp-image-24608" srcset="/wp-content/uploads/2017/10/42A5125.jpg 640w, /wp-content/uploads/2017/10/42A5125-300x195.jpg 300w, /wp-content/uploads/2017/10/42A5125-207x135.jpg 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>ランタイム向け3Dデータフォーマット「glTF」</h2>

<p><b class="speaker siraisi">白石:</b> 具体的にはどのような進化ですか？</p>

<p><b class="speaker isii">石井:</b> 一つは<strong><a href="https://www.khronos.org/gltf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">glTF</a> (GL Transmission Format) と言って、汎用的な3Dアセットフォーマット</strong>です。ツールに依存しない軽量フォーマットとして、Khronosが普及を進めています。</p>

<div id="attachment_24632" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/10/e1ac15f7811659bca0d029023946090c-640x334.png" alt="glTF" width="640" height="334" class="size-large wp-image-24632" srcset="/wp-content/uploads/2017/10/e1ac15f7811659bca0d029023946090c.png 640w, /wp-content/uploads/2017/10/e1ac15f7811659bca0d029023946090c-300x157.png 300w, /wp-content/uploads/2017/10/e1ac15f7811659bca0d029023946090c-207x108.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">glTF</p></div>

<p><b class="speaker siraisi">白石:</b> ツールに依存しない、というのはどういう意味ですか？</p>

<p><b class="speaker isii">石井:</b> 以前WebGL上でモデルファイルを扱う際には、MayaやBlenderといったツールのファイルをそのまま読み込んで利用することが一般的でした。これは言わば、<strong>「Photoshopのpsdファイルはあるけど、jpgやpngなどの汎用的な画像フォーマットがない」という状況</strong>です。</p>

<p><b class="speaker siraisi">白石:</b> そんな状況だったんですね…知りませんでした。ゲームやアプリとしてひとまとめにパッケージングしてしまうから、汎用フォーマットが必要とされなかったんでしょうか。</p>

<p><b class="speaker isii">石井:</b> 概ねそういうところです。そういう状況を変えようと、<a href="https://ja.wikipedia.org/wiki/COLLADA" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">COLLADA</a>という汎用フォーマットがKhronosによって提案され、一定程度普及はしています。</p>

<p>ただ、COLLADAファイルはCG編集ツール間でデータをやり取りするためのフォーマットとして設計されているため、WebGLアプリケーションが読み込んで利用するには、編集用のパラメーターなど不要な部分も多いんです。また、XML形式だというのも、ファイルサイズや解析速度の点で不利になります。</p>

<p>glTFは、COLLADAファイルから編集用のパラメータを取り除いて、JSON形式にしたものと言ってほぼ差し支えありません。</p>

<p><b class="speaker siraisi">白石:</b> なるほど。ただ、そういうフォーマットって、普及させるのがなかなか大変な気もしますが、どうなんでしょう？</p>

<p><b class="speaker isii">石井:</b> glTFは既に様々なライブラリにもサポートされていますし、普及は中々順調と言えると思います（参考: <a href="https://github.com/cx20/gltf-test" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">glTFのライブラリサポート状況</a>）。</p>

<p><strong>glTFの面白いところは、大手ベンダーの採用意欲が高い</strong>というところです。MicrosoftやAutodeskという大手ベンダーが乗っかってきているんですよ。
Khronos自身WebGLの仕様策定元なので、この分野で発言力が強いこともあります。また、最近では<a href="https://www.apple.com/jp/apple-watch-series-3/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Apple Watchのページ</a>でglTFが使われてたりもします。</p>

<p><b class="speaker siraisi">白石:</b> Apple Watchの公式サイトでもですか！それはかなりの人がアクセスしたでしょうね。確かに、これ単なる画像じゃない。スクロールと共に水滴が別々の動きをしてる…！（重いけど）</p>

<div id="attachment_24625" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/10/bf93ab1915cccd50fb572e6bd170ab1a-640x395.png" alt="Apple Watch Series 3のサイト" width="640" height="395" class="size-large wp-image-24625" srcset="/wp-content/uploads/2017/10/bf93ab1915cccd50fb572e6bd170ab1a.png 640w, /wp-content/uploads/2017/10/bf93ab1915cccd50fb572e6bd170ab1a-300x185.png 300w, /wp-content/uploads/2017/10/bf93ab1915cccd50fb572e6bd170ab1a-207x128.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Apple Watch Series 3のサイト</p></div>

<p><b class="speaker isii">石井:</b> glTFは「オーディオにおけるMP3, ビデオにおけるH.264、画像におけるJPEG」といったように、「3DといえばglTF」となることを目指しているとのことで、普及にかけるKhronosの意気込みも並々ならぬものがあります。
<img src="https://www.khronos.org/assets/uploads/apis/2016-gltf-jpeg-of-3d.jpg" alt="" /></p>

<h2>頂点データ専用の圧縮形式「draco」</h2>

<p><b class="speaker isii">石井:</b> もう一つ注目の技術としては、Googleがオープンソースで開発している<a href="https://github.com/google/draco" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">draco</a>という圧縮形式です。頂点データを効率よく圧縮する技術で、元々の頂点データのサイズに比べて4倍から16倍の圧縮率を誇ります。</p>

<p><img src="/wp-content/uploads/2017/10/ea3f6e4f266b99b2233c19fe0d906450-640x338.png" alt="" width="640" height="338" class="aligncenter size-large wp-image-24626" srcset="/wp-content/uploads/2017/10/ea3f6e4f266b99b2233c19fe0d906450.png 640w, /wp-content/uploads/2017/10/ea3f6e4f266b99b2233c19fe0d906450-300x158.png 300w, /wp-content/uploads/2017/10/ea3f6e4f266b99b2233c19fe0d906450-207x109.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker siraisi">白石:</b> 先ほどのglTFにしか使えないんですか？</p>

<p><b class="speaker isii">石井:</b> いえ、汎用的なポリゴンデータ形式（.ply）に対応しているので、元のファイルフォーマットは選びません。</p>

<p><b class="speaker siraisi">白石:</b> ブラウザによる対応も必要なんですか？</p>

<p><b class="speaker isii">石井:</b> いえ、ブラウザがネイティブ対応するというものでもないんです。<strong>dracoによって圧縮されたポリゴンデータは、JavaScriptでデコードすることができます</strong>。</p>

<p><b class="speaker siraisi">白石:</b> なるほど、アプリケーションが自前で圧縮データを展開するんですね。でもそれだと、デコード処理にかかる時間がちょっと心配です。</p>

<p><b class="speaker isii">石井:</b> WebAssemblyでできたデコーダーもあるし、Web Workersで展開すればUI処理を阻害することもないので、そこはあまり問題ないと思いますよ。使うブラウザを選ぶということもありませんし、Three.jsのようなライブラリに任せてしまえば、アプリケーションはデコードについて意識する必要もありません。</p>

<p><b class="speaker siraisi">白石:</b> ほかには、Webだと画像のサイズを結構気にしたりしますが、CGの世界ではどうなんでしょう？</p>

<p><b class="speaker isii">石井:</b> CGだと、テクスチャ画像のサイズを削減するという話になりますね。ただ、単に画像のファイルサイズを小さくするだけでは片手落ちなんです。
いくら元画像のファイルサイズを小さくしても、GPUに乗るときにはフルサイズにデコードされてしまうので、メモリ使用量などにすごく影響するんですね。</p>

<p>なので、GPUが直接扱えるテクスチャ圧縮形式というものがありまして、それらを利用すると、GPU上でも圧縮した状態で画像を扱うことができます。DirectXだとS3TCという形式、iOSだとPowerVR Texture Compression (PVRTC) というように、ベンダーごとに異なってくるんですが。</p>

<p><b class="speaker siraisi">白石:</b> ベンダーごとに異なるんだと、取り扱いが面倒ですね。</p>

<p><b class="speaker isii">石井:</b> はい、なのでこういうフォーマット変換はWebpackなどで自動化されるべきだと思います。このように、今まではエンジンが自動的に行なってきたことも、WebGLの場合はプログラマーが自分で意識しなくてはなりません。</p>

<p><b class="speaker siraisi">白石:</b> まとめると、3DをWeb上で行うためにはいろいろな課題があって、それが徐々に解決されつつあるということですね。汎用モデルフォーマットが普及しつつあり、頂点データの圧縮ツールも登場した。そして、テクスチャ圧縮も自動化されるだろうと。</p>

<p><b class="speaker isii">石井:</b> そうです。そもそもWebは、多様なデバイスがネットワークで繋がれていることが前提です。そういうユビキタスな環境で、3Dが自由に表現できる世界に向けて、今まさに具体的で重要な進化が起こっているということです。</p>

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

<h2>WebGLの未来</h2>

<p><b class="speaker siraisi">白石:</b> こうした動きを踏まえて、WebGLの未来はどうなると思いますか？</p>

<p><b class="speaker isii">石井:</b> 今のコンピューターの世界は、やはり2Dを前提としているのは間違いありません。3Dが利用されるシーンは、ゲームなど、コンピューティングのごく一部に限られていました。マテリアルデザインなども、3Dの要素をうまく取り入れてはいますが、前提は2Dです。</p>

<p>ただ、今、GoogleやApple、Microsoftなどの強力なベンダーたちが、こぞってARやMRに力を入れています。このまま進めば、映画館や不動産屋さんとか、あらゆるお店の軒先にARのオブジェクトが浮いている…という世界は普通に来るんじゃないかと思っているんです。3Dがより身近になる世界です。</p>

<p>ただ、そういうのを見るために、<strong>わざわざアプリをインストールするのは面倒</strong>ですよね。近い将来、そういう面倒くささが、AR/MRの普及を妨げる大きな一因になってくるんじゃないかと思うんです。</p>

<p>しかしWebGLがそういう状況を打開できるんじゃないか、と期待しています。WebGLはWebブラウザさえあれば動きます。PCでもスマホでも動く。アプリのインストールが必要ないし、しかも安全なサンドボックス上で動きます。</p>

<p><b class="speaker siraisi">白石:</b> 確かに！もしかすると、ビーコン技術との組み合わせとか（※）で、アプリのインストールを必要とせず、気軽にバンバンARコンテンツを見るような時代が来るかもしれませんね。</p>

<p><small>
※Webとビーコン技術との組み合わせとして、<a href="https://developers.google.com/beacons/overview" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Eddystone</a>という仕組みがGoogleから考案されている
</small></p>

<p><b class="speaker isii">石井:</b> 実際、Googleが<a href="https://github.com/google-ar/WebARonTango" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">WebAR</a>という仕様を作ったりもしていますし、ARには各社力を入れているので、Webでも早晩ARが使えるようになるだろうと思います。</p>

<p><b class="speaker siraisi">白石:</b> でも実際、要素技術が揃っているだけでは世の中変わらない…という現実もあるかと思います。WebGLも、実際には随分前から使えるようになっていたわけですし。こういう「要素技術が揃っているだけでは越えられない壁」は、どうやったら超えられると思いますか？</p>

<p><b class="speaker isii">石井:</b> 難しい問題ですが、一つは3Dコンテンツの制作コストが高いというのも、普及を妨げる要因にはなるのかなと思います。ただそれは、「人が作る」ことを前提とするからコストが高くつくんだと思うんですよね。</p>

<p>そういう点では、2Dに関しては既に<a href="https://paintschainer.preferred.tech/index_ja.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">PaintsChainer</a>（AI技術を使い、線画を自動で着色するサービス）や<a href="http://make.girls.moe/#/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">MakeGirlsMoe</a>（AIで自動的に萌えキャラを作成するサービス）のようなサービスが出てきています。同様に、自動で3Dコンテンツを生成するようなサービスも近いうちに登場して、コンテンツの制作コストが劇的に下がるんじゃないでしょうか。</p>

<p><b class="speaker siraisi">白石:</b> <strong>AIサービスでコンテンツの制作コストが激減する</strong>というのは面白い発想ですね〜</p>

<p><b class="speaker isii">石井:</b> <a href="https://www.adobe.com/jp/sensei.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Adobe Sensei</a>も最近話題になっていますし、デザインの一部をAIに任せるというトレンドが来つつあるのは確実かなと思いますね。</p>

<h2>Grimoire.jsは、WebGLをWebエンジニアにとっての「筆」にする</h2>

<p><b class="speaker siraisi">白石:</b> では最後に、開発を進めていらっしゃる<a href="https://grimoire.gl/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Grimoire.js</a>についても、簡単にご紹介頂けますでしょうか？Three.jsなどのライブラリとは何が違うんでしょう？</p>

<p><img src="/wp-content/uploads/2017/10/grimoire-logo-640x172.png" alt="" width="640" height="172" class="aligncenter size-large wp-image-24627" srcset="/wp-content/uploads/2017/10/grimoire-logo.png 640w, /wp-content/uploads/2017/10/grimoire-logo-300x81.png 300w, /wp-content/uploads/2017/10/grimoire-logo-207x56.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p><b class="speaker isii">石井:</b> Grimoire.jsはWeb開発の中でWebGLを扱うためのフレームワークです。<a href="http://threejs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Three.js</a>や<a href="http://www.babylonjs.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Babylon.js</a>は、発想がCG中心なんですよね。画面全体をCGで構築するようなコンテンツにはいいのですが、Webコンテンツと混在させて、相互がやり取りするようなプログラムを作るには適していないんです。<strong>CGとWebには大きな隔たりがある</strong>。それに決められた構造を両者に与えて橋をかける必要があった。</p>

<p>この隔たりは、プログラミングスタイルにも大きく表れてきます。</p>

<p>CGの場合は、フレームごとにグラフィックを変更させていく、いわば<strong>フレーム指向</strong>です。<br />
一方でWebの場合は、イベントに応じて処理を行うのが普通ですよね。いわば<strong>イベント指向</strong>です。<br />
こうした隔たりがあるせいで、CG側とWeb側が、お互いにどうデータを受け渡しすればいいか、正解がないというのが今の状況です。</p>

<p>Grimoire.jsは、CG側とWeb側の、2つのAPIを提供することで、両者がシームレスに同居するようなアプリケーションを簡単に作ることができるように設計されています。</p>

<p><b class="speaker siraisi">白石:</b> 具体的にはどのようなコードになるんでしょう？</p>

<p><b class="speaker isii">石井:</b> Grimoire.jsは、GOMLという専用のマークアップ言語でCGを記述することができます。そして、GOMLの要素を変更することで、簡単にCGを変更できるんです。例えば、立方体にテクスチャを貼り付けて、自動的に回転するようなCGは以下のようなマークアップで簡単に実現できます。</p>

<p><img src="/wp-content/uploads/2017/10/cube-640x541.png" alt="" width="640" height="541" class="aligncenter size-large wp-image-24634" srcset="/wp-content/uploads/2017/10/cube.png 640w, /wp-content/uploads/2017/10/cube-300x254.png 300w, /wp-content/uploads/2017/10/cube-207x175.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<p></p><pre class="crayon-plain-tag">&lt;goml&gt;
  &lt;scene&gt;
    &lt;camera&gt;&lt;/camera&gt;
    &lt;mesh texture="logo.png" geometry="cube"&gt;
      &lt;mesh.components&gt;
        &lt;Rotate speed="1,1,1" /&gt;
      &lt;/mesh.components&gt;
    &lt;/mesh&gt;
  &lt;/scene&gt;
&lt;/goml&gt;</pre><p></p>

<p>そして例えば、マウスが重なった時だけこの立方体が2倍の大きさになる…という処理は、以下のようなJavaScriptで実現できます。</p>

<p></p><pre class="crayon-plain-tag">gr(function() {
  var mesh = gr('#simple .canvas')('mesh')
  mesh.on('mouseenter', function () {
    mesh.setAttribute('scale', '2.0')
  })
  mesh.on('mouseleave', function () {
    mesh.setAttribute('scale', '1.0')
  })
})</pre><p></p>

<p><b class="speaker siraisi">白石:</b> おお、簡単ですね！これならWebエンジニアでも簡単に扱えそうです。</p>

<p><b class="speaker isii">石井:</b> はい、そうなんです。イベントを受けてパラメーターを書き換えるという流れは、今のWebアプリケーションフレームワークなどの潮流を見れば古い感じを受けるかもしれませんが、結局のところこれだけあればいくらでもラップすることができます。そのようなモダンなWeb開発の環境でもシームレスに環境を選ばず導入できるんです。Grimoire.jsの目標は「<strong>WebGLを、Webエンジニアにとっての『筆』にする</strong>」ことなんです。</p>

<p>一方で、CG側にはUnityに近いようなインターフェースのAPIが提供されています。TypeScriptで記述できるビルド環境が提供されているので、Webに疎いCGサイドでもすぐにWebエンジニアの使う筆を作ることができます。再利用可能で、最終的なパラメーター調整などをWeb側が簡単に行えるわけです。実際、そのためにChrome拡張でWebGLの空間をそのまま操作できる<a href="https://chrome.google.com/webstore/detail/grimoirejs-devtool-20/clioppdjbagckdddfdhpollnkbpepkhn" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">インスペクタ</a>も提供しています。</p>

<div id="attachment_24628" style="width: 650px" class="wp-caption aligncenter"><img src="/wp-content/uploads/2017/10/inspector-640x257.png" alt="Grimoire.js Inspector" width="640" height="257" class="size-large wp-image-24628" srcset="/wp-content/uploads/2017/10/inspector.png 640w, /wp-content/uploads/2017/10/inspector-300x120.png 300w, /wp-content/uploads/2017/10/inspector-207x83.png 207w" sizes="(max-width: 640px) 100vw, 640px" /><p class="wp-caption-text">Grimoire.js Inspector</p></div>

<p>WebエンジニアにとってCGをより身近にすること、そしてCGがより一般的な世界にすることを目指しています。</p>

<p><b class="speaker siraisi">白石:</b> とても期待しています！本日はWebGLの基本的な事柄から<a href="https://grimoire.gl/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Grimoire.js</a>まで、いろいろ教えていただいてありがとうございました。</p>

<p><b class="speaker isii">石井:</b> 1.0リリースを年内に行いたいと思っています。興味がある方がいたら公式サイトから開発チームのSlackなどに入ると新しい様々な情報が拾えるかと思います。またいくつかの例も載っているのでご覧いただけると幸いです。</p>

<p><DIV align=right>（撮影：刑部友康 写真提供：html5j HTML5 Conference 2017事務局）</div></p>
]]></content:encoded>
		
		<series:name><![CDATA[HTML5 Conference 2017特集]]></series:name>
	</item>
	</channel>
</rss>
